Modul 3 · 3.2
sudo in minimalne pravice
Modul 3: Uporabniki, pravice in sudo · Čas branja: 11 minut
Učni cilj: Po tej lekciji boste znali delati kot navaden uporabnik s sudo, varno dodati skrbnika, spremeniti nastavitve sudo, ne da bi se zaklenili iz strežnika, in pojasniti, zakaj minimalne pravice ščitijo Vaš strežnik.
Ključni pojmi: sudo, skupina sudo, skupina wheel, /etc/sudoers, /etc/sudoers.d, visudo, NOPASSWD, sudo -l, zaklepanje računa root, dnevnik sudo, minimalne pravice (least privilege), storitveni uporabnik
Zakaj ne bi preprosto delali kot root?
Po namestitvi se pogosto prijavite kot root. To je priročno: vse je dovoljeno. A prav to je težava:
- Dovolj je ena tipkarska napaka.
rm -rf / home/anna/oud(bodite pozorni na presledek za prvo poševnico) kot root izbriše celoten strežnik. Kot navaden uporabnik dobite sporočilo o napaki. - Vse teče kot root. Skripta, ki jo prilepite z interneta, program, ki ga preizkušate: vse dobi polne pravice.
- Ni sledi. Če trije ljudje delajo kot root, nihče pozneje ne ve, kdo je kaj naredil.
- Root je ime, ki ga poskusi vsak napadalec. Prijavo kot root je bolje povsem izklopiti (lekcija 2.2), vendar je to mogoče šele, ko imate drugo pot do skrbniških pravic.
Ta druga pot je sudo: prijavite se kot Vi sami in samo pred ukaz, ki potrebuje skrbniške pravice, postavite sudo.
anna@web1:~$ apt update
E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)
anna@web1:~$ sudo apt update
[sudo] password for anna:
Hit:1 http://deb.debian.org/debian trixie InRelease
...(Ubuntu od različice 25.10 privzeto uporablja sudo-rs, novo izvedbo sudo. Za vse v tej lekciji deluje enako.)
sudo zahteva Vaše geslo, ne gesla uporabnika root. Nato si ga privzeto zapomni za četrt ure, tako da ga ni treba vnašati pri vsakem ukazu. Vsak ukaz, ki ga izvedete s sudo, se zapiše v dnevnik.
Ustvarjanje skrbnika
Na Debianu in Ubuntuju lahko vsak član skupine sudo prek sudo naredi vse. To je zapisano v /etc/sudoers:
%sudo ALL=(ALL:ALL) ALLTo preberite takole: člani skupine sudo (%) smejo na vseh računalnikih (ALL) kot kateri koli uporabnik in skupina ((ALL:ALL)) izvesti kateri koli ukaz (ALL).
Skrbnika torej dodate v dveh korakih, kot root:
root@web1:~# adduser anna
root@web1:~# adduser anna sudoNato Annin javni ključ postavite v /home/anna/.ssh/authorized_keys s pravim lastnikom in pravicami:
root@web1:~# mkdir -p /home/anna/.ssh
root@web1:~# cp /root/.ssh/authorized_keys /home/anna/.ssh/
root@web1:~# chown -R anna:anna /home/anna/.ssh
root@web1:~# chmod 700 /home/anna/.ssh
root@web1:~# chmod 600 /home/anna/.ssh/authorized_keysNe pozabite na chown: datoteka, ki jo kopira root, pripada uporabniku root, in Anna se potem s svojim ključem ne more prijaviti.
Zdaj, medtem ko Vaša seja root ostane odprta, preizkusite v drugem oknu:
anna@laptop:~$ ssh anna@192.0.2.10
anna@web1:~$ sudo -l
[sudo] password for anna:
User anna may run the following commands on web1:
(ALL : ALL) ALL
anna@web1:~$ sudo whoami
rootŠele ko to deluje, v nastavitvah SSH nastavite PermitRootLogin no (lekcija 2.2). Od takrat se vedno prijavljate kot Anna.
Nekaj si zapomnite: Anna zdaj za sudo potrebuje geslo. Shranite ga v upravitelj gesel. Prijava poteka s ključem, sudo z geslom: dve različni stvari, ki ju mora vsiljivec imeti obe.
Spreminjanje nastavitev sudo: vedno z visudo
Napaka v /etc/sudoers lahko pomeni, da sudo sploh ne deluje več. Če se tudi root ne more prijaviti, ste obtičali. Zato nastavitev sudo nikoli ne urejate z navadnim urejevalnikom, temveč z visudo. Ta odpre začasno kopijo in preveri vsebino, preden jo shrani:
root@web1:~# visudo -f /etc/sudoers.d/backupTako kot pri SSH raje uporabite lastno datoteko v /etc/sudoers.d/ kot glavno datoteko. Bodite pozorni na dve pravili te mape:
- Datoteke, katerih ime vsebuje piko ali se končá z
~, se preskočijo.backup.conftorej ne deluje,backuppa deluje. To je namenjeno temu, da se prezrejo kopije urejevalnikov, vendar preseneti veliko ljudi. - Datoteka mora pripadati uporabniku root in drugi vanjo ne smejo pisati (običajno je 440; za to poskrbi visudo).
Če želite obstoječo datoteko preveriti, ne da bi jo urejali: visudo -c preveri vse.
NOPASSWD: priročno, a vedite, kaj počnete
Z NOPASSWD sudo ne zahteva več gesla:
anna ALL=(ALL:ALL) NOPASSWD: ALLNekatere slike VPS to nastavijo za privzetega uporabnika, tako da ste po prijavi s ključem takoj skrbnik. Z sudo -l preverite, kaj velja pri Vas. Posledica: kdor ima Annin ključ, je takoj root. Druge ključavnice ni več. Za osebni strežnik se lahko za to odločite, vendar to storite zavestno.
Veliko bolje je NOPASSWD uporabiti samo za en določen ukaz, na primer za skripto za varnostno kopiranje, ki se mora izvajati samodejno:
backup ALL=(root) NOPASSWD: /usr/local/bin/maak-backupUporabnik backup sme potem kot root brez gesla zagnati natanko to eno skripto in nič drugega. Dve pasti:
- Vedno uporabite celotno pot. Če navedete samo
maak-backup, lahko nekdo svoj program s tem imenom postavi na začetek svoje poti. - Skripta sama za tega uporabnika ne sme biti zapisljiva. Sicer jo spremeni in nato kot root izvaja poljubne ukaze. Enako velja za ukaze, ki lahko sami odprejo lupino, kot je urejevalnik (
vim,nano) aliless: kdor jih sme zagnati prek sudo, lahko iz programa odpre lupino root. Takšnih ukazov nikoli ne dovolite posamično prek sudo.
Kaj se beleži
Vsakič, ko nekdo uporabi sudo, se v journal zapiše vrstica (na sistemih z rsyslog tudi v /var/log/auth.log):
anna@web1:~$ sudo journalctl _COMM=sudo --since today
Nov 09 10:31:02 web1 sudo[2214]: anna : TTY=pts/0 ; PWD=/home/anna ; USER=root ; COMMAND=/usr/bin/apt updateVidite, kdo, kje, kot kdo in kateri ukaz. To je eden od razlogov, da več ljudi ne dela kot root. Neuspešni poskusi sudo ("incorrect password attempts") z računa, ki ni Vaš, so opozorilni znak.
Minimalne pravice v širšem smislu
sudo je ena uporaba splošnega načela: minimalnih pravic (least privilege). Vsak uporabnik in vsaka storitev dobi natanko tiste pravice, ki jih potrebuje, in nič več. Na strežniku to med drugim pomeni:
- delate kot navaden uporabnik in sudo uporabljate le, kadar je to potrebno;
- vsaka storitev teče pod lastnim uporabnikom brez lupine (lekcija 3.1), ne kot root;
- spletna aplikacija dobi uporabnika podatkovne baze, ki sme uporabljati samo svojo podatkovno bazo, ne skrbnika strežnika podatkovnih baz;
- skripta za varnostno kopiranje sme izvesti samo tisti en ukaz, ki ga potrebuje (NOPASSWD s celotno potjo);
- sodelavec, ki samo posodablja spletno mesto, dobi pravico pisanja v
/var/www/example.comprek skupine, ne sudo.
Zamisel: če gre kaj narobe (luknja v vtičniku, ukraden ključ), škoda ostane omejena na tega enega uporabnika ali storitev. V načelih CIS in v lekciji o utrjevanju (10.1) se to vedno znova pojavlja.
Na AlmaLinux in Rocky Linux
Tam se skrbniška skupina imenuje wheel namesto sudo: usermod -aG wheel anna. Vrstica v /etc/sudoers je %wheel ALL=(ALL) ALL. visudo in /etc/sudoers.d delujeta enako. Sporočila sudo so tam tudi v /var/log/secure.
Povzetek
- Delajte kot navaden uporabnik in za upravljanje uporabljajte sudo; sudo zahteva Vaše lastno geslo in beleži vsak ukaz.
- Ustvarjanje skrbnika:
adduser anna,adduser anna sudo(wheel na sistemih, podobnih RHEL), ključ s pravim lastnikom in pravicami, preizkus v drugem oknu, šele nato izklop prijave root. - Pravila sudo urejajte samo z
visudo, najraje v lastni datoteki v/etc/sudoers.d/brez pike v imenu. - NOPASSWD za vse odstrani eno ključavnico; raje ga uporabite samo za en ukaz s celotno potjo, ki ga uporabnik ne more spremeniti.
- Minimalne pravice: vsak uporabnik in storitev dobi natanko to, kar potrebuje, da napaka ali luknja ostane majhna.
Kviz
Naloga
Naloga O3.2: Skrbnik s sudo. Na svojem strežniku ustvarite navadnega skrbnika (na primer anna), pravilno nastavite svoj ključ, v drugem oknu preizkusite prijavo in sudo -l, nato pa izklopite prijavo root prek SSH (PermitRootLogin no). Označite korake, prilepite izpis id (samo ime in skupine) in odgovorite na vprašanja: katera vrstica daje Vašemu skrbniku pravice, ali je kje NOPASSWD in kako pridete v strežnik, če pozabite geslo?
Naloga O3.2: Skrbnik s sudo
To nalogo opravite sami; nihče je ne pregleda. Odkljukajte, kar ste naredili, in nalogo označite kot opravljeno.
%sudo ALL=(ALL:ALL) ALL v /etc/sudoers (RHEL: %wheel). NOPASSWD samo zavestno in po možnosti omejeno na en ukaz. Pri pozabljenem geslu: prek konzole Vašega ponudnika, novo geslo za root prek nadzorne plošče ali reševalnega okolja, nato passwd <gebruiker>.
Vaše kljukice in zapiski ostanejo samo v tem brskalniku, nikamor jih ne pošiljamo. Če ste prijavljeni, v Moji tečaji shranimo samo podatek, da ste nalogo opravili.
Za nadaljnje branje
Koraki v teh člankih veljajo za VPS-je WebOké; pri drugih ponudnikih deluje podobno.
- Zavarovanje Vašega VPS: prvih pet minut
- Nimate več dostopa do svojega VPS: kaj storiti?
- Priročnik DirectAdmin 12.2: Uporabniki podatkovne zbirke, pravice in gesla
- Ubuntu Server: User management: https://ubuntu.com/server/docs/how-to/security/user-management/
- Priročnik Debian za sudoers: https://manpages.debian.org/trixie/sudo/sudoers.5.en.html
