Каковы рекомендуемые права доступа к каталогу?


145

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

В частности default/files/(и подкаталоги?) settings.php, .htaccessИ что - нибудь еще , что я должен быть в курсе.


1
Здесь также есть ответ: drupal.stackexchange.com/questions/52695/…
— Free Radical

Есть блог, который объясняет это красиво и освещает каждый аспект в абстрактной форме. technologymythbuster.blogspot.com/2018/06/…
— Калпеш Попат

Ответы:


69

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

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


13
Это не относится к каталогу sites / default / files, который должен быть доступен для записи на веб-сервере, иначе у вас будет масса неприятностей.
— Роби

3
@rooby Второе предложение разъясняет это.
— Кенорб

14
Хотя и написано «Если ваш сайт включает в себя загрузку файлов», но это не единственная причина, по которой вам может потребоваться доступ для записи в каталог файлов. Очень распространенный пример - агрегация js / css, когда пользователи не загружают файлы. Другие модули также могут ожидать, что этот каталог будет доступен для записи.
— Роби

91

Та страница друпала, как и многие, очень длинная и запутанная. Но он содержит этот пост Джейсона, который ударил гвоздь по голове:

Отправленный Джейсоном Сэйлом 1 ноября 2010 в 12:40

Спасибо, что написали это и все, но все, что я и 99% людей, читающих эту страницу, действительно хотят, - это список цифр рядом со списком папок.

  • /default на 755
  • /default/files включая все подпапки и файлы на 744 (или 755)
  • /default/themes включая все подпапки и файлы на 755
  • /default/modules включая все подпапки и файлы на 755
  • /default/settings.phpи /default/default.settings.phpна 444

7
Тема длинная и запутанная. Страница соответствует реальности ситуации.
— greggles

17
... из Drupal документов! И именно поэтому это должно быть немедленно изменено на что-то простое и понятное! Особенно, когда речь идет о безопасности. ПРОСТО, ПОТОМУ ЧТО это о безопасности! Потому что это принадлежит всем нам. Зараженный сервер - это проблема не только неопытного пользователя Drupal. Это проблема всех нас тогда. Так что не очень полезно держать сложные и плохо написанные документы, вдохновленные разработчиками, чтобы показать сложность и запутанность, а также то, насколько хорошо они справляются с этим. Я не вижу смысла пропускать простое графическое изображение дерева разрешений. Вебчик согласен с этим.
— nilsun

3
Почему 755 на / default / files? Разве это не должно быть всегда 744 на тот случай, если кому-то удастся загрузить что-то вредоносное, взломав интерфейс (или из-за плохой конфигурации)? Есть ли причина иметь 755? Как насчет / TMP?
— Webdrips

1
Файл settings.php должен быть 440. «Другие» не должны видеть settings.php. 740, если вы хотите иметь возможность писать в него без команд sudo.
— Брайден

просто любопытно, почему файл .htaccess в файлах и папке tmp должен быть записан веб-сервером? Разве это не безопасно пометить это 444 так же, как settings.php. Причина, по которой я спрашиваю, заключается в том, что если хакер может загрузить файл junkfile.php в папку файлов через веб-сервер, то файл .htaccess можно заменить. я прав?
— kiranking

82

Моя практика создания нового сайта Drupal на сервере заключается в том, чтобы иметь пользователя, который входит в группу веб-серверов (обычно Apache), и чтобы этот пользователь владел всеми файлами Drupal. В Ubuntu это команды для настройки:

# Create a new example user, setting up /var/www/example as their home dir.
useradd -s /bin/bash -d /var/www/example -m example

# Now add that user to the Apache group. On Ubuntu/Debian this group is usually
# called www-data, on CentOS it's usually apache.
usermod -a -G www-data example

# Set up a password for this user.
passwd example

Как только я это настрою, я войду в систему под этим пользователем и установлю Drupal по адресу / var / www / example / docroot или аналогичный, а затем создам каталог файлов вручную и скопирую файл settings.php. Поскольку мы вошли в систему в качестве нашего примера пользователя перед копированием в Drupal, наши права доступа к файлам и их права должны автоматически настраиваться для всех основных файлов и сценариев Drupal (включая файлы .htaccess).

