A 02-07 vas veure una s on esperaves una x i et vaig prometre que l'entendries a fons en aquesta lliçó. Ha arribat el moment, i ve acompanyada de l'altra peça que has fet servir durant quatre mòduls sense preguntar-te res: sudo. Escrius sudo desenes de vegades al dia, però qui ha decidit que puguis fer-ho? On està escrit? Què passaria si la Marta et demanés que luis pogués reiniciar l'aplicació —només reiniciar-la— sense donar-li la màquina sencera? Aquesta lliçó respon a les tres preguntes i afegeix les eines que el model clàssic ugo/rwx no cobreix: capabilities, ACL i atributs immutables. Al final, operador podrà desplegar Tramontana amb una regla de sudoers escrita per tu, i el Luis llegirà els registres sense estar a adm.

Contingut

  1. Per què no es treballa com a root
  2. su, su -, sudo -i i sudo -s comparats
  3. sudo a fons: memòria cau, entorn i l'error de la redirecció
  4. sudoers: sintaxi, visudo i regles segures
  5. Traçabilitat: on queda l'empremta de sudo
  6. Recuperar-se d'un sudoers trencat
  7. SUID: UID real enfront d'UID efectiu
  8. SGID en directoris: el bit del treball en equip
  9. El bit sticky i /tmp
  10. Capacitats: el substitut modern de SUID
  11. ACL: permisos que ugo no sap expressar
  12. Atributs estesos i immutabilitat
  13. Cas Tramontana: la regla de sudoers del desplegament

  1. Per què no es treballa com a root

Root no té permisos: root no té comprovació de permisos. El nucli, davant d'un procés amb UID efectiu 0, se salta la verificació sencera. Això significa tres coses:

  • Un error és irreversible. rm -rf /opt/tramontana / amb un espai de més, executat com a operador, falla amb «Permission denied» a la segona ruta. Executat com a root, esborra el sistema.
  • No hi ha traçabilitat. Si cinc persones comparteixen la contrasenya de root, auth.log dirà «root va fer X» i ningú no sabrà qui va ser. Amb sudo, dirà «operador va executar X com a root».
  • No hi ha privilegi mínim. Qui necessita reiniciar un servei no necessita poder llegir /etc/shadow ni reformatar un disc.

Per això Ubuntu ve de fàbrica amb root sense contrasenya utilitzable (! a shadow, com vas veure a 05-01) i tota la feina administrativa passa per sudo.

  1. su, su -, sudo -i i sudo -s comparats

Ordre Contrasenya que demana Entorn resultant PATH Directori
su La de root Hereta el teu gairebé sencer El teu L'actual
su - La de root Accés complet de root, entorn net El de root /root
sudo -s La teva Shell amb el teu entorn, HOME conservat secure_path L'actual
sudo -i La teva Accés complet de root, com su - El de root /root
sudo ordre La teva Només aquesta ordre, entorn sanejat secure_path L'actual

El guionet de su - (i de -i) és el que marca la diferència: sense ell t'emportes les teves variables, els teus àlies i el teu PATH a una sessió amb UID 0, i aquest és justament el vector pel qual un PATH manipulat amb un ls fals acaba executant-se com a root. Si necessites una sessió de root, fes servir sudo -i. I com a norma general, cap de les dues: un sudo per acció deixa millor rastre que una sessió de root oberta mitja hora.

  1. sudo a fons: memòria cau, entorn i l'error de la redirecció

El que fa sudo en invocar-lo: comprova la teva identitat contra /etc/sudoers, et demana la teva contrasenya (no la de root), registra l'ordre, construeix un entorn nou i executa l'ordre amb la identitat de destinació.

$ sudo -l                       # què em deixa fer sudo aquí?
Matching Defaults entries for operador on srv-tramontana:
    env_reset, mail_badpass, secure_path=/usr/sbin\:/usr/bin\:/sbin\:/bin
User operador may run the following commands on srv-tramontana:
    (ALL : ALL) ALL

