Arribes a l'última lliçó del mòdul amb un deute pendent. Portes sis lliçons veient cadenes com -rw-r----- i drwxr-xr-x a cada ls -l, escrivint sudo davant de certes ordres sense saber del tot per què, i acceptant que /etc/tramontana/app.conf pertany a root:tramontana sense poder explicar què implica això exactament. Aquesta lliçó salda aquest deute.

El model de permisos d'Unix té més de cinquanta anys i continua sent, amb diferència, el mecanisme de seguretat més utilitzat del planeta. És sorprenentment simple —nou bits i dos identificadors— i sorprenentment subtil: el mateix permís significa coses diferents en un fitxer i en un directori, i aquesta asimetria és la font de la majoria dels malentesos.

No és matèria opcional. Un servidor amb els permisos mal posats funciona perfectament fins al dia que algú llegeix un fitxer que no hauria de llegir, o n'esborra un que no era seu, o aconsegueix executar codi amb privilegis aliens. En acabar aquesta lliçó sabràs dissenyar els permisos d'un desplegament complet i justificar cada decisió, que és exactament el que s'espera d'un administrador de sistemes.

Contingut

  1. El model de seguretat d'Unix: usuari, grup, altres
  2. Llegir la cadena d'ls -l caràcter a caràcter
  3. Els tres permisos en fitxers i en directoris
  4. Notació octal i notació simbòlica
  5. chmod en totes dues notacions
  6. chown i chgrp
  7. Grups: per què el treball en equip no es resol amb «altres»
  8. La màscara umask
  9. Bits especials: SUID, SGID i sticky
  10. Cas pràctic: els permisos de Tramontana Reserves

  1. El model de seguretat d'Unix: usuari, grup, altres

Tot fitxer a Linux té exactament un propietari i exactament un grup propietari. A partir d'aquí, el sistema divideix tothom en tres categories, i cadascuna té el seu propi joc de permisos:

Categoria Lletra Qui és
Usuari (user) u El propietari del fitxer
Grup (group) g Els membres del grup propietari
Altres (others) o Tots els altres usuaris del sistema

Quan un procés intenta accedir a un fitxer, el nucli avalua en aquest ordre estricte:

flowchart TD
    A["Un procés demana accés a un fitxer"] --> R{"L'usuari<br/>és root?"}
    R -->|Sí| RA["ACCÉS CONCEDIT<br/>(root se salta els permisos)"]
    R -->|No| B{"L'UID coincideix amb<br/>el propietari?"}
    B -->|Sí| C["Aplicar els permisos d'USUARI<br/>i no mirar més"]
    B -->|No| D{"El GID o algun dels<br/>seus grups coincideix?"}
    D -->|Sí| E["Aplicar els permisos de GRUP<br/>i no mirar més"]
    D -->|No| F["Aplicar els permisos d'ALTRES"]

Hi ha un detall en aquest diagrama que sorprèn i que cal interioritzar: la primera categoria que coincideix és la que s'aplica, i no es continua mirant. No és acumulatiu.

Conseqüència pràctica, i és contraintuïtiva:

operador@srv-tramontana:~$ ls -l informe.txt
----rw-r-- 1 operador tramontana 240 Aug 18 16:02 informe.txt

Aquest fitxer pertany a operador, el propietari no té cap permís, i el grup té lectura i escriptura. Resultat: operador no pot llegir el seu propi fitxer, encara que pertanyi al grup tramontana. El nucli comprova primer si és el propietari, veu que sí, aplica --- i acaba. No arriba a mirar els permisos de grup.

operador@srv-tramontana:~$ cat informe.txt
cat: informe.txt: Permission denied

És estrany trobar-ho a la pràctica, però explica el model millor que qualsevol exemple ben configurat: els permisos no se sumen, se seleccionen.

L'excepció és root, que se salta la comprovació sencera. Per això sudo cat funciona sobre qualsevol fitxer, i per això els permisos no protegeixen contra un administrador. Els detalls de sudo són la lliçó 05-02.

Darrere dels noms hi ha números. El sistema treballa amb UID i GID:

operador@srv-tramontana:~$ id
uid=1001(operador) gid=1001(operador) groups=1001(operador),27(sudo)

operador@srv-tramontana:~$ id -u
1001
operador@srv-tramontana:~$ id -un
operador

Els noms són una comoditat per a les persones; el nucli només veu números. Això importa en moure fitxers entre màquines: si copies amb tar -p un fitxer de l'UID 1001 a un altre servidor on el 1001 és una altra persona, el fitxer passa a pertànyer a aquesta persona.

  1. Llegir la cadena d'ls -l caràcter a caràcter

operador@srv-tramontana:~$ ls -l /etc/tramontana/app.conf
-rw-r----- 1 root tramontana 512 Aug 18 08:47 /etc/tramontana/app.conf

La cadena -rw-r----- té 10 caràcters amb una estructura fixa:

 -    rw-    r--    ---
 │     │      │      │
 │     │      │      └── ALTRES: sense permisos
 │     │      └───────── GRUP (tramontana): només lectura
 │     └──────────────── USUARI (root): lectura i escriptura
 └────────────────────── TIPUS: fitxer regular

Caràcter 1, el tipus. Els set que vas veure al Mòdul 1:

Caràcter Tipus
- Fitxer regular
d Directori
l Enllaç simbòlic
c Dispositiu de caràcters
b Dispositiu de blocs
s Sòcol
p Canonada amb nom (FIFO)

Caràcters 2 a 10, tres blocs de tres. A cada bloc, sempre en el mateix ordre: r, w, x. Un guionet significa que aquest permís no hi és.

Llegeix-la així, en veu alta fins que et surti sola:

-rw-r----- → «fitxer regular; el propietari llegeix i escriu; el grup només llegeix; els altres res».

Més exemples del mateix servidor:

operador@srv-tramontana:~$ ls -l /opt/tramontana/app/executable /etc/passwd /tmp
-rwxr-xr-x 1 root root 50319872 Aug 18 08:30 /opt/tramontana/app/executable
-rw-r--r-- 1 root root     2891 Aug 18 09:00 /etc/passwd
drwxrwxrwt 9 root root     4096 Aug 18 16:10 /tmp
Cadena Lectura
-rwxr-xr-x Fitxer; el propietari llegeix, escriu i executa; grup i altres llegeixen i executen
-rw-r--r-- Fitxer; el propietari llegeix i escriu; tots els altres només llegeixen
drwxrwxrwt Directori; tothom pot fer-ho tot... amb una t al final que canvia les regles (apartat 9)

I el cas especial:

operador@srv-tramontana:~$ ls -l /usr/bin/python3
lrwxrwxrwx 1 root root 10 Aug  2 12:04 /usr/bin/python3 -> python3.12

lrwxrwxrwx: els permisos d'un enllaç simbòlic són sempre aquests i no signifiquen res. Com vas veure a la lliçó 02-06, els que s'apliquen són els del destí.

  1. Els tres permisos en fitxers i en directoris

Aquí hi ha el punt on es perd més gent. Les mateixes tres lletres signifiquen coses diferents segons l'objecte.

Permís En un fitxer En un directori
r (4) Llegir el contingut Llistar els noms que conté
w (2) Modificar el contingut Crear, esborrar i reanomenar entrades
x (1) Executar-lo com a programa Travessar-lo: accedir al que hi ha a dins

Cadascuna de les tres files del costat dret mereix una demostració, perquè totes tres són contraintuïtives.

x en un directori: travessar

x en un directori s'anomena de vegades search permission. Sense ell no pots accedir a res del que hi ha a dins, encara que en sàpigues el nom exacte i encara que el fitxer interior et doni tots els permisos.

