Kontrolliertes Ausfuehren von Befehlen als root: Unterschied zwischen den Versionen
Framp (Diskussion | Beiträge) |
Robi (Diskussion | Beiträge) (Teilweise neu überarbeitet) |
||
Zeile 1: | Zeile 1: | ||
Autor: [[Benutzer:framp|framp]] | Autor: [[Benutzer:framp|framp]] | ||
− | Den Benutzer root sollte man nur benutzen, wenn | + | Den Benutzer '''root''' sollte man nur dann benutzen, wenn administrative Dinge auf einem Linux Rechner zu tun sind. Ansonsten sollte man immer als normaler User arbeiten. Als root darf man eben alles - und kann sich so auch unbeabsichtigt sein System zerstören. Ein einziger fehlerhafter oder unüberlegter Befehl, (als User würde er nur einen begrenzten Schaden an den Dateien dieses Users anrichte können) als root abgesetzt, könnte das gesamte System so irreparabel beschädigen, das es nur aus einem Backup oder durch Neuinstallation wieder zu reparieren ist. |
− | + | Die selbe Regel gilt natürlich auch unter Windows und alle anderen Betriebssystemen, wo man für normale "Arbeit" tunlichst nicht mit Administrator-Kennung angemeldet sein sollte. | |
− | |||
− | |||
− | |||
− | + | == Möglichkeiten von Linux Befehle unter andere Userkennung auszuführen == | |
− | + | Normalerweise benutzt man bei Linux und anderen UNIXartigen Betriebssystemen dazu '''[http://www.phpman.info/index.php/man/su/1 su -]'''(eng. '''s'''ubstitute '''u'''ser) und erhält damit root Rechte und kann dann auf dem System alles machen, was das Herz begehrt, oder besser, alles was die Administration fordert. Dieses sollte man aber nur bei Administrationaufgaben machen. Für regelmäßige Befehle, die als root abgegeben werden müssen, oder besonders für Aufgaben die anderen Usern überantwortet werden, für die man jedoch Rootrechte benötigt, sind andere Methoden zu bevorzugen: | |
− | + | # die Benutzung von '''[http://www.phpman.info/index.php?parameter=sudo&mode=man sudo]''' | |
+ | # [http://www.phpman.info/index.php?parameter=ssh&mode=man ssh] auf '''localhost''' und [[Einrichten von public keys mit ssh|Benutzung von shared keys]] | ||
− | |||
− | |||
− | |||
− | |||
− | + | === der Befehl su === | |
− | + | '''su''' dieser Befehl erlaubt es eine Shell mit der Userkennung eines anderen Users zu starten. Wird er mit einer der Optionen '''-, -l, --login''' gestartet, wir die eine Loginshell gestartet, das bedeutet es wird die komplette Konfiguration wie für ein neues Anmelden dieses Users durchlaufen. | |
+ | Wird kein User angegeben, dann wird der User root angenommen. | ||
+ | su # startet neue Shell als User root, ohne komplettes Login als '''root''' | ||
+ | su - # startet neue Shell als User root mit komplettem Login als '''root''' | ||
+ | su - user1 # startet neue Shell als User user1 mit kompletter Login als '''user1''' | ||
+ | Wird '''su''' als normaler User gestartet, dann wird dabei das Passwort des neuen Users benötigt. Wird '''su''' als root gestartet, erfolgt keine Passwortabfrage. | ||
+ | |||
+ | '''Nachteile:''' | ||
+ | # Sämtliche root Rechte werden erhalten | ||
+ | # root Passwort wird benötigt | ||
+ | # Keine Kontrolle möglich, welcher User root Rechte erlangt hat | ||
− | + | '''Vorteile:''' | |
+ | # Schnell ausführbar | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | === der Befehl sudo === | ||
+ | '''sudo''' ist ein Standard bei Linux, mit dem kontrolliert Programmausführungberechtigungen an normale User vergeben werden können. Das können z.B. bestimmte Befehle sein, die dieser User häufiger benötigt, wie z.B. das Starten und stoppen 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. | ||
+ | Die Konfiguration erfolgt über eine Konfigurationsdatei [http://www.phpman.info/index.php/man/sudoers/5 '''/etc/sudoers''']. Dort kann genau definiert werden wer was als root oder anderer User ausführen darf, auch sind Anpassungen für die Shellkonfiguration für diese Befehle möglich. Für die Änderungen der Konfiguration gibt es ein spezielles Programm [http://www.phpman.info/index.php/man/visudo/8 '''visudo''']. Dieses Programm verhindert grobe Fehler innerhalb der /etc/sudoers. | ||
− | + | '''Folgende Sicherheitsregeln unbedingt beachten''' | |
− | + | # Zentrale Konfigurationsdatei von sudo ist /etc/sudoers immer mit visudo editieren! | |
− | + | # Nie su, sudo, visudo oder eine shell oder Programme mit escape Möglichkeiten per sudo freigeben! | |
+ | # Sehr genau auf die Parameter von den Befehlen aufpassen. Ansonsten kann ein simples [http://www.phpman.info/index.php?parameter=cat&mode=man cat] oder [http://www.phpman.info/index.php?parameter=chmod&mode=man chmod] ein Sicherheitsloch ins System reissen! | ||
+ | # Niemals ein Programm per sudo für einen User aufrufbar machen, wenn er Schreibzugriff darauf hat! | ||
− | |||
− | |||
− | |||
− | + | == Beispiele == | |
− | |||
− | Wie kann man ein Befehl als ein anderer User | + | === Wie kann man ein Befehl als ein anderer User ausführen === |
− | + | Eintrag in der '''/etc/sudoers:''' | |
− | |||
hugo ALL = (fritz) /usr/local/bin/Befehl | hugo ALL = (fritz) /usr/local/bin/Befehl | ||
− | + | Aufruf von hugo: | |
− | Aufruf von hugo: sudo -u fritz /usr/local/bin/Befehl oder | + | sudo -u fritz /usr/local/bin/Befehl oder |
sudo -u fritz Befehl | sudo -u fritz Befehl | ||
+ | hugo wird nach seinem Passwort gefragt und kann dann den Befehl ausführen. | ||
− | + | === Wie kann man die Passwortabfrage bei sudo abstellen === | |
− | + | Eintrag in der '''/etc/sudoers:''' | |
− | Wie kann man die Passwortabfrage bei sudo abstellen | ||
− | |||
− | |||
− | |||
hugo ALL = (fritz) NOPASSWD: /usr/local/bin/Befehl | hugo ALL = (fritz) NOPASSWD: /usr/local/bin/Befehl | ||
+ | '''Bemerkung''' | ||
+ | ''Das ist aber nicht ungefährlich: Wenn '''hugo''' den Rechner verlässt ohne sich abzumelden, oder der Account von '''hugo''' geknackt wird, könnte jeder den Befehl jetzt ohne Passwortabfrage ausführen. Dieses sollte also nur für Batchjobs etc. gemacht werden. | ||
− | + | === Wie werden Parameter verboten === | |
− | + | Eintrag in der '''/etc/sudoers:''' | |
− | Wie werden Parameter verboten | ||
− | |||
− | |||
− | |||
hugo ALL = (fritz) /usr/local/bin/Befehl "" | hugo ALL = (fritz) /usr/local/bin/Befehl "" | ||
+ | Durch Anhängen von "" am Ende der Zeile ist es jetzt nicht mehr möglich, dem Befehl noch irgendwelche Parameter hinzuzufügen. | ||
− | + | === Wie kann man Passwortänderungen deligieren === | |
− | + | Eintrag in der '''/etc/sudoers:''' | |
− | |||
− | Wie kann man | ||
− | |||
− | |||
− | |||
hugo ALL = (root) /usr/bin/passwd alpha, /usr/bin/passwd beta | hugo ALL = (root) /usr/bin/passwd alpha, /usr/bin/passwd beta | ||
+ | Damit kann jetzt hugo die Passwörter von alpha und beta ändern. Wenn man eine Gruppe von Usern hat und deren UserIDs systematisch definiert sind, geht es noch einfacher: | ||
− | + | Eintrag in der '''/etc/sudoers:''' | |
− | |||
− | |||
− | |||
− | |||
hugo ALL = (root) /usr/bin/passwd gruppe[0-9][0-9] | hugo ALL = (root) /usr/bin/passwd gruppe[0-9][0-9] | ||
+ | erlaubt hugo, die Passwoerter aller userIDs der Form gruppe00, gruppe01, etc zu ändern. | ||
− | + | === Wie kann man Daemons starten und stoppen lassen === | |
− | + | Eintrag in der '''/etc/sudoers:''' | |
− | |||
− | Wie kann man Daemons starten und stoppen lassen | ||
− | |||
− | |||
− | |||
User_Alias SUBADMIN=hugo, fritz | User_Alias SUBADMIN=hugo, fritz | ||
Cmd_Alias DAEMON=/usr/sbin/rcsquid start, | Cmd_Alias DAEMON=/usr/sbin/rcsquid start, | ||
Zeile 101: | Zeile 84: | ||
/usr/sbin/rcsquid restart | /usr/sbin/rcsquid restart | ||
SUBADMIN ALL = (ALL) DAEMON | SUBADMIN ALL = (ALL) DAEMON | ||
+ | Diese Definition erlaubt hugo und fritz squid zu starten und zu stoppen. | ||
− | |||
− | |||
− | |||
− | + | === Über ssh einen Benutzer alle root Rechte geben, jedoch mit ein paar Ausnahmen === | |
+ | '''Bemerkung:''' Diese Methode ist höchst unsicher und sollte nur beschränkt angewandt werden. | ||
− | + | [http://www.phpman.info/index.php?parameter=ssh&mode=man '''ssh'''] kann man auch auf '''localhost''' anwenden und dadurch gezielt Usern die Ausführung von root Befehlen ermöglichen. Der Nachteil gegenüber sudo ist, dass keine Protokollierung der ausgeführten Befehle stattfindet. Ausserdem muss der root login dazu in dem [http://www.phpman.info/index.php?parameter=sshd&mode=man '''sshd daemon'''] erlaubt sein, was jeodch im Normalfall ausgeschalt sein sollte. Deshalb sollte man in diesem Fall einen zweiten '''sshd daemon''' auf einem freien Port aufsetzen (im Beispiel 4711), der dann seine eigene Konfigurationsdatei hat mit: | |
− | + | {{Überarbeiten}}--[[Benutzer:Robi|Robi]] 02:05, 29. Okt 2006 (CEST) | |
+ | das hier muss noch mal mit Vergleich des Orginalbeitrages überprüft werden | ||
*1. Port 4711 | *1. Port 4711 | ||
Zeile 122: | Zeile 105: | ||
*7. Ein kurzes Script erstellen, mit dem man einfach die Befehler per local ssh aufrufen kann | *7. Ein kurzes Script erstellen, mit dem man einfach die Befehler per local ssh aufrufen kann | ||
− | + | ||
ssh -p 4711 -l root localhost $@ | ssh -p 4711 -l root localhost $@ | ||
Zeile 155: | Zeile 138: | ||
− | |||
− | |||
− | |||
− | |||
Als Vorlage zu diesem Thema diente http://www.framp.de/linux/?Security:Kontrolliertes_Ausfuehren_von_root_Programmen_von_normalen_User | Als Vorlage zu diesem Thema diente http://www.framp.de/linux/?Security:Kontrolliertes_Ausfuehren_von_root_Programmen_von_normalen_User | ||
− | eingefügt von --[[Benutzer:Yehudi|Yehudi]] 23:13, 30. Aug 2006 (CEST) | + | * eingefügt von --[[Benutzer:Yehudi|Yehudi]] 23:13, 30. Aug 2006 (CEST) |
+ | * überarbeitet [[Benutzer:Robi|Robi]] 02:05, 29. Okt 2006 (CEST) letzter Abschnitt noch offen | ||
[[Category:Security]] | [[Category:Security]] |
Version vom 29. Oktober 2006, 00:05 Uhr
Autor: framp
Den Benutzer root sollte man nur dann benutzen, wenn administrative Dinge auf einem Linux Rechner zu tun sind. Ansonsten sollte man immer als normaler User arbeiten. Als root darf man eben alles - und kann sich so auch unbeabsichtigt sein System zerstören. Ein einziger fehlerhafter oder unüberlegter Befehl, (als User würde er nur einen begrenzten Schaden an den Dateien dieses Users anrichte können) als root abgesetzt, könnte das gesamte System so irreparabel beschädigen, das es nur aus einem Backup oder durch Neuinstallation wieder zu reparieren ist.
Die selbe Regel gilt natürlich auch unter Windows und alle anderen Betriebssystemen, wo man für normale "Arbeit" tunlichst nicht mit Administrator-Kennung angemeldet sein sollte.
Inhaltsverzeichnis
- 1 Möglichkeiten von Linux Befehle unter andere Userkennung auszuführen
- 2 Beispiele
- 2.1 Wie kann man ein Befehl als ein anderer User ausführen
- 2.2 Wie kann man die Passwortabfrage bei sudo abstellen
- 2.3 Wie werden Parameter verboten
- 2.4 Wie kann man Passwortänderungen deligieren
- 2.5 Wie kann man Daemons starten und stoppen lassen
- 2.6 Über ssh einen Benutzer alle root Rechte geben, jedoch mit ein paar Ausnahmen
Möglichkeiten von Linux Befehle unter andere Userkennung auszuführen
Normalerweise benutzt man bei Linux und anderen UNIXartigen Betriebssystemen dazu su -(eng. substitute user) und erhält damit root Rechte und kann dann auf dem System alles machen, was das Herz begehrt, oder besser, alles was die Administration fordert. Dieses sollte man aber nur bei Administrationaufgaben machen. Für regelmäßige Befehle, die als root abgegeben werden müssen, oder besonders für Aufgaben die anderen Usern überantwortet werden, für die man jedoch Rootrechte benötigt, sind andere Methoden zu bevorzugen:
- die Benutzung von sudo
- ssh auf localhost und Benutzung von shared keys
der Befehl su
su dieser Befehl erlaubt es eine Shell mit der Userkennung eines anderen Users zu starten. Wird er mit einer der Optionen -, -l, --login gestartet, wir die eine Loginshell gestartet, das bedeutet es wird die komplette Konfiguration wie für ein neues Anmelden dieses Users durchlaufen. Wird kein User angegeben, dann wird der User root angenommen.
su # startet neue Shell als User root, ohne komplettes Login als root su - # startet neue Shell als User root mit komplettem Login als root su - user1 # startet neue Shell als User user1 mit kompletter Login als user1
Wird su als normaler User gestartet, dann wird dabei das Passwort des neuen Users benötigt. Wird su als root gestartet, erfolgt keine Passwortabfrage.
Nachteile:
- Sämtliche root Rechte werden erhalten
- root Passwort wird benötigt
- Keine Kontrolle möglich, welcher User root Rechte erlangt hat
Vorteile:
- Schnell ausführbar
der Befehl sudo
sudo ist ein Standard bei Linux, mit dem kontrolliert Programmausführungberechtigungen an normale User vergeben werden können. Das können z.B. bestimmte Befehle sein, die dieser User häufiger benötigt, wie z.B. das Starten und stoppen 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. Die Konfiguration erfolgt über eine Konfigurationsdatei /etc/sudoers. Dort kann genau definiert werden wer was als root oder anderer User ausführen darf, auch sind Anpassungen für die Shellkonfiguration für diese Befehle möglich. Für die Änderungen der Konfiguration gibt es ein spezielles Programm visudo. Dieses Programm verhindert grobe Fehler innerhalb der /etc/sudoers.
Folgende Sicherheitsregeln unbedingt beachten
- Zentrale Konfigurationsdatei von sudo ist /etc/sudoers immer mit visudo editieren!
- Nie su, sudo, visudo oder eine shell oder Programme mit escape Möglichkeiten per sudo freigeben!
- Sehr genau auf die Parameter von den Befehlen aufpassen. Ansonsten kann ein simples cat oder chmod ein Sicherheitsloch ins System reissen!
- Niemals ein Programm per sudo für einen User aufrufbar machen, wenn er Schreibzugriff darauf hat!
Beispiele
Wie kann man ein Befehl als ein anderer User ausführen
Eintrag in der /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 ausführen.
Wie kann man die Passwortabfrage bei sudo abstellen
Eintrag in der /etc/sudoers:
hugo ALL = (fritz) NOPASSWD: /usr/local/bin/Befehl
Bemerkung Das ist aber nicht ungefährlich: Wenn hugo den Rechner verlässt ohne sich abzumelden, oder der Account von hugo geknackt wird, könnte jeder den Befehl jetzt ohne Passwortabfrage ausführen. Dieses sollte also nur für Batchjobs etc. gemacht werden.
Wie werden Parameter verboten
Eintrag in der /etc/sudoers:
hugo ALL = (fritz) /usr/local/bin/Befehl ""
Durch Anhängen von "" am Ende der Zeile ist es jetzt nicht mehr möglich, dem Befehl noch irgendwelche Parameter hinzuzufügen.
Wie kann man Passwortänderungen deligieren
Eintrag in der /etc/sudoers:
hugo ALL = (root) /usr/bin/passwd alpha, /usr/bin/passwd beta
Damit kann jetzt hugo die Passwörter von alpha und beta ändern. Wenn man eine Gruppe von Usern hat und deren UserIDs systematisch definiert sind, geht es noch einfacher:
Eintrag in der /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 ändern.
Wie kann man Daemons starten und stoppen lassen
Eintrag in der /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.
Über ssh einen Benutzer alle root Rechte geben, jedoch mit ein paar Ausnahmen
Bemerkung: Diese Methode ist höchst unsicher und sollte nur beschränkt angewandt werden.
ssh kann man auch auf localhost anwenden und dadurch gezielt Usern die Ausführung von root Befehlen ermöglichen. Der Nachteil gegenüber sudo ist, dass keine Protokollierung der ausgeführten Befehle stattfindet. Ausserdem muss der root login dazu in dem sshd daemon erlaubt sein, was jeodch im Normalfall ausgeschalt sein sollte. Deshalb sollte man in diesem Fall einen zweiten sshd daemon auf einem freien Port aufsetzen (im Beispiel 4711), der dann seine eigene Konfigurationsdatei hat mit:
Dieses HOWTO zu Linux oder der Abschnitt davon braucht eine Überarbeitung. Weitere Informationen findest Du hier. Deine Hilfe ist gefragt, das HOWTO zu verbessern. Danach entsorge bitte diese Signierung. |
--Robi 02:05, 29. Okt 2006 (CEST)
das hier muss noch mal mit Vergleich des Orginalbeitrages überprüft werden
- 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
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
Als Vorlage zu diesem Thema diente http://www.framp.de/linux/?Security:Kontrolliertes_Ausfuehren_von_root_Programmen_von_normalen_User