viernes, 24 de enero de 2014

Políticas de contraseñas en GNU/Linux

La administración de las cuentas de usuarios es una tarea vital para todo Sys Admin, debido a las implicaciones de seguridad que esto tiene. No basta con asignarle contraseñas robustas a los usuarios, pues muchas veces ellos mismos las cambias por alguna más fácil de recordar (como por ej. 1234).

A continuación veremos algunas configuraciones que nos permitirán estar más tranquilos en ese sentido y estar preparados para vaguear un poco.

Las políticas de contraseñas en GNU/Linux se implementan haciendo uso de PAM (Pluggable Authentication Modules), el cual viene instalado por defecto en la mayoría de distribuciones actuales. Esto nos permite saltarnos el paso de la instalación de PAM para ir directamente a configurar.

Solo en caso de de Debian y derivadas, es necesario instalar cracklib, un paquete que provee capacidades adicionales para control de contraseñas. En Red Hat y derivadas, cracklib ya viene instalado.
[fraterneo@rainbow3 ~]$ sudo apt-get install -y libpam-cracklib
Entrando ya en materia, para aplicar políticas de contraseñas trabajeremos con algunos ficheros de configuración ubicados en /etc/pam.d/, lo que nos permitirá que los cambios surtan efecto inmediatamente. Es importante aclarar que estas políticas aplican solo para los usuarios; el super usuario (root) está excento de ellas.

Prevenir el uso de contraseñas anteriores
Esto se logra haciendo uso del parámetro remember en la línea de password que tiene a "pam_unix.so". Si le damos, por ejemplo, un valor de 5, no permitirá la re-utilización de las últimas cinco contraseñas almacenadas en /etc/security/opasswd.

En Debian y derivadas:
[fraterneo@rainbow3 ~]$ sudo vi /etc/pam.d/common-password
password     [success=1 default=ignore]    pam_unix.so obscure sha512 remember=5
En Red Hat y derivadas:
[fraterneo@rainbow3 ~]$ sudo vi /etc/pam.d/system-auth
password   sufficient   pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=5
Tamaño mínimo de la contraseña
Esto se logra con el parámetro minlen usado en una línea "password" con "pam_cracklib.so". Si le damos un calor de 10. Esto forzará a colocar contraseñas de 10 caracteres de largo. Sim embargo como existen 4 tipos de caracteres para las contraseñas (upper-case, lower-case, numeric, y symbol) debemos restar 4 a minlen para obtener el tamaño final permitido, que este caso sería de 6.

En Debian y derivadas:
[fraterneo@rainbow3 ~]$ sudo vi /etc/pam.d/common-password
password   requisite    pam_cracklib.so retry=3 minlen=10 difok=3
En Red Hat y derivadas:
[fraterneo@rainbow3 ~]$ sudo vi /etc/pam.d/system-auth
password   requisite   pam_cracklib.so retry=3 difok=3 minlen=10
Complejidad de la contraseña
Esto lo haremos con los parámetros ucredit, lcredit, dcredit y ocredit en una línea que contenga "password" y "pam_cracklib.so", dándole los siguientes valores: "ucredit=-1 lcredit=-2 dcredit=-1 ocredit=-1". Esto forzará a incluir al menos un caŕacter en mayúscula (ucredit), dos en minúscula (lcredit), uno numérico (dcredit) y un símbolo (ocredit).

En Debian y derivadas:
[fraterneo@rainbow3 ~]$ sudo vi /etc/pam.d/common-password
password   requisite    pam_cracklib.so retry=3 minlen=10 difok=3 ucredit=-1 lcredit=-2 dcredit=-1 ocredit=-1
En Red Hat y derivadas:
[fraterneo@rainbow3 ~]$ sudo vi /etc/pam.d/system-auth
password   requisite   pam_cracklib.so retry=3 difok=3 minlen=10 ucredit=-1 lcredit=-2 dcredit=-1 ocredit=-1
Vencimiento de la contraseña
Para establecer el período de vencimiento global (para todos los usuarios) de las contraseñas, lo haremos editando el fichero /etc/login.defs.
[fraterneo@rainbow3 ~]$ sudo vi /etc/login.defs
PASS_MAX_DAYS   60
PASS_MIN_DAYS   0
PASS_WARN_AGE   14
De esta manera los usuarios deberán cambiarla cada 60 días (dos meses), con advertencias desde 14 días antes del vencimiento.

Si queremos hacerlo para un usuario específico, usaremos el comando chage. Primero vemos la política de vencimiento de la contraseña de dicho usuario.
[fraterneo@rainbow3 ~]$ sudo chage -l fraterneo
Last password change                                    : Nov 12, 2013
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
Como podemos observar la contraseña de fraterneo nunca expira. Con el mismo comando chage cambiamos esta situación.
[fraterneo@rainbow3 ~]$ sudo chage -E 6/30/2014 -m 10 -M 90 -I 30 -W 14 fraterneo
El comando anterior pondrá como fecha de expiración el 30 de marzo de 2014. Además, el número max/min de días entre cambios lo establece a 10 y 90; la cuenta se bloqueará a 30 días del vencimiento de la contraseña, si esta no ha sido cambiada; y la advertencia será enviada al usuario 14 días antes del vencimiento.

En modo gráfico (Red Hat y derivadas)
Para los que se sienten mejor trabajando con una GUI (aunque no es lo mejor administrativamente), en Red Hat y derviadas tenemos la herramienta authconfig-gtk, que trabaja con system-config-authentication, y por supuesto siempre tenemos a system-config-users.









Estas herramientas no vienen instaladas por defecto, pero están disponibles en los repositorios.

4 comentarios: