sudo (superuser do) zažene en ukaz v imenu drugega uporabnika, običajno uporabnika root. Tako lahko na strežniku delaš z lastnim uporabnikom z omejenimi pravicami in si pravice povišaš le za korake, pri katerih jih res potrebuješ. Vsak ukaz, zagnan s sudo, se zabeleži v dnevnik, zato je tudi pozneje mogoče ugotoviti, kdo je kaj naredil.
Kako ustvariš uporabnika in mu dodeliš pravice sudo, opisuje članek Ustvarjanje uporabnika in dodelitev pravic sudo v Linuxu. Ta članek prikazuje uporabo ukaza. Primere smo preizkusili v sistemu AlmaLinux 10.2, z različico sudo 1.9.17, z uporabnikom z imenom fejleszto, ki spada v skupino wheel. Od Ubuntu 26.04 za ukazom sudo stoji v Rustu na novo napisani sudo-rs (prva vrstica sudo -V: sudo-rs …); tu opisana osnovna uporaba je enaka, nekatera redko uporabljana stikala in nastavitve sudoers pa morda manjkajo.
Prva uporaba
sudo whoami
Ob prvi uporabi sudo izpiše kratko opozorilo, nato zahteva tvoje lastno geslo (ne gesla uporabnika root):
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
For security reasons, the password you type will not be visible.
[sudo] password for fejleszto:
Med tipkanjem se geslo ne prikazuje, niti z zvezdicami. Če se zatipkaš, ga sudo s sporočilom „Sorry, try again.” zahteva znova; po treh napakah konča. Pri pravilnem geslu se ukaz izvede, izpis je root.
Predpomnilnik gesla
Po uspešnem vnosu gesla sudo pet minut v istem terminalu ne zahteva gesla znova (Authentication timestamp timeout: 5.0 minutes). To lahko upravljaš:
sudo -v # vnos gesla vnaprej ali podaljšanje petih minut
sudo -k # takojšnje brisanje predpomnilnika: naslednji sudo znova zahteva geslo
sudo -K # enako za vse terminale
S stikalom -n (non-interactive) sudo gesla ne vpraša, temveč konča z napako, če bi ga moral: „sudo: a password is required”. V skriptu se tako izogneš temu, da bi se izvajanje ustavilo pri zahtevi za geslo.
V skriptu je dobro tudi vnaprej preveriti, ali uporabnik sme zagnati določen ukaz. Za to je sudo -n -l, s celotno potjo ukaza:
sudo -n -l /usr/bin/systemctl restart nginx && sudo -n /usr/bin/systemctl restart nginx
-l tu ničesar ne zažene: če pravilo ukaz dovoljuje, ga izpiše in konča z 0, če ne, z 1. V preizkusu je pri uporabniku, ki je smel le znova zagnati Nginx, sudo -n -l … restart nginx vrnil 0, … stop nginx pa 1, pogosto videni preizkus sudo -n true pa je vrnil napako, čeprav je bil ponovni zagon dovoljen. Zgodi se lahko tudi obratno: -l gleda le pravilo, zato tudi pri ukazu, dovoljenem z geslom, vrne 0, dejanski zagon sudo -n pa bi vseeno zahteval geslo.
Gesla sudo ne podajaj po cevovodu (echo jelszo | sudo -S …): lahko pride v zgodovino ukazov in na seznam procesov. Za avtomatizacijo uporabi ozko pravilo brez gesla (glej spodaj).
Najpogostejša stikala
| Ukaz | Kaj naredi |
|---|---|
sudo parancs |
ukaz teče kot root |
sudo -u apache parancs |
ukaz teče kot uporabnik apache |
sudo -i |
prijavna lupina root: zažene se z okoljem uporabnika root, v imeniku /root |
sudo -s |
lupina root, a ostane v trenutnem imeniku |
sudo -l |
kaj lahko ti zaženeš s sudo |
sudo -l -U fejleszto |
pravila drugega uporabnika (kot root ali če imaš tudi to pravico) |
sudoedit /etc/fajl ali sudo -e |
urejanje sistemske datoteke z lastnim urejevalnikom |
sudo -k, sudo -v, sudo -n |
upravljanje predpomnilnika gesla (glej zgoraj) |
V preizkusu je bil izpis sudo -i pwd /root, izpis sudo -s pwd, zagnanega iz imenika /tmp, pa /tmp. Zagon v imenu storitve je uporaben na primer, ko želiš preveriti, ali spletni strežnik bere datoteko: sudo -u apache cat /var/www/html/index.php.
$HOME je v AlmaLinux pod sudo vedno imenik ciljnega uporabnika (zaradi nastavitve sudoers always_set_home; v preizkusu je bil izpis sudo sh -c 'echo $HOME' /root), zato stikala -H, ki ga vidiš v drugih opisih, tu ni treba dodajati.
sudo -i je udoben, če sledi veliko skrbniških korakov zapored, vendar dokler je lupina root odprta, vsak ukaz teče brez omejitev. Ko končaš, iz nje izstopi (exit).
Urejanje datotek: sudoedit
sudoedit /etc/nginx/nginx.conf
sudoedit naredi začasno kopijo datoteke, jo odpre z lastnim urejevalnikom, z lastnimi pravicami, in jo kot root zapiše nazaj šele ob shranjevanju. Tako urejevalnik ne teče kot root, lastnik in dovoljenja datoteke pa se ne spremenijo; v preizkusu je datoteka 600 v lasti uporabnika root po urejanju ostala enaka. Urejevalnik določiš z okoljsko spremenljivko SUDO_EDITOR ali EDITOR, na primer export EDITOR=nano (o urejevalnikih: Osnove nano in vim).
Pogoste pasti
Preusmeritev ne teče kot root
sudo echo "teszt" > /etc/teszt.conf
bash: line 1: /etc/teszt.conf: Permission denied
Preusmeritev > opravi še tvoja lupina, s tvojimi pravicami, preden se sudo zažene. V sistemsko datoteko piši tako:
echo "teszt" | sudo tee /etc/teszt.conf # prepis
echo "teszt" | sudo tee -a /etc/teszt.conf # dodajanje na konec
sudo cd ne naredi ničesar
cd je vgrajeni ukaz lupine, sudo ga ne more uporabiti na tvoji lupini. V AlmaLinux sudo cd /root niti ne vrne napake (obstaja pomožni program /usr/bin/cd), imenik pa se ne spremeni. Če moraš delati v imeniku, ki ga lahko bere le root, navedi celotno pot (sudo ls /root) ali zaženi kratko zaporedje ukazov v lupini root:
sudo sh -c 'cd /var/log/nginx && ls -lh > /root/naplok.txt'
Tu tečeta menjava imenika in preusmeritev kot root, a le za čas tega ukaza; tvoj terminal ostane na istem mestu. Pazi na narekovaje: kar je v njih, v celoti teče kot root.
PATH je drugačen
sudo iz varnostnih razlogov uporablja lastno iskalno pot (secure_path = /sbin:/bin:/usr/sbin:/usr/bin), zato je treba programe, nameščene v lastni imenik (~/bin, ~/.local/bin), s sudo klicati s celotno potjo.
Vzdevki za sudo ne delujejo
sudo ll vrne napako „command not found”, ker lupina vzdevke razširi le pri prvi besedi vrstice. Rešitev je v članku o vzdevkih: Ustvarjanje in upravljanje vzdevkov Bash.
Če nimaš pravic sudo
ugyfel is not in the sudoers file.
Uporabnik ni v skupini wheel in zanj ni niti ločenega pravila. Če so te ravnokar dodali v skupino, se odjavi in znova prijavi: članstvo v skupini začne veljati šele ob novi prijavi (trenutne skupine pokaže id -nG). Starejše različice sudo so še dodale: „This incident will be reported.”; poskus pride v dnevnik tudi zdaj. Pravice root lahko dodeli skrbnik sistema, glej: Ustvarjanje uporabnika in dodelitev pravic sudo.
Pravila: sudoers
Pravila sudo so v datoteki /etc/sudoers in v imeniku /etc/sudoers.d/. V AlmaLinux je bistvo ta vrstica:
%wheel ALL=(ALL) ALL
To pomeni, da lahko člani skupine wheel na katerem koli računalniku (ALL), kot kateri koli uporabnik ((ALL)) zaženejo kateri koli ukaz (ALL), z geslom. #includedir /etc/sudoers.d na koncu datoteke ni komentar: ta prebere datoteke imenika. Na računalnikih, nameščenih iz cloud image, je tu na primer datoteka 90-cloud-init-users s pravilom za uporabnika, ustvarjenega ob namestitvi.
Omejene pravice brez gesla
Če mora uporabnik (ali namestitveni skript) zaganjati le nekaj ukazov, mu daj ozko pravilo v ločeni datoteki:
sudo visudo -f /etc/sudoers.d/fejleszto-nginx
fejleszto ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx, /usr/bin/systemctl reload nginx
V preizkusu je uporabnik fejleszto lahko brez gesla znova zagnal Nginx, sudo systemctl stop nginx pa je še vedno zahteval geslo.
Imena datotek v /etc/sudoers.d/ naj ne vsebujejo pike in naj se ne končajo z ~: take datoteke sudo tiho preskoči. V preizkusu pravilo v datotekah z imenoma pont.teszt in tilde-teszt~ ni delovalo, isto pravilo pod imenom pontteszt pa je. visudo -c na to ne opozori, ker preskočene datoteke sploh ne pregleda. Ukaze vedno navedi s celotno potjo (command -v systemctl) in ne daj pravice NOPASSWD za urejevalnik, lupino ali program, iz katerega je mogoče zagnati lupino, ker je s tem mogoče pridobiti polne pravice root.
Vedno z visudo
visudo pred shranjevanjem preveri sintakso. Zaradi napačne datoteke sudoers nihče ne bi mogel uporabljati sudo, napako pa bi bilo mogoče popraviti le z geslom root ali iz konzole. Preverjanje vseh datotek:
sudo visudo -c
/etc/sudoers: parsed OK
/etc/sudoers.d/90-cloud-init-users: parsed OK
/etc/sudoers.d/fejleszto-nginx: parsed OK
Zatipkano pravilo (tu manjka dvopičje za NOPASSWD) visudo javi s številko vrstice in stolpca:
/etc/sudoers.d/hibas:1:49: syntax error
fejleszto ALL=(root) NOPASSWD /usr/bin/systemctl
Dnevnik: kdo je kaj zagnal?
V AlmaLinux vsak klic sudo pride v datoteko /var/log/secure in v sistemski dnevnik:
sudo grep 'sudo.*COMMAND' /var/log/secure | tail
sudo journalctl _COMM=sudo --since today
Vnos na primer:
sudo[2772]: fejleszto : TTY=pts/0 ; PWD=/home/fejleszto ; USER=root ; COMMAND=/bin/whoami
Tu se pojavijo tudi neuspešni poskusi (napačno geslo, manjkajoča pravica). O upravljanju dnevnikov govori članek Branje dnevniških datotek: journalctl in /var/log.
Dobra praksa
- Delaj z lastnim uporabnikom in s
sudozaganjaj le potrebne ukaze. Ko vse deluje, lahko prijavo root prek SSH tudi prepoveš, glej: Varnostne nastavitve strežnika SSH. - Uporabljaj močno, edinstveno geslo: tudi pri prijavi s ključem SSH to varuje pravice root.
- Članstvo v skupini
wheeldaj le tistemu, ki ga res potrebuje; drugim ozko pravilo za posamezne ukaze.
O odgovornosti dostopa root piše članek Kaj pomeni dostop root? Naši KVM VPS prihajajo s polnim dostopom root, zato uporabnike in pravila sudo oblikuješ sam.
