Проблемы с разрешениями для / var / www / html и моего собственного домашнего каталога для корня документа веб-сайта

34

Я пытаюсь не дать 777 разрешений в моей /var/www/htmlпапке, но я хочу редактировать свои файлы без sudo. Поэтому я решил создать символическую ссылку на папку в моем домашнем каталоге /var/www/html. Я создал его, используя sudo ln -sT /home/andre/www/moodle/ moodle, и ls -laвывод такой:

andre@andre-270E5G:/var/www/html$ ls -la
total 8
drwxr-xr-x 2 root root 4096 Mai  4 10:20 .
drwxr-xr-x 4 root root 4096 Abr 29 14:29 ..
lrwxrwxrwx 1 root root   23 Mai  4 10:20 moodle -> /home/andre/www/moodle/

Итак, моя папка Moodle имеет права на чтение, запись и выполнение для всех, и это не то, что я хочу. Я использовал команду, sudo chmod -R 775 moodle/пытаясь изменить ее, но она осталась с разрешениями на чтение, запись и выполнение для всех. Я попробовал то же самое с папкой Moodle /home/andre/www/moodle, но она осталась прежней. Выход ls -laв /home/andre/www/это:

andre@andre-270E5G:~/www$ ls -la
total 28
drwxrwxr-x  3 andre andre  4096 Mai  4 10:02 .
drwx------ 49 andre andre 20480 Mai  4 10:01 ..
drwxrwxr-x 41 andre andre  4096 Mai  4 10:02 moodle

Таким образом, папка moodleв /home/andre/www/имеет разрешения, которые я хочу.

Как дополнительная проблема, когда localhost/moodleя получаю доступ, я получаю 403 Запрещенную ошибку.

Что я здесь не так делаю?

Андре Карвалью
источник

Ответы:

63

Вы никогда не должны запускать веб-сайт из своего домашнего каталога . КОГДА-ЛИБО. В противном случае вам пришлось бы дать веб-серверу возможность/home/просматривать структуру каталогов, а также/home/$USER/(домашний каталог вашего пользователя, где мы можем попробовать и посмотреть, что еще существует в вашем каталоге пользователей), а также любые другие подпапки. там. Плохо настроенный или неправильно настроенный или не исправленный веб-сервер может привести к такой большой утечке данных или потере учетных данных и тому подобному, что может подвергнуть риску ваши личные данные и логины. Используемый вами символьный подход также не помогает по той же причине, что и попытка предоставить Apache разрешения на чтение./home/andre/www/moodle- веб-сервер должен иметь возможность проходить по вашему домашнему каталогу, чтобы добраться до места, на которое /var/www/htmlуказывает символическая ссылка , что все еще представляет собой угрозу безопасности.

Во-первых, используйте sudo cp -r /home/andre/www/moodle/ /var/www/html/. Это скопирует ваши файлы /var/www/htmlи сохранит их вдали от вашего домашнего каталога. Затем мы переделаем разрешения, чтобы вы и веб-сервер могли получить доступ ко всему в этом каталоге, и предоставили вашему пользователю полное чтение / запись для всех файлов и каталогов. Тогда вам придется работать только /var/www/htmlдля вашего сайта.

По сути, это четыре шага после того, как вы скопировали свои данные обратно в /var/www/html:

  1. Предоставьте Apache доступ к папкам и файлам, чтобы он мог обслуживать сайт без 403 ошибок.
  2. Дайте своему пользователю «владелец» над файлами и папками, а также предоставьте себе права на чтение / запись для всех файлов и папок, а также возможность просматривать каталоги.
  3. (Необязательно, но рекомендуется). Настройте его так, чтобы для всех файлов или папок, созданных в дальнейшем во всей структуре каталогов, была задана группа www-data.
  4. (Необязательно) Окончательная очистка безопасности, когда мы настраиваем разрешения, чтобы вы и веб-сервер могли видеть данные сайта, но другие пользователи не могут получить доступ к файлам или структуре каталогов сайта.

(1) Разрешить Apache доступ к папкам и файлам.

