Önerilen dizin izinleri nelerdir?


145

Bir Drupal 7 sitesi dağıtmaya hazırlanıyor ve önerilen güvenlik bilincine sahip dosya ve dizin izinlerinin neye ayarlanması gerektiği konusunda herhangi bir belge bulamıyorum.

Özellikle default/files/(ayrıca dizinleri alt?), settings.php, .htaccessVe başka bir şey ben farkında olmalıdır.



Bunu güzel bir şekilde açıklayan ve her yönüyle özetleyen bir blog var. technologymythbuster.blogspot.com/2018/06/…
Kalpesh Popat

Yanıtlar:


69

Web sunucusu dosyalarını okuması ancak mümkün olmalıdır değil onlara yazın. Siteniz dosya yüklemeyi içeriyorsa, sunucuya yalnızca bir klasöre yazma izni verin.

Bunu nasıl kuracağınızla ilgili daha fazla bilgi ve eğer yapmazsanız gerçekleşebilecek bazı şeyler Drupal belgelerinde mevcuttur .


13
Bu, web sunucusu tarafından yazılabilmesi gereken siteler / varsayılan / dosyalar dizini için doğru değildir, aksi halde sıkıntılarınız olacaktır.
Rooby

3
@ rooby İkinci cümle bunu netleştirir.
kenorb

14
Her ne kadar "Siteniz dosya yüklemeyi içeriyorsa" yazsa da, ancak dosya dizinine yazma erişiminiz olması için tek neden bu değildir. Çok yaygın bir örnek, dosyaları yükleyen ilgisiz kullanıcılar olan js / css toplamasıdır. Diğer modüller bu dizinin yazılabilir olmasını da bekleyebilir.
rooby

91

Bu kadar çok drupal sayfa çok uzun ve kafa karıştırıcı. Ama kafasına çiviyi vuran Jason'ın bu yazıyı içeriyor:

Jason Sale tarafından 1 Kasım 2010 tarihinde saat 12: 40'te gönderildi

Bunu ve her şeyi yazdığınız için teşekkür ederiz, ancak ben ve bu sayfayı okuyan insanların% 99'u gerçekten istediğim bir klasör listesinin yanındaki sayıların bir listesi.

  • /default 755
  • /default/files 744'teki (veya 755) tüm alt klasörler ve dosyalar dahil
  • /default/themes 755'teki tüm alt klasörler ve dosyalar dahil
  • /default/modules 755'teki tüm alt klasörler ve dosyalar dahil
  • /default/settings.phpve /default/default.settings.php444

7
Konu uzun ve kafa karıştırıcı. Sayfa durumun gerçeğine uyar.
gregles

17
... Drupal doktorlarından! Ve bu yüzden derhal basit ve anlaşılabilir bir şeyle değiştirilmesi gerekiyor! Özellikle de güvenlik söz konusu olduğunda. SADECE ÇÜNKÜ güvenlik ile ilgili! Çünkü bu hepimize ait. Etkilenmiş bir sunucu yalnızca deneyimsiz Drupal kullanıcısının bir sorunu değildir. O zaman hepimiz için bir problem. Bu nedenle, geliştiricilerin narsisizminden ilham alan karmaşık ve kötü yazılmış dokümanları, karmaşıklığı ve karmaşıklığı ve kendi başlarına ne kadar iyi idare edebileceğini göstermek için yetişmek çok yararlı değildir. Basit bir dosya izinleri ağaç grafik bırakma noktasını göremiyorum. webchick buna katılıyor.
nilsun

3
Neden 755 açık / varsayılan / dosya var? Birinin ön ucunu keserek kötü niyetli bir şey yüklemeyi başarabilmesi durumunda (veya kötü yapılandırma) bu her zaman 744 olmamalı mıdır? 755'in olması için herhangi bir sebep var mı? Peki ya / tmp?
Webdrips

1
Settings.php dosyası 440 olmalıdır. "Diğerleri" settings.php dosyasını göremiyor olmalıdır. 740, sudo komutları olmadan yazabilmek istiyorsanız.
Bryden

sadece meraklı neden .htaccess dosya ve tmp klasöründeki dosya web sunucusu tarafından yazılmış olması gerekir? 444'ü settings.php gibi işaretlemek güvenli değil mi? Sormamın nedeni, junkfile.php dosyasının korsan tarafından web sunucusu aracılığıyla dosya klasörüne hacker tarafından yüklenip yüklenemeyeceği, ardından .htaccess dosyası değiştirilebilir. haklı mıyım
18'de

82

Bir sunucuda yeni bir Drupal sitesi oluşturma konusundaki pratiğim, web sunucusunun (tipik olarak Apache) grubunun bir parçası olan bir kullanıcıya sahip olmak ve bu kullanıcının tüm Drupal dosyalarına sahip olması. Ubuntu'da bunlar için ayarlanan komutlar:

# 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

