Portem cinc lliçons veient el mateix a cada ls -l i a cada stat sense explicar-ho: -rw-r-----, Uid: (990/meteora), Accés: (0640/-rw-r-----). Hem protegit 2026-08-31.dat del tall de llum amb el diari, de la fallada d'un disc amb RAID 1 i d'un bit capgirat amb un CRC per registre. Però no hem respost la pregunta més bàsica de totes: qui pot llegir aquell fitxer, i qui el pot esborrar?
La resposta és un model de dotze bits dissenyat el 1971 que continua sent, cinquanta anys després, la base del control d'accés de tots els sistemes UNIX. La seva virtut és la simplicitat; el seu perill, que aquella simplicitat amaga comportaments que sorprenen. Que els permisos d'un directori signifiquin coses diferents dels d'un fitxer. Que es pugui esborrar un fitxer que no es pot llegir. Que el permís es comprovi a tots els directoris del camí, no només al fitxer final. I que un programa executat per un usuari normal pugui, mitjançant un sol bit, modificar /etc/shadow.
Aquesta lliçó explica els dotze bits un a un, amb el perquè de cada comportament; afegeix les ACL POSIX per als casos que els dotze bits no cobreixen; presenta els atributs de fitxer, que protegeixen fins i tot de root; compara el model amb el de Windows; i acaba fixant i justificant els permisos exactes de tots els fitxers de Meteora, amb les ordres completes i una auditoria del que sol estar malament.
Contingut
- El model clàssic: usuari, grup i altres
- Els bits
r,wixen fitxers i en directoris - Notació simbòlica i octal:
chmod,chown,chgrp umask: com es calcula el permís final- Els bits especials: setuid, setgid i sticky
- Com comprova el nucli un accés, pas a pas
- Llistes de control d'accés POSIX
- Atributs estesos i atributs de fitxer
- Comparació amb el model de Windows
- Els permisos de Meteora, justificats
- Errors greus i com auditar-los
- Tancament del mòdul 4
El model clàssic: usuari, grup i altres
Cada fitxer té al seu inode (04-01) dos identificadors numèrics i dotze bits de mode:
- UID del propietari: qui n'és l'amo. A Meteora, 990 (
meteora). - GID del grup propietari: quin grup té accés especial. També 990.
- Mode: dotze bits que diuen què pot fer cada classe d'usuari.
L'inode guarda números, no noms. La traducció a meteora la fan ls i stat consultant /etc/passwd i /etc/group; si esborres l'entrada de l'usuari, ls -l mostrarà 990 a seques i el fitxer continuarà sent seu.
Davant de qualsevol accés, el nucli classifica el sol·licitant en exactament una de tres classes:
| Classe | Abreviatura | Condició |
|---|---|---|
| Usuari (propietari) | u |
El seu UID efectiu és l'UID del fitxer |
| Grup | g |
No n'és el propietari, però algun dels seus grups és el GID del fitxer |
| Altres | o |
Ni l'una cosa ni l'altra |
I aquí hi ha la primera subtilesa, que produeix un desconcert clàssic:
Les tres classes són excloents i s'avaluen en aquell ordre. Si ets el propietari, s'apliquen només els bits d'usuari, encara que els de grup siguin més permissius.
$ ls -l estrany.txt ----r--r-- 1 meteora meteora 100 set 1 15:10 estrany.txt $ id uid=990(meteora) gid=990(meteora) $ cat estrany.txt cat: estrany.txt: Permís denegat
El propietari no pot llegir el seu propi fitxer, mentre que qualsevol altre membre del grup meteora sí. No és una fallada: la classe es decideix primer i els permisos s'apliquen després. El propietari, això sí, sempre pot executar chmod sobre ell i arreglar-ho.
Cada classe té tres bits, r, w i x, cosa que dona els nou bits que mostra ls -l, més tres bits especials que veurem a l'apartat 5.
Els bits r, w i x en fitxers i en directoris
Aquí hi ha el cor de la lliçó, i el que més errors causa: els tres bits signifiquen coses diferents segons el tipus.
| Bit | En un fitxer | En un directori |
|---|---|---|
r |
Llegir el contingut | Llistar els noms que conté |
w |
Modificar el contingut | Crear, esborrar i reanomenar entrades |
x |
Executar-lo com a programa | Travessar-lo: fer-lo servir en un camí i accedir al que hi ha a dins |
Recorda 04-02: un directori és un fitxer el contingut del qual és la llista de parells (nom, inode). Amb això, els tres significats deixen de ser arbitraris i es tornen inevitables:
r= llegir el contingut del directori = llegir la llista de noms. Això és exactament el que fals.w= escriure al contingut del directori = afegir o treure entrades. Crear un fitxer és afegir una entrada; esborrar-lo és treure-la. Totes dues són escriptures al directori, no al fitxer.x= fer servir el directori per arribar a alguna cosa = poder resoldre un component del camí (04-02) i consultar l'inode associat a un nom que ja coneixes.
D'aquí surten les quatre conseqüències que cal interioritzar.
1. x sense r: pots entrar però no mirar. És el «directori fosc»:
Qualsevol pot accedir a /home/analista/informe.pdf si en sap el nom exacte, però ls /home/analista falla amb «Permís denegat». És la configuració clàssica dels directoris personals en servidors compartits i de l'arrel d'un servidor web: se serveix el que es demana, no s'enumera el contingut.
2. r sense x: pots veure els noms però res més. ls dades/ llista a.txt, però ls -l dades/ falla a cada entrada —perquè llegir l'inode de cada fitxer exigeix travessar el directori— i mostra una línia d'interrogants, -????????? ? ? ? ? a.txt. Aquells interrogants són la firma inconfusible d'r sense x, una combinació inútil que gairebé sempre és un error.
3. Es pot esborrar un fitxer que no es pot llegir ni escriure. Aquest és el comportament que més sorprèn, i ara és evident:
$ ls -ld /tmp/proves ; ls -l /tmp/proves/secret.txt
drwxrwxr-x 2 joan joan 4096 set 1 15:20 /tmp/proves
-r-------- 1 root root 128 set 1 15:20 /tmp/proves/secret.txt
$ cat /tmp/proves/secret.txt
cat: ...: Permís denegat ← no el puc llegir
$ rm -f /tmp/proves/secret.txt ← però SÍ que el puc esborrar!Esborrar no toca el fitxer. unlink (04-02) elimina una entrada del directori i decrementa el comptador d'enllaços de l'inode. L'operació és una escriptura al directori, i per això el permís que es comprova és w al directori, no al fitxer. Els permisos del fitxer són completament irrellevants.
És la raó per la qual existeix el bit enganxós, i per la qual un directori escrivible per tothom sense aquell bit és una bomba.
4. Canviar el contingut d'un fitxer no requereix permís al directori, i a l'inrevés. Els dos permisos són independents i protegeixen coses diferents: el del fitxer protegeix el seu contingut, el del directori protegeix el seu nom.
| Operació | Permís necessari al fitxer | Permís necessari al directori |
|---|---|---|
| Llegir el contingut | r |
x a tot el camí |
| Modificar el contingut | w |
x a tot el camí |
| Crear un fitxer | — | w + x |
| Esborrar un fitxer | res | w + x |
| Reanomenar un fitxer | res | w + x a l'origen i a la destinació |
| Llistar el directori | — | r |
Entrar (cd) |
— | x |
Veure metadades (stat) |
— | x a tot el camí |
Notació simbòlica i octal: chmod, chown, chgrp
Els nou bits s'expressen de dues maneres equivalents. En octal, cada dígit codifica tres bits sumant 4 (llegir) + 2 (escriure) + 1 (executar/travessar): així, 6 és rw-, 5 és r-x i 7 és rwx. Els valors més habituals, amb el seu ús correcte:
| Octal | Simbòlic | Per a què |
|---|---|---|
| 644 | rw-r--r-- |
Fitxer públic de només lectura |
| 640 | rw-r----- |
Fitxer de dades d'un servei (Meteora) |
| 600 | rw------- |
Secrets: claus, contrasenyes |
| 755 | rwxr-xr-x |
Programa executable, directori públic |
| 750 | rwxr-x--- |
Directori d'un servei (Meteora) |
| 700 | rwx------ |
Directori privat |
| 2770 | rwxrws--- |
Directori compartit per un grup (setgid) |
| 1777 | rwxrwxrwt |
/tmp: escrivible per tothom, amb bit enganxós |
| 777 | rwxrwxrwx |
Mai. De cap manera. Vegeu l'apartat 11 |
Les ordres:
chmod 640 /etc/meteora/meteora.conf # octal: fixa els NOU bits de cop
chmod g+r,o-rwx fitxer # simbòlic: modifica NOMÉS el que s'indica
chmod -R u=rwX,g=rX,o= /var/lib/meteora # la X majúscula: vegeu a sota
chown meteora:meteora fitxer # canviar propietari I grup
chgrp analistes fitxer # només el grupTres precisions que eviten destrosses. L'octal és absolut i el simbòlic és relatiu: chmod 640 posa exactament aquells bits, mentre que chmod g+r n'afegeix un sense tocar els altres; en un chmod -R sobre un arbre, l'octal és perillós perquè aplica el mateix a fitxers i a directoris. La X majúscula és la solució a aquell problema, perquè significa «executar/travessar només si és un directori o si ja tenia algun x»: chmod -R u=rwX,g=rX,o= deixa els directoris navegables sense convertir en executables els fitxers de dades. I només el propietari i root poden executar chmod, mentre que només root pot executar chown per regalar un fitxer a un altre usuari: si un usuari normal ho pogués fer, esquivaria les quotes de disc i podria plantar fitxers comprometedors al compte d'un altre.
umask: com es calcula el permís final
Quan un programa crea un fitxer, passa un mode a open() (04-04) —típicament 0666— o a mkdir —típicament 0777—. Però el fitxer no acaba amb aquells permisos, perquè el nucli aplica una màscara del procés: la umask.
Permisos finals = mode sol·licitat AND (NOT umask)
A la pràctica, és més fàcil veure-ho com una resta de bits: la umask diu quins permisos treure.
$ umask
0027
Fitxer: mode sol·licitat 666 rw- rw- rw-
umask 027 --- -w- rwx (bits a treure)
RESULTAT 640 rw- r-- --- ✔
Directori: mode sol·licitat 777 rwx rwx rwx
umask 027 --- -w- rwx
RESULTAT 750 rwx r-x --- ✔Fixa't en el detall important: la umask mai no afegeix el bit d'execució. Els programes demanen 0666 per a fitxers regulars precisament perquè un fitxer de dades mai neixi executable, per molt permissiva que sigui la umask. L'x d'un programa l'hi posa després el compilador o l'instal·lador amb un chmod explícit.
Els valors habituals i el que produeixen:
| umask | Fitxers | Directoris | Ús |
|---|---|---|---|
022 |
644 | 755 | Per defecte a la majoria de distribucions. Tothom hi llegeix |
002 |
664 | 775 | Treball en grup: el grup també hi escriu |
027 |
640 | 750 | Serveis: el grup llegeix, els altres res |
077 |
600 | 700 | Màxima privadesa: només el propietari |
Meteora fa servir umask 027, i això explica tots els -rw-r----- i drwxr-x--- que portem veient des de 04-01. La justificació és exacta: l'ingestor crea 2026-09-01.dat i necessita que l'agregador i meteo-api —membres del grup meteora— el puguin llegir, però que cap altre usuari del sistema hi tingui accés. 027 dona precisament això, sense ni un sol chmod posterior.
Advertiment important: la umask per defecte és 022, que deixa els fitxers llegibles per tothom; amb ella, 2026-09-01.dat naixeria 644 i qualsevol usuari del servidor podria llegir les dades. La umask d'un servei es fixa amb UMask=0027 a la seva unitat de systemd (mòdul 7), no al .bashrc, perquè un dimoni no llegeix perfils d'intèrpret d'ordres. I s'hereta al fork (02-01), així que un script que la posi a 000 «perquè no hi hagi problemes» està creant fitxers 666 i directoris 777 sense que ningú se n'adoni.
Els bits especials: setuid, setgid i sticky
Els dotze bits de mode són nou de permisos més tres d'especials, que en octal formen un quart dígit al davant:
| Bit | Octal | On apareix a ls -l |
Valor |
|---|---|---|---|
| setuid | 4000 | s a la x de l'usuari |
-rwsr-xr-x |
| setgid | 2000 | s a la x del grup |
-rwxr-sr-x |
| sticky | 1000 | t a la x d'altres |
drwxrwxrwt |
Si el bit x corresponent no està posat, la lletra apareix en majúscula (S, T), i això gairebé sempre indica un error: un setuid sense execució no serveix de res.
setuid: com passwd escriu a /etc/shadow
El problema és concret. Un usuari normal ha de poder canviar la seva contrasenya, que és a /etc/shadow:
Només root hi escriu. Com pot aleshores un usuari qualsevol modificar-lo? La resposta és el bit setuid:
$ ls -l /usr/bin/passwd -rwsr-xr-x 1 root root 68208 mar 14 2026 /usr/bin/passwd ↑ la 's' és el bit setuid
El recorregut complet, pas a pas:
- L'usuari
joan(UID 1000) executa/usr/bin/passwd;forkcrea un fill amb UID real 1000 i UID efectiu 1000. execvecarrega el binari i veu el bit setuid. Aleshores fa el que és decisiu: posa l'UID efectiu al del propietari del fitxer, que és root (0).- El procés corre ara amb UID real 1000 (qui l'ha llançat) i UID efectiu 0 (amb quins privilegis actua). El nucli comprova els permisos amb l'efectiu.
passwdpot obrir/etc/shadowper escriure-hi. Però abans verifica acuradament la identitat: consulta l'UID real per saber qui és de debò, demana la contrasenya actual, i només permet canviar aquella línia.- En acabar, el procés mor i el privilegi desapareix amb ell.
| Concepte | Valor durant passwd |
Per a què serveix |
|---|---|---|
| UID real | 1000 (joan) |
Qui ets: comptabilitat, senyals, auditoria |
| UID efectiu | 0 (root) | Què pots fer: és el que comprova el nucli |
| UID desat | 0 | Permet abaixar i recuperar el privilegi |
Per què és perillós. Un binari setuid root és un programa que qualsevol pot executar amb privilegis de root, així que qualsevol fallada que tingui és una escalada de privilegis completa: un desbordament de memòria intermèdia, una injecció d'ordres, una variable d'entorn mal validada, un fitxer temporal amb TOCTOU (04-04), o simplement una opció que permeti executar un programa arbitrari. La història de la seguretat a UNIX és plena de vulnerabilitats en binaris setuid, i per això la regla és taxativa:
Com menys setuid, millor. Cada binari setuid root del sistema és una superfície d'atac, i cal poder justificar-los un per un.
Dos matisos que convé conèixer. El setuid s'ignora als scripts: Linux no el respecta en fitxers amb #!, perquè la finestra entre obrir el script i executar l'intèrpret permetia substituir-lo —un TOCTOU—. I nosuid en muntar (04-03) fa que el nucli ignori el bit en tot un volum, que és la raó de muntar així els volums de dades.
setgid: en fitxers i, sobretot, en directoris
En un fitxer executable, setgid és l'anàleg de setuid amb el grup: el GID efectiu passa a ser el del fitxer. Es fa servir per donar accés a un recurs de grup sense donar root; /usr/bin/wall, per exemple, és setgid tty.
En un directori fa una cosa completament diferent i molt útil:
Un directori amb setgid fa que tot el que es creï a dins n'hereti el grup, en lloc del grup primari de qui ho crea. I els subdirectoris hereten també el mateix bit setgid, així que la propietat es propaga per tot l'arbre.
Sense setgid, si l'usuari analista (grup primari analista) crea un fitxer a /var/lib/meteora/, aquell fitxer serà del grup analista i l'agregador —que és del grup meteora— no el podrà llegir. Amb setgid:
sudo chgrp meteora /var/lib/meteora/lectures
sudo chmod 2750 /var/lib/meteora/lectures # el 2 és setgid
$ ls -ld /var/lib/meteora/lectures
drwxr-s--- 3 meteora meteora 4096 set 1 15:40 /var/lib/meteora/lectures
↑ la 's' al grupAra qualsevol fitxer creat allà dins pertanyerà al grup meteora, el creï qui el creï. És el mecanisme estàndard per a directoris compartits per un equip, i garanteix la coherència de grups sense dependre de la disciplina de cada usuari.
El bit enganxós i el cas de /tmp
Recorda la conseqüència 3 de l'apartat 2: w en un directori permet esborrar qualsevol entrada, siguin quins siguin els permisos del fitxer. Ara aplica-ho a /tmp, que per definició ha de ser escrivible per tothom:
Sense la t, qualsevol usuari podria esborrar els fitxers temporals de qualsevol altre, o pitjor: esborrar el fitxer de sessió d'un servei i substituir-lo per un de propi, que és una via directa a la suplantació.
El bit enganxós (sticky bit) afegeix una restricció als directoris:
En un directori amb sticky, només poden esborrar o reanomenar una entrada: el propietari del fitxer, el propietari del directori, o root. El permís
wdel directori deixa de ser suficient.
S'aplica a tot directori escrivible per diversos usuaris: /tmp, /var/tmp, /dev/shm i qualsevol zona d'intercanvi compartida. I cal saber una cosa més: el sticky bit en fitxers no fa res a Linux modern. Antigament indicava «mantén aquest executable a la swap»; avui s'ignora.
Com comprova el nucli un accés, pas a pas
Quan meteo-api executa open("/var/lib/meteora/lectures/2026-08-31.dat", O_RDONLY), el nucli fa això:
graph TB
A["open() del camí complet"] --> B["Per a CADA directori del camí:<br/>/, var, lib, meteora, lectures<br/><b>tinc permís x?</b>"]
B -->|"No en algun"| Z["EACCES: Permís denegat"]
B -->|"Sí en tots"| C{"UID efectiu == 0?"}
C -->|Sí| Y["Concedit (gairebé sempre)"]
C -->|No| D{"UID efectiu ==<br/>UID del fitxer?"}
D -->|Sí| E["Fer servir NOMÉS els bits d'USUARI<br/>i decidir"]
D -->|No| F{"GID efectiu o algun grup<br/>suplementari == GID del fitxer?"}
F -->|Sí| G["Fer servir NOMÉS els bits de GRUP<br/>i decidir"]
F -->|No| H["Fer servir els bits d'ALTRES<br/>i decidir"]
Els cinc punts que cal retenir d'aquest diagrama:
1. El permís x es comprova a TOTS els directoris del camí. És el que fa la resolució de camins de 04-02, component a component. Si a /var/lib/meteora li falta l'x per a la teva classe, tant se val que el fitxer final sigui rw-rw-rw-: no hi arribes. És la font número u dels «Permís denegat» incomprensibles, i es diagnostica en un segon amb namei -l, que mostra els permisos de cada component:
$ namei -l /var/lib/meteora/lectures/2026-08-31.dat drwxr-xr-x root root / drwxr-xr-x root root var drwxr-xr-x root root lib drwxr-x--- meteora meteora meteora ← aquí es decideix tot drwxr-s--- meteora meteora lectures -rw-r----- meteora meteora 2026-08-31.dat
Quan algú no pot accedir a un fitxer, aquesta és la primera ordre que cal executar.
2. Les classes són excloents i l'ordre és fix. Propietari, després grup, després altres: la primera coincidència decideix i no es mira més. D'aquí el fitxer ----r--r-- que el propietari no pot llegir.
3. Compten tots els grups suplementaris. Un usuari pertany a un grup primari i a diversos de secundaris (id els mostra tots), i qualsevol serveix per entrar a la classe de grup. Avís important: els grups es llegeixen en iniciar sessió, així que un usermod -aG no afecta les sessions obertes ni els serveis ja arrencats.
4. Root se salta gairebé tot. L'UID efectiu 0 concedeix gairebé qualsevol accés, amb dues excepcions notables: no pot executar un fitxer sense cap bit x, i no pot escriure en un fitxer immutable (apartat 8).
5. Es comprova a open(), no a read(). Els permisos es verifiquen una sola vegada, en obrir. Si després algú executa chmod 000, el procés que ja el té obert continua llegint sense problemes, perquè el seu descriptor apunta a l'entrada de la taula de fitxers oberts (04-04) i no al nom ni al mode. Per tallar l'accés cal fer que tanqui el descriptor.
Llistes de control d'accés POSIX
El model de tres classes té un límit estructural: només permet expressar permisos per a un usuari, un grup i la resta. Un cas real de Meteora el desborda de seguida: cal donar accés de només lectura a /var/lib/meteora/lectures a la usuària nuria, de l'equip d'anàlisi, sense ficar-la al grup meteora —que li donaria accés a tota la resta del servei, inclosa la configuració— i sense obrir els permisos d'«altres».
Amb els nou bits no es pot. Amb ACL POSIX, sí:
# Donar a nuria lectura i travessia al directori, i lectura als fitxers
sudo setfacl -m u:nuria:rx /var/lib/meteora/lectures
sudo setfacl -R -m u:nuria:r /var/lib/meteora/lectures/*.dat
# I que hereti el permís als fitxers FUTURS (ACL «per defecte»)
sudo setfacl -d -m u:nuria:r /var/lib/meteora/lecturesEl resultat:
$ ls -ld /var/lib/meteora/lectures
drwxr-s---+ 3 meteora meteora 4096 set 1 15:40 /var/lib/meteora/lectures
↑ AQUEST '+' significa «hi ha una ACL estesa»
$ getfacl /var/lib/meteora/lectures
# file: var/lib/meteora/lectures
# owner: meteora
# group: meteora
# flags: -s-
user::rwx
user:nuria:r-x ← l'entrada nova
group::r-x
mask::r-x ← el SOSTRE de les entrades anomenades
other::---
default:user:nuria:r-- ← herència per al que es creï desprésEls elements: user::rwx i group::r-x són el propietari i el grup propietari, equivalents als bits u i g de sempre; user:nuria:r-x i group:analistes:r-- són entrades anomenades, que donen permisos a un usuari o grup concret; other::--- són els altres; default:... és el que heretaran els fitxers creats aquí; i mask::r-x és la màscara, el màxim efectiu de totes les entrades anomenades i del grup.
La màscara és la part que confon tothom, i mereix una explicació clara. Els permisos efectius de qualsevol entrada anomenada són la intersecció d'aquella entrada amb la màscara. Si la màscara és r-- i l'entrada de nuria és rwx, nuria obté només r--, i getfacl ho assenyala explícitament:
Existeix perquè ls -l només té nou bits per mostrar. Quan hi ha una ACL, els bits de grup que mostra ls -l són en realitat la màscara, no els permisos del grup propietari. És un compromís deliberat perquè les eines antigues vegin alguna cosa raonable, i d'aquí surt el parany pràctic:
Un
chmod g-wsobre un fitxer amb ACL modifica la MÀSCARA, i per tant retalla de cop els permisos efectius de totes les entrades anomenades. És la manera més habitual de trencar una ACL sense voler.
La regla és: quan un fitxer té + a ls -l, gestiona'n els permisos amb setfacl, no amb chmod.
Ordres essencials:
getfacl fitxer # veure l'ACL completa
setfacl -m u:nuria:r fitxer # afegir o modificar una entrada
setfacl -x u:nuria fitxer # eliminar una entrada
setfacl -b fitxer # eliminar TOTA l'ACL
setfacl -d -m u:nuria:r directori # ACL per defecte (herència)
setfacl -R -m u:nuria:rX directori # recursiu, amb X majúsculaDos advertiments operatius: les ACL requereixen que el sistema de fitxers les admeti —ext4 i XFS sí, i a les distribucions actuals estan activades per defecte—; i cal verificar que les eines de còpia les preservin, perquè cp -a, rsync -A i tar --acls sí que ho fan però un cp normal les perd en silenci, cosa que produeix fallades de permisos misterioses després d'una restauració.
Atributs estesos i atributs de fitxer
A més dels permisos, un inode pot portar dues coses més.
Atributs estesos (xattr): parells clau-valor arbitraris organitzats en quatre espais de noms —system.* per a les ACL i l'ús intern del nucli, security.* per a les etiquetes de SELinux i les capabilities, trusted.* per a ús privilegiat, i user.* per a metadades d'aplicació, escrivible per qualsevol amb permís w—. Es manipulen amb setfattr -n user.origen -v "estacio-42" fitxer i getfattr -d fitxer. Les ACL de l'apartat anterior són atributs estesos (system.posix_acl_access), igual que les etiquetes de SELinux i AppArmor del mòdul 5.
Atributs de fitxer (chattr): indicadors a l'inode que modifiquen el comportament del sistema de fitxers. Són molt més potents del que sembla, perquè alguns vinculen fins i tot root:
| Atribut | Efecte |
|---|---|
i (immutable) |
Ningú, ni root, no pot modificar, esborrar, reanomenar ni enllaçar el fitxer |
a (append-only) |
Només s'hi pot afegir al final: no es pot modificar ni truncar |
A (no atime) |
No actualitzar l'atime d'aquest fitxer (04-01) |
C (no CoW) |
Desactiva la còpia en escriure a Btrfs (04-05) |
j (data journalling) |
Aquest fitxer fa servir data=journal encara que el volum no (04-05) |
Els dos primers són els interessants:
# La configuració amb secrets: que ningú no la toqui per accident
sudo chattr +i /etc/meteora/meteora.conf
sudo lsattr /etc/meteora/meteora.conf
----i---------e------- /etc/meteora/meteora.conf
$ sudo rm /etc/meteora/meteora.conf
rm: no es pot esborrar '...': Operació no permesa ← ni tan sols root!
# Registre a prova de manipulació: només s'hi pot afegir
sudo chattr +a /var/log/meteora/meteo-api.log
$ sudo truncate -s 0 /var/log/meteora/meteo-api.log
truncate: no es pot obrir ... : Operació no permesa
$ echo "linia" | sudo tee -a /var/log/meteora/meteo-api.log ← afegir SÍ que funciona+a és especialment valuós per als registres de seguretat, perquè un atacant que aconsegueixi root no pot esborrar les seves petjades del registre: només pot continuar afegint-hi. És un complement natural de l'O_APPEND de 04-04, amb la diferència que aquell és un acord del programa i aquest l'imposa el sistema de fitxers.
Ara la lletra petita, per no crear falsa seguretat. Treure l'atribut requereix la capacitat CAP_LINUX_IMMUTABLE, que root té: chattr -i el desactiva en un segon, i un atacant amb root pot fer-ho. El seu valor real és doble: evita errors propis —un rm -rf mal escrit, un script de desplegament defectuós— i obliga a un pas deliberat i auditable abans de tocar alguna cosa crítica. No és una barrera contra un atacant decidit; és una assegurança contra accidents i una traça als registres, perquè l'aïllament fort davant de root és cosa de capabilities, SELinux i AppArmor, que es veuen al mòdul 5. I una conseqüència pràctica que mossega tothom: un fitxer amb +i trenca les actualitzacions automàtiques del gestor de paquets, de manera confusa. Documenta sempre què has marcat.
Comparació amb el model de Windows
Convé conèixer l'altre model, perquè els conceptes es creuen constantment en entorns mixtos:
| UNIX / Linux | Windows (NTFS) | |
|---|---|---|
| Unitat de permís | 9 bits + 3 d'especials | Llista d'ACE (entrades de control d'accés) |
| Identitat | UID i GID numèrics | SID (identificador de seguretat) |
| Destinataris | Un usuari, un grup, la resta | Qualsevol nombre d'usuaris i grups |
| Granularitat | 3 permisos (r, w, x) |
13 permisos (llegir dades, escriure atributs, esborrar, prendre possessió...) |
| Denegació explícita | No existeix | Sí, i té prioritat sobre qualsevol permís |
| Herència | Només default de les ACL i setgid |
Nativa i automàtica, amb propagació |
| Esborrar un fitxer | w al directori |
Permís Delete al fitxer o Delete child a la carpeta |
| Permisos efectius | Es dedueixen a ull | Eina específica per calcular-los |
| L'administrador se salta tot | Sí (root) | No del tot: pot prendre possessió i després donar-se permisos |
| Complexitat | Baixa | Alta |
La diferència més important per a qui ve de Windows és la semàntica de l'esborrat: allà es controla amb un permís del fitxer, aquí amb el permís w del directori. És la causa de la majoria de les sorpreses en migrar, i explica per què el bit enganxós és necessari a UNIX i no té equivalent directe a Windows. L'altra és la denegació explícita: a Windows pots dir «tots els del grup Vendes poden llegir, excepte en Joan», mentre que a UNIX només es concedeixen permisos i l'única manera d'excloure algú és no incloure'l en cap classe que en tingui.
El judici equilibrat: el model de Windows és més expressiu i el d'UNIX més comprensible. I en seguretat, el que és comprensible té un valor propi: una ACL de Windows amb vint entrades heretades, denegacions i grups imbricats pot ser tan difícil d'auditar que ningú no sàpiga realment qui hi té accés. Els nou bits d'UNIX es llegeixen d'un cop d'ull.
Els permisos de Meteora, justificats
Ara, l'aplicació completa. Aquests són els permisos exactes de tot el que compon el servei, amb el perquè de cada decisió.
| Camí | Propietari:grup | Mode | Justificació |
|---|---|---|---|
/var/lib/meteora/ |
meteora:meteora |
2750 | El servei el controla; el grup hi entra però no hi escriu; setgid per heretar el grup; ningú més no hi entra |
/var/lib/meteora/lectures/ |
meteora:meteora |
2750 | Igual: l'ingestor (propietari) escriu, l'agregador (grup) llegeix |
.../lectures/*.dat |
meteora:meteora |
0640 | L'ingestor escriu, el grup llegeix, ningú més. Els crea la umask 027 |
/etc/meteora/ |
root:meteora |
0750 | De root: el servei no ha de poder modificar la seva pròpia configuració |
/etc/meteora/meteora.conf |
root:meteora |
0640 | Root l'edita; el servei la llegeix pel grup. Sense secrets a dins |
/etc/meteora/secrets.conf |
root:meteora |
0640 | Claus d'API i de base de dades, en un fitxer a part |
/var/log/meteora/ |
meteora:adm |
2750 | El servei escriu; el grup adm llegeix els registres sense ser del servei |
/var/log/meteora/*.log |
meteora:adm |
0640 | El mateix, i +a als d'auditoria |
/usr/bin/meteo-api |
root:root |
0755 | De root, no del servei: el servei no pot modificar el seu binari |
/run/meteora/ |
meteora:meteora |
0750 | Sòcols i FIFO. En tmpfs, es recrea en arrencar (04-02) |
/run/meteora/api.sock |
meteora:www-data |
0660 | El servidor web s'hi connecta pel grup |
Les ordres completes:
# --- Dades ---
sudo chown -R meteora:meteora /var/lib/meteora
sudo find /var/lib/meteora -type d -exec chmod 2750 {} + # setgid als directoris
sudo find /var/lib/meteora -type f -exec chmod 0640 {} + # 640 als fitxers
# --- Configuració i binari: de ROOT, no del servei ---
sudo chown root:meteora /etc/meteora /etc/meteora/*.conf
sudo chmod 0750 /etc/meteora
sudo chmod 0640 /etc/meteora/meteora.conf /etc/meteora/secrets.conf
sudo chattr +i /etc/meteora/secrets.conf # immutable: canvi deliberat
sudo chown root:root /usr/bin/meteo-api && sudo chmod 0755 /usr/bin/meteo-api
# --- Registres: grup adm, i auditoria només-afegir ---
sudo chown -R meteora:adm /var/log/meteora
sudo chmod 2750 /var/log/meteora && sudo chmod 0640 /var/log/meteora/*.log
sudo chattr +a /var/log/meteora/auditoria.log
# --- Accés de només lectura per a l'equip d'anàlisi ---
sudo setfacl -m u:nuria:rx /var/lib/meteora /var/lib/meteora/lectures
sudo setfacl -R -m u:nuria:r /var/lib/meteora/lectures
sudo setfacl -d -m u:nuria:r /var/lib/meteora/lectures # herènciaLes quatre decisions que de debò importen aquí, perquè són les que la gent fa malament:
1. La configuració pertany a root, no al servei. És l'aplicació directa del principi de mínim privilegi: si meteora fos el propietari de meteora.conf, un atacant que comprometés meteo-api podria reescriure la configuració —canviar camins, desactivar la validació, apuntar a un altre servidor— i esperar el reinici. Sent de root amb grup meteora i mode 640, el servei llegeix però no escriu. El mateix amb el binari: meteora no pot substituir /usr/bin/meteo-api per un troià.
2. Els secrets van en un fitxer a part. No perquè 640 no basti, sinó perquè separa dos cicles de vida: meteora.conf es pot versionar a Git, compartir en una incidència i copiar entre entorns; secrets.conf no. Barrejar-los garanteix que les claus acabaran en un repositori o en un tiquet. Es fa servir 0640 amb grup meteora —i no 0600— perquè el servei l'ha de llegir en arrencar.
3. Els registres tenen grup adm, no meteora. Així els administradors i el monitoratge llegeixen els registres sense pertànyer al grup del servei, que els donaria accés també a les dades i a la configuració. És separació de privilegis, no burocràcia.
4. Cap binari setuid. meteo-api escolta al port 8080 i no al 80, precisament per no necessitar privilegis. Si hagués de fer servir un port per sota de 1024, la solució correcta no és setuid root, sinó AmbientCapabilities=CAP_NET_BIND_SERVICE a la unitat de systemd, o un servidor intermediari invers al davant. Tornarem a les capabilities al mòdul 5.
Errors greus i com auditar-los
Els quatre errors que més mal fan, i l'ordre que els troba.
chmod 777. És l'error emblemàtic. Significa «qualsevol usuari del sistema pot llegir, modificar i esborrar això», i a més marca els fitxers com a executables. Es posa gairebé sempre per sortir del pas davant d'un «permís denegat» que no s'ha entès, i deixa el forat obert per sempre.
# Fitxers i directoris escrivibles per QUALSEVOL
sudo find / -xdev \( -type f -o -type d \) -perm -0002 \
! -path '/proc/*' ! -path '/sys/*' -ls 2>/dev/null-perm -0002 busca el bit d'escriptura per a «altres». Els únics resultats legítims són directoris amb bit enganxós (/tmp, /var/tmp, /dev/shm); tota la resta cal revisar-la. Davant d'un «permís denegat», el reflex correcte és namei -l, no chmod 777.
Secrets llegibles per tothom. Una clau privada amb permís de lectura per a «altres» és una clau compromesa; de fet, ssh es nega a fer servir una clau massa oberta, precisament per això.
sudo find /etc -type f \( -name '*secret*' -o -name '*.key' -o -name '*.pem' \
-o -name '*credential*' -o -name '*password*' \) -perm -0004 -lschmod -R sobre un arbre mixt. Aquest mereix explicació perquè sembla innocu:
El segon és el cas instructiu. Aplica 644 a tot, inclosos els directoris, que es queden sense el bit x: ningú no els pot travessar, i tot l'arbre es torna inaccessible —l'efecte «interrogants» de l'apartat 2—. La manera correcta fa servir la X majúscula o separa per tipus:
chmod -R u=rwX,g=rX,o= /var/lib/meteora # opció 1: X majúscula
find /var/lib/meteora -type d -exec chmod 2750 {} + # opció 2: per tipus
find /var/lib/meteora -type f -exec chmod 0640 {} +Binaris setuid innecessaris. L'inventari cal revisar-lo i justificar-lo entrada per entrada. Una llista sanejada en té entre 10 i 20: passwd, su, sudo, mount, umount, ping, chsh, newgrp... Qualsevol binari setuid a /home, /tmp, /var o en un directori d'aplicació és una alarma vermella, i probablement una porta del darrere. Guardar una llista de referència i comparar-la és una detecció barata i eficaç:
sudo find / -xdev \( -perm -4000 -o -perm -2000 \) -type f 2>/dev/null | sort \
> /root/setuid.actual
diff /root/setuid.referencia /root/setuid.actual # n'ha aparegut algun de nou?Altres dues comprovacions que convé automatitzar són find / -xdev \\( -nouser -o -nogroup \\) i find / -xdev -type f -perm -0002 -perm -0111. Els fitxers orfes —l'UID dels quals no correspon a cap usuari— apareixen després d'esborrar un compte i són perillosos perquè el següent usuari que rebi aquell UID n'heretarà la propietat. I un fitxer alhora escrivible per tothom i executable és un vector d'atac de manual: qualsevol en substitueix el contingut i espera que algú l'executi.
Errors Habituals i Consells
Respondre a un «permís denegat» amb chmod 777. Gairebé sempre el problema és una x que falta en un directori del camí. Executa namei -l primer: et dirà en quin component exacte es trenca.
Aplicar chmod -R amb un valor octal. Tracta igual els fitxers i els directoris, i deixa els directoris sense x o els fitxers amb x. Fes servir u=rwX,g=rX,o= o separa amb find -type d i find -type f.
Creure que treure r i w a un fitxer impedeix esborrar-lo. Esborrar depèn del permís w al directori. Si vols protegir un fitxer de debò, protegeix el directori o fes servir chattr +i.
Oblidar que els grups es llegeixen en iniciar sessió. Després d'un usermod -aG, ni la teva sessió oberta ni els serveis en marxa veuen el grup nou. Reinicia la sessió o el servei.
Fer servir chmod sobre un fitxer amb ACL. Modifica la màscara i retalla els permisos efectius de totes les entrades anomenades: si veus un + a ls -l, fes servir setfacl. I en copiar, preserva les ACL amb cp -a, rsync -A o tar --acls, perquè un cp a seques les perd en silenci.
Deixar que un servei sigui propietari de la seva configuració i del seu binari. Si el comprometen, pot reescriure tots dos i persistir. Configuració i binari, de root; el servei només llegeix.
Posar setuid a un programa propi «perquè funcioni». Un binari setuid root és una escalada de privilegis esperant una fallada. Gairebé sempre hi ha una alternativa: una capability concreta, un grup, un sòcol amb permisos, o un servei separat.
Consell: namei -l i getfacl són les teves dues eines de diagnòstic —la primera recorre el camí component a component, la segona revela les ACL que ls -l només insinua amb un +— i audita periòdicament contra una línia base: la llista de setuid, els escrivibles per tothom i els orfes detecten tant errors propis com intrusions.
Exercicis
Exercici 1: els permisos de directori, demostrats
Crea una estructura de proves i demostra empíricament, mostrant la sortida de cada ordre: (a) que amb x però sense r en un directori pots llegir un fitxer el nom del qual coneixes però no llistar-lo; (b) que amb r però sense x obtens els interrogants d'ls -l; (c) que pots esborrar un fitxer d'un altre usuari, sense permís de lectura sobre ell, si tens w al directori; (d) que en activar el bit enganxós ja no pots. Explica a cada cas quin permís es comprova i sobre quin objecte.
Exercici 2: accés de només lectura sense tocar el grup
La usuària nuria necessita llegir tots els fitxers de /var/lib/meteora/lectures, inclosos els que es creïn en el futur, sense pertànyer al grup meteora i sense que els permisos d'«altres» canviïn. Implementa la solució completa amb ACL, verifica que funciona, comprova què passa després amb un chmod g-w sobre el directori i explica per què. Compara-ho amb les dues alternatives dolentes —ficar-la al grup meteora, o posar o+r— indicant exactament a què tindria accés de més en cada cas.
Exercici 3: auditoria de permisos d'un servidor
Escriu un script d'auditoria que revisi: binaris setuid i setgid comparats amb una llista de referència; fitxers i directoris escrivibles per tothom que no tinguin bit enganxós; secrets a /etc llegibles per altres; fitxers orfes; i fitxers simultàniament escrivibles per tothom i executables. Per a cada troballa ha d'indicar el risc concret i la correcció proposada. Executa'l a la teva màquina i interpreta els resultats: digues quins són legítims i per què.
Solucions
Solució 1
mkdir -p /tmp/lab && cd /tmp/lab
mkdir prova && echo "contingut secret" > prova/dada.txt
chmod 0644 prova/dada.txt(a) x sense r — el directori fosc:
chmod 0711 prova # rwx propietari, --x altres
sudo -u nobody ls prova # ls: no es pot obrir: Permís denegat
sudo -u nobody cat prova/dada.txt # contingut secret ← SÍ que funciona!ls necessita r per llegir la llista de noms del directori, i no el té. cat només necessita x per travessar-lo fins a l'inode d'un nom que ja coneix. Es comprova r sobre el directori en el primer cas i x sobre el directori més r sobre el fitxer en el segon.
(b) r sense x:
chmod 0644 prova
sudo -u nobody ls prova # dada.txt ← veu el nom
sudo -u nobody ls -l prova # -????????? ? ? ? ← no pot llegir l'inode
sudo -u nobody cat prova/dada.txt # Permís denegatls llegeix la llista i funciona. ls -l necessita travessar el directori per llegir l'inode de cada entrada, i sense x no pot: d'aquí els interrogants. cat falla per la mateixa raó.
(c) Esborrar sense poder llegir, i (d) amb bit enganxós:
chmod 0777 prova # w per a tothom, SENSE sticky
sudo chown root:root prova/dada.txt && sudo chmod 0600 prova/dada.txt
sudo -u nobody cat prova/dada.txt # Permís denegat
sudo -u nobody rm -f prova/dada.txt # SENSE ERROR! (c)
echo x | sudo tee prova/dada.txt >/dev/null && sudo chmod 0600 prova/dada.txt
chmod 1777 prova # ← l'1 és el sticky
sudo -u nobody rm -f prova/dada.txt # Operació no permesa (d)A (c), nobody no pot llegir un fitxer de root amb mode 600 però sí que el pot esborrar, perquè unlink és una escriptura al directori i hi té w: els permisos i el propietari del fitxer no hi intervenen en absolut.
A (d), amb sticky, només el propietari del fitxer (root), el propietari del directori o root poden esborrar. Fixa't en el detall: l'error ja no és EACCES («Permís denegat») sinó EPERM («Operació no permesa»), perquè la comprovació que falla no és la del bit w sinó la regla addicional del sticky. És exactament el mecanisme que protegeix /tmp.
Solució 2
# 1. Accés al directori (r per llistar + x per travessar)
sudo setfacl -m u:nuria:rx /var/lib/meteora
sudo setfacl -m u:nuria:rx /var/lib/meteora/lectures
# 2. Lectura dels fitxers existents
sudo setfacl -R -m u:nuria:r /var/lib/meteora/lectures
# 3. Herència per als FUTURS fitxers que creï l'ingestor
sudo setfacl -d -m u:nuria:r /var/lib/meteora/lectures
# 4. Verificació
sudo -u nuria cat /var/lib/meteora/lectures/2026-08-31.dat > /dev/null && echo OK
sudo -u nuria ls /var/lib/meteora/lectures
sudo -u nuria cat /etc/meteora/secrets.conf # ha de continuar fallant ✔
getfacl /var/lib/meteora/lecturesEl pas 3 és el que més s'oblida: sense l'ACL per defecte, nuria llegiria els fitxers d'avui però no els de demà, i la fallada apareixeria una setmana després sense causa aparent.
Què passa amb chmod g-w:
sudo chmod g-w /var/lib/meteora/lectures
getfacl /var/lib/meteora/lectures
# user:nuria:r-x #effective:r-x ← si la màscara conserva r i xchmod sobre un fitxer amb ACL modifica la màscara. Si el chmod retallés els bits r o x de la classe de grup, la màscara baixaria i els permisos efectius de nuria es retallarien amb ella, encara que la seva entrada continuï dient r-x. Es restaura amb setfacl -m m::rx. La regla operativa: quan ls -l mostra +, gestiona els permisos amb setfacl.
Les dues alternatives dolentes:
| Alternativa | A què donaria accés de més |
|---|---|
usermod -aG meteora nuria |
A tot el del grup meteora: /etc/meteora/meteora.conf, /etc/meteora/secrets.conf amb les claus d'API, /run/meteora/api.sock i qualsevol fitxer futur del servei. I de manera permanent i transitiva: qualsevol cosa que es creï amb grup meteora |
chmod o+r als .dat |
A tots els usuaris del sistema, inclosos els comptes de servei d'altres aplicacions i qualsevol procés compromès. Converteix un accés nominal i auditable en un d'universal |
L'ACL dona exactament l'accés demanat, a la persona demanada, sobre els fitxers demanats, i queda documentat a getfacl: és el principi de mínim privilegi aplicat amb l'eina adequada.
Solució 3
#!/bin/bash
# auditoria-permisos.sh — executar com a root
REF=/root/setuid.referencia
echo "=== AUDITORIA DE PERMISOS — $(hostname) — $(date +%F) ==="
echo -e "\n[1] Binaris setuid/setgid nous respecte a la referència"
find / -xdev \( -perm -4000 -o -perm -2000 \) -type f 2>/dev/null | sort > /tmp/su.now
if [ -f "$REF" ]; then
diff "$REF" /tmp/su.now | grep '^>' && \
echo " RISC: binari privilegiat NOU. Verificar-ne l'origen; si no es justifica," \
"chmod u-s i analitzar el sistema a la recerca de compromís."
else
cp /tmp/su.now "$REF"; echo " Referència creada amb $(wc -l < "$REF") entrades."
fi
echo -e "\n[2] Escrivibles per TOTHOM sense bit enganxós"
find / -xdev \( -type f -o \( -type d ! -perm -1000 \) \) -perm -0002 \
! -path '/proc/*' ! -path '/sys/*' -ls 2>/dev/null
echo " RISC: qualsevol usuari pot modificar o esborrar. Corregir amb chmod o-w."
echo -e "\n[3] Possibles secrets llegibles per altres a /etc"
find /etc -type f \( -name '*.key' -o -name '*.pem' -o -name '*secret*' \
-o -name '*credential*' \) -perm -0004 -ls 2>/dev/null
echo " RISC: credencial exposada. Corregir amb chmod 600 i ROTAR la clau."
echo -e "\n[4] Fitxers orfes (UID/GID sense usuari)"
find / -xdev \( -nouser -o -nogroup \) ! -path '/proc/*' -ls 2>/dev/null
echo " RISC: el proper usuari que rebi aquell UID n'heretarà la propietat."
echo -e "\n[5] Escrivibles per tothom I executables"
find / -xdev -type f -perm -0002 -perm -0111 ! -path '/proc/*' -ls 2>/dev/null
echo " RISC CRÍTIC: qualsevol substitueix el contingut i espera que s'executi."Interpretació dels resultats en una màquina sana. A [1] apareixen entre 10 i 20 binaris, tots a /usr/bin, /usr/sbin, /usr/lib o /bin —passwd, su, sudo, mount, umount, chsh, newgrp, pkexec, ping, i setgid crontab, wall, write—, i tots són legítims perquè necessiten privilegis que un usuari normal no té: modificar /etc/shadow, muntar sistemes de fitxers, obrir sòcols ICMP. Un setuid fora d'aquells directoris —a /home, /tmp, /opt o /var— és una alarma vermella.
A [2] l'esperable és cap resultat, perquè /tmp, /var/tmp i /dev/shm queden exclosos pel filtre ! -perm -1000; si hi apareix alguna cosa, gairebé sempre és un chmod 777 històric. A [3] ha d'estar buit, i qualsevol resultat exigeix dues accions i no una: corregir el permís i rotar la credencial, perquè cal assumir que ha estat llegida. A [4] sol haver-n'hi algun després de desinstal·lar programari o esborrar comptes, i es corregeix amb chown o esborrant el fitxer. I [5] ha d'estar buit sempre: és la combinació més perillosa de totes.
El que converteix això en una eina útil és executar-ho periòdicament i comparar-ho amb l'execució anterior: les troballes noves, i no la llista completa, són el que cal mirar. Automatitzar aquestes comprovacions i integrar-les amb l'auditoria del sistema és el tema d'Auditoria, Registres i Resposta a Incidents.
Conclusió
El model de permisos d'UNIX són dotze bits i dos números a l'inode, amb tres classes —usuari, grup i altres— que són excloents i s'avaluen en aquell ordre, d'aquí que un fitxer ----r--r-- no el pugui llegir el seu propi propietari. Els bits r, w i x signifiquen coses diferents en fitxers i en directoris, i aquella diferència deixa de ser arbitrària tan bon punt recordes que un directori és un fitxer amb una llista de parells (nom, inode): r és llegir aquella llista, w és afegir o treure entrades i x és travessar. D'aquí les quatre conseqüències: el directori fosc 0711, els interrogants d'r sense x, i sobretot que es pot esborrar un fitxer que no es pot llegir, perquè unlink escriu al directori i no toca el fitxer. Aquesta última és la raó que existeixi el bit enganxós, sense el qual /tmp seria inutilitzable.
Els permisos s'expressen en octal o simbòlic, i la diferència importa: l'octal és absolut i el simbòlic relatiu, així que un chmod -R 644 deixa els directoris sense x i trenca l'arbre sencer. La manera correcta de recórrer un arbre mixt és la X majúscula o separar amb find -type d i -type f. La umask decideix amb quins permisos neixen els fitxers restant bits del mode sol·licitat —666 per a fitxers, 777 per a directoris—, i mai no hi afegeix l'x: la 027 de Meteora és exactament el que produeix els 0640 i 0750 que portem veient tot el mòdul, enfront de la 022 per defecte que els deixaria llegibles per tot el sistema.
Els tres bits especials resolen tres problemes concrets. setuid explica com passwd escriu a /etc/shadow: execve posa l'UID efectiu al del propietari del binari, i deixa l'UID real per saber qui és de debò; és potentíssim i per això perillós, i nosuid en muntar (04-03) el desactiva per volum. setgid en un directori fa que tot el que es creï a dins n'hereti el grup i propaga el mateix bit als subdirectoris, que és el que garanteix la coherència de grup a /var/lib/meteora. I el sticky limita l'esborrat al propietari del fitxer.
La comprovació del nucli té cinc propietats que cal recordar: l'x s'exigeix a tots els directoris del camí —namei -l és el diagnòstic—, les classes són excloents, compten tots els grups suplementaris però només els que hi havia en iniciar sessió, root se salta gairebé tot llevat de l'execució sense cap x i l'atribut immutable, i es comprova a open(), de manera que un chmod 000 no talla qui ja té el fitxer obert. Quan les tres classes no basten, les ACL POSIX donen permisos a usuaris i grups concrets, amb ACL per defecte per a l'herència i una màscara que actua de sostre —i que un chmod descuidat retalla, trencant l'ACL sense avisar—. Els atributs chattr +i i +a afegeixen una capa que vincula fins i tot root: la primera evita accidents sobre fitxers crítics i la segona fa un registre al qual només es pot afegir. Enfront del model de Windows, més expressiu amb les seves ACE, la seva herència nativa i les seves denegacions explícites, el d'UNIX guanya en una cosa que en seguretat val molt: es llegeix d'un cop d'ull.
Aplicat a Meteora, tot es redueix a quatre decisions: dades 2750/0640 amb meteora:meteora; configuració i binari de root, perquè un servei compromès no es pugui reescriure a si mateix; secrets en un fitxer a part amb +i; registres amb grup adm per separar qui administra de qui executa; i cap binari setuid. I les auditories amb find —setuid contra una llista de referència, escrivibles per tothom sense sticky, secrets llegibles, orfes i escrivibles-i-executables— converteixen aquelles decisions en alguna cosa verificable en lloc d'en una intenció.
Tancament del mòdul 4
Val la pena mirar el recorregut complet, perquè el mòdul ha tingut un fil molt clar.
Vam començar amb l'abstracció (04-01): un fitxer és una seqüència de bytes amb nom, mida i propietari que el sistema col·loca on vol, i aquella idea resol de cop els set problemes que tindria qualsevol aplicació sobre el vector de blocs cru del mòdul 2, amb la mateixa estratègia que la memòria virtual. Vam veure els set tipus d'UNIX, vam disseccionar l'inode —i la seva absència més important, el nom—, vam recórrer la disposició física amb superbloc, mapes de bits i taula d'inodes, vam calcular el compromís de la mida de bloc i vam triar ext4 per a /var/lib/meteora amb arguments i no per costum.
El nom, que faltava, va arribar a 04-02: un directori és un fitxer amb parells (nom, inode), l'organització en graf acíclic explica per què no es permeten enllaços durs a directoris, la resolució de camins costa onze accessos en fred i gairebé cap amb la memòria cau de dentries, i unlink treu un nom en lloc d'esborrar un fitxer, d'on surten els enllaços durs, el fitxer esborrat que continua ocupant 17 GB i el truncate -s 0 /proc/<pid>/fd/N que ho cura.
Després vam acoblar l'arbre (04-03): particions GPT, LVM amb les seves instantànies per copiar en calent, i el muntatge pas a pas, amb UUID= en un fstab validat i les opcions nosuid,nodev,noexec que tanquen tres vectors pel preu de tres paraules. I sota de tot, el VFS amb els seus quatre objectes, que és el que permet que el mateix open() funcioni sobre ext4, sobre tmpfs, sobre /proc —que inventa els seus fitxers en llegir-los— i sobre NFS.
Amb el mapa complet vam passar a fer-lo servir (04-04): cinc crides al sistema, les tres taules que expliquen fork, dup i 2>&1, les dues capes de memòria intermèdia que cal distingir per no perdre dades, i els dos patrons que més escriuràs —la publicació atòmica amb temporal i rename(), i O_APPEND per als registres— més flock perquè no hi hagi dos agregador. Després vam baixar al disc (04-05): les quatre estratègies d'assignació fins als extents, els tres mecanismes que fan que un fitxer escrit 24 bytes cada 125 ms acabi contigu, el diari amb el seu bloc de commit atòmic, els tres modes d'ext4 amb ordered com a elecció raonada, i la distinció que tanca l'assumpte: coherència de metadades no és integritat de dades, RAID 1 detecta discrepàncies però no sap quina còpia és la bona, i de vegades la garantia l'ha de posar l'aplicació.
I aquesta última lliçó ha respost qui pot fer què.
Si el mòdul 2 responia com es reparteix un recurs escàs i el mòdul 3 com es coordinen diversos fluxos sobre una dada compartida, el mòdul 4 ha respost com es guarda alguna cosa perquè continuï existint demà. I la resposta ha tingut sempre la mateixa forma: una estructura al disc, una capa d'indirecció que la fa manejable, i una disciplina —de format, de sincronització o de permisos— que el programador ha de respectar.
Però fixa't en on ens deixa l'últim apartat. Hem tancat l'accés a /var/lib/meteora amb nou bits i una ACL, i hem suposat tota l'estona que l'UID 990 és meteora, que qui inicia sessió és qui diu que és, i que un procés que corre com a meteora fa el que meteora faria. Cap d'aquelles tres suposicions no és gratuïta. Com demostra algú que és qui diu que és? Per què root es pot saltar tots els permisos, i hi ha alguna manera que no pugui? Què impedeix que un meteo-api compromès, amb els seus permisos perfectament configurats, faci coses que ningú no va preveure? I com es detecta que una cosa així ha passat, quan l'atacant controla el sistema que escriu els registres?
Els permisos de fitxer són només una peça d'un model de protecció molt més ampli, que abasta subjectes, objectes, dominis de protecció, autenticació, privilegis mínims, control d'accés obligatori i auditoria. És el Mòdul 5: Protecció i Seguretat del Sistema, i comença a Principis de Protecció i Control d'Accés.
Fonaments de Sistemes Operatius
Mòdul 1: Introducció als Sistemes Operatius
- Conceptes Bàsics de Sistemes Operatius
- Història i Evolució dels Sistemes Operatius
- Tipus de Sistemes Operatius
- Funcions Principals d'un Sistema Operatiu
- Arquitectura del Nucli: Monolític, Microkernel i Híbrid
- Mode Usuari, Mode Nucli i Crides al Sistema
Mòdul 2: Gestió de Recursos
- Gestió de Processos
- Planificació de la CPU
- Gestió de Memòria
- Memòria Virtual i Paginació
- Gestió d'Emmagatzematge
- Gestió de Dispositius
- Controladors, Interrupcions i Operacions d'E/S
Mòdul 3: Concurrència
- Conceptes de Concurrència
- Fils i Processos
- Comunicació entre Processos (IPC)
- Sincronització i Exclusió Mútua
- Problemes Clàssics de Concurrència
- Interbloquejos: Prevenció, Detecció i Recuperació
Mòdul 4: Estructures de Fitxers
- Sistemes de Fitxers
- Estructures de Directoris
- Particions, Muntatge i Sistema de Fitxers Virtual
- Gestió de Fitxers
- Assignació d'Espai, Journaling i Integritat
- Seguretat i Permisos de Fitxers
Mòdul 5: Protecció i Seguretat del Sistema
- Principis de Protecció i Control d'Accés
- Usuaris, Autenticació i Escalada de Privilegis
- Amenaces Habituals i Enfortiment del Sistema
- Auditoria, Registres i Resposta a Incidents
Mòdul 6: Virtualització i Contenidors
- Virtualització: Hipervisors i Màquines Virtuals
- Contenidors: Namespaces i cgroups
- El Sistema Operatiu al Núvol
- Sistemes Operatius Mòbils i de Temps Real