operador@srv-tramontana:~$ mkdir -p prova/interior
operador@srv-tramontana:~$ echo "contingut" > prova/interior/dada.txt
operador@srv-tramontana:~$ chmod 666 prova/interior/dada.txt
operador@srv-tramontana:~$ chmod 666 prova          # rw- sense x

operador@srv-tramontana:~$ ls prova
interior
operador@srv-tramontana:~$ cat prova/interior/dada.txt
cat: prova/interior/dada.txt: Permission denied

El fitxer té rw-rw-rw-: qualsevol el pot llegir. Però per arribar-hi, el nucli ha de travessar prova, i allà no hi ha x. Accés denegat.

I a l'inrevés, x sense r:

operador@srv-tramontana:~$ chmod 111 prova          # --x--x--x

operador@srv-tramontana:~$ ls prova
ls: cannot open directory 'prova': Permission denied

operador@srv-tramontana:~$ cat prova/interior/dada.txt
contingut

No pots veure què hi ha a dins, però sí accedir al que hi ha si en saps el nom exacte. És un directori «a cegues».

Això no és una curiositat: és un patró de seguretat d'ús habitual. Un directori 711 permet que un servei web serveixi /var/www/lloc/pagina.html sense que ningú pugui llistar el contingut del directori i descobrir quins altres fitxers hi ha. El mateix s'aplica a /home, que en molts sistemes és 711: els usuaris poden entrar al seu propi home, però no llistar els homes aliens.

Regla que cal memoritzar: per accedir a /a/b/c/fitxer, necessites x a /, a a, a b i a c, i després el permís adequat sobre fitxer. Una sola mancança de x en qualsevol punt del camí bloqueja tot el que hi ha a sota.

r sense x en un directori

operador@srv-tramontana:~$ chmod 444 prova          # r--r--r--
operador@srv-tramontana:~$ ls prova
interior
operador@srv-tramontana:~$ ls -l prova
ls: cannot access 'prova/interior': Permission denied
total 0
d????????? ? ? ? ?            ? interior

Pots llegir els noms, perquè els noms són al mateix directori. Però ls -l necessita consultar els inodes de cada entrada, i per a això cal travessar el directori. D'aquí aquella sortida amb interrogants: ls coneix el nom i res més.

r sense x en un directori és pràcticament inútil. A la pràctica, els directoris porten r i x junts o cap dels dos.

w en un directori: el permís que sorprèn

Aquest és el més important d'entendre, perquè contradiu la intuïció.

operador@srv-tramontana:~$ chmod 777 prova
operador@srv-tramontana:~$ sudo touch prova/de-root.txt
operador@srv-tramontana:~$ sudo chmod 600 prova/de-root.txt
operador@srv-tramontana:~$ ls -l prova/de-root.txt
-rw------- 1 root root 0 Aug 18 16:25 prova/de-root.txt

operador@srv-tramontana:~$ cat prova/de-root.txt
cat: prova/de-root.txt: Permission denied

operador@srv-tramontana:~$ rm prova/de-root.txt
operador@srv-tramontana:~$ ls prova/
interior

Has esborrat un fitxer de root que ni tan sols podies llegir.

L'explicació és coherent amb el que saps de la lliçó 02-06: esborrar un fitxer no és una operació sobre el fitxer, és una operació sobre el directori que el conté. rm elimina una entrada de la llista de noms del directori. I per modificar aquesta llista només cal w al directori.

Els permisos del fitxer controlen el seu contingut. Els permisos del directori controlen la llista de noms. Són dues coses diferents.

Resum de què permet w en un directori:

Operació Quin permís cal?
Llegir un fitxer r al fitxer, x al camí
Modificar el contingut d'un fitxer w al fitxer, x al camí
Crear un fitxer w + x al directori
Esborrar un fitxer w + x al directori (els del fitxer són indiferents)
Reanomenar un fitxer w + x al directori
Llistar el directori r al directori
Entrar-hi (cd) x al directori

Aquest comportament és la raó de ser del sticky bit, que veuràs a l'apartat 9, i explica per què /tmp, on tothom escriu, no és un caos de gent esborrant-se fitxers.

  1. Notació octal i notació simbòlica

Els nou bits de permisos s'expressen de dues formes.

Octal

Cada permís té un valor numèric i se sumen per bloc:

Permís Valor
r 4
w 2
x 1
- 0

Un dígit per bloc, tres dígits en total: usuari, grup, altres.

Octal Simbòlic Suma
0 --- 0
1 --x 1
2 -w- 2
3 -wx 2+1
4 r-- 4
5 r-x 4+1
6 rw- 4+2
7 rwx 4+2+1

Els que apareixen de debò en un sistema:

Octal Cadena Ús típic
644 rw-r--r-- Fitxer normal, llegible per tothom
600 rw------- Fitxer privat. Claus SSH
640 rw-r----- Configuració amb secrets, llegible per un grup
755 rwxr-xr-x Executable o directori públic
750 rwxr-x--- Directori per a un grup concret
700 rwx------ Directori privat
711 rwx--x--x Directori travessable però no llistable
775 rwxrwxr-x Directori de treball compartit per un grup
777 rwxrwxrwx Tothom pot fer-ho tot. Gairebé mai correcte

Traducció en tots dos sentits

De simbòlic a octal, bloc a bloc:

r w x   r - x   r - -
4+2+1   4+0+1   4+0+0
  7       5       4      ->  754

D'octal a simbòlic, descomponent cada dígit:

6 4 0
│ │ └── 0 = ---
│ └──── 4 = r--
└────── 6 = rw-       ->  rw-r-----

Practica amb aquests fins que et surtin sense pensar:

Octal Simbòlic
644 rw-r--r--
755 rwxr-xr-x
600 rw-------
640 rw-r-----
664 rw-rw-r--
751 rwxr-x--x
400 r--------

I a l'inrevés:

Simbòlic Octal
rwxrwx--- 770
r-xr-x--- 550
rw-rw-rw- 666
--x--x--x 111
rwx------ 700

Truc mental: 7 és tot, 6 és llegir i escriure, 5 és llegir i executar, 4 és només llegir, 0 és res. Amb aquests cinc cobreixes el 95 % dels casos reals.

stat et dona les dues notacions alhora, cosa que va molt bé mentre aprens:

operador@srv-tramontana:~$ stat -c '%a  %A  %n' /etc/tramontana/app.conf /opt/tramontana/app
640  -rw-r-----  /etc/tramontana/app.conf
755  drwxr-xr-x  /opt/tramontana/app

Simbòlica

La notació simbòlica es fa servir per modificar permisos sense tocar els altres. La seva gramàtica és:

[qui][operador][permisos]
Qui Operador Permís
u usuari + afegir r llegir
g grup - treure w escriure
o altres = fixar exactament x executar
a tots (ugo) X x només si ja és directori o tenia algun x

Aquesta X majúscula és una joia poc coneguda i la veuràs en acció a l'apartat següent.

  1. chmod en totes dues notacions

# Octal: fixa els nou bits de cop
operador@srv-tramontana:~$ chmod 640 dades/cases.txt
operador@srv-tramontana:~$ ls -l dades/cases.txt
-rw-r----- 1 operador operador 446 Aug 18 13:02 dades/cases.txt

# Simbòlica: modifica només el que s'indica
operador@srv-tramontana:~$ chmod g+w dades/cases.txt
operador@srv-tramontana:~$ ls -l dades/cases.txt
-rw-rw---- 1 operador operador 446 Aug 18 13:02 dades/cases.txt

operador@srv-tramontana:~$ chmod o=r dades/cases.txt
operador@srv-tramontana:~$ ls -l dades/cases.txt
-rw-rw-r-- 1 operador operador 446 Aug 18 13:02 dades/cases.txt

