Das wichtigste zu den Dateirechten unter Unix und wie das funktioniert.
Blitzfix für pull
Wird z.B. die settings.php die versioniert ist geändert, sollten vor git pull kurz die Rechte von /default und settings.php geändert werden, damit der Ordner beschreibbar und die settings überrschreibbar ist.
Rechte freigeben:
Wichtig: aus /public aufrufen
chmod 755 web/sites/default
chmod 644 web/sites/default/settings.php
git pull
drush cr (nur nötig für neue Drupal-Dateien, chmod braucht kein cr)Rechte zurücksetzen:
chmod 555 web/sites/default
chmod 444 web/sites/default/settings.phpBasics
Dateien und Verzeichnisse haben Rechte für drei Benutzergruppen:
u = user = Eigentümer
g = group = Gruppe
o = others = alle anderenDie Rechte werden mit drei Buchstaben dargestellt:
r = read = lesen
w = write = schreiben
x = execute = ausführenBei einem Verzeichnis bedeutet x insbesondere, dass das Verzeichnis betreten bzw. durchlaufen werden darf.
Jedem Recht entspricht eine Zahl:
r = 4
w = 2
x = 1Die Werte werden pro Benutzergruppe addiert:
rwx = 4 + 2 + 1 = 7
rw- = 4 + 2 = 6
r-x = 4 + 1 = 5
r-- = 4 = 4Beispiele:
755 = rwxr-xr-x
│ │ └─ others: lesen + betreten
│ └──── group: lesen + betreten
└─────── user: lesen + schreiben + betreten
775 = rwxrwxr-x
│ │ └─ others: lesen + betreten
│ └──── group: lesen + schreiben + betreten
└─────── user: lesen + schreiben + betreten
777 = rwxrwxrwx
alle dürfen alles; normalerweise vermeiden.
Typische Dateirechte:
644 = rw-r--r--
664 = rw-rw-r--
Typische Verzeichnisrechte:
755 = rwxr-xr-x
775 = rwxrwxr-x
Rechte anzeigen
Symbolic Notation (rwx rwx rwx)
Wenn es sich um ein Verzeichnis handelt wird das d davor gesetzt.
Verzeichnis: drwxr-xr-x
File: rwxr-xr-xls -ld private private/tmp
Output:
drwxr-xr-x 5 pierre staff 160 Sep 18 16:14 private
drwxr-xr-x 2 pierre staff 64 Sep 18 16:14 private/tmpOktale Notation (755)
Eine kürzere Schreibweise, die darauf aufbaut, dass die Werte
4 = read
2 = write
1 = execute
stat -f '%Lp' private
Output
755
Auf dem Mac kann man beide Werte ausgeben:
stat -f '%Sp %OLp %Su:%Sg %N' private private/tmp
Output
drwxr-xr-x 755 pierre:staff private
drwxr-xr-x 755 pierre:staff private/tmpRechte ändern
chmod 775 private
chmod 775 private/tmp
Output:
Rekursiv ändern:
chmod -R 775 privateAchtung: Rekursives chmod nicht gedankenlos verwenden, insbesondere nicht auf Produktionsservern. Dateien und Verzeichnisse benötigen nicht zwingend dieselben Rechte.
Eigentümer und Gruppe
ls -ld privateoder ausführlicher unter macOS:
stat -f '%Sp %OLp %Su:%Sg %N' private
Output:
drwxr-xr-x 755 pierre:staff privatepierre = Eigentümer
staff = Gruppe
Welcher Benutzer greift auf Drupal-Dateien zu?
Bei Dateirechten muss unterschieden werden zwischen:
- Lokal bei mir: welcher Benutzer greift im Terminal auf die Daten zu
z.B. pierre - Webserver: Benutzer, unter dem PHP bzw. der Webserver Drupal ausführt
Wenn Drupal über den Browser Dateien anlegt, ist für die Dateirechte der PHP-/Webserver-Benutzer entscheidend.
1. Eigenen Terminal-Benutzer prüfen
whoami
Output:
pierreDieser Benutzer gilt für Befehle, die ich selbst im Terminal ausführe.
2. Welcher Benutzer steuert Drupal
Dieses Kapitel nochmal durcharbeiten und Beschreibung klarer formulieren...
Um herauszufinden, wie der User heisst, der Drupal bzw. PHP steuert, kann man ein kleines PHP Script ins Webroot legen und diese Seite aufrufen.
Im Drupal-Webroot temporär eine Datei anlegen:
public/whoami.php
mit folgendem Inhalt:
<?php
header('Content-Type: text/plain');
echo 'Effective UID: ' . posix_geteuid() . PHP_EOL;
$user = posix_getpwuid(posix_geteuid());
echo 'PHP User: ' . ($user['name'] ?? 'unknown') . PHP_EOL;
echo 'PHP Group ID: ' . posix_getegid() . PHP_EOL;Seite aufrufen >
Output Lokal
Effective UID: 501 PHP User: pierre PHP Group ID: 4294967295
Output Metanet:
Effective UID: 11455 PHP User: kommpakt-ftp PHP Group ID: 10001
Damit wird der Benutzer angezeigt, unter dem PHP den Webrequest ausführt.
Lokal bei mir pierre (Admin), bei Metanet z.B. kommpakt-ftp. Das dürfte der Nutzer sein, der beim Erstellen eines neuen Acounts automatisch erzeugt wird.
WICHTIG: Die Testdatei danach sofort wieder löschen:
3. Warum nicht einfach Drush verwenden?
Ein Befehl wie
drushh php:eval "..."
läuft normalerweise als der Benutzer, der Drush im Terminal gestartet hat.
Bei mir lokal wäre das z. B. pierre.
Das sagt deshalb nicht zwingend aus, unter welchem Benutzer PHP läuft, wenn
Drupal über MAMP im Browser aufgerufen wird.
4. Dasselbe auf Stage / Live prüfen
Die gleiche temporäre whoami.php kann auch auf Stage oder Live kurz aufgerufen
werden.
Damit lässt sich feststellen, welcher Benutzer dort PHP ausführt.
Danach die Datei unbedingt wieder löschen.
5. Dateirechte mit PHP-Benutzer vergleichen
Rechte, Eigentümer und Gruppe anzeigen:
ls -ld private private/tmp
Unter macOS zusätzlich numerisch:
stat -f '%Sp %OLp %Su:%Sg %N' private private/tmp
Beispiel:
drwxr-xr-x 755 pierre:staff private
Bedeutung:
- Eigentümer: pierre
- Gruppe: staff
- Rechte: 755 / rwxr-xr-x
Wenn PHP nicht als pierre läuft und auch nicht über eine passende Gruppe
Schreibrechte besitzt, kann PHP bei 755 nicht in dieses Verzeichnis schreiben.
Merke:
whoami
= Wer bin ich im Terminal?
whoami.php über den Browser
= Als welcher Benutzer führt der Webserver/PHP Drupal aus?
ls / stat
= Wem gehört das Verzeichnis und welche Rechte besitzt es?
Erst diese drei Informationen zusammen erklären, ob Drupal schreiben darf.