Bu ayarları yaptıktan sonra, bu kullanıcı olarak oturum açıp Drupal'ı / var / www / example / docroot ya da benzeri bir yere yükleyeceğim ve ardından dosyalar dizinini el ile oluşturacağım ve settings.php dosyasının üzerine kopyalayacağım. Drupal'da kopyalamadan önce örnek kullanıcı olarak giriş yaptığımızdan, dosya sahipliğimiz ve izinlerimiz otomatik olarak tüm çekirdek Drupal dosyalarında ve komut dosyalarında (.htaccess dosyaları da dahil) düzgün şekilde yapılandırılmalıdır.

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

Şimdi dosya dizinini ayarlayalım.

# 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

Daha sonra, web sunucusunun her zaman bu dizinde bulunan herhangi bir dosyaya yazabilmesi için izinleri ayarlayacağız. Bunu chmod komutumuzda 2775 kullanarak yapıyoruz. 2, grup kimliğinin bu dizinde oluşturulan tüm yeni dosyalar için korunacağı anlamına gelir. Bunun anlamı, www - verilerinin her zaman herhangi bir dosyadaki grup olacağı ve böylece web sunucusunun ve kullanıcının her zaman bu dizine yerleştirilen yeni dosyalara yazma izinlerinin olmasını sağlamaktır. İlk 7, sahibinin (örnek) buradaki herhangi bir dosyayı R (Oku) W (Yaz) ve X (Yürütme) yapabileceği anlamına gelir. İkinci 7, grubun (www-data) bu dizindeki herhangi bir dosyayı RW ve X ile de verebileceği anlamına gelir. Son olarak, 5, diğer kullanıcıların R ve X dosyalarını yapabileceği, ancak yazamayacağı anlamına gelir.

 chmod 2775 sites/default/files

Bu dizinde mevcut dosyalar varsa, web sunucusunun üzerlerinde yazma izinleri olduğundan emin olun.

 chmod g+w -R sites/default/files

Şimdi Drupal kurulmaya hazır. Tamamlandığında, settings.php'ye geri dönmek ve tüm kullanıcıların yalnızca okuma izinlerine sahip olduğundan emin olmak ÇOK önemlidir.

 chmod 444 sites/default/settings.php

Bu kadar! Bu kurulum, dizinin sahibi olan kullanıcının veya web sunucusunun, dosyalar dizinine dosya yazamadığı / değiştiremediği / silemediği durumlardan kaçınmanızı sağlar.


.htacess'i 444 jsut'a settings.php olarak ayarlamak güvenli değil mi? Yine de bu dosya drupal çekirdeğinde nadiren güncellenir.
18'de

Htaccess'i 444 olarak ayarlayabilirsiniz, ancak Drupal çekirdeğini yükseltirken fazladan baş ağrısı ekler ve sitenizi daha güvenli hale getirmez.
q0rban

30

Drupal dosyaları klasörü web sunucusu tarafından yazılabilir olmalıdır. Bunu yapmanın en güvenli yolu, grubu değiştirmek ve grubu yazılabilir hale getirmektir.

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

Dosya yükleme klasörü bir yana, en güvenli olanı tüm dosyalar için chmod 644, dizinler için 755'tir.

Bu şöyle başarılabilir (Drupal-site klasöründe çalıştırıldığında, .geçerli yol içindir):

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

chmod g+wYukarıdaki komutu çalıştırdıktan sonra tekrar ayarlamanız gerekeceğini unutmayın , çünkü bunlar tüm dosyaları ve klasörleri chmod'u sıfırlayacaktır.


2
Bu cevabı varsayar: ubuntu üzerindesiniz. Siteniz o sunucuda çalışan tek site. Ayrıca, sorunu otomatik olarak yapmak yerine sadece bir kez çözer (örneğin, umask değiştirerek).
gregles

Mutlaka Ubuntu değil ve aynı sunucuda çalışan birden fazla site olsa bile, hala yararlı bir önlem. Umask'ın değiştirilmesi (umarım zaten bu ayarlara sahip olmalıdır), Linux'ta çok iyi bilgili olmayan insanlara önerdiğim bir şey değildir. Bunun mükemmel bir güvenlik olmadığını biliyorum, ama burada iyinin düşmanı olmamasına izin vermeyelim.
mikl

Çok bölgeli bir ortamda koşuyorum chgrp -R www-data sites/*/filesve chmod -R g+w sites/*/filesdurum sayfası hatalarından kurtulmak için.
leymannx

20

"Chmod blah" veya "chown X" için herhangi bir tavsiye, bilmeden anlamsızdır: varsayılan kullanıcı: grup dosyalarda ve web sunucunuzun hangi kullanıcı ve gruplarda çalıştığını.

Başkalarının bağladığı Drupal Docs bu konuda oldukça iyi ancak bir başka kaynak da her şeyin doğru bir şekilde yapılmasını sağlamaya yardımcı olan Güvenlik İnceleme Modülü .


9

