Saltar al contenido

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.

FormaEquivalente modernoQué acepta como patrón
grepgrepExpresiones regulares básicas
egrepgrep -EExpresiones regulares extendidas
fgrepgrep -FCadenas 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.

bash
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 punto

grep -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ímboloFamiliaQué expresa
^PosiciónPrincipio de línea
$PosiciónFinal de línea
.ConjuntoUn carácter cualquiera, uno solo
[a-d]ConjuntoUn carácter del rango, equivale a escribir abcd
[^a]ConjuntoUn carácter que no sea el indicado
[[:digit:]]ConjuntoUn dígito, equivale al rango 0 a 9
[[:alpha:]]ConjuntoUna letra, mayúscula o minúscula
[[:punct:]]ConjuntoUn signo de puntuación
*RepeticiónCero o más veces lo anterior
+RepeticiónUna o más veces
?RepeticiónCero o una vez: hace opcional lo anterior
{n}RepeticiónExactamente n veces
{m,}Repeticiónm veces o más
{m,n}RepeticiónEntre m y n veces
( )AgrupaciónAgrupa para aplicarle repetición o alternativa
|AlternativaUna cosa u otra
\EscapeQuita 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.

bash
# 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.csv

Asterisco 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.

CampoContenido
1Nombre de la cuenta
2Marca de contraseña: una x indica que el hash está en shadow
3Identificador numérico de usuario
4Identificador numérico de su grupo principal
5Campo descriptivo, con el nombre real y datos de contacto
6Directorio personal
7Inté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.

bash
grep "^mrey:" /etc/passwd
getent passwd mrey        # también consulta el directorio de red, si lo hay
id mrey                   # identificadores y grupos efectivos

El 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.

OrdenQué hace
useraddCrea una cuenta con los valores que se le indiquen
usermodModifica una cuenta existente
userdelElimina la cuenta, y con -r también su directorio personal
groupadd, groupmod, groupdelLo mismo para los grupos
passwdCambia la contraseña y gobierna el bloqueo de la cuenta
gpasswdAdministra un grupo: miembros y administradores
chageGestiona 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.

bash
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 mrey

usermod -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.

bash
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 cuenta

Para 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.

OrdenQué hace
getfacl ficheroMuestra las entradas de la lista de ese fichero
setfacl -m u:mrey:rw ficheroAñade o modifica una entrada para un usuario
setfacl -m g:soporte:r ficheroLo mismo para un grupo
setfacl -x u:mrey ficheroBorra una entrada concreta
setfacl -b ficheroBorra 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.

bash
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.

ElementoFicherosDirectorios
Permiso base666777
Máscara habitual022022
Resultado644755

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.

bash
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/apache2

Para 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