sudo chgrp -R www-data /var/www/html
sudo find /var/www/html -type d -exec chmod g+rx {} +
sudo find /var/www/html -type f -exec chmod g+r {} +

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

Могут быть случаи, когда вы должны дать веб-серверу разрешение на запись в файл или в каталог - это можно сделать, выполнив sudo chmod g+w /var/www/html/PATH(где PATHуказан путь к файлу или папке в структуре каталогов, где необходимо применить разрешения на запись для веб-сервера).

ЗАМЕЧАНИЕ . Во многих случаях это может предоставить «защищенную» информацию о конфигурации сайта (например, учетные данные для доступа к базе данных и т. Д.), И вам следует удалить «другие» права доступа к этим данным в этих отдельных файлах или каталогах с помощью следующее: sudo chmod o-rwx /var/www/html/FILEPATH(замена FILEPATHна путь относительно /var/www/htmlпапки для файла).

Также обратите внимание, что вам, возможно, придется в будущем запускать эти команды, если «новые файлы» получат 403 проблемы, чтобы дать правильные разрешения веб-серверу, чтобы иметь возможность доступа к файлам и папкам, которые созданы или скопированы, и не получают www-dataгруппу набора правильно.


(2) Предоставьте своему владельцу права на чтение / запись для папок и файлов и разрешите доступ к папкам для обхода структуры каталогов.

sudo chown -R USER /var/www/html/
sudo find /var/www/html -type d -exec chmod u+rwx {} +
sudo find /var/www/html -type f -exec chmod u+rw {} +

Замените USERв первой команде свое имя пользователя!

Мы делаем три вещи здесь. Во-первых, мы устанавливаем, что ваш пользователь является «владельцем» всех файлов и каталогов в /var/www/html. Затем мы устанавливаем разрешения на чтение и запись для папок и разрешаем вам доступ к папкам, чтобы войти в них ( +xэлемент в элементах каталога). Затем мы устанавливаем для всех файлов права на чтение / запись для владельца, которые мы только что установили.


(3) (Необязательно) Убедитесь, что каждый новый файл после этого создается с www-dataправами доступа.

sudo find /var/www/html -type d -exec chmod g+s {} +

Это устанавливает бит "set gid" для группы в каталогах. Файлы и папки, созданные внутри этих каталогов, всегда будут иметь www-dataгруппу, разрешающую доступ к веб-серверу.


(4) (Необязательно) Окончательная очистка системы безопасности, если вы не хотите, чтобы другие пользователи могли видеть данные

Нам нужен ваш пользователь, чтобы увидеть каталоги и файлы. Нам нужен веб-сервер, чтобы сделать это тоже. Мы можем не захотеть, чтобы другие пользователи системы (кроме root) видели данные. Поэтому давайте не будем предоставлять им такой доступ, а сделаем так, чтобы данные могли видеть только ваш пользователь и веб-сервер.

sudo chmod -R o-rwx /var/www/html/

ПРИМЕЧАНИЕ. Вам не нужно будет повторно запускать это позже или редактировать разрешения для «другой» категории разрешений здесь. Если «другие» пользователи не могут добраться до них /var/www/html/(у них нет необходимого +xбита /var/www/htmlдля обхода файловой структуры и структуры каталогов или +rбита для чтения списков файлов), тогда разрешения для элементов в этом каталоге для других пользователей или группы на самом деле не будут иметь большого значения.


Существует также несколько менее инвазивное решение, хотя не гарантируется работа для всех новых файлов и не гарантируется работа на всех файловых системах , включая списки управления доступом к файлам. Это позволяет вам оставить право собственности на файлы www-dataдля чего-то, но дает вам эффективные права владельца для всех намерений и целей, даже если вы сами не владеете файлами.

Это решение немного менее инвазивно, и позволяет вам иметь каталог и все файлы в пределах принадлежащих www-data:www-dataили, root:www-dataно также дать себе доступ. Он использует списки контроля доступа , которые позволяют нескольким пользователям иметь разрешения без настройки отдельных групп. Это также позволяет пользователям rootили www-dataсистемным пользователям иметь собственные файлы, но также позволяет добавлять дополнительные разрешения в каждом конкретном случае и настраивать разрешения для определенных пользователей, чтобы они могли читать, но не редактировать и тому подобное.

