A sudo parancs használata példákkal

Linux 8 perc olvasás

A sudo (superuser do) egyetlen parancsot futtat egy másik felhasználó, általában a root nevében. Így a szerveren egy saját, korlátozott jogú felhasználóval dolgozhat, és csak azokhoz a lépésekhez emeli meg a jogosultságát, amelyekhez tényleg kell. Minden sudo-val futtatott parancs naplóba kerül, így utólag is kiderül, ki mit csinált.

Hogyan hozhat létre felhasználót és adhat neki sudo jogot, azt a Felhasználó létrehozása és sudo jog adása Linuxon cikk írja le. Ez a cikk a parancs használatát mutatja be. A példákat AlmaLinux 10.2 rendszeren, a sudo 1.9.17-es verziójával próbáltuk ki, egy fejleszto nevű, a wheel csoportba tartozó felhasználóval. Ubuntu 26.04-től a sudo parancs mögött a Rustban újraírt sudo-rs áll (a sudo -V első sora: sudo-rs …); az itt leírt alapvető használat ugyanaz, de egyes ritkán használt kapcsolók és sudoers-beállítások hiányozhatnak belőle.

Az első használat

sudo whoami

Az első alkalommal a sudo egy rövid figyelmeztetést ír ki, majd a saját jelszavát kéri (nem a rootét):

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:

Gépelés közben a jelszó nem jelenik meg, csillag sem. Ha elgépeli, a sudo „Sorry, try again.” üzenettel újra kéri; háromszori hiba után kilép. Helyes jelszónál a parancs lefut, a kimenet root.

sudo használata AlmaLinux 10 rendszeren: elgépelt jelszó után „Sorry, try again.”, majd a helyes jelszóval a whoami kimenete root; alatta a sudo -l -U fejleszto a felhasználó szabályaival

A jelszó-gyorsítótár

Sikeres jelszómegadás után a sudo öt percig nem kéri újra a jelszót ugyanabban a terminálban (Authentication timestamp timeout: 5.0 minutes). Ezt kezelheti:

sudo -v     # jelszó megadása előre, vagy az öt perc meghosszabbítása
sudo -k     # a gyorsítótár azonnali törlése: a következő sudo újra jelszót kér
sudo -K     # ugyanez az összes terminálra

A -n (non-interactive) kapcsolóval a sudo nem kérdez jelszót, hanem hibával kilép, ha kellene: „sudo: a password is required”. Szkriptben így elkerülhető, hogy a futás egy jelszókérésnél megálljon.

Szkriptben azt is érdemes előre megnézni, hogy egy adott parancsot futtathat-e a felhasználó. Erre a sudo -n -l való, a parancs teljes útvonalával:

sudo -n -l /usr/bin/systemctl restart nginx && sudo -n /usr/bin/systemctl restart nginx

A -l itt nem futtat semmit: ha a szabály engedi a parancsot, kiírja és 0-val lép ki, ha nem, 1-gyel. A teszten egy csak az Nginx újraindítására jogosult felhasználónál a sudo -n -l … restart nginx 0-val, a … stop nginx 1-gyel tért vissza, a gyakran látott sudo -n true próba viszont hibát adott, pedig az újraindítás engedélyezett volt. Fordítva is megtörténhet: a -l csak a szabályt nézi, ezért egy jelszóval engedélyezett parancsnál is 0-t ad, a tényleges sudo -n futtatás mégis jelszót kérne.

Jelszót ne adjon át a sudo-nak csővezetéken (echo jelszo | sudo -S …): a parancselőzményekbe és a folyamatlistába kerülhet. Automatizáláshoz szűk, jelszó nélküli szabályt használjon (lásd lent).

A leggyakoribb kapcsolók

Parancs Mit csinál
sudo parancs a parancs rootként fut
sudo -u apache parancs a parancs az apache felhasználóként fut
sudo -i root bejelentkezési shell: a root környezetével, a /root könyvtárban indul
sudo -s root shell, de az aktuális könyvtárban marad
sudo -l mit futtathat Ön sudo-val
sudo -l -U fejleszto egy másik felhasználó szabályai (rootként, vagy ha erre is joga van)
sudoedit /etc/fajl vagy sudo -e rendszerfájl szerkesztése a saját szerkesztőjével
sudo -k, sudo -v, sudo -n a jelszó-gyorsítótár kezelése (lásd fent)

