Manejando Usuarios Locales e Linux
Table of contents
Cuentas Locales En Linux
En corto, una cuenta local es aquella que se maneja usando comandos nativos que se encuentran an nivel del sistema operativo y que no necesita de herramientas externas en la red para funcionar.
En esta leccion:
- Tomaremos un vistazo al manejo de cuentas locales
- Veremos los achivos necesarios para manejar cuentas locales
- Usaremos comandos para crear, borrar o modificar cuentas de usuarios.
- Entenderemos como mantener contraseñas.
Estos ejercicios no deben hacerse en un sistema de produccíon sin entender los efectos que un cambio puede causar.
Tipos de Usuarios
En Linux hay varios tipos de usuarios:
- Usuario Regular
- Root (Super Usuario)
- Cuenta de Sistema
Cada tipo de usuario tiene un rol especifico con alcance diferente.
Cuentas que requerien interaccion intensa de entrada y salida de datos necesitan poder leer y escribir archivos en diferentes areas. Otros cuentas requieren la habilidad de correr programas que pueden leer y escribir a areas restringidas. El acceso se da de acuerdo al tipo de trabajo que la cuenta requiere; una cuenta no debe tener mas aceso del que requiera para funcionar.
Archivos Para Manejo De Cuentas Locals
Linux usa tres archivos para manejar cuentas locales
- /etc/passwd: información de cuentas de usuario
- /etc/shadow: información de seguridad de cuentas de usuario
- /etc/group: información de groups del sistema
Todos los archivos son legibles en texto claro
Los archivos son normalmente manejados por un Administrador de Sistemas de forma manual o programática.
Debe tenerse mucho cuidado de no causar corrupción que pueded potencialmente bloquear acceso al sistema. Por esta razón es recomendable mantener copias de los archivos en un lugar seguro.
A continuación veamos detalles de cada archivo.
Archivo /etc/passwd
El archivo /etc/passwd
Contiene los detalles que identifican la cuenta misma. En particular tiene el nombre del usuario, su id, y su directorio de inicio.
Este es un ejemplo en /etc/passwd
que muestra una entrada típica para un usuario llamado user1
.
user1:x:2015:2016:Usuario Uno:/home/user1:/bin/bash
La entrada contiene la siguiente información:
user1
: nombre del usuario:x
: indica que el usuario tiene una contraseña en/etc/shadow
2015
: el id numérico del usuario2016
: el id numérico del grupo al que el usuario perteneceUsuario Uno
: el campo del comentario acerca del usuario/home/user1
: directorio de inicio/bin/bash
: el shell que el usuario recibe al entrar al sistema
El Sistema Operativo usa el número de id para diferenciar Usuarios Regulars de Cuentas de Sistema
En Ubuntu, un número de ID menos de 100
indica que son Cuentas de Sistema. Estos ID menores de 100
son reservados para Cuentas de Sistema porque requieren permisos para acceder recursos restringidos.
El rango de ID numérico para Cuentas de Sistema es entre 0
y 999
. Muchas aplicaciones de Fuenta Abierta tales como PostgreSQL crean un usuario con número de id en el rango de los cien para darle acceso a areas tales como IPC (Inter Process Communication - RFC62) 1
En resúmen una Cuenta Regular tiene acceso a recursos explicitamente asignados a ella, mientras que una Cuenta de Sistema tiene acceso a más areas que incluyen recursos internos restringidos.
En Ubuntu el rango puede enforzarce al abilitar estas lineas en el archivo /etc/login.defs
:
# System accounts
SYS_GID_MIN 100
SYS_GID_MAX 999
Archivo /etc/group
El archivo /etc/group
contine la relacion de groups a los que los usuarios pertenencen.
Cuando se crea un usuario, Linux crea un grupo con el mismo nombre del usuario y agrega el usuarioa ese grupo.
Este es un ejemplo en /etc/group
que muestra una entrada típica para un usuario llamado user1
.
-> grep user1 /etc/group
sudo:x:27:devuser,user1,user2,user3
user1:x:2016:user1
La entrada contiene la siguiente información:
user1
: el nombre del grupo.x
: campo de marcador de posición usado tradicionalmente para la contraseña del grupo, pero no se usa en los sistemas modernos.2016
: este es el ID de grupo (GID) del grupo.user1
: lista de usuarios que son miembros del grupo user1.
En el ejemplo arriba, el nombre del grupo es user1
, y el nombre del usuario también es user1
. Un usuario siempre es agegado a un group primario que lleva el mismo nombre del usuario. No se puede remover al usuario de su grupo primario; tratando de hacer esa operación resulta en un error:
-> deluser user1 user1
/usr/sbin/deluser: You may not remove the user from their primary group.
Archivo /etc/shadow
El archivo /etc/shadow
es un archivo con vista restricta solo para root
o usuarios con privilegios de sudo
. Contiene la contraseña que el usuario usa para entrar al sistema.
Este es un ejemplo en /etc/shadow
que muestra una entrada típica para un usuario llamado user1
.
-> sudo grep user1 /etc/shadow
user1:$6$Ozq/xNc8$LADRiie3bHjAp8gkxWvOZlccGthFvmujkbpEoc4jTnf2rgAMFN5ojd2s.ZOikGJQvvF8YEnQzKXVGb2tEVOLZ0:17246:0:99999:7:::
La entrada contiene la siguiente información:
usuario1
: El nombre de usuario del usuario.$6$
al principio indica que la contraseña se cifró utilizando el algoritmo hash SHA-512.Ozq/xNc8$LADRiie3bHjAp8gkxWvOZlccGthFvmujkbpEoc4jTnf2rgAMFN5ojd2s.ZOikGJQvvF8YEnQzKXVGb2tEVOLZ0
: Esta es la contraseña cifrada del usuario.17246
: el número de días desde la última vez que se cambió la contraseña.0
: El número mínimo de días antes de que se pueda cambiar la contraseña.99999
: El número máximo de días antes de que se deba cambiar la contraseña.7
: La cantidad de días antes de que el usuario reciba una advertencia de que su contraseña está a punto de caducar.Campos en blanco
: Pueden contener información adicional como cuándo se cambió la contraseña por última vez, fecha de vencimiento de la cuenta, etc. En este caso, se dejan en blanco.
Manteniendo Cuentas De Usuarios
Hay varias tareas que podemos ejecutar para manejar usuarios en Linux
- verificar la existencia de un usuario
- crear usuarios
- borrar usuarios
- modificar usuarios
- bloquear usuarios
Veamos a continuación los detalles de cada tarea.
Verificar Usuario
Es buena practica verificar si un usuario existe antes de atentar crearlo, o modifiarlo.
Estos comandos pueden usarse para listar todos los usuarios que existen en el sistema.
-> cut -d: -f1 /etc/passwd
-> awk -F: '{print $1}' /etc/passwd
Enseguida, veamos is el usuario ficticio user1
existe.
-> id user1
-> grep user1 /etc/passwd
NOTA: Cambia
user1
por el nombre a chequear.
Crear Usuario
En Ubuntu y RedHat hay dos comandos para crear usuarios: useradd
y adduser
.
La diferencia básica entre /usr/sbin/useradd
y /usr/sbin/adduser
es que useradd
es mas simple de usar, mientras que adduser
es una interfaz más amigable e interactivo`, es decir, nos permite entrar la información requerida al momento de crear la cuenta.
El comando useradd
se puede utilizar para crear nuevos usuarios con configuraciones y opciones predeterminadas especificadas en la línea de comando o en archivos de configuración. Requiere especificar todos los parámetros explícitamente al crear una nueva cuenta de usuario.
Por otro lado, adduser
es un comando más versátil que solicita al usuario la información necesaria para crear una nueva cuenta de usuario, como el nombre de usuario, la contraseña y la ubicación del directorio de inicio. También proporciona más opciones para personalizar la cuenta de usuario durante el proceso de creación.
En general, adduser
es más conveniente y fácil de usar para crear nuevos usuarios, mientras que useradd
es más adecuado para secuencias de comandos o procesos automatizados donde no se requiere entrada manual.
En los ejemplos que siguen usaremos los parámetros siguientes:
- nombre de usuaro:
appuser
- directorio de inicio:
/home/appuser
Crear Usuario Con Adduser
Para crear un usuario interactivamente, simplemente pasemos el nombre del usuario como argumento al comando adduser
.
Tanto el id del usuario como el id del group son generados automáticamente
-> adduser appuser
Adding user `appuser' ...
Adding new group `appuser' (1000) ...
Adding new user `appuser' (1000) with group `appuser' ...
Creating home directory `/home/appuser' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for appuser
Enter the new value, or press ENTER for the default
Full Name []: App User
Room Number []: R101
Work Phone []: (111) 111-111
Home Phone []: (222) 222-222
Other []: For Application Execution
Is the information correct? [Y/n] y
En la tarea anterior hemos entrado la informacíon siguiente:
- Nombre completo (Full Name)
- Número de cuarto (Room Number)
- Teléfono de Trabajo (Work Phone)
- Teléfono de Casa (Home Phone)
- Otros (Other)
Entrar la información anterior es completamente opcional. La cuenta puede crearse sin esos detalles.
Toda esa información se agrega al campo del comentario on /etc/passwd
. Si deseas, no entres esos detalles, y solo presiona Enter
o Return
por cada pregunta.
Luego verificamos que el usuario fue creado
-> grep appuser /etc/passwd
appuser:x:1000:1000:App User,R101,(111) 111-111,(222) 222-222,For Application Execution:/home/appuser:/bin/babash
Aqui verificamos que el directorio de inicio fue creado.
-> ls -ld /home/appuser
drwxr-x--- 2 appuser appuser 4096 May 18 21:08 /home/appuser/
-> ls -la /home/appuser/
total 24
drwxr-x--- 2 appuser appuser 4096 May 18 21:08 ./
drwxr-xr-x 1 root root 4096 May 18 21:08 ../
-rw-r--r-- 1 appuser appuser 220 May 18 21:08 .bash_logout
-rw-r--r-- 1 appuser appuser 3771 May 18 21:08 .bashrc
-rw-r--r-- 1 appuser appuser 807 May 18 21:08 .profile
El comando adduser
mostró la linea Copying files from /etc/skel
indicando la acción que copió los archivos escondidos que muestra el comando ls -la
. Cabe notar que el comando useradd
no hace esto.
Vemos que la contraseña encripta a sido creada
-> grep appuser /etc/bashadow
appuser:$y$j9T$.aN1RbQXlVwzRNvI18uCR.$mPzqtEz2WTyb03eJ2.C7lsroaAjFdfdAh.TssUyYZs7:19861:0:99999:7:::
El grupo del usuario se ha creado automáticamente
-> grep appuser /etc/group
appuser:x:1000:
Crear Usuario Con Useradd
El comando useradd
no es interactivo. Simplemente pasemos el nombre usuario como argumento.
-> useradd techuser
Lo primero que notamos es que el campo donde van los comentarios esta vacio.
-> grep techuser /etc/passwd
techuser:x:2096:2097::/home/techuser:/bin/sh
El directorio de inicio del usuario no fue creado. Lo debemos crear manualmente!
-> ls -l /home/techuser
ls: cannot access '/home/techuser': No such file or directory
Luego vemos que no se ha generado la contraseña encripta.
-> grep techuser /etc/shadow
techuser:!:19861:0:99999:7:::
Tampoco se agregaron los detalles en los ultimos dos campos de la entrada.
El símbolo !
en esta entrada en /etc/shadow
representa que la contraseña de la cuenta “techuser” está bloqueada. Esto significa que el usuario no podrá iniciar una sesión con una contraseña, puesto que no existe.
El usuario se ha creado sin contraseña y debemos crearla nosotros mismos usando el commando passwd
.
Para crear la contraseña del usuario usemos el comando passwd
.
Debemos entrar la nueva contraseña dos veces.
-> passwd techuser
New password:
Retype new password:
passwd: password updated successfully
Verifiquemos que la contraseña se creo.
-> grep techuser /etc/shadow
techuser:$y$j9T$gQtiW96hN/wjuClWzU0sr.$/NSWKHNtTg01XtCVUPrBrC4jBM3lPa.bqx21d/evRq4:19861:0:99999:7:::
Modificar Usuario
El comando chage
se utiliza para cambiar la configuración de caducidad y antigüedad de la contraseña de una cuenta de usuario. Este comando se puede utilizar para establecer atributos específicos como la fecha de vencimiento de la contraseña, la antigüedad mínima y máxima de la contraseña, el período de advertencia y el período inactivo para una cuenta de usuario.
El comando usermod
se utiliza para modificar varios atributos de una cuenta de usuario existente, como el nombre de usuario, UID, grupos, directorio de inicio, shell, fecha de vencimiento y más. Este comando proporciona un conjunto más completo de opciones para administrar cuentas de usuario en comparación con chage
.
Si bien ambos comandos se pueden usar para modificar los atributos de la cuenta de usuario, el comando chage
se centra principalmente en administrar la configuración de antigüedad de la contraseña, mientras que el comando usermod
es más general y versátil para realizar diversas modificaciones en las cuentas de usuario.
Veamos a continuacion mas detalles de chage and usermod.
Modificar Usuarios con CHAGE
En sistemas the Linux usamos el comando chage
para modificar atributos a cuentas de usuarios que ya existen. Este comando requiere que esté disponible el archivo de contraseña oculta /etc/shadow
.
El comando chage
está restringido al usuario root
, excepto la opción -l
, que puede ser utilizado por un usuario sin privilegios para determinar cuándo caducará su contraseña o cuenta.
Aqui, el usuario appuser
usa el comando chage -l
para chequear el estado de su cuenta.
appuser@ubuntu2204-1-devesp:~$ chage -l appuser
Last password change : May 18, 2024
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
En particular, muestra cuando caducará su contraseña, en esta caso nunca.
Ahora agamos algunas cambios de fecha y tiempo.
Establecer la fecha de vencimiento de la cuenta
-> chage --expiredate 2024-12-31 appuser
Establecer el numero de 10 dias como aviso antes que venza la contraseña.
Indica que el usuario recibirá un aviso por diez días antes que se venza su contraseña.
-> chage --warndays 10 appuser
Establecer el número mínimo de días antes de cambiar la contraseña.
Este ajuste dice la contraseña caduca llegado el numero de dias indicado.
-> chage --mindays 180 appuser
Establecer el número máximo de días antes de cambiar la contraseña.
Este ajuste dice el usuario debe cambiar la contraseña cuando se cumple el número de dias indicado.
-> chage --maxdays 200 appuser
Establecer el número de dias que la cuenta puede estar inactiva en el sistema.
Esto indica el usuario (la contraseña) puede estar inactivo por no más del número de dias indicado.
-> chage --inactive 30 appuser
Todas las configuraciones anteriores se pueden agrupar en un solo comando así.
-> chage --expiredate 2024-12-31 --warndays 10 --mindays 180 --maxdays 200 --inactive 30 appuser
Ahora, veamos todos los cambios hechos.
-> chage -l appuser
Last password change : May 18, 2024
Password expires : Dec 04, 2024
Password inactive : Jan 03, 2025
Account expires : Dec 31, 2024
Minimum number of days between password change : 180
Maximum number of days between password change : 200
Number of days of warning before password expires : 10
Todos los cambion se ven en /etc/shadow
en los campos correspondientes.
-> grep appuser /etc/shadow
appuser:$y$j9T$P2Wk5imw0AqKdMnzMHCoz.$vJxs5FqmYoorHrUAgN18Qq2Z98Xq00BmAK4/lkqHQG1:19861:180:200:10:30:20088:
Para más información ver la ayuda en linea del comando.
-> chage --help
Modificar Usuarios con USERMOD
La página manual del comando usermod
dice lo siguiente: “El comando usermod modifica los archivos de la cuenta del sistema para reflejar los cambios que se especificado en la línea de comando.”
Cambiemos el UID a 2000
para appuser
-> usermod --uid 2000 appuser
Cambiemos la contraseña de appuser
a secret
. El cambio se refleja en /etc/shadow
.
-> usermod --password secret appuser
-> grep appuser /etc/shadow
appuser:secret:19861:180:200:10:30:20088:
Agreguemos el ususario appuser
al group staff
en adición a los que ya pertenece.
-> usermod --groups staff appuser
-> id appuser
uid=2000(appuser) gid=1000(appuser) groups=1000(appuser),50(staff)
El comando id <usuario>
muestra todos los grupos a los que un usuario pertence.
Enseguida, borremos el usuario appuser
del group staff
.
Para borrar un usuario de un grupo, hay que listar los groups a los que queremos mantenar y dejar fuera los que queremos borrar. En este ejemplo, el appuser
pertencera solo al appgroup
.
usermod --groups appgroup appuser
Bloquer Usuario
Podemos bloquear o desbloquear un usuario con el commando usermod
.
- El ajuste
--lock
bloquea - El ajuste
--unlock
desbloquea
-> usermod --lock appuser
-> usermod --unlock appuser
Para más información ver la ayuda en linea del comando.
-> usermod --help
Tambien podemos bloquer o desbloquer con el commando passwd
.
Para bloquear un usuario usemos la bandera -l
asi:
-> passwd -l techuser
Podemos chequear el estado del usuario de esta manera:
-> grep techuser /etc/shadow
techuser:!$y$j9T$gQtiW96hN/wjuClWzU0sr.$/NSWKHNtTg01XtCVUPrBrC4jBM3lPa.bqx21d/evRq4:19861:0:99999:7:::
El símbolo !
se agregó despues del primer :
indicando esta cuenta esta bloqueada y no puede usarse para entrar al sistema.
Para remover el bloqueo de un usuario usando passwd
usemos la bandera -u
asi:
-> passwd -u techuser
passwd: password expiry information changed.
El símbolo !
se remueve después de esta operación indicando que esta cuenta ha sido reabilitada para entrar al sistema.
Borrar Usuario
En Ubuntu y RedHat hay dos comandos para crear usuarios: deluser
y userdel
.
Debemos decidir si deseamos mantener or borrar el directorio de inicio cuando borramos una cuenta de usuario en Linux
En los dos ejemplos que siguen, el directorio de inicio es preservado.
El comando deluser
pregunta el nombre del usuario a borrar.
-> deluser
Enter a user name to remove: appuser
Removing user `appuser' ...
Warning: group `appuser' has no more members.
Done.
El comando userdel
requiere que pasemos el nombre del usuario a borrar como parámetro.
-> userdel techuser
En algunos casos es importante preservar los datos que un usuario a colectado durante su trabajo. Lo mas posible es que los datos se encuentren en el directorio de inicio del usuario. Al borrar el usuario podemos pasar una opción al comando deluser
para crear una copia de archivo de los datos.
En este ejemplo que sigue hacemos lo siguiente:
- Usamos el comando
mkdir
para crear/tmp/appuser
como destinación para la copia de seguridad del directorio del usuario - usamos la opción
--backup-to
para hacer una copia de seguridad en el directorio/tmp/appuser
- usamos la opción
--remove-home
para borrar el directorio de inicio del usuario - borramos el usuario
appuser
- usamos los comandos
ls
ytar
para verificar que la copia de seguridad fue creada
-> mkdir /tmp/appuser
-> deluser appuser --remove-home --backup-to /tmp/appuser
Looking for files to backup/remove ...
Backing up files to be removed to /tmp/appuser ...
backup_name = /tmp/appuser/appuser.tar
/bin/tar: Removing leading `/' from member names
/bin/tar: Removing leading `/' from hard link targets
Removing files ...
Removing user `appuser' ...
Warning: group `appuser' has no more members.
Done.
-> ls -l /tmp/appuser/appuser.tar.gz
-rw------- 1 root root 2384 May 18 22:12 /tmp/appuser/appuser.tar.gz
-> tar -tzvf /tmp/appuser/appuser.tar.gz
-rw-r--r-- appuser/appuser 3771 2024-05-18 21:08 home/appuser/.bashrc
-rw-r--r-- appuser/appuser 807 2024-05-18 21:08 home/appuser/.profile
-rw-r--r-- appuser/appuser 220 2024-05-18 21:08 home/appuser/.bash_logout
-rw------- appuser/appuser 51 2024-05-18 22:10 home/appuser/.bash_history
-rw-rw-r-- appuser/appuser 29 2024-05-18 22:10 home/appuser/myfile
El comando solo eliminó el usuario appuser
y eliminó su directorio de inicio mientras realizó una copia de seguridad del contenido en /tmp/appuser
.
Finalmente, usemos el comando id
para verificar que el usuario has sido borrado.
-> id appuser
id: 'appuser': no such user
Conclusion
Linux provee todas las herramientas necesarios para manejar acceso al sistema. Se debe tener en consideración el tipo de acceso que una cuenta requiere y solo dar el acceso mínimo para que el usuario funcione sin impedimento.
Todos los comandos para manejar cuentas estas disponibles en Ubuntu y RedHat.
Está bien usar Cuentas Locales en sistemas de uso personal, de desarrollo, laboration o ambientes pequeños, pero en ambientes mas complejos es recomendable experimentar con herramientas mas sólidas y seguras tales come LDAP o AD.
Referencias
Glosario De Comandos
Los comandos siguientes son usados frecuentemente en sesiones de Linux.
- adduser, useradd
- agregar cuenta de usuario en Linux
- deluser, userdel
- borrar cuenta de usuario en Linux
- passwd
- dar or cambinar contraseña de usuario en Linux
- mkdir
- crear directorio
- grep, awk, cut
- buscar cadena de letras
Referencias Utiles
Paginas Manuales (Ubuntu)