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
- El model de seguretat d'Unix: usuari, grup, altres
- Llegir la cadena d'
ls -lcaràcter a caràcter - Els tres permisos en fitxers i en directoris
- Notació octal i notació simbòlica
chmoden totes dues notacionschownichgrp- Grups: per què el treball en equip no es resol amb «altres»
- La màscara
umask - Bits especials: SUID, SGID i sticky
- Cas pràctic: els permisos de Tramontana Reserves
- 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.txtAquest 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.
É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
operadorEls 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.
- Llegir la cadena d'
ls -l caràcter a caràcter
ls -l caràcter a caràcteroperador@srv-tramontana:~$ ls -l /etc/tramontana/app.conf
-rw-r----- 1 root tramontana 512 Aug 18 08:47 /etc/tramontana/app.confLa 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.12lrwxrwxrwx: 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í.
- 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 deniedEl 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
contingutNo 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????????? ? ? ? ? ? interiorPots 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/
interiorHas 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.
- 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:
D'octal a simbòlic, descomponent cada dígit:
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/appSimbòlica
La notació simbòlica es fa servir per modificar permisos sense tocar els altres. La seva gramàtica és:
| 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.
chmod en totes dues notacions
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.txtEs 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.txtQuan 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:
-R i el problema del recursiu
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 deniedEl 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:
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 fitxernamei -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.
chown i chgrp
chown i chgrpchown 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.confFormes 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 permittedLa 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 permittedoperador é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:
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.
- 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 sudoA 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:syslogEl 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».
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/backupsAvantatges 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 sapCal 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.
- La màscara
umask
umaskQuan 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.
Càlcul amb umask 022:
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.txtCàlcul amb umask 027:
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.txtComparativa 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 022Els 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.
- 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/passwdAquesta 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/compartitLa 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
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 /tmp4755 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.
- 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 executableDirectoris 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
tramontanaambr-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=rXal recursiu: els directoris rebenxi els fitxers de dades no, gràcies a laXmajú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.conf640, i el directori 750.
Justificació:
- Conté la contrasenya de la base de dades. Amb el
644habitual de/etc, qualsevol usuari del sistema la podria llegir. Això inclouwww-datai 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
wper 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
.bakno pot quedar amb permisos més laxos. Aquesta és una fallada real i freqüent: es copia la configuració aapp.conf.baki la còpia neix amb la umask del moment, potser644. 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-18cp -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.logDirectori 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.logconté 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
wper al servei perquèlogrotatei 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/backups2770: 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 gruptramontana. Sense ell, una còpia creada per en Luis tindria grupluisi 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/backupsAdvertiment 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:
- Tradueix a octal:
rwxr-x---,rw-rw-r--,r--------,rwsr-xr-x. - Tradueix a simbòlic:
750,644,2775,1777. - Explica què pot fer exactament l'usuari
luis(membre detramontana, 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
- Podria
luisesborrarregistre.log? Justifica la resposta.
Exercici 2: diagnòstic d'un permís denegat
L'aplicació no arrenca. Al registre del servei apareix:
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.confIdentifica 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:
- Una taula amb els permisos actuals de les cinc rutes de Tramontana, en octal i amb propietari.
- La identificació de qualsevol ruta els permisos de la qual consideris incorrectes, amb la correcció proposada.
- 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):luisno ésroot, així que no se li apliquen els permisos d'usuari. Sí que és membre detramontana, 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 faltaw. -
config.txt(640,root:tramontana): se li aplica el grup,r--. El pot llegir ambcat. No el pot modificar. I hi pot arribar perquè téxal directori, condició necessària que es comprova primer. -
registre.log(640,root:adm):luisno ésrootni 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:
El directori /etc/tramontana és 750, propietat de root:tramontana. El compte de servei:
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 ReservesLa -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/backupsSense 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/*.shAmb 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-18Totes 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,wixsignifiquen coses diferents en fitxers i en directoris: quexés travessar, quersensexés gairebé inútil, i quewen 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
chmoden les dues notacions, i saps que el recursiu correcte ésu=rwX,g=rX,o=ambXmajúscula, mai-R 644ni-R 777. - Saps per què
chmod -R 777no és una solució i quin és el diagnòstic correcte:id,ls -li sobretotnamei -l. - Manejes
chownichgrp, saps quechownexigeixrooti per què, i coneixes--referencei-h. - Tens clar que el treball en equip es resol amb un grup compartit i no amb permisos per a «altres», que
usermod -aGnecessita la-a, i que els grups s'apliquen en iniciar la sessió. - Calcules la
umaski el seu efecte sobre les bases 666 i 777, i saps que027é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
- Què és Linux?
- Història de Linux
- Distribucions de Linux
- Instal·lant Linux
- Primer Contacte amb el Sistema
- Estructura del Sistema de Fitxers de Linux
Mòdul 2: Comandes Bàsiques de Linux
- Introducció a la Línia de Comandes
- Obtenir Ajuda i Documentació del Sistema
- Navegant pel Sistema de Fitxers
- Operacions amb Fitxers i Directoris
- Visualització i Edició de Fitxers
- Enllaços Durs i Simbòlics
- Permisos i Propietat dels Fitxers
Mòdul 3: Habilitats Avançades en la Línia de Comandes
- L'Entorn del Shell: Variables, Àlies i Historial
- Ús de Comodins i Expressions Regulars
- Cerca de Fitxers i Contingut: find, locate i grep
- Canonades i Redirecció
- Processament de Text: cut, sort, uniq, sed i awk
- Gestió de Processos
- Programació de Tasques amb Cron
- Comandes de Xarxa
Mòdul 4: Scripting en Shell
- Introducció al Scripting en Shell
- Variables i Tipus de Dades
- Entrada, Sortida i Arguments d'un Script
- Estructures de Control
- Funcions i Biblioteques
- Depuració i Gestió d'Errors
- Scripts de Producció: Bones Pràctiques
Mòdul 5: Administració del Sistema
- Gestió d'Usuaris i Grups
- sudo i Permisos Especials
- Gestió de Paquets
- Gestió de Discs
- systemd i la Gestió de Serveis
- Registres del Sistema: journald i syslog
- Monitoratge del Sistema i Optimització del Rendiment
- Còpies de Seguretat i Restauració
Mòdul 6: Xarxes i Seguretat
- Configuració de Xarxes
- SSH i Accés Remot
- Tallafocs i Seguretat Perimetral
- Sistemes de Detecció d'Intrusions
- Gestió de Secrets i Certificats TLS
- Assegurant Sistemes Linux
Mòdul 7: Temes Avançats
- El Procés d'Arrencada i la Recuperació del Sistema
- Diagnòstic Avançat: strace, perf i eBPF
- Optimització del Nucli de Linux
- Virtualització amb Linux
- Contenidors de Linux i Docker
- Automatització amb Ansible
- Alta Disponibilitat i Balanceig de Càrrega
