Gestión de usuarios en Linux

Para un sistema operativo Linux un usuario es la asociación de un nombre, el login, con un UID (User ID) y, al menos, un GID (Group ID. autenticación

Identificación y autenticación:
  • la identificación consiste en saber quién es quién para poder determinar los privilegios y permisos del usuario que se conecta.
  • La autenticación es el proceso por el que el usuario aporta una prueba que permite demostrar qué es quién dice ser. Debería ser una información que solo conoce o tiene el usuario. Normalmente para autenticarnos utilizamos una contraseña, pero también podemos configurar nuestro sistema para que utilice otros mecanismos como una tarjeta inteligente, DNI electrónico, huella dactilar, iris, etc

El UID identifica al usuario durante su conexión al sistema. Se utiliza para el control de los privilegios, permisos y de los procesos que inicia.

El concepto de cuenta de usuario está asociado al concepto de sesión. Entendemos por sesión el tiempo consecutivo en el que una cuenta de usuario se encuentra activa en el sistema operativo. Por lo tanto, se prolonga desde que el usuario se autentica, momento en el que se dice que ha iniciado sesión, hasta que abandona el sistema, que se conoce como cierre de sesión.

Los atributos básicos del usuario se almacenan la mayoría en el fichero /etc/passwd y para cada uno de ellos son:

  • login: nombre de inicio de sesión
  • contraseña: se suele almacenar cifrada en el fichero /etc/shadow
  • UID
  • GID
  • desccripción
  • directorio de inicio de sesión
  • interprete de comandos de inicio de sesión
Normalmente, una cuenta de usuario está relacionada con una persona, que es quien se acredita para utilizar el ordenador, pero en ciertas situaciones, puede ser un programa o un servicio, quien necesite autenticarse para obtener un determinado recurso o servicio.

Para cuentas especiales con derechos extendidos o asociadas a programas o servicios su UID es menor de 100. Por ejemplo, el usuario root suele tener UID 0. Luego, dependiendo de la distribución de Linux, a los usuarios sin privilegios particulares se les asigna UID de forma consecutiva a partir de cierto valor. En el caso de Ubuntu, este valor inicial es 1000. Este parámetro puede modificarse en el fichero /etc/login.defs

Cada usuario forma parte de, al menos, un grupo. Como hemos visto, cada grupo se identifica por su GID. Un usuario puede pertenecer a varios grupos. Cada grupo tiene asociados unos privilegios, al pertenecer un usuario a un grupo, adquiere los privilegios asociados al mismo. Si, por ejemplo, el usuario user1 tiene como grupo secundario video y un archivo tiene permisos de escritura para ese grupo, entonces user1 tendrá derecho a modificar su contenido.

El comando id permite conocer la información básica de un usuario (uid, gid y grupos secundarios)

$ id user1
uid=1000(user1) gid=1000(users) grupos=1000(users),4(adm),7(video),105(fuse),108(lpadmin),125(sambashare),129(vboxusers),137(libvirtd),130(lxd),137(libvirtd)

Las contraseñas permiten autenticar a los usuarios. Deben ser lo suficientemente complejas como para que no puedan ser descubiertas fácilmente y lo suficientemente intuitivas como para que sean sencillas de recordar.

Las contraseñas se almacenan cifradas en el fichero /etc/shadow utilizando un algoritmo de cifrado (MD5, SHA, Blowfish, …)

La administración de usuarios y grupos solamente puede realizarlas el usuario root utilizando los comandos de gestión de usuarios. Las tareas y los comandos para realizarlas son:

  • Creación de usuarios / useradd, adduser
  • Modificación de usuarios / usermod
  • Eliminación de usuarios / userdel, deluser
  • Creación de grupos / groupadd
  • Modificación de grupos / groupmod
  • Eliminación de grupos / groupdel
  • Añadir usuarios a un grupo / adduser
  • Quitar usuarios de un grupo / deluser
  • Cambiar la contraseña de un usuario / passwd

Los archivos con información asociada a la gestión de usuarios y grupos son los siguientes:

  • /etc/passwd
  • /etc/shadow
  • /etc/group
  • /etc/gshadow
  • /etc/default/useradd
  • /etc/adduser.conf
  • /etc/deluser.conf
  • /etc/login.defs
  • /etc/shells
  • /etc/skel

Podemos ver más detalles de los mismos en la siguiente página

Crear un usuario implica las siguientes acciones:

  • Añadir una línea en /etc/passwd
  • Añadir una línea en /etc/shadow
  • Añadir información en /etc/group
  • Crear el directorio personal y copiar dentro del mismo el contenido de /etc/skel
  • Cambiar los permisos y el propietario del directorio personal
  • Cambiar la contraseña

Aunque no es aconsejable, se puede crear un usuario editando los ficheros implicados, creando manualmente la carpeta del usuario, copiando los ficheros del perfil por defecto y asignando los permisos y propietarios del usuario. Para facilitar esta tarea el sistema nos provee de las utilidades useradd y adduser. Al ser una tarea administrativa la gestión de los usuarios solo la podrá realizar un usuario con privilegios de administración.

Existe una restricción en el formato del nombre del usuario especificada en la norma POSIX que es que el nombre del usuario solo puede empezar por un carácter alfabético, seguido de caracteres portables (letras, dígitos numéricos, guión, guión bajo, etc)

useradd

Este comando añade una nueva cuenta de usuarios. Las opciones más importantes del mismo son:

Opción Función
-m crea también el directorio personal
-u permite especificar manualmente el UID del usuario
-g permite especificar el grupo principal del usuario (por GID o por nombre)
-G permite especificar separados por comas los grupos adicionales del usuario
-d permite especificar manualmente la ruta de la carpeta de inicio del usuario
-k permite especificar manualmente la ruta de la plantilla del usuario
-s permite especificar manualmente el interprete de comandos por defecto del usuario (los interpretes de comandos disponibles se encuentran en el fichero /etc/shells)
-p permite especificar manualmente la contraseña al usuario, pero debemos tener en cuenta que la contraseña debe estar cifrada

Ejemplo:

$ sudo adduser -m -u 1020 -g users -G lp,video -s /bin/bash -d /home/sebastian sebas
Como acabamos de ver, el comando adduser nos permite poner contraseña al usuario con la opción -p, pero solo permite especificarla ya cifrada.

Ejemplo:

$ echo "smr1234"  |  mkpasswd -s -m sha-512
$6$w3rnjyVU$LDw6e1vbplWjF2IcwTGaySiiLRHBTYLnWqA4L1xawGpniCeHKqawYtgXNTCVPybMObLLJLcrtc7jZAAKmXKkp0
$ sudo adduser -m -s /bin/bash -p $6$w3rnjyVU$LDw6e1vbplWjF2IcwTGaySiiLRHBTYLnWqA4L1xawGpniCeHKqawYtgXNTCVPybMObLLJLcrtc7jZAAKmXKkp0 anabel

adduser

Permite también añadir usuarios al sistema, nos solicita sus datos principales y su contraseña. También permite añadir un usuario existente a un grupo que también exista previamente en el sistema.

Ejemplo: crear usuario

$ sudo adduser anabel
Añadiendo el usuario `anabel' ...
Añadiendo el nuevo grupo `anabel' (1003) ...
Añadiendo el nuevo usuario `anabel' (1001) con grupo `anabel' ...
Copiando los ficheros desde `/etc/skel' ...
Introduzca la nueva contraseña de UNIX: 
Vuelva a escribir la nueva contraseña de UNIX: 
passwd: contraseña actualizada correctamente
Cambiando la información de usuario para test
Introduzca el nuevo valor, o presione INTRO para el predeterminado
	Nombre completo []: 
	Número de habitación []: 
	Teléfono del trabajo []: 
	Teléfono de casa []: 
	Otro []: 
¿Es correcta la información? [S/n]

Ejemplo: Añadir el usuario Pedro al grupo de alumnos

# adduser pedro alumnos
Opción Función
- -ingroup <nomgrupo> Crea el usuario con nomgrupo como grupo principal
- -home <nomdir>

passwd

Como acabamos de ver, useradd solo nos permite asignar contraseña al usuario si se la pasamos ya cifrada con la opción -p.

El comando passwd permite gestionar las contraseñas y además, las autorizaciones de inicio de sesión, así como la mayoría de campos del fichero /etc/shadow

Cualquier usuario puede cambiar su contraseña en el plazo especificado en el campo 4 de /etc/shadow. La opción por defecto del comando cambia la contraseña del usuario actual. Se nos pedirá la contraseña actual por seguridad.

$ passwd
Cambiando la contraseña de usuario.
(actual) contraseña de UNIX: 
Introduzca la nueva contraseña de UNIX: 
Vuelva a escribir la nueva contraseña de UNIX: 
passwd: contraseña actualizada correctamente

El usuario root o un usuario con privilegios sudo puede cambiar la contraseña de cualquier usuario del sistema.

Gestionar la validez

Para gestionar los campos de /etc/shadow tenemos las siguientes opciones disponibles para passwd:

Opción Función
-l Lock: bloquea una cuenta al añadir una ! delante de la contraseña cifrada.
-u Unlock: desbloquea/activa una cuenta.
-d suprime la contraseña de una cuenta. El usuario podrá iniciar sesión sin utilizar contraseña.
-n <num> la contraseña tendrá una validez mínima de num días (no podrá cambiarla antes).
-x <num> la contraseña tendrá una validez máxima de num días.
-w <num> num días antes de un aviso.
-i <num> periodo de gracia de num días antes de desactivación si ha vencido la contraseña.
-S muestra el estatus de una cuenta

Ejemplo:

$ sudo passwd -n 10 -x 60 -w 7 -i 4 anabel
passwd: información de caducidad de la contraseña cambiada.

En el ejemplo anterior se modifica la cuenta de anabel de la siguiente manera:

  • Debe esperar 10 días para poder cambiar la contraseña
  • Su contraseña es válida por 60 días
  • Se le avisa 7 días antes de que debe cambiar su contraseña
  • Si no cambia su contraseña tras 60 días dispone de 4 días para hacerlo antes de que sea bloqueada.

La línea correspondiente en el fichero /etc/shadow quedaría de la siguiente forma:

$ sudo cat /etc/shadow  |  grep anabel
anabel:$6$3p15OBHg$BNhsWB4RVgKQk1x.mqmfidjVWYxn9yMOoHAxYhzTdL7BCqMSvTjwHdHzTtSaQtqsVkQQgiZxKbgcxwIhHAk4W.:17972:10:60:7:4::

Dónde el tercer campo, 17972 indica el número de días desde el 1 de enero de 1970 hasta el última cambio de contraseña. El resto de parámetros son los que acabamos de cambiar ( número de días sin poder cambiar la contraseña; número de días de validez de la contraseña; número de días antes de que caduque en los que se avisará de que hay que cambiar la contraseña; periodo de gracia). Mas detalles en el siguiente enlace

De forma similar, podemos gestionar la validez utilizando el comando chage. Podemos utilizar los siguientes parámetros:

Opción Función
-m Mindays: equivale a passwd -n
-M Maxdays: equivale a passwd -x
-d Fecha de última modificación de la contraseña (desde el 1/1/1970)
-E Fecha de vencimiento de la contraseña (desde el 1/1/1970)
-I Inactive: equivale a passwd -i
-l List: muestra todos los detalles

Para modificar los datos de una cuenta de usuario podemos utilizar usermod. Las opciones son similares a las de useradd. Algunas de ellas son:

Opción Función
-m mover la carpeta de inicio. Implica la opción -d para especificar un nuevo directorio personal
-u <UID> permite especificar manualmente el nuevo UID del usuario
-g <GID> permite especificar manualmente el nuevo GID del usuario
-l <login> permite modificar el nombre del usuario
-d permite especificar la nueva ruta de la carpeta de inicio del usuario
-s permite especificar el nuevo interprete de comandos por defecto
-L bloquea la cuenta, como passwd -l
-U desbloquea la cuenta, com passwd -u

Ejemplo:

$ sudo usermod -l anaisabel -m -d /home/anaisabel anabel
[sudo] contraseña para usuario: 
usuario@asus-i7:~$ grep anaisabel /etc/passwd
anaisabel:x:1001:1003:,,,:/home/anaisabel:/bin/bash

El comando userdel nos permite eliminar un usuario. Por defecto no suprime su directorio personal. Para ello utilizamos la opción -r.

$ sudo userdel -r anaisabel

Se puede crear un grupo directamente editando el archivo /etc/group o bien utilizar las utilidades del sistema disponibles.

groupadd

Su sintaxis es sencilla. Acepta la opción -g para especificar un GID concreto.

Ejemplo:

$ sudo addgroup familia
Añadiendo el grupo `familia' (GID 1004) ...
Hecho.
$ grep familia /etc/group
familia:x:1004:

El comando groupmod permite modificar un grupo. Sus parámetros son los siguientes:

Opción Función
-n <nombre> |Renombra el grupo | | -g <GID> Modifica el GID del grupo. Hay que tener en cuenta que no modifica el grupo al que pertenecen los archivos con el GID anterior

Ejemplo:

$ sudo groupmod -n familiares familia

El comando groupdel permite eliminar un grupo. Si el grupo que queremos eliminar es el grupo principal de un usuario no lo permitirá. La acción que realiza es eliminar la línea correspondiente del fichero /etc/group

Ejemplo:

$ sudo groupdel familiares

El comando gpasswd permite asignar una contraseña a un grupo. La contraseña se almacena en el fichero /etc/gshadow