Was sind die empfohlenen Verzeichnisberechtigungen?


145

Ich bereite mich auf die Bereitstellung einer Drupal 7-Site vor und finde keine Dokumentation darüber, wie die empfohlenen sicherheitsbewussten Datei- und Verzeichnisberechtigungen festgelegt werden sollten.

Insbesondere default/files/(auch Unterverzeichnisse?) Und alles andere settings.php, .htaccesswas ich beachten sollte.


1
Hier gibt es auch eine Antwort: drupal.stackexchange.com/questions/52695/…
Free Radical

Es gibt einen Blog, der dies wunderschön erklärt und jeden Aspekt auf abstrakte Weise behandelt. technologymythbuster.blogspot.com/2018/06/…
Kalpesh Popat

Antworten:


69

Ihr Webserver sollte in der Lage sein, alle Dateien zu lesen, aber nicht in sie zu schreiben. Wenn Ihre Site das Hochladen von Dateien umfasst, erteilen Sie dem Server die Berechtigung, nur in diesen einen Ordner zu schreiben.

Weitere Informationen zum Einrichten sowie einige Dinge, die passieren können, wenn Sie dies nicht tun, finden Sie in den Drupal-Dokumenten .


13
Dies gilt nicht für das Verzeichnis sites / default / files, das vom Webserver beschreibbar sein muss. Andernfalls treten zahlreiche Probleme auf.
Rooby

3
@rooby Der zweite Satz verdeutlicht das.
Kenorb

14
Es steht zwar "Wenn Ihre Site das Hochladen von Dateien beinhaltet", dies ist jedoch nicht der einzige Grund, warum Sie möglicherweise Schreibzugriff auf das Dateiverzeichnis benötigen. Ein sehr verbreitetes Beispiel ist die js / css-Aggregation, bei der es sich um nicht verwandte Benutzer handelt, die Dateien hochladen. Andere Module können auch erwarten, dass dieses Verzeichnis beschreibbar ist.
Rooby

91

Diese Drupal- Seite ist sehr lang und verwirrend. Aber es enthält diesen Beitrag von Jason, der den Nagel auf den Kopf getroffen hat:

Gepostet von Jason Sale am November 1, 2010, um 12:40 Uhr

Danke, dass Sie dies und alles geschrieben haben, aber alles, was ich und 99% der Leute, die diese Seite lesen, wirklich wollen, ist eine Liste von Zahlen neben einer Liste von Ordnern.

  • /default am 755
  • /default/files Einschließlich aller Unterordner und Dateien auf 744 (oder 755)
  • /default/themes einschließlich aller Unterordner und Dateien auf 755
  • /default/modules einschließlich aller Unterordner und Dateien auf 755
  • /default/settings.phpund /default/default.settings.phpauf 444

7
Das Thema ist lang und verwirrend. Die Seite passt zur Realität der Situation.
Greggles

17
... der Drupal-Dokumente! Und deshalb muss es sofort in etwas Einfaches und Verständliches geändert werden! Besonders wenn es um Sicherheit geht. WEIL es um Sicherheit geht! Weil es uns allen gehört. Ein infizierter Server ist nicht nur ein Problem des unerfahrenen Drupal-Benutzers. Das ist dann ein Problem von uns allen. Daher ist es nicht sehr hilfreich, komplexe und schlecht geschriebene Dokumente zu führen, die von Entwicklern inspiriert wurden, um Komplexität und Komplexität zu demonstrieren und zu zeigen, wie gut sie selbst damit umgehen können. Ich sehe keinen Grund, eine einfache Baumgrafik für Dateiberechtigungen wegzulassen. Webchick stimmt dem zu.
Nilsun

3
Warum haben 755 auf / default / files? Sollte dies nicht immer 744 sein, nur für den Fall, dass es jemandem gelingt, etwas Bösartiges durch Hacken des Frontends (oder durch schlechte Konfiguration) hochzuladen? Gibt es einen Grund, 755 zu haben? Was ist mit / tmp?
Webdrips

1
Die settings.php-Datei sollte 440 sein. "Andere" sollten settings.php nicht sehen können. 740, wenn Sie in der Lage sein möchten, ohne sudo-Befehle darauf zu schreiben.
Bryden

nur neugierig, warum .htaccess-Datei in Dateien und tmp-Ordner vom Webserver geschrieben werden müssen? Ist es nicht sicher, es als settings.php zu markieren? Ich frage Sie, ob die Datei junkfile.php vom Hacker über den Webserver in den Ordner files hochgeladen werden kann. Die Datei .htaccess könnte dann ersetzt werden. habe ich recht?
kiranking

82

Meine Praxis beim Erstellen einer neuen Drupal-Site auf einem Server besteht darin, einen Benutzer zu haben, der Teil der Webserver-Gruppe (normalerweise Apache) ist und dem alle Drupal-Dateien gehören. Unter Ubuntu sind dies die Befehle, um dieses Setup zu erhalten:

# 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

