1. El modelo de permisos en Linux
Linux implementa un modelo de seguridad basado en el control de acceso discrecional o DAC, del inglés Discretionary Access Control. En este esquema, cada objeto del sistema de archivos, ya sea un archivo regular, un directorio, un socket, una tubería con nombre o un dispositivo, tiene un propietario, y es este quien decide a su discreción qué operaciones se permiten al resto de usuarios.
En un servidor, el modelo DAC es la barrera que separa a unos usuarios de otros y a cada servicio del resto del sistema. Una configuración deficiente de permisos expone información confidencial, permite manipular binarios y configuraciones, y es uno de los vectores más frecuentes de escalada local de privilegios, catalogada en MITRE ATT&CK dentro de la táctica Privilege Escalation y, en particular, en las técnicas T1548.001 (Setuid and Setgid) y T1222.002 (Linux and Mac Permissions, dentro de File and Directory Permissions Modification).
|
Principio de mínimo privilegio Todo usuario, servicio o proceso debe disponer únicamente de los permisos imprescindibles para desempeñar su función. Si un proceso solo necesita leer un archivo de configuración, no debe tener permiso de escritura sobre él ni sobre el directorio que lo contiene. |
El DAC no es la única capa de control. Sobre un mismo archivo actúan, de fuera hacia dentro, las opciones de montaje del sistema de archivos, los atributos del inodo, los permisos DAC con sus extensiones ACL y, si están activos, los módulos de control de acceso obligatorio como SELinux o AppArmor. Para que una operación se permita, todas las capas deben autorizarla. Esta guía recorre las capas en orden de complejidad creciente, empezando por los permisos DAC y terminando por las opciones de montaje. Los módulos de control de acceso obligatorio quedan fuera de su alcance.
1.1. Clases de acceso: propietario, grupo y otros
|
El inodo El inodo es la estructura en la que el sistema de archivos guarda los metadatos de cada archivo: su tipo, propietario, grupo, permisos, marcas temporales, número de enlaces y atributos extendidos, donde se almacenan las ACL y las capacidades. Cada inodo se identifica por un número, que muestra |
Cada inodo almacena un UID propietario, un GID propietario y nueve bits de permisos agrupados en tres clases:
-
Propietario (user,
u): el usuario al que pertenece el archivo, normalmente quien lo creó. -
Grupo propietario (group,
g): se aplica a los miembros del grupo asignado al archivo, tanto si es su grupo principal como si es uno de sus grupos secundarios. -
Otros (others,
o): cualquier usuario que no sea el propietario ni pertenezca al grupo. Es la clase con mayor alcance, ya que incluye a todas las cuentas locales y a todos los servicios del sistema, y por tanto la que más debe restringirse.
|
Orden de evaluación de los permisos en el núcleo El núcleo no suma los permisos de las tres clases, sino que selecciona una sola clase y aplica únicamente sus bits.
Por ello, un propietario al que se le retira la lectura (
|
1.1.1. El superusuario y las capacidades DAC
Las comprobaciones anteriores no se aplican igual a root. Un proceso con UID efectivo 0 recibe por defecto todas las capabilities del núcleo, entre ellas:
-
CAP_DAC_OVERRIDE, que le permite leer, escribir y atravesar cualquier objeto con independencia de sus permisos. La única excepción es la ejecución de archivos regulares.rootsolo puede ejecutar un archivo si al menos una de las tres clases tiene el bitx. -
CAP_DAC_READ_SEARCH, que permite leer cualquier archivo y recorrer cualquier directorio. -
CAP_FOWNER, que permite cambiar permisos y atributos de archivos ajenos.
Por eso los permisos protegen a los usuarios entre sí, pero no protegen frente a un proceso que ya se ejecuta como root. Frente a ese escenario solo actúan las capas de control de acceso obligatorio, las opciones de montaje y las medidas de detección.
1.2. Semántica de los permisos en archivos y directorios
Los tres permisos básicos, lectura (r), escritura (w) y ejecución (x), tienen un significado distinto según se apliquen a un archivo regular o a un directorio. Confundirlos es el origen de buena parte de las configuraciones inseguras.
| Permiso | Valor octal | En archivos regulares | En directorios |
|---|---|---|---|
|
4 |
Leer el contenido del archivo |
Listar los nombres de las entradas con |
|
2 |
Modificar, sobrescribir o truncar el contenido |
Crear, eliminar y renombrar entradas, si además se tiene |
|
1 |
Ejecutar el archivo como programa |
Atravesar el directorio: entrar con |
|
Eliminar un archivo depende del directorio, no del archivo Borrar o renombrar un archivo modifica el directorio que lo contiene, no el archivo. Un usuario sin ningún permiso sobre un archivo confidencial ( |
1.2.1. Combinaciones de permisos en directorios
-
Solo lectura (
r--): se obtienen los nombres de las entradas, perols -lmuestra signos de interrogación en lugar de sus metadatos y no es posible acceder a ningún archivo ni entrar concd. -
Solo ejecución (
--x): permite atravesar el directorio sin listarlo. Quien conozca el nombre exacto de un archivo, como/srv/privado/informe.pdf, puede acceder a él si los permisos del archivo lo permiten. Es la base de los directorios de paso, como un directorio personal711que da acceso a~/public_html. -
Escritura sin ejecución (
-w-): no tiene utilidad práctica. Para crear o eliminar entradas se necesitanwyxsimultáneamente.
|
Para ejecutar un script interpretado no basta con |
|
Con los conceptos explicados hasta aquí, ya puede realizar el Ejercicio 1. Preparación del laboratorio e inspección de metadatos y el Ejercicio 2. Semántica de los permisos en directorios. |
1.3. Representación simbólica y octal
1.3.1. Representación simbólica
-rwxr-xr-- (1) (2) (3) (4)
| 1 | Tipo de archivo, en este caso -, archivo regular. |
| 2 | Permisos del propietario: rwx, lectura, escritura y ejecución. |
| 3 | Permisos del grupo propietario: r-x, lectura y ejecución. |
| 4 | Permisos del resto de usuarios: r--, solo lectura. |
Los tipos de archivo posibles son los siguientes:
| Carácter | Tipo | Ejemplo |
|---|---|---|
|
Archivo regular |
|
|
Directorio |
|
|
Enlace simbólico |
|
|
Dispositivo de caracteres |
|
|
Dispositivo de bloques |
|
|
Socket de dominio UNIX |
|
|
Tubería con nombre o FIFO |
Creada con |
1.3.2. Representación octal
Cada clase se codifica con un dígito octal que es la suma de r = 4, w = 2 y x = 1:
| Octal | Binario | Simbólico | Significado |
|---|---|---|---|
|
|
|
Ningún acceso |
|
|
|
Solo ejecución o travesía |
|
|
|
Solo escritura |
|
|
|
Escritura y ejecución |
|
|
|
Solo lectura |
|
|
|
Lectura y ejecución |
|
|
|
Lectura y escritura |
|
|
|
Acceso completo |
Un cuarto dígito, situado a la izquierda, codifica los permisos especiales que se estudian en la sección 4.
1.3.3. Configuraciones de referencia
| Modo | Simbólico | Ámbito | Contexto de seguridad |
|---|---|---|---|
|
|
Archivos confidenciales |
Claves privadas SSH, |
|
|
Configuraciones y registros con lectores autorizados |
|
|
|
Archivos públicos de solo lectura |
|
|
|
Directorios privados |
|
|
|
Directorios de grupo y directorios personales |
|
|
|
Directorios y binarios públicos |
|
|
|
Inaceptable en producción |
Cualquier cuenta local o servicio comprometido puede alterar o sustituir el contenido |
1.4. Inspección de permisos y metadatos
1.4.1. Salida de ls -l
ls -l /etc/shadow
-rw-r----- 1 root shadow 1842 oct 14 09:30 /etc/shadow (1) (2) (3) (4) (5) (6) (7)
| 1 | Tipo de archivo y bits de permisos. |
| 2 | Número de enlaces duros que apuntan al inodo. |
| 3 | Usuario propietario. |
| 4 | Grupo propietario. |
| 5 | Tamaño en bytes. |
| 6 | Fecha de última modificación del contenido, o mtime. |
| 7 | Nombre del archivo. |
|
Un Si después de los permisos aparece un
El Con una ACL, la tripleta del grupo muestra la máscara y no los permisos del grupo, como se explica en la sección 5.1, y |
|
Referencias |
1.4.2. Metadatos completos con stat
stat muestra todos los metadatos del inodo, incluido el modo en octal:
stat /etc/shadow
File: /etc/shadow
Size: 1842 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 262145 Links: 1
Access: (0640/-rw-r-----) Uid: ( 0/ root) Gid: ( 42/ shadow)
Access: 2026-10-15 08:00:12.124500120 +0200
Modify: 2026-10-14 09:30:45.981023450 +0200
Change: 2026-10-14 09:30:45.981023450 +0200
Birth: 2026-09-01 10:15:00.000000000 +0200
Para auditorías automatizadas resulta más práctico su modo de formato, que devuelve solo los campos solicitados:
stat -c '%a %U:%G %n' /etc/passwd /etc/shadow /etc/group /etc/gshadow
| Parámetro | Función |
|---|---|
|
Define el formato de salida mediante secuencias que empiezan por |
|
Modo en octal |
|
Modo en notación simbólica, como en |
|
Nombre del usuario y del grupo propietarios |
|
Nombre del archivo |
| Marca temporal | Descripción | Se actualiza al | Explicación técnica |
|---|---|---|---|
|
Último acceso |
Leer el contenido |
Con la opción de montaje |
|
Última modificación |
Cambiar el contenido |
Puede fijarse arbitrariamente con |
|
Último cambio del inodo |
Cambiar el contenido o los metadatos: permisos, propietario, enlaces |
El núcleo la fija siempre con la hora actual y no existe ninguna llamada al sistema para asignarle un valor arbitrario. |
|
Creación |
Crear el inodo |
Disponible en |
|
|
|
Referencias |
2. Gestión de permisos y propiedad
| Comando | Función | Sintaxis representativa |
|---|---|---|
|
Modifica los bits de permisos estándar y especiales |
|
|
Modifica el usuario propietario y, opcionalmente, el grupo |
|
|
Modifica solo el grupo propietario |
|
2.1. El comando chmod
chmod, del inglés change mode, modifica el modo de un archivo, es decir, los doce bits de permisos que se almacenan en su inodo: tres bits especiales, que se estudian en la sección 4, y nueve bits de permisos básicos, que corresponden a la lectura, la escritura y la ejecución de cada una de las tres clases de la sección 1.1. Cada dígito octal agrupa tres de esos bits, como muestra la descomposición del modo 4755 de /usr/bin/passwd:
ls -l muestra este modo como -rwsr-xr-x. Los bits especiales no tienen columna propia y ocupan la posición de la x de cada clase.
Admite dos formas de indicar los permisos: el modo simbólico, que añade, retira o asigna permisos concretos a cada clase, y el modo octal, que fija el modo completo con un número.
Solo el propietario de un archivo, o un proceso con CAP_FOWNER, puede cambiar sus permisos.
2.1.1. Modo simbólico
La sintaxis es [clases][operador][permisos], y pueden encadenarse varias expresiones separadas por comas:
-
Clases:
upropietario,ggrupo,ootros,atodas. -
Operadores:
+añade,-retira y=asigna exactamente los permisos indicados, eliminando el resto para esa clase. -
Permisos:
r,w,x, la ejecución condicionalXy los bits especialessyt.
chmod u+x despliegue.sh # Ejecución solo para el propietario
chmod go-rwx id_ed25519 # Retira cualquier acceso al grupo y a otros
chmod a=r manual.txt # r--r--r--
chmod u=rw,go=r config.yml # rw-r--r--
El modo simbólico es preferible en correcciones porque solo modifica los bits indicados. chmod o-w archivo retira la escritura a otros sin alterar ningún otro permiso, mientras que un modo octal sobrescribe todos los bits.
2.1.2. Ejecución condicional con X
Al cambiar los permisos de un árbol completo con la opción -R, que aplica el cambio de forma recursiva, el permiso x plantea un problema, porque su significado depende del tipo de objeto:
-
Los directorios necesitan
xpara poder atravesarse, como se vio en la sección 1.2. Sin él, nadie puede acceder a su contenido. -
La mayoría de los archivos, como documentos, imágenes o configuraciones, no deben tener
x, ya que no son programas.
Por eso ninguna de las dos opciones evidentes funciona: chmod -R a+rx convierte en ejecutables todos los archivos, y chmod -R a+r no concede x a los directorios que no lo tengan, que seguirán sin poder atravesarse.
La X mayúscula resuelve el problema. Concede la ejecución solo donde tiene sentido.
| Objeto | ¿Recibe x con X? |
|---|---|
Directorio |
Sí, siempre |
Archivo que ya tiene |
Sí |
Archivo sin |
No |
Por ejemplo, para dejar el contenido de una web accesible al propietario y a su grupo, y cerrado para los demás:
sudo chmod -R u=rwX,g=rX,o= /srv/web
| Expresión | Efecto |
|---|---|
|
El propietario recibe lectura y escritura, y ejecución solo en directorios y archivos ejecutables |
|
El grupo recibe lectura, y ejecución solo en directorios y archivos ejecutables |
|
Otros no reciben ningún permiso |
2.1.3. Modo octal
El modo octal asigna el modo completo de una sola vez con los valores de la sección 1.3.2. Cada dígito corresponde a una clase y es la suma de r = 4, w = 2 y x = 1. A diferencia del modo simbólico, no parte de los permisos actuales, sino que los sustituye todos por los indicados.
sudo chmod 640 /etc/rsyslog.conf
sudo chmod 750 /opt/scripts
| Orden | Resultado | Motivo |
|---|---|---|
|
|
El propietario puede modificar la configuración, el grupo solo puede leerla y el resto de usuarios no tiene ningún acceso |
|
|
El propietario gestiona el directorio, el grupo puede listarlo y atravesarlo para ejecutar sus scripts, y el resto de usuarios no tiene ningún acceso |
El número de dígitos determina qué bits se fijan:
| Dígitos | Ejemplo | Interpretación |
|---|---|---|
Tres |
|
Fijan los permisos del propietario, del grupo y de otros. El dígito de los bits especiales se considera |
Cuatro |
|
El primer dígito fija los bits especiales de la sección 4: |
Menos de tres |
|
Se completan con ceros por la izquierda: |
El modo octal es adecuado cuando se conoce el estado final completo, como al desplegar un archivo nuevo o al ajustar un archivo a los valores de referencia de la sección 1.3.3 o del CIS Benchmark. Para corregir un permiso concreto sin alterar el resto es preferible el modo simbólico, como se explicó en la sección 2.1.1.
|
El modo octal y los bits SetUID y SetGID en directorios GNU |
2.1.4. Copia de permisos con --reference
Cuando un archivo se crea con cp sin opciones, con un editor que lo reescribe o al extraerlo de una copia de seguridad, no recibe los metadatos del original. Su modo depende de la umask, que se estudia en la sección 3, y su propietario es quien lo crea. Para dejarlo igual que otro archivo, la opción --reference copia sus metadatos en lugar de escribirlos a mano:
sudo chown --reference=/etc/shadow /etc/shadow.bak
sudo chmod --reference=/etc/shadow /etc/shadow.bak
| Orden | Qué copia del archivo de referencia |
|---|---|
|
El propietario y el grupo |
|
Los doce bits del modo, incluidos los especiales |
El orden importa. chown se ejecuta primero porque, al cambiar el propietario de un ejecutable, el núcleo elimina sus bits SetUID y SetGID, como se explica en la sección 2.2.
|
Referencias |
|
Con los conceptos explicados hasta aquí, ya puede realizar el Ejercicio 3. Gestión de permisos con |
2.2. El comando chown
chown, del inglés change owner, cambia el usuario propietario de un archivo y, opcionalmente, su grupo propietario. El inodo no guarda nombres, sino el UID y el GID numéricos, que ls -l y stat traducen a nombres consultando las bases de datos de cuentas. Por eso, cuando se elimina una cuenta, sus archivos muestran un número en lugar de un nombre y pasan a ser archivos huérfanos, que se auditan en la sección 8.2.
sudo chown usuario archivo # Cambia el propietario
sudo chown usuario:grupo archivo # Cambia propietario y grupo
sudo chown :grupo archivo # Cambia solo el grupo
sudo chown -R usuario:grupo directorio # Aplica el cambio de forma recursiva
El primer argumento admite varias formas:
| Forma | Efecto |
|---|---|
|
Cambia solo el propietario |
|
Cambia el propietario y el grupo |
|
Cambia el propietario y asigna como grupo el grupo principal de ese usuario |
|
Cambia solo el grupo, igual que |
|
Usa directamente un UID y un GID numéricos, lo que resulta útil con archivos huérfanos o con identificadores que no existen en el sistema local |
Las opciones más relevantes son las siguientes:
| Parámetro | Función |
|---|---|
|
Aplica el cambio de forma recursiva a todo el árbol |
|
Cambia el propio enlace simbólico indicado en la línea de órdenes. Sin esta opción ni |
|
Solo cambia los archivos cuyo propietario y grupo actuales coinciden con los indicados. Permite reasignar de forma segura los archivos de una cuenta concreta sin tocar los demás |
|
No sigue ningún enlace simbólico y cambia el propio enlace. Es el comportamiento por defecto con |
|
Recorre los enlaces simbólicos a directorios indicados en la línea de órdenes y cambia el destino de los enlaces en lugar del propio enlace |
|
Recorre todos los enlaces simbólicos a directorios que encuentra en el árbol y cambia el destino de los enlaces en lugar del propio enlace |
|
Copia el propietario y el grupo de otro archivo, como se vio en la sección 2.1.4 |
|
Restricciones del núcleo sobre En Linux, solo un proceso con Además, al cambiar el propietario o el grupo de un archivo ejecutable, el núcleo elimina sus bits SetUID y SetGID y sus capacidades de archivo, incluso cuando el cambio lo hace |
|
Referencias |
2.3. El comando chgrp
chgrp, del inglés change group, cambia solo el grupo propietario de un archivo. Equivale a chown :grupo, pero expresa con más claridad la intención y es la forma habitual de conceder acceso a un equipo. Se asigna el archivo al grupo y, a continuación, se fijan los permisos de la clase g. Por ejemplo, para que los miembros de auditores puedan leer un registro sin poder modificarlo:
sudo chgrp auditores /var/log/auditoria.log
sudo chmod 640 /var/log/auditoria.log
ls -l /var/log/auditoria.log
-rw-r----- 1 root auditores 20480 oct 26 10:00 /var/log/auditoria.log
Como ocurre con chown, cambiar el grupo de un ejecutable elimina sus bits SetUID y SetGID, por lo que chgrp debe ejecutarse antes que chmod. En los directorios, en cambio, el bit SetGID se conserva.
| Parámetro | Función |
|---|---|
|
Aplica el cambio de forma recursiva a todo el árbol, con las mismas precauciones frente a los enlaces simbólicos que |
|
Cambia el propio enlace simbólico en lugar de su destino |
|
Copia el grupo de otro archivo |
2.3.1. Uso por usuarios sin privilegios
A diferencia del cambio de propietario, un usuario sin privilegios puede usar chgrp, o chown :grupo, sobre sus propios archivos, pero solo para asignarles un grupo del que sea miembro, ya sea su grupo principal o uno secundario. Esto le permite compartir un archivo con su equipo sin necesidad de un administrador, sin poder asignarlo a un grupo ajeno:
id -Gn # Grupos del proceso actual
chgrp desarrollo informe.txt # Funciona si el usuario pertenece a desarrollo
chgrp root informe.txt # Operation not permitted
|
El núcleo comprueba los grupos del proceso, que se fijan al iniciar la sesión. Si se acaba de añadir al usuario a un grupo con |
|
Referencias |
|
Con los conceptos explicados en esta sección, ya puede realizar el Ejercicio 4. Propiedad con |
3. La máscara de creación de archivos umask
Cada archivo nuevo necesita unos permisos iniciales, pero nadie ejecuta chmod tras cada redirección >, cada archivo que guarda un editor o cada registro que escribe un servicio. Los permisos de casi todos los archivos nuevos los decide la máscara de creación, o umask, que actúa como la política de permisos por defecto de cada usuario y de cada servicio.
Su importancia en el bastionado se aprecia con un ejemplo. Un administrador cuya sesión tiene la umask tradicional 022 exporta una base de datos:
mysqldump --all-databases > /srv/backups/copia.sql
ls -l /srv/backups/copia.sql
-rw-r--r-- 1 admin admin 52428800 oct 26 10:00 /srv/backups/copia.sql
La copia nace con permisos 644, por lo que cualquier cuenta local o servicio comprometido puede leer la base de datos completa si puede atravesar el directorio. Nadie ha cometido un error con chmod. Simplemente nadie lo ejecutó. Con umask 027, el mismo archivo nacería con 640 y el resto del sistema no tendría acceso.
La umask permite así invertir el enfoque de la protección:
-
Con
022, todo archivo nuevo nace legible por todos y hay que acordarse de cerrar cada archivo sensible. -
Con
027, todo archivo nuevo nace cerrado para los demás y solo se abre de forma explícita, conchmod,chgrpo una ACL, lo que deba compartirse.
Es el principio de mínimo privilegio de la sección 1 aplicado a todo lo que se cree en el futuro, y por eso el CIS Benchmark exige 027 como mínimo.
El mecanismo es el siguiente. Cuando un programa crea un archivo o un directorio, solicita al núcleo unos permisos iniciales en la llamada al sistema open() o mkdir(). El núcleo no los aplica tal cual, sino que antes elimina los bits indicados en la umask del proceso. La umask se hereda de proceso padre a proceso hijo, de modo que la que se fija al iniciar la sesión se aplica a todo lo que el usuario ejecute, y la de cada servicio se fija en su unidad de systemd, como se explica en la sección 3.3.
|
La No modifica los permisos de los archivos que ya existen ni impide que un programa los cambie después con |
3.1. Cálculo de los permisos resultantes
3.1.1. Modo solicitado por los programas
La umask solo puede retirar permisos, nunca añadirlos. El punto de partida es el modo que solicita cada programa:
-
Las utilidades habituales, como
touch, los editores o la redirección>de la shell, solicitan666para los archivos. Por eso un archivo nuevo nunca es ejecutable, con independencia de la máscara. -
mkdirsolicita777para los directorios, ya que sinxno podrían atravesarse. -
Algunos programas solicitan otros valores. El enlazador de un compilador pide
777para el binario que genera, yssh-keygencrea las claves privadas con600sea cual sea la máscara.
3.1.2. Operación a nivel de bits
El núcleo calcula el modo final con una operación lógica, no con una resta:
modo final = modo solicitado AND (NOT umask)
La resta octal da el resultado correcto en los casos habituales, como 022, 027 o 077, pero falla cuando la máscara retira bits que el modo solicitado no tenía:
umask |
Archivo, cálculo bit a bit | Resta octal 666 - umask |
Resultado real |
|---|---|---|---|
|
|
|
|
|
|
|
|
|
Para comprobar una máscara sin hacer cálculos, ejecute |
3.2. Comparativa de máscaras
umask |
Archivos | Directorios | Perfil de seguridad |
|---|---|---|---|
|
|
|
Tradicional: cualquier usuario local puede leer todos los archivos nuevos. No es adecuada en sistemas multiusuario. |
|
|
|
Colaborativa con UPG: el grupo puede escribir. Es segura solo si cada usuario tiene su propio grupo privado, como se explicó en el capítulo de gestión de usuarios y grupos, pero sigue concediendo lectura a otros. |
|
|
|
Bastionado corporativo: el grupo puede leer y el resto de usuarios no tiene ningún acceso. Valor exigido como mínimo por el CIS Benchmark. |
|
|
|
Máxima privacidad: solo el propietario accede. Adecuada para |
3.3. Configuración persistente
El comando umask 027 solo afecta a la shell actual y a sus procesos hijos. Para que la política sea persistente debe configurarse en los mecanismos que inicializan cada tipo de sesión:
-
/etc/login.defs: la directivaUMASKdefine el valor por defecto que aplica el módulopam_umasky queuseraddutiliza para calcular los permisos del directorio personal, salvo que se definaHOME_MODE.UMASK 027 -
pam_umask: en Debian y Ubuntu está activado en/etc/pam.d/common-session. Sin argumentos toma el valor delogin.defs, y se aplica a todas las sesiones gestionadas por PAM, incluidas las de SSH:session optional pam_umask.so -
Perfiles de shell: el CIS Benchmark comprueba también que ningún archivo de
/etc/profile,/etc/profile.d/*.shni/etc/bash.bashrcestablezca una máscara más permisiva:echo 'umask 027' | sudo tee /etc/profile.d/50-umask.sh > /dev/null sudo chmod 644 /etc/profile.d/50-umask.shLa redirección
>la realiza la shell del usuario sin privilegios, por lo quesudo echo … > archivono podría escribir en/etc/profile.d/. Por eso se recurre asudo tee, que lee la entrada estándar y la escribe en el archivo con privilegios deroot. La redirección> /dev/nulldescarta la copia queteeenvía también a la salida estándar. -
Servicios de
systemd: los servicios no inician una sesión de usuario y su máscara por defecto es0022. Se ajusta en cada unidad con la directivaUMask=:sudo systemctl edit nginx.service # [Service] # UMask=0027systemctl editabre un editor y guarda las directivas en un archivo complementario, o drop-in,/etc/systemd/system/nginx.service.d/override.conf, sin modificar la unidad que instala el paquete. Las líneas comentadas del ejemplo muestran el contenido que debe escribirse en el editor. Al guardar,systemdrecarga su configuración, pero la nueva máscara solo se aplica tras reiniciar el servicio consudo systemctl restart nginx.
|
Con |
|
Referencias
|
|
Con los conceptos explicados en esta sección, ya puede realizar el Ejercicio 5. Cálculo y configuración de la |
4. Permisos especiales y capacidades
El modelo básico no permite resolver situaciones habituales: que un usuario cambie su contraseña en un archivo que solo puede modificar root, que los archivos de un directorio de equipo pertenezcan siempre al grupo del equipo, o que en un directorio de escritura pública nadie pueda borrar los archivos ajenos. Para ello existen tres bits especiales:
| Bit | Octal | Simbólico | Se aplica a | Efecto |
|---|---|---|---|---|
SetUID |
|
|
Archivos ejecutables |
El proceso se ejecuta con el UID del propietario del archivo |
SetGID |
|
|
Ejecutables y directorios |
En ejecutables, el proceso toma el GID del archivo. En directorios, los nuevos archivos heredan su grupo |
Sticky Bit |
|
|
Directorios |
Solo el propietario de cada archivo puede borrarlo o renombrarlo |
|
Minúsculas y mayúsculas en Los bits especiales ocupan la posición de la |
4.1. SetUID
4.1.1. Funcionamiento
Al ejecutar un archivo con el bit SetUID, el núcleo asigna al nuevo proceso un UID efectivo igual al del propietario del archivo, mientras que el UID real sigue siendo el del usuario que lo lanzó. El UID efectivo es el que se usa para las comprobaciones de permisos, y el UID guardado, o saved set-user-ID, permite al programa alternar entre ambos para usar los privilegios solo cuando los necesita.
ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 68248 mar 28 2024 /usr/bin/passwd
Cuando un usuario sin privilegios ejecuta passwd, el proceso se ejecuta con UID efectivo 0, lo que le permite escribir el nuevo hash en /etc/shadow. El programa está diseñado para que el usuario solo pueda cambiar su propia contraseña, de modo que la seguridad del sistema depende por completo de la ausencia de errores en ese código.
|
SetUID y scripts interpretados Linux ignora el bit SetUID en los scripts que empiezan por |
4.1.2. Riesgos y abuso de SetUID
Un binario SetUID de root amplía la superficie de ataque del sistema. Basta con que contenga un error de memoria, que invoque otros programas confiando en variables de entorno como PATH, o que permita leer, escribir o ejecutar archivos arbitrarios, para que cualquier usuario local obtenga privilegios de superusuario.
El proyecto GTFOBins cataloga las utilidades estándar que permiten escapar a una shell o leer y escribir archivos arbitrarios. Si alguna de ellas recibe el bit SetUID, la escalada es inmediata.
|
Ejemplo de escalada con un binario SetUID mal asignado Si un administrador asignase SetUID a Primero, se asigna SetUID a
Ahora un usuario sin privilegios puede obtener una shell de
¿Cómo se mitiga este riesgo? Con el parámetro
Se debe revisar la salida y eliminar el bit de cualquier archivo que no lo necesite. En nuestro caso, deberíamos quitar el bit SetUID a
|
4.2. SetGID
El bit SetGID tiene dos efectos distintos según se aplique a un archivo ejecutable o a un directorio. Ambos comparten la misma idea, que es hacer que el grupo determine un comportamiento en lugar del usuario. El segundo uso, SetGID en directorios, es una de las herramientas más útiles para organizar el trabajo en equipo sin recurrir a root ni abrir los archivos a todo el sistema.
4.2.1. SetGID en ejecutables
Al ejecutar un archivo con SetGID, el proceso toma como GID efectivo el grupo propietario del archivo, igual que SetUID hace con el UID del propietario. Permite conceder un privilegio muy acotado a través de un grupo en lugar de dar acceso de root.
El ejemplo típico es la lectura de /etc/shadow, que pertenece al grupo shadow con modo 640. En Debian y Ubuntu, chage y expiry son SetGID del grupo shadow, de modo que al ejecutarlos el proceso adquiere ese GID y puede leer el archivo, sin que ningún usuario ni el propio binario necesiten ser root. De forma análoga, crontab es SetGID del grupo crontab para escribir en /var/spool/cron/crontabs.
ls -l /usr/bin/chage
-rwxr-sr-x 1 root shadow 72184 mar 28 2024 /usr/bin/chage
Desde el punto de vista del bastionado, SetGID de un grupo concreto es preferible a SetUID de root: si el binario tiene un fallo, el atacante obtiene como mucho los privilegios de ese grupo, no el control total del sistema. Por eso, al revisar binarios privilegiados, un SetGID de shadow o crontab es menos grave que un SetUID de root, aunque ambos deben figurar en la línea base de la sección 8.4.
4.2.2. SetGID en directorios
Este es el uso más frecuente y el más interesante para el bastionado. Resuelve un problema concreto del trabajo en equipo.
El problema. Varias personas de un mismo equipo necesitan editar los archivos de una carpeta compartida. Sin SetGID, cada archivo nuevo recibe el grupo principal de quien lo crea, que con los grupos privados de usuario es un grupo distinto para cada persona:
drwxrwx--- 2 root desarrollo 4096 oct 15 10:00 proyecto/
-rw-r--r-- 1 ana ana 120 oct 15 10:05 proyecto/modulo_ana.py
-rw-r--r-- 1 luis luis 85 oct 15 10:06 proyecto/modulo_luis.py
Aunque el directorio pertenezca al grupo desarrollo, el archivo de ana pertenece al grupo ana y el de luis al grupo luis, así que no pueden editar los archivos del otro a través del grupo. La alternativa de abrir los archivos a others sería mucho peor, porque los expondría a todo el sistema.
La solución. Con el bit SetGID activado en el directorio, todo archivo o subdirectorio nuevo hereda el grupo del directorio en lugar del grupo de quien lo crea, y los subdirectorios heredan además el propio bit SetGID, de modo que la política se propaga a todo el árbol sin repetir la configuración.
sudo mkdir -p /srv/proyectos/desarrollo
sudo chown root:desarrollo /srv/proyectos/desarrollo
sudo chmod 2770 /srv/proyectos/desarrollo
ls -ld /srv/proyectos/desarrollo
drwxrws--- 2 root desarrollo 4096 oct 15 10:00 /srv/proyectos/desarrollo
La s en la posición de la x del grupo confirma que SetGID está activo. El modo 2770 combina el 2 del bit SetGID con el 770 que da acceso completo al propietario y al grupo desarrollo, y ninguno a others. A partir de aquí, cualquier archivo que cree un miembro del equipo nace con grupo desarrollo y el resto del equipo puede editarlo.
| Parámetro | Función |
|---|---|
|
Crea también los directorios intermedios que no existan y no devuelve error si el directorio ya existe |
|
Muestra los metadatos del propio directorio en lugar de listar su contenido |
Para que la herencia del grupo sea útil, los miembros deben además poder escribir como grupo: la umask de la sección 3 no debe retirar la escritura del grupo, lo que exige 002 o 007 en lugar de 027. Si la máscara es 027, el archivo hereda el grupo desarrollo pero nace con 640, y los compañeros solo podrán leerlo, no modificarlo.
|
La herencia de grupo solo se produce al crear
|
|
SetGID resuelve la propiedad de los archivos nuevos, pero no garantiza por sí solo que todos los miembros tengan acceso de escritura, que depende de la |
4.3. Sticky Bit
El Sticky Bit resuelve un problema que los nueve bits básicos no pueden expresar, el de un directorio donde todos puedan crear archivos, pero nadie pueda borrar los de los demás. Es exactamente lo que hace falta en un directorio compartido como /tmp.
El problema. Recuerde, de la sección 1.2, que borrar un archivo no depende de los permisos del archivo, sino de los del directorio que lo contiene. Hace falta w y x sobre el directorio. En un directorio de escritura pública con modo 777, cualquier usuario tiene esa escritura, así que cualquiera puede borrar o renombrar los archivos de cualquier otro, aunque esos archivos sean 600 y no pueda leerlos. En un directorio como /tmp, por el que pasan los archivos temporales, los sockets y los archivos de bloqueo de todos los usuarios y servicios, esto permitiría borrar el archivo de bloqueo de un servicio, provocar una denegación de servicio o sustituir un archivo que otro proceso va a leer.
La solución. El Sticky Bit añade una restricción al borrado. En un directorio que lo tenga activado, un usuario solo puede eliminar o renombrar un archivo si es su propietario, o el propietario del directorio, o tiene CAP_FOWNER. Todos pueden seguir creando archivos y modificando los propios, pero nadie toca los ajenos.
Históricamente, el bit tenía otro significado. Indicaba al sistema que mantuviese un programa en el área de intercambio para acelerar su carga. En Linux ese uso desapareció y solo queda el efecto sobre directorios.
Los directorios temporales del sistema ya lo traen activado, lo que se ve en la t final de los permisos:
ls -ld /tmp /var/tmp
drwxrwxrwt 14 root root 4096 oct 15 10:15 /tmp
drwxrwxrwt 3 root root 4096 oct 15 09:00 /var/tmp
La t ocupa la posición de la x de others. Una t minúscula indica que el directorio conserva el permiso x para others, y una T mayúscula que no lo tiene, lo que en un directorio compartido sería un error, porque nadie podría atravesarlo.
Desde el punto de vista del bastionado, la regla es simple: todo directorio de escritura pública debe tener el Sticky Bit.
Se activa con chmod, en modo simbólico u octal, anteponiendo el 1 a los tres dígitos habituales:
sudo chmod +t /srv/buzon # Modo simbólico
sudo chmod 1777 /srv/buzon # Modo octal
|
Con los conceptos de SetGID y Sticky Bit, ya puede realizar el Ejercicio 6. Directorio colaborativo con SetGID y el Ejercicio 7. Protección contra el borrado con Sticky Bit. |
4.4. Capacidades de archivos
Un binario SetUID de root es una herramienta contundente. Concede todos los privilegios del superusuario a un programa que, casi siempre, solo necesita uno. Como se vio en la sección 4.1, si ese programa tiene un fallo, el atacante hereda el control total del sistema. Las capacidades, o capabilities, son la respuesta del núcleo a ese exceso. Dividen los poderes de root en unidades independientes que pueden concederse por separado.
El núcleo define unas cuarenta capacidades, cuya lista completa figura en la página de manual capabilities(7) y crece con cada versión. La tabla siguiente recoge solo cuatro de las más relevantes para el bastionado, dos de red y dos que equivalen casi por completo a root:
| Capacidad | Privilegio que concede |
|---|---|
|
Abrir puertos inferiores a 1024 |
|
Usar sockets en bruto, como hace |
|
Ignorar las comprobaciones de permisos de archivos, como |
|
Cambiar el UID del proceso a cualquier valor, incluido el 0 |
No todas las capacidades representan el mismo riesgo. Algunas, como CAP_NET_BIND_SERVICE, conceden un privilegio muy acotado, mientras que otras, como CAP_SYS_ADMIN, abarcan tantas operaciones que equivalen en la práctica a ser root. Por eso lo importante no es memorizar la lista, sino saber consultar qué capacidad tiene un binario y valorar si el privilegio que otorga es proporcionado a su función.
4.4.1. Las capacidades como alternativa a SetUID
El caso de uso que mejor ilustra su ventaja es un servidor que debe escuchar en un puerto bajo, como el 443. La forma tradicional sería ejecutarlo como root o darle SetUID, con lo que todo el proceso tendría los privilegios del superusuario. En su lugar, se le concede solo la capacidad necesaria:
# Permitir que un servidor escuche en el puerto 443 sin ejecutarse como root
sudo setcap cap_net_bind_service=ep /usr/local/bin/servidor
getcap /usr/local/bin/servidor
Así, aunque el servidor sea vulnerable, un atacante que lo comprometa solo obtiene la capacidad de abrir puertos bajos, no el control del sistema. Esta es la ventaja de bastionado: reduce el privilegio al mínimo imprescindible, en lugar de conceder todo root.
El argumento de setcap sigue el formato capacidad=conjuntos, donde cada letra añade la capacidad a uno de los conjuntos del archivo:
| Conjunto | Función |
|---|---|
|
Contiene las capacidades que el proceso puede utilizar |
|
Activa las capacidades desde el inicio de la ejecución sin que el programa tenga que solicitarlas. Es imprescindible en programas que no gestionan capacidades |
|
Regula la transmisión de las capacidades a los programas que el proceso ejecute |
=ep es la combinación habitual. getcap muestra las capacidades asignadas a cada archivo indicado.
4.4.2. El riesgo: capacidades invisibles
Las capacidades reducen el privilegio, pero introducen un peligro propio para la auditoría. Se almacenan en el atributo extendido security.capability y no aparecen en ls -l: un binario con capacidades se ve igual que uno sin ellas. Por eso una auditoría que solo busque bits SetUID con find -perm las pasará por alto por completo.
El riesgo es grave porque algunas capacidades equivalen en la práctica a un SetUID de root. Si se asignan a un intérprete de uso general como python3 o perl, cualquier usuario puede usarlo para escalar privilegios:
| Capacidad en un intérprete | Por qué equivale a root |
|---|---|
|
El intérprete puede cambiar su UID a 0 y ejecutar código como |
|
Puede leer y escribir cualquier archivo, incluido |
|
Concede un amplio conjunto de operaciones administrativas del núcleo |
GTFOBins cataloga estos casos igual que los binarios SetUID abusables. Por eso el inventario de capacidades debe hacerse de forma explícita, con una orden propia, y no confiarse a la búsqueda de bits SetUID:
# Inventario de archivos con capacidades
sudo getcap -r / 2>/dev/null
| Parámetro | Función |
|---|---|
|
Recorre de forma recursiva el árbol indicado |
|
Descarta los errores que producen los pseudosistemas de archivos como |
El resultado debe compararse con una línea base, como se hace con los binarios SetUID en la sección 8.4. Cualquier capacidad que no figure en ella, sobre todo en un intérprete, debe investigarse. Para retirar una capacidad asignada se usa sudo setcap -r archivo.
|
Referencias |
|
Con los conceptos explicados en esta sección, ya puede realizar el Ejercicio 8. SetUID, capacidades y escalada de privilegios. |
4.5. Resumen de permisos especiales
| Mecanismo | Octal o comando | Efecto principal | Riesgo principal | Auditoría |
|---|---|---|---|---|
SetUID |
|
Ejecución con el UID del propietario |
Escalada a |
|
SetGID |
|
Ejecución con el GID del archivo o herencia de grupo en directorios |
Acceso a recursos del grupo, como |
|
Sticky Bit |
|
Solo el propietario borra sus archivos |
Su ausencia permite sabotaje y suplantación en directorios compartidos |
|
Capacidades |
|
Privilegios de |
Escalada si se asignan a intérpretes o utilidades genéricas |
|
Las búsquedas de la columna de auditoría utilizan las siguientes opciones de find:
| Parámetro | Función |
|---|---|
|
No desciende a otros sistemas de archivos montados bajo la ruta inicial, lo que evita recorrer |
|
Limita la búsqueda a archivos regulares o a directorios |
|
Selecciona los archivos que tienen activos todos los bits del modo: |
|
Selecciona los archivos que tienen activo alguno de los bits del modo: |
|
Niega la condición siguiente: |
|
|
|
Referencias |
5. Listas de control de acceso (ACL)
El modelo DAC solo permite definir permisos para un usuario, un grupo y el resto. Si una auditora externa, maria (o el grupo de auditores al que pertenece), necesita leer un archivo de finanzas que pertenece a juan:finanzas, no hay forma de concedérselo sin añadirla al grupo propietario, con acceso a todos los archivos del grupo, o sin abrirlo a others, con acceso para todo el sistema.
Las listas de control de acceso o ACL (Access Control Lists) resuelven esta limitación permitiendo añadir entradas para usuarios y grupos concretos. Linux implementa el borrador POSIX.1e, que nunca llegó a aprobarse como estándar pero es la implementación de referencia en los sistemas UNIX.
5.1. Soporte e identificación
Los sistemas de archivos ext4, XFS y Btrfs admiten ACL sin opciones de montaje adicionales. El soporte reside en el núcleo y en el sistema de archivos, y las ACL se almacenan como atributos extendidos del inodo, de modo que un archivo puede tener ACL aunque las órdenes getfacl y setfacl no estén disponibles.
|
|
Un archivo con ACL se identifica por el signo + tras los permisos:
-rw-rw----+ 1 juan finanzas 10240 oct 15 10:30 balance.xlsx
|
Cuando existe una ACL, la tripleta central de |
5.2. Consulta con getfacl
getfacl, del inglés get file access control list, muestra la ACL completa de un archivo o directorio. Es la orden que revela los permisos reales cuando ls -l marca un +, ya que, como se explicó en la sección 5.1, la tripleta del grupo de ls -l muestra entonces la máscara y no los permisos efectivos de cada entrada. No modifica nada, solo consulta.
getfacl balance.xlsx
# file: balance.xlsx
# owner: juan
# group: finanzas
user::rw- (1)
user:maria:rw- (2)
group::r-- (3)
group:auditores:r-- (4)
mask::rw- (5)
other::--- (6)
| 1 | Propietario del archivo, equivalente a la clase u. |
| 2 | Usuario con nombre: permisos específicos para maria. |
| 3 | Grupo propietario, en este caso finanzas. |
| 4 | Grupo con nombre: permisos para los miembros de auditores. |
| 5 | Máscara: techo de permisos para las entradas con nombre y el grupo propietario (2, 3 y 4). No afecta al propietario ni a other. |
| 6 | Resto de usuarios, equivalente a la clase o. |
Cada entrada sigue el formato tipo:calificador:permisos de la sección 5.3. Las entradas con el calificador vacío, user::, group:: y other::, son las tres clases del modo tradicional, mientras que lo que añade la ACL son las entradas con nombre, como user:maria: o group:auditores:.
Algunas opciones de uso frecuente son las siguientes:
| Parámetro | Función |
|---|---|
|
Recorre de forma recursiva los directorios indicados |
|
Omite los archivos que solo tienen los permisos básicos, de modo que la salida contiene únicamente los que tienen una ACL extendida |
|
No elimina la |
|
Presenta la salida en forma de tabla, más legible |
5.2.1. Algoritmo de evaluación
Con ACL, el núcleo amplía el orden de evaluación de la sección 1.1. Se aplica la primera regla que corresponda al proceso, sin acumular permisos:
-
Si el proceso es el propietario, se aplica
user::. -
Si existe una entrada
user:nombre:para el proceso, se aplica esa entrada limitada por la máscara. -
Si el proceso pertenece al grupo propietario o a algún grupo con nombre, se concede el acceso si alguna de esas entradas, limitada por la máscara, otorga el permiso solicitado. Si ninguna lo otorga, el acceso se deniega sin pasar a
other::, aunqueother::sí lo concediera. -
En otro caso, se aplica
other::.
|
Referencias |
5.3. Modificación con setfacl
setfacl, del inglés set file access control list, es la orden complementaria de getfacl. Añade, modifica o elimina entradas en la ACL de un archivo o directorio. Cuando se crea la primera entrada con nombre, el archivo pasa a mostrar el + de ls -l y el núcleo empieza a evaluarlo según el algoritmo de la sección 5.2.1.
Las operaciones se controlan con tres opciones básicas:
-
-mañade una entrada nueva o modifica una existente. -
-xelimina una entrada concreta, sin tocar el resto de la ACL. -
-bborra la ACL completa, de modo que el archivo recupera sus permisos tradicionales y pierde el+.
Las entradas de usuario y de grupo se indican con el formato tipo:calificador:permisos que se detalla más abajo.
setfacl -m u:maria:rw balance.xlsx # Añade o modifica una entrada de usuario
setfacl -m g:auditores:r balance.xlsx # Añade o modifica una entrada de grupo
setfacl -x u:maria balance.xlsx # Elimina una entrada concreta
setfacl -b balance.xlsx # Elimina toda la ACL y desaparece el +
Cada entrada sigue el formato tipo:calificador:permisos:
| Tipo | Entrada | Calificador |
|---|---|---|
|
Usuario |
Nombre del usuario. Si se omite, como en |
|
Grupo |
Nombre del grupo. Si se omite, como en |
|
Máscara |
Siempre vacío, como en |
|
Resto de usuarios |
Siempre vacío, como en |
Con -x solo se indican el tipo y el calificador, sin permisos.
|
A |
5.3.1. La máscara y los permisos efectivos
La máscara (mask::) es un techo: limita los permisos efectivos de los usuarios con nombre, el grupo propietario y los grupos con nombre, pero no afecta al propietario (user::) ni a other::. El permiso efectivo de cada entrada afectada es la intersección entre lo que la entrada concede y lo que la máscara permite.
1. La máscara se ajusta sola. Cada vez que se añade o modifica una entrada con setfacl -m, la máscara se recalcula automáticamente para abarcar todos los permisos concedidos. Por eso, al dar a maria lectura y escritura sobre un archivo cuyo grupo solo tenía lectura, la máscara sube a rw- y maria conserva su acceso completo:
setfacl -m u:maria:rw balance.xlsx
getfacl balance.xlsx
user::rw-
user:maria:rw-
group::r--
mask::rw-
other::---
2. Bajar la máscara restringe de golpe. Como la máscara acota a la vez a todas las entradas con nombre y al grupo propietario, basta con reducirla para recortar todos esos accesos en una sola orden, sin editar las entradas una a una. Al fijarla en r--, la escritura de maria deja de surtir efecto y getfacl lo señala con el comentario #effective:r--:
setfacl -m m::r balance.xlsx
getfacl balance.xlsx
user::rw-
user:maria:rw- #effective:r--
group::r--
mask::r--
other::---
La entrada de maria sigue diciendo rw-, pero su permiso real es solo de lectura, porque manda la máscara. El propietario (user::rw-) no se ve afectado, porque la máscara no lo limita.
3. Mantener una máscara restrictiva con -n. Si se fija una máscara baja y luego se añade otra entrada con setfacl -m, el recálculo automático volvería a subirla y anularía la restricción. La opción -n evita ese recálculo, de modo que la máscara conserva el valor fijado y la nueva entrada queda limitada por ella:
setfacl -n -m u:ana:rw balance.xlsx # añade a ana sin recalcular la máscara
4. La trampa de chmod (clave en bastionado). Como se advirtió en la sección 5.1, cuando un archivo tiene ACL, un chmod g-w o chmod g=r no modifica el grupo propietario, sino la máscara. Un administrador que vea rw- en el grupo con ls -l y lo «corrija» con chmod g-w estará recortando a la vez a maria, al grupo propietario y a cualquier grupo con nombre, casi siempre sin pretenderlo. En archivos con +, ajuste los permisos con setfacl y verifique siempre el resultado con getfacl.
5.4. ACL por defecto en directorios
Una ACL por defecto, definida con la opción -d, no controla el acceso al directorio, sino que actúa como plantilla para los archivos y subdirectorios que se creen en él:
# Acceso al propio directorio
sudo setfacl -m u:maria:rwx /srv/compartido
# Plantilla heredada por los nuevos archivos y subdirectorios
sudo setfacl -d -m u:maria:rwX /srv/compartido
getfacl /srv/compartido
La X mayúscula es la ejecución condicional que se explicó en la sección 2.1.2. En la plantilla concede el permiso de ejecución solo a los subdirectorios y a los archivos que ya sean ejecutables, pero no a los archivos de datos normales, evitando marcarlos como ejecutables de forma indebida.
|
Cuando un directorio tiene una ACL por defecto, la |
5.5. Copias de seguridad de ACL
No todas las herramientas conservan las ACL. cp -a, rsync -A y tar --acls las preservan, pero un cp sin opciones o una copia a un sistema de archivos sin soporte las pierde:
| Parámetro | Función |
|---|---|
|
Copia en modo archivo, conservando permisos, propietarios, marcas temporales y atributos extendidos, entre ellos las ACL |
|
Conserva las ACL. Suele combinarse con |
|
Guarda las ACL en el paquete y las restaura al extraerlo. Debe indicarse en ambas operaciones |
Antes de cambios masivos conviene guardar una copia restaurable:
getfacl -R -p /srv/compartido > acl_compartido.txt
sudo setfacl --restore=acl_compartido.txt
| Parámetro | Función |
|---|---|
|
Recorre el árbol de forma recursiva |
|
Conserva la |
|
Aplica a cada archivo de la copia las ACL que figuran en ella |
Sin -p, getfacl guarda rutas relativas y setfacl --restore las interpretaría respecto al directorio actual, por lo que la restauración solo funcionaría desde /.
|
Con los conceptos explicados en esta sección, ya puede realizar el Ejercicio 9. Control de acceso granular con ACL. |
6. Atributos de inodo: chattr y lsattr
Los sistemas de archivos ext4, XFS y Btrfs permiten marcar cada inodo con atributos que el núcleo aplica antes de evaluar los permisos. No deben confundirse con los atributos extendidos, o xattr, que son pares clave-valor donde se almacenan las ACL, las capacidades o las etiquetas SELinux.
6.1. Atributos relevantes para el bastionado
| Atributo | Letra | Efecto | Uso en bastionado |
|---|---|---|---|
Inmutable |
|
No se puede modificar, borrar, renombrar, enlazar ni cambiar sus metadatos, ni siquiera siendo |
Proteger archivos de configuración estáticos frente a errores y frente a atacantes sin privilegios |
Solo adición |
|
Solo se puede abrir en modo de adición. No se puede sobrescribir, truncar ni borrar |
Registros locales que no rota ninguna herramienta |
sudo chattr +i archivo # Activa el atributo inmutable
sudo chattr -i archivo # Lo desactiva
lsattr archivo # Muestra los atributos
----i---------e------- archivo
La e indica que el archivo usa extents, el formato de asignación de bloques de ext4, y no tiene relevancia para la seguridad.
|
Alcance real de la inmutabilidad Activar o desactivar |
|
Efectos secundarios operativos
|
6.2. Los atributos como técnica de persistencia
El atributo inmutable también lo utilizan los atacantes. Es habitual que el malware de minería o las botnets marquen como inmutables sus tareas de cron, su archivo authorized_keys o sus binarios para dificultar la limpieza, una variante de la técnica T1222.002 de MITRE ATT&CK. Por ello, en la respuesta ante incidentes es necesario buscar archivos con atributos inesperados:
sudo lsattr -R /etc /root /home /var/spool/cron 2>/dev/null | grep -E '^[^ ]*[ia][^ ]* '
La expresión regular de grep selecciona las líneas cuyo primer campo, el de los atributos, contiene una i o una a:
| Elemento | Función |
|---|---|
|
Recorre los directorios de forma recursiva |
|
Recorren desde el inicio de la línea cualquier secuencia de caracteres distintos del espacio, de modo que la búsqueda no sale del primer campo ni coincide con las letras del nombre del archivo |
|
Exige una |
|
Completa el campo hasta el espacio que lo separa del nombre del archivo |
|
Referencias |
|
Con los conceptos explicados en esta sección, ya puede realizar el Ejercicio 10. Atributos inmutable y de solo adición. |
7. Opciones de montaje seguras
La defensa en profundidad exige no depender exclusivamente de que los permisos de cada archivo sean correctos. Si un atacante consigue depositar un binario SetUID o un exploit en un directorio de escritura pública, las opciones de montaje del sistema de archivos pueden neutralizarlo.
7.1. Opciones de endurecimiento
| Opción | Efecto | Amenaza que mitiga |
|---|---|---|
|
El núcleo no interpreta los archivos de dispositivo de la partición |
Creación de nodos de dispositivo con |
|
Se ignoran los bits SetUID y SetGID y las capacidades de archivos |
Escalada mediante binarios SetUID depositados en particiones de usuario o temporales |
|
El núcleo rechaza ejecutar binarios de la partición |
Ejecución directa de exploits y malware descargados en directorios temporales |
|
Límites de
|
7.2. Configuración recomendada por el CIS Benchmark
El CIS Benchmark recomienda ubicar /tmp, /var/tmp, /dev/shm y /home en sistemas de archivos independientes con las siguientes opciones:
| Punto de montaje | nodev |
nosuid |
noexec |
|---|---|---|---|
|
Sí |
Sí |
Sí |
|
Sí |
Sí |
Sí |
|
Sí |
Sí |
Sí |
|
Sí |
Sí |
No |
Ejemplo en /etc/fstab:
/dev/mapper/vg0-tmp /tmp ext4 defaults,nodev,nosuid,noexec 0 2
/dev/mapper/vg0-vartmp /var/tmp ext4 defaults,nodev,nosuid,noexec 0 2
tmpfs /dev/shm tmpfs defaults,nodev,nosuid,noexec 0 0
/dev/mapper/vg0-home /home ext4 defaults,nodev,nosuid 0 2
| Campo | Descripción | Ejemplo | Explicación técnica |
|---|---|---|---|
1 |
Origen |
|
Dispositivo, volumen lógico o tipo de sistema virtual, como |
2 |
Punto de montaje |
|
Directorio en el que se monta el sistema de archivos |
3 |
Tipo |
|
Tipo de sistema de archivos |
4 |
Opciones |
|
|
5 |
Copia con |
|
Indica si |
6 |
Orden de |
|
Orden en que |
|
En Debian 13 y otras distribuciones recientes, |
Las opciones se aplican sin reiniciar remontando el sistema de archivos, y se verifican con findmnt:
sudo mount -o remount,nodev,nosuid,noexec /dev/shm
for m in /tmp /var/tmp /dev/shm /home; do
findmnt -no TARGET,OPTIONS "$m" || echo "$m: no es un punto de montaje independiente"
done
| Parámetro | Función |
|---|---|
|
Aplica las nuevas opciones a un sistema de archivos ya montado sin desmontarlo. El cambio no persiste tras un reinicio si no se refleja también en |
|
Suprime la línea de encabezado |
|
Selecciona las columnas que se muestran, en este caso |
El operador || ejecuta el echo solo cuando findmnt falla.
findmnt solo admite un punto de montaje por invocación. Con varias rutas interpreta las dos primeras como origen y destino y no muestra nada, por lo que se recorre la lista con un bucle. Si una ruta no es un punto de montaje independiente, como ocurre con /tmp o /home en una instalación con una sola partición, findmnt no devuelve nada y no es posible aplicarle opciones propias.
|
Referencias |
|
Con los conceptos explicados en esta sección, ya puede realizar el Ejercicio 11. Opciones de montaje y sus límites. |
8. Guía consolidada de bastionado y lista de verificación
Como síntesis de los capítulos anteriores, esta sección reúne los riesgos, las medidas de corrección y los comandos de verificación que deben aplicarse de forma sistemática.
8.1. Matriz de riesgos y medidas técnicas
| Vector de amenaza | Impacto potencial | Medida de bastionado | Verificación técnica |
|---|---|---|---|
Permisos |
Sustitución de archivos y webshells persistentes |
Grupos dedicados y permisos |
|
Binarios SetUID innecesarios |
Escalada local a |
Retirar el bit y mantener una línea base |
|
Capacidades en intérpretes |
Escalada local a |
Revisar y retirar con |
|
Directorios compartidos sin Sticky Bit |
Borrado y suplantación de archivos ajenos |
|
|
Máscara permisiva |
Archivos nuevos legibles por todos |
|
|
Archivos huérfanos |
Apropiación al reutilizar un UID |
Reasignar o eliminar antes de crear cuentas |
|
ACL olvidadas |
Accesos extraordinarios no documentados |
Revisión periódica con |
|
Particiones temporales ejecutables |
Ejecución de exploits descargados |
|
|
En la verificación de las ACL, getfacl -s omite los archivos que solo tienen los permisos básicos, de modo que la salida contiene únicamente los que tienen una ACL extendida. Las opciones -nouser y -nogroup de find se explican en la lista de verificación siguiente.
8.2. Lista de verificación (CIS Benchmark)
-
Permisos de los archivos de cuentas: el CIS Benchmark exige los siguientes valores, o más restrictivos, en los archivos de cuentas y sus copias de seguridad automáticas, terminadas en
-:Archivo Propietario Grupo Modo máximo /etc/passwd,/etc/passwd-rootroot644/etc/group,/etc/group-rootroot644/etc/shadow,/etc/shadow-rootshadoworoot640/etc/gshadow,/etc/gshadow-rootshadoworoot640/etc/shellsrootroot644/etc/security/opasswdrootroot600sudo stat -c '%a %U:%G %n' /etc/{passwd,group,shadow,gshadow}{,-} /etc/shells /etc/security/opasswd 2>/dev/nullLas llaves son una expansión de la shell:
{passwd,group,shadow,gshadow}{,-}genera las ocho rutas combinando cada nombre con una cadena vacía y con-.2>/dev/nulloculta el error de los archivos que no existan en el sistema. -
Permisos de configuraciones de servicios críticos:
Archivo o directorio Propietario Modo máximo /etc/crontabroot:root600/etc/cron.hourly,cron.daily,cron.weekly,cron.monthly,cron.droot:root700/etc/ssh/sshd_configy/etc/ssh/sshd_config.d/*.confroot:root600Claves privadas de host
/etc/ssh/ssh_host_*_keyroot:root600/boot/grub/grub.cfgroot:root600/etc/sudoersy archivos de/etc/sudoers.d/root:root440 -
Ningún archivo regular con escritura para todos:
sudo find / -xdev -type f -perm -0002 -lsLa acción
-lsmuestra cada resultado con sus metadatos, en un formato similar al dels -dils. -
Todos los directorios con escritura para todos tienen Sticky Bit:
sudo find / -xdev -type d -perm -0002 ! -perm -1000 -ls -
Ningún archivo sin propietario ni grupo válido:
sudo find / -xdev \( -nouser -o -nogroup \) -lsParámetro Función -nouserSelecciona los archivos cuyo UID no corresponde a ninguna cuenta existente
-nogroupSelecciona los archivos cuyo GID no corresponde a ningún grupo existente
-oCombina las dos condiciones con un O lógico
\(y\)Agrupan la expresión. Se escapan para que no los interprete la shell
-
Inventario de binarios SetUID, SetGID y con capacidades comparado con una línea base:
sudo find / -xdev -type f -perm /6000 -printf '%m %u:%g %p\n' 2>/dev/null | sort > suid_actual.txt sudo getcap -r / 2>/dev/null | sort > caps_actual.txtParámetro Función -printf formatoDefine el formato de salida de cada resultado
%mModo en octal
%u,%gUsuario y grupo propietarios
%pRuta del archivo
\nSalto de línea
sortordena el inventario para que pueda compararse línea a línea con la línea base. Cualquier entrada que no figure en la línea base generada tras la instalación debe investigarse. -
Archivos de inicio de los usuarios sin escritura para el grupo ni para otros:
sudo find /home -maxdepth 2 -name '.*' -type f -perm /022 -lsParámetro Función -maxdepth 2Limita la búsqueda a
/homey al primer nivel de cada directorio personal-name '.*'Selecciona los archivos ocultos. El patrón va entre comillas para que no lo expanda la shell
-perm /022Selecciona los que conceden escritura al grupo o a otros
-
Máscara por defecto
027o más restrictiva en/etc/login.defs,/etc/profile.d/y/etc/bash.bashrc, según la sección 3.3. -
Opciones de montaje de
/tmp,/var/tmp,/dev/shmy/homesegún la sección 7.2.
8.3. Retirada persistente del bit SetUID
Ejecutar chmod u-s sobre un binario del sistema no es una medida duradera. La siguiente actualización del paquete restaurará el bit. En Debian y Ubuntu, la retirada debe registrarse con dpkg-statoverride, que hace que dpkg respete el modo indicado en futuras actualizaciones:
# Ejemplo: retirar el bit SetUID de un binario que no utilizan los usuarios
sudo dpkg-statoverride --update --add root root 0755 /usr/bin/binario_prescindible
dpkg-statoverride --list
| Parámetro | Función |
|---|---|
|
Registra en la base de datos de |
|
Aplica de inmediato el modo registrado al archivo. Sin esta opción, el cambio solo se haría efectivo en la siguiente instalación del paquete |
|
Muestra las sustituciones registradas |
|
Elimina la sustitución registrada para esa ruta |
Antes de retirar el bit, compruebe con dpkg -S a qué paquete pertenece el binario y documente el motivo, ya que algunas funciones, como su, passwd o sudo, dejarán de estar disponibles para los usuarios sin privilegios.
8.4. Auditoría automatizada
Las comprobaciones anteriores deben ejecutarse periódicamente. El siguiente script compara el inventario actual de binarios privilegiados con una línea base y registra cualquier diferencia en el diario del sistema:
sudo install -d -m 700 /var/lib/auditoria-permisos
sudo tee /etc/cron.daily/auditoria-permisos > /dev/null << 'EOF'
#!/bin/bash
# Auditoría diaria de binarios privilegiados y escritura universal (CIS Benchmark)
set -o pipefail
DIR=/var/lib/auditoria-permisos
TAG=auditoria-permisos
inventario() {
find / -xdev -type f -perm /6000 -printf '%m %u:%g %p\n' 2>/dev/null
getcap -r / 2>/dev/null
}
inventario | LC_ALL=C sort > "$DIR/actual.txt"
[ -f "$DIR/base.txt" ] || cp "$DIR/actual.txt" "$DIR/base.txt"
NUEVOS=$(LC_ALL=C comm -13 "$DIR/base.txt" "$DIR/actual.txt")
[ -n "$NUEVOS" ] && logger -t "$TAG" -p auth.alert "ALERTA: nuevos binarios privilegiados: $NUEVOS"
ESCRITURA=$(find / -xdev -type f -perm -0002 2>/dev/null)
[ -n "$ESCRITURA" ] && logger -t "$TAG" -p auth.warning "Archivos con escritura universal: $ESCRITURA"
exit 0
EOF
sudo chmod 700 /etc/cron.daily/auditoria-permisos
sudo /etc/cron.daily/auditoria-permisos
journalctl -t auditoria-permisos
Las órdenes y parámetros del script tienen la siguiente función:
| Parámetro | Función |
|---|---|
|
Crea el directorio, por la opción |
|
Envía a |
|
Hace que una tubería devuelva el código de error de la última orden que falle, y no solo el de la última orden de la tubería |
|
Fuerza la ordenación byte a byte, de modo que |
|
Comprueba si existe el archivo. Si no existe, se ejecuta |
|
Compara dos archivos ordenados y suprime la columna 1, con las líneas exclusivas de la base, y la 3, con las comunes. Solo quedan las líneas que aparecen en el inventario actual y no en la base |
|
Es cierto si la variable no está vacía, y |
|
Etiqueta el mensaje con un identificador |
|
Fija la prioridad del mensaje: |
|
Evita que el script termine con error cuando la última comprobación no encuentra nada, ya que en ese caso |
|
Filtra el diario por el identificador asignado con |
El nombre del archivo no lleva extensión porque run-parts, que ejecuta los scripts de /etc/cron.daily, ignora los nombres que contienen un punto.
La línea base debe regenerarse de forma controlada tras cada actualización que añada binarios privilegiados legítimos, y conviene conservar una copia fuera del sistema auditado, ya que un atacante con privilegios de root podría modificarla.
|
Una vez estudiadas todas las medidas de esta guía, puede consolidar sus competencias completando el Ejercicio 12. Auditoría CIS de permisos. |
9. Ejercicios prácticos
Los ejercicios están diseñados para realizarse en orden sobre una máquina virtual Ubuntu o Debian de pruebas con sistema de archivos ext4, ya que algunos reutilizan usuarios, grupos y archivos creados en ejercicios anteriores. Los atributos de inodo no funcionan en contenedores ni en sistemas de archivos superpuestos. El último ejercicio deja el sistema en su estado original.
|
No realice estos ejercicios en un servidor en producción. Algunos pasos crean de forma deliberada configuraciones inseguras, como un binario SetUID de |
| Nº | Ejercicio | Competencia que desarrolla | Dificultad |
|---|---|---|---|
1 |
Interpretar |
Baja |
|
2 |
Comprobar el efecto real de |
Baja |
|
3 |
Aplicar permisos en modo simbólico, octal y con |
Media |
|
4 |
Comprender las restricciones del núcleo sobre la propiedad |
Media |
|
5 |
Predecir y fijar los permisos de los archivos nuevos |
Media |
|
6 |
Implementar la herencia de grupo y conocer sus límites |
Media |
|
7 |
Proteger directorios compartidos |
Baja |
|
8 |
Reconocer y auditar mecanismos de elevación |
Alta |
|
9 |
Gestionar entradas con nombre, máscara y ACL por defecto |
Alta |
|
10 |
Usar y detectar atributos de inodo |
Media |
|
11 |
Verificar el efecto de |
Media |
|
12 |
Detectar y corregir desviaciones de forma automatizada |
Alta |
|
13 |
Revertir los cambios realizados durante la práctica |
Baja |
9.1. Ejercicio 1. Preparación del laboratorio e inspección de metadatos
Todo análisis de permisos empieza por leer correctamente los metadatos de los inodos.
Realice los siguientes pasos:
-
Cree un usuario de pruebas llamado
usuario_labcon directorio personal y shellbash, que se utilizará para comprobar los accesos desde una cuenta distinta de la suya. -
Cree el directorio de trabajo
/srv/lab_permisos, asígnelo a su usuario y concédale permisos755, de modo queusuario_labpueda atravesarlo. -
Cree el archivo
documento.txty el directoriodepartamento. Identifique conls -lel tipo de cada uno y explique los permisos que han recibido. -
Obtenga con
statel modo en octal, el propietario y las tres marcas temporales dedocumento.txt. Ejecutechmod 600 documento.txty compruebe qué marca temporal ha cambiado. -
Muestre en una sola línea por archivo el modo octal, el propietario y el nombre de
/etc/passwd,/etc/shadowy/usr/bin/passwd.
9.2. Ejercicio 2. Semántica de los permisos en directorios
Realice los siguientes pasos:
-
Cree el directorio
privadocon un archivosecreto.txten su interior. Asigne al directorio el modo711y compruebe queusuario_labno puede listarlo pero sí leer el archivo si conoce su nombre y el archivo tiene permisos644. -
Cambie el modo del directorio a
744y compruebe qué muestrals -lejecutado porusuario_lab. -
Cree el directorio
buzoncon modo777y, dentro, el archivocontrato.txtcon modo600, ambos de su propiedad. Compruebe queusuario_labno puede leer el contrato pero sí borrarlo.
9.3. Ejercicio 3. Gestión de permisos con chmod
Realice los siguientes pasos:
-
Aplique a
documento.txt, en modo simbólico, lectura y escritura para el propietario, lectura para el grupo y ningún permiso para otros. Repita la operación en modo octal y verifíquela constat. -
Cree el script
despliegue.shy concédale permiso de ejecución solo al propietario. -
Cree el árbol
proyecto/con dos archivos de texto en distintos niveles y copie dentrodespliegue.sh. Aplique de forma recursivau=rwX,g=rX,o=y compruebe que los directorios y el script quedan con750y los archivos de texto con640. -
Cree el directorio
equipocon modo2770. Aplíquelechmod 0770y compruebe si conserva el bit SetGID. Retírelo después de forma explícita.
9.4. Ejercicio 4. Propiedad con chown y chgrp
Realice los siguientes pasos:
-
Intente asignar
documento.txtausuario_labsinsudoy analice el error. -
Sin
sudo, cambie el grupo dedocumento.txta uno de sus grupos secundarios, comosudooadm. Intente después asignarle el grupousuario_lab, del que no es miembro. -
Copie
/usr/bin/idcomoid_pruebaen el laboratorio, asígnele el propietariorooty el modo4755. Cambie después su propietario ausuario_laby compruebe qué ha ocurrido con el bit SetUID. -
Devuelva a
documento.txtel propietario y el grupo de su directorio personal usando--reference. Tenga en cuenta que la shell no expande~tras el signo=de una opción.
9.5. Ejercicio 5. Cálculo y configuración de la umask
Realice los siguientes pasos:
-
Consulte la máscara de su sesión en formato octal y simbólico, y los valores de
UMASK,USERGROUPS_ENAByHOME_MODEen/etc/login.defs. -
Calcule los permisos de un archivo y de un directorio nuevos con las máscaras
027y033. Compruebe sus cálculos en una subshell para no alterar la sesión. -
Compruebe la máscara efectiva de
usuario_laben una sesión de inicio y explique el valor obtenido a partir deUSERGROUPS_ENAB. -
Configure de forma persistente
umask 027para las shells interactivas mediante un archivo en/etc/profile.d/y verifique el resultado en una sesión nueva deusuario_lab.
9.6. Ejercicio 6. Directorio colaborativo con SetGID
Realice los siguientes pasos:
-
Cree el grupo
desarrolladoresy añada a él su usuario yusuario_lab. -
Cree
/srv/compartido_devcon propietarioroot, grupodesarrolladoresy modo2770. -
Cree un archivo en el directorio como
usuario_laby compruebe que su grupo esdesarrolladores. Intente listar el directorio con su propio usuario y explique por qué falla en la sesión actual, mientras quesudo -usí reconoce la nueva pertenencia al grupo. -
Como
usuario_lab, cree un archivo en su directorio personal y muévalo a la carpeta compartida; cree otro y cópielo. Compare el grupo de ambos.
9.7. Ejercicio 7. Protección contra el borrado con Sticky Bit
Realice los siguientes pasos:
-
Cree
/srv/buzon_publicocon modo777y, como su usuario, cree en élarchivo_usuario.txt. Compruebe queusuario_labpuede borrarlo. -
Active el Sticky Bit, cree de nuevo el archivo y repita el intento de borrado como
usuario_lab. -
Compruebe que
/tmpy/var/tmptienen Sticky Bit.
9.8. Ejercicio 8. SetUID, capacidades y escalada de privilegios
Realice los siguientes pasos:
-
Obtenga el inventario de binarios SetUID y SetGID del sistema e identifique a qué paquete pertenecen tres de ellos.
-
Copie
/bin/bashcomobash_suiden el laboratorio, asígnelo arootcon modo4755y ejecútelo comousuario_lab, primero sin opciones y después con-p. Compare la salida deiden ambos casos. -
Compruebe que el binario aparece en el inventario de SetUID y elimínelo de inmediato.
-
Obtenga el inventario de archivos con capacidades del sistema. Copie
/usr/bin/python3en el laboratorio, asígnelecap_setuid=ep, compruebe quels -lno muestra nada anómalo y demuestre la escalada comousuario_lab. Elimine la copia.
9.9. Ejercicio 9. Control de acceso granular con ACL
Este ejercicio consolida el uso de las ACL de la sección 5. Trabaje dentro del directorio /srv/lab_permisos creado en el Ejercicio 1 y utilice la cuenta usuario_lab, que puede atravesar ese directorio pero no es propietaria ni miembro del grupo de los archivos que usted cree en él.
Realice los siguientes pasos:
-
Instale el paquete
aclsi no está presente. Dentro de/srv/lab_permisos, cree el archivoinforme_financiero.txtcon modo640y compruebe, desde la cuenta deusuario_lab, que no puede leerlo, ya que no es el propietario ni pertenece a su grupo. -
Añada una entrada de ACL que conceda a
usuario_labpermiso de lectura y escritura sobreinforme_financiero.txt. Compruebe que enls -laparece el signo+y verifique, desde la cuenta deusuario_lab, que ahora sí puede leer el archivo. -
Ejecute
chmod g-w informe_financiero.txty observe congetfaclcómo ha cambiado la máscara y, con ella, el permiso efectivo deusuario_lab, que pasa a aparecer como#effective:r--. Es la trampa descrita en la sección 5.3.1:chmodno toca el grupo, sino la máscara. Compruebe desde la cuenta deusuario_labque ya no puede escribir en el archivo. -
Cree el directorio
compartido_acl. Asígnele una ACL de acceso que conceda ausuario_lablectura, escritura y ejecución (la ejecución es imprescindible para poder entrar en el directorio) y una ACL por defecto, que actúa como plantilla, con lectura y escritura. Cree después un archivo dentro del directorio y compruebe congetfaclque ha heredado la entrada deusuario_lab. -
Guarde de forma recursiva las ACL de
/srv/lab_permisosen un archivo de su directorio personal. Elimine a continuación toda la ACL deinforme_financiero.txtconsetfacl -b, compruebe que desaparece el+, y restaure las ACL a partir de la copia guardada, verificando congetfaclque el informe recupera la entrada deusuario_lab.
9.10. Ejercicio 10. Atributos inmutable y de solo adición
Realice los siguientes pasos:
-
Cree
firewall.conf, actívele el atributo inmutable y compruebe conlsattrque está presente. -
Intente, con
sudo, modificar, renombrar, cambiar los permisos y borrar el archivo. -
Cree
auditoria.logcon atributo de solo adición y compruebe que admite>>pero no>. Retire después ambos atributos y elimine los archivos. -
Busque en
/etc,/root,/homey/var/spool/cronarchivos con los atributosioay razone si su presencia sería legítima.
9.11. Ejercicio 11. Opciones de montaje y sus límites
Realice los siguientes pasos:
-
Consulte las opciones de montaje actuales de
/,/tmp,/var/tmp,/dev/shmy/home, e indique qué controles del CIS Benchmark se cumplen. -
Monte un sistema de archivos
tmpfsde prueba en/mnt/lab_noexeccon las opcionesnodev,nosuid,noexec. Copie en éldespliegue.she intente ejecutarlo directamente y a través debash. -
Remonte el sistema de archivos sin
noexecpero connosuid, copie en él/bin/bashcon modo4755y propietarioroot, y compruebe quebash -pno obtiene privilegios.
9.12. Ejercicio 12. Auditoría CIS de permisos
Realice los siguientes pasos:
-
Verifique los permisos y propietarios de los archivos de cuentas y de configuración de la sección 8.2 e indique si alguno incumple el CIS Benchmark.
-
Cree en el laboratorio un archivo con modo
666y un directorio con modo777sin Sticky Bit. Localícelos con las búsquedas de la lista de verificación y corríjalos. -
Cree el usuario
temporal_lab, genere un archivo suyo en el laboratorio y elimine la cuenta sin borrar el archivo. Localice el archivo huérfano y reasígnelo aroot. -
Instale el script de auditoría de la sección 8.4 y ejecútelo para generar la línea base. Copie después
/usr/bin/iden/srv/lab_permisoscon SetUID deroot, ejecute de nuevo el script y compruebe la alerta en el diario. Elimine el binario.
9.13. Ejercicio 13. Limpieza del entorno
Para terminar, revierta los cambios realizados durante la práctica.
Realice los siguientes pasos:
-
Desmonte el sistema de archivos de prueba y elimine su punto de montaje.
-
Retire cualquier atributo de inodo que haya quedado en el laboratorio y elimine los directorios
/srv/lab_permisos,/srv/compartido_devy/srv/buzon_publico, así como la copia~/acl_lab.txt. -
Elimine el usuario
usuario_labcon su directorio personal y el grupodesarrolladores. -
Decida si conserva la máscara configurada en
/etc/profile.d/50-umask.shy el script de auditoría/etc/cron.daily/auditoria-permisos. Si no los conserva, elimínelos junto con/var/lib/auditoria-permisos. -
Compruebe que no queda ningún archivo huérfano generado durante la práctica.
Con la realización de estos ejercicios se consolidan los procedimientos esenciales de configuración, auditoría y corrección de permisos, máscaras, bits especiales, capacidades, listas de control de acceso, atributos de inodo y opciones de montaje en sistemas Linux, conforme a las directrices del CIS Benchmark.
10. Licencia
Licencia CC BY-NC-ND 4.0
Esta página forma parte del curso Bastionado de Redes y Sistemas © 2026 de José Juan Sánchez Hernández y su contenido se distribuye bajo una licencia Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International.
Esta licencia exige que quienes reutilicen el material otorguen el debido crédito al autor. Permite copiar y redistribuir el material en cualquier medio o formato, únicamente en su forma original, y solo para fines no comerciales.