Apa izin direktori yang disarankan?


145

Saya bersiap-siap untuk menyebarkan situs Drupal 7 dan saya tidak dapat menemukan dokumentasi apa pun yang harus ditetapkan untuk izin file dan direktori sadar keamanan yang disarankan.

Khususnya default/files/(juga sub direktori?) settings.php,, .htaccessDan hal lain yang harus saya ketahui.



Ada sebuah blog yang menjelaskan hal ini dengan indah dan mencakup setiap aspeknya secara abstrak. technologymythbuster.blogspot.com/2018/06/…
Kalpesh Popat

Jawaban:


69

Server web Anda harus dapat membaca semua file tetapi tidak menulisnya. Jika situs Anda melibatkan mengunggah file maka berikan izin server untuk menulis ke satu folder saja.

Informasi lebih lanjut tentang cara mengaturnya, serta beberapa hal yang dapat terjadi jika Anda tidak melakukannya, tersedia di dokumen Drupal .


13
Ini tidak berlaku untuk direktori situs / default / file, yang harus dapat ditulisi oleh server web atau Anda akan memiliki banyak masalah.
rooby

3
@rooby Kalimat kedua menjelaskan itu.
kenorb

14
Meskipun dikatakan "Jika situs Anda melibatkan mengunggah file" tetapi itu bukan satu-satunya alasan Anda mungkin perlu menulis akses ke direktori file. Contoh yang sangat umum adalah agregasi js / css, yang mana pengguna yang tidak terkait mengunggah file. Modul lain juga dapat berharap direktori tersebut dapat ditulisi.
rooby

91

Itu drupal halaman seperti begitu banyak sangat panjang dan membingungkan. Tapi itu berisi posting ini oleh Jason, yang memukul paku di kepala:

Diposting oleh Jason Sale pada 1 November 2010 pukul 12:40

Terima kasih telah menulis ini dan semuanya, tetapi semua yang saya dan 99% orang baca halaman ini benar-benar inginkan adalah daftar angka di sebelah daftar folder.

  • /default pada 755
  • /default/files termasuk semua subfolder dan file di 744 (atau 755)
  • /default/themes termasuk semua subfolder dan file di 755
  • /default/modules termasuk semua subfolder dan file di 755
  • /default/settings.phpdan /default/default.settings.phppada 444

7
Topiknya panjang dan membingungkan. Halaman ini sesuai dengan kenyataan situasi.
Greggles

17
... dari dokumen Drupal! Dan itu sebabnya perlu diubah menjadi sesuatu yang sederhana & mudah dimengerti! Terutama ketika menyangkut keamanan. HANYA KARENA ini tentang keamanan! Karena itu milik kita semua. Server yang terinfeksi bukan hanya masalah pengguna Drupal yang tidak berpengalaman. Itu masalah kita semua kalau begitu. Jadi, tidak sangat membantu untuk menjaga dokumen yang kompleks & ditulis dengan buruk yang terinspirasi oleh pengembang narcissm untuk memamerkan kerumitan & kerumitan dan seberapa baik mereka sendiri bisa mengatasinya. Saya tidak melihat titik untuk meninggalkan grafik pohon izin file sederhana. webchick menyetujui hal itu.
nilsun

3
Mengapa 755 di / default / file? Tidakkah seharusnya ini selalu 744 kalau-kalau seseorang berhasil mengunggah sesuatu yang jahat dengan meretas ujung depan (atau melalui konfigurasi yang buruk)? Apakah ada alasan untuk memiliki 755? Bagaimana dengan / tmp?
Webdrips

1
File settings.php harus 440. "Others" seharusnya tidak dapat melihat settings.php. 740 jika Anda ingin dapat menulis padanya tanpa perintah sudo.
Bryden

hanya ingin tahu mengapa file .htaccess dalam file dan folder tmp perlu ditulis oleh server web? bukankah aman untuk menandainya 444 seperti halnya settings.php. Alasan yang saya tanyakan adalah apakah junkfile.php dapat diunggah oleh peretas ke folder file melalui server web maka file .htaccess dapat diganti. Apakah saya benar?
kiranking

82

Praktik saya dalam membuat situs Drupal baru di server adalah memiliki pengguna yang merupakan bagian dari grup server web (biasanya Apache), dan memiliki pengguna itu yang memiliki semua file Drupal. Di Ubuntu, ini adalah perintah untuk mengaturnya:

# 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

