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

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

Я пытаюсьнетдать 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 Forbidden.

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

решение1

Вам никогда не придется запускать веб-сайт из домашнего каталога.. ВСЕГДА. В противном случае вам пришлось бы предоставить веб-серверу возможность пройти через /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имени пользователя «access».

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.
sudo chown -R www-data:www-data /var/www/html
  1. Рекурсивно предоставить вам права на чтение и запись файлов, не предоставляя другим пользователям (за исключением, конечно www-dataже root) доступа к файлам.
sudo find /var/www/html -type f -exec setfacl -mu:YOURUSERNAME:rw -m other::--- {} \;
  1. Рекурсивно предоставьте себе права на чтение/запись/обход каталогов, удалите доступ к папкам для других пользователей (за исключением www-dataи root) и установите это как ACL «по умолчанию» для новых файлов в каталогах.
sudo find /var/www/html -type d -exec setfacl -d -mu:YOURUSERNAME:rwx -mo::--- {} \;
  1. Нам также необходимо установить setgidбит для всех каталогов, чтобы при создании файла веб-сервер все равно мог получить к нему доступ www-dataчерез групповые разрешения.
sudo find /var/www/html -type d -exec chmod g+s {} \;

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

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

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

решение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/

решение3

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

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

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

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

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

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

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) могут потребоваться другие разрешения, вам нужно обратиться к его документации.

Связанный контент