umask führt eigentlich sehr zu unrecht ein Schattendasein auf den meisten Rechnern denn umask ist ein Sicherheitsfeature was die Rechteverwaltung des Filesystems bestimmt. umask bestimmt wo und wann welche Besitzer- bzw Gruppenrechte gesetzt werden.
Bekanntlich hat unter Linux/Unix jede Datei einen Besitzer und gehört zu einer Gruppe. Unter Debian ist häufig für einen Benutzer auch der Name als Gruppe gesetzt. So gehört der Benutzer max dann der Gruppe max an. Weitere Gruppen wie floppy oder cdrom oder games können folgen. Jeder Benutzer der weder der Besitzer einer Datei ist noch der Gruppe angehört der gehört im Rechtesystem zu other.
Die wichtigsten Rechte werden in jeweils drei Bit beschrieben:
$ ls -l .bashrc -rw-r--r-- 1 max max 3667 Jul 10 18:00 .bashrc $ ls -ld . drwxr-xr-x 77 max max 12288 Aug 25 23:02 .
Dabei symbolisiert die Ausgabe rwxrwxrwx die Rechte für den Besitzer, Gruppe und other (also alle anderen) und dahinter dann den Besitzer und die Gruppe zu der die Datei oder das Verzeichnis (Verzeichnisse sind unter Linux/Unix eigentlich auch nur eine besondere Art Datei) gehört.
Das erste Symbol, hier d für directory steht für Verzeichnis und ist für Eigenschaften zuständig die in diesem Zusammenhang keine Rolle spielt. Jedes der Bittriple steht für Besitzer, Gruppe und other und r steht hier für read (lesen), w steht für write (schreiben) und x steht für executable (ausführbar) wobei x für ein Verzeichnis so keinen Sinn ergibt und hier steht es für die Zugänglichkeit z.B. über cd. Das – steht in der Ausgabe von ls für ein nicht gesetzt. Die Bittriple können manuell durch chmod gesetzt werden. Man kann dabei einen zunächst einfachen Syntax wie chmod +x oder chmod u+x wählen:
$ touch testfile $ ls -l testfile -rw-r--r-- 1 max max 0 Aug 27 08:10 testfile $ chmod +x testfile $ ls -l testfile -rwxr-xr-x 1 max max 0 Aug 27 08:10 testfile
$ touch testfile $ ls -l testfile -rw-r--r-- 1 max max 0 Aug 27 08:13 testfile $ chmod u+x testfile $ ls -l testfile -rwxr--r-- 1 max max 0 Aug 27 08:13 testfile
In beiden Beispielen wurde die Datei ausführbar gemacht, das erste mal für alle Benutzer und das zweite mal nur für den Besitzer der Datei. Obwohl der obige Syntax zunächst recht einfach erscheint benutzen erfahrene Systemadministratoren einen anderen Syntax. Das hat zwei Gründe: zum Einen ist der obige Syntax recht fehlerträchtig aber zum Anderen auch sehr indirekt weil sie zu sehr der menschlichen Denkweise angepasst ist. Erfahrene Systemadministratoren ändern die Rechte in dem sie chmod die in oktalen Werten übergeben. Die folgende Tabelle illustriert dies.
Oktale Zahlenkombination | Binäre Schreibweise | Ergebnis | Bemerkungen |
---|---|---|---|
777 | 111 111 111 | rwxrwxrwx | Recht beliebt unter php-Entwicklern für Verzeichnisse aber ebenso gefährlich weil man der Welt alle Rechte einräumt. |
666 | 110 110 110 | rw-rw-rw- | Genauso zu beurteilen wie eins drüber denn die Welt bekommt alle Rechte an dieser Datei. |
755 | 111 101 101 | rwxr-xr-x | Oft Standard für Verzeichnisse bei nicht verändertem umask. |
644 | 110 100 100 | rw-r--r-- | Auch oft Standard für Dateien bei unveränderter umask. |
750 | 111 101 000 | rwxr-x--- | Bester Wert für Verzeichnisse da die Gruppe nur Leserechte besitzt und die Welt keine Rechte wenn die Gruppe und Benutzer identisch sind also max:max z.B. |
640 | 110 100 000 | rw-r----- | Beste Wahl wie eins drüber für Dateien. |
700 | 111 000 000 | rwx------ | Beste Wahl für vertrauliche Dateien im Verzeichnis. Nur der Besitzer des Verzeichnisses kann den Inhalt einsehen und dort Dateien ablegen. |
600 | 110 000 000 | rw------- | Beste Wahl für vertrauliche Dateien. Nur der Besitzer der Datei kann den Inhalt einsehen und verändert abspeichern. |
umask alleine in der Konsole eingegeben führt normalerweise zu einer Ausgabe wie gezeigt:
$ umask 0022
Dieser Wert mit welchen Rechten Dateien normalerweise angelegt werden. Ohne umask wird ein Ordner mit den oktalen Rechten 777 und eine Datei mit 666 angelegt. Wenn man nun die Werte voneinander abzieht erhält man:
Ordner : 777 umask : 027 --------------- Rechte : 750 = rwxr-x---
bzw.:
Datei : 666 umask : 027 --------------- Rechte : 640 = rw-r-----
Für den häufigen Standard 022 bei Linux-Distributionen heißt das für Ordner 755 und für Dateien 644.
Wie ändert man nun die umask? Nun einfach durch den Befehl umask mit nachgestellter Maske:
$ umask 0022 $ touch testfile022 $ ls -l insgesamt 0 -rw-r--r-- 1 max max 0 Aug 27 23:17 testfile022 $ umask 026 $ touch testfile026 $ ls -l insgesamt 0 -rw-r--r-- 1 max max 0 Aug 27 23:17 testfile022 -rw-r----- 1 max max 0 Aug 27 23:18 testfile026
Diese Methode hat allerdings den Nachteil, dass die Änderung nicht persistent ist und bei jedem neuen Einloggen oder Öffnen einer neuen Loginshell verloren geht. umask wird daher normalerweise in der Datei ~/.profile im home-Verzeichnis des Benutzers gesetzt. Unter Debian ist die letzte auskommentierte Zeile mit #umask 022 hierfür schon vorbereitet und kann entsprechend die Auskommentierung entfernt und geändert werden. Für neue Benutzer kann das Zentral in /etc/skel/.profile geändert werden da dies die Datei ist die über das Standard-Profile von neu angelegten Konten bestimmt.
Die letzte Frage ist nun wie man in bestehende Homeverzeichnisse die neuen Werte überträgt. Für eine umask 026 und ursprüngliche umask von 022 würde:
find /home/ -type d -perm 755 -exec chmod 750 {} \;
die Ordnerrechte und die Dateirechte entsprechend setzen:
find /home/ -type f -perm 644 -exec chmod 640 {} \;
Bei ausführbaren Dateien im Homeverzeichnis wie z.B. Scripte kann man mit:
find /home/ -type f -perm 755 -exec chmod 750 {} \;
die Rechte korrigieren. Aus Versehen sollte aber die Rechte von /home selber nicht verändert werden und mit 755 erhalten bleiben da sich sonst kein Benutzer mehr in sein Homeverzeichnis einloggen kann.
Durch die Abfrage -perm wird sichergestellt, dass nur neue Rechte gesetzt werden die großzügiger als die alte umask gehalten sind und die Rechte von restiktiven Dateien wie in ~/.ssh bleiben so erhalten.