operador@srv-tramontana:~$ chmod a-w dades/cases.txt
operador@srv-tramontana:~$ ls -l dades/cases.txt
-r--r--r-- 1 operador operador 446 Aug 18 13:02 dades/cases.txt

Es poden combinar diverses regles amb comes:

operador@srv-tramontana:~$ chmod u=rw,g=r,o= dades/cases.txt
operador@srv-tramontana:~$ ls -l dades/cases.txt
-rw-r----- 1 operador operador 446 Aug 18 13:02 dades/cases.txt

Quan fer servir cada notació:

Situació Notació
Saps exactament quins permisos vols Octal: chmod 640
Vols fer un canvi puntual sense tocar la resta Simbòlica: chmod g+w
Scripts i documentació Octal: és explícita i inequívoca
Recursiu sobre arbres mixtos Simbòlica amb X

-v i --changes mostren el que fa, útil per verificar:

operador@srv-tramontana:~$ chmod -v 644 dades/cases.txt
mode of 'dades/cases.txt' changed from 0640 (rw-r-----) to 0644 (rw-r--r--)

I --reference copia els permisos d'un altre fitxer:

operador@srv-tramontana:~$ chmod --reference=dades/reserves.csv dades/cases.txt

-R i el problema del recursiu

operador@srv-tramontana:~$ chmod -R 644 /home/operador/treball

Sembla raonable i acaba de trencar tots els directoris de l'arbre. En treure'ls la x, ja no es poden travessar:

operador@srv-tramontana:~$ ls treball/2026
ls: cannot open directory 'treball/2026': Permission denied

El problema és que fitxers i directoris necessiten permisos diferents: els fitxers normalment no han de ser executables, i els directoris sempre necessiten x.

La solució correcta és la X majúscula:

operador@srv-tramontana:~$ chmod -R u=rwX,g=rX,o= /home/operador/treball

X aplica x només als directoris i als fitxers que ja tenien algun bit d'execució. Els fitxers de dades no es tornen executables; els directoris conserven la seva capacitat de ser travessats. És exactament el que vols en el 100 % dels casos recursius.

L'alternativa clàssica, si prefereixes separar explícitament, fa servir find (lliçó 03-03):

operador@srv-tramontana:~$ find /home/operador/treball -type d -exec chmod 750 {} +
operador@srv-tramontana:~$ find /home/operador/treball -type f -exec chmod 640 {} +

Per què chmod -R 777 mai no és la solució

Apareix en centenars de respostes de fòrums com a remei per a «permission denied». Mereix una explicació seriosa de per què està malament, perquè l'argument «és insegur» a seques no convenç ningú que tingui pressa.

1. No arregla el problema, l'emmascara. Si alguna cosa donava «permission denied», hi havia una raó: un usuari equivocat, un grup mal assignat, una x que falta en un directori del camí. 777 fa que el símptoma desaparegui sense que sàpigues quina era la causa. Tornarà a aparèixer en un altre lloc.

2. Qualsevol usuari del sistema el pot modificar. I en un servidor hi ha més usuaris dels que et penses: comptes de servei com www-data, nobody, postgres. Si un atacant compromet el servei web —que no té privilegis— i la teva aplicació és 777, la pot reescriure sencera. Li has donat execució de codi com l'usuari que executa l'aplicació.

3. Amb -R sobre directoris, és pitjor. Els directoris 777 permeten a qualsevol esborrar i substituir fitxers que no són seus, pel que vas veure a l'apartat 3. Un atacant pot reemplaçar un binari pel seu.

4. Marca els fitxers com a executables. Un .conf o un .csv amb permís d'execució és un senyal d'alarma per a qualsevol auditoria, i en alguns servidors web una configuració desafortunada pot fer que un fitxer executable s'executi en comptes de servir-se.

5. És pràcticament irreversible. Després d'un chmod -R 777 /var, no hi ha manera de saber quins permisos tenia cada fitxer. En alguns casos cal reinstal·lar paquets per recuperar-los.

El diagnòstic correcte quan alguna cosa dona «permission denied»:

# 1. Qui soc i a quins grups pertanyo?
operador@srv-tramontana:~$ id

# 2. Quins permisos té el fitxer i de qui és?
operador@srv-tramontana:~$ ls -l /ruta/al/fitxer

# 3. I tots els directoris del camí? (aquesta és la que s'oblida)
operador@srv-tramontana:~$ namei -l /ruta/al/fitxer
f: /ruta/al/fitxer
drwxr-xr-x root     root     /
drwxr-x--- root     root     ruta
drwxr-xr-x root     root     al
-rw-r--r-- root     root     fitxer

namei -l mostra els permisos de cada component de la ruta, i és l'eina que resol el cas més freqüent: el fitxer està bé, però un directori intermedi no et deixa passar. En aquest exemple, ruta és drwxr-x--- i pertany a root:root: aquí hi ha el bloqueig.

  1. chown i chgrp

chown canvia el propietari, chgrp el grup:

operador@srv-tramontana:~$ sudo chown root /etc/tramontana/app.conf
operador@srv-tramontana:~$ sudo chgrp tramontana /etc/tramontana/app.conf

# Les dues coses de cop, amb dos punts
operador@srv-tramontana:~$ sudo chown root:tramontana /etc/tramontana/app.conf

operador@srv-tramontana:~$ ls -l /etc/tramontana/app.conf
-rw-r----- 1 root tramontana 512 Aug 18 08:47 /etc/tramontana/app.conf

Formes de chown:

Sintaxi Què canvia
chown usuari fitxer Només el propietari
chown usuari:grup fitxer Tots dos
chown :grup fitxer Només el grup (com chgrp)
chown usuari: fitxer Propietari, i el grup passa a ser el principal d'aquest usuari

Opcions:

Opció Què fa
-R Recursiu
-v / --changes Informa dels canvis
--reference=fitx Copia el propietari i el grup d'un altre fitxer
-h Actua sobre l'enllaç simbòlic, no sobre el seu destí
--from=usr:grp Canvia només els que ja tenien aquell propietari

Important: chown requereix root. Un usuari normal no pot regalar un fitxer a un altre:

operador@srv-tramontana:~$ chown alumne dades/cases.txt
chown: changing ownership of 'dades/cases.txt': Operation not permitted

La raó és concreta: si poguessis, podries burlar les quotes de disc creant fitxers enormes i assignant-los a un altre. I podries crear un fitxer amb SUID i regalar-lo a root, cosa que seria un forat de seguretat immediat.

chgrp sí que ho pot fer un usuari normal, però només si és membre del grup destí:

operador@srv-tramontana:~$ chgrp sudo dades/cases.txt
operador@srv-tramontana:~$ ls -l dades/cases.txt
-rw-r--r-- 1 operador sudo 446 Aug 18 13:02 dades/cases.txt

operador@srv-tramontana:~$ chgrp adm dades/cases.txt
chgrp: changing group of 'dades/cases.txt': Operation not permitted

operador és membre de sudo, així que pot; no és membre d'adm, així que no.

--reference és molt pràctic per replicar la propietat d'un fitxer model:

operador@srv-tramontana:~$ sudo chown --reference=/etc/tramontana/app.conf /etc/tramontana/nou.conf

I -h importa amb enllaços:

operador@srv-tramontana:~$ sudo chown root:root ~/app-produccio      # canvia el DESTÍ
operador@srv-tramontana:~$ sudo chown -h root:root ~/app-produccio   # canvia l'ENLLAÇ

Com que el propietari d'un symlink és irrellevant per al control d'accés, -h es fa servir poc; però convé saber que sense -h, chown sobre un enllaç toca el destí, cosa que pot tenir conseqüències inesperades en recórrer un arbre amb -R.

  1. Grups: per què el treball en equip no es resol amb «altres»

Cada usuari té un grup principal (el dels seus fitxers nous) i pot pertànyer a diversos grups secundaris.

