Superuser Access

sudo

Falls ein Benutzer etwas auf dem System ausführen muss, für das root-Rechte nötig sind, erteilt man sie ihm in einer minimalen Ausprägung per sudo (Super User Do). Der Benutzer muss dafür das root-Passwort nicht kennen.

Unter OpenBSD heisst das vergleichbare Tool „doas“ (do as).

sudo ist ein Befehl, der dazu benutzt wird, Prozesse mit den Rechten eines anderen Benutzers (z. B. des Superusers „root“) zu starten, ohne dessen Passwort kennen zu müssen (evtl. besitzt der root-User auch kein Passwort). Im Gegensatz zu dem nicht zu sudo gehörenden su ist einstellbar, welche Befehle ausgeführt werden dürfen. Der dauerhafte Wechsel der Identität ist ebenfalls möglich: Mit Eingabe von sudo -s wechselt man beispielsweise in die Root-Shell, wobei das eigene $HOME mitgenommen wird. Mit sudo -i startet man die Root-Shell mit $HOME für „root“.

sudo überschreibt aus Sicherheitsgründen PATH.

Ein Benutzer, der kurzfristig Root-Rechte zur Installation eines Programmes benötigt, stellt dem Installationsbefehl wie folgt ein sudo voran:

sudo yum -y install htop

Wird man nach einem Passwort gefragt, gibt man sein eigenes Kennwort ein, und das Kommando wird ausgeführt.

Bemerkung

Der Grund, warum man sein eigenes Passwort eingeben muss: das System möchte sicherstellen, dass wirklich der „echte“ Benutzer die ihm freigegebenen administrativen Kommandos ausführt, und nicht zufällig jemand, der am nicht-gesperrten Rechner vorbeikommt.

Der Befehl ist vergleichbar mit Run as Administrator in Windows. Im Gegensatz dazu muss sudo aber wie erwähnt konfiguriert werden, was mit Hilfe des Befehls visudo in der Datei /etc/sudoers durch root erfolgt (siehe weiter unten): dort gibt man an, welche Kommandos durch welchen Benutzer/Gruppe in welcher Form ausgeführt werden dürfen, und ob z.B. eine Passwort-Abfrage nötig ist oder nicht.

Per sudo ausgeführte Befehle werden in /var/log/secure protokolliert. Versucht ein Benutzer Befehle per sudo auszuführen, für die er nicht berechtigt ist, wird dies wie folgt festgehalten:

sudo: linus : user NOT in sudoers ; TTY=pts/0 ;
    PWD=/home/linus ; USER=root ;
    COMMAND=/bin/nano /etc/groups

Vom Standard-Benutzer zum root-Benutzer, und dessen Shell (in der Regel Bash) ausführen:

sudo --login
sudo -i

Einfach nur die Shell mit Root-Rechten starten:

sudo --shell
sudo -s

Alternativ vor allen Kommandos, die administrativen Zugriff erfordern, „sudo“ voranstellen.

sudo für einen bestimmten Benutzernamen oder User-ID:

sudo --user linus bash
sudo -u linus bash
sudo -u#1000 bash
sudo --group root bash

visudo und /etc/sudoers

Das Schema in /etc/sudoers lautet immer:

who where = (whoelse) what

Auszug aus einer /etc/sudoers:

C1      C2     C3       C4
root    ALL = (ALL)     ALL
%sales  ALL = (ALL:ALL) ALL
linus   ALL = (ALL)     NOPASSWD: /usr/bin/tail -f /var/log/messages

Die Spalten bedeuten:

C1

Benutzer oder Gruppe (mit vorangestelltem Prozentzeichen), für welchen die Regel gilt.

C2

Hostname oder Netzwerk-Adresse, von dem aus gesehen diese Regel gilt. Wichtig: wer hier mit „localhost“ oder „127.0.0.1“ arbeiten möchte, wird scheitern. Dazu sagt die Manpage: Note that sudo only inspects actual network interfaces; this means that IP address 127.0.0.1 (localhost) will never match. Also, the host name „localhost“ will only match if that is the actual host name, which is usually only the case for non-networked systems. Hier arbeitet man also am besten mit ALL.

C3

Benutzer:Gruppe, unter dem das Kommando ausgeführt werden darf (sudo --user und sudo --group).

C4

Das optionale NOPASSWD: bedeutet, dass sudo nicht das Passwort des Benutzers verlangen wird. Danach folgt die Liste der erlaubten Kommandos.

Eine simple Kommandoangabe erlaubt alle Parameter.