su - example
cd docroot
cp sites/default/default.settings.php sites/default/settings.php

# Temporarily give the web server write permissions to settings.php
chgrp www-data sites/default/settings.php
chmod g+w sites/default/settings.php

Теперь давайте настроим каталог файлов.

# Create the directory.
mkdir sites/default/files

# Now set the group to the Apache group. -R means recursive, and -v means 
# verbose mode.
chgrp -Rv www-data sites/default/files

Далее мы настроим разрешения, чтобы веб-сервер всегда мог записывать в любой файл, который находится в этом каталоге. Мы делаем это с помощью 2775 в нашей команде chmod. 2 означает, что идентификатор группы будет сохранен для любых новых файлов, созданных в этом каталоге. Это означает, что www-данные всегда будут группой для любых файлов, тем самым гарантируя, что веб-сервер и пользователь всегда будут иметь права на запись для любых новых файлов, размещенных в этом каталоге. Первые 7 означают, что владелец (пример) может R (Чтение) W (Запись) и X (Выполнить) любые файлы здесь. Вторая цифра 7 означает, что группа (www-данные) также может отправлять и записывать любые файлы в этом каталоге. Наконец, 5 означает, что другие пользователи могут R и X файлы, но не могут писать.

 chmod 2775 sites/default/files

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

 chmod g+w -R sites/default/files

Теперь Drupal готов к установке. Когда закончите, ОЧЕНЬ важно вернуться в settings.php и убедиться, что у всех пользователей есть только права на чтение.

 chmod 444 sites/default/settings.php

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


не безопасно ли установить .htacess на 444 jsut как settings.php? в любом случае, этот файл редко обновляется в ядре drupal.
— kiranking

Вы можете установить .htaccess на 444, но это добавит дополнительную головную боль при обновлении ядра Drupal и не сделает ваш сайт более безопасным.
— q0rban

30

Папка с файлами Drupal должна быть доступна для записи веб-сервером. Самый безопасный способ сделать это - изменить группу и сделать ее доступной для записи, например так:

chgrp www-data sites/default/files
chmod g+w sites/default/files

За исключением папки для загрузки файлов, наиболее безопасным является chmod 644 для всех файлов, 755 для каталогов.

Это может быть выполнено следующим образом (при запуске в папке Drupal-site указывается .текущий путь):

find . -type f | xargs chmod 644
find . -type d | xargs chmod 755

Помните, что вам нужно chmod g+wбудет выполнить повторную настройку после выполнения вышеуказанной команды, так как она сбросит chmod для всех файлов и папок.


2
Этот ответ предполагает: вы находитесь на Ubuntu. Ваш сайт работает только на этом сервере. Это также решает проблему только один раз, вместо того, чтобы сделать это автоматически (например, путем изменения маски).
— greggles

Не обязательно Ubuntu, и это по-прежнему полезная мера, даже если на одном сервере работает несколько сайтов. Изменение umask (которое, надо надеяться, уже имеет эти настройки) - это не то, что я бы порекомендовал людям, не разбирающимся в Linux. Я знаю, что это не идеальная безопасность, но давайте не будем допускать, чтобы идеал был здесь врагом добра.
— Микл

На мультисайте я бегу chgrp -R www-data sites/*/filesи chmod -R g+w sites/*/filesизбавляюсь от ошибок на странице статуса.
— leymannx

20

Любой совет "chmod blah" или "chown X" не имеет смысла, не зная: что за файлы user: group по умолчанию находятся в файлах и от какого пользователя и группы работает ваш веб-сервер.

Drupal Docs, на которые другие ссылаются, довольно хороши в этой теме, но еще один ресурс - это модуль Security Review, который помогает убедиться, что все настроено правильно.


9

