Cómo guarda Linux la información de los usuarios y sus contraseñas y los grupos de seguridad. Mostramos los ficheros implicados y su estructura. Indicamos algunos comandos Linux útiles para gestionar usuarios, caducidad de contraseñas, contraseñas, grupos, etc.

Usuarios y contraseñas en Linux

Linux, al igual que casi todo, guarda los datos de los usuarios y sus contraseñas en ficheros. Mostraremos dónde se almacenan estos datos y su estructura.

Fichero /etc/passwd de usuarios en Linux

El fichero que almacena los usuarios y varios datos de los mismos es:

/etc/passwd

Si hacemos un cat sobre este fichero:

cat /etc/passwd

Cada línea del fichero passwd se corresponderá con un usuario del sistema y tendrá la siguiente estructura:

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
alonso:x:1000:1000:alonso:/home/alonso:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin

Este fichero almacena información esencial que se requiere durante el inicio de sesión. Almacena la información de las cuentas del usuario. Es un archivo de texto plano sin formato. Contiene una lista de las cuentas del sistema, proporcionando para cada cuenta información útil, separada por dos puntos (:), como: ID de usuario, ID de grupo, directorio de inicio, shell, etc.

El archivo /etc/passwd debe tener permiso de lectura general, ya que muchas utilidades de comandos lo utilizan para asignar ID de usuario a nombres de usuario. Sin embargo, el acceso de escritura a /etc/passwd solo debe limitarse para la cuenta de superusuario/root.

A continuación explicamos qué significa cada valor del fichero /etc/passwd (cada campo separado por dos puntos «:»).

Fichero /etc/passwd de usuarios en Linux

La que significa da número (de cada valor del fichero) de la imagen anterior:

  1. Nombre de usuario: se utiliza cuando el usuario inicia sesión. Debe tener entre 1 y 32 caracteres de longitud.
  2. Contraseña: un carácter x indica que la contraseña cifrada se almacena en el archivo /etc/shadow.
  3. ID de usuario (UID): a cada usuario se le asigna un ID de usuario (UID) unívoco en el sistema. El UID 0 (cero) está reservado para root y los UID 1-99 están reservados para otras cuentas predefinidas. El sistema reserva otros UID del 100 al 999 para cuentas/grupos administrativos y del sistema.
  4. ID de grupo (GID): ID del grupo principal al que pertenece el usuario (almacenado en el archivo /etc/group).
  5. Información de ID de usuario (GECOS): el campo de comentario. Permite agregar información adicional sobre los usuarios, como el nombre completo del usuario, el número de teléfono, etc.
  6. Directorio de inicio: la ruta absoluta al directorio «home» del usuario. Si este directorio no existe, el directorio de usuarios se convierte en /.
  7. Shell: la ruta absoluta del shell (/bin/bash). Podría no ser un shell como tal, por ejemplo, el usuario sysadmin puede usar el shell nologin, que actúa como un shell de reemplazo para las cuentas de usuario. Si el shell se establece en /sbin/nologin y el usuario intenta iniciar sesión en el sistema Linux directamente, el shell / sbin / nologin cierra la conexión.

Para crear un usuario en Linux usaremos el comando useradd. Para modificar un usuario existente usaremos el comando usermod. Por ejemplo, para crear el usuario «proyectoa», ejecutaremos:

useradd proyectoa

Fichero /etc/shadow de contraseñas de usuarios en Linux

Las contraseñas de los usuarios anteriores se almacenarán en el fichero:

/etc/shadow

Con un cat podremos ver su contenido:

cat /etc/shadow

Que tendrá un aspecto similar al siguiente:

root:$6$bRK7mYApRynh2p$Vrz1QmfevMIoLi/Zo7J3dev2Qy6wP0JMemM9OOr1YXDJY1::0:99999:7:::
bin::17110:0:99999:7:::
daemon::17110:0:99999:7:::
adm::17110:0:99999:7:::
lp::17110:0:99999:7:::
sync::17110:0:99999:7:::
shutdown::17110:0:99999:7:::
halt::17110:0:99999:7:::
mail::17110:0:99999:7:::
operator::17110:0:99999:7:::
games::17110:0:99999:7:::
ftp::17110:0:99999:7:::
nobody::17110:0:99999:7:::
systemd-network:!!:18534::::::
dbus:!!:18534::::::
polkitd:!!:18534::::::
sshd:!!:18534::::::
alonso:$6$idmvpw7Cz5E.u4mA.GRc3DHRPCfuaqu0eFBu.w4MC3CGnvv1Hw/::0:99999:7:::
apache:!!:18534::::::
mysql:!!:18534::::::

La estructura de este fichero /etc/shadow puede verse en la siguiente imagen. Al igual que el fichero /etc/passwd, los campos se separan mediante dos puntos (:).

Fichero /etc/shadow de contraseñas de usuarios en Linux
  1. Nombre de usuario: nombre del usuario, coincidirá con el que tenga en el fichero /etc/passwd.
  2. Contraseña: contraseña encriptada del usuario. La contraseña debe tener un mínimo de 8-12 caracteres, incluidos caracteres especiales, dígitos, letras minúsculas y mayúsculas. Por lo general, el formato de la contraseña se establece en $id $salt $hash, el $id es el algoritmo utilizado en Linux, de los posibles:
    • $1$: MD5.
    • $2a$: Blowfish.
    • $2y$: Blowfish.
    • $5$: SHA-256.
    • $6$: SHA-512.
  3. Último cambio de contraseña: días desde el 1 de enero de 1970 en que se cambió la contraseña por última vez.
  4. Mínimo: el número mínimo de días requeridos entre los cambios de contraseña, es decir, el número de días que quedan antes de que el usuario pueda cambiar su contraseña.
  5. Máximo: el número máximo de días que la contraseña es válida (después de que el usuario se vea obligado a cambiar su contraseña).
  6. Advertir al usuario: el número de días antes de que expire la contraseña y se advertirá al usuario que debe cambiar su contraseña.
  7. Inactivo: la cantidad de días, si ha expirado la contraseña, que la cuenta está deshabilitada.
  8. Caducidad: días desde el 1 de enero de 1970 en que la cuenta está deshabilitada, es decir, una fecha absoluta que especifica cuándo ya no se podrá iniciar sesión con este usuario si no ha cambiado la contraseña.

Los últimos seis campos, desde el 3 al 8, proporcionan funciones de bloqueo de cuentas y caducidad de contraseñas. Según las especificaciones de shadow, el campo de contraseña debe tener algún valor. La contraseña cifrada consta de 13 a 24 caracteres del alfabeto, de 64 caracteres de la a a la z o de la A a la Z, del 0 al 9, y, opcionalmente, puede comenzar con un carácter «$». Esto significa que la contraseña cifrada se generó utilizando otro algoritmo distinto de DES, como hemos indicado anteriormente.

Muy importante, si un campo de contraseña comienza con un signo de exclamación (!) significa que la contraseña está bloqueada. Los caracteres restantes en la línea representarán la contraseña antes de que se bloqueara.

Para modificar y consultar estos valores de caducidad de contraseñas se usará el comando chage. Por ejemplo, el comando:

chage -l games

Mostrará los siguientes datos para el usuario «games»:

  • Último cambio de contraseña: fecha del último cambio de contraseña.
  • La contraseña caduca: fecha de caducidad de contraseña.
  • Contraseña inactiva: la cuenta está inactiva.
  • La cuenta caduca: fecha de caducidad de la cuenta.
  • Número de días mínimo entre cambio de contraseña.
  • Número de días máximo entre cambio de contraseña.
  • Número de días de aviso antes de que caduque la contraseña.
Fichero /etc/shadow de contraseñas de usuarios en Linux

