Superuser Access
Siehe auch
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
undsudo --group
).- C4
Das optionale
NOPASSWD:
bedeutet, dasssudo
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 = 1.2.3.4/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:
[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 den root-Account, aber wo sind die Unterschiede?
Generell gilt: sudo
ist das modernere su
.
Befehl |
Passwort benötigt von |
Shell-Einstellungen (z.B. |
Hinweis |
|
root |
aktueller Benutzer |
|
|
root |
von root |
normaler root-Login „from Scratch“ |
|
aktueller Benutzer |
keine |
|
|
aktueller Benutzer |
root |
|
|
aktueller Benutzer |
aktueller Benutzer |
|
|
aktueller Benutzer |
aktueller Benutzer |
Setzt in der Standardkonfiguration beispielsweise die |
Damit sudo -i
sich wie sudo su -
verhält, muss die /etc/sudoers
angepasst werden
# 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 unter RHEL etwas mehr angepasste Umgebungsvariablen als sudo -i
(z.B. ist /usr/local/bin
im Pfad enthalten).
Built on 2024-11-18