A teszten a sudo -i pwd kimenete /root, a /tmp könyvtárból indított sudo -s pwd kimenete /tmp volt. Egy szolgáltatás nevében futtatni például akkor hasznos, ha ellenőrizni szeretné, olvassa-e a webszerver a fájlt: sudo -u apache cat /var/www/html/index.php.

A $HOME AlmaLinuxon sudo alatt mindig a célfelhasználó könyvtára (a sudoers always_set_home beállítása miatt; a teszten sudo sh -c 'echo $HOME' kimenete /root volt), ezért az itt nem szükséges -H kapcsolót más leírásokban látva nem kell kitenni.

A sudo -i kényelmes, ha sok rendszergazdai lépés következik egymás után, de amíg a root shell nyitva van, minden parancs korlátozás nélkül fut. Ha végzett, lépjen ki belőle (exit).

Fájlok szerkesztése: sudoedit

sudoedit /etc/nginx/nginx.conf

A sudoedit a fájlról ideiglenes másolatot készít, azt a saját szerkesztőjével, a saját jogaival nyitja meg, és csak mentéskor írja vissza rootként. Így a szerkesztőprogram nem fut rootként, és a fájl tulajdonosa és jogosultságai sem változnak; a teszten egy 600-as, root tulajdonú fájl a szerkesztés után is ugyanilyen maradt. A szerkesztőt a SUDO_EDITOR vagy az EDITOR környezeti változóval adhatja meg, például export EDITOR=nano (a szerkesztőkről: nano és vim alapok).

Gyakori buktatók

Az átirányítás nem rootként fut

sudo echo "teszt" > /etc/teszt.conf
bash: line 1: /etc/teszt.conf: Permission denied

A > átirányítást még az Ön shellje végzi, a saját jogaival, mielőtt a sudo elindulna. Rendszerfájlba így írjon:

echo "teszt" | sudo tee /etc/teszt.conf          # felülírás
echo "teszt" | sudo tee -a /etc/teszt.conf       # hozzáfűzés

A sudo cd nem csinál semmit

A cd a shell beépített parancsa, a sudo nem tudja a saját shelljére alkalmazni. AlmaLinuxon a sudo cd /root hibát sem ad (van egy /usr/bin/cd segédprogram), de a könyvtár nem változik. Ha egy csak root által olvasható könyvtárban kell dolgoznia, adja meg a teljes útvonalat (sudo ls /root), vagy futtasson egy rövid parancssort egy root shellben:

sudo sh -c 'cd /var/log/nginx && ls -lh > /root/naplok.txt'

Itt a könyvtárváltás és az átirányítás is rootként fut, de csak ennek a parancsnak az idejére; a saját terminálja ugyanott marad. Figyeljen az idézőjelekre: ami bennük van, az egészében rootként fut.

Más a PATH

A sudo biztonsági okból saját keresési útvonalat használ (secure_path = /sbin:/bin:/usr/sbin:/usr/bin), ezért a saját könyvtárába (~/bin, ~/.local/bin) telepített programokat sudo-val teljes útvonallal kell hívni.

Az aliasok nem működnek sudo után

A sudo ll „command not found” hibát ad, mert az aliasokat a shell csak a sor első szavánál bontja ki. Megoldás az alias-cikkben: Bash aliasok létrehozása és kezelése.

Ha nincs sudo joga

ugyfel is not in the sudoers file.

A felhasználó nincs benne a wheel csoportban, és külön szabály sincs rá. Ha most vették fel a csoportba, jelentkezzen ki és be újra: a csoporttagság csak új bejelentkezéskor lép életbe (az aktuális csoportokat az id -nG mutatja). A régebbi sudo verziók még hozzátették: „This incident will be reported.”; a próbálkozás most is a naplóba kerül. Root jogot a rendszergazda adhat, lásd: Felhasználó létrehozása és sudo jog adása.

