lunes, 29 de julio de 2013

Administración de usuarios en Linux (Parte 1): Agregar usuarios y análisis de los archivos /etc/passwd y /etc/shadow

Para agregar un usuario en un sistema Linux, nos logueamos como root y utilizamos el comando
adduser <nombre_de_usuario>
A continuación, podemos llenar la información solicitada (la cual es opcional salvo la contraseña) para identificar mejor al usuario que estamos creando (es decir, para poder relacionarlo con una persona real):


Dicha información es almacenada en dos archivos:
/etc/passwd

Como podemos ver, cada línea de este archivo representa el registro que contiene la información correspondiente a cada usuario, y está compuesta por 7 campos (separados por ":"), a saber:
1) Nombre de usuario
2) ¿Encriptar la clave y guardar la versión encriptada en el archivo /etc/shadow? (Una "x" indica que este proceso se lleva a cabo, mientras que cualquier otro caracter -generalmente "*" se utiliza para deshabilitar la cuenta). Cabe destacar que por razones de seguridad, solamente se guarda la contraseña encriptada. Cuando un usuario intenta loguearse en el sistema se encripta la clave que ingresa y se compara con la almacenada en /etc/shadow; si ambas son iguales se permite el acceso al mismo.
En mi experiencia, quitar la "x" del segundo campo es una forma de permitir el login sin contraseña de un usuario local del sistema (se puede utilizar este método para recuperar el acceso como root si no se conoce la contraseña del superusuario. Para esto obviamente es necesario disponer de acceso físico al equipo y utilizar una herramienta de booteo tal como un LiveCD/DVD/USB que permita montar los sistemas de archivos locales y modificar la línea correspondiente en el archivo /etc/passwd).
¡CUIDADO CON ESTO! Ya que cuando se cambie la contraseña del usuario en cuestión, ya sea que lo haga él mismo utilizando el comando passwd o que lo haga el superusuario, la nueva contraseña se almacenará encriptada en el archivo /etc/passwd (el cual pueden leer todos los usuarios). Esto representa un serio problema de seguridad:

Si se llegase a utilizar el método descrito para cambiar la contraseña de root, o si se desea permitir el login local sin contraseña, antes de cambiar la contraseña del usuario en cuestión, se debe volver a colocar la "x" en su lugar, para luego proceder a cambiar la clave normalmente:


3) ID de usuario. El UID 0 es el perteneciente a root, desde el 1 hasta el 999 están reservados para usuarios del sistema (procesos o daemons), y desde 1000 en adelante se utilizan para los usuarios "comunes" o locales del sistema.
4) ID de grupo primario (GID). El GID 0 es el perteneciente a root, desde el 1 hasta el 999 están reservados para usuarios del sistema (procesos o daemons), y desde 1000 en adelante se utilizan para los usuarios "comunes" o locales del sistema. Se guarda en el archivo /etc/group. En Linux, los grupos representan un segundo anillo de seguridad en lo que a permisos respecta.
5) Información del usuario
6) El home (directorio personal) del usuario. Este es el directorio en el que se encontrará el usuario cuando ingrese al sistema. Si este campo está vacío, "/" (raíz del sistema de archivos) se convierte en el directorio personal del usuario.
7) Ruta absoluta a un comando o shell que utilizará el usuario al loguearse (no tiene que ser precisamente un shell, pero de no ser así el sistema no tendrá mucha utilidad).
Podemos ver en la línea n° 6 del primer paste que durante el proceso de creación de un usuario, se copian a su home los archivos que se encuentran en el directorio /etc/skel, que se utilizarán para guardar las preferencias del perfil del usuario (.profile), de su entorno de shell (.bashrc), y de las acciones a realizar cuando cierra sesión (.bash_logout). Adicionalmente se creará dentro del home del usuario el archivo .bash_history en el que se registrará el historial de comandos del mismo:

/etc/shadow
En este archivo se guardan, entre otras cosas (como veremos a continuación) las contraseñas encriptadas de los usuarios:


Otra vez nos encontramos con un registro por línea, con campos separados por ":". El significado de los mismos es el siguiente:
1) Nombre de usuario
2) Contraseña encriptada. Un signo "$" al comienzo es indicador que el cifrado se llevó a cabo utilizando el algoritmo MD5.
3) Días transcurridos desde el 1 de enero de 1970 hasta la fecha correspondiente al último cambio de contraseña.
4) Cantidad mínima de días entre cambios de contraseña, es decir, la cantidad de días que restan hasta la fecha en que se permitirá un cambio de contraseña.
5) Cantidad máxima de días (duración) de la contraseña, luego de la cual el usuario tendrá que cambiarla. 6) Advertencia, número de días antes del vencimiento (expiración) de la contraseña en el que se comenzará a mostrar un mensaje de advertencia avisando de la necesidad de cambiarla.
7) Deshabilitación de cuenta, número de días luego del vencimiento de la clave en que se deshabilitará la cuenta.
8) Cuenta deshabilitada, número de días transcurridos desde el 1 de enero de 1970 hasta el día que la cuenta fue deshabilitada.

¿Por qué los datos de los usuarios se guardan en un archivo y las contraseñas en otro? La razón es que si el archivo en el que se guardan las claves pudiera ser leído por cualquier usuario, se tendría acceso a las contraseñas (encriptadas, sí, pero acceso al fin) y eso representaría un grave problema de seguridad ya que eventualmente podrían ser descifradas con relativa facilidad si no se cuenta con una política de cambio y fortaleza de claves adecuada.
Para demostrar este hecho, utilizando la herramienta john the ripper intentamos crackear la contraseña del usuario recién creado, y vemos que el proceso consume una gran parte de los recursos del sistema (cosa que no es mayor problema si se cuenta con un equipo dedicado a esta tarea).

Precisamente en el segundo campo se puede ver la contraseña del usuario jperez (1234):
(aunque el proceso para crackear una contraseña tan simple duró 44 minutos, hay que tener en cuenta que esto demuestra que SÍ SE PUEDE LOGRAR, y el tiempo se puede disminuir utilizando un equipo que cuente con mayores recursos de hardware). Esta prueba fue realizada en PC Compaq Presario ("modelo" 2000) con 256 MB de RAM y procesador Intel Celeron de 566 MHz.