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.
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
wheelcsoporttagsá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.
