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
- Per què no es treballa com a root
su,su -,sudo -iisudo -scomparatssudoa fons: memòria cau, entorn i l'error de la redirecciósudoers: sintaxi,visudoi regles segures- Traçabilitat: on queda l'empremta de
sudo - Recuperar-se d'un
sudoerstrencat - SUID: UID real enfront d'UID efectiu
- SGID en directoris: el bit del treball en equip
- El bit sticky i
/tmp - Capacitats: el substitut modern de SUID
- ACL: permisos que
ugono sap expressar - Atributs estesos i immutabilitat
- Cas Tramontana: la regla de
sudoersdel desplegament
- 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 aoperador, 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.logdirà «root va fer X» i ningú no sabrà qui va ser. Ambsudo, dirà «operador va executar X com a root». - No hi ha privilegi mínim. Qui necessita reiniciar un servei no necessita poder llegir
/etc/shadowni 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.
su, su -, sudo -i i sudo -s comparats
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.
sudo a fons: memòria cau, entorn i l'error de la redirecció
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) ALLLa 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 deniedNo 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
sudoers: sintaxi, visudo i regles segures
sudoers: sintaxi, visudo i regles seguresEl 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 OKEls 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
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 asudoet dona poders, és aquesta línia. màquinapermet distribuir el mateixsudoersa un parc sencer; en un servidor solt s'hi posaALL.(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) SERVEIPer què les llistes negres no funcionen
sudoers admet ! per denegar, i és un parany:
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'awkLa 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 |
- Traçabilitat: on queda l'empremta de
sudo
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 nginxLa 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.
- Recuperar-se d'un
sudoers trencat
sudoers trencatSi 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:
- 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.
pkexec, que fa servir polkit i no depèn desudoers:pkexec visudo(requereix que existeixi una regla de polkit per al teu usuari, habitual en instal·lacions d'escriptori).- Mode de recuperació: reiniciar, triar Advanced options → recovery mode → root shell, tornar a muntar amb
mount -o remount,rw /i executarvisudo. 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.
- 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:
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/mountGuarda 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.
- 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/provaGrup tramontana sense haver-ho demanat: això és SGID. Aplica'l a tot l'arbre compartit i no només a l'arrel:
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).
- El bit sticky i
/tmp
/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.
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 stickyUna 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.
- 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=epe é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 sistemaAdvertiments 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.
- ACL: permisos que
ugo no sap expressar
ugo no sap expressarEl 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-xAquell + 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.
- 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.
- Cas Tramontana: la regla de
sudoers del desplegament
sudoers del desplegamentLa 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 deroot:rooti mode 0755 a/home/operador/bin/. Si pertanyés aoperadori fos escrivible per ell, la regla equivaldria a donar root complet: podria reescriure l'script amb/bin/basha dins. Aquesta és la fallada més freqüent en concedir «només un script».- Les subordres van fixes:
systemctla seques permetriasystemctl edit, i d'aquí a un editor com a root hi ha un pas. - El
luisté només lectura i ambNOPASSWD, perquè ho crida des del seu tauler de diagnòstic.operadorcontinua al grupsudomentre 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ó. Revisasudo -l -U usuariper 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 accidentErrors Comuns i Consells
- Editar
/etc/sudoersamb un editor normal. Un error de sintaxi i et quedes fora:visudosempre, i tingues una segona terminal oberta mentre edites. - Fitxer mal anomenat o amb permisos incorrectes.
sudoignora en silenci els fitxers de/etc/sudoers.d/que continguin un punt o no siguin 0440. Comprova-ho ambsudo -l -U usuari. - Concedir un script que l'usuari pot editar. És root complet disfressat. L'objectiu d'una regla ha de ser
root:rooti 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.
setcapviu al fitxer; si substitueixes el binari, desapareix. Declara-la a la unitat de systemd. - Un
chmodque s'emporta per davant les ACL en reescriure la màscara: després de qualsevolchmodsobre una ruta amb+, verifica-ho ambgetfacl. - Consell: guarda la línia base de
find / -perm -4000i degetcap -r /al costat de l'HISTORIAL. Comparar aquesta llista és l'auditoria més barata i més eficaç que pots fer.
Exercicis
- Una regla mínima i correcta. El becari ha de poder reiniciar únicament
tramontana.servicei 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 quesudo systemctl restart nginxli queda prohibit. - Auditoria de SUID. Troba els binaris amb SUID del sistema, comprova a quin paquet pertany cadascun i explica per què trobar
/usr/local/bin/utilamb SUID root seria una alarma. - ACL d'escriptura per a un tercer. La Marta necessita deixar un fitxer de tarifes a
/srv/tramontana/backups/enviaments/sense pertànyer al gruptramontana. 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.serviceEn 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
- Què és Linux?
- Història de Linux
- Distribucions de Linux
- Instal·lant Linux
- Primer Contacte amb el Sistema
- Estructura del Sistema de Fitxers de Linux
Mòdul 2: Comandes Bàsiques de Linux
- Introducció a la Línia de Comandes
- Obtenir Ajuda i Documentació del Sistema
- Navegant pel Sistema de Fitxers
- Operacions amb Fitxers i Directoris
- Visualització i Edició de Fitxers
- Enllaços Durs i Simbòlics
- Permisos i Propietat dels Fitxers
Mòdul 3: Habilitats Avançades en la Línia de Comandes
- L'Entorn del Shell: Variables, Àlies i Historial
- Ús de Comodins i Expressions Regulars
- Cerca de Fitxers i Contingut: find, locate i grep
- Canonades i Redirecció
- Processament de Text: cut, sort, uniq, sed i awk
- Gestió de Processos
- Programació de Tasques amb Cron
- Comandes de Xarxa
Mòdul 4: Scripting en Shell
- Introducció al Scripting en Shell
- Variables i Tipus de Dades
- Entrada, Sortida i Arguments d'un Script
- Estructures de Control
- Funcions i Biblioteques
- Depuració i Gestió d'Errors
- Scripts de Producció: Bones Pràctiques
Mòdul 5: Administració del Sistema
- Gestió d'Usuaris i Grups
- sudo i Permisos Especials
- Gestió de Paquets
- Gestió de Discs
- systemd i la Gestió de Serveis
- Registres del Sistema: journald i syslog
- Monitoratge del Sistema i Optimització del Rendiment
- Còpies de Seguretat i Restauració
Mòdul 6: Xarxes i Seguretat
- Configuració de Xarxes
- SSH i Accés Remot
- Tallafocs i Seguretat Perimetral
- Sistemes de Detecció d'Intrusions
- Gestió de Secrets i Certificats TLS
- Assegurant Sistemes Linux
Mòdul 7: Temes Avançats
- El Procés d'Arrencada i la Recuperació del Sistema
- Diagnòstic Avançat: strace, perf i eBPF
- Optimització del Nucli de Linux
- Virtualització amb Linux
- Contenidors de Linux i Docker
- Automatització amb Ansible
- Alta Disponibilitat i Balanceig de Càrrega
