A menudo usamos nuestro sistema Linux con configuraciones estándar en nuestras máquinas de escritorio… y en nuestros servidores. Los usuarios usan una única cuenta para administrar las máquinas, usan claves rsa sin encriptar, dichas claves rsa están en sus máquinas en discos no encriptados, no usan contraseña para loguearse, no se bloquea la cuenta por inactividad, y un largo etcétera que no quiero ni enumerar, me da mucho miedo sólo el pensarlo.
Después de éste pequeño repaso a muchos peligros que algunos de nosotros tenemos alrededor, vamos a centrarnos. Concretamente en servidores montados con Fedora 25 que es de los últimos que he tenido que configurar con unas políticas de seguridad y acceso marcadas por una compañía.
El manejo de políticas de autenticación a través de Pluggable Authentication Modules (PAM) que en su versión de Fedora 25 ha dejado de usar /etc/pam.conf por el directorio /etc/pam.d/ no está muy bien documentado, sobretodo en lo referente a qué hace cada parámetro y cómo lo podemos usar.
Para nuestro caso, cambiaremos la configuración para poder limitar intentos de password, longitud mínima, complejidad de la contraseña (3 de estas cuatro características: mayúsculas, minúsculas, números y símbolos), evitar nombre de usuario en la contraseña, revisar diccionario para no usar como contraseña cadenas ahí incluidas o forzar la política para todos los usuarios, incluido root.
Pasamos a revisar el fichero que nos interesa para realizar todos estos cambios /etc/pam.d/system-auth
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 1000 quiet_success
auth required pam_deny.so
account required pam_unix.so
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 1000 quiet
account required pam_permit.so
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
-session optional pam_systemd.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
pam_pwquality.so es un módulo para comprobar la calidad de las contraseñas. Hay otros, como pam_cracklib o pam_passwdqc que se podrían usar en sustitución de pam_pwquality.so. Cada uno tiene sus características. La carga de uno u otro módulo se define en el fichero /etc/sysconfig/authconfig.
Nos va a interesar de pam_pwquality.so:
debug: al usar este parámetro se muestra el funcionamiento del módulo en el log del sistema
retry=3: número de intentos para introducir la cadena.
minlen=15: longitud mínima que debe usarse.
minclass=3: al menos 3 de cuatro características deben cumplirse (mayúsculas, minúsculas, símbolos y números)
reject_username: al activarlo impedimos usar la cadena nombre de usuario como parte de la contraseña tanto en orden natural como inverso.
gecoscheck=1: impedir el uso de cadenas del campo GECOS (normalmente nombre de usuario largo).
enforce_for_root: hacer que la directiva también se use con "root".
Además, este módulo carga el diccionario que tenga de manera estándar el sistema. Yo no pude hacer cargar el mío propio, pero sí pude añadir las palabra que me interesaban al que usa de manera predeterminada el sistema, de la siguiente manera:
create-cracklib-dict <fichero de texto con las cadenas>
Finalmente la configuración quedaría como:
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 1000 quiet_success
auth required pam_deny.so
account required pam_unix.so
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 1000 quiet
account required pam_permit.so
password requisite pam_pwquality.so debug retry=3 minlen=15 minclass=3 reject_username gecoscheck=1 enforce_for_root
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
-session optional pam_systemd.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
Y recargamos la configuración con:
authconfig --updateall
.