Ein paar Beispiele.

Mitglieder der Gruppe „admin“ dürfen überall ohne Eingabe ihres persönlichen Passworts alle Kommandos unter dem Benutzer „root“ ausführen:

%admin ALL = (root) NOPASSWD: ALL

Benutzer „linus“ darf das lokale System updaten (yum wird hier unter „root“ laufen):

linus ALL = (root) /usr/bin/yum update, /usr/bin/yum upgrade

Mitglieder der Gruppe „users“ dürfen das System neu starten:

%users ALL = /usr/bin/systemctl reboot

Hier darf der Benutzer „linus“ den BIND Nameserver mit dem Aufruf sudo --user named /usr/sbin/named starten:

linus ALL = (named) /usr/sbin/named

Berechtigungen für eigene Benutzer und Gruppen sollten immer unter /etc/sudoers.d abgelegt werden, was zum Beispiel mit visudo -f /etc/sudoers.d/user-linus oder visudo -f /etc/sudoers.d/group-sales gelingt. Der Name der Dateien spielt zwar keine Rolle, sollte sich aber am Benutzer- oder Gruppennamen orientieren.

Der selbstgewählte Dateiname unter /etc/sudoers.d darf keinen Punkt (.) beinhalten und/oder nicht mit einer Tilde (~) enden, da die Datei sonst nicht gelesen wird.

Warnung