Sobald ich das eingerichtet habe, melde ich mich als dieser Benutzer an und installiere Drupal unter / var / www / example / docroot oder ähnlichem. Dann erstelle ich das Dateiverzeichnis von Hand und kopiere die settings.php-Datei. Da wir uns vor dem Kopieren in Drupal als Beispielbenutzer anmelden, sollten unser Dateibesitz und unsere Berechtigungen für alle wichtigen Drupal-Dateien und -Skripten (einschließlich .htaccess-Dateien) automatisch ordnungsgemäß konfiguriert werden.

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

Nun richten wir das Dateiverzeichnis ein.

# 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

Als Nächstes richten wir Berechtigungen ein, damit der Webserver immer in jede Datei in diesem Verzeichnis schreiben kann. Wir tun dies, indem wir 2775 in unserem Befehl chmod verwenden. Die 2 bedeutet, dass die Gruppen-ID für alle in diesem Verzeichnis erstellten neuen Dateien erhalten bleibt. Das bedeutet, dass www - data immer die Gruppe für alle Dateien ist, wodurch sichergestellt wird, dass sowohl der Webserver als auch der Benutzer immer Schreibberechtigungen für alle neuen Dateien haben, die in diesem Verzeichnis abgelegt werden. Die erste 7 bedeutet, dass der Eigentümer (Beispiel) beliebige Dateien hier in R (Lesen) W (Schreiben) und X (Ausführen) kann. Die zweite 7 bedeutet, dass die Gruppe (www-data) auch beliebige Dateien in diesem Verzeichnis rw und x kann. Schließlich bedeutet die 5, dass andere Benutzer R- und X-Dateien können, aber nicht schreiben.

 chmod 2775 sites/default/files

Wenn in diesem Verzeichnis Dateien vorhanden sind, vergewissern Sie sich, dass der Webserver über Schreibrechte verfügt.

 chmod g+w -R sites/default/files

Jetzt kann Drupal installiert werden. Wenn Sie fertig sind, ist es SEHR wichtig, zu settings.php zurückzukehren und sicherzustellen, dass alle Benutzer nur Leseberechtigungen haben.

 chmod 444 sites/default/settings.php

Das ist es! Diese Einstellung stellt sicher, dass Sie Situationen vermeiden, in denen entweder der Benutzer, dem das Verzeichnis gehört, oder der Webserver keine Dateien im Dateiverzeichnis schreiben / ändern / entfernen können.


ist es nicht sicher, .htacess auf 444 jsut als settings.php zu setzen? Trotzdem wird diese Datei in Drupal Core selten aktualisiert.
kiranking

Sie können .htaccess auf 444 setzen, aber es wird zusätzliche Kopfschmerzen beim Aktualisieren des Drupal-Kerns verursachen und Ihre Site nicht sicherer machen.
16.

30

Der Ordner mit den Drupal-Dateien sollte vom Webserver beschreibbar sein. Der sicherste Weg, dies zu tun, besteht darin, die Gruppe zu ändern und beschreibbar zu machen, wie folgt:

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

Abgesehen vom Datei-Upload-Ordner ist der sicherste chmod 644 für alle Dateien, 755 für Verzeichnisse.

Dies könnte folgendermaßen geschehen (wenn es im Drupal-Site-Ordner ausgeführt wird, .gilt der aktuelle Pfad):

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

Denken Sie daran, dass Sie chmod g+wnach dem Ausführen des obigen Befehls eine erneute Einstellung vornehmen müssen, da dadurch das chmod für alle Dateien und Ordner zurückgesetzt wird.


2
Diese Antwort setzt voraus: Du bist auf Ubuntu. Ihre Site ist die einzige, die auf diesem Server ausgeführt wird. Es löst das Problem auch nur einmal, anstatt es automatisch auszuführen (z. B. durch Ändern der umask).
Greggles

Nicht unbedingt Ubuntu, und es ist immer noch eine hilfreiche Maßnahme, auch wenn mehrere Sites auf demselben Server ausgeführt werden. Das Ändern der umask (die hoffentlich bereits diese Einstellungen haben sollte) ist nichts, was ich Leuten empfehlen würde, die sich mit Linux nicht auskennen. Ich weiß, dass dies keine perfekte Sicherheit ist, aber lassen wir Perfect hier nicht den Feind des Guten sein.
mikl

Auf einer Multisite laufe ich chgrp -R www-data sites/*/filesund chmod -R g+w sites/*/filesum die Statusseitenfehler loszuwerden.
leymannx

20

Alle Ratschläge zu "chmod blah" oder "chown X" sind bedeutungslos, ohne zu wissen: Wie lautet die Standardbenutzergruppe in den Dateien und als welche Benutzer und Gruppen wird Ihr Webserver ausgeführt?

Die Drupal-Dokumente, auf die andere verlinkt haben, sind in diesem Thema ziemlich gut, aber eine andere Ressource ist das Sicherheitsüberprüfungsmodul, mit dem Sie sicherstellen können, dass Sie alles richtig eingestellt haben.


9

