Uporaba ukaza sudo s primeri

Linux Branje: 8 min

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.

Uporaba sudo v sistemu AlmaLinux 10: po zatipkanem geslu „Sorry, try again.”, nato s pravilnim geslom izpis whoami root; pod tem sudo -l -U fejleszto s pravili uporabnika

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 sudo zaganjaj 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 wheel daj 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.

Nazaj: Linux – članki (76)