Vorsicht beim Umgang mit Wildcards: man würde erwarten, dass die Anweisung linus ALL = NOPASSWD: /bin/cat /var/log/* den Zugriff auf alle Dateien in /var/log erlauben würde. Der *-Wildcard bezieht sich aus Sicht von sudo allerdings nicht auf die Dateiangabe (es verwaltet ja keine Pfade), sondern auf die Parameterauflistung. Daher gelingt dem Benutzer mit so einer Anweisung auch ein sudo cat /var/log/messages /etc/shadow.

Produktives Beispiel einer /etc/sudoers:

# Host aliases are subnets or hostnames.
Host_Alias   DMZ      = 212.118.81.40/28
Host_Alias   DESKTOP  = work1, work2

# User aliases are a list of users which can have the same rights
User_Alias   ADMINS   = colin, luca, admin
User_Alias   DEVEL    = joe, jack, julia
Runas_Alias  DBA      = oracle,pgsql

# Command aliases define the full path of a list of commands
Cmnd_Alias   SYSTEM   = /sbin/reboot,/usr/bin/kill,/sbin/halt,/sbin/shutdown,/etc/init.d/
Cmnd_Alias   PW       = /usr/bin/passwd [A-z]*, !/usr/bin/passwd root # Not root pwd!
Cmnd_Alias   DEBUG    = /usr/sbin/tcpdump,/usr/bin/wireshark,/usr/bin/nmap

# The actual rules
root,ADMINS  ALL      = (ALL) NOPASSWD: ALL    # ADMINS can do anything w/o a password.
DEVEL        DESKTOP  = (ALL) NOPASSWD: ALL    # Developers have full right on desktops
DEVEL        DMZ      = (ALL) NOPASSWD: DEBUG  # Developers can debug the DMZ servers.

# User sysadmin can mess around in the DMZ servers with some commands.
sysadmin     DMZ      = (ALL) NOPASSWD: SYSTEM,PW,DEBUG
sysadmin     ALL,!DMZ = (ALL) NOPASSWD: ALL    # Can do anything outside the DMZ.
%dba         ALL      = (DBA) ALL              # Group dba can run as database user.

# anyone can mount/unmount a cd-rom on the desktop machines
ALL          DESKTOP  = NOPASSWD: /sbin/mount /cdrom,/sbin/umount /cdrom

Probleme mit sudo? Logging aktivieren:

/etc/sssd/sssd.conf
[domain/$NAME]
debug_level = 0x3ff0

[sudo]
debug_level = 0x3ff0
systemctl restart sssd

su

Um sich dauerhaft (und nicht nur für ein Kommando) in die Shell eines anderen Benutzers einzuloggen, verwendet man su. Die Shell beendet man nach getaner Arbeit mit exit.

Als root einloggen, und die eigene Shell-Umgebung weiternutzen:

su

Als root einloggen und dessen Shell-Umgebung laden:

su -

Als Benutzer „linus“ einloggen und dessen Shell-Umgebung laden:

su - linus

Die Bash ändert in der Standardkonfiguration ihre Darstellung, je nach dem, ob man als root- oder als „normaler“ Benutzer eingeloggt ist. Eine Bash unter einem root-Benutzer wird mit „#“ gekennzeichnet; eine Bash unter einem Standard-Benutzeraccount stellt ein „$“ dar. Ungefähr so:

[linus@mypc ~] $ su -
Password: **********
[root@mypc ~] # yum -y update
[root@mypc ~] # exit
[linus@mypc ~] $

Ein Kommando unter einem anderen Benutzerkonto (hier: „username“) ausführen:

su username --command "cmd1; cmd2; cmd3; cmd4"

Wichtig: dafür wird eine Shell benötigt. Ein Eintrag in der /etc/passwd in der Form /sbin/nologin genügt nicht; als Shell muss /bin/bash o.ä. verwendet werden.

Root-Rechte erteilen

Wie erteilt man dem Benutzer „linus“ root-Rechte?

Entweder

  • fügt man den Benutzer der Gruppe der Administratoren hinzu (ab CentOS 7 besitzt die dafür vorgesehene Gruppe „wheel“ ganz UNIX-konform root-Rechte),

  • oder man geht feingranularer vor und konfiguriert den Benutzer (oder seine Gruppe) in /etc/sudoers.d (der mühsame, aber sichere und daher empfohlene Weg).

Benutzer der „wheel“-Gruppe hinzufügen.

Wheel bezeichnet einen Benutzeraccount bzw. eine Gruppe mit dem „wheel“-Bit, einer Systemeinstellung, die zusätzliche System-Privilegien erteilt und damit die Ausführung von Kommandos ermöglicht, die einem Standard-Benutzer nicht zur Verfügung stehen. „wheel“ stammt vom englischen Slang-Ausdruck für eine Person ab, die grosse Macht und Einfluss besitzt. Unter Ubuntu gibt es diese Gruppe übrigens nicht, dort wird die „sudo“-Gruppe verwendet.

Die Berechtigungen der Gruppe „wheel“ müssen unter RHEL 6 in /etc/sudoers einmalig aktiviert werden, unter RHEL 7 sind sie standardmässig aktiv. Entweder mit oder ohne Benutzer-Passwortabfrage:

EDITOR=nano visudo
...
%wheel ALL = (ALL) ALL
#%wheel ALL = (ALL) NOPASSWD: ALL

Benutzer der Gruppe „wheel“ hinzufügen:

useradd linus
usermod --append --groups wheel linus

Beispiel für „linus“:

su - linus
sudo setenforce 1
Benutzer oder dessen Gruppe in der /etc/sudoers.d konfigurieren.
EDITOR=nano visudo -f /etc/sudoers.d/linus
linus ALL = (ALL) NOPASSWD: ALL
linus ALL = (ALL) ALL
linus ALL = (root) /usr/bin/yum update
linus ALL = (named) /usr/sbin/named
linus ....

Beispiel für „linus“:

su - linus
sudo yum list
sudo yum update

„sudo -i“ vs. „sudo su“

sudo -i vs su - etc. - alle Varianten wechseln in root-Account, aber wo sind die Unterschiede?

Generell gilt: sudo ist das modernere su.

Befehl

Passwort benötigt von

Shell-Einstellungen (z.B. $PATH)

Hinweis

su

root

aktueller Benutzer

su -

root

von root

normaler root-Login „from Scratch“

sudo su

aktueller Benutzer

keine

su ignoriert die von sudo vorgenommenen Einstellungen, übernimmt daher nicht die Einstellungen des Benutzers, führt aber auch keine Shell-Befehle beim root-Login aus.

sudo su -

aktueller Benutzer

root

su - ignoriert die von sudo vorgenommenen Einstellungen und verhält sich exakt wie ein normaler root-Login.

sudo -s

aktueller Benutzer

aktueller Benutzer

sudo -i

aktueller Benutzer

aktueller Benutzer

Setzt in der Standardkonfiguration beispielsweise die $PATH-Umgebungsvariable geringfügig anders.

Damit sudo -i sich wie sudo su - verhält, muss die /etc/sudoers angepasst werden

/etc/sudoers
# deactivate this:
#Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin

# add this:
Defaults secure_path = /usr/local/bin:/usr/bin
Defaults >root secure_path = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin

Tipp

sudo su - bietet im Standard etwas mehr angepasste Umgebungsvariablen als sudo -i, und ist daher theoretisch zu bevorzugen - auf den allermeisten Systemen spielt es aber keine Rolle, was von beiden verwendet wird.

Built on 2022-06-03