Wer unter Linux mit Dateien, Verzeichnissen, Webservern oder Serverdiensten arbeitet, begegnet früher oder später dem Befehl chown. Das Kommando gehört zu den grundlegenden Werkzeugen der Linux-Administration und entscheidet darüber, wem eine Datei oder ein Verzeichnis gehört.
Gerade nach dem Kopieren von Dateien, beim Einrichten eines Webservers, bei Backups oder beim Betrieb von Anwendungen in unterschiedlichen Benutzerkontexten stimmen die Besitzverhältnisse nicht immer. Mit chown lassen sie sich gezielt korrigieren.
In diesem Beitrag schauen wir uns chown von den Grundlagen bis zu praktischen Beispielen an.
Was ist chown?
Der Name chown steht für:
change owner
Mit dem Befehl können der Besitzer und die zugehörige Gruppe einer Datei oder eines Verzeichnisses geändert werden.
Linux unterscheidet bei klassischen Dateiberechtigungen grundsätzlich zwischen:
- dem Besitzer einer Datei – User
- der zugeordneten Gruppe – Group
- allen anderen Benutzern – Others
Welche Rechte diese drei Kategorien besitzen, wird wiederum über die Dateiberechtigungen festgelegt.
Während chmod die Berechtigungen verändert, kümmert sich chown um die Besitzverhältnisse.
Besitzverhältnisse anzeigen
Bevor wir etwas ändern, sollten wir zunächst herausfinden, wem eine Datei gehört.
Dafür eignet sich:
ls -l
Beispielsweise:
-rw-r--r-- 1 tc users 2480 Sep 1 10:30 dokument.txt
Interessant sind hier insbesondere:
tc users
tc ist der Besitzer der Datei und users die zugeordnete Gruppe.
Die Datei dokument.txt gehört somit dem Benutzer tc und der Gruppe users.
Grundlegende Syntax von chown
Die grundlegende Syntax lautet:
chown [OPTIONEN] BESITZER DATEI
Beispielsweise:
sudo chown max dokument.txt
Damit wird der Benutzer max neuer Besitzer von dokument.txt.
Anschließend lässt sich das Ergebnis kontrollieren:
ls -l dokument.txt
Besitzer und Gruppe gleichzeitig ändern
chown kann nicht nur den Besitzer ändern. Besitzer und Gruppe lassen sich in einem einzigen Befehl setzen.
Die Syntax lautet:
chown BENUTZER:GRUPPE DATEI
Beispielsweise:
sudo chown max:users dokument.txt
Die Datei gehört anschließend dem Benutzer max und der Gruppe users.
Nur die Gruppe ändern
Auch ausschließlich die Gruppenzugehörigkeit kann mit chown verändert werden.
Dazu wird vor dem Gruppennamen ein Doppelpunkt verwendet:
sudo chown :www-data index.html
Der Besitzer bleibt unverändert. Lediglich die Gruppe wird auf www-data gesetzt.
Für reine Änderungen der Gruppenzugehörigkeit existiert außerdem der Linux-Befehl:
chgrp
Mehrere Dateien gleichzeitig bearbeiten
chown kann mehrere Dateien in einem Aufruf verarbeiten.
Beispielsweise:
sudo chown max datei1.txt datei2.txt datei3.txt
Oder Besitzer und Gruppe:
sudo chown max:users datei1.txt datei2.txt datei3.txt
Das ist praktisch, wenn nur eine überschaubare Anzahl bestimmter Dateien angepasst werden soll.
Verzeichnisse mit chown bearbeiten
Natürlich funktioniert chown ebenfalls mit Verzeichnissen.
Beispielsweise:
sudo chown max:users /srv/projekt
Dabei gibt es allerdings einen wichtigen Punkt:
Dieser Befehl verändert zunächst nur die Besitzverhältnisse des Verzeichnisses /srv/projekt.
Die darin enthaltenen Dateien und Unterverzeichnisse werden dadurch nicht automatisch geändert.
Besitzverhältnisse rekursiv ändern
Soll ein komplettes Verzeichnis einschließlich aller Dateien und Unterverzeichnisse angepasst werden, kommt die Option -R zum Einsatz:
sudo chown -R max:users /srv/projekt
-R steht für recursive.
Damit werden die Besitzverhältnisse von /srv/projekt sowie der darunterliegenden Objekte geändert.
Genau hier ist allerdings besondere Vorsicht angebracht.
Ein falsch eingegebener rekursiver chown-Befehl kann die Besitzverhältnisse großer Teile eines Systems verändern.
Vor Befehlen wie:
sudo chown -R ...
sollte daher immer noch einmal kontrolliert werden, welcher Pfad tatsächlich angegeben wurde.
Praktisches Beispiel: Webserver
Ein klassischer Anwendungsfall sind Webserver.
Angenommen, eine Webanwendung befindet sich unter:
/var/www/meine-webseite
Der Webserver arbeitet unter dem Benutzer und der Gruppe www-data.
Besitzer und Gruppe könnten beispielsweise folgendermaßen gesetzt werden:
sudo chown -R www-data:www-data /var/www/meine-webseite
Das bedeutet allerdings nicht, dass dies für jede Webserver-Konfiguration automatisch die beste Lösung ist.
Gerade bei produktiven Systemen sollte geprüft werden, welche Dateien der Webserver tatsächlich schreiben können muss. Ein Webserver benötigt nicht zwangsläufig Eigentums- oder Schreibrechte auf den gesamten Webroot.
Das Prinzip der minimal erforderlichen Berechtigungen sollte auch hier gelten.
Praktisches Beispiel: Dateien nach einem Kopiervorgang
Ein Administrator kopiert mit Root-Rechten Dateien in das Home-Verzeichnis eines Benutzers:
sudo cp -r /backup/projekt /home/max/
Anschließend können Teile des kopierten Verzeichnisses beispielsweise root gehören.
Das lässt sich korrigieren:
sudo chown -R max:max /home/max/projekt
Danach gehört das Projekt wieder dem vorgesehenen Benutzer.
Besitzer anhand einer Referenzdatei übernehmen
Eine interessante Option ist --reference.
Angenommen, datei1.txt besitzt bereits die korrekten Besitzverhältnisse und datei2.txt soll dieselben erhalten.
Dann kann verwendet werden:
sudo chown --reference=datei1.txt datei2.txt
Damit müssen Benutzer und Gruppe nicht manuell angegeben werden.
Das kann insbesondere bei Skripten und administrativen Arbeiten hilfreich sein.
Änderungen ausführlich anzeigen
Mit -v arbeitet chown im sogenannten Verbose-Modus:
sudo chown -v max:users dokument.txt
Der Befehl informiert dann darüber, was verändert wurde.
Bei mehreren Dateien kann dies die Nachvollziehbarkeit verbessern.
Nur tatsächliche Änderungen anzeigen
Die Option -c beziehungsweise --changes zeigt nur Objekte an, deren Besitzverhältnisse tatsächlich geändert wurden:
sudo chown -c max:users *.txt
Das ist besonders praktisch bei größeren Mengen von Dateien.
Benutzer- und Gruppen-IDs
Linux arbeitet intern nicht primär mit Namen wie max oder www-data, sondern mit numerischen IDs.
Die Benutzer-ID heißt:
UID
Die Gruppen-ID heißt:
GID
Die IDs eines Benutzers lassen sich beispielsweise anzeigen mit:
id max
Eine mögliche Ausgabe lautet:
uid=1001(max) gid=1001(max) groups=1001(max),27(sudo)
Auch chown kann mit numerischen IDs arbeiten.
Beispielsweise:
sudo chown 1001:1001 dokument.txt
In der Praxis sind Namen meist besser lesbar. Numerische IDs spielen jedoch beispielsweise bei Backups, Containern, NFS-Systemen, Migrationen und der Wiederherstellung von Daten eine wichtige Rolle.
chown und symbolische Links
Symbolische Links verdienen bei chown besondere Aufmerksamkeit.
Je nach verwendeten Optionen kann entscheidend sein, ob der symbolische Link selbst oder das Ziel des Links bearbeitet wird.
Für Administratoren gilt deshalb insbesondere bei rekursiven Operationen:
Vorher prüfen, wie symbolische Links innerhalb des Verzeichnisbaums behandelt werden.
Die verfügbaren Optionen der installierten Version zeigt:
chown --help
Weitere Details liefert die Manpage:
man chown
chown und chmod – wo liegt der Unterschied?
Die beiden Befehle werden häufig verwechselt.
chown verändert die Besitzverhältnisse.
Beispielsweise:
sudo chown max:users dokument.txt
chmod verändert dagegen die Zugriffsrechte.
Beispielsweise:
chmod 640 dokument.txt
Beide Mechanismen arbeiten zusammen.
Eine Datei kann beispielsweise dem Benutzer max und der Gruppe users gehören und folgende Berechtigungen besitzen:
-rw-r-----
Damit darf der Besitzer lesen und schreiben, Mitglieder der Gruppe dürfen lesen und alle anderen Benutzer besitzen keine entsprechenden Zugriffsrechte.
Wer darf chown verwenden?
Das Ändern von Dateibesitzern ist unter Linux aus Sicherheitsgründen eingeschränkt.
Normale Benutzer können nicht beliebig Dateien anderen Benutzern überschreiben beziehungsweise deren Besitz übertragen.
Für administrative Änderungen wird deshalb häufig sudo benötigt:
sudo chown ...
Das ist ein wichtiger Bestandteil des Linux-Sicherheitsmodells.
Häufiger Fehler: chown -R auf das falsche Verzeichnis
Eine der gefährlichsten Situationen entsteht durch eine Kombination aus Root-Rechten und rekursiver Verarbeitung.
Ein Administrator möchte beispielsweise Folgendes ausführen:
sudo chown -R max:users /srv/projekt
Ein Tippfehler beim Pfad kann jedoch dazu führen, dass wesentlich mehr Dateien als vorgesehen verändert werden.
Deshalb gilt:
Rekursive Änderungen mit Root-Rechten immer besonders sorgfältig kontrollieren.
Vorher kann beispielsweise geprüft werden:
ls -la /srv/projekt
oder:
find /srv/projekt -maxdepth 2 -ls
Erst wenn eindeutig feststeht, dass der Pfad korrekt ist, sollte die rekursive Änderung erfolgen.
chown mit find kombinieren
Nicht immer sollen sämtliche Dateien eines Verzeichnisbaums geändert werden.
Angenommen, nur Dateien mit der Endung .log sollen einen anderen Besitzer erhalten:
find /var/log/meine-app -type f -name "*.log" -exec chown max:adm {} +
Damit lassen sich Besitzverhältnisse wesentlich gezielter verändern als mit einem pauschalen:
chown -R
Gerade auf produktiven Servern kann diese präzisere Vorgehensweise sinnvoll sein.
Besitzverhältnisse kontrollieren
Nach einer Änderung sollte das Ergebnis überprüft werden:
ls -l dokument.txt
Für ein Verzeichnis:
ls -la /srv/projekt
Bei größeren Strukturen kann find helfen:
find /srv/projekt -maxdepth 2 -ls
Oder man sucht gezielt nach Dateien eines bestimmten Benutzers:
find /srv/projekt -user max
Nach einer Migration kann beispielsweise nach Dateien gesucht werden, die noch root gehören:
find /srv/projekt -user root
chown in Skripten
Auch in Shell-Skripten wird chown regelmäßig eingesetzt.
Beispielsweise:
#!/bin/bash BACKUP="/srv/restore/projekt" chown -R max:users "$BACKUP"
Bei Variablen ist es wichtig, Pfadangaben sauber zu quotieren:
"$BACKUP"
Das verhindert unter anderem Probleme mit Leerzeichen in Pfaden.
Bei automatisierten Skripten sollte ein rekursiver chown außerdem niemals leichtfertig auf ungeprüfte Variablen angewendet werden.
Typische chown-Befehle aus der Praxis
Besitzer ändern:
sudo chown max datei.txt
Besitzer und Gruppe ändern:
sudo chown max:users datei.txt
Nur Gruppe ändern:
sudo chown :users datei.txt
Ganzes Verzeichnis rekursiv ändern:
sudo chown -R max:users /srv/projekt
Änderungen anzeigen:
sudo chown -v max:users datei.txt
Nur tatsächliche Änderungen melden:
sudo chown -c max:users *.txt
Besitzverhältnisse einer Referenzdatei übernehmen:
sudo chown --reference=datei1.txt datei2.txt
Numerische UID und GID verwenden:
sudo chown 1001:1001 datei.txt
Sicherheitsaspekte
chown sieht zunächst wie ein einfacher Verwaltungsbefehl aus. Falsche Besitzverhältnisse können jedoch erhebliche Auswirkungen auf die Sicherheit eines Linux-Systems haben.
Besonders kritisch sind unter anderem:
- Konfigurationsdateien
- SSH-Schlüssel
- Webserver-Verzeichnisse
- Systemdienste
- ausführbare Dateien
- Backup-Verzeichnisse
- Logdateien
- Anwendungskonfigurationen
- Dateien mit Zugangsdaten oder Secrets
Ein Dienst sollte grundsätzlich nur auf diejenigen Dateien schreibend zugreifen können, die er für seine Aufgabe tatsächlich verändern muss.
Besitzverhältnisse sind damit ein wichtiger Bestandteil des Least-Privilege-Prinzips.
Fazit
chown gehört zu den grundlegenden Werkzeugen jeder Linux-Administration. Der Befehl ist schnell verstanden, kann aber weitreichende Auswirkungen haben.
Die wichtigste Syntax lässt sich auf eine Zeile reduzieren:
chown BENUTZER:GRUPPE DATEI
Besonders mächtig wird der Befehl durch die rekursive Option:
chown -R BENUTZER:GRUPPE VERZEICHNIS
Genau diese Mächtigkeit verlangt allerdings Vorsicht. Wer chown mit sudo und -R verwendet, sollte den Zielpfad vor dem Ausführen immer noch einmal überprüfen.
Wer den Unterschied zwischen Besitzer, Gruppe und Berechtigungen verstanden hat und chown gemeinsam mit Werkzeugen wie chmod, ls, id und find beherrscht, hat bereits einen wesentlichen Teil des klassischen Linux-Berechtigungsmodells verstanden.