Crear políticas de contraseñas en Linux

No cabe duda la importancia de las políticas de contraseñas en cualquier sistema que se precie. En GNU/Linux existen múltiples herramientas para definir que políticas queremos implementar a la hora de utilizar contraseñas.

La herramienta ‘pam_pwquality‘ se ha incorporado en la distribución Red Hat 7 y es compatible con otras distribuciones como Ubuntu o Centos. Esta herramienta tiene intención de sustituir a ‘pam_cracklib‘ , que se utilizaba en sistemas RHEL / Centos en su versión 6.

El problema de definir contraseñas

En la mayoría de las empresas en las que he trabajado han existido políticas de contraseñas como el uso de mayúsculas y minúsculas, dígitos y símbolos, o definir un tiempo dado para la caducidad de estas. Aún así no queda claro que todo esto realmente sea lo más eficiente. Ya que, por una parte, la creación de galimatías difíciles de recordar hace que los usuarios las escriban o almacenen de manera insegura. Además, el asunto de cambiar la contraseña cada cierto tiempo, según algunos estudios, demuestran que esto es realmente perjudicial para la seguridad.

Aún así, respecto al tema de la caducidad de las contraseñas. Si las utilizamos para servicios en la nube de terceros, debemos revisar los ataques que sufren estas plataformas on-line, ya que se han dado muchos casos de robo masivo de credenciales.

Por otra parte, el número de dígitos mínimo es ciertamente importante, ya que la mayoría de los usuarios utilizan siete dígitos (ver recomendaciones de INTECO, en enlaces consultados), por lo que diez o más sería lo ideal, ya que el tiempo para descubrir la clave se puede reducir a minutos e incluso a segundos, depende el número de caracteres que utilicemos. Las recomendaciones de RHEL para la versión 7 son de un mínimo de 14. (Guía de seguridad DISA STIG para RHEL 7)

Opciones para definir las políticas

Veamos una lista de las opciones más utilizadas para definir las políticas de contraseñas. Muchos de estos parámetros son comunes entre ‘pam_pwquality‘ y ‘pam_cracklib‘, por lo que esto facilita migrar las las políticas desde un sistema antiguo

  • difok: Define el número de caracteres en una nueva contraseña que NO deben estar presentes en la contraseña anterior. Por defecto 5
  • minlen: Longitud mínima de la nueva contraseña, por defecto son 9
  • ucredit: Número máximo de créditos por tener letras mayúsculas (N >= 0), o número mínimo de letras mayúsculas requeridas (N < 0), por defecto es 1
  • lcredit: Número máximo de créditos por tener letras minúsculas (N >= 0), o número mínimo de letras minúsculas requeridas (N < 0), por defecto es 1
  • dcredit: Número máximo de créditos por tener dígitos (N >= 0), o número de dígitos requeridos (N < 0), por defecto es 1
  • ocredit: Número máximo de créditos por tener otros caracteres ( N >= 0), o número mínimo de otros caracteres requeridos (N < 0), por defecto es 1
  • minclass: Estable e número de clases requeridas. Las clases incluyen lo anterior (mayúsculas, minúsculas, dígito y no alfa), por defecto es 0
  • maxrepeat: Número máximo de caracteres repetidos, por defecto es 0
  • maxclassrepeat: Número máximo de caracteres consecutivos en la misma clase, por defecto es 0
  • gecoscheck: Comprueba si la contraseña coincide con alguna palabra en las cadenas GECOS de los usuarios (información del usuario como su nombre real, ubicación, etc), por defecto es 0 (desactivado)
  • dictpacth: Ruta a los diccionarios de clacklib
  • badwords: Lista separada por espacios de palabras que están prohibidas en las contraseña (nombre de la empresa u organización, la palabra «password», etcétera)

Veamos un poco más al detalle el significado y uso de los créditos.

¿Qué son los créditos y cómo funcionan?

Para definir la calidad y complejidad de las contraseñas se utiliza un sistema de créditos. Si la configuración de los créditos es mayor que cero, se obtienen un número de datos de “créditos de caracteres” en referencia con la longitud de la contraseña. Por ejemplo, si todas las líneas de crédito (ucredit, lcredit, dcredit y ocredit) se establecieron en 1, y el requisito de longitud de contraseña se estableció en 6, necesitaremos 6 caracteres para cumplir con el requisito de longitud, porque cada mayúscula, minúscula, dígito y símbolo le darían un crédito.

