Usuaris i grups a Linux

La comanda sudo a Linux: executar com a administrador i configurar sudoers

Esquema de què passa quan escrius sudo: comprova si tens permís, llegeix /etc/sudoers, demana la teva contrasenya i executa la comanda com a root deixant-ne registre


La comanda sudo (de superuser do, «fes-ho com a superusuari») executa una comanda amb els permisos d’un altre usuari, normalment root. És la manera habitual de fer tasques d’administració a Linux sense haver d’entrar com a root: instal·lar paquets, editar fitxers de configuració del sistema, reiniciar serveis… Per això surt a tantes guies d’aquest blog.

La gràcia de sudo és que et demana la teva contrasenya, no la de root, i que l’administrador pot decidir exactament qui pot fer què. A més, cada ús queda registrat.

Esquema de què passa quan escrius sudo: comprova si tens permís, llegeix /etc/sudoers, demana la teva contrasenya i executa la comanda com a root deixant-ne registre

Sintaxi

sudo [opcions] comanda [arguments]

Per exemple, per actualitzar la llista de paquets a Debian o Ubuntu:

sudo apt update

La primera vegada et demana la contrasenya. Durant uns minuts (15 per defecte) no te la tornarà a demanar.

Qui pot fer servir sudo

No tothom: només els usuaris que hi té autoritzats el fitxer /etc/sudoers. A les distribucions més habituals, la manera fàcil és afegir l’usuari al grup que ja hi té permís:

DistribucióGrup amb permís de sudo
Debian, Ubuntu i derivadessudo
Fedora, RHEL, Rocky, Almawheel

Per donar permís a l’usuari joan (des d’un compte que ja en tingui):

sudo usermod -aG sudo joan     # Debian, Ubuntu
sudo usermod -aG wheel joan    # Fedora, RHEL, Rocky, Alma

El canvi s’aplica a la sessió següent: en joan ha de tancar la sessió i tornar a entrar. Tens més detalls de l’opció -aG a la comanda usermod.

Per saber què pots fer tu amb sudo:

sudo -l

Al meu servidor (una Raspberry Pi amb Debian 13) la sortida acaba així:

User oscar may run the following commands on piiespai:
    (ALL : ALL) ALL
    (ALL) NOPASSWD: ALL

La primera línia vol dir que pot executar qualsevol comanda com a qualsevol usuari. La segona, que ni tan sols li demana la contrasenya: més avall t’explico per què això no és una bona idea en un servidor.

Opcions més útils

OpcióQuè fa
-u usuariExecuta la comanda com a un altre usuari (no root)
-g grupExecuta la comanda amb un altre grup principal
-iObre un shell de login com a root (o com a l’usuari de -u), amb el seu entorn
-sObre un shell com a root mantenint més el teu entorn
-lLlista què tens permès fer (-ll, en format llarg)
-e fitxerEdita un fitxer amb permisos de root de manera segura (equival a sudoedit)
-kOblida la contrasenya: la propera vegada te la tornarà a demanar
-KCom -k, però esborra del tot el registre de temps
-vRenova el temps sense executar res
-nNo demana mai la contrasenya; si caldria, falla (útil en scripts)
-EConserva les variables d’entorn de l’usuari
-bExecuta la comanda en segon pla

Exemples

Executar una comanda com a root:

sudo systemctl restart apache2

Executar una comanda com un altre usuari, per exemple el de l’Apache:

sudo -u www-data ls /var/www/html

Obrir una sessió de root (per fer moltes tasques seguides) i sortir-ne amb exit:

sudo -i

Editar un fitxer de configuració del sistema. Amb sudoedit l’editor s’executa amb el teu usuari sobre una còpia, i només el desament es fa com a root:

sudoedit /etc/hosts

Repetir l’última comanda amb sudo quan te n’has oblidat (és una drecera de l’historial de Bash):

apt update        # error: no tens permisos
sudo !!           # executa «sudo apt update»

Compte amb les redireccions

Aquest és l’error més típic:

sudo echo "192.168.1.10 servidor" >> /etc/hosts
# bash: /etc/hosts: Permission denied

Falla perquè la redirecció >> la fa el teu shell, que no té permisos de root; sudo només s’aplica a echo. Les dues solucions habituals:

echo "192.168.1.10 servidor" | sudo tee -a /etc/hosts
sudo sh -c 'echo "192.168.1.10 servidor" >> /etc/hosts'

Amb tee -a el fitxer l’escriu tee, que sí que s’executa com a root (sense -a, el sobreescriuria).

sudo o su?