Ich werde antworten, wenn man bedenkt, dass die Dateien auf dem Server mit FTP erstellt wurden und andere Anmeldeinformationen als auf dem Webserver verwendet wurden (normalerweise wird Apache als nobody / nobody ausgeführt). Dies bedeutet, dass der Benutzer, dem die vor dem Ausführen des Drupal-Installationsprogramms manuell erstellten Dateien gehören (einschließlich der Dateien, die aus dem Drupal-Archiv auf den Server hochgeladen wurden), nicht der Benutzer ist, mit dem der Webserver ausgeführt wurde (weder der Benutzername noch die Gruppe stimmen überein). . Dieses Szenario gilt auch für den Fall, dass diese Dateien mit SSH erstellt werden.

  • Die settings.php-Datei muss vom Drupal-Installationsprogramm aus beschreibbar sein. Nach Abschluss der Installation wird jedoch empfohlen, sie schreibgeschützt zu machen (dies wird vom Installationsprogramm empfohlen, und Drupal überprüft regelmäßig, ob die Datei wirklich schreibgeschützt ist). In dem Szenario, das ich beschreibe, sollte die Berechtigung dieser Datei mindestens 644 sein.
  • Die .htaccess-Dateien (die an mindestens zwei Stellen vorhanden sind) sollten die Berechtigung 644 haben. Der Benutzer, der die Datei erstellt hat, sollte weiterhin in der Lage sein, die Datei zu überschreiben, falls eine nächste Version von Drupal mit einer .htaccess-Datei geliefert wird, die .htaccess-Datei wurde aktualisiert (es ist bereits einmal vorgekommen, als dieser Datei eine Zeile hinzugefügt wurde, um ein Sicherheitsproblem zu vermeiden). Es ist auch möglich, die Berechtigungen auf 444 festzulegen. In diesem Fall sollten die Berechtigungen jedoch auf 644 zurückgesetzt werden, wenn die Datei aktualisiert werden muss.
  • Das Verzeichnis mit den von den Modulen erstellten Dateien (das default/filesVerzeichnis) muss (für den Benutzer, der den Webserverprozessen zugeordnet ist, der Benutzer, der dann den auf diesem Webserver ausgeführten PHP-Skripten zugeordnet ist) sein:
    • lesbar
    • schreibbar
    • überfahrbar (die Module müssen erreichbar sein default/files/<directory-used-by-the-module>/<sub-directory-used-by-the-module>)

Nach dem Lesen des Threads unter drupal.org/node/244924 und speziell unter drupal.org/node/244924#comment-8186447 lieferte keine der verschiedenen Methoden, wie das Hochladen von Dateien mit nur 660 RW-RW erreicht werden kann ---- dh. ohne Ausführungsbit. Ist es nicht die Hauptsicherheitsfrage?
Kiranking

8

Empfohlene Datei- / Verzeichnisberechtigungen:

  • Drupal-Webroot sollte weltweit lesbar sein (siehe: updater.inc ): 0755
  • Für öffentliche Upload-Verzeichnisse: 0755 oder 0775
  • Für private Upload-Verzeichnisse: 0750 oder 0770
  • Für öffentlich hochgeladene Dateien: 0644 oder 0664
  • für privat hochgeladene Dateien: 0640 oder 0660
  • für .htaccess in Upload-Verzeichnissen (siehe: file_create_htaccess () ): 0444 (Standard) oder 0644
  • für settings.php schreibgeschützt für alle (und andere vertrauliche Dateien): 0440
  • für alle anderen Webverzeichnisse: 0755
  • Für alle anderen Webdateien: 0644

Empfohlener Datei- / Verzeichnisbesitz:

  • Eigentümer aller Upload-Verzeichnisse / -Dateien sollte Apache-Benutzer sein,
  • Eigentümer aller Web- / Quellverzeichnisse / -dateien sollte ein Benutzer sein, der nicht Apache ist.
  • (optional) Gruppe aller Quellen sollte auf Apache-Gruppe gesetzt sein,

Hier sind die Variablen, die die Standard-Verzeichnis- / Dateiberechtigungen für neue Elemente steuern:

file_chmod_directory: 0775
file_chmod_file: 0664

Hier ist ein Skript zum Korrigieren von Berechtigungen: fix-permissions.sh


Weiterlesen:


Hier ist ein Skript, mit dem ich die Berechtigungen auf dem Remote-Host für öffentliche / private Verzeichnisse korrigiere:

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

Hinweis: Mit dem obigen Code wird versucht, die Apache-Gruppe abzurufen und auf GET_HTTP_GROUPvariabel zu setzen.


sehr schönes Spickzettel, bookmarken. Gute Arbeit ..
kiranking

4

Dieses Shell-Skript befindet sich am Ende dieser Seite: https://www.drupal.org/node/244924

Ich führe es gelegentlich aus, um sicherzustellen, dass meine Berechtigungen korrekt eingerichtet sind.

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

Auch wenn Sie fastcgi ausführen, wird PHP als Benutzer ausgeführt und hat Zugriff auf alle Dateien, auf die der Benutzer Zugriff hat, sofern Sie nicht absichtlich versuchen, dies zu vermeiden.


1

Dies hat mir bei meinen OSX-Berechtigungsproblemen geholfen. Ich fand es in https://www.drupal.org/node/244924#comment-3741738 von Protoplasma-Benutzer. Ich war wie er, der Probleme nach einer Migration hatte.

[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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.