Zugriffsrechte
Jede Datei (und jedes Verzeichnis) hat unter Linux eine* Besitzer_in und Gruppe. Für diese , als auch für alle anderen Benutzer_innen im System können Lese-, Schreib- und Ausführungsrechte vergeben werden. In einer Verzeichnisabfrage per "ls -l" stellt sich das schematisch dann so dar:
-rwxrwxrwx 1 user group SIZE DATE dateiname
Das erste "read, write, (e)xecute" bezieht sich auf die user_in, das Zweite auf die group, das Dritte auf other - also alle anderen User. In diesem Fall handelt es sich um eine gewöhnliche Datei mit dem Namen "dateiname", die der Benutzerin "user" gehört und der Gruppe "group" gehört. In diesem Fall haben alle drei Gruppen Vollzugriff. Anders wärs hier:
-rw-r----- 1 user group SIZE DATE dateiname
Hier hat die Userin selbst (also der Systemaccount, dem die Datei "gehört") Lese- und Schreibrechte. Ausgeführt werden kann die Datei nicht (daher fehlt hier das x). Die Gruppe darf nur lesen (sowohl statt dem x als auch statt dem w steht hier nur ein -). Und alle anderen dürfen mit der Datei gar nichts machen, also nicht einmal den Inhalt auslesen. Es gibt noch weitere Spezialmodi, und das erste "-" Zeichen zeigt an, ob es sich um eine gewöhnliche Datei, ein Verzeichnis, einen Link, oder andere spezielle Einträge im Dateisystem handelt. Eine ausführliche Beschreibung, was genau ls -l anzeigt findet sich hier: https://www.gnu.org/software/coreutils/manual/html_node/What-information-is-listed.html#What-information-is-listed . Wir machen aber nun einfach mit ein paar Beispielen weiter.
Dass ich als gewöhnliche Systembenutzerin nur eingeschränkte Rechte im gesamten System verfüge, merke ich zum Beispiel daran, wenn ich lesegeschützte Dateien öffne. Lassen wir uns also zuerst die /etc/passwd ansehen, in der alle User-Accounts in diesem System aufgelistet sind (und lassen wir uns vorher die Zugriffsrechte auch anzeigen):
$ ls -l /etc/passwd
-rw-r--r-- 1 root root 2,6K Nov 27 18:30 /etc/passwd
$ less /etc/password
Diese Datei können wir (ohne root-Rechte) lesen, allerdings dürften wir an ihr nichts verändern. Hier bekommen wir auch allerhand Informationen über die Accounts. Allerdings gibt es keine Informationen die als sicherheitsrelevant eingestuft werden, daher ist es auch kein Problem wenn alle Benutzer_innen des Systems hier Leserechte haben. Anders aber ist das bei der /etc/shadow, in der die zu den Accounts gehörenden Sicherheitsinformationen gespeichert werden: ob Accounts aktiv sind, wie lange sie noch aktiv sind, wann sie ihr Passwort ändern müssen, und viele weitere Infos, nicht zuletzt die Passwort-Hashes selbst. Zeigen wir uns deren Rechte an und probieren wir die Datei zu lesen, erhalten wir:
$ ls -l /etc/shadow
-rw-r----- 1 root shadow 1,5K Nov 27 18:30 /etc/shadow
$ less /etc/shadow
/etc/shadow: Permission denied
Um diese Datei zu lesen, müssten wir entweder der Gruppe shadow angehören (die hier ja Leserechte besitzt), oder aber mit dem root Account einloggen. Unterschiedliche Distributionen sehen hier unterschiedliche Modi vor. Klassischerweise hat mensch sich mit "su" zur Superuserin gemacht und dann als root weitergearbeitet. Sicherer ist es allerdings (und bei Ubuntu Distributionen ist dies standardmäßig so eingerichtet) per "sudo" zwischenzeitlich root-Rechte zu erlangen und einzelne Befehle so auszuführen. Wir stellen dem Befehl den wir ausführen wollen einfach ein sudo voran und das System fragt uns nach unserem Passwort (nicht dem root Passwort). Wenn wir dazu berechtigt sind per sudo Befehle auszuführen (z.B. in dem wir der Gruppe sudo angehören), können wir mit folgendem Befehl also die /etc/shadow lesen:
$ sudo less /etc/shadow
Auf Systemen, auf denen sudo nicht installiert ist (z.B. Debian), kann dieses nachinstalliert werden. Mensch kann sich aber auch einfach per "su" in eine root shell einloggen und Befehle ausführen. Dazu wird allerdings nicht das eigene Passwort sondern jenes vom root Account benötigt. Während "su" alleine die eigene User-ID zu der von root verändert, kann mit "su -l" eine eigene Login Shell für root gestartet werden (das ist dann so als würde sich root direkt ins System einloggen - bei sudo wird selbiges mit "sudo -i" erzielt). Anstatt sich einzuloggen, kann aber auch mit su einfach nur ein Befehl ausgeführt werden, und zwar mit "su -c". Wir können also auch so nur für einen Befehl root privileges erlangen. Allerdings muss der eigentliche Befehl als String angegeben werden (da es jdas Argument der Option -c ist):
$ su -c "less /etc/shadow"
Zu welchen Gruppen wir überhaupt zugeordnet sind können wir wie folgt anzeigen:
$ groups
jackie adm cdrom sudo dip plugdev lpadmin sambashare libvirtd
Noch mehr Aufschluss über Gruppenzugehörigkeiten und die eigene user ID bekommen wir mit:
$ id
uid=1000(jackie) gid=1000(jackie) groups=1000(jackie),4(adm),24(cdrom),27(sudo),30(dip),
46(plugdev),115(lpadmin),131(sambashare),134(libvirtd)
Wir können diese Befehle auch auf andere User_innen anwenden:
$ groups root
root : root
$ id root
uid=0(root) gid=0(root) groups=0(root)
$ groups workshop
workshop : workshop
$ id workshop
uid=1047(workshop) gid=1015(workshop) groups=1015(workshop)
Jeder system account hat eine primäre Gruppe. Diese ist direkt in der /etc/passwd angegeben. Zugleich kann der account aber beliebig vielen sekundären Gruppen zugeordnet werden. Diese Zuordnungen werden über die Datei /etc/group gespeichert.
Zum Anlegen, Löschen und Ändern von User Accounts und Gruppen werden folgende Befehle verwendet:
adduser
oderuseradd
addgroup
odergroupadd
usermod
deluser
oderuserdel
delgroup
odergroupdel
Wir belassen es hier erstmal bei der Erwähnung der Befehle. Ihr könnt mit "man adduser" etc. ja genauer reinschnuppern. Wir wollen aber hier erstmal mit den Zugriffsrechten von Dateien weiterexperimentieren.
Schauen wir uns nochmal die Zugriffsrechte für die von uns erstellte erste Datei im Workshopfolder an:
$ ls -l erste-datei.txt
-rw-rw-r-- 1 jackie jackie 75 Dez 3 14:49 erste-datei.txt
Wir wollen nun verhindern, dass wir die Datei selbst versehentlich überschreiben. Wir müssen uns also selsbt die Schreibrechte entziehen. Das machen wir mit dem Befehl "chmod" (nur die Besitzerin einer Datei kann den Zugriffsmodus verändern). Wir müssen chmod als Parameter einerseits die Datei (oder das Verzeichnis) angeben, auf die wir die Änderung durchführen wollen. Anderseits müssen wir chmod auch mitteilen, wie die neuen Zugriffsrechte aussehen oder wie sie sich (im Vergleich zu den aktuellen Zugriffsrechten) ändern sollen.
Das kann entweder durch einen absoluten Wert passieren oder relativ. Die Zugriffsrechte sind oktal kodiert, für user, group und other könenn jeweils Werte von 0 bis 7 angegeben werden. Das komtm daher, dass die Zugriffsrechte als bits/flags kodiert sind und daher pro Zugriffsgruppe (user, group, others) jeweils drei bits benötigt werden. Mit drei bit können bis zu 8 werte dargestellt werden. Da die flags in der Reihenfolge r, w, x kodiert werden hat ein gesetztes read-Flag den dezimalen (und auch oktalen) Wert 4, ein write-Flag den Wert 2 und ein execute-Flag den Wert 1. So können wir den Gesamtwert berechnen - indem wir die Werte der gesetzten Flags addieren. rwx bedeutet also 4+2+1, also 7. rw- würde 6 bedueten (4+2), r-x wäre 5 (4+1), und so weiter. Wenn also beispielsweise nur die Userin lesen und schreiben können soll, alle anderne gar nichts, dann wäre das ein Oktalwert von 600 - das ist 4+2 für die Userin, und kein einziges gesetztes Flag für die Gruppe oder andere.
Für unseren obigen Fall, dass die erste-datei.txt also von allen, auch von der Userin selbst gelesen werden darf, aber sonst nichts damit passieren darf, würde sich der Oktalwert 444 ergeben. Wir können die Rechte also wie folgt setzen:
$ chmod 444 erste-datei.txt
$ ls -l erste-datei.txt
-r--r--r-- 1 jackie jackie 75 Dez 3 14:49 erste-datei.txt
Zu Beginn ist es aber oft einfacher mit relativen Zuweisungen zu arbeiten. Wir können zum Beispiel sagen, dass die Zugriffsrechte gleich bleiben, aber die Userin und die Gruppe jeweils ein Ausführungsrecht bekommen sollen. Das geht dann so:
$ chmod ug+x erste-datei.txt
$ ls -l erste-datei.txt
-r-xr-xr-- 1 jackie jackie 75 Dez 3 14:49 erste-datei.txt
Genausogut hätten wir aber auch "chmod 554 erste-datei.txt" verwenden können. Wollen wir nun allen außer der Userin und der Gruppe die Leserechte wegnehmen, können wir das so machen:
$ chmod o-r erste-datei.txt
Wenn wir nun allen, also wirklich allen, uns selbst inklusive alle Rechte entziehen wollen, verwenden wir eine der folgenden beiden Befehle:
$ chmod ugo-rwx erste-datei.txt
$ chmod 000 erste-datei.txt
$ ls -l erste-datei.txt
---------- 1 jackie jackie 75 Dez 3 14:49 erste-datei.txt
Versuchen wir die Datei per cat auszugeben, erhalten wir einen Zugriffsfehler:
$ cat erste-datei.txt
cat: erste-datei.txt: Permission denied
Nun geben wir uns selbst wieder Lese-, Schreib- und Ausfhürungsrechte, der Gruppe nur Lese- & Ausführungsrechte und allen anderen nur Leserechte:
$ chmod 764 erste-datei.txt
-rwxrw-r-- 1 jackie jackie 75 Dez 3 14:49 erste-datei.txt
Aber wieso konnten wir jetzt die Zugriffsrechte ändern, obwohl wir uns zuvor gerade alle Rechte entzogen haben? Das liegt daran, dass über chmod nur die Zugriffsrechte der Datei gestzt werden - das sind Metainformationen zur Datei, die spezifisch im ext4-Dateisystem vorkommen. Unter FAT32 (Windows, alt) gäbe es diese Zugriffsrechte gar nicht. Unter NTFS (Windows, neu) schauen Zugriffsrechte ganz anders aus. Generell kann jedes Dateisystem Metainformationen zu den Dateien selbst unterschiedlich speichern. Linux selbst stellt uns Dateien aber immer in diesem Schema dar - dafür sorgt das VFS (Virutal File System), das alle einghängten Dateisystem auf ein einheitliches Interface abbildet (siehe auch https://en.wikipedia.org/wiki/Virtual_file_system, das ist aber eher theoretisches Hintergrundwissen). Die jeweiligen Metainformationen einer Datei sind aber einfach ein kleiner Daten-Zusatz zur Datei selbst. Und diese können immer nur von der Userin, der die Datei gehört geändert werden. Oder eben von einem Account mit root privilege.
Die Information wem nun eine Datei gehört, und welcher Gruppe sie zugeordnet ist, die kann wiederum nur von einem Account mir root privilege geändert werden, und zwar über die Befehle chown und chgrp. Aber probieren wir doch einfach mal:
$ chgrp root erste-datei.txt
chgrp: changing group of ‘erste-datei.txt’: Operation not permitted
$ sudo chgrp root erste-datei.txt
$ ls -l erste-datei.txt
-rwxrw-r-- 1 jackie root 75 Dez 3 14:49 erste-datei.txt
$ sudo chown root erste-datei.txt
-rwxrw-r-- 1 root root 75 Dez 3 14:49 erste-datei.txt
Nun gehört die Datei nicht mehr uns, daher können wir sie zwar noch lesen, aber nicht mehr schreiben. Allerdings können wir sie nach wie vor löschen, weil das Löschen einer Datei genaugenommen nur ein Schreibzugriff auf das Verzeichnis ist: die Datei selbst wird gar nicht erst verändert sondern es wird einfach nur die Verzeichnisinformation neu geschrieben und zwar so, dass die Datei nun nicht mehr Teil des Verzeichnisses ist. Die Datei ist somit aus dem System verschwunden und der Speicherplatz ist freigegeben, aber auf der Festplatte liegen physisch noch die selben Daten - zumindest so lange, bis neue Daten genau auf diese Stelle geschrieben wurden. Der Befehl zum Löschen (rm, für remove) ist aber so nett uns darauf hinzuweisen dass wir gerade versuchene eine Datei zu löschen, auf die wir keine Schreibrechte haben, und fragt uns ob wir das denn wirklich wollen:
$ rm erste-datei.txt
rm: remove write-protected regular file ‘erste-datei.txt’? y
$ ls -l erste-datei.txt
ls: cannot access erste-datei.txt: No such file or directory
Ein kleiner Tipp noch zu chown und chgrp, bevor wir das Thema Zugriffsrechte abschließen: chown kann nicht nur die Ownerin sondern auch die Gruppe ändern und macht damit eigentlich chgrp für jene Situationen überflüssig, wo ich ohnehin beide Zuordnungen ändere. Anstatt "chown jackie datei; chgrp workshop datei" kann ich auch einfach "chown jackie:workshop datei" verwenden.