Linux: cuentas y permisos
Las dos herramientas que más tiempo ahorran a un administrador de Linux: buscar patrones dentro de miles de líneas de registro, y gobernar cuentas y permisos más allá del propietario y el grupo, con listas de control de acceso y máscara de creación.
grep y sus tres variantes
grep recorre líneas y saca las que encajan con un patrón. Lo que se pregunta no es eso, que ya se sabe, sino que existen tres formas de la orden y que se diferencian por el tipo de patrón que admiten. Elegir mal la variante es la causa de que una búsqueda no encuentre lo que está delante.
| Forma | Equivalente moderno | Qué acepta como patrón |
|---|---|---|
| grep | grep | Expresiones regulares básicas |
| egrep | grep -E | Expresiones regulares extendidas |
| fgrep | grep -F | Cadenas fijas: ningún carácter es especial |
La variante de cadenas fijas parece la menos útil y es la que más problemas resuelve: cuando se busca un texto que contiene puntos, corchetes o asteriscos, tratarlo como patrón lleva a resultados absurdos. Con cadenas fijas cada carácter vale por sí mismo, y además es la búsqueda más rápida.
Las variantes con nombre propio están consideradas obsoletas desde hace años y lo recomendado es usar las opciones. Las tres siguen funcionando, y en un enunciado pueden aparecer con cualquiera de las dos formas.
grep -i "error" /var/log/plataforma.log # sin distinguir mayúsculas
grep -v "health-check" /var/log/plataforma.log # las líneas que NO encajan
grep -c "intento fallido" /var/log/plataforma.log # contar coincidencias
grep -rn "claveSubtema" /srv/app/src # recursivo y con número de línea
grep -F "192.168.10.4" /var/log/plataforma.log # el punto como puntogrep -E acepta expresiones extendidas y grep -F desactiva por completo el significado especial de los caracteres. Si un patrón con puntos devuelve resultados de más, la respuesta suele ser -F.
Para el examen
grep -E: expresiones regulares extendidas
grep -F: desactiva el significado especial de los caracteres
Cuándo usar -F: si un patrón con puntos devuelve de más
Expresiones regulares
Una expresión regular es una descripción de un conjunto de cadenas. En vez de decir qué texto se busca, se dice qué forma tiene, y eso permite localizar cualquier dirección IP, cualquier fecha o cualquier identificador con una sola línea. Es la herramienta que separa a quien lee un registro de quien lo interroga.
Los símbolos se agrupan en tres familias: los que fijan una posición, los que representan un conjunto de caracteres y los que dicen cuántas veces se repite lo anterior.
| Símbolo | Familia | Qué expresa |
|---|---|---|
| ^ | Posición | Principio de línea |
| $ | Posición | Final de línea |
| . | Conjunto | Un carácter cualquiera, uno solo |
| [a-d] | Conjunto | Un carácter del rango, equivale a escribir abcd |
| [^a] | Conjunto | Un carácter que no sea el indicado |
| [[:digit:]] | Conjunto | Un dígito, equivale al rango 0 a 9 |
| [[:alpha:]] | Conjunto | Una letra, mayúscula o minúscula |
| [[:punct:]] | Conjunto | Un signo de puntuación |
| * | Repetición | Cero o más veces lo anterior |
| + | Repetición | Una o más veces |
| ? | Repetición | Cero o una vez: hace opcional lo anterior |
| {n} | Repetición | Exactamente n veces |
| {m,} | Repetición | m veces o más |
| {m,n} | Repetición | Entre m y n veces |
| ( ) | Agrupación | Agrupa para aplicarle repetición o alternativa |
| | | Alternativa | Una cosa u otra |
| \ | Escape | Quita el significado especial al carácter siguiente |
El escape es el que más se olvida y el que más resultados falsos produce. El punto significa cualquier carácter, así que para buscar un punto de verdad, el de una dirección IP o el de un dominio, hay que escaparlo.
# líneas que empiezan por tres letras A seguidas
grep -E "^A{3}" catalogo.txt
# cualquier dirección IPv4 dentro del registro
grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" acceso.log
# líneas que acaban en 404 o en 500
grep -E "(404|500)$" acceso.log
# un correo del dominio de la plataforma
grep -E "[[:alnum:].]+@llegandoalcorte\.com" alumnos.csvAsterisco es cero o más, más es una o más y la interrogación es cero o una. Confundir el asterisco con el comodín del intérprete de órdenes, donde sí significa cualquier cosa, es el error clásico.
Para el examen
Asterisco: cero o más
Más: una o más
Interrogación: cero o una
Aviso: no confundirlo con el comodín del intérprete de órdenes
Dónde viven las cuentas: passwd, shadow y group
En Linux las cuentas son tres ficheros de texto plano en /etc, y saber leerlos es lo que permite diagnosticar por qué alguien no puede entrar. El primero es /etc/passwd, que a pesar de su nombre ya no guarda contraseñas: es la ficha pública de cada cuenta, con siete campos separados por dos puntos.
| Campo | Contenido |
|---|---|
| 1 | Nombre de la cuenta |
| 2 | Marca de contraseña: una x indica que el hash está en shadow |
| 3 | Identificador numérico de usuario |
| 4 | Identificador numérico de su grupo principal |
| 5 | Campo descriptivo, con el nombre real y datos de contacto |
| 6 | Directorio personal |
| 7 | Intérprete de órdenes que se le asigna al entrar |
El hash de la contraseña está en /etc/shadow, que solo puede leer root, y ahí viven además las reglas de caducidad. Dos marcas de ese fichero se preguntan: una admiración delante del hash significa cuenta bloqueada, y un asterisco significa que esa cuenta no tiene contraseña válida con la que iniciar sesión.
El séptimo campo de passwd es el otro control. Si el intérprete asignado es /usr/sbin/nologin o /bin/false, la cuenta existe y puede ser propietaria de ficheros y ejecutar servicios, pero nadie puede abrir una sesión con ella. Es la forma normal de definir una cuenta de servicio, no nominal.
Los identificadores numéricos también dicen cosas. El cero es root, y no por su nombre sino por el número: cualquier cuenta con identificador cero es superusuario. Las cuentas de personas se crean a partir del 1000, y por debajo quedan las de sistema.
grep "^mrey:" /etc/passwd
getent passwd mrey # también consulta el directorio de red, si lo hay
id mrey # identificadores y grupos efectivosEl tercer fichero es /etc/group, con los grupos y sus miembros secundarios. El grupo principal de una cuenta no aparece ahí, sino en el cuarto campo de passwd: es la asimetría que hace que a veces un usuario esté en un grupo sin figurar en la lista.
Una cuenta se bloquea con la admiración delante del hash en shadow, y se convierte en cuenta de servicio poniéndole nologin como intérprete. Son dos mecanismos distintos y a menudo se usan juntos.
Para el examen
/etc/passwd: las cuentas
/etc/shadow: los hashes de las contraseñas
/etc/group: los grupos
Bloquear una cuenta: una admiración delante del hash
Cuenta de servicio: shell nologin
Administrar cuentas y grupos
Hay dos familias de órdenes que hacen casi lo mismo y conviene distinguirlas. Las que acaban en add, mod y del son las de bajo nivel, iguales en cualquier distribución y las que aparecen en el examen. Las que empiezan por add y del completo, como adduser, son guiones interactivos de Debian construidos encima de las anteriores.
| Orden | Qué hace |
|---|---|
| useradd | Crea una cuenta con los valores que se le indiquen |
| usermod | Modifica una cuenta existente |
| userdel | Elimina la cuenta, y con -r también su directorio personal |
| groupadd, groupmod, groupdel | Lo mismo para los grupos |
| passwd | Cambia la contraseña y gobierna el bloqueo de la cuenta |
| gpasswd | Administra un grupo: miembros y administradores |
| chage | Gestiona la caducidad de la contraseña y de la cuenta |
Al crear una cuenta, la distinción clave es entre grupo principal y grupos secundarios: el principal se indica con -g y es el que hereda todo lo que la cuenta cree; los secundarios se indican con -G y sirven para dar acceso a recursos concretos.
useradd -m -g tutores -G correctores,soporte -s /bin/bash mrey
passwd mrey
usermod -aG publicadores mrey # añadir un grupo SIN quitar los que ya tenía
userdel -r mreyusermod -G sustituye la lista de grupos secundarios. Para añadir uno sin borrar los demás hay que poner -aG, y olvidar la a es el fallo que deja a un usuario fuera de todo.
passwd hace más que pedir una contraseña nueva: bloquea y desbloquea cuentas, fuerza a cambiarla en el siguiente inicio y muestra el estado de todas de un vistazo. Y chage es la orden específica de caducidad, que es lo que exige cualquier política de seguridad.
passwd -l mrey # bloquear
passwd -u mrey # desbloquear
passwd -e mrey # expirar: obliga a cambiarla al entrar
passwd -aS # estado de todas las cuentas
chage -E 2026-12-31 mrey
chage -l mrey # ver las fechas de esa cuentaPara quitar a alguien de un grupo hay varios caminos equivalentes, y los tres aparecen en enunciados: usermod indicando la lista sin él, gpasswd con la opción de borrado, o la orden de Debian que elimina la pertenencia directamente.
Para el examen
usermod -G: SUSTITUYE la lista de grupos secundarios
usermod -aG: añade sin borrar los que ya tenía
Más allá del propietario: ACL, umask e inspección
El modelo clásico de permisos tiene un límite duro: solo distingue tres sujetos, el propietario, el grupo y los demás. En cuanto hace falta dar acceso a una persona concreta que no es el propietario, o a dos grupos con permisos distintos, el modelo se queda corto. La solución son las listas de control de acceso.
| Orden | Qué hace |
|---|---|
| getfacl fichero | Muestra las entradas de la lista de ese fichero |
| setfacl -m u:mrey:rw fichero | Añade o modifica una entrada para un usuario |
| setfacl -m g:soporte:r fichero | Lo mismo para un grupo |
| setfacl -x u:mrey fichero | Borra una entrada concreta |
| setfacl -b fichero | Borra todas las entradas y vuelve al modelo clásico |
| setfacl -d ... | Define la lista por defecto que heredarán los nuevos ficheros |
Hay una pista visual que se pregunta mucho: cuando un fichero tiene lista de control de acceso, el listado largo añade un signo más al final de los permisos. Ver ese signo es la señal de que los diez caracteres de permisos no cuentan toda la verdad.
setfacl -m u:mrey:rw /srv/contenido/temario.json
getfacl /srv/contenido/temario.json
ls -l /srv/contenido/temario.json # los permisos acaban en +La otra pieza es la máscara de creación. Un fichero nuevo no nace con los permisos que uno quiera: el sistema parte de un permiso base y le quita lo que indique la máscara. El permiso base es 666 para ficheros y 777 para directorios, y la diferencia es deliberada: un fichero recién creado nunca nace ejecutable.
| Elemento | Ficheros | Directorios |
|---|---|---|
| Permiso base | 666 | 777 |
| Máscara habitual | 022 | 022 |
| Resultado | 644 | 755 |
La máscara no se suma, se resta: el permiso final es el base al que se le quitan los bits de la máscara. Con máscara 022 un fichero nace 644 y un directorio 755.
Cierran el subtema tres órdenes de inspección que responden preguntas concretas del día a día. stat vuelca el i-nodo completo. lsof enumera los ficheros que tiene abiertos un proceso, y es la forma de averiguar quién impide desmontar un volumen o quién sigue escribiendo en un registro ya borrado. Y ldd lista las librerías compartidas de las que depende un ejecutable, que es por donde se empieza cuando un binario se niega a arrancar.
stat /srv/contenido/temario.json
lsof /srv/contenido # quién tiene abierto algo ahí dentro
lsof -p 4821 # qué tiene abierto ese proceso
ldd /usr/sbin/apache2Para el examen
Cómo funciona la umask: se resta, no se suma
Con máscara 022: fichero 644 y directorio 755
ACL: se manejan con setfacl y getfacl