operador@srv-tramontana:~$ id
uid=1001(operador) gid=1001(operador) groups=1001(operador),27(sudo)

operador@srv-tramontana:~$ groups
operador sudo

operador@srv-tramontana:~$ id -Gn operador
operador sudo

A Ubuntu, cada usuari té per defecte un grup propi amb el seu mateix nom (esquema UPG, User Private Group). El motiu és que permet treballar amb una umask més permissiva de manera segura: com que el grup de l'usuari només el conté a ell, donar permisos de grup no exposa res.

Consultar els grups del sistema:

operador@srv-tramontana:~$ getent group sudo
sudo:x:27:operador

operador@srv-tramontana:~$ getent group | tail -n 4
operador:x:1001:
tramontana:x:1002:operador
adm:x:4:syslog

El plantejament

La Marta planteja l'escenari real: en Luis Ferrer necessita poder llegir els registres de l'aplicació i escriure al directori de desplegaments; en el futur s'incorporarà una altra persona amb les mateixes necessitats. Com es resol?

Opció incorrecta: donar permisos a «altres».

sudo chmod o+rx /var/log/tramontana
sudo chmod o+rwx /srv/tramontana/backups

Què has fet realment: has donat aquests permisos a tots els usuaris del sistema. No només a en Luis, sinó a www-data, a nobody, a qualsevol compte de servei i a qualsevol compte que es creï en el futur. Si un atacant compromet un servei sense privilegis, té accés als teus registres (que contenen noms d'usuari i patrons d'ús) i pot escriure al teu directori de còpies.

I per gestionar-ho: si demà vols treure l'accés només a en Luis, no pots. «Altres» no distingeix persones.

Opció correcta: un grup compartit.

# (Això es farà formalment a la lliçó 05-01)
sudo groupadd tramontana
sudo usermod -aG tramontana operador
sudo usermod -aG tramontana luis

sudo chgrp -R tramontana /var/log/tramontana /srv/tramontana/backups
sudo chmod -R g+rX /var/log/tramontana
sudo chmod -R g+rwX /srv/tramontana/backups
sudo chmod o= /var/log/tramontana /srv/tramontana/backups

Avantatges concrets:

Criteri Permisos a «altres» Grup compartit
Abast Tothom, incloses les comptes de servei Només els membres
Donar accés a algú nou Ja el té (malament) usermod -aG, una ordre
Treure accés a una persona Impossible gpasswd -d, una ordre
Auditar qui té accés Impossible de respondre getent group tramontana
Comptes de servei compromesos Hi tenen accés No hi tenen accés
Escala a més persones No Sí

La regla és absoluta: en un sistema multiusuari, l'accés compartit es resol amb grups. El permís d'«altres» es fa servir per al que de debò ha de ser públic, i en la majoria dels casos correctes val 0.

Un detall que sorprèn i que cal conèixer: els grups d'un procés es determinen en iniciar la sessió. Si t'afegeixen a un grup mentre tens la sessió oberta, el teu shell no ho veu:

operador@srv-tramontana:~$ sudo usermod -aG tramontana operador
operador@srv-tramontana:~$ groups
operador sudo                    # <- tramontana no apareix
operador@srv-tramontana:~$ id -nG operador
operador sudo tramontana         # <- però el sistema ja ho sap

Cal tancar la sessió i tornar a entrar (o fer servir newgrp tramontana per a la sessió actual). És una font clàssica de «li he donat permisos i continua sense funcionar».

Compte també amb usermod -aG: la -a és obligatòria. Sense ella, usermod -G tramontana operador substitueix tots els grups secundaris per aquest, cosa que trauria operador del grup sudo i el deixaria sense poder administrar el sistema. És un error que es comet una vegada a la vida.

  1. La màscara umask

Quan crees un fitxer, no en tries els permisos: els posa el sistema. La umask és la màscara que decideix quins es treuen.

Els valors de partida estan fixats pel nucli:

Objecte Permisos base Per què
Fitxer 666 (rw-rw-rw-) Mai executable per defecte: crear un fitxer no ha de crear un programa
Directori 777 (rwxrwxrwx) Necessita x per ser travessable

La umask es resta d'aquests valors. Més exactament, s'aplica una operació de bits que elimina els permisos marcats a la màscara.

operador@srv-tramontana:~$ umask
0022
operador@srv-tramontana:~$ umask -S
u=rwx,g=rx,o=rx

Càlcul amb umask 022:

Fitxers:     666  -  022  =  644   (rw-r--r--)
Directoris:  777  -  022  =  755   (rwxr-xr-x)

Comprovació:

operador@srv-tramontana:~$ umask 022
operador@srv-tramontana:~$ touch prova-022.txt && mkdir dir-022
operador@srv-tramontana:~$ ls -ld prova-022.txt dir-022
drwxr-xr-x 2 operador operador 4096 Aug 18 17:02 dir-022
-rw-r--r-- 1 operador operador    0 Aug 18 17:02 prova-022.txt

Càlcul amb umask 027:

Fitxers:     666  -  027  =  640   (rw-r-----)
Directoris:  777  -  027  =  750   (rwxr-x---)
operador@srv-tramontana:~$ umask 027
operador@srv-tramontana:~$ touch prova-027.txt && mkdir dir-027
operador@srv-tramontana:~$ ls -ld prova-027.txt dir-027
drwxr-x--- 2 operador operador 4096 Aug 18 17:04 dir-027
-rw-r----- 1 operador operador    0 Aug 18 17:04 prova-027.txt

Comparativa de les màscares habituals:

umask Fitxers Directoris Efecte On es fa servir
022 644 755 Tothom llegeix, només el propietari escriu Per defecte a la majoria de distribucions
002 664 775 El grup també escriu Ubuntu per a usuaris normals (amb UPG)
027 640 750 «Altres» no veu res Servidors amb dades sensibles
077 600 700 Només el propietari Màxima privacitat; comptes de root
007 660 770 Grup total, altres res Directoris d'equip

Un matís tècnic important: la umask treu bits, mai no n'afegeix. Per això dir «es resta» és una simplificació útil però no exacta. Amb umask 022 i permisos base 666, el resultat és 644. Però si un programa demana crear un fitxer amb permisos 600 explícitament, la umask no el pujarà a 644: el resultat serà 600. La umask només pot ser més restrictiva que el que es demana.

Un altre matís: un dígit senar a la umask sobre fitxers no té efecte visible, perquè els fitxers neixen sense x de totes maneres. umask 023 i umask 022 produeixen fitxers idèntics, però directoris diferents (754 enfront de 755).

On es defineix la umask:

# Només per a la sessió actual
operador@srv-tramontana:~$ umask 027

# Permanent per al teu usuari
operador@srv-tramontana:~$ echo "umask 027" >> ~/.bashrc

# Per a tot el sistema
operador@srv-tramontana:~$ grep -r "UMASK" /etc/login.defs
UMASK		022

Els serveis de systemd tenen la seva pròpia directiva UMask= al seu fitxer d'unitat, i no hereten la del teu shell. Ho veuràs a la lliçó 05-05.

Recomanació per a srv-tramontana: umask 027 per als comptes administratius. Amb dades d'hostes al sistema, el valor per defecte que qualsevol usuari pugui llegir els fitxers nous és massa permissiu. Amb 027, tot el que creïs neix sense accés per a «altres», que és el principi de mínim privilegi aplicat des de l'origen.

  1. Bits especials: SUID, SGID i sticky

A més dels nou bits, n'hi ha tres més. Aquí només n'aprendràs a reconèixer-los quan els vegis i què fan en una frase. El seu estudi a fons, amb les seves implicacions de seguretat i el seu ús correcte, és la lliçó 05-02.

