Kontrolliertes Ausfuehren von Befehlen als root: Unterschied zwischen den Versionen

Aus Linupedia.org
Wechseln zu: Navigation, Suche
 
(23 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
 
Autor: [[Benutzer:framp|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 dann benutzen, wenn administrative Dinge auf einem Linux Rechner zu tun sind.( siehe auch [[Permanent root sein]] ) 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.  
  
Beispiel:
+
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.
Es kommt immer wieder mal vor dass in chats ein Linux Anfaenger aufgefordert wird
 
Code:
 
rm -rf /
 
  
oder verklausuliert
+
== Möglichkeiten von Linux Befehle unter andere Userkennung auszuführen ==
  
echo "rpm -qai && rm -rf /" >> /rebuild_rpm.sh && sh /rebuild_rpm.sh
+
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:
  
einzugeben.
+
# 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]]
  
<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
+
=== der Befehl su ===
2. ssh auf localhost und Benutzung von shared keys
+
'''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
  
Natuerlich bieten sich diese Moeglichkeiten auch an wenn man root Rechte deligieren muss oder moechte.
+
'''Vorteile:'''
 +
# Schnell ausführbar
  
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!
 
  
 +
=== 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.
  
Naheliegendster Weg uneingeschaenkte root Rechte zu erhalten:
+
'''Nachteile:'''
 +
# Genaue Konfiguration der /etc/sudoers notwendig
 +
# /etc/sudoers Konfiguration nicht ganz einfach. Bei Fehlern können Sicherheitslöcher entstehen.
  
* su -
+
'''Vorteile:'''
* Nachteile:
+
# Genaue Protokollierung wer, wann, welchen Befehl als root abgesetzt hat
 +
# Man kann jeden Benutzer oder auch Gruppen autorisieren root befehle abzusetzen
 +
# Das root Passwort muß wirklich nur der Sysadmin bzw Stellvertreter kennen.
  
*1. Saemtliche root Rechte werden erhalten
+
'''Folgende Sicherheitsregeln unbedingt beachten'''
*2. root Passwort wird benoetigt
 
*3. Keine Kontrolle moeglich welcher User root Rechte erlangt hat
 
  
* Vorteile:
+
# Zentrale Konfigurationsdatei von sudo ist /etc/sudoers immer mit visudo editieren!
*1. Schnell ausfuehrbar
+
# Nie su, sudo, visudo oder eine shell oder Programme mit escape Möglichkeiten per sudo freigeben, denn dann hat der Benutzer volle root Rechte! Was ist eine '''escape Möglichkeit'''? Wenn ein Programm erlaubt in eine shell Umgebung zu kommen.
 +
# 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!
  
Wie kann man ein Befehl als ein anderer User ausfuehren?
+
==== Beispiele ====
Code:
+
 
/etc/sudoers:
+
===== 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.
  
hugo wird nach seinem Passwort gefragt und kann dann den Befehl ausfuehren.
+
===== Wie kann man die Passwortabfrage bei sudo abstellen =====
 
+
Eintrag in der '''/etc/sudoers:'''
Wie kann man die Passwortabfrage bei sudo abstellen?
 
 
 
Code:
 
/etc/sudoers:
 
 
  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.
  
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 =====
 
+
Eintrag in der '''/etc/sudoers:'''
Wie werden Parameter verboten?
 
 
 
Code:
 
/etc/sudoers:
 
 
  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 =====
Durch Anhaengen von "" am Ende der Zeile.
+
Eintrag in der '''/etc/sudoers:'''
 
 
Wie kann man Passwortaenderungen deligieren?
 
 
 
Code:
 
/etc/sudoers:
 
 
  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:'''
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]
 
  hugo  ALL = (root) /usr/bin/passwd gruppe[0-9][0-9]
 +
erlaubt hugo, die Passwörter aller userIDs der Form gruppe00, gruppe01, etc zu ändern.
  
 
+
===== Wie kann man Daemons starten und stoppen lassen =====
erlaubt hugo, die Passwoerter aller userids der Form gruppe00, gruppe01, etc zu aendern.
+
Eintrag in der '''/etc/sudoers:'''
 
 
Wie kann man Daemons starten und stoppen lassen?
 
 
 
Code:
 
/etc/sudoers:
 
 
  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 92:
 
                     /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.
 
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?
+
=== mittels zweitem ssh Daemon die Erteilung von root Rechten erlauben ===
 +
[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. Außerdem muss der root login dazu in dem [http://www.phpman.info/index.php?parameter=sshd&mode=man '''sshd daemon'''] erlaubt sein, was jedoch im Normalfall ausgeschaltet sein sollte. Deshalb sollte man diese dann nicht über den normalen ssh-Dienst laufen lassen, sondern extra dafür  [http://www.linux.framp.de/index.php/content/view/41/ einen zweiten '''sshd daemon'''] auf einem freien Port aufsetzen (im Beispiel 4711), der dann seine eigene Konfigurationsdatei abgestimmt auf diese Funktion bekommt:
  
Hoechst unsicher und sollte nicht angewandt werden.
+
'''Konfiguration für einen extra ssh-Dienst zur Erteilung von Rootrechten:'''
 
+
# '''Port 4711''
Ansonsten man sudo und man sudoers. Wer sich allerdings mit EBNF nicht auskennt wird etwas brauchen um die man Seiten zu verstehen.
+
# '''PermitRootLogin without-password'''
 
+
# '''PubKeyAuthentication yes'''
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:
+
#: ''Rootlogin ohne passwort und NUR pubkey authentication''
 
+
# Aufnahme von '''from="127.0.0.1"''' und '''command="..."''' in authorized_keys so dass die Befehle nur vom lokalen System aufgerufen werden können
*1. Port 4711
+
# Kopieren der public keys der User, die Befehle per ssh ausführen können sollen in ~/root/.ssh/authorized_keys und Einschränkung der Berechtigung mit
*2. PermitRootLogin without-password
+
#: '''command="/usr/sbin/rcsquid start"'''. Dieses muss leider für jeden Befehl erlaubten getan werden.  
*3. PubKeyAuthentication yes
+
#:: '''Alternative:''' (siehe weiter unten)
Rootlogin ohne passwort und NUR pubkey authentication
+
#:: '''Wichtig:''' Keine Zeile ohne command in authorized_keys stellen denn sonst hat der user uneingeschränkten root Zugriff!
*4. Aufnahme von from="127.0.0.1" und command="..." in authorized_keys so dass die Befehle nur vom lokalen System aufgerufen werden koennen
+
# Schutz des sshd ports 4711 mit [http://www.pl-forum.de/t_netzwerk/iptables.html '''iptables'''] vor externem Zugriff
*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!
+
# Ein kurzes Script erstellen, mit dem man einfach die Befehle per local ssh aufrufen kann
*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 $@
 
  ssh -p 4711 -l root localhost $@
  
  
Beispiel ~/root/.ssh/authorized_keys:
 
  
 +
'''Beispiel: ~/root/.ssh/authorized_keys:'''
 
  command="/usr/sbin/rcsquid start" ssh-rsa AAAAB3NzaC1 ....
 
  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
 
  
 +
'''Wie mehrere Befehle einfacher zulassen?'''
 +
 +
Ein Script erstellen, welches in einem Switch die Befehle enthält, die ausgeführt werden dürfen. 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 ....
 
  command="/usr/local/sbin/ssh-for-hugo $SSH_ORIGINAL_COMMAND" ssh-rsa AAAAB3NzaC1 ....
  
 
Das Script sieht dann etwa so aus:
 
Das Script sieht dann etwa so aus:
Code:
+
<pre>
 
  case "$1" in
 
  case "$1" in
 
     rcsquid-start)
 
     rcsquid-start)
Zeile 153: Zeile 140:
 
     ;;
 
     ;;
 
  esac
 
  esac
 +
</pre>
  
 +
== Wie kann man einem Benutzer alle root Rechte mit ein paar Ausnahmen geben? ==
  
Weitere Informationen zu sudo:
+
Höchst unsicher und sollte nicht angewandt werden. Man sollte immer explizit erlauben was ausgeführt werden darf und '''nicht was nicht ausgeführt werden darf'''! Zu leicht übersieht man einen kritischen Befehl oder Parameter oder es wird ein neuer kritischer Parameter mit einer neuen Programmversion eingeführt.
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
+
== Quellen ==
  
eingefügt von --[[Benutzer:Yehudi|Yehudi]] 23:13, 30. Aug 2006 (CEST)
+
Als Vorlage zu diesem Thema diente [http://www.linux-tips-and-tricks.de/index.php/Security/sudo.html Kontrolliertes Ausführen von Programmen mit Rootkennung]  
  
 
[[Category:Security]]
 
[[Category:Security]]

Aktuelle Version vom 7. Dezember 2009, 12:46 Uhr

Autor: framp

Den Benutzer root sollte man nur dann benutzen, wenn administrative Dinge auf einem Linux Rechner zu tun sind.( siehe auch Permanent root sein ) 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 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:

  1. die Benutzung von sudo
  2. 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:

  1. Sämtliche root Rechte werden erhalten
  2. root Passwort wird benötigt
  3. Keine Kontrolle möglich, welcher User root Rechte erlangt hat

Vorteile:

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

Nachteile:

  1. Genaue Konfiguration der /etc/sudoers notwendig
  2. /etc/sudoers Konfiguration nicht ganz einfach. Bei Fehlern können Sicherheitslöcher entstehen.

Vorteile:

  1. Genaue Protokollierung wer, wann, welchen Befehl als root abgesetzt hat
  2. Man kann jeden Benutzer oder auch Gruppen autorisieren root befehle abzusetzen
  3. Das root Passwort muß wirklich nur der Sysadmin bzw Stellvertreter kennen.

Folgende Sicherheitsregeln 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 Möglichkeiten per sudo freigeben, denn dann hat der Benutzer volle root Rechte! Was ist eine escape Möglichkeit? Wenn ein Programm erlaubt in eine shell Umgebung zu kommen.
  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 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 Passwörter 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.

mittels zweitem ssh Daemon die Erteilung von root Rechten erlauben

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. Außerdem muss der root login dazu in dem sshd daemon erlaubt sein, was jedoch im Normalfall ausgeschaltet sein sollte. Deshalb sollte man diese dann nicht über den normalen ssh-Dienst laufen lassen, sondern extra dafür einen zweiten sshd daemon auf einem freien Port aufsetzen (im Beispiel 4711), der dann seine eigene Konfigurationsdatei abgestimmt auf diese Funktion bekommt:

Konfiguration für einen extra ssh-Dienst zur Erteilung von Rootrechten:

  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 können
  5. Kopieren der public keys der User, die Befehle per ssh ausführen können sollen in ~/root/.ssh/authorized_keys und Einschränkung der Berechtigung mit
    command="/usr/sbin/rcsquid start". Dieses muss leider für jeden Befehl erlaubten getan werden.
    Alternative: (siehe weiter unten)
    Wichtig: Keine Zeile ohne command in authorized_keys stellen denn sonst hat der user uneingeschränkten root Zugriff!
  6. Schutz des sshd ports 4711 mit iptables vor externem Zugriff
  7. Ein kurzes Script erstellen, mit dem man einfach die Befehle 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 enthält, die ausgeführt werden dürfen. 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:

 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

Wie kann man einem Benutzer alle root Rechte mit ein paar Ausnahmen geben?

Höchst unsicher und sollte nicht angewandt werden. Man sollte immer explizit erlauben was ausgeführt werden darf und nicht was nicht ausgeführt werden darf! Zu leicht übersieht man einen kritischen Befehl oder Parameter oder es wird ein neuer kritischer Parameter mit einer neuen Programmversion eingeführt.

Quellen

Als Vorlage zu diesem Thema diente Kontrolliertes Ausführen von Programmen mit Rootkennung