Я отвечу, учитывая, что файлы создаются на сервере с использованием FTP, используя учетные данные, отличные от тех, под которыми работает веб-сервер (обычно Apache работает как nobody / nobody). Это означает, что пользователь, которому принадлежат файлы, созданные вручную перед запуском установщика Drupal (который также включает файлы, загруженные на сервер из архива Drupal), не является пользователем, используемым для запуска веб-сервера (ни имя пользователя, ни группа не совпадают) , Этот сценарий применим также к случаю, когда эти файлы создаются с использованием SSH.

  • Файл settings.php должен быть доступен для записи из установщика Drupal, но после завершения установки предлагается сделать его доступным только для чтения (установщик рекомендует это сделать, и Drupal будет периодически проверять, действительно ли файл доступен только для чтения). В описываемом мной сценарии разрешение этого файла должно быть не менее 644.
  • Файлы .htaccess (которые присутствуют как минимум в двух местах) должны иметь разрешение 644. Пользователь, создавший файл, должен иметь возможность перезаписать файл, если в следующей версии Drupal имеется файл .htaccess, который был обновлен (это произошло уже один раз, когда в этот файл была добавлена ​​строка во избежание проблем с безопасностью). Также возможно установить разрешения на 444, но в этом случае разрешения должны быть изменены обратно на 644, когда файл должен быть обновлен.
  • Каталог, содержащий файлы, созданные модулями ( default/filesкаталог), должен быть (для пользователя, назначенного процессам веб-сервера, который затем является пользователем, назначенным сценариям PHP, работающим на этом веб-сервере):
    • удобочитаемый
    • записываемый
    • проходимый (модули должны быть в состоянии достичь default/files/<directory-used-by-the-module>/<sub-directory-used-by-the-module>)

после прочтения ветки на drupal.org/node/244924 и, в частности, drupal.org/node/244924#comment-8186447, ни один из различных методов не предоставил, как добиться загрузки файлов, чтобы иметь только 660 RW-RW ---- т.е. без исполнения бит. Разве это не главная проблема безопасности?
— Киранкинг

8

Рекомендуемые права доступа к файлам / каталогам:

  • Корневой корень Drupal должен быть доступен для чтения всем пользователям (см .: updater.inc ): 0755
  • для публичных каталогов загрузки: 0755 или 0775
  • для частных каталогов загрузки: 0750 или 0770
  • для публично загруженных файлов: 0644 или 0664
  • для личных загруженных файлов: 0640 или 0660
  • для .htaccess в каталогах загрузки (см .: file_create_htaccess () ): 0444 (по умолчанию) или 0644
  • для settings.php только для чтения для всех (и других конфиденциальных файлов): 0440
  • для всех остальных веб-каталогов: 0755
  • для всех остальных веб-файлов: 0644

Рекомендуемое владение файлом / каталогом:

  • владелец всех загружаемых каталогов / файлов должен быть установлен как пользователь Apache,
  • владелец всех веб / исходных каталогов / файлов должен быть установлен как пользователь не Apache,
  • (необязательно) группа всех источников должна быть установлена ​​в группу Apache,

Вот переменные, которые управляют разрешениями dir / file по умолчанию для новых элементов:

file_chmod_directory: 0775
file_chmod_file: 0664

Вот некоторый скрипт для исправления прав доступа: fix-permissions.sh


Читать далее:


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

#!/bin/sh -e
# Script to correct public/private directory and files permissions.
[ -z "$1" ] && { echo Usage: $0 @remote.dst; exit 1; }

DST="$1" && shift
GET_HTTP_GROUP='ps axo user,group,comm | egrep "(apache|httpd)" | grep -v ^root | uniq | cut -d\  -f 1'

drush $* $DST ssh 'PUB=$(drush dd %files) && PRIV=$(drush dd %private) && AGROUP=$('"$GET_HTTP_GROUP"') && chgrp -vR $AGROUP $PUB $PRIV && chmod -vR u+rwX,g+rwX,o+rX $PUB $PRIV'

Примечание. Приведенный выше код будет пытаться получить группу Apache и установить ее в GET_HTTP_GROUPпеременную.


очень хороший шпаргалка, в закладки. Хорошая работа ..
— kiranking

4

Этот сценарий оболочки находится внизу этой страницы: https://www.drupal.org/node/244924

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