Предполагая, что мы все еще работаем /var/www/html/, и мы не хотим, чтобы наши пользователи, кроме нас и системы (и, конечно, root), могли видеть наши данные, нам нужно будет сделать следующее:

  1. Верните право собственности пользователю системы веб-сервера www-data.
Судо Чоун -R www-данные: www-data / var / www / html
  1. Рекурсивно дает вам возможность чтения / записи в файлах, в то же время предоставляя другим пользователям (исключая www-dataи, rootконечно) доступ к файлам.
sudo find / var / www / html -type f -exec setfacl -mu: ВАШЕ ИМЯ: rw -m прочее :: --- {} \;
  1. Рекурсивно предоставьте себя для чтения / записи / перемещения по каталогам, удалите доступ к папкам для других пользователей (кроме www-dataи root) и установите его в качестве ACL по умолчанию для новых файлов в каталогах.
sudo find / var / www / html -type d -exec setfacl -d -mu: ВАШЕ ИМЯ: rwx -mo :: --- {} \;
  1. Нам также нужно установить setgidбит для всех каталогов, чтобы при создании файла веб-сервер мог по-прежнему получать к нему доступ www-dataчерез групповые разрешения.
sudo find / var / www / html -type d -exec chmod g + x {} \;

И теперь у вас есть доступ ко всем каталогам, и вам не нужно было отказываться от доступа, www-dataкоторый помогает, поскольку веб-сервер все еще может создавать файлы везде, где это необходимо (например, основанные на PHP внешние интерфейсы, имеющие свои собственные каталоги кэша и т. Д.). необходимо создать и записать для правильной работы).

Единственное предостережение: если вы вручную создаете новые файлы, вам необходимо соответствующим образом сократить их, чтобы передать право собственности на веб-сервер. Это просто sudo chown www-data:www-data filename, и списки контроля доступа все же должны позволять вам иметь действующие права владельца файла.

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