Para establecer el número de días máximo de caducidad de contraseña para un usuario usaremos el comando:

chage -M 90 games

El comando anterior establecerá 90 días para la caducidad de contraseña del usuario «games».

Introduciendo el comando chage y el nombre de usuario, nos pedirá, de forma interactiva, los datos de caducidad de contraseña para el usuario indicado:

chage game

Fichero /etc/shadow de contraseñas de usuarios en Linux

Para cambiar la contraseña de un usuario se utilizará el comando passwd. Por ejemplo, para cambiar la contraseña del usaurio «games», introduciremos:

passwd games

Nos pedirá la nueva contraseña de forma interactiva.

Si queremos cambiar la contraseña de un usuario sin interacción, sin que tengamos que escribirla cuando lo solicite el sistema, podremos usar el siguiente comando:

echo «contraseña_prueba1» | passwd games –stdin

Donde «contraseña_prueba1» será la nueva contraseña para el usuario «games».

Fichero /etc/shadow de contraseñas de usuarios en Linux

Grupos de seguridad en Linux

Linux almacena los grupos de seguridad en el fichero:

/etc/group

Que podremos consultar con el comando:

cat /etc/group

Que tiene el siguiente contenido:

root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mem:x:8:
kmem:x:9:
wheel:x:10:alonso
cdrom:x:11:
mail:x:12:postfix
man:x:15:
dialout:x:18:
floppy:x:19:
games:x:20:
tape:x:30:
video:x:39:
ftp:x:50:
lock:x:54:
audio:x:63:
nobody:x:99:
users:x:100:
utmp:x:22:
utempter:x:35:
ssh_keys:x:999:
input:x:998:
systemd-journal:x:190:
systemd-network:x:192:
dbus:x:81:
polkitd:x:997:
postdrop:x:90:
postfix:x:89:
sshd:x:74:
alonso:x:1000:alonso
apache:x:48:
mysql:x:27:

La estructura de cada línea (cada grupo) del fichero /etc/group es:

Grupos de seguridad en Linux
  1. Nombre del grupo: es el nombre del grupo. Si ejecuta el comando ls -l en una carpeta, aparecerá el nombre del grupo propietario.
  2. Contraseña: normalmente los grupos no suelen tener contraseña, por lo tanto, este campo suele estar vacío. Puede almacenar contraseñas cifradas. Esto es útil para implementar grupos privilegiados.
  3. ID de grupo (GID): identificativo unívoco del grupo. Cada usuario del sistema tendrá, al menos, un grupo asociado, que se puede consultar en el fichero /etc/passwd, como hemos explicado anteriormente.
  4. Lista de grupos: es una lista de nombres de usuario de los usuarios que son miembros del grupo. Los nombres de usuario estarán separados por comas.

Es muy conveniente asignar usuarios a grupos, entre otras cosas, por las siguientes razones:

  • Para compartir archivos u otros recursos de forma más eficiente. Al usar grupos, no tendremos que ir usuario por usuario cuando queramos hacer alguna modificación.
  • Facilidad de gestión de usuarios: al asociarlos a grupos, podremos gestionar los grupos en lugar de los usuarios individuales.
  • Facilidad de monitoreo de usuarios.

Para consultar a qué grupos está agregado un usuario podemos ejecutar el comando:

groups nombre_usuario

Grupos de seguridad en Linux

Para mostrar el ID (identificativo) de los grupos a los que pertenece un usuario podemos usar:

id -G alonso

Para mostrar sólo los nombres de los grupos a los que pertence un usuario:

id -Gn alonso

Para crear un grupo en Linux usaremos el comando groupadd, por ejemplo:

groupadd g_proyectoa

Para agregar un usuario al grupo creado podemos usar el comando:

usermod -a -G g_proyectoa alonso

Con el comando anterior agregaremos el usuario «alonso» al grupo «g_proyectoa». Para verificarlo:

id -Gn alonso

Grupos de seguridad en Linux