La memòria cau de credencials guarda que ja t'has autenticat durant 15 minuts per terminal (timestamp_timeout, en minuts; 0 la desactiva i -1 la fa eterna, cosa que és mala idea). sudo -k la invalida ara mateix, sudo -v la renova sense executar res, útil al principi d'un script llarg.

Opcions que es fan servir a diari:

sudo -u svc-tramontana /opt/tramontana/app/bin/comprovar   # com un ALTRE usuari, no root
sudo -E ./script.sh    # conservar l'entorn (si sudoers ho permet; fes-ho amb por)

Per defecte env_reset esborra el teu entorn i secure_path imposa un PATH fix. És una protecció deliberada: sense ella, exportar LD_PRELOAD o alterar el PATH abans d'un sudo seria un ascens a root immediat. Aquesta és també la raó que sudo no trobi de vegades un binari teu de /home/operador/bin: no és a secure_path, i cal donar-ne la ruta absoluta.

I el clàssic que arrosseguem des del Mòdul 3:

$ sudo echo "alguna cosa" > /etc/tramontana/nota.conf
bash: /etc/tramontana/nota.conf: Permission denied

No falla echo: falla la redirecció, que la fa el teu shell —que continua sent operador— abans que sudo arribi a executar-se. Les dues solucions correctes:

echo "alguna cosa" | sudo tee /etc/tramontana/nota.conf >/dev/null   # l'habitual
sudo bash -c 'echo "alguna cosa" > /etc/tramontana/nota.conf'        # quan hi ha diverses redireccions

  1. sudoers: sintaxi, visudo i regles segures

El fitxer és /etc/sudoers, però no s'edita: s'edita amb visudo, i les regles pròpies es posen en fitxers a part dins de /etc/sudoers.d/, que sudoers inclou amb @includedir. visudo bloqueja el fitxer contra edicions simultànies i, sobretot, valida la sintaxi abans de desar. Un sudoers amb un error de sintaxi deixa el sistema sense cap sudo funcional, i això és una emergència.

sudo visudo                                  # edita /etc/sudoers amb validació
sudo visudo -f /etc/sudoers.d/tramontana     # edita un fitxer solt, també validat
sudo visudo -c                               # -> /etc/sudoers: parsed OK

Els fitxers de /etc/sudoers.d/ han de tenir mode 0440, propietat root:root, i no portar punt ni acabar en ~ al nom, o sudo els ignora en silenci.

La sintaxi d'una regla

usuari  màquina = (usuari_desti:grup_desti)  ETIQUETES: ordres
operador ALL=(ALL:ALL) ALL
%sudo    ALL=(ALL:ALL) ALL
luis     srv-tramontana=(root) NOPASSWD: /usr/bin/systemctl status tramontana.service
  • El % davant del nom significa grup: per això pertànyer a sudo et dona poders, és aquesta línia.
  • màquina permet distribuir el mateix sudoers a un parc sencer; en un servidor solt s'hi posa ALL.
  • (root) és la identitat de destinació; (ALL:ALL) permet a més triar grup amb -g.
  • NOPASSWD: evita demanar la contrasenya. Còmode per al que executa un script; perillós per a tota la resta.

Àlies

User_Alias   OPERACIONS = operador, becari
Host_Alias   PRODUCCIO  = srv-tramontana
Cmnd_Alias   SERVEI     = /usr/bin/systemctl start tramontana.service, \
                          /usr/bin/systemctl restart tramontana.service
Runas_Alias  APP        = svc-tramontana
OPERACIONS PRODUCCIO = (root) SERVEI

Per què les llistes negres no funcionen

sudoers admet ! per denegar, i és un parany:

# NO ho facis MAI: falsa sensació de seguretat
luis ALL=(ALL) ALL, !/bin/su, !/usr/bin/passwd root

Se salta de mil maneres. Si pots executar ALL, pots executar cp /bin/bash /tmp/sh && chmod u+s /tmp/sh, o simplement:

sudo vim -c ':!/bin/bash'                  # shell des de l'editor
sudo find /etc -maxdepth 0 -exec /bin/bash \;   # shell des de find
sudo awk 'BEGIN{system("/bin/bash")}'      # shell des d'awk

La regla d'or: una regla de sudo és una llista blanca. Enumera el que es permet; no intentis enumerar el que es prohibeix. I desconfia de qualsevol ordre que sàpiga executar altres ordres o editar fitxers arbitraris (vim, less, find, awk, tar --to-command, systemctl sense subordre fixa, qualsevol intèrpret).

Regles segures:

Pràctica Motiu
Ruta absoluta sempre sudo el_meu_script buscaria en un PATH que l'usuari controla
Arguments fixos a la regla systemctl restart tramontana.service, no systemctl a seques
Evitar comodins /bin/chown operador /var/log/* permet /var/log/../../etc/shadow
Script propi amb permisos root:root 0755 Si l'usuari el pot editar, la regla li dona root complet
NOPASSWD només on és imprescindible I mai sobre una ordre amb arguments lliures

  1. Traçabilitat: on queda l'empremta de sudo

$ sudo grep -F 'sudo:' /var/log/auth.log | tail -2
Aug 18 09:41:07 srv-tramontana sudo: operador : TTY=pts/0 ; PWD=/home/operador ; USER=root ; COMMAND=/usr/bin/systemctl restart tramontana.service
Aug 18 09:41:19 srv-tramontana sudo: luis : user NOT in sudoers ; TTY=pts/1 ; PWD=/home/luis ; USER=root ; COMMAND=/usr/bin/apt install nginx

La mateixa informació és al journal (journalctl -t sudo, que veurem a 05-06). Els intents fallits es registren igual, i són el senyal d'alarma més barat que té un servidor.

Si necessites més, sudoers pot gravar la sessió sencera amb Defaults!SERVEI log_input, log_output i Defaults iolog_dir=/var/log/sudo-io; es reprodueix amb sudoreplay -l i sudoreplay ID. Compte: grava el que es teclegeja, incloses contrasenyes escrites per error, així que aquell directori és material sensible i la seva retenció ha d'estar acordada.

  1. Recuperar-se d'un sudoers trencat

Si has desat un sudoers invàlid sense visudo, qualsevol sudo respon alguna cosa com >>> /etc/sudoers: syntax error near line 22 <<< i es nega a funcionar. Sortides, per ordre de preferència:

  1. Una sessió de root encara oberta en una altra terminal: arregla-ho des d'allà. Per això convé tenir-ne una d'oberta mentre es toquen aquests fitxers.
  2. pkexec, que fa servir polkit i no depèn de sudoers: pkexec visudo (requereix que existeixi una regla de polkit per al teu usuari, habitual en instal·lacions d'escriptori).
  3. Mode de recuperació: reiniciar, triar Advanced options → recovery mode → root shell, tornar a muntar amb mount -o remount,rw / i executar visudo. El procediment complet és matèria de 07-01.

El costum que evita tot això: editar sempre amb visudo, i abans de tancar la sessió, comprovar en una altra terminal que sudo -l continua funcionant.

  1. SUID: UID real enfront d'UID efectiu

Tot procés porta dues identitats: l'UID real (qui l'ha llançat) i l'UID efectiu (amb qui es comproven els permisos). Normalment coincideixen. El bit SUID trenca aquesta igualtat: en executar un binari amb SUID, el nucli posa com a UID efectiu el del propietari del fitxer, no el de qui l'executa.

L'exemple canònic és passwd, que ha d'escriure a /etc/shadow (640 root:shadow) essent invocat per un usuari normal:

$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 68208 Mar 23 13:47 /usr/bin/passwd

Aquella s al lloc de la x del propietari és SUID. Mentre corre, passwd és root, i el seu codi està escrit per fer exactament una cosa i res més.

Un SUID root propi és gairebé sempre una fallada de seguretat, perquè qualsevol descuit dins del programa —una crida a system(), un PATH heretat, un desbordament— es converteix en root per a qui l'invoqui. Un script de shell amb SUID ni tan sols funciona: Linux ignora el bit als intèrprets, precisament perquè és impossible d'assegurar.

Auditoria obligatòria en qualsevol servidor:

$ sudo find / -xdev -perm -4000 -type f -printf '%M %u %p\n' 2>/dev/null | head -4
-rwsr-xr-x root /usr/bin/su
-rwsr-xr-x root /usr/bin/sudo
-rwsr-xr-x root /usr/bin/passwd
-rwsr-xr-x root /usr/bin/mount

Guarda aquesta llista com a línia base. Qualsevol binari que aparegui després i no vingui d'un paquet és una alarma. -perm -2000 fa el mateix amb SGID.

  1. SGID en directoris: el bit del treball en equip

En un executable, SGID és l'equivalent de SUID per al grup. Però el seu ús important és un altre: en un directori, SGID fa que tot el que es creï a dins hereti el grup del directori en lloc del grup primari de qui ho crea. És la peça que fa viable el treball compartit.

Sense SGID, si operador (grup primari operador) deixa una còpia a /srv/tramontana/backups, el fitxer pertany al grup operador i el luis no el pot llegir encara que tots dos siguin a tramontana. Amb SGID:

$ sudo chmod 2770 /srv/tramontana/backups          # 2 = SGID, 770 = rwxrwx---
$ ls -ld /srv/tramontana/backups
drwxrws--- 5 operador tramontana 4096 Aug 18 04:20 /srv/tramontana/backups
$ touch /srv/tramontana/backups/prova && ls -l /srv/tramontana/backups/prova
-rw-r----- 1 operador tramontana 0 Aug 18 09:55 /srv/tramontana/backups/prova

Grup tramontana sense haver-ho demanat: això és SGID. Aplica'l a tot l'arbre compartit i no només a l'arrel:

sudo find /srv/tramontana/backups -type d -exec chmod g+s {} +

El bit SGID no arregla els permisos: si la teva umask és 027, el fitxer surt rw-r----- i el grup només llegeix. Perquè el grup també escrigui cal umask 007, o millor, una ACL per defecte (apartat 11).

  1. El bit sticky i /tmp

/tmp és escrivible per tothom. Sense protecció addicional, qualsevol podria esborrar el fitxer temporal d'un altre, perquè el permís d'esborrat depèn del directori, no del fitxer. El bit sticky ho corregeix: en un directori amb sticky, només poden esborrar o reanomenar un fitxer el seu propietari, el propietari del directori i root.

$ ls -ld /tmp
drwxrwxrwt 10 root root 4096 Aug 18 09:12 /tmp

La t final és el bit sticky (octal 1). És la raó que el mktemp dels teus scripts del Mòdul 4 sigui segur davant del veí, encara que continuï necessitant trap per netejar.

Resum dels tres bits:

Bit Octal Símbol En un fitxer executable En un directori
SUID 4 u+s → rws------ Corre amb l'UID del propietari Sense efecte a Linux
SGID 2 g+s → ---rws--- Corre amb el GID del grup Els fills hereten el grup
Sticky 1 +t → ------rwt Sense efecte avui Només l'amo esborra
chmod 4755 /usr/local/bin/eina          # SUID + rwxr-xr-x
chmod 2775 /srv/compartit               # SGID + rwxrwxr-x ; 1777 seria sticky

Una S o una T majúscules a ls -l signifiquen que el bit especial està posat però falta la x corresponent: gairebé sempre és un error d'escriptura.

  1. Capacitats: el substitut modern de SUID

SUID és tot o res: dones root sencer per aconseguir una sola facultat. Les capabilities de Linux parteixen els privilegis de root en una quarantena de peces independents, i es poden concedir una a una.

El cas de manual: Tramontana vol escoltar al port 80, i els ports per sota de 1024 requereixen privilegi. En lloc de fer córrer l'aplicació com a root:

$ sudo setcap 'cap_net_bind_service=+ep' /opt/tramontana/releases/3.2.1/bin/tramontana
$ getcap /opt/tramontana/releases/3.2.1/bin/tramontana
/opt/tramontana/releases/3.2.1/bin/tramontana cap_net_bind_service=ep

e és effective i p és permitted. Ara el binari obre el 80 essent svc-tramontana i no pot fer res més del que root podria. Altres d'habituals: cap_net_raw (per a un ping propi), cap_dac_read_search (llegir qualsevol fitxer: gairebé tan perillós com root, compte), cap_sys_time.

capsh --print | head -3      # quines capacitats té el teu shell ara mateix
sudo setcap -r /ruta/binari  # retirar-les; getcap -r / audita tot el sistema

Advertiments reals: les capacitats són un atribut estès del fitxer, així que es perden en copiar, en reemplaçar el binari en un desplegament i en un sistema de fitxers que no les admeti. Si desplegar.sh substitueix el release, cal tornar-les a aplicar — o, millor, deixar que systemd ho faci amb AmbientCapabilities a la unitat, que és el que muntarem a 05-05.

  1. ACL: permisos que ugo no sap expressar

El model clàssic té tres subjectes: propietari, grup, altres. La Marta demana una cosa que no hi cap: «que el Luis pugui llegir /var/log/tramontana per diagnosticar, però sense ficar-lo a adm, que dona accés a tots els registres del sistema». Amb ugo només podries canviar el grup del directori o obrir-lo a «altres». Amb ACL, dones exactament aquell permís a aquella persona.

$ getfacl /var/log/tramontana
# file: var/log/tramontana
# owner: svc-tramontana
# group: adm
user::rwx
group::r-x
other::---

Concedim lectura i recorregut a luis, i que ho hereti el que es creï després:

sudo setfacl -m u:luis:rx /var/log/tramontana                  # sobre el directori
sudo setfacl -R -m u:luis:r /var/log/tramontana/*.log          # sobre els fitxers actuals
sudo setfacl -d -m u:luis:r /var/log/tramontana                # ACL PER DEFECTE: els futurs
$ ls -ld /var/log/tramontana
drwxr-x---+ 2 svc-tramontana adm 4096 Aug 18 10:02 /var/log/tramontana
$ getfacl /var/log/tramontana | grep -A1 '^user:luis'
user:luis:r-x
mask::r-x

Aquell + al final dels permisos és la marca que hi ha una ACL; sense ell, ls -l et mentiria per omissió.

Operació Ordre
Afegir/modificar setfacl -m u:luis:r fitxer (g:grup:rw per a grups)
ACL per defecte en un directori setfacl -d -m u:luis:r directori
Treure una entrada setfacl -x u:luis fitxer
Esborrar totes les ACL setfacl -b fitxer

La màscara (mask::) és el sostre de permisos efectius de totes les entrades tret de user:: i other::. Si la màscara és r--, una entrada user:luis:rw- queda efectivament en r--, i getfacl ho indica amb un comentari #effective:r--. I aquí hi ha el parany: chmod g=... reescriu la màscara, de manera que un chmod -R 750 posterior pot anul·lar en silenci totes les teves ACL. Si fas servir ACL, revisa-les després de qualsevol chmod sobre aquella ruta.

Requisit: el sistema de fitxers ha d'estar muntat amb suport d'ACL, que a l'ext4 d'Ubuntu 24.04 ve activat de sèrie. I no oblidis que cp no copia les ACL tret d'amb -p o -a, ni tar tret d'amb --acls.

  1. Atributs estesos i immutabilitat

Per sota dels permisos hi ha una capa més: els atributs del sistema de fitxers. L'útil per a un administrador és i, immutable: el fitxer no es pot modificar, esborrar, reanomenar ni enllaçar, ni tan sols per root, fins que es retiri l'atribut.

$ sudo chattr +i /etc/tramontana/app.conf && lsattr /etc/tramontana/app.conf
----i---------e------- /etc/tramontana/app.conf
$ sudo rm /etc/tramontana/app.conf
rm: cannot remove '/etc/tramontana/app.conf': Operation not permitted
$ sudo chattr -i /etc/tramontana/app.conf      # per poder tornar-lo a editar

És una xarxa de seguretat contra l'error humà i contra scripts massa entusiastes, no contra un atacant amb root (que el pot treure igual que tu). Un altre atribut útil és a (append-only), pensat per a fitxers de registre: s'hi pot afegir, no reescriure ni truncar. I un advertiment pràctic: un fitxer immutable trenca qualsevol automatisme que el toqui, inclosos apt i el teu propi desplegar.sh. Documenta-ho a l'HISTORIAL o ho pagaràs a les 4:20 de la matinada.

  1. Cas Tramontana: la regla de sudoers del desplegament

La Marta aprova els desplegaments, però qui els executa és operador, que avui té sudo complet per estar al grup sudo. L'objectiu: que pugui fer la seva feina —gestionar el servei i desplegar— sense root total, i que luis pugui consultar l'estat sense tocar res.

# /etc/sudoers.d/tramontana  (mode 0440, root:root, editat amb visudo -f)
# Gestió del servei i desplegament de Tramontana Reserves.
# Revisat per: Marta Vidal (operacions) — 2026-08-18

Cmnd_Alias TRAMO_SERVEI = /usr/bin/systemctl start tramontana.service, \
                          /usr/bin/systemctl stop tramontana.service, \
                          /usr/bin/systemctl restart tramontana.service, \
                          /usr/bin/systemctl reload tramontana.service
Cmnd_Alias TRAMO_LECTURA = /usr/bin/systemctl status tramontana.service, \
                           /usr/bin/systemctl is-active tramontana.service, \
                           /usr/bin/journalctl -u tramontana.service *
Cmnd_Alias TRAMO_DESPLEGAMENT = /home/operador/bin/desplegar-segur

operador srv-tramontana = (root) TRAMO_SERVEI, TRAMO_LECTURA, TRAMO_DESPLEGAMENT
luis     srv-tramontana = (root) NOPASSWD: TRAMO_LECTURA
$ sudo visudo -c -f /etc/sudoers.d/tramontana
/etc/sudoers.d/tramontana: parsed OK
$ sudo -l -U luis
    (root) NOPASSWD: /usr/bin/systemctl status tramontana.service, ...

Detalls que no són decoratius:

  • desplegar-segur és un embolcall propietat de root:root i mode 0755 a /home/operador/bin/. Si pertanyés a operador i fos escrivible per ell, la regla equivaldria a donar root complet: podria reescriure l'script amb /bin/bash a dins. Aquesta és la fallada més freqüent en concedir «només un script».
  • Les subordres van fixes: systemctl a seques permetria systemctl edit, i d'aquí a un editor com a root hi ha un pas.
  • El luis té només lectura i amb NOPASSWD, perquè ho crida des del seu tauler de diagnòstic. operador continua al grup sudo mentre duri la transició; l'objectiu a mitjà termini és treure'l i quedar-se només amb aquestes regles.

Avís de compliment. Una regla de sudo és una concessió de privilegi amb impacte directe en la seguretat del sistema i en l'accés a dades personals d'hostes (els registres i les còpies en contenen). Tota alta, canvi o retirada de regles ha de quedar documentada, amb data i autoritzant, i l'ha de revisar el responsable de seguretat o de compliment (RGPD) abans d'aplicar-se en producció. Revisa sudo -l -U usuari per a cada compte almenys una vegada al trimestre i en cada baixa de personal.

I les peces de l'apartat anterior aplicades al projecte:

sudo chmod 2770 /opt/tramontana/shared/uploads /srv/tramontana/backups   # SGID: grup heretat
sudo setfacl -m u:luis:rx -m d:u:luis:r /var/log/tramontana              # el Luis llegeix registres sense ser a adm
sudo chattr +i /etc/tramontana/app.conf                                  # ningú no el toca per accident

Errors Comuns i Consells

  • Editar /etc/sudoers amb un editor normal. Un error de sintaxi i et quedes fora: visudo sempre, i tingues una segona terminal oberta mentre edites.
  • Fitxer mal anomenat o amb permisos incorrectes. sudo ignora en silenci els fitxers de /etc/sudoers.d/ que continguin un punt o no siguin 0440. Comprova-ho amb sudo -l -U usuari.
  • Concedir un script que l'usuari pot editar. És root complet disfressat. L'objectiu d'una regla ha de ser root:root i no escrivible pel seu beneficiari.
  • Fer servir comodins o ordres «que executen coses». systemctl, vim, less, find, tar, qualsevol intèrpret: tots tenen una via coneguda a shell. Fixa la subordre i els arguments, i no confiïs en ! per denegar: les llistes negres se salten sempre.
  • Aplicar SGID només a la carpeta arrel d'un arbre compartit: els subdirectoris existents no l'hereten; fes servir find -type d -exec chmod g+s {} +.
  • Perdre les capacitats en un desplegament. setcap viu al fitxer; si substitueixes el binari, desapareix. Declara-la a la unitat de systemd.
  • Un chmod que s'emporta per davant les ACL en reescriure la màscara: després de qualsevol chmod sobre una ruta amb +, verifica-ho amb getfacl.
  • Consell: guarda la línia base de find / -perm -4000 i de getcap -r / al costat de l'HISTORIAL. Comparar aquesta llista és l'auditoria més barata i més eficaç que pots fer.

Exercicis

  1. Una regla mínima i correcta. El becari ha de poder reiniciar únicament tramontana.service i veure'n l'estat, sense contrasenya per a l'estat i amb contrasenya per al reinici. Escriu el fitxer, instal·la'l amb els permisos correctes, valida'l i demostra que sudo systemctl restart nginx li queda prohibit.
  2. Auditoria de SUID. Troba els binaris amb SUID del sistema, comprova a quin paquet pertany cadascun i explica per què trobar /usr/local/bin/util amb SUID root seria una alarma.
  3. ACL d'escriptura per a un tercer. La Marta necessita deixar un fitxer de tarifes a /srv/tramontana/backups/enviaments/ sense pertànyer al grup tramontana. Concedeix-li escriptura només en aquell subdirectori, amb herència, i verifica'n la màscara efectiva.

Solucions

1.

# /etc/sudoers.d/becari, creat amb: sudo visudo -f /etc/sudoers.d/becari
becari srv-tramontana = (root) NOPASSWD: /usr/bin/systemctl status tramontana.service
becari srv-tramontana = (root) PASSWD: /usr/bin/systemctl restart tramontana.service
$ sudo chmod 0440 /etc/sudoers.d/becari && sudo visudo -c -f /etc/sudoers.d/becari
/etc/sudoers.d/becari: parsed OK
$ sudo -l -U becari
    (root) NOPASSWD: /usr/bin/systemctl status tramontana.service
    (root) /usr/bin/systemctl restart tramontana.service

En intentar el que està prohibit, com a becari:

Sorry, user becari is not allowed to execute '/usr/bin/systemctl restart nginx' as root on srv-tramontana.

Fixa't que la llista és blanca: no hem escrit cap prohibició, i tot el que no s'hi enumera queda fora per construcció.

2.

$ sudo find / -xdev -perm -4000 -type f 2>/dev/null | while read -r f; do
    printf '%-28s %s\n' "$f" "$(dpkg -S "$f" 2>/dev/null | cut -d: -f1 || echo '*** SENSE PAQUET ***')"
  done
/usr/bin/sudo                sudo
/usr/bin/passwd              passwd
/usr/local/bin/util          *** SENSE PAQUET ***

/usr/local/bin/util no pertany a cap paquet: ningú de la distribució no en respon, no s'actualitza amb apt i ningú no n'ha auditat el codi. Amb SUID root, qualsevol fallada seva —o qualsevol system() que hereti el PATH de qui l'invoca— lliura root a qualsevol usuari del sistema. Un binari així en un servidor de producció s'investiga com un possible compromís, no es «deixa per si de cas».

3.

$ sudo setfacl -m u:marta:rwx -d -m u:marta:rw /srv/tramontana/backups/enviaments
$ getfacl /srv/tramontana/backups/enviaments
# file: srv/tramontana/backups/enviaments
# owner: operador
# group: tramontana
user::rwx
user:marta:rwx
group::rwx
mask::rwx
other::---
default:user:marta:rw-
default:mask::rw-

u:marta:rwx sobre el directori li permet entrar-hi i crear; l'entrada default: fa que els fitxers que hi deixi neixin amb rw- per a ella. La màscara és rwx, així que els permisos efectius són els concedits: si valgués r-x, getfacl marcaria #effective:r-x i la Marta no podria escriure malgrat l'entrada. I recorda: un chmod g=rx posterior sobre aquell directori reescriuria la màscara i anul·laria el permís sense tocar l'entrada de la Marta.

Conclusió

S'ha acabat la màgia de sudo i la d'aquella s que arrossegaves des de 02-07. Saps que root no té permisos sinó absència de comprovacions, i per què això obliga a treballar amb privilegi mínim i traçabilitat; distingeixes su de su - i sudo -s de sudo -i per l'entorn que hereta cadascun; entens env_reset, secure_path i per què la redirecció de sudo echo falla; escrius regles de sudoers amb visudo, a /etc/sudoers.d/, amb rutes absolutes, arguments fixos i forma de llista blanca, sabent que les llistes negres se salten des de vim, find o awk; saps on queda la traça i com sortir d'un sudoers trencat.

I domines la capa de permisos que el model ugo no cobreix: SUID i la diferència entre UID real i efectiu, amb find -perm -4000 com a auditoria; SGID en directoris perquè un equip comparteixi fitxers de debò, aplicat ja a /opt/tramontana/shared/uploads i a /srv/tramontana/backups; el bit sticky que fa segur /tmp; les capacitats que substitueixen un SUID sencer per una sola facultat com cap_net_bind_service; les ACL amb què el Luis llegeix /var/log/tramontana sense entrar a adm, amb la seva màscara i el seu parany del chmod; i chattr +i per blindar /etc/tramontana/app.conf. A /etc/sudoers.d/tramontana hi ha una regla real, validada i documentada, que permet operar el servei sense repartir root.

El següent cap solt és el programari. Has instal·lat coses amb apt durant quatre mòduls sense preguntar-te d'on venien, qui les signa ni què passa si el motor de base de dades salta de versió major una nit qualsevol mentre dorms. A Gestió de Paquets veuràs les dues capes de Debian, dpkg i apt, l'anatomia d'un .deb, els dipòsits en format deb822 d'Ubuntu 24.04 amb les seves claus a /etc/apt/keyrings/, com fixar versions perquè la base de dades de Tramontana no es mogui sola, i el debat incòmode de si un servidor s'ha de reiniciar sol després d'una actualització de seguretat.

Curs de Linux: De Principiant a Administrador de Sistemes

Mòdul 1: Introducció a Linux

Mòdul 2: Comandes Bàsiques de Linux

Mòdul 3: Habilitats Avançades en la Línia de Comandes

Mòdul 4: Scripting en Shell

Mòdul 5: Administració del Sistema

Mòdul 6: Xarxes i Seguretat

Mòdul 7: Temes Avançats

Mòdul 8: Projectes Pràctics

© Copyright 2026. Tots els drets reservats