Dosyaların FTP üzerinden sunucuda oluşturuldukları durumu, web sunucusunun çalıştığından farklı kimlik bilgileri kullanarak (normalde Apache hiç kimsenin kimsenin olmadığı gibi çalışır) kullanarak cevaplayacağım. Bu, Drupal yükleyicisini çalıştırmadan önce (sunucuya Drupal arşivinden yüklenen dosyaları da içeren) Drupal yükleyicisini çalıştırmadan önce el ile oluşturulan dosyalara sahip olan kullanıcının, web sunucusunu çalıştırmak için kullanılan kullanıcı olmadığı (kullanıcı adı veya grubun uyuşmadığı) olmadığı anlamına gelir. . Bu senaryo, bu dosyaların SSH kullanılarak oluşturulduğu durumlar için de geçerlidir.

  • Settings.php dosyasının Drupal yükleyiciden yazılabilir olması gerekir, ancak yükleme tamamlandıktan sonra salt okunur olması önerilir (yükleyici bunu önerir ve Drupal düzenli aralıklarla dosyanın gerçekten salt okunur olup olmadığını denetler). Açıkladığım senaryoda, bu dosyanın izni en az 644 olmalıdır.
  • (En az iki yerde bulunan) .htaccess dosyalarının 644 iznine sahip olması gerekir. Drupal'ın bir sonraki sürümünün bir .htaccess dosyasıyla birlikte gelmesi durumunda dosyayı oluşturan kullanıcının dosyanın üzerine yazabilmesi gerekir. güncellendi (bir güvenlik sorununu önlemek için bu dosyaya bir satır eklendiğinde zaten bir kez gerçekleşti). İzinleri 444 olarak ayarlamak da mümkündür, ancak bu durumda, dosyanın güncellenmesi gerektiğinde izinler 644 olarak değiştirilmelidir.
  • Modüller tarafından oluşturulan dosyaları içeren dizin ( default/filesdizin) olmalıdır (web sunucusu işlemlerine atanan kullanıcı için, o zaman bu web sunucusunda çalışan PHP betiklerine atanan kullanıcı):
    • okunabilir
    • yazılabilir
    • Gezilebilir (modüller ulaşabilmelidir default/files/<directory-used-by-the-module>/<sub-directory-used-by-the-module>)

drupal.org/node/244924 ve özellikle drupal.org/node/244924#comment-8186447 adresindeki konuyu okuduktan sonra , sadece 660 RW-RW ---- için yüklenecek dosyaların nasıl elde edileceğini gösteren farklı yöntemlerin hiçbiri sağlanmadı. yürütme biti olmadan. Ana güvenlik sorunu değil mi?
18'de

8

Önerilen dosya / dizin izinleri:

  • Drupal webroot dünya tarafından okunabilir olmalıdır (bakınız: updater.inc ): 0755
  • genel yükleme dizinleri için: 0755 veya 0775
  • Özel yükleme dizinleri için: 0750 or 0770
  • Genel olarak yüklenen dosyalar için: 0644 veya 0664
  • özel yüklenen dosyalar için: 0640 veya 0660
  • dizinler içindeki .htaccess için (bakınız: file_create_htaccess () ): 0444 (varsayılan) veya 0644
  • settings.php tümü için salt okunur (ve diğer gizli dosyalar için): 0440
  • diğer tüm web dizinleri için: 0755
  • diğer tüm web dosyaları için: 0644

Önerilen dosya / dizin sahipliği:

  • Tüm yükleme dizinlerinin / dosyalarının sahibi Apache kullanıcısına ayarlanmalı,
  • Tüm web / kaynaklar dizin / dosyalarının sahibi Apache olmayan bir kullanıcıya ayarlanmalı,
  • (isteğe bağlı olarak) tüm kaynaklardan oluşan grup Apache grubuna ayarlanmalı,

Yeni öğeler için varsayılan dizin / dosya izinlerini kontrol eden değişkenler:

file_chmod_directory: 0775
file_chmod_file: 0664

İşte izinleri düzeltmek için bazı komut dosyaları: fix-permissions.sh


Daha fazla oku:


Genel / özel dizinler için uzak ana bilgisayardaki izinleri düzeltmek için kullandığım komut dosyası:

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

Not: Yukarıdaki kod Apache grubunu almaya çalışacak ve onu GET_HTTP_GROUPdeğişkene ayarlayacaktır .


imi çok güzel bir levha. İyi iş ..
kiranking

4

Bu kabuk betiği bu sayfanın altında bulunur: https://www.drupal.org/node/244924

İzinlerimin doğru ayarlandığından emin olmak için ara sıra çalıştırıyorum.

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

Ayrıca fastcgi kullanıyorsanız, php kullanıcı AS olarak çalışır ve siz bunu kasten engellemeye çalışmadığınız sürece, kullanıcının erişebildiği tüm dosyalara erişebilir.


1

Bu, OSX İzin sorunlarımda bana yardımcı oldu. Protoplazma kullanıcısı tarafından https://www.drupal.org/node/244924#comment-3741738 adresinde buldum . Bir göçün ardından sorunları vardı gibiydi.

[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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.