Bit Octal Es veu a ls -l Què fa
SUID 4000 s a la x de l'usuari El programa s'executa amb els privilegis del seu propietari, no de qui el llança
SGID 2000 s a la x del grup En un executable: corre amb el grup del fitxer. En un directori: els fitxers nous hereten el grup del directori
Sticky 1000 t a la x d'altres En un directori: només el propietari d'un fitxer el pot esborrar

SUID: /usr/bin/passwd

operador@srv-tramontana:~$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 68208 Mar 23 13:47 /usr/bin/passwd

Aquesta s on hauria d'anar la x de l'usuari és el bit SUID.

El problema que resol: les contrasenyes es guarden xifrades a /etc/shadow, que és -rw-r----- de root:shadow. Un usuari normal ni tan sols el pot llegir. Però ha de poder canviar la seva pròpia contrasenya, i això implica escriure en aquest fitxer.

Amb SUID, quan operador executa passwd, el procés corre com a root —el propietari del programa— i pot escriure a /etc/shadow. El programa està escrit per permetre únicament canviar la contrasenya pròpia.

Això és també la raó que els programes SUID siguin l'objectiu preferit dels atacants: una fallada en un binari SUID de root és una escalada de privilegis directa. Per això n'hi ha pocs, estan auditats, i trobar-ne un d'inesperat en un servidor és motiu d'alarma.

SGID en directoris: herència de grup

operador@srv-tramontana:~$ ls -ld /srv/tramontana/compartit
drwxrws--- 2 root tramontana 4096 Aug 18 17:20 /srv/tramontana/compartit

La s a la posició de la x del grup. En un directori, SGID fa que tot el que es creï a dins hereti el grup del directori, en comptes del grup principal de qui el crea.

Per què importa per a Tramontana: sense SGID, si en Luis crea un fitxer al directori compartit, el grup serà luis i operador no hi podrà accedir encara que tots dos siguin a tramontana. Amb SGID, el fitxer neix amb grup tramontana i l'equip pot treballar. És la peça que fa que un directori compartit funcioni de debò.

Sticky bit: /tmp

operador@srv-tramontana:~$ ls -ld /tmp
drwxrwxrwt 9 root root 4096 Aug 18 17:22 /tmp

La t al final. /tmp és 777: tothom hi escriu. Pel que vas aprendre a l'apartat 3, això significaria que qualsevol pot esborrar els fitxers temporals de qualsevol, inclosos els de processos del sistema.

El sticky bit ho corregeix: en un directori amb aquest bit, només el propietari del fitxer (o del directori, o root) el pot esborrar o reanomenar. Pots crear els teus fitxers, però no tocar els aliens.

Com distingir majúscula de minúscula

Una subtilesa que apareix als exàmens de certificació i que convé reconèixer:

Es veu Significa
s minúscula El bit especial i la x corresponent estan actius
S majúscula El bit especial està actiu però falta la x
t minúscula Sticky i x per a altres
T majúscula Sticky sense x per a altres

Una S o una T majúscula sol indicar un error de configuració: has posat un bit especial sobre alguna cosa que no es pot executar ni travessar, així que no farà res útil.

Consultar els tres amb stat, on apareixen com un quart dígit:

operador@srv-tramontana:~$ stat -c '%a  %A  %n' /usr/bin/passwd /tmp
4755  -rwsr-xr-x  /usr/bin/passwd
1777  drwxrwxrwt  /tmp

4755 i 1777: el primer dígit són els bits especials.

Repeteixo la frontera: com i quan fer servir aquests bits, els seus riscos, com auditar els binaris SUID d'un sistema i com es relacionen amb sudo és matèria de la lliçó 05-02. Aquí només necessites reconèixer-los en un ls -l i no espantar-te.

  1. Cas pràctic: els permisos de Tramontana Reserves

La Marta et demana un informe amb el disseny de permisos del desplegament i la seva justificació. Anem ruta per ruta.

El punt de partida és el principi de mínim privilegi: cada compte té exactament els permisos que necessita per a la seva funció, i ni un més.

Actors del sistema:

Actor Què és Què necessita
root Administració Tot, per definició
operador Compte administratiu (grup sudo) Administrar via sudo
tramontana Grup de l'aplicació (es crea a 05-01) Accés al desplegament
svc-tramontana Compte de servei que executa l'app El mínim per funcionar
Altres www-data, nobody, comptes futurs Res

/opt/tramontana/app — el codi

operador@srv-tramontana:~$ sudo chown -R root:tramontana /opt/tramontana/releases
operador@srv-tramontana:~$ sudo chmod -R u=rwX,g=rX,o= /opt/tramontana/releases
operador@srv-tramontana:~$ sudo chmod 755 /opt/tramontana/releases/3.2.1/executable

operador@srv-tramontana:~$ ls -ld /opt/tramontana/releases/3.2.1
drwxr-x--- 4 root tramontana 4096 Aug 18 08:30 /opt/tramontana/releases/3.2.1
operador@srv-tramontana:~$ ls -l /opt/tramontana/releases/3.2.1/executable
-rwxr-xr-x 1 root tramontana 50319872 Aug 18 08:30 executable

Directoris 750, fitxers 640, executable 755.

Justificació:

  • Propietari root: el servei no ha de poder modificar el seu propi codi. Si un atacant compromet l'aplicació explotant una fallada, no pot reescriure l'executable per persistir al sistema. Aquesta és la decisió més important de tot el disseny.
  • Grup tramontana amb r-x: l'equip pot llegir el codi i travessar els directoris per diagnosticar.
  • Altres sense res: cap compte de servei aliè no ha de veure el codi de l'aplicació.
  • u=rwX,g=rX al recursiu: els directoris reben x i els fitxers de dades no, gràcies a la X majúscula.

/etc/tramontana/app.conf — la configuració amb credencials

operador@srv-tramontana:~$ sudo chown root:tramontana /etc/tramontana/app.conf
operador@srv-tramontana:~$ sudo chmod 640 /etc/tramontana/app.conf
operador@srv-tramontana:~$ sudo chmod 750 /etc/tramontana

operador@srv-tramontana:~$ ls -ld /etc/tramontana /etc/tramontana/app.conf
drwxr-x--- 2 root tramontana 4096 Aug 18 08:30 /etc/tramontana
-rw-r----- 1 root tramontana  512 Aug 18 08:47 /etc/tramontana/app.conf

640, i el directori 750.

Justificació:

  • Conté la contrasenya de la base de dades. Amb el 644 habitual de /etc, qualsevol usuari del sistema la podria llegir. Això inclou www-data i qualsevol compte compromès. És la diferència entre un incident contingut i una filtració de la base de dades completa.
  • El servei només necessita llegir, mai escriure. Sense w per al grup.
  • El directori també 750: de res no serveix protegir el fitxer si el directori permet llistar i travessar. Recorda l'apartat 3: calen les dues coses.
  • Cap còpia .bak no pot quedar amb permisos més laxos. Aquesta és una fallada real i freqüent: es copia la configuració a app.conf.bak i la còpia neix amb la umask del moment, potser 644. Es protegeix l'original i es deixa el secret exposat a la còpia. Verifica sempre els permisos de les teves còpies de seguretat.
operador@srv-tramontana:~$ sudo cp -p /etc/tramontana/app.conf /etc/tramontana/app.conf.bak-$(date +%F)
operador@srv-tramontana:~$ ls -l /etc/tramontana/
-rw-r----- 1 root tramontana 512 Aug 18 08:47 app.conf
-rw-r----- 1 root tramontana 512 Aug 18 08:47 app.conf.bak-2026-08-18

cp -p preserva els permisos, així que la còpia neix igual de protegida. Sense -p hauria nascut amb la umask, que és just el que cal evitar aquí.

/var/log/tramontana/ — els registres

