Kontrolliertes Ausfuehren von Befehlen als root: Unterschied zwischen den Versionen
Yehudi (Diskussion | Beiträge) |
Framp (Diskussion | Beiträge) |
||
Zeile 1: | Zeile 1: | ||
− | Autor: framp | + | Autor: [[Benutzer:framp|framp]] |
Den Benutzer root sollte man nur benutzen, wenn man administrative Dinge auf einem Linux Rechner zu tun hat. Ansonsten sollte man immer als normaler User arbeiten, denn als root darf man eben alles - und kann sich unbeabsichtigt sein System zerstoeren. | Den Benutzer root sollte man nur benutzen, wenn man administrative Dinge auf einem Linux Rechner zu tun hat. Ansonsten sollte man immer als normaler User arbeiten, denn als root darf man eben alles - und kann sich unbeabsichtigt sein System zerstoeren. |
Version vom 31. August 2006, 18:13 Uhr
Autor: framp
Den Benutzer root sollte man nur benutzen, wenn man administrative Dinge auf einem Linux Rechner zu tun hat. Ansonsten sollte man immer als normaler User arbeiten, denn als root darf man eben alles - und kann sich unbeabsichtigt sein System zerstoeren.
Beispiel: Es kommt immer wieder mal vor dass in chats ein Linux Anfaenger aufgefordert wird Code:
rm -rf /
oder verklausuliert
echo "rpm -qai && rm -rf /" >> /rebuild_rpm.sh && sh /rebuild_rpm.sh
einzugeben.
<EDIT> (see comments of Draco and jengelh http://www.linux-club.de/ftopic65282.html ) Als normaler User loescht man dann alle seine Dateien, auf die man Schreibzugriffe hat (im wesentlichen /home). Aber als root loescht man damit sein gesamtes System Rolling Eyes !. In beiden Faellen liegt hoffentlich ein aktuelles Backup vor Cool . </EDIT> Dieselbe Regel gilt natuerlich auch unter Windows wo man tunlichst nicht als Administrator angemeldet sein sollte da man sonst den bei Windows im Gegensatz zu Linux etwas haeufiger vorkommenden Viren Tuer und Tor oeffnet.
Normalerweise benutzt man dazu su - und erhaelt damit root Rechte und kann dann auf dem System alles machen was das Herz begehrt. Dieses sollte man aber nur bei Administrationsaufgaben machen. Ansonsten bieten sich die folgenden Moeglichkeiten an sehr kontrolliert immer wiederkehrende root Befehle auszufuehren:
1. sudo 2. ssh auf localhost und Benutzung von shared keys
Natuerlich bieten sich diese Moeglichkeiten auch an wenn man root Rechte deligieren muss oder moechte.
sudo ist ein Standard bei Linux, mit dem kontrolliert Programmausfuehrungsberechtigungen an normale User vergeben werden koennen. Das koennen z.B. Befehle sein, die man haeufiger aufruft, wie z.B. das Starten und stoppen von Daemons oder auch killen von Daemons. Hat man auf einem System mehrere Administratoren sollte man unbedingt sudo benutzen, denn dann wird immer im Log protokolliert, welcher User sich gerade per sudo root Rechte hat geben lassen.
Folgende Sichereitsregeln unbedingt beachten:
- 1. Zentrale Konfigurationsdatei von sudo ist /etc/sudoers immer mit visudo editieren!
- 2. Nie su, sudo, visudo oder eine shell oder Programme mit escape Moeglichkeiten per sudo freigeben!
- 3. Sehr genau auf die Parameter von den Befehlen aufpassen. Ansonsten kann ein simples cat oder chmod ein Sicherheitsloch ins System reissen!
- 4. Niemals ein Program per sudo fuer einen User aufrufbar machen wenn er Schreibzugriff darauf hat!
Naheliegendster Weg uneingeschaenkte root Rechte zu erhalten:
- su -
- Nachteile:
- 1. Saemtliche root Rechte werden erhalten
- 2. root Passwort wird benoetigt
- 3. Keine Kontrolle moeglich welcher User root Rechte erlangt hat
- Vorteile:
- 1. Schnell ausfuehrbar
Wie kann man ein Befehl als ein anderer User ausfuehren? Code:
/etc/sudoers: hugo ALL = (fritz) /usr/local/bin/Befehl
Aufruf von hugo: sudo -u fritz /usr/local/bin/Befehl oder
sudo -u fritz Befehl
hugo wird nach seinem Passwort gefragt und kann dann den Befehl ausfuehren.
Wie kann man die Passwortabfrage bei sudo abstellen?
Code:
/etc/sudoers: hugo ALL = (fritz) NOPASSWD: /usr/local/bin/Befehl
Das ist aber nicht ungefaehrlich: Wenn jemand seinen Rechner verlaesst oder der Account geknackt wurde kann jeder die Befehle ohne Passwortabfrage ausfuehren. Dieses sollte also nur fuer Batchjobs etc gemacht werden.
Wie werden Parameter verboten?
Code:
/etc/sudoers: hugo ALL = (fritz) /usr/local/bin/Befehl ""
Durch Anhaengen von "" am Ende der Zeile.
Wie kann man Passwortaenderungen deligieren?
Code:
/etc/sudoers: hugo ALL = (root) /usr/bin/passwd alpha, /usr/bin/passwd beta
Damit kann hugo die Passwoerter von alpha und beta aendern. Wenn man eine Gruppe von Usern hat und deren Userids systematisch definiert sind geht es noch einfacher:
Code:
/etc/sudoers: hugo ALL = (root) /usr/bin/passwd gruppe[0-9][0-9]
erlaubt hugo, die Passwoerter aller userids der Form gruppe00, gruppe01, etc zu aendern.
Wie kann man Daemons starten und stoppen lassen?
Code:
/etc/sudoers: User_Alias SUBADMIN=hugo, fritz Cmd_Alias DAEMON=/usr/sbin/rcsquid start, /usr/sbin/rcsquid stop, /usr/sbin/rcsquid restart SUBADMIN ALL = (ALL) DAEMON
Diese Definition erlaubt hugo und fritz squid zu starten und zu stoppen.
Wie kann man einen Benutzer alle root Rechte geben mit ein paar Ausnahmen?
Hoechst unsicher und sollte nicht angewandt werden.
Ansonsten man sudo und man sudoers. Wer sich allerdings mit EBNF nicht auskennt wird etwas brauchen um die man Seiten zu verstehen.
ssh kann man auch auf localhost anwenden und dadurch gezielt usern die Ausfuehrung von root Befehlen ermoeglichen. Der Nachteil zu sudo ist, dass keine Protokollierung der ausgefuehrten Befehle stattfindet. Ausserdem muss der root login dazu in dem sshd daemon erlaubt sein was man aber immer ausschalten sollte. Deshalb sollte man in diesem Fall einen zweiten sshd daemon auf einem freien Port aufsetzen (im Beispiel 4711), der eine eigene Konfigurationsdatei hat mit:
- 1. Port 4711
- 2. PermitRootLogin without-password
- 3. PubKeyAuthentication yes
Rootlogin ohne passwort und NUR pubkey authentication
- 4. Aufnahme von from="127.0.0.1" und command="..." in authorized_keys so dass die Befehle nur vom lokalen System aufgerufen werden koennen
- 5. Kopieren der public keys der User, die Befehle per ssh ausfuehren koennen sollen in ~/root/.ssh/authorized_keys und Einschraenkung der Berechtigung mit command="/usr/sbin/rcsquid start". Dieses muss leider fuer jeden Befehl erlaubten getan werden. Alternative: s.u. Keine Zeile ohne command in authorized_keys stellen denn sonst hat der user uneingeschraenkten root Zugriff!
- 6. Schutz des sshd ports 4711 mit iptables vor externem Zugriff
- 7. Ein kurzes Script erstellen, mit dem man einfach die Befehler per local ssh aufrufen kann
Code:
ssh -p 4711 -l root localhost $@
Beispiel ~/root/.ssh/authorized_keys:
command="/usr/sbin/rcsquid start" ssh-rsa AAAAB3NzaC1 ....
Wie mehrere Befehle einfacher zulassen?
Ein Script erstellen, welches in einem Switch die Befehle enthaelt, die ausgefuehrt werden duerfen. Dieses Script (z.B. /usr/local/sbin/ssh-for-hugo) in die authorized_keys aufnehmen, also
command="/usr/local/sbin/ssh-for-hugo $SSH_ORIGINAL_COMMAND" ssh-rsa AAAAB3NzaC1 ....
Das Script sieht dann etwa so aus: Code:
case "$1" in rcsquid-start) /usr/sbin/rcsquid start ;; rcsquid-stop) /usr/sbin/rcsquid stop ;; rcsquid-restart) /usr/sbin/rcsquid restart ;; *) echo "Illegal request rejected" 1>&2 exit 1 ;; esac
Weitere Informationen zu sudo:
Sudo Main Page (Englisch)
... und natuerlich man sudo
Als Vorlage zu diesem Thema diente http://www.framp.de/linux/?Security:Kontrolliertes_Ausfuehren_von_root_Programmen_von_normalen_User
eingefügt von --Yehudi 23:13, 30. Aug 2006 (CEST)