sudosu
Contrasenya que demanaLa tevaLa de root (o la de l’usuari de destinació)
AbastUna comanda (o una sessió amb -i)Una sessió sencera
ControlEs pot limitar per usuari i per comandaTot o res
RegistreCada comanda queda registradaNomés l’entrada a la sessió

Per això avui la majoria de distribucions recomanen sudo i, de fet, Ubuntu no posa cap contrasenya a root per defecte.

El fitxer /etc/sudoers

Els permisos es defineixen a /etc/sudoers i als fitxers del directori /etc/sudoers.d/. No l’editis mai directament: fes servir sempre visudo, que comprova la sintaxi abans de desar. Un error de sintaxi a sudoers pot deixar-te sense sudo i, si no tens la contrasenya de root, sense manera fàcil d’administrar el sistema.

sudo visudo

Com es llegeix una regla

usuari   màquina=(usuari_destí:grup_destí)   comandes

Les línies que segur que hi trobaràs a Debian i Ubuntu:

root    ALL=(ALL:ALL) ALL
%sudo   ALL=(ALL:ALL) ALL
  • root o %sudo: a qui s’aplica. El % indica que és un grup.
  • El primer ALL: a quines màquines (útil quan es comparteix el fitxer entre servidors).
  • (ALL:ALL): com a quins usuaris i grups pot executar comandes.
  • L’últim ALL: quines comandes.

Les regles pròpies, a /etc/sudoers.d

En lloc de tocar /etc/sudoers, és més net posar les teves regles en un fitxer a part dins de /etc/sudoers.d/. El fitxer principal ja els inclou amb la directiva @includedir /etc/sudoers.d (en versions antigues, #includedir, que no és cap comentari malgrat el #). Els noms d’aquests fitxers no poden contenir cap punt ni acabar en ~, o sudo els ignorarà.

sudo visudo -f /etc/sudoers.d/web

Exemple: permís per a una sola comanda

Volem que l’usuari joan pugui reiniciar l’Apache, i res més, sense haver de posar la contrasenya:

joan    ALL=(root) NOPASSWD: /usr/bin/systemctl restart apache2

Fes servir sempre la ruta completa de la comanda (la trobaràs amb which systemctl). Si són diverses comandes, pots agrupar-les en un àlies:

Cmnd_Alias WEB = /usr/bin/systemctl restart apache2, /usr/bin/systemctl reload apache2
joan    ALL=(root) NOPASSWD: WEB

Després de desar, comprova que tot és correcte:

sudo visudo -c
sudo -l -U joan

Alguns ajustos (Defaults)

AjustQuè fa
Defaults timestamp_timeout=5Minuts que recorda la contrasenya (per defecte, 15; amb 0 la demana sempre)
Defaults passwd_tries=3Intents per escriure la contrasenya (per defecte, 3)
Defaults insultsFa que sudo et «insulti» quan t’equivoques de contrasenya (desactivat per defecte; és una curiositat)
Defaults secure_path=...El PATH que es fa servir per a les comandes amb sudo

On queda registrat

Cada ús de sudo, permès o denegat, queda als registres del sistema. A Debian 13 ja no hi ha /var/log/auth.log per defecte, i es consulta amb journalctl:

journalctl _COMM=sudo

A Ubuntu i a les instal·lacions amb rsyslog és a /var/log/auth.log; a Fedora i RHEL, a /var/log/secure.

Compte amb…

  • NOPASSWD: ALL. És molt còmode (Raspberry Pi OS, per exemple, ho configura així per al primer usuari), però vol dir que qualsevol programa que s’executi amb el teu usuari pot fer-se root sense cap barrera. En un servidor exposat a Internet, millor demanar la contrasenya o limitar NOPASSWD a comandes concretes.
  • Comandes que obren un shell. Donar permís per a editors (vi), paginadors (less) o intèrprets (python) equival a donar root, perquè des de dins se’n pot obrir un shell. Per editar fitxers, dona permís a sudoedit.
  • Comodins a sudoers. Als arguments, un * pot coincidir amb qualsevol caràcter, fins i tot espais i barres. Una regla com /usr/bin/cat /var/log/* sembla segura, però també accepta /var/log/../../etc/shadow.
  • Mantén sudo actualitzat. Com que s’executa amb permisos de root, una vulnerabilitat a sudo és greu. Des d’Ubuntu 25.10, per defecte es fa servir sudo-rs, una reimplementació en Rust compatible amb les mateixes comandes.
  • No treballis sempre com a root. Fes servir sudo comanda a comanda i surt de sudo -i quan acabis.

Comandes relacionades