Configurar las políticas de contraseñas

Antes de definir las políticas de contraseñas las debemos tener claras, es una buena idea tenerlas documentadas, para que se puedan consultar.

Veamos un ejemplo:

  • La contraseña debe tener 10 caracteres de longitud
  • La contraseña no debe repetir el mismo carácter más de dos veces
  • La contraseña no debe repetir ninguna clase de caracteres más de cuatro veces
  • La contraseña debe contenedor caracteres de casa clase.
  • La nueva contraseña debe tener 4 nuevos caracteres en comparación con la contraseña anterior.
  • Habilitar chequeo de GECOC
  • Prohibir palabras “contraseña, password, qwerty, word, palabra”

Ahora que hemos definido nuestra nueva política, ya podemos editar el fichero «/etc/security/pwquality.conf«, para aplicar nuestros nuevos requisitos de complejidad de contraseña.

Veamos el fichero editado:

  1. # La nueva contraseña debe tener 4 nuevos caracteres versus la anterior
  2. difok = 4
  3. # La contraseña deberá tener por lo menos 10 caracteres de longitud
  4. minlen = 10
  5. # Require por lo menos un dígito
  6. dcredit = -1
  7. # Requiere al menos 1 letra mayúscula
  8. ucredit = -1
  9. # Requiere al menos 1 letra minúscula
  10. lcredit = -1
  11. # Requiere al menos 1 carácater especial (no alfanumérico)
  12. ocredit = -1
  13. # Requiere un carácter de cada clase (mayúsculas, minúsculas, digito y otro)
  14. minclass = 4
  15. # Solo permitimos que cada carácter se repita dos veces, evitamos cosas como aaa
  16. maxrepeat = 2
  17. # Sólo permitir que una clase se repita 4 veces
  18. maxclassrepeat = 4
  19. # Verifica la información del usuario, por ejemplo su nombre, para asegurarse que no lo utiliza
  20. gecoscheck = 1
  21. # La ruta del diccionario por defecto
  22. dictpath =

Algunas reglas son redundantes, al ser un ejemplo, lo importante ver el significado de cada campo en la configuración. Respecto a la configuración de los campos que hemos utilizado números negativos, esto implica que se quiere ese número de forma obligatoria.

Probando las contraseñas

Junto con la herramienta ‘libpwquality‘, tenemos también disponible otra llamada ‘pwscore‘, que proporciona un método para verificar la complejidad de una contraseña.

La herramienta ‘pwscore‘ lee desde la salida estándar stdin. Para utilizarla simplemente debemos añadir a continuación una contraseña que queramos probar, esta nos mostrará un error o un valor de puntación del 0 al 100.

La puntuación de calidad de la contraseña es relativa a la configuración que tengamos definida. Todos los valores por debajo de 50 se consideran de calidad moderada y por encima de calidad fuerte o muy fuerte. Cualquier contraseña que pase los controles de calidad, debería soportar sin problemas los ataques de diccionario o de fuerza bruta.

Podemos realizar una prueba, utilizando una contraseña simple:

  1. [root@servcentos]# echo "hola1234" | pwscore
  2. Falló la verificación de la calidad de la contraseña:
  3.  La contraseña contiene más de 4 caracteres de la misma clase en forma consecutiva

En cambio, si utilizamos una contraseña compleja:

  1. [root@servcentos]# echo "ETis&78hie$koh7ka8hT?hu9" | pwscore
  2. 78

Con esa puntuación garantizamos que la contraseña es muy segura y robusta.

Conclusiones

Hemos visto las diferentes maneras de configurar las políticas de contraseñas en sistemas GNU/Linux, utilizando en este caso la herramientas ‘pam_pwquality‘ y ‘pwscore‘ ¿Qué os ha parecido? ¿Utilizáis otras herramientas o módulos para definir polítias de contraseñas?

Y esto es todo, os recomiendo consultar los enlaces a las páginas consultadas:

Putorius.net – Creating password policy in Linux
Universidad de la Rioja – Política de Contraseñas
Wpollock.com – PAM Help
Systutorials.com – PAM PWQuality