operador@srv-tramontana:~$ sudo chown -R svc-tramontana:adm /var/log/tramontana
operador@srv-tramontana:~$ sudo chmod 750 /var/log/tramontana
operador@srv-tramontana:~$ sudo chmod 640 /var/log/tramontana/*.log

operador@srv-tramontana:~$ sudo ls -ld /var/log/tramontana
drwxr-x--- 2 svc-tramontana adm 4096 Aug 18 09:00 /var/log/tramontana
operador@srv-tramontana:~$ sudo ls -l /var/log/tramontana
-rw-r----- 1 svc-tramontana adm 18432 Aug 18 09:14 acces.log
-rw-r----- 1 svc-tramontana adm  6348 Aug 18 09:02 errors.log

Directori 750, fitxers 640.

Justificació:

  • El propietari és el compte de servei, perquè és qui ha d'escriure als registres. És l'única ruta del desplegament on el servei necessita permís d'escriptura.
  • El grup adm és la convenció de Debian i Ubuntu per a «qui pot llegir els registres del sistema». Encaixa amb la resta de /var/log.
  • Altres sense res, i això és important: acces.log conté noms d'usuari, adreces IP i patrons d'activitat. És informació que ajuda un atacant a preparar el pas següent, i que a més pot constituir dada personal.
  • El directori necessita w per al servei perquè logrotate i la mateixa aplicació hi crearan fitxers nous.

/srv/tramontana/backups — les còpies

operador@srv-tramontana:~$ sudo chown -R root:tramontana /srv/tramontana/backups
operador@srv-tramontana:~$ sudo chmod 2770 /srv/tramontana/backups
operador@srv-tramontana:~$ sudo chmod 640 /srv/tramontana/backups/*.tar.gz

operador@srv-tramontana:~$ ls -ld /srv/tramontana/backups
drwxrws--- 3 root tramontana 4096 Aug 18 11:20 /srv/tramontana/backups

2770: 770 més el bit SGID.

Justificació:

  • El grup necessita escriure, perquè els operadors generen i roten còpies.
  • El SGID (2) fa que tot el que es crea a dins hereti el grup tramontana. Sense ell, una còpia creada per en Luis tindria grup luis i la resta de l'equip no la podria gestionar. És el cas d'ús de l'apartat 9, aplicat.
  • Altres, res. Les còpies contenen tot: el codi, la configuració amb credencials i, segons què es copiï, dades d'hostes. Un directori de còpies llegible és una manera de donar accés a tota la resta saltant-se els permisos que acabes de dissenyar.

Quadre resum per a l'informe

Ruta Propietari:Grup Octal Justificació en una línia
/opt/tramontana/releases/*/ root:tramontana 750 El servei no pot modificar el seu propi codi
/opt/tramontana/releases/*/executable root:tramontana 755 Executable pel servei, no escrivible
/opt/tramontana/app (enllaç) root:tramontana 777 (irrellevant) Els permisos d'un symlink no compten
/etc/tramontana/ root:tramontana 750 Protegir el directori, no només el fitxer
/etc/tramontana/app.conf root:tramontana 640 Conté credencials
/var/log/tramontana/ svc-tramontana:adm 750 El servei escriu; adm llegeix
/var/log/tramontana/*.log svc-tramontana:adm 640 Contenen dades d'activitat d'usuaris
/srv/tramontana/backups root:tramontana 2770 El grup escriu; SGID per a l'herència
/home/operador/scripts operador:operador 750 Scripts personals de l'operador

Verificació final del disseny:

operador@srv-tramontana:~$ sudo stat -c '%a  %U:%G  %n' \
    /opt/tramontana/releases/3.2.1 \
    /etc/tramontana/app.conf \
    /var/log/tramontana \
    /srv/tramontana/backups
750  root:tramontana  /opt/tramontana/releases/3.2.1
640  root:tramontana  /etc/tramontana/app.conf
750  svc-tramontana:adm  /var/log/tramontana
2770  root:tramontana  /srv/tramontana/backups

Advertiment necessari

Aquest disseny és un exercici didàctic sobre dades fictícies. En un entorn real, reserves.csv i els registres d'accés contenen dades personals d'hostes: noms, dates d'estada i patrons de comportament. Això els sotmet al RGPD i a la normativa de protecció de dades.

En un desplegament real:

  • El disseny de permisos l'ha de revisar el responsable de seguretat de la informació o el delegat de protecció de dades abans de passar a producció, no l'administrador pel seu compte.
  • Pot ser obligatori xifrar les dades en repòs, no només restringir l'accés mitjançant permisos.
  • Els registres d'accés a dades personals poden haver-se d'auditar i conservar durant un termini determinat.
  • Els permisos d'Unix són el primer nivell de control, no l'únic: en entorns exigents es combinen amb ACL (lliçó 05-02) i amb control d'accés obligatori mitjançant AppArmor o SELinux (lliçó 06-06).

Els permisos que has dissenyat són necessaris i correctes. No són suficients per si sols quan hi ha dades personals pel mig, i presentar-los com a tals seria un error professional.

Errors Comuns i Consells

chmod -R 777 per «arreglar» un permís denegat. Emmascara la causa, exposa tot a qualsevol compte del sistema i és gairebé irreversible. Diagnostica amb id, ls -l i namei -l.

chmod -R 644 sobre un arbre. Deixa els directoris sense x i els trenca tots. Fes servir chmod -R u=rwX,g=rX,o=.

Oblidar la x als directoris del camí. El fitxer està bé i continua sense funcionar. namei -l /ruta/completa ho resol en un segon.

Creure que els permisos se sumen. S'aplica només la primera categoria que coincideix. Un propietari sense permisos no hi accedeix encara que el grup els tingui.

Protegir un fitxer i deixar la còpia .bak oberta. Fes servir cp -p i verifica-ho amb ls -l després.

Donar accés a un company amb o+r. L'hi estàs donant a tot el sistema. Grup, sempre.

usermod -G sense -a. Substitueix tots els grups secundaris. Et pot treure del grup sudo i deixar-te sense administració.

No entendre per què el grup nou «no funciona». Els grups s'apliquen en iniciar la sessió. Tanca la sessió i torna a entrar.

Consell: adopta umask 027 als servidors. Tot el que creïs neix ja tancat per a «altres». És mínim privilegi des de l'origen.

Consell: namei -l és l'eina més infravalorada d'aquesta lliçó. Memoritza-la.

Consell: stat -c '%a %A %U:%G %n' és el format de verificació. Et dona octal, simbòlic i propietat en una línia, perfecta per a informes.

Consell: abans de qualsevol chmod -R o chown -R, guarda l'estat actual. Amb getfacl -R directori > permisos.bak pots tornar enrere. És la versió de «còpia abans d'editar» aplicada als permisos.

Exercicis

Exercici 1: traducció i lectura

Sense executar res:

  1. Tradueix a octal: rwxr-x---, rw-rw-r--, r--------, rwsr-xr-x.
  2. Tradueix a simbòlic: 750, 644, 2775, 1777.
  3. Explica què pot fer exactament l'usuari luis (membre de tramontana, no d'adm) amb cadascun d'aquests, i per què:
drwxr-x---  3 root  tramontana  4096 Aug 18 09:00 /srv/dades
-rw-r-----  1 root  tramontana   512 Aug 18 09:00 /srv/dades/config.txt
-rw-r-----  1 root  adm         2048 Aug 18 09:00 /srv/dades/registre.log
  1. Podria luis esborrar registre.log? Justifica la resposta.

Exercici 2: diagnòstic d'un permís denegat

L'aplicació no arrenca. Al registre del servei apareix:

FATAL: no es pot llegir /etc/tramontana/app.conf: permís denegat

El servei corre com a svc-tramontana. Comprova el següent i dona un diagnòstic raonat:

$ id svc-tramontana
uid=997(svc-tramontana) gid=997(svc-tramontana) groups=997(svc-tramontana)

$ namei -l /etc/tramontana/app.conf
f: /etc/tramontana/app.conf
drwxr-xr-x root root       /
drwxr-x--- root tramontana etc/tramontana
-rw-r----- root tramontana app.conf

Identifica la causa exacta, proposa la correcció amb l'ordre concreta i explica per què no s'ha de resoldre amb chmod 644.

Exercici 3: informe de permisos per a la Marta

La Marta ha rebut una consulta del client i necessita un informe. Prepara per a srv-tramontana:

  1. Una taula amb els permisos actuals de les cinc rutes de Tramontana, en octal i amb propietari.
  2. La identificació de qualsevol ruta els permisos de la qual consideris incorrectes, amb la correcció proposada.
  3. Un paràgraf, redactat per a algú no tècnic, explicant què protegeix aquest disseny i què no protegeix.

Solucions

Solució 1

1. A octal:

Simbòlic Càlcul Octal
rwxr-x--- (4+2+1)(4+0+1)(0) 750
rw-rw-r-- (4+2)(4+2)(4) 664
r-------- (4)(0)(0) 400
rwsr-xr-x SUID + (4+2+1)(4+0+1)(4+0+1) 4755

A l'últim, la s a la posició de la x de l'usuari indica SUID, que aporta el 4 com a quart dígit. Els nou bits normals són 755.

2. A simbòlic:

Octal Simbòlic
750 rwxr-x---
644 rw-r--r--
2775 rwxrwsr-x (SGID)
1777 rwxrwxrwt (sticky)

A 2775, el 2 és SGID i es manifesta com a s a la x del grup. A 1777, l'1 és el sticky bit i apareix com a t a la posició de la x d'altres. Totes dues són minúscules perquè la x corresponent també hi és.

3. Què pot fer luis:

  • /srv/dades (750, root:tramontana): luis no és root, així que no se li apliquen els permisos d'usuari. Sí que és membre de tramontana, així que se li aplica el grup: r-x. Pot llistar el directori (ls) i travessar-lo (cd, accedir al que hi ha a dins). No pot crear, esborrar ni reanomenar res a dins, perquè li falta w.

  • config.txt (640, root:tramontana): se li aplica el grup, r--. El pot llegir amb cat. No el pot modificar. I hi pot arribar perquè té x al directori, condició necessària que es comprova primer.

  • registre.log (640, root:adm): luis no és root ni membre d'adm, així que se li apliquen els permisos d'altres: ---. No el pot llegir. El fet que pugui llistar el directori i per tant veure que el fitxer existeix no li dona cap accés al seu contingut.

4. Pot luis esborrar registre.log?

No, però la raó no és la que sembla a primera vista.

Esborrar un fitxer no depèn dels permisos del fitxer: depèn de tenir w i x al directori que el conté. Si /srv/dades fos 770, luis sí que podria esborrar registre.log encara que no el pugui llegir, perquè estaria modificant la llista de noms del directori, no el fitxer.

En aquest cas concret no pot perquè /srv/dades és 750: el grup té r-x, sense w. És la manca de w al directori el que ho impedeix, no els permisos del registre.

Aquesta distinció és la que fa necessari el sticky bit en directoris com /tmp, on tothom té w.

Solució 2

Causa exacta. namei -l mostra la cadena completa i el bloqueig és a la primera línia rellevant:

drwxr-x--- root tramontana etc/tramontana

El directori /etc/tramontana és 750, propietat de root:tramontana. El compte de servei:

uid=997(svc-tramontana) gid=997(svc-tramontana) groups=997(svc-tramontana)

svc-tramontana no pertany al grup tramontana. Només és al seu propi grup. En avaluar l'accés a /etc/tramontana:

  • És el propietari root? No.
  • Pertany al grup tramontana? No.
  • Se li apliquen els permisos d'altres: ---.

Sense x a /etc/tramontana, no el pot travessar, així que ni tan sols arriba a avaluar els permisos d'app.conf. I encara que hi arribés, el fitxer també li donaria --- com a altres.

El detall important: el fitxer de configuració està perfectament configurat. El problema és la pertinença a grup del compte de servei. Sense namei -l és fàcil quedar-se mirant el 640 del fitxer i no veure el bloqueig real, que és un nivell més amunt.

Correcció:

operador@srv-tramontana:~$ sudo usermod -aG tramontana svc-tramontana

operador@srv-tramontana:~$ id svc-tramontana
uid=997(svc-tramontana) gid=997(svc-tramontana) groups=997(svc-tramontana),1002(tramontana)

# El servei no recull el grup nou fins que es reinicia
operador@srv-tramontana:~$ sudo systemctl restart tramontana

operador@srv-tramontana:~$ sudo -u svc-tramontana cat /etc/tramontana/app.conf | head -n 1
# Configuració de Tramontana Reserves

La -a d'usermod -aG és imprescindible: sense ella, substituiria els grups secundaris en comptes d'afegir-hi.

I el systemctl restart és necessari perquè, com vas veure a l'apartat 7, els grups d'un procés es fixen en arrencar. Afegir el compte al grup no afecta un procés que ja s'està executant.

Per què no chmod 644:

chmod 644 /etc/tramontana/app.conf faria que el servei arrenqués, sí. I seria una fallada de seguretat greu.

El fitxer conté la contrasenya de la base de dades. Amb 644, qualsevol usuari del sistema la pot llegir: www-data, nobody, qualsevol compte de servei d'una altra aplicació, qualsevol usuari que es creï en el futur i qualsevol procés compromès que aconsegueixi executar-se amb un compte sense privilegis.

L'escenari concret: un atacant troba una vulnerabilitat menor en un altre servei del mateix servidor i aconsegueix executar ordres com a www-data. Amb 640 i el grup ben posat, no pot fer res amb les credencials de Tramontana. Amb 644, llegeix la contrasenya de la base de dades, s'hi connecta directament i s'emporta totes les dades d'hostes. Un incident contingut es converteix en una filtració.

A més, 644 no arregla la causa. El compte de servei continua sense ser al grup al qual pertanyen tots els altres recursos de l'aplicació. El mateix error tornarà a aparèixer amb els registres, amb el directori de còpies i amb cada recurs nou, i s'anirà apedaçant cada vegada obrint permisos, fins a acabar amb un desplegament completament exposat.

El principi general: quan alguna cosa dona «permission denied», la pregunta correcta no és «com obro això», sinó «qui hauria de tenir-hi accés i com l'hi dono només a ells». La resposta gairebé sempre és la pertinença a un grup, no un chmod més permissiu.

Solució 3

1. Estat actual:

operador@srv-tramontana:~$ sudo stat -c '%a  %A  %U:%G  %n' \
    /opt/tramontana/app \
    /etc/tramontana/app.conf \
    /var/log/tramontana \
    /srv/tramontana/backups \
    /home/operador/scripts
777  lrwxrwxrwx  root:root  /opt/tramontana/app
640  -rw-r-----  root:tramontana  /etc/tramontana/app.conf
750  drwxr-x---  svc-tramontana:adm  /var/log/tramontana
770  drwxrwx---  root:tramontana  /srv/tramontana/backups
775  drwxrwxr-x  operador:operador  /home/operador/scripts
Ruta Octal Propietari:Grup Valoració
/opt/tramontana/app 777 root:root Correcte: és un enllaç, els seus permisos no s'apliquen
/etc/tramontana/app.conf 640 root:tramontana Correcte
/var/log/tramontana 750 svc-tramontana:adm Correcte
/srv/tramontana/backups 770 root:tramontana Millorable: falta SGID
/home/operador/scripts 775 operador:operador Incorrecte: llegible i travessable per tothom

2. Correccions proposades:

# /srv/tramontana/backups: afegir SGID perquè les còpies heretin el grup
operador@srv-tramontana:~$ sudo chmod 2770 /srv/tramontana/backups
operador@srv-tramontana:~$ ls -ld /srv/tramontana/backups
drwxrws--- 3 root tramontana 4096 Aug 18 11:20 /srv/tramontana/backups

Sense SGID, una còpia creada per un altre membre de l'equip naixeria amb el seu grup personal i la resta no la podria gestionar. Amb SGID, tot el que es crea a dins hereta tramontana. És el requisit perquè un directori compartit funcioni realment en equip.

# /home/operador/scripts: tancar l'accés a altres
operador@srv-tramontana:~$ chmod 750 /home/operador/scripts
operador@srv-tramontana:~$ chmod -R u=rwX,go= /home/operador/scripts
operador@srv-tramontana:~$ chmod 750 /home/operador/scripts/*.sh

Amb 775, qualsevol usuari del sistema podia llegir els scripts d'administració. Això no és trivial: els scripts revelen rutes internes, noms de serveis, procediments de còpia i de vegades —per descuit— credencials. És informació de reconeixement gratis per a un atacant.

Una comprovació addicional que val la pena fer sempre:

# Buscar còpies de la configuració amb permisos laxos
operador@srv-tramontana:~$ sudo ls -l /etc/tramontana/
-rw-r----- 1 root tramontana 512 Aug 18 08:47 app.conf
-rw-r----- 1 root tramontana 512 Aug 18 08:47 app.conf.bak-2026-08-18

Totes dues amb 640. Correcte, gràcies al cp -p.

3. Informe per a la Marta:

Disseny de permisos d'accés — Tramontana Reserves

El servidor controla qui pot veure i modificar cada fitxer mitjançant un sistema de permisos que assigna a cada fitxer un propietari, un grup de treball i uns drets concrets per a cadascun. Hem revisat i ajustat els cinc elements del desplegament.

Què protegeix el disseny actual. El codi de l'aplicació pertany a l'administrador i l'aplicació el pot executar però no modificar: si algú aconseguís explotar una fallada del programa, no podria alterar el mateix programa per instal·lar-s'hi de manera permanent. El fitxer de configuració, que conté la contrasenya de la base de dades, només és llegible per l'administrador i pels comptes de l'equip de Tramontana; cap altre compte del servidor no el pot veure, ni tan sols els d'altres serveis que hi pugui haver instal·lats. Els registres d'activitat, que inclouen dades d'ús dels clients, estan igualment restringits. Les còpies de seguretat són accessibles només per a l'equip, i hi hem afegit un ajust perquè qualsevol còpia que generi qualsevol membre de l'equip quedi automàticament accessible a la resta, evitant que una còpia acabi sent inutilitzable per un problema de permisos. Finalment, hem tancat l'accés als scripts d'administració, que fins ara podia llegir qualsevol compte del servidor i que descriuen el funcionament intern del sistema.

Què no protegeix. Aquest mecanisme controla l'accés des de dins del servidor i entre comptes diferents. No protegeix davant de tres coses: qui tingui accés d'administrador ho pot llegir tot, perquè aquesta és la naturalesa del rol; les dades estan emmagatzemades sense xifrar, de manera que qui obtingués accés físic al disc o a una còpia de seguretat les podria llegir sense necessitat de credencials; i no impedeix que algú amb accés legítim copiï informació fora del servidor.

Recomanació. Atès que el sistema emmagatzema noms d'hostes, dates d'estada i imports —dades personals subjectes al RGPD—, aquest disseny hauria de ser revisat i validat pel responsable de protecció de dades abans de considerar-lo definitiu. És probable que la normativa exigeixi, a més del control d'accés que ja tenim, el xifratge de les dades emmagatzemades i un registre auditable dels accessos. Proposo tractar-ho a la propera reunió i planificar aquestes dues mesures com a fase següent.

Aquest informe compleix el que s'espera d'un professional: descriu el que s'ha fet en llenguatge comprensible, és honest sobre els límits de la solució, i eleva a qui correspon una decisió que no és tècnica sinó de compliment normatiu.

Conclusió

Tanques el Mòdul 2 amb la peça que faltava: la que converteix un servidor que funciona en un servidor que a més és segur.

  • El model d'Unix assigna a cada fitxer un propietari i un grup, i divideix la resta del món en tres categories. Els permisos no se sumen: se selecciona la primera categoria que coincideix.
  • Saps llegir -rw-r----- caràcter a caràcter, i reconeixes els set tipus de fitxer per la seva primera lletra.
  • Entens que r, w i x signifiquen coses diferents en fitxers i en directoris: que x és travessar, que r sense x és gairebé inútil, i que w en un directori permet esborrar fitxers que no són teus, perquè esborrar és una operació sobre la llista de noms, no sobre el fitxer.
  • Tradueixes entre octal i simbòlic en tots dos sentits, i coneixes els valors que apareixen de debò: 644, 640, 600, 755, 750, 700, 711.
  • Fas servir chmod en les dues notacions, i saps que el recursiu correcte és u=rwX,g=rX,o= amb X majúscula, mai -R 644 ni -R 777.
  • Saps per què chmod -R 777 no és una solució i quin és el diagnòstic correcte: id, ls -l i sobretot namei -l.
  • Manejes chown i chgrp, saps que chown exigeix root i per què, i coneixes --reference i -h.
  • Tens clar que el treball en equip es resol amb un grup compartit i no amb permisos per a «altres», que usermod -aG necessita la -a, i que els grups s'apliquen en iniciar la sessió.
  • Calcules la umask i el seu efecte sobre les bases 666 i 777, i saps que 027 és la recomanable en un servidor amb dades sensibles.
  • Reconeixes SUID, SGID i sticky en un ls -l, saps què fa cadascun en una frase, i saps que el seu estudi a fons és la lliçó 05-02.
  • I has dissenyat i justificat els permisos complets del desplegament de Tramontana Reserves, inclosa la part més professional de totes: dir amb claredat què protegeix el disseny i què no, i elevar a qui correspon el que excedeix el teu àmbit de decisió.

Fes balanç del mòdul sencer. Vas començar amb un indicador parpellejant i sense saber com escriure una ordre amb soltesa. Ara manegues la línia d'ordres amb dreceres i historial, resols dubtes amb la documentació del sistema sense dependre d'un cercador, recorres i caracteritzes un servidor desconegut amb cinc ordres, crees, copies, mous, empaquetes i verifiques fitxers amb procediments reproduïbles, llegeixes i edites contingut amb less, nano i el vim just per no quedar-te tancat, entens què és un inode i has dissenyat un patró de desplegament amb enllaços, i saps decidir qui accedeix a què i per què. Això ja no és «saber ordres»: és tenir criteri.

Al Mòdul 3: Habilitats Avançades a la Línia d'Ordres tot això es multiplica. Aprendràs a personalitzar el teu entorn amb variables, àlies i historial persistent, a descriure conjunts de fitxers amb comodins i patrons amb expressions regulars, a buscar qualsevol cosa a qualsevol lloc amb find, locate i grep, a encadenar programes amb canonades i a redirigir-ne l'entrada i la sortida —aquella mecànica que has fet servir de rebot i que per fi entendràs del tot—, a processar text amb cut, sort, uniq, sed i awk fins a convertir acces.log i reserves.csv en els informes que la Marta demana, a controlar els processos del sistema i a programar tasques amb cron perquè s'executin soles de matinada. És el mòdul on deixes d'executar ordres una a una i comences a compondre-les, que és exactament el que anunciava la filosofia Unix del primer mòdul. Actualitza la instantània de la teva VM i ens hi veiem.

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