Проблема с разрешениями: как Apache может получить доступ к файлам в моем домашнем каталоге?

33

Я знаю, что права доступа к файлам были рассмотрены здесь ранее, но я изо всех сил пытаюсь разобраться в концепции моего сценария.

  • Я создал файлы на старой установке Ubuntu.
  • Я скопировал файлы в мою новую установку Ubuntu и поместил их в мой webroot.
  • Когда я пытаюсь запустить файлы (это PHP-файлы), я получаю сообщение об ошибке, касающееся разрешений

пытаясь это исправить, я предположил, что они все еще должны принадлежать предыдущему владельцу, поэтому я запустил chown -Rкаталог с моим именем пользователя в качестве аргумента, чтобы взять на себя ответственность за все файлы в каталоге. Следует отметить, что имена пользователей между новой и старой установками Ubuntu были одинаковыми.

Когда я пытаюсь запустить файлы снова, та же проблема: ошибка 500 из-за проблем с разрешениями. Кто-нибудь может сказать мне, какие еще шаги я должен предпринять?

Webroot для моей установки apache находится внутри моей домашней папки. Если я создаю новые файлы в моем webroot, они также работают как положено, это только старые файлы, которые вызывают проблему.

richzilla
источник
Я не уверен, что права доступа к файлам копируются, когда файл есть, кто-то может это подтвердить? В противном случае, возможно ли передать файлы другому пользователю (или пользователю root), а затем вернуть их?
Tagger
Хорошо, я решил свою проблему с файлами, которые не выполнялись, но я сделал это, просто запустив chmod -R 777 dirсоответствующий каталог. Я не могу не думать, что есть лучший способ сделать это
richzilla
3
777 разрешений в файле позволят каждому писать ваши файлы, что может привести к повреждению ваших страниц или взлому. Вы должны попробовать с 755, который обычно используется для файлов php. Убедитесь, что вам не нужно включать «разрешить выполнение» для файла, в этом случае вы можете запустить chmod [filename] -x. Информацию о команде chmod можно получить, перейдя по следующей ссылке: catcode.com/teachmod/chmod_cmd.html
Geppettvs D'Constanzo
Что показывает журнал ошибок Apache?
Кис Кук

Ответы:

14

В каталогах над вашим webroot должен быть установлен бит выполнения, чтобы позволить Apache спускаться в каталоги.

Если ваш Webroot находится в /home/user/htdocs, то /, /home, /home/userи /home/user/htdocsдолжны иметь выполнить набор битов.


Вышеупомянутое решение «работает», но оно не идеально. Если вы создали папку, Apache не сможет написать в нее. Происходит и обратное.

Это можно «исправить», установив umask 0007 и добавив себя в группу Apache (www-data, если я не ошибаюсь), чтобы вновь созданные файлы и папки были доступны для записи группе.

Кроме того, вы можете установить альтернативный Apache MPM: Apache2 MPM ITK ( информация о настройке ) и настроить его так, чтобы Apache работал под вашим пользователем.

Lekensteyn
источник
Подробные инструкции о том, как это подтвердить, см. В ответе Марко ниже
hob
2
@hobs Еще лучше, askubuntu.com/a/46371/6969
Лекенштейн
44

Если документы вашего сервера находятся в /home/$USER/public_htmlкаталоге, вам нужно запустить

sudo chown -R www-data:www-data /home/$USER/public_html

передать право собственности на папку DocumentRoot пользователю www-dataи группе www-data.

Затем вы можете добавить себя в группу www-data

sudo adduser $USER www-data

Наконец, вам нужно сделать папку DocumentRoot доступной для записи владельцем (пользователем www-data) и самим собой (как часть www-dataгруппы):

sudo chmod -R 775 /home/$USER/public_html

Для удобства вы можете сделать скрипт с именем public_html_fix.shcontent:

#!/bin/bash

sudo adduser $USER www-data
sudo chown -R www-data:www-data /home/$USER/public_html
sudo chmod -R 775 /home/$USER/public_html

Сохраните его внутри /home/$USER/binи сделайте его исполняемым, используя:

sudo chmod +x /home/$USER/bin/public_html_fix.sh

Затем вы вызываете его всякий раз, когда вам нужно, из какой бы файловой системы вы ни оказались:

public_html_fix.sh
Marko
источник
1
работал для меня ....
Эммануэль Океке
Отличный ответ! - С примерами и даже удобным сценарием, а также как использовать / установить Отлично!
Андре
2
Если это делается на общем хосте, как вы останавливаете других пользователей в www-dataгруппе, читающих ваши файлы или пишущих в этом отношении?
jozxyqk
Действительно потрясающий ответ ... ты спас мне жизнь
NullPoiиteя
1
chmod -R 775 /home/$USER/public_htmlдействительно ужасно find /home/$USER/public_html -type d -exec chmod 775 {} \;и find /home/$USER/public_html -type f -exec chmod 664 {} \;намного лучше
iharob
1

Помимо chmoding файлов и редактирования apache .conf файлов, я хочу сказать, что у меня ничего не получалось, потому что мои файлы были в разделе, который я автоматически смонтировал через nautilus. Это ограничивает раздел только для вашего пользователя.

Чтобы проверить, видны ли ваши файлы www-rootпользователю apache (запустить ps -aux | grep apache2для проверки), запустите следующую команду:

sudo su -l www-data -s /bin/bash

и попробуйте прочитать файл из корня вашего документа.

Если файл не читается, проверьте, что:

1) вы установили все остальные права доступа к файлам

2) вы использовали FollowSymlinksв своих .confфайлах, если это необходимо

3) вы установили DocumentRoot

3) смонтировать раздел для всех пользователей. Я должен был отредактировать /etc/fstabи указать свой раздел через его UUID:

UUID=afdee1d3-5bb8-4652-892f-e83a9b5ff72e /mnt/4tb      ext4    rw,nosuid,nodev,errors=remount-ro

Затем размонтируйте ваш раздел через nautilus и сделайте sudo mount -a. Если все идет хорошо, ваши файлы сейчас находятся под /mnt. Обновите свои символические ссылки, и все готово.

AlexG
источник
1

Лучший способ, который я нашел, - это то, как VirtualMin это делает.

создать пользователя и группу "myhome"

Сделать пользователя Apache участником группы "myhome". Не наоборот, как некоторые объяснения здесь описывают

Теперь Apache имеет доступ для чтения и выполнения к / home / myhome в дополнение к / home / myhome / www

Пользователь "myhome" имеет право на запись

user458431
источник
Мне нравится эта концепция, но она мне не подходит. Пользователь www-dataпринадлежит к группе myhome. Все файлы и каталоги имеют групповые права на запись и принадлежат myhome:myhome. Я перезапустил Apache. Apache по-прежнему не может писать новые файлы и папки. (PHP скрипт с использованием www-data: www-data user / group)
squarecandy