A szabályok: sudoers

A sudo szabályai a /etc/sudoers fájlban és a /etc/sudoers.d/ könyvtárban vannak. AlmaLinuxon a lényeg ez a sor:

%wheel  ALL=(ALL)       ALL

Vagyis a wheel csoport tagjai bármelyik gépen (ALL), bármelyik felhasználóként ((ALL)), bármelyik parancsot (ALL) futtathatják, jelszóval. A fájl végén álló #includedir /etc/sudoers.d nem megjegyzés: ez olvassa be a könyvtár fájljait. A cloud image-ekből telepített gépeken itt van például a 90-cloud-init-users fájl, a telepítéskor létrehozott felhasználó szabályával.

Korlátozott jog jelszó nélkül

Ha egy felhasználónak (vagy egy telepítő szkriptnek) csak néhány parancsot kell futtatnia, adjon rá szűk szabályt egy külön fájlban:

sudo visudo -f /etc/sudoers.d/fejleszto-nginx
fejleszto ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx, /usr/bin/systemctl reload nginx

A teszten a fejleszto felhasználó jelszó nélkül újraindíthatta az Nginxet, a sudo systemctl stop nginx viszont továbbra is jelszót kért.

A /etc/sudoers.d/ fájljainak neve ne tartalmazzon pontot, és ne végződjön ~-re: az ilyen fájlokat a sudo szó nélkül kihagyja. A teszten egy pont.teszt és egy tilde-teszt~ nevű fájlban lévő szabály nem működött, ugyanaz a szabály pontteszt néven igen. A visudo -c erre sem figyelmeztet, mert a kihagyott fájlt nem is vizsgálja. A parancsokat mindig teljes útvonallal adja meg (command -v systemctl), és ne adjon NOPASSWD jogot szerkesztőre, shellre vagy olyan programra, amelyből shell indítható, mert azzal a teljes root jog megszerezhető.

Mindig visudo-val

A visudo mentés előtt ellenőrzi a szintaxist. Egy hibás sudoers fájl miatt senki nem tudná használni a sudo-t, és a hibát csak a root jelszavával vagy a konzolról lehetne javítani. Az összes fájl ellenőrzése:

sudo visudo -c
/etc/sudoers: parsed OK
/etc/sudoers.d/90-cloud-init-users: parsed OK
/etc/sudoers.d/fejleszto-nginx: parsed OK

Egy elírt szabályt (itt a NOPASSWD utáni kettőspont hiányzik) a visudo a sor- és oszlopszámmal jelez:

/etc/sudoers.d/hibas:1:49: syntax error
fejleszto ALL=(root) NOPASSWD /usr/bin/systemctl

Napló: ki mit futtatott?

AlmaLinuxon minden sudo-hívás a /var/log/secure fájlba és a rendszernaplóba kerül:

sudo grep 'sudo.*COMMAND' /var/log/secure | tail
sudo journalctl _COMM=sudo --since today

Egy bejegyzés például:

sudo[2772]: fejleszto : TTY=pts/0 ; PWD=/home/fejleszto ; USER=root ; COMMAND=/bin/whoami

A sikertelen próbálkozások (rossz jelszó, hiányzó jogosultság) is itt jelennek meg. A naplók kezeléséről a Naplófájlok olvasása: journalctl és /var/log cikk szól.

Jó gyakorlat

  • Dolgozzon saját felhasználóval, és csak a szükséges parancsokat futtassa sudo-val. Ha minden működik, a root SSH-bejelentkezést le is tilthatja, lásd: SSH szerver biztonsági beállításai.
  • Erős, egyedi jelszót használjon: SSH-kulcsos bejelentkezésnél is ez védi a root jogot.
  • Csak annak adjon wheel csoporttagságot, akinek tényleg kell; a többieknek szűk, parancsonkénti szabályt.

A root hozzáférés felelősségéről a Mit jelent a root hozzáférés? cikk ír. KVM VPS-eink teljes root hozzáféréssel érkeznek, így a felhasználókat és a sudo szabályokat Ön alakítja ki.

Vissza: Linux leírások (62)