Moduuli 3 · 3.2
sudo ja vähimmät oikeudet
Moduuli 3: Käyttäjät, oikeudet ja sudo · Lukuaika: 11 minuuttia
Tavoite: Tämän oppitunnin jälkeen osaat työskennellä tavallisena käyttäjänä sudon kanssa, lisätä ylläpitäjän turvallisesti, muuttaa sudon asetuksia lukitsematta itseäsi ulos ja selittää, miksi vähimmät oikeudet suojaavat palvelintasi.
Keskeiset käsitteet: sudo, ryhmä sudo, ryhmä wheel, /etc/sudoers, /etc/sudoers.d, visudo, NOPASSWD, sudo -l, rootin lukitseminen, sudon loki, vähimmät oikeudet (least privilege), palvelukäyttäjä
Miksi ei vain työskennellä rootina?
Asennuksen jälkeen kirjaudut usein sisään rootina. Se on helppoa: kaikki on sallittua. Juuri se on kuitenkin ongelma:
- Yksi kirjoitusvirhe riittää.
rm -rf / home/anna/oud(huomaa välilyönti ensimmäisen kauttaviivan jälkeen) pyyhkii rootina koko palvelimesi. Tavallisena käyttäjänä saat virheilmoituksen. - Kaikki ajetaan rootina. Internetistä liittämäsi skripti tai testaamasi ohjelma: kaikki saavat täydet oikeudet.
- Ei jälkiä. Jos kolme ihmistä työskentelee rootina, kukaan ei jälkikäteen tiedä, kuka teki mitä.
- Root on nimi, jota jokainen hyökkääjä kokeilee. Root-kirjautuminen kannattaa poistaa kokonaan käytöstä (oppitunti 2.2), mutta se onnistuu vasta, kun sinulla on toinen tie ylläpito-oikeuksiin.
Tuo toinen tie on sudo: kirjaudut sisään omana itsenäsi ja lisäät sudo vain sellaisen komennon eteen, joka tarvitsee ylläpito-oikeudet.
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 käyttää versiosta 25.10 alkaen oletuksena sudo-rs:ää, joka on sudon uusi toteutus. Kaikessa tämän oppitunnin sisällössä se toimii samoin.)
sudo kysyy sinun salasanaasi, ei rootin. Sen jälkeen se muistaa sen oletuksena vartin, joten sitä ei tarvitse antaa jokaisen komennon kohdalla uudelleen. Jokainen sudolla ajamasi komento kirjautuu lokiin.
Ylläpitäjän luominen
Debianissa ja Ubuntussa jokainen ryhmän sudo jäsen saa tehdä sudon kautta kaiken. Tämä määritellään tiedostossa /etc/sudoers:
%sudo ALL=(ALL:ALL) ALLLue se näin: ryhmän sudo jäsenet (%) saavat kaikilla koneilla (ALL) minä tahansa käyttäjänä ja ryhmänä ((ALL:ALL)) ajaa minkä tahansa komennon (ALL).
Ylläpitäjän lisääminen tapahtuu siis kahdessa vaiheessa rootina:
root@web1:~# adduser anna
root@web1:~# adduser anna sudoLisää sen jälkeen Annan julkinen avain tiedostoon /home/anna/.ssh/authorized_keys oikealla omistajalla ja oikeuksilla:
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_keysÄlä unohda komentoa chown: kun root kopioi tiedoston, se kuuluu rootille, eikä Anna silloin pääse kirjautumaan avaimellaan.
Testaa nyt toisessa ikkunassa, kun root-istuntosi pysyy auki:
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
rootVasta kun tämä toimii, aseta SSH-asetuksiisi PermitRootLogin no (oppitunti 2.2). Siitä lähtien kirjaudut aina sisään Annana.
Yksi asia kannattaa muistaa: Anna tarvitsee nyt salasanan sudoa varten. Tallenna se salasanojen hallintaan. Kirjautuminen tapahtuu avaimella, sudo salasanalla: kaksi eri asiaa, jotka murtautujan pitää saada molemmat.
sudon asetusten muuttaminen: aina visudolla
Virhe tiedostossa /etc/sudoers voi tarkoittaa, ettei sudo toimi enää ollenkaan. Jos root ei myöskään pääse kirjautumaan, olet jumissa. Siksi sudon asetuksia ei koskaan muokata tavallisella editorilla vaan visudolla. Se avaa väliaikaisen kopion ja tarkistaa sisällön ennen tallentamista:
root@web1:~# visudo -f /etc/sudoers.d/backupKäytä SSH:n tapaan mieluummin omaa tiedostoa hakemistossa /etc/sudoers.d/ kuin päätiedostoa. Huomaa kaksi tämän hakemiston sääntöä:
- Tiedostot, joiden nimessä on piste tai joiden nimi päättyy merkkiin
~, ohitetaan.backup.confei siis toimi,backuptoimii. Tarkoitus on ohittaa editorien tekemät kopiot, mutta se yllättää monet. - Tiedoston pitää kuulua rootille, eikä muilla saa olla siihen kirjoitusoikeutta (440 on tavallinen; visudo hoitaa sen).
Jos haluat tarkistaa olemassa olevan tiedoston muokkaamatta sitä: visudo -c tarkistaa kaiken.
NOPASSWD: kätevä, mutta tiedä mitä teet
Asetuksella NOPASSWD sudo ei enää kysy salasanaa:
anna ALL=(ALL:ALL) NOPASSWD: ALLJotkin VPS-imaget asettavat tämän oletuskäyttäjälle, jolloin olet heti avaimella kirjauduttuasi ylläpitäjä. Katso komennolla sudo -l, mitä sinun palvelimellasi on voimassa. Seuraus: jolla on Annan avain, on heti root. Toista lukkoa ei enää ole. Henkilökohtaisella palvelimella voit valita näin, mutta tee se tietoisesti.
Paljon parempi on käyttää NOPASSWD:tä vain yhdelle tietylle komennolle, esimerkiksi varmuuskopiointiskriptille, jonka pitää voida käynnistyä automaattisesti:
backup ALL=(root) NOPASSWD: /usr/local/bin/maak-backupKäyttäjä backup saa silloin ajaa juuri tuon yhden skriptin rootina ilman salasanaa, eikä mitään muuta. Kaksi sudenkuoppaa:
- Käytä aina koko polkua. Pelkällä nimellä
maak-backupjoku voi laittaa samannimisen oman ohjelmansa polkunsa alkuun. - Skripti itse ei saa olla kirjoitettavissa tuolle käyttäjälle. Muuten hän muokkaa sitä ja ajaa sitten mielivaltaisia komentoja rootina. Sama koskee komentoja, jotka voivat itse avata shellin, kuten editoria (
vim,nano) tailess: joka saa käynnistää ne sudon kautta, voi avata ohjelmasta root-shellin. Älä koskaan anna tällaisia komentoja erikseen sudon kautta.
Mitä lokiin kirjataan
Aina kun joku käyttää sudoa, journaliin tulee rivi (ja rsyslogia käyttävissä järjestelmissä myös tiedostoon /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 updateNäet kuka, missä, kenenä ja minkä komennon. Tämä on yksi syy olla työskentelemättä usean ihmisen kanssa rootina. Epäonnistuneet sudo-yritykset ("incorrect password attempts") tililtä, joka ei ole sinun, ovat hälytysmerkki.
Vähimmät oikeudet laajemmin
sudo on yksi yleisen periaatteen sovellus: vähimmät oikeudet (least privilege). Jokainen käyttäjä ja jokainen palvelu saa juuri tarvitsemansa oikeudet, ei enempää. Palvelimella se tarkoittaa muun muassa:
- työskentelet tavallisena käyttäjänä ja käytät sudoa vain tarvittaessa;
- jokainen palvelu toimii omana käyttäjänään ilman shelliä (oppitunti 3.1), ei rootina;
- verkkosovellus saa tietokantakäyttäjän, joka saa käyttää vain omaa tietokantaansa, ei tietokantapalvelimen ylläpitäjää;
- varmuuskopiointiskripti saa ajaa vain sen yhden komennon, jota se tarvitsee (NOPASSWD ja koko polku);
- kollega, joka vain päivittää verkkosivustoa, saa kirjoitusoikeuden hakemistoon
/var/www/example.comryhmän kautta, ei sudoa.
Ajatus: jos jokin menee pieleen (lisäosan haavoittuvuus, varastettu avain), vahinko rajoittuu tuohon yhteen käyttäjään tai palveluun. CIS-periaatteissa ja koventamista käsittelevässä oppitunnissa (10.1) tämä toistuu jatkuvasti.
AlmaLinuxissa ja Rocky Linuxissa
Niissä ylläpitäjäryhmän nimi on wheel eikä sudo: usermod -aG wheel anna. Rivi tiedostossa /etc/sudoers on %wheel ALL=(ALL) ALL. visudo ja /etc/sudoers.d toimivat samoin. Sudo-ilmoitukset löytyvät siellä myös tiedostosta /var/log/secure.
Yhteenveto
- Työskentele tavallisena käyttäjänä ja käytä sudoa ylläpitoon; sudo kysyy omaa salasanaasi ja kirjaa jokaisen komennon lokiin.
- Ylläpitäjän luominen:
adduser anna,adduser anna sudo(wheel RHEL-tyyppisissä), avain oikealla omistajalla ja oikeuksilla, testaus toisessa ikkunassa, vasta sitten root-kirjautuminen pois päältä. - Muokkaa sudo-sääntöjä vain komennolla
visudo, mieluiten omassa tiedostossa hakemistossa/etc/sudoers.d/ilman pistettä nimessä. - NOPASSWD kaikelle poistaa yhden lukon; käytä sitä mieluummin vain yhdelle komennolle koko polulla, jota käyttäjä ei voi muuttaa.
- Vähimmät oikeudet: jokainen käyttäjä ja palvelu saa juuri sen mitä tarvitsee, jolloin virhe tai haavoittuvuus jää pieneksi.
Tietovisa (quiz)
Tehtävä
Tehtävä O3.2: Ylläpitäjä, jolla on sudo. Luo palvelimellesi tavallinen ylläpitäjä (esimerkiksi anna), aseta avaimesi oikein, testaa kirjautuminen ja sudo -l toisessa ikkunassa ja poista sen jälkeen root-kirjautuminen SSH:n kautta käytöstä (PermitRootLogin no). Merkitse vaiheet tehdyiksi, liitä komennon id tuloste (vain nimi ja ryhmät) ja vastaa kysymyksiin: mikä rivi antaa ylläpitäjällesi oikeudet, onko jossain NOPASSWD ja miten pääset sisään, jos unohdat salasanasi?
Tehtävä O3.2: Ylläpitäjä, jolla on sudo
Tämän tehtävän teet itse, kukaan ei tarkista sitä. Merkitse tekemäsi kohdat ja merkitse tehtävä tehdyksi.
%sudo ALL=(ALL:ALL) ALL tiedostossa /etc/sudoers (RHEL: %wheel). NOPASSWD vain harkiten ja mieluiten rajattuna yhteen komentoon. Jos salasana unohtuu: palveluntarjoajan konsolin kautta, uusi root-salasana paneelin tai pelastusympäristön kautta, sen jälkeen passwd <gebruiker>.
Merkintäsi ja muistiinpanosi pysyvät vain tässä selaimessa, emme lähetä niitä minnekään. Jos olet kirjautunut sisään, tallennamme kohtaan Omat kurssit vain sen, että olet tehnyt tehtävän.
Lue lisää
Näiden artikkelien vaiheet koskevat WebOkén VPS-palvelimia; muilla palveluntarjoajilla se toimii samaan tapaan.
- VPS:n suojaaminen: ensimmäiset viisi minuuttia
- Et pääse enää VPS:llesi: mitä nyt?
- DirectAdmin-ohje 12.2: Tietokannan käyttäjät, oikeudet ja salasanat
- Ubuntu Server: User management: https://ubuntu.com/server/docs/how-to/security/user-management/
- Debianin sudoers-käyttöopas: https://manpages.debian.org/trixie/sudo/sudoers.5.en.html
