Які рекомендовані дозволи для каталогу?


145

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

Зокрема default/files/(також підкаталоги?) settings.php, .htaccessІ все, що мені слід знати.



Є блог, який це прекрасно пояснює і висвітлює кожен його аспект абстрактно. technologymythbuster.blogspot.com/2018/06/…
Калпеш Попат

Відповіді:


69

Ваш веб-сервер повинен мати можливість читати всі файли, але не записувати їх. Якщо ваш сайт передбачає завантаження файлів, тоді надайте серверу дозвіл на запис лише в одну папку.

Більше інформації про те, як налаштувати цю програму, а також деякі речі, які можуть статися, якщо цього не зробити, можна отримати в документах Drupal .


13
Це не стосується каталогів сайтів / за замовчуванням / файлів, які повинні бути написані веб-сервером, або у вас виникнуть маса проблем.
рубін

3
@rooby Друге речення пояснює це.
kenorb

14
Хоча йдеться про те, що "Якщо ваш сайт передбачає завантаження файлів", але це не єдина причина, що вам може знадобитися записувати доступ до каталогу файлів. Дуже поширеним прикладом є агрегація js / css, яка не пов’язана користувачами, які завантажують файли. Інші модулі також можуть сподіватися, що цей каталог можна буде записати.
рубін

91

Ця друпальська сторінка, як і стільки, дуже довга і заплутана. Але він містить цю публікацію Джейсона, який вдарив цвяхом по голові:

Опублікував Jason Sale 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
Тема довга і заплутана. Сторінка відповідає дійсності ситуації.
греглів

17
... Документів Друпала! І тому це потрібно негайно змінити на щось просте і зрозуміле! Особливо, коли мова йде про безпеку. ПЕРЕМОЖИ, це стосується безпеки! Тому що вона належить усім нам. Інфікований сервер - це проблема не тільки недосвідченого користувача Drupal. Це проблема всіх нас тоді. Тож не дуже корисно продовжувати складні та погано написані документи, натхненні нарциссом розробників, щоб показати складність та хитрість та те, наскільки добре вони впораються із цим. Я не бачу сенсу залишати просту графічну графіку дерева дозволів. Вебчік погоджується на це.
nilsun

3
Чому 755 увімкнено / за замовчуванням / файлів? Чи не завжди це має бути 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 (Read) W (Write) та X (Execute) будь-які файли тут. Друга 7 означає, що група (www-data) також може RW та X будь-які файли в цьому каталозі. Нарешті, 5 означає, що інші користувачі можуть R та X файли, але не писати.

 chmod 2775 sites/default/files

Якщо в цьому каталозі є якісь наявні файли, переконайтеся, що веб-сервер має на них Perms для запису.

 chmod g+w -R sites/default/files

Тепер Drupal готовий до встановлення. Закінчивши, ДУЖЕ важливо повернутися до settings.php і переконатися, що всі користувачі мають лише дозволи на читання.

 chmod 444 sites/default/settings.php

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


чи не безпечно встановити .htacess на 444 jsut як settings.php? у будь-якому випадку цей файл рідко оновлюється в друпальній ядрі.
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. Ваш сайт працює лише на цьому сервері. Він також вирішує проблему лише один раз, замість того, щоб це сталося автоматично (наприклад, змінивши umask).
греглів

Не обов’язково Ubuntu, і це все-таки корисна міра, навіть якщо на одному сервері працює кілька сайтів. Зміна umask (який, сподіваємось, вже має ці налаштування) - це не те, що я б рекомендував людям, які не знають Linux. Я знаю, що це не ідеальна безпека, але не давайте досконалим бути ворогом добра тут.
mikl

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

20

Будь-які поради щодо "chmod blah" або "chown X" безглузді, не знаючи: який користувач за замовчуванням: група у файлах і який користувач та групи працює з вашим веб-сервером.

Інші посилання на Drupal Docs доволі добре посилаються на цю тему, але ще одним ресурсом є модуль перегляду безпеки, який допомагає переконатися, що все налаштовано належним чином.


9

Я відповім, розглядаючи випадок, коли файли створюються на сервері за допомогою FTP, використовуючи облікові дані, відмінні від того, під яким працює веб-сервер (як правило, Apache працює як ніхто / ніхто). Це означає, що користувач, якому належать файли, створені вручну перед запуском інсталятора 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 ----, тобто. без біта виконання. Це не головне питання безпеки?
kiranking

8

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

  • Drupal webroot має бути читаним у всьому світі (див.: Updateter.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.