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