Setelah saya mengaturnya, saya akan masuk sebagai pengguna itu dan menginstal Drupal di / var / www / example / docroot atau sejenisnya, dan kemudian membuat direktori file dengan tangan dan menyalin ke file settings.php. Karena kami masuk sebagai contoh pengguna sebelum menyalin di Drupal, kepemilikan dan izin file kami harus secara otomatis dikonfigurasi dengan benar pada semua file dan skrip Drupal inti (termasuk file .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

Sekarang mari kita mengatur direktori file.

# 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

Selanjutnya kita akan mengatur izin agar server web selalu dapat menulis ke file apa pun yang ada di direktori ini. Kami melakukan ini dengan menggunakan 2775 dalam perintah chmod kami. Angka 2 berarti bahwa id grup akan disimpan untuk semua file baru yang dibuat dalam direktori ini. Artinya adalah bahwa www - data akan selalu menjadi grup pada file apa pun, sehingga memastikan bahwa server web dan pengguna akan selalu memiliki izin menulis untuk file baru apa pun yang ditempatkan di direktori ini. 7 yang pertama berarti bahwa pemilik (contoh) dapat R (Baca) W (Tulis) dan X (Jalankan) file apa pun di sini. 7 kedua berarti bahwa grup (www-data) juga dapat RW dan X file apa pun dalam direktori ini. Akhirnya, 5 berarti bahwa pengguna lain dapat file R dan X, tetapi tidak menulis.

 chmod 2775 sites/default/files

Jika ada file yang ada di direktori ini, pastikan server web memiliki izin menulis pada mereka.

 chmod g+w -R sites/default/files

Sekarang Drupal siap diinstal. Setelah selesai, SANGAT penting untuk kembali ke settings.php dan memastikan bahwa semua pengguna hanya memiliki izin baca.

 chmod 444 sites/default/settings.php

Itu dia! Pengaturan ini memastikan Anda menghindari situasi apa pun di mana pengguna yang memiliki direktori atau server web tidak dapat menulis / mengubah / menghapus file di direktori file.


tidakkah aman untuk mengatur .htacess ke 444 hanya sebagai settings.php? Lagi pula file itu jarang diperbarui di inti drupal.
kiranking

Anda dapat mengatur .htaccess menjadi 444, tetapi itu akan menambah sakit kepala tambahan saat memutakhirkan inti Drupal dan tidak membuat situs Anda lebih aman.
q0rban

30

Folder file Drupal harus dapat ditulis oleh server web. Cara paling aman untuk melakukannya adalah dengan mengubah grup dan menjadikannya grup yang dapat ditulisi, seperti ini:

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

Di samping folder unggah file, yang paling aman adalah chmod 644 untuk semua file, 755 untuk direktori.

Ini bisa dilakukan seperti ini (ketika dijalankan di folder situs Drupal, .is the for path saat ini):

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

Ingatlah bahwa Anda perlu mengatur chmod g+wlagi setelah menjalankan perintah di atas, karena itu akan mengatur ulang chmod pada semua file dan folder.


2
Jawaban ini mengasumsikan: Anda berada di ubuntu. Situs Anda adalah satu-satunya yang berjalan di server itu. Itu juga hanya menyelesaikan masalah sekali daripada membuatnya terjadi secara otomatis (misalnya dengan mengubah umask).
Greggles

Belum tentu Ubuntu, dan itu masih ukuran yang bermanfaat, bahkan jika ada beberapa situs yang berjalan di server yang sama. Mengubah umask (yang semestinya sudah memiliki pengaturan ini) bukan sesuatu yang saya rekomendasikan kepada orang-orang yang tidak berpengalaman dalam Linux. Saya tahu ini bukan keamanan yang sempurna, tapi jangan biarkan sempurna menjadi musuh yang baik di sini.
mikl

Pada multisite saya jalankan chgrp -R www-data sites/*/filesdan chmod -R g+w sites/*/filesuntuk menyingkirkan kesalahan halaman status.
leymannx

20

Saran apa pun untuk "chmod blah" atau "chown X" tidak ada artinya tanpa mengetahui: apa pengguna default: grup ada pada file dan apa pengguna dan grup yang dijalankan oleh server web Anda.

Drupal Docs yang telah ditautkan oleh orang lain cukup bagus tentang topik ini tetapi satu sumber lain adalah Modul Tinjauan Keamanan yang membantu memastikan Anda telah mengatur semuanya dengan benar.


9

Saya akan menjawab mengingat kasus file dibuat di server menggunakan FTP, menggunakan kredensial berbeda dari yang di bawahnya adalah server web berjalan (biasanya, Apache berjalan sebagai tidak ada / siapa pun). Ini berarti bahwa pengguna yang memiliki file yang dibuat secara manual sebelum menjalankan pemasang Drupal (yang termasuk juga file yang diunggah di server dari arsip Drupal) bukan pengguna yang digunakan untuk menjalankan server web (baik nama pengguna atau grup yang cocok) . Skenario ini berlaku juga untuk kasus di mana file-file tersebut dibuat menggunakan SSH.

  • File settings.php harus dapat ditulis dari installer Drupal, tetapi begitu instalasi selesai disarankan untuk membuatnya hanya-baca (installer menyarankan itu, dan Drupal secara berkala akan memeriksa apakah file tersebut benar-benar hanya-baca). Dalam skenario yang saya jelaskan, izin file ini setidaknya 644.
  • File .htaccess (yang ada di setidaknya dua tempat) harus memiliki izin 644. Pengguna yang membuat file harus tetap dapat menimpa file, dalam kasus Drupal versi berikutnya dilengkapi dengan file .htaccess yang telah diperbarui (itu sudah terjadi sekali, ketika telah ditambahkan baris ke file itu untuk menghindari masalah keamanan). Dimungkinkan juga untuk mengatur izin ke 444, tetapi dalam kasus itu, izin harus diubah kembali ke 644 ketika file perlu diperbarui.
  • Direktori yang berisi file yang dibuat oleh modul ( default/filesdirektori) harus (untuk pengguna yang ditugaskan ke proses server web, yang kemudian pengguna ditugaskan ke skrip PHP yang berjalan di server web itu):
    • dapat dibaca
    • dapat ditulis
    • dapat dilalui (modul harus dapat dijangkau default/files/<directory-used-by-the-module>/<sub-directory-used-by-the-module>)

setelah membaca utas di drupal.org/node/244924 dan secara khusus drupal.org/node/244924#comment-8186447 tidak ada metode berbeda yang menyediakan cara mencapai file yang diunggah dengan hanya memiliki 660 RW-RW ---- ie. tanpa bit eksekusi. Bukankah itu masalah keamanan utama?
kiranking

8

Izin file / direktori yang disarankan:

  • Drupal webroot harus dapat dibaca dunia (lihat: updater.inc ): 0755
  • untuk direktori unggahan publik: 0755 atau 0775
  • untuk direktori unggahan pribadi: 0750 atau 0770
  • untuk file yang diunggah publik: 0644 atau 0664
  • untuk file yang diunggah pribadi: 0640 atau 0660
  • untuk .htaccess dalam direktori unggahan (lihat: file_create_htaccess () ): 0444 (default) atau 0644
  • untuk settings.php hanya-baca untuk semua (dan file rahasia lainnya): 0440
  • untuk semua direktori web lainnya: 0755
  • untuk semua file web lainnya: 0644

Kepemilikan file / direktori yang disarankan:

  • pemilik semua direktori / file unggahan harus disetel ke pengguna Apache,
  • pemilik semua web / sumber direktori / file harus disetel ke pengguna non-Apache,
  • (opsional) grup semua sumber harus diatur ke grup Apache,

Berikut adalah variabel yang mengontrol izin file / dir default untuk item baru:

file_chmod_directory: 0775
file_chmod_file: 0664

Berikut ini beberapa skrip untuk memperbaiki izin: fix-permissions.sh


Baca lebih lajut:


Berikut ini skrip yang saya gunakan untuk memperbaiki izin pada host jarak jauh untuk direktori publik / pribadi:

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

Catatan: Kode di atas akan mencoba untuk mengambil grup Apache dan mengaturnya ke GET_HTTP_GROUPvariabel.


lembar contekan yang sangat bagus, ditandai.
Kerja

4

Skrip shell ini ditemukan di bagian bawah halaman ini: https://www.drupal.org/node/244924

Saya menjalankannya sesekali untuk memastikan bahwa izin saya diatur dengan benar.

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

Juga jika Anda menjalankan fastcgi, php dijalankan sebagai pengguna, dan akan memiliki akses ke semua file yang dapat diakses oleh pengguna kecuali Anda sengaja mencoba menghindarinya.


1

Ini membantu saya dengan masalah Izin OSX saya. Saya menemukannya di https://www.drupal.org/node/244924#comment-3741738 oleh pengguna protoplasma. Saya seperti dia mengalami masalah setelah migrasi.

[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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.