Các quyền thư mục được đề nghị là gì?


145

Tôi đang chuẩn bị triển khai một trang web Drupal 7 và tôi không thể tìm thấy bất kỳ tài liệu nào về các quyền mà thư mục và tệp có ý thức bảo mật được đề xuất nên được đặt thành.

Cụ thể default/files/(cũng là thư mục con?) settings.php, .htaccessVà bất cứ điều gì khác tôi nên biết.


1
Ngoài ra còn có một câu trả lời ở đây: drupal.stackexchange.com/questions/52695/NH
Miễn phí cấp tiến

Có một blog giải thích điều này rất hay và bao quát mọi khía cạnh của nó một cách trừu tượng. technologymythbuster.blogspot.com/2018/06/...
Kalpesh Popat

Câu trả lời:


69

Máy chủ web của bạn sẽ có thể đọc tất cả các tệp nhưng không thể ghi vào chúng. Nếu trang web của bạn liên quan đến việc tải lên các tệp thì chỉ cho phép máy chủ ghi vào một thư mục đó.

Thông tin thêm về cách thiết lập điều đó, cũng như một số điều có thể xảy ra nếu bạn không có sẵn trong tài liệu Drupal .


13
Điều này không đúng với thư mục site / default / files, mà máy chủ web phải ghi được nếu không bạn sẽ gặp nhiều rắc rối.
rooby

3
@rooby Câu thứ hai làm rõ điều đó.
kenorb

14
Mặc dù thông báo "Nếu trang web của bạn liên quan đến việc tải lên tệp" nhưng đó không phải là lý do duy nhất bạn có thể cần quyền truy cập ghi vào thư mục tệp. Một ví dụ rất phổ biến là tập hợp js / css, đó là những người dùng không liên quan tải lên các tập tin. Các mô-đun khác cũng có thể mong đợi thư mục đó có thể ghi được.
rooby

91

Đó drupal trang giống như rất nhiều là rất dài và khó hiểu. Nhưng nó chứa bài đăng này của Jason, người đã bắn đinh vào đầu:

Đăng bởi Jason Sale vào ngày 1 tháng 11 năm 2010 lúc 12:40 chiều

Cảm ơn bạn đã viết cái này và mọi thứ, nhưng tất cả những gì tôi và 99% những người đọc trang này thực sự muốn là một danh sách các số bên cạnh một danh sách các thư mục.

  • /default ngày 755
  • /default/files bao gồm tất cả các thư mục con và tệp trên 744 (hoặc 755)
  • /default/themes bao gồm tất cả các thư mục con và tệp trên 755
  • /default/modules bao gồm tất cả các thư mục con và tệp trên 755
  • /default/settings.php/default/default.settings.phptrên 444

7
Chủ đề dài và khó hiểu. Các trang phù hợp với thực tế của tình hình.
chào đón

17
... của các tài liệu Drupal! Và đó là lý do tại sao nó cần được thay đổi thành một cái gì đó đơn giản và dễ hiểu ngay lập tức! Đặc biệt là khi nói đến an ninh. VÌ VẬY, đó là về bảo mật! Bởi vì nó thuộc về tất cả chúng ta. Một máy chủ bị nhiễm không chỉ là vấn đề của người dùng Drupal chưa có kinh nghiệm. Đó là một vấn đề của tất cả chúng ta sau đó. Vì vậy, sẽ không hữu ích khi theo kịp các tài liệu phức tạp và được viết xấu lấy cảm hứng từ các nhà phát triển narcissm để thể hiện sự phức tạp và phức tạp và bản thân họ có thể xử lý nó tốt như thế nào. Tôi không thấy điểm để loại bỏ một đồ họa cây quyền tập tin đơn giản. webchick đồng ý về điều đó.
nilsun

3
Tại sao có 755 trên / mặc định / tập tin? Không phải lúc nào đây cũng phải là 744 trong trường hợp ai đó quản lý để tải lên thứ gì đó độc hại bằng cách hack giao diện người dùng (hoặc thông qua cấu hình kém)? Có bất kỳ lý do để có 755? Còn / tmp thì sao?
Webdrips

1
Tệp settings.php phải là 440. "Những người khác" sẽ không thể thấy settings.php. 740 nếu bạn muốn có thể ghi vào nó mà không cần lệnh sudo.
Bryden

chỉ tò mò tại sao tập tin .htaccess trong tập tin và thư mục tmp cần được ghi bởi máy chủ web? không an toàn để đánh dấu nó là 444 giống như settings.php. Lý do tôi hỏi là liệu hackerfile.php có thể được tải lên thư mục tệp qua máy chủ web hay không thì tệp .htaccess có thể được thay thế. tôi có đúng không
kiranking

82

Thực tiễn của tôi về việc tạo một trang web Drupal mới trên máy chủ là có một người dùng là một phần của nhóm máy chủ web (thường là Apache) và người dùng đó sở hữu tất cả các tệp Drupal. Trên Ubuntu, đây là các lệnh để thiết lập:

# 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