#!/bin/bash
# Help menu
print_help() {
cat <<-HELP
This script is used to fix permissions of a Drupal installation
you need to provide the following arguments:
1) Path to your Drupal installation.
2) Username of the user that you want to give files/directories ownership.
3) HTTPD group name (defaults to www-data for Apache).
Usage: (sudo) bash ${0##*/} --drupal_path=PATH --drupal_user=USER --httpd_group=GROUP
Example: (sudo) bash ${0##*/} --drupal_path=/usr/local/apache2/htdocs --drupal_user=john --httpd_group=www-data
HELP
exit 0
}
if [ $(id -u) != 0 ]; then
  printf "**************************************\n"
  printf "* Error: You must run this with sudo. *\n"
  printf "**************************************\n"
  print_help
  exit 1
fi
drupal_path=${1%/}
drupal_user=${2}
httpd_group="${3:-www-data}"
# Parse Command Line Arguments
while [ $# -gt 0 ]; do
  case "$1" in
    --drupal_path=*)
      drupal_path="${1#*=}"
      ;;
    --drupal_user=*)
      drupal_user="${1#*=}"
      ;;
    --httpd_group=*)
      httpd_group="${1#*=}"
      ;;
    --help) print_help;;
    *)
      printf "***********************************************************\n"
      printf "* Error: Invalid argument, run --help for valid arguments. *\n"
      printf "***********************************************************\n"
      exit 1
  esac
  shift
done
if [ -z "${drupal_path}" ] || [ ! -d "${drupal_path}/sites" ] || [ ! -f "${drupal_path}/core/modules/system/system.module" ] && [ ! -f "${drupal_path}/modules/system/system.module" ]; then
  printf "*********************************************\n"
  printf "* Error: Please provide a valid Drupal path. *\n"
  printf "*********************************************\n"
  print_help
  exit 1
fi
if [ -z "${drupal_user}" ] || [[ $(id -un "${drupal_user}" 2> /dev/null) != "${drupal_user}" ]]; then
  printf "*************************************\n"
  printf "* Error: Please provide a valid user. *\n"
  printf "*************************************\n"
  print_help
  exit 1
fi
cd $drupal_path
printf "Changing ownership of all contents of "${drupal_path}":\n user => "${drupal_user}" \t group => "${httpd_group}"\n"
chown -R ${drupal_user}:${httpd_group} .
printf "Changing permissions of all directories inside "${drupal_path}" to "rwxr-x---"...\n"
find . -type d -exec chmod u=rwx,g=rx,o= '{}' \;
printf "Changing permissions of all files inside "${drupal_path}" to "rw-r-----"...\n"
find . -type f -exec chmod u=rw,g=r,o= '{}' \;
printf "Changing permissions of "files" directories in "${drupal_path}/sites" to "rwxrwx---"...\n"
cd sites
find . -type d -name files -exec chmod ug=rwx,o= '{}' \;
printf "Changing permissions of all files inside all "files" directories in "${drupal_path}/sites" to "rw-rw----"...\n"
printf "Changing permissions of all directories inside all "files" directories in "${drupal_path}/sites" to "rwxrwx---"...\n"
for x in ./*/files; do
    find ${x} -type d -exec chmod ug=rwx,o= '{}' \;
    find ${x} -type f -exec chmod ug=rw,o= '{}' \;
done
echo "Done setting proper permissions on files and directories"
Copy the code above to a file, name it "fix-permissions.sh" and run it as follows:
sudo bash fix-permissions.sh --drupal_path=your/drupal/path --drupal_user=your_user_name

Note: The server group name is assumed "www-data", if it differs use the --httpd_group=GROUP argument.

2

Также, если вы запускаете fastcgi, php запускается от имени пользователя и будет иметь доступ ко всем файлам, к которым у него есть доступ, если только вы намеренно не попытаетесь избежать этого.


1

Это помогло мне решить проблемы с разрешением OSX. Я нашел его в https://www.drupal.org/node/244924#comment-3741738 пользователем протоплазмы. Я был как у него проблемы после миграции.

[root@localhost]cd /path_to_drupal_installation/sites
[root@localhost]find . -type d -name files -exec chmod ug=rwx,o= '{}' \;
[root@localhost]find . -name files -type d -exec find '{}' -type f \; | while read FILE; do chmod ug=rw,o= "$FILE"; done
[root@localhost]find . -name files -type d -exec find '{}' -type d \; | while read DIR; do chmod ug=rwx,o= "$DIR"; done

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.