Томас Уорд
источник
2
@ AndréCarvalho +xдля файлов дало бы исполняемые разрешения, и мы не хотим, чтобы PHP-файлы выполнялись обязательно через командную строку PHP или как исполняемый файл на самом сервере - мы хотим, чтобы они обрабатывались парсером PHP на веб-сервере (и мы не нужно иметь PHP-файлы, чтобы +xсинтаксический анализатор PHP мог их прочитать и обработать). Каталоги нужны +xдля того, чтобы разрешить обход через каталоги - то есть, если каталог не является, +xа я не являюсь пользователем root, я не могу попасть в каталог, что является проблемой, с которой у вас Apache не работает с вашими символическими ссылками и вашим домом каталог.
Томас Уорд
1
@ AndréCarvalho www-data- системная группа, в которую не входят обычные пользователи.
Томас Уорд
1
@JunaidQadirShekhanzai Невозможно предоставить, так как настройки людей сильно отличаются от среды, в которой они нуждаются, и многих других факторов. Такой «файл оболочки» было бы невозможно создать, учитывая наличие дополнительных компонентов. Я мог бы попытаться создать сценарий Python, который мог бы сделать это, но мы все еще сталкиваемся с такими вещами, как системные ограничения, необязательные задачи, различные пути и т. Д.
Томас Уорд
1
@ Т.Тодуа это не то, что я сказал. Я сказал, что вы никогда не должны запускать сайт из (читай: изнутри) вашего «домашнего» каталога, то есть вы не должны запускать что-либо /home/USER/...на веб-сервере. Вы неправильно поняли и неправильно поняли значение слов, которые я использую. /var/www/*это относительно «безопасное» место для запуска веб-сайтов, потому что это выделенная папка / пространство для него. Тем /var/www/htmlне менее, это НЕ безопасно, потому что это написано веб-серверами при установке и тому подобное, и приводит к скоплению важных данных (поэтому используйте /var/www/SUBDIRECTORYвместо этого отдельные подкаталоги сайта)
Томас Уорд
1
Я поправил формулировку для ясности.
Томас Уорд
2

Сама идея использования символических ссылок для решения проблемы с разрешениями ошибочна и не может работать. Разрешения, которые показаны для самой символической ссылки, в основном не имеют значения, их нельзя использовать для обхода разрешений «реального» каталога. Создание символической ссылки от /var/www/html/moodleto /home/andre/www/moodle/не обойдёт разрешения для /home/andre/www/moodle/. Любой, кто хочет что-то делать, /var/www/html/moodleможет сделать это, только если у него есть необходимые разрешения /home/andre/www/moodle/.

Ваше исполнение на sudo chmod -R 775 moodle/самом деле сделало иметь эффект, но по- другому, чем вы думали , что это не изменит разрешения линка, а мишени SYMLINK /home/andre/www/moodle/.

Ошибка 403, которую вы получаете в веб-сервере, возможно, связана с тем, что у вашего веб-сервера нет необходимых разрешений для входа /home/andre. Это не «дополнительная проблема», а из-за той же проблемы с разрешениями.

Таким образом, вместо использования символических ссылок вы должны выяснить права, которые позволяют вам редактировать файлы и веб-сервер для доступа к ним (или даже редактировать их, в зависимости от приложения). Каковы именно эти разрешения, зависит от вашего конкретного случая использования (вашего приложения и конфигурации сервера).

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

Пример разрешения (который может не работать в вашем случае использования из-за отсутствия информации):

andre@fermat:/var/www/html$ ls -al moodle/
total 0
drwxr-x--- 2 andre www-data 60 mai  4 16:20 .
drwxr-xr-x 3 root  root     80 mai  4 16:20 ..
-rw-r----- 1 andre www-data  0 mai  4 16:20 index.html

Вы можете видеть, что каталог имеет достаточный доступ для вас как владельца, чтобы войти в него и изменить его содержимое, веб-сервер (в группе www-data) может войти и прочитать. Сами файлы доступны для чтения и записи для вас (владельца) и для чтения на веб-сервере (в группе www-data). Все остальные пользователи не имеют доступа вообще.

Опять же, пожалуйста, возьмите это только в качестве примера. Точный пользователь / группа вашего веб-сервера зависит от вашей конфигурации. И вашему приложению (Moodle) могут потребоваться другие разрешения, вам необходимо ознакомиться с его документацией.

Мастов
источник
Согласитесь, но это не слишком полезно, если они не знают, как правильно устанавливать разрешения, и столкнутся с другими проблемами.
Томас Уорд
@ThomasW .: Тогда вопрос о том, как правильно установить разрешения, должен стать новым вопросом, включая необходимую информацию, такую ​​как конфигурация веб-сервера, желаемый способ редактирования файлов и потребности приложения.
мастов
или написано как правильный ответ - что я делаю сейчас. Вы также никогда не должны запускать что-либо из / home / USER / для веб-сайта, у него есть доступ ко многим другим «пользовательским» данным, если веб-сервер не был правильно исправлен или настроен.
Томас Уорд
@mastov Понял. Вы решаете много вопросов, которые у меня были с вашим объяснением.
Андре Карвалью
2

Отличный ответ Томас Уорд https://askubuntu.com/a/767534/717860

Вы можете выполнить все рекомендуемые шаги всего за 3 команды вместо 8 команд:

3 команды:

sudo chown -R ubuntu:www-data /var/www
sudo find /var/www -type d -exec chmod 2750 {} \+
sudo find /var/www -type f -exec chmod 640 {} \+

выполните ту же работу, что и следующие 8 команд:

sudo chgrp -R www-data /var/www
sudo find /var/www -type d -exec chmod g+rx {} +
sudo find /var/www -type f -exec chmod g+r {} +
sudo chown -R ubuntu /var/www/
sudo find /var/www -type d -exec chmod u+rwx {} +
sudo find /var/www -type f -exec chmod u+rw {} +
sudo find /var/www -type d -exec chmod g+s {} +
sudo chmod -R o-rwx /var/www/
Випин Мехта
источник