Khi tôi đã thiết lập xong, tôi sẽ đăng nhập với tư cách là người dùng đó và cài đặt Drupal tại / var / www / example / docroot hoặc tương tự, sau đó tạo thư mục tệp bằng tay và sao chép tệp cài đặt.php. Vì chúng tôi đăng nhập với tư cách là người dùng mẫu trước khi sao chép trong Drupal, quyền sở hữu và quyền của tệp của chúng tôi sẽ tự động được cấu hình đúng trên tất cả các tệp và tập lệnh Drupal cốt lõi (bao gồm các tệp .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

Bây giờ hãy thiết lập thư mục tập tin.

# 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

Tiếp theo, chúng tôi sẽ thiết lập quyền để máy chủ web luôn có thể ghi vào bất kỳ tệp nào trong thư mục này. Chúng tôi làm điều này bằng cách sử dụng 2775 trong lệnh chmod của chúng tôi. 2 có nghĩa là id nhóm sẽ được giữ nguyên cho bất kỳ tệp mới nào được tạo trong thư mục này. Điều đó có nghĩa là www - dữ liệu sẽ luôn là nhóm trên bất kỳ tệp nào, do đó đảm bảo rằng máy chủ web và người dùng sẽ luôn có quyền ghi vào bất kỳ tệp mới nào được đặt trong thư mục này. 7 đầu tiên có nghĩa là chủ sở hữu (ví dụ) có thể R (Đọc) W (Viết) và X (Thực thi) bất kỳ tệp nào ở đây. 7 thứ hai có nghĩa là nhóm (dữ liệu www) cũng có thể RW và X bất kỳ tệp nào trong thư mục này. Cuối cùng, 5 có nghĩa là những người dùng khác có thể tệp R và X, nhưng không thể ghi.

 chmod 2775 sites/default/files

Nếu có bất kỳ tệp nào trong thư mục này, hãy chắc chắn rằng máy chủ web đã ghi perms vào chúng.

 chmod g+w -R sites/default/files

Bây giờ Drupal đã sẵn sàng để được cài đặt. Khi kết thúc, điều rất quan trọng là quay lại cài đặt.php và đảm bảo rằng tất cả người dùng chỉ có quyền đọc.

 chmod 444 sites/default/settings.php

Đó là nó! Việc thiết lập này đảm bảo bạn tránh mọi tình huống trong đó người dùng sở hữu thư mục hoặc máy chủ web không thể ghi / thay đổi / xóa tệp trong thư mục tệp.


không an toàn khi đặt .htacess thành 444 jsut làm settings.php? dù sao tập tin đó hiếm khi được cập nhật trong lõi drupal.
kiranking

Bạn có thể đặt .htaccess thành 444, nhưng nó sẽ gây thêm đau đầu khi nâng cấp lõi Drupal và không làm cho trang web của bạn an toàn hơn nữa.
q0rban

30

Thư mục tệp Drupal phải được ghi bởi máy chủ web. Cách an toàn nhất để làm điều đó là thay đổi nhóm và làm cho nhóm có thể ghi được, như thế này:

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

Thư mục tải lên tệp sang một bên, an toàn nhất là chmod 644 cho tất cả các tệp, 755 cho các thư mục.

Điều này có thể được thực hiện như thế này (khi được chạy trong thư mục trang web Drupal, .dành cho đường dẫn hiện tại):

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

Hãy nhớ rằng bạn sẽ cần phải thiết lập chmod g+wlại sau khi chạy lệnh trên, vì những lệnh này sẽ đặt lại chmod trên tất cả các tệp và thư mục.


2
Câu trả lời này giả định: bạn đang ở trên Ubuntu. Trang web của bạn là người duy nhất chạy trên máy chủ đó. Nó cũng chỉ giải quyết vấn đề một lần thay vì làm cho nó tự động xảy ra (ví dụ: bằng cách thay đổi ô).
chào đón

Không nhất thiết phải là Ubuntu và đây vẫn là một biện pháp hữu ích, ngay cả khi có nhiều trang web đang chạy trên cùng một máy chủ. Thay đổi ô (hy vọng đã có các cài đặt này) không phải là điều tôi khuyên dùng cho những người không rành về Linux. Tôi biết đây không phải là bảo mật hoàn hảo, nhưng chúng ta đừng để hoàn hảo là kẻ thù tốt ở đây.
mikl

Trên nhiều trang tôi chạy chgrp -R www-data sites/*/fileschmod -R g+w sites/*/filesđể thoát khỏi các lỗi trang trạng thái.
leymannx

20

Mọi lời khuyên cho "chmod blah" hoặc "chown X" đều vô nghĩa mà không cần biết: người dùng mặc định: nhóm nằm trên các tệp và người dùng và nhóm máy chủ web của bạn chạy như thế nào.

Tài liệu Drupal mà những người khác đã liên kết khá tốt về chủ đề này, nhưng một tài nguyên khác là Mô-đun đánh giá bảo mật giúp đảm bảo bạn đã đặt mọi thứ đúng cách.


9

Tôi sẽ trả lời xem xét trường hợp các tệp được tạo trên máy chủ bằng FTP, sử dụng thông tin đăng nhập khác với thông tin mà máy chủ web chạy (thông thường, Apache chạy dưới dạng không ai / không ai). Điều này có nghĩa là người dùng sở hữu các tệp được tạo thủ công trước khi chạy trình cài đặt Drupal (bao gồm cả các tệp được tải lên trên máy chủ từ kho lưu trữ Drupal) không phải là người dùng được sử dụng để chạy máy chủ web (không phải tên người dùng hoặc nhóm phù hợp) . Kịch bản này cũng áp dụng cho trường hợp các tệp đó được tạo bằng SSH.

  • Tệp settings.php phải có thể ghi được từ trình cài đặt Drupal, nhưng sau khi cài đặt xong, nó được đề xuất làm cho nó chỉ đọc (trình cài đặt đề xuất rằng, và Drupal sẽ kiểm tra định kỳ xem tệp có thực sự chỉ đọc được không). Trong kịch bản tôi đang mô tả, sự cho phép của tệp này ít nhất phải là 644.
  • Các tệp .htaccess (có mặt ở ít nhất hai vị trí) phải có quyền 644. Người dùng đã tạo tệp vẫn có thể ghi đè lên tệp, trong trường hợp phiên bản tiếp theo của Drupal đi kèm với tệp .htaccess đã được cập nhật (nó đã xảy ra một lần, khi nó đã được thêm một dòng vào tập tin đó để tránh vấn đề bảo mật). Cũng có thể đặt quyền thành 444, nhưng trong trường hợp đó, quyền đó phải được đổi lại thành 644 khi tệp cần được cập nhật.
  • Thư mục chứa các tệp được tạo bởi các mô-đun ( default/filesthư mục) phải là (đối với người dùng được gán cho các quy trình máy chủ web, sau đó người dùng được gán cho các tập lệnh PHP đang chạy trên máy chủ web đó):
    • có thể đọc được
    • có thể ghi
    • di chuyển ngang (các mô-đun phải có khả năng tiếp cận default/files/<directory-used-by-the-module>/<sub-directory-used-by-the-module>)

sau khi đọc chủ đề tại drupal.org/node/244924 và cụ thể là drupal.org/node/244924#comment-8186447 không có phương pháp nào khác cung cấp cách đạt được các tệp được tải lên chỉ có 660 RW-RW ---- tức là. không có bit thực thi. Nó không phải là vấn đề bảo mật chính?
kiranking

8

Quyền truy cập tệp / thư mục được đề xuất:

  • Webroot Drupal nên có thể đọc được trên thế giới (xem: updater.inc ): 0755
  • cho các thư mục tải lên công khai: 0755 hoặc 0775
  • cho các thư mục tải lên riêng tư: 0750 hoặc 0770
  • đối với các tệp được tải lên công khai: 0644 hoặc 0664
  • đối với các tệp tải lên riêng tư: 0640 hoặc 0660
  • cho .htaccess trong các thư mục tải lên (xem: file_create_htaccess () ): 0444 (mặc định) hoặc 0644
  • cho settings.php chỉ đọc cho tất cả (và các tệp bí mật khác): 0440
  • cho tất cả các thư mục web khác: 0755
  • cho tất cả các tệp web khác: 0644

Đề xuất quyền sở hữu tập tin / thư mục:

  • chủ sở hữu của tất cả các thư mục / tệp tải lên phải được đặt thành người dùng Apache,
  • chủ sở hữu của tất cả các thư mục / tệp web / nguồn nên được đặt thành người dùng không phải là Apache,
  • (tùy chọn) nhóm tất cả các nguồn nên được đặt thành nhóm Apache,

Dưới đây là các biến kiểm soát quyền truy cập tệp / tệp mặc định cho các mục mới:

file_chmod_directory: 0775
file_chmod_file: 0664

Đây là một số tập lệnh để sửa quyền: fix-permissions.sh


Đọc thêm:


Đây là tập lệnh mà tôi đang sử dụng để sửa quyền trên máy chủ từ xa cho các thư mục công cộng / riêng tư:

#!/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'

Lưu ý: Mã ở trên sẽ cố gắng truy xuất nhóm Apache và đặt nó thành GET_HTTP_GROUPbiến.


cheat-sheet rất đẹp, đánh dấu. Làm tốt lắm ..
kiranking

4

Tập lệnh shell này được tìm thấy ở dưới cùng của trang này: https://www.drupal.org/node/244924

Tôi thỉnh thoảng chạy nó để đảm bảo rằng các quyền của tôi được thiết lập chính xác.

#!/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

Ngoài ra nếu bạn đang chạy fastcgi, php sẽ chạy AS người dùng và sẽ có quyền truy cập vào tất cả các tệp mà người dùng có quyền truy cập trừ khi bạn cố tình tránh điều này.


1

Điều này đã giúp tôi với các vấn đề về Giấy phép OSX. Tôi đã tìm thấy nó trong https://www.drupal.org/node/244924#comment-3741738 bởi người dùng protoplasm. Tôi giống như anh ấy có vấn đề sau khi di chuyển.

[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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.