¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!
ansible-ssh-hardening — Este rol de Ansible proporciona numerosas configuraciones de ssh relacionadas con la seguridad, ofreciendo una protección base integral. | Kitploit
¡Por favor, abre cualquier issue y pull request allí!
Requisitos
Ansible > 2.5
Variables del Rol
network_ipv6_enable
Valor por defecto: false
Descripción: true si se necesita IPv6. ssh_listen_to también debe configurarse para escuchar en direcciones IPv6 (por ejemplo [::]).
ssh_server_ports
Valor por defecto: ['22']
Descripción: puertos en los que el servidor ssh debe escuchar
ssh_client_port
Valor por defecto: '22'
Descripción: puerto al que el cliente ssh debe conectarse
ssh_listen_to
Valor por defecto: ['0.0.0.0']
Descripción: una o más direcciones IP, a las que el servidor ssh debe escuchar. El valor por defecto son todas las direcciones IPv4, pero por razones de seguridad debería configurarse con direcciones específicas.
ssh_host_key_files
Valor por defecto: []
Descripción: claves de host para sshd. Si está vacío, se usarán ['/etc/ssh/ssh_host_rsa_key', '/etc/ssh/ssh_host_ecdsa_key', '/etc/ssh/ssh_host_ed25519_key'] en la medida en que la versión de sshd instalada lo soporte
ssh_host_key_algorithms
Valor por defecto: []
Descripción: algoritmos de clave de host que ofrece el servidor. Si está vacío, se usará la lista por defecto; de lo contrario, sobrescribe la configuración con la lista de algoritmos especificada
ssh_client_alive_interval
Valor por defecto: 600
Descripción: especifica un intervalo para enviar mensajes de keepalive
ssh_client_alive_count
Valor por defecto: 3
Descripción: define cuántas veces se envían los mensajes de keep-alive
ssh_permit_tunnel
Valor por defecto: false
Descripción: true si se requiere túnel de puertos SSH
ssh_remote_hosts
Valor por defecto: []
Descripción: uno o más hosts y sus opciones personalizadas para el cliente ssh. El valor por defecto está vacío. Consulta los ejemplos en defaults/main.yml.
ssh_permit_root_login
Valor por defecto: no
Descripción: deshabilita el login de root. Configúralo en without-password o yes para habilitar el login de root
ssh_allow_tcp_forwarding
Valor por defecto: no
Descripción: 'no' para deshabilitar el reenvío TCP. Configúralo en 'yes' para permitir el reenvío TCP. Si usas OpenSSH >= 6.2, puedes especificar 'yes', 'no', 'all' o 'local'. Nota: los valores pasados a esta variable deben ser cadenas, por lo que los valores 'yes' y 'no' deben pasarse entre comillas.
ssh_gateway_ports
Valor por defecto: false
Descripción: false para deshabilitar el enlace de puertos reenviados a direcciones que no sean de loopback. Configúralo en true para forzar el enlace en la dirección wildcard. Configúralo en clientspecified para permitir que el cliente especifique a qué dirección enlazar.
ssh_allow_agent_forwarding
Valor por defecto: false
Descripción: false para deshabilitar el reenvío de agente. Configúralo en true para permitir el reenvío de agente.
ssh_x11_forwarding
Valor por defecto: false
Descripción: false para deshabilitar el reenvío X11. Configúralo en true para permitir el reenvío X11.
ssh_pam_support
Valor por defecto: true
Descripción: true si SSH tiene soporte PAM.
ssh_use_pam
Valor por defecto: true
Descripción: false para deshabilitar la autenticación pam.
ssh_gssapi_support
Valor por defecto: false
Descripción: true si SSH tiene soporte GSSAPI.
ssh_kerberos_support
Valor por defecto: true
Descripción: true si SSH tiene soporte Kerberos.
ssh_deny_users
Valor por defecto: ''
Descripción: si se especifica, se deshabilita el login para nombres de usuario que coincidan con uno de los patrones.
ssh_allow_users
Valor por defecto: ''
Descripción: si se especifica, el login solo se permite para nombres de usuario que coincidan con uno de los patrones.
ssh_deny_groups
Valor por defecto: ''
Descripción: si se especifica, se deshabilita el login para usuarios cuyo grupo principal o lista de grupos suplementarios coincida con uno de los patrones.
ssh_allow_groups
Valor por defecto: ''
Descripción: si se especifica, el login solo se permite para usuarios cuyo grupo principal o lista de grupos suplementarios coincida con uno de los patrones.
ssh_authorized_keys_file
Valor por defecto: ''
Descripción: cambia el archivo por defecto que contiene las claves públicas que se pueden usar para la autenticación de usuarios.
ssh_trusted_user_ca_keys_file
Valor por defecto: ''
Descripción: especifica el archivo que contiene las claves públicas de las autoridades certificadoras de confianza utilizadas para firmar certificados de usuario.
ssh_trusted_user_ca_keys
Valor por defecto: []
Descripción: establece las claves públicas de las autoridades certificadoras de confianza utilizadas para firmar certificados de usuario. Solo se usa si ssh_trusted_user_ca_keys_file está configurado.
ssh_authorized_principals_file
Valor por defecto: ''
Descripción: especifica el archivo que contiene los principals permitidos. Solo se usa si ssh_trusted_user_ca_keys_file está configurado.
ssh_authorized_principals
Valor por defecto: []
Descripción: lista de hashes que contienen rutas de archivo y principals autorizados; consulta default_custom.yml para todas las opciones. Solo se usa si ssh_authorized_principals_file está configurado.
ssh_print_motd
Valor por defecto: false
Descripción: false para deshabilitar la impresión del MOTD
ssh_print_pam_motd
Valor por defecto: false
Descripción: false para deshabilitar la impresión del MOTD mediante pam (Debian y Ubuntu)
ssh_print_last_log
Valor por defecto: false
Descripción: false para deshabilitar la visualización de la información del último login
sftp_enabled
Valor por defecto: false
Descripción: true para habilitar la configuración de sftp
sftp_umask
Valor por defecto: '0027'
Descripción: especifica el umask para sftp
sftp_chroot
Valor por defecto: true
Descripción: false para deshabilitar chroot para sftp
sftp_chroot_dir
Valor por defecto: /home/%u
Descripción: cambia la ubicación por defecto del chroot de sftp
ssh_client_roaming
Valor por defecto: false
Descripción: habilita el roaming experimental del cliente
sshd_moduli_file
Valor por defecto: '/etc/ssh/moduli'
Descripción: ruta al archivo de moduli SSH
sshd_moduli_minimum
Valor por defecto: 2048
Descripción: elimina los parámetros Diffie-Hellman más pequeños que el tamaño definido para mitigar logjam
ssh_challengeresponseauthentication
Valor por defecto: false
Descripción: especifica si se permite la autenticación challenge-response (por ejemplo, mediante PAM)
ssh_client_password_login
Valor por defecto: false
Descripción: true para permitir la autenticación basada en contraseña con el cliente ssh
ssh_server_password_login
Valor por defecto: false
Descripción: true para permitir la autenticación basada en contraseña con el servidor ssh
ssh_banner
Valor por defecto: false
Descripción: true para imprimir un banner en el login
ssh_banner_path
Valor por defecto: '/etc/sshd/banner.txt'
Descripción: ruta al archivo de banner SSH
ssh_client_hardening
Valor por defecto: true
Descripción: false para dejar de endurecer el cliente
ssh_client_port
Valor por defecto: '22'
Descripción: especifica el número de puerto para conectarse al host remoto.
ssh_client_compression
Valor por defecto: false
Descripción: especifica si el cliente solicita compresión.
ssh_compression
Valor por defecto: false
Descripción: especifica si la compresión del lado del servidor está habilitada después de que el usuario se haya autenticado correctamente.
ssh_login_grace_time
Valor por defecto: 30s
Descripción: especifica el tiempo permitido para la autenticación exitosa en el servidor SSH
ssh_max_auth_retries
Valor por defecto: 2
Descripción: especifica el número máximo de intentos de autenticación permitidos por conexión.
ssh_max_sessions
Valor por defecto: 10
Descripción: especifica el número máximo de sesiones abiertas permitidas desde una conexión determinada.
ssh_print_debian_banner
Valor por defecto: false
Descripción: true para imprimir el banner específico de Debian
ssh_server_enabled
Valor por defecto: true
Descripción: false para deshabilitar el servidor opensshd
ssh_server_hardening
Valor por defecto: true
Descripción: false para dejar de endurecer el servidor
ssh_server_match_address
Valor por defecto: ''
Descripción: introduce un bloque condicional. Si todos los criterios de la línea Match se cumplen, las palabras clave de las líneas siguientes sobrescriben las establecidas en la sección global del archivo de configuración, hasta otra línea Match o el final del archivo.
ssh_server_match_group
Valor por defecto: ''
Descripción: introduce un bloque condicional. Si todos los criterios de la línea Match se cumplen, las palabras clave de las líneas siguientes sobrescriben las establecidas en la sección global del archivo de configuración, hasta otra línea Match o el final del archivo.
ssh_server_match_user
Valor por defecto: ''
Descripción: introduce un bloque condicional. Si todos los criterios de la línea Match se cumplen, las palabras clave de las líneas siguientes sobrescriben las establecidas en la sección global del archivo de configuración, hasta otra línea Match o el final del archivo.
ssh_server_match_local_port
Valor por defecto: ''
Descripción: introduce un bloque condicional. Si todos los criterios de la línea Match se cumplen, las palabras clave de las líneas siguientes sobrescriben las establecidas en la sección global del archivo de configuración, hasta otra línea Match o el final del archivo.
ssh_server_permit_environment_vars
Valor por defecto: no
Descripción: yes para especificar que ~/.ssh/environment y las opciones environment= en ~/.ssh/authorized_keys son procesadas por sshd. Con la versión 7.8 de openssh es posible especificar una lista blanca de nombres de variables de entorno además de los ajustes globales "yes" o "no"
ssh_server_accept_env_vars
Valor por defecto: ''
Descripción: especifica qué variables de entorno enviadas por el cliente se copiarán en el entorno de la sesión; varias variables de entorno pueden estar separadas por espacios en blanco
ssh_use_dns
Valor por defecto: false
Descripción: especifica si sshd debe buscar el nombre del host remoto y comprobar que el nombre de host resuelto para la dirección IP remota se asigna de nuevo a la misma dirección IP.
ssh_server_revoked_keys
Valor por defecto: []
Descripción: una lista de claves públicas revocadas que el servidor ssh siempre rechazará; útil para revocar claves conocidas como débiles o comprometidas.
ssh_max_startups
Valor por defecto: '10:30:100'
Descripción: especifica el número máximo de conexiones no autenticadas concurrentes al daemon SSH.
ssh_macs
Valor por defecto: []
Descripción: cambia esta lista para sobrescribir los macs. Los valores por defecto se encuentran en defaults/main.yml
ssh_kex
Valor por defecto: []
Descripción: cambia esta lista para sobrescribir los kexs. Los valores por defecto se encuentran en defaults/main.yml
ssh_ciphers
Valor por defecto: []
Descripción: cambia esta lista para sobrescribir los ciphers. Los valores por defecto se encuentran en defaults/main.yml
ssh_custom_options
Valor por defecto: []
Descripción: líneas personalizadas para la configuración del cliente SSH
sshd_custom_options
Valor por defecto: []
Descripción: líneas personalizadas para la configuración del daemon SSH
sshd_syslog_facility
Valor por defecto: 'AUTH'
Descripción: el código de facility que se usa al registrar mensajes de sshd
sshd_log_level
Valor por defecto: 'VERBOSE'
Descripción: el nivel de verbosidad que se usa al registrar mensajes de sshd
sshd_strict_modes
Valor por defecto: true
Descripción: comprueba los modos de archivo y la propiedad de los archivos del usuario y del directorio home antes de aceptar el login
sshd_authenticationmethods
Valor por defecto: publickey
Descripción: especifica los métodos de autenticación que deben completarse correctamente para que un usuario reciba acceso. Asegúrate de configurar todas las variables necesarias para tu método de autenticación seleccionado. Los valores por defecto se encuentran en defaults/main.yml
Configurar ajustes no listados en las variables del rol
Si quieres configurar opciones de ssh que no están listadas arriba, puedes usar ssh_custom_options (para /etc/ssh/ssh_config) o sshd_custom_options (para /etc/ssh/sshd_config) para configurarlas. Estas opciones se establecerán al principio del archivo, de modo que puedes sobrescribir opciones más abajo en el archivo.
Este rol usa el puerto por defecto 22 o el puerto configurado en el inventario para conectarse al servidor. Si el puerto ssh por defecto se cambia mediante ssh_server_ports, una vez que el servidor ssh se reinicia, seguirá intentando conectarse usando el puerto anterior. Para poder ejecutar este rol de nuevo en el mismo servidor, el inventario deberá actualizarse para usar el nuevo puerto ssh.
Si la idempotencia es importante, considera usar el rol ssh-hardening-fallback, que es un wrapper alrededor de este rol y que vuelve al puerto 22 si el puerto configurado no es alcanzable.
Ejemplo de Playbook
root@kitploit:~
- hosts: localhost
roles:
- dev-sec.ssh-hardening
Pruebas Locales
La forma preferida de probar el rol localmente es usar Docker. Tendrás que instalar Docker en tu sistema. Consulta Get started para obtener un paquete de Docker adecuado para tu sistema.
También puedes usar vagrant y Virtualbox o VMWare para ejecutar pruebas localmente. Tendrás que instalar Virtualbox y Vagrant en tu sistema. Consulta Vagrant Downloads para obtener un paquete de vagrant adecuado para tu sistema. Para todas nuestras pruebas usamos test-kitchen. Si no estás familiarizado con test-kitchen, consulta su guía.
# prueba rápida en una máquina
bundle exec kitchen test ssh-ubuntu1804-ansible-latest
# prueba en todas las máquinas
bundle exec kitchen test
# para desarrollo
bundle exec kitchen create ssh-ubuntu1804-ansible-latest
bundle exec kitchen converge ssh-ubuntu1804-ansible-latest
bundle exec kitchen verify ssh-ubuntu1804-ansible-latest
# limpieza
bundle exec kitchen destroy ssh-ubuntu1804-ansible-latest
Pruebas con Virtualbox
root@kitploit:~
# prueba rápida en una máquina
KITCHEN_YAML=".kitchen.vagrant.yml" bundle exec kitchen test ssh-ubuntu-1804
# prueba en todas las máquinas
KITCHEN_YAML=".kitchen.vagrant.yml" bundle exec kitchen test
# para desarrollo
KITCHEN_YAML=".kitchen.vagrant.yml" bundle exec kitchen create ssh-ubuntu-1804
KITCHEN_YAML=".kitchen.vagrant.yml" bundle exec kitchen converge ssh-ubuntu-1804
No puedo iniciar sesión en mi cuenta. He registrado la clave del cliente, pero aun así no me deja entrar.
Si has agotado todos los problemas típicos (firewall, red, clave faltante, clave incorrecta, cuenta deshabilitada, etc.), puede que tu cuenta esté bloqueada. La forma más rápida de averiguarlo es mirar el hash de la contraseña de tu usuario:
root@kitploit:~
sudo grep myuser /etc/shadow
Si el hash incluye un !, tu cuenta está bloqueada:
root@kitploit:~
myuser:!:16280:7:60:7:::
La forma correcta de resolverlo es desbloquear la cuenta (passwd -u myuser). Si el usuario no tiene contraseña, puedes desbloquearla mediante:
root@kitploit:~
usermod -p "*" myuser
Alternativamente, si tienes la intención de usar PAM, lo habilitaste mediante ssh_use_pam: true. PAM permitirá que los usuarios bloqueados entren con claves.
¿Por qué mi aplicación ya no se conecta mediante SSH?
Mira siempre primero los archivos de registro y, si es posible, la negociación entre cliente y servidor que se completa al conectarse.
Hemos visto algunos problemas en aplicaciones (basadas en python y ruby) que se deben a su uso de un conjunto criptográfico obsoleto. Esto choca con este módulo de hardening, que ha reducido la lista de ciphers, códigos de autenticación de mensajes (MACs) y algoritmos de intercambio de claves (KEX) a una selección más segura.
¡Después de usar el rol, el módulo template/copy/file de Ansible ya no funciona!
Este rol desactiva SFTP por defecto. Ansible usa SFTP por defecto para transferir archivos a los hosts remotos. Tienes que configurar scp_if_ssh = True en tu ansible.cfg. De esta manera, Ansible usa SCP para copiar archivos. Alternativamente, puedes habilitar SFTP de nuevo configurando sftp_enabled en true.
No se puede reiniciar el servicio sshd por falta de privilegios
Si obtienes el siguiente error al ejecutar el handler "restart sshd"
root@kitploit:~
Unable to restart service ssh: Failed to restart ssh.service: Access denied
o
root@kitploit:~
failure 1 running systemctl show for 'ssh': Failed to connect to bus: No such file or directory
ejecuta el playbook como root (sin become: yes a nivel de playbook), o añade become: yes al handler.
Esto es un bug de Ansible: consulta aquí y aquí para más información.
Licenciado bajo la Apache License, Versión 2.0 (la "Licencia");
no puedes usar este archivo excepto en cumplimiento de la Licencia.
Puedes obtener una copia de la Licencia en
root@kitploit:~
http://www.apache.org/licenses/LICENSE-2.0
Salvo que lo exija la ley aplicable o se acuerde por escrito, el software
distribuido bajo la Licencia se distribuye "TAL CUAL",
SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ya sean expresas o implícitas.
Consulta la Licencia para conocer los permisos y
limitaciones específicos bajo la Licencia.