Это канонический вопрос о правах доступа к файлам на веб-сервере Linux.
У меня есть веб-сервер Linux под управлением Apache2, на котором размещены несколько веб-сайтов. У каждого сайта есть своя папка в / var / www /.
/var/www/contoso.com/
/var/www/contoso.net/
/var/www/fabrikam.com/
Базовый каталог / var / www / принадлежит root: root. Apache работает как www-data: www-data. Веб-сайт Fabrikam поддерживается двумя разработчиками, Алисой и Бобом. Оба сайта Contoso поддерживаются одним разработчиком, Евой. Все сайты позволяют пользователям загружать изображения. Если веб-сайт скомпрометирован, воздействие должно быть максимально ограничено.
Я хочу знать, как лучше настроить разрешения, чтобы Apache мог обслуживать контент, веб-сайт был защищен от атак, а разработчики все еще могли вносить изменения. Один из веб-сайтов имеет следующую структуру:
/var/www/fabrikam.com
/cache
/modules
/styles
/uploads
/index.php
Как должны быть установлены разрешения для этих каталогов и файлов? Я где-то читал, что вы никогда не должны использовать разрешения 777 на веб-сайте, но я не понимаю, какие проблемы это может вызвать. В периоды занятости веб-сайт автоматически кэширует некоторые страницы и сохраняет результаты в папке кэша. Весь контент, представленный посетителями сайта, сохраняется в папке загрузки.
Ответы:
Решая, какие разрешения использовать, вы должны точно знать, кто ваши пользователи и что им нужно. Веб-сервер взаимодействует с двумя типами пользователей.
Прошедшие проверку пользователи имеют учетную запись на сервере, и им могут быть предоставлены определенные привилегии. Обычно это системные администраторы, разработчики и учетные записи служб. Они обычно вносят изменения в систему, используя SSH или SFTP.
Анонимные пользователи - это посетители вашего сайта. Хотя у них нет прав доступа к файлам напрямую, они могут запросить веб-страницу, и веб-сервер действует от их имени. Вы можете ограничить доступ анонимных пользователей, внимательно следя за тем, какие разрешения имеет процесс веб-сервера. Во многих дистрибутивах Linux Apache работает как
www-data
пользователь, но может отличаться. Используйтеps aux | grep httpd
или,ps aux | grep apache
чтобы увидеть, какой пользователь Apache использует в вашей системе.Примечания о разрешениях Linux
Linux и другие POSIX-совместимые системы используют традиционные разрешения Unix. В Википедии есть отличная статья о разрешениях Файловой системы, поэтому я не буду здесь все повторять. Но есть несколько вещей, о которых вы должны знать.
Бит выполнения
Интерпретируемые сценарии (например, Ruby, PHP) работают нормально без разрешения на выполнение. Только исполняемые файлы и сценарии оболочки нуждаются в бите выполнения. Чтобы пройти (войти) в каталог, вам необходимо иметь разрешение на выполнение для этого каталога. Веб-серверу необходимо это разрешение для просмотра каталога или обслуживания любых файлов внутри него.
Права доступа к новому файлу по умолчанию
Когда файл создается, он обычно наследует идентификатор группы того, кто его создал. Но иногда вы хотите, чтобы новые файлы наследовали идентификатор группы папки, в которой они созданы, поэтому вы должны включить бит SGID в родительской папке.
Значения разрешений по умолчанию зависят от вашего umask. Umask вычитает разрешения из вновь созданных файлов, поэтому общее значение 022 приводит к созданию файлов с 755. При совместной работе с группой полезно изменить Umask на 002, чтобы создаваемые вами файлы могли быть изменены членами группы. И если вы хотите настроить права доступа для загружаемых файлов, вам нужно либо изменить umask для apache, либо запустить chmod после загрузки файла.
Проблема с 777
Когда вы
chmod 777
ваш сайт, у вас нет никакой безопасности вообще. Любой пользователь в системе может изменить или удалить любой файл на вашем сайте. Но если серьезно, помните, что веб-сервер действует от имени посетителей вашего сайта, и теперь веб-сервер может изменять те же файлы, которые он выполняет. Если на вашем веб-сайте есть какие-либо программные уязвимости, их можно использовать для порчи вашего веб-сайта, вставки фишинговых атак или кражи информации с вашего сервера, даже если вы об этом не узнаете.Кроме того, если ваш сервер работает на общеизвестном порту (который должен препятствовать тому, чтобы пользователи без полномочий root создавали службы прослушивания, доступные во всем мире), это означает, что ваш сервер должен быть запущен пользователем root (хотя любой нормальный сервер будет немедленно отброшен). на менее привилегированную учетную запись, когда порт привязан). Другими словами, если вы запускаете веб-сервер, где основной исполняемый файл является частью системы управления версиями (например, приложение CGI), оставляя свои разрешения (или, в этом отношении, разрешения содержащего каталог, так как пользователь может переименовать (777) позволяет любому пользователю запускать любой исполняемый файл от имени пользователя root.
Определите требования
Поддерживается одним пользователем
Если за обслуживание сайта отвечает только один пользователь, установите его в качестве владельца пользователя в каталоге веб-сайта и предоставьте пользователю полные разрешения rwx. Apache все еще нуждается в доступе, чтобы он мог обслуживать файлы, поэтому установите www-data в качестве владельца группы и предоставьте группе разрешения rx.
В вашем случае, Eve, чье имя пользователя может быть
eve
, является единственным пользователем, который поддерживаетcontoso.com
:Если у вас есть папки, которые должны быть доступны для записи Apache, вы можете просто изменить значения разрешений для владельца группы, чтобы у www-данных был доступ для записи.
Преимущество этой конфигурации заключается в том, что другим пользователям в системе становится труднее (но не невозможно *) шпионить, поскольку только пользователи и владельцы групп могут просматривать каталог вашего веб-сайта. Это полезно, если у вас есть секретные данные в ваших файлах конфигурации. Будь осторожен с маской! Если вы создадите новый файл здесь, значения разрешений, вероятно, будут по умолчанию равны 755. Вы можете запустить,
umask 027
чтобы новые файлы по умолчанию равнялись 640 (rw- r-- ---
).Поддерживается группой пользователей
Если за обслуживание сайта отвечают несколько пользователей, вам необходимо создать группу, которая будет использоваться для назначения разрешений. Рекомендуется создать отдельную группу для каждого веб-сайта и назвать группу в честь этого веб-сайта.
В предыдущем примере мы использовали владельца группы для предоставления прав Apache, но теперь это используется для группы разработчиков. Поскольку владелец пользователя нам больше не нужен, установка его в root - это простой способ убедиться, что никакие привилегии не пропущены. Apache все еще нуждается в доступе, поэтому мы предоставляем доступ для чтения остальному миру.
Если у вас есть папки, которые должны быть доступны для записи Apache, вы можете сделать Apache владельцем или пользователем группы. В любом случае, у него будет все необходимое для доступа. Лично я предпочитаю сделать его владельцем, чтобы разработчики все еще могли просматривать и изменять содержимое папок загрузки.
Хотя это общий подход, есть и обратная сторона. Поскольку любой другой пользователь в системе имеет те же права на ваш веб-сайт, что и Apache, другие пользователи могут легко просматривать ваш сайт и читать файлы, которые могут содержать секретные данные, такие как файлы конфигурации.
Вы можете съесть свой торт и съесть его тоже
Это может быть улучшено в дальнейшем. Для владельца совершенно законно иметь меньше привилегий, чем для группы, поэтому вместо того, чтобы тратить владельца пользователя, назначив его пользователю root, мы можем сделать Apache владельцем пользователя для каталогов и файлов на вашем веб-сайте. Это аннулирование сценария с одним сопровождающим, но он работает одинаково хорошо.
Если у вас есть папки, которые должны быть доступны для записи Apache, вы можете просто изменить значения разрешений для владельца пользователя, чтобы у www-данных был доступ для записи.
С этим решением следует быть осторожным: пользователь, которому принадлежат новые файлы, будет соответствовать создателю, а не устанавливать www-data. Поэтому любые новые файлы, которые вы создаете, не будут доступны для чтения Apache, пока вы не создадите их.
* Разделение привилегий Apache
Ранее я упоминал, что другие пользователи могут просматривать ваш сайт независимо от того, какие привилегии вы используете. По умолчанию все процессы Apache выполняются как один и тот же пользователь www-данных, поэтому любой процесс Apache может читать файлы со всех других веб-сайтов, настроенных на том же сервере, а иногда даже вносить изменения. Любой пользователь, который может заставить Apache запускать скрипт, может получить тот же доступ, что и сам Apache.
Для решения этой проблемы в Apache существуют различные подходы к разделению привилегий . Однако каждый подход имеет свои недостатки в производительности и безопасности. По моему мнению, любой сайт с более высокими требованиями безопасности должен быть запущен на выделенном сервере, а не на виртуальных хостах на общем сервере.
Дополнительные соображения
Я не упоминал об этом раньше, но обычно это плохая практика, когда разработчики редактируют сайт напрямую. Для более крупных сайтов вам лучше иметь какую-то систему выпуска, которая обновляет веб-сервер из содержимого системы контроля версий. Подход с одним сопровождающим, вероятно, идеален, но вместо человека у вас есть автоматизированное программное обеспечение.
Если ваш веб-сайт позволяет загружать файлы, которые не нужно обслуживать, эти загрузки должны храниться где-то за пределами корневого веб-каталога. В противном случае вы можете обнаружить, что люди скачивают файлы, которые должны были быть секретными. Например, если вы разрешите учащимся отправлять задания, они должны быть сохранены в каталоге, который не обслуживается Apache. Это также хороший подход для файлов конфигурации, которые содержат секреты.
Для веб-сайта с более сложными требованиями вы можете изучить использование списков контроля доступа . Это позволяет гораздо более сложный контроль над привилегиями.
Если ваш веб-сайт имеет сложные требования, вы можете написать сценарий, который устанавливает все разрешения. Проверьте это полностью, затем сохраните это в безопасности. Это может быть на вес золота, если вам по какой-то причине понадобится перестроить ваш сайт.
источник
apache
в системах, производных от Red Hat.Мне интересно, почему так много людей используют (или рекомендуют) «другую» (o) часть прав Linux, чтобы контролировать, что может делать Apache (и / или PHP). Установив для этой правой части что-то другое, чем «0», вы просто позволяете всему миру что-то делать с файлом / каталогом.
Мой подход заключается в следующем:
cache/
oruploads/
, где также необходимо разрешение «запись». Чтобы дать PHP FastCGI эту возможность, он будет работать как bob-www , а bob-www будет добавлен в автоматически созданную группу bob .AllowOverride
него установлено другое значениеNone
. Для того, чтобы избежать использования уплотнительной части прав, я добавляю WWW-данные пользователя в бобе группы.В настоящее время:
Это резюме, но в этой ситуации Бобу разрешен SSH. Если не должно быть пользователей, которым разрешено изменять сайт (например, клиент изменяет сайт только через административную панель CMS и не имеет знаний о Linux), в любом случае создайте двух пользователей, но также предоставьте
/bin/false
оболочку для bob , и отключить свой логин.Примечание: люди склонны забывать, что ограничение прав u (владельца) в большинстве случаев бесполезно и небезопасно, поскольку владелец файла может выполнить
chmod
команду, даже если права равны 000.Скажите, есть ли в моем подходе проблемы с безопасностью, потому что я не уверен на 100%, но это то, что я использую.
Я думаю, что у этого конфига есть проблема: когда PHP / Apache создает новый файл (например, upload), он будет принадлежать bob-www: bob , и bob сможет только прочитать его. Может быть, setuid в каталоге может решить проблему.
источник
setuid
. Новые файлы всегда принадлежат создателю.bob
. Как ты с этим справляешься? Например. через ssh оба пользователя входят как bob. Боб (1) чувствует, что он / она не может вспомнить пароль и меняет его на другой, но все еще в безопасности. bob (2) пытается войти в следующий раз, но не может.Учитывая рейтинг Google на приведенном выше отличном ответе, я думаю, что есть одна вещь, которую следует отметить, и я не могу оставить заметку после ответа.
Продолжая этот пример, если вы планируете использовать www-data в качестве владельца и dev-fabrikam в качестве группы с 570 разрешениями на каталог (или файл), важно отметить, что Linux игнорирует
setuid
, поэтому все новые файлы будут принадлежать Пользователь, который их создал. Это означает, что после создания новых каталогов и файлов вам придется использовать что-то похожее на:В Ubuntu 12.04 для Rackspace OpenStack у меня была странная проблема, когда я не мог получить разрешения 570 для работы, пока я не перезагрузил сервер, что волшебным образом решило проблему. Потеря волос с возрастающей скоростью по этой, казалось бы, простой проблеме ...
источник
Я собираюсь с этой конфигурацией:
root
и группыroot
, разрешения для0755
.root
и группыroot
, разрешения для0644
.root
, группыwww-data
, прав доступа1770
. Заклепка не позволяет владельцу группы удалять или переименовывать каталог и файлы внутри.www-data
владельцем пользователя и группой, а также0700
разрешения для каждогоwww-data
пользователя, который загружает файлы.Запретить
AllowOverride
иIndex
в каталоге загрузки, чтобы Apache не читал.htaccess
файлы, а пользователь Apache не может индексировать содержимое папки загрузки:6.
php.ini
Конфигурация:При такой конфигурации
www-data
пользователь не сможет получить доступ к каталогам, кромеsiteDir/
/tmp
и/usr/share/phpmyadmin
. Также вы можете контролировать максимальный размер файла, максимальный размер сообщения и максимальный размер файлов для загрузки в одном запросе.источник
Если у вас есть пользователь FTP с именем «leo», необходимо загрузить файлы в веб-каталог example.com, а также, чтобы ваш пользователь «apache» мог создавать файлы uploa-files / session / cache в каталоге кеша, выполните следующие действия:
Эта команда назначает leo как владельца и группу как apache для example.com, пользователь apache является частью группы apache, поэтому он унаследует права доступа группы apache
Еще одна команда, которая обеспечивает правильное разрешение и выполняет также вопросы безопасности.
Здесь первый номер 2 предназначен для каталога и гарантирует, что каждый новый созданный файл останется в той же группе и разрешениях владельца. 77 для владельца и группы означает, что они имеют полный доступ. 4 для других означает, что они могут читать только через.
Следующее полезно, чтобы понять номера разрешений
источник
ИМО нужно учитывать:
Предположим, у вас есть сервер, на котором различные данные находятся под тестом пользователя.
Там у «тестового» пользователя есть:
$HOMEDIR
$MAIL
/var/www/test
Теперь давайте подумаем о:
test
пользователем (PHP-FPM) - оно может удалить любой из его файлов!test
группе (PHP-FPM) - оно может удалить любой из своих файлов, где в каталоге указано «w» для группы, и может изменить любой файл, в котором есть «r» для группы; и он все еще может их прочитать - например, ваши ssh-ключи!Давайте предположим, что PHP глючит, и вы доверяете ему
open_basedir
? Есть ли у васchroot
процесс PHP? Что вы не делаете, хотите, чтобы он сканировал всю файловую систему?Процесс вашего веб-приложения, например. PHP-FPM, то должен:
chroot
Таким образом, вы можете сделать:
test:test
test-www
test-www:test-www
chmod u=rwX,g=rX,o= /var/www/test/public
chmod u=rwX,g=rwXs,o= /var/www/test/public/upload
(таким образом, приложение создаст новые файлы как:test-www:test-www
- у него будет группа test-www из-за setgid в каталоге!)Таким образом, если процесс веб-приложения будет фальшивым, он будет просто читать определенные файлы, которые будут иметь групповое чтение, и он сможет записывать
upload
только в каталог. Я настоятельно рекомендую иметь эту директориюupload
в файловой системе сnoexec,nodev,nosuid
mount
параметрами и иметь постоянный мониторинг любых новых файлов bizzare в этом каталоге, а также следить за любыми новыми процессами подtest-www
uid.В Linux можно использовать ACL для лучшей настройки разрешений. Если более чем один человек должен загружать веб-данные, было бы лучше отделить учетную запись человека от учетной записи, используемой для загрузки файлов веб-данных, т.е. создать новую учетную запись, например.
test-upload
и тестовый пользователь будет управлять ssh-ключами, чтобы ограничить, какой человек может использовать ssh / sftp.sshd_config
знаетExposeAuthInfo
параметры, поэтому он может быть настроен на запись, какой ключ ssh использовался для загрузки данных.Я действительно сомневаюсь, что большинство служб веб-хостинга заботятся о разделении привилегий, когда они пишут «безопасно» без какой-либо информации о том, что вы получаете, я бы сказал, что они лгут.
источник
chroot
иuser
,group
чтобы быть установленным для пула. но я бы не стал доверятьphp_admin_value[open_basedir]
варианту. Я также читал, что лучше иметь отдельного мастера PHP-FPM для каждого пользователя, см. Ma.ttias.be/a-better-way-to-run-php-fpm. Создать экземпляр демона легко в большинстве дистрибутивов Linux и * BSD.