dev-sec.ssh-hardening

Endurecimiento SSH (Rol de Ansible)

Atención: Este rol ha sido trasladado a nuestra colección de endurecimiento:

¡Por favor, abra cualquier problema y solicitud de extracción allí!

Requisitos

  • Ansible > 2.5

Variables del Rol

  • network_ipv6_enable
    • Por defecto: false
    • Descripción: verdadero si se necesita IPv6. ssh_listen_to también debe configurarse para escuchar direcciones IPv6 (por ejemplo, [::]).
  • ssh_server_ports
    • Por defecto: ['22']
    • Descripción: puertos en los que el servidor SSH debe escuchar.
  • ssh_client_port
    • Por defecto: '22'
    • Descripción: puerto al que el cliente SSH debe conectarse.
  • ssh_listen_to
    • Por defecto: ['0.0.0.0']
    • Descripción: una o más direcciones IP a las que el servidor SSH debe escuchar. Por defecto es todas las direcciones IPv4, pero debe configurarse a direcciones específicas por razones de seguridad.
  • ssh_host_key_files
    • Por defecto: []
    • Descripción: Claves de host para sshd. Si está vacío, se utilizarán ['/etc/ssh/ssh_host_rsa_key', '/etc/ssh/ssh_host_ecdsa_key', '/etc/ssh/ssh_host_ed25519_key'], siempre que sean compatibles con la versión de sshd instalada.
  • ssh_host_key_algorithms
    • Por defecto: []
    • Descripción: Algoritmos de clave de host que ofrece el servidor. Si está vacío, se usará la lista predeterminada.
  • ssh_client_alive_interval
    • Por defecto: 600
    • Descripción: especifica un intervalo para enviar mensajes de "mantener vivo".
  • ssh_client_alive_count
    • Por defecto: 3
    • Descripción: define cuántas veces se envían mensajes de "mantener vivo".
  • ssh_permit_tunnel
    • Por defecto: false
    • Descripción: verdadero si se requiere el túnel de puertos SSH.
  • ssh_remote_hosts
    • Por defecto: []
    • Descripción: uno o más hosts y sus opciones personalizadas para el cliente SSH. El valor predeterminado es vacío.
  • ssh_permit_root_login
    • Por defecto: no
    • Descripción: Deshabilita el acceso de root. Ajuste a without-password o yes para habilitar el acceso de root.
  • ssh_allow_tcp_forwarding
    • Por defecto: no
    • Descripción: 'no' para deshabilitar el reenvío TCP. Ajustar a 'yes' para permitir el reenvío TCP.
  • ssh_gateway_ports
    • Por defecto: false
    • Descripción: false para deshabilitar la vinculación de puertos reenviados a direcciones que no son de bucle invertido.
  • ssh_allow_agent_forwarding
    • Por defecto: false
    • Descripción: falso para deshabilitar el reenvío de agente. Ajustar a verdadero para permitir el reenvío de agente.
  • ssh_x11_forwarding
    • Por defecto: false
    • Descripción: falso para deshabilitar el reenvío X11. Ajustar a verdadero para permitir el reenvío X11.
  • ssh_pam_support
    • Por defecto: true
    • Descripción: verdadero si SSH tiene soporte PAM.
  • ssh_use_pam
    • Por defecto: true
    • Descripción: falso para deshabilitar la autenticación PAM.
  • ssh_gssapi_support
    • Por defecto: false
    • Descripción: verdadero si SSH tiene soporte GSSAPI.
  • ssh_kerberos_support
    • Por defecto: true
    • Descripción: verdadero si SSH tiene soporte Kerberos.
  • ssh_deny_users
    • Por defecto: ''
    • Descripción: si se especifica, el inicio de sesión está prohibido para los nombres de usuario que coincidan con uno de los patrones.
  • ssh_allow_users
    • Por defecto: ''
    • Descripción: si se especifica, el inicio de sesión está permitido solo para los nombres de usuario que coincidan con uno de los patrones.
  • ssh_deny_groups
    • Por defecto: ''
    • Descripción: si se especifica, el inicio de sesión está prohibido para los usuarios cuyo grupo principal o lista de grupos suplementarios coincida con uno de los patrones.
  • ssh_allow_groups
    • Por defecto: ''
    • Descripción: si se especifica, el inicio de sesión está permitido solo para los usuarios cuyo grupo principal o lista de grupos suplementarios coincida con uno de los patrones.
  • ssh_authorized_keys_file
    • Por defecto: ''
    • Descripción: cambiar el archivo predeterminado que contiene las claves públicas que se pueden usar para la autenticación de usuarios.
  • ssh_trusted_user_ca_keys_file
    • Por defecto: ''
    • Descripción: especifica el archivo que contiene las claves públicas de autoridades certificadoras de confianza utilizadas para firmar certificados de usuario.
  • ssh_trusted_user_ca_keys
    • Por defecto: []
    • Descripción: establecer las claves públicas de autoridades certificadoras de confianza utilizadas para firmar certificados de usuario. Solo se utiliza si se establece ssh_trusted_user_ca_keys_file.
  • ssh_authorized_principals_file
    • Por defecto: ''
    • Descripción: especifica el archivo que contiene los principios que están permitidos. Solo se utiliza si se establece ssh_trusted_user_ca_keys_file.
  • ssh_authorized_principals
    • Por defecto: []
    • Descripción: lista de hashes que contienen rutas de archivos y principios autorizados.
  • ssh_print_motd
    • Por defecto: false
    • Descripción: false para deshabilitar la impresión del mensaje del día (MOTD).
  • ssh_print_pam_motd
    • Por defecto: false
    • Descripción: false para deshabilitar la impresión del MOTD a través de pam (Debian y Ubuntu).
  • ssh_print_last_log
    • Por defecto: false
    • Descripción: false para deshabilitar la muestra de información del último inicio de sesión.
  • sftp_enabled
    • Por defecto: false
    • Descripción: verdadero para habilitar la configuración de sftp.
  • sftp_umask
    • Por defecto: '0027'
    • Descripción: especifica el umask para sftp.
  • sftp_chroot
    • Por defecto: true
    • Descripción: falso para deshabilitar chroot para sftp.
  • sftp_chroot_dir
    • Por defecto: /home/%u
    • Descripción: cambiar la ubicación de chroot predeterminada de sftp.
  • ssh_client_roaming
    • Por defecto: false
    • Descripción: habilitar el roaming experimental del cliente.
  • sshd_moduli_file
    • Por defecto: '/etc/ssh/moduli'
    • Descripción: ruta al archivo de moduli de SSH.
  • sshd_moduli_minimum
    • Por defecto: 2048
    • Descripción: eliminar parámetros Diffie-Hellman más pequeños que el tamaño definido para mitigar el logjam.
  • ssh_challengeresponseauthentication
    • Por defecto: false
    • Descripción: especifica si la autenticación de desafío-respuesta está permitida (por ejemplo, a través de PAM).
  • ssh_client_password_login
    • Por defecto: false
    • Descripción: true para permitir la autenticación basada en contraseña con el cliente SSH.
  • ssh_server_password_login
    • Por defecto: false
    • Descripción: true para permitir la autenticación basada en contraseña con el servidor SSH.
  • ssh_banner
    • Por defecto: false
    • Descripción: true para imprimir un banner al iniciar sesión.
  • ssh_banner_path
    • Por defecto: '/etc/sshd/banner.txt'
    • Descripción: ruta al archivo de banner de SSH.
  • ssh_client_hardening
    • Por defecto: true
    • Descripción: false para dejar de endurecer el cliente.
  • ssh_client_port
    • Por defecto: '22'
    • Descripción: especifica el número de puerto para conectarse al host remoto.
  • ssh_client_compression
    • Por defecto: false
    • Descripción: especifica si el cliente solicita compresión.
  • ssh_compression
    • 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 con éxito.
  • ssh_login_grace_time
    • Por defecto: 30s
    • Descripción: especifica el tiempo permitido para una autenticación exitosa en el servidor SSH.
  • ssh_max_auth_retries
    • Por defecto: 2
    • Descripción: especifica el número máximo de intentos de autenticación permitidos por conexión.
  • ssh_max_sessions
    • Por defecto: 10
    • Descripción: especifica el número máximo de sesiones abiertas permitidas desde una conexión dada.
  • ssh_print_debian_banner
    • Por defecto: false
    • Descripción: true para imprimir un banner específico de Debian.
  • ssh_server_enabled
    • Por defecto: true
    • Descripción: false para deshabilitar el servidor opensshd.
  • ssh_server_hardening
    • Por defecto: true
    • Descripción: false para dejar de endurecer el servidor.
  • ssh_server_match_address
    • Por defecto: ''
    • Descripción: Introduce un bloque condicional. Si se satisfacen todos los criterios en la línea Match, las palabras clave en las líneas siguientes anulan las configuraciones en la sección global del archivo de configuración.
  • ssh_server_match_group
    • Por defecto: ''
    • Descripción: Introduce un bloque condicional similar a ssh_server_match_address.
  • ssh_server_match_user
    • Por defecto: ''
    • Descripción: Introduce un bloque condicional similar a ssh_server_match_address.
  • ssh_server_match_local_port
    • Por defecto: ''
    • Descripción: Introduce un bloque condicional similar a ssh_server_match_address.
  • ssh_server_permit_environment_vars
    • Por defecto: no
    • Descripción: yes para especificar que ~/.ssh/environment y las opciones environment= en ~/.ssh/authorized_keys son procesadas por sshd.
  • ssh_server_accept_env_vars
    • Por defecto: ''
    • Descripción: especifica qué variables de entorno enviadas por el cliente se copiarán al entorno de la sesión.
  • ssh_use_dns
    • Por defecto: false
    • Descripción: especifica si sshd debe buscar el nombre del host remoto y verificar que el nombre del host resuelto para la dirección IP remota mapea de vuelta a la misma dirección IP.
  • ssh_server_revoked_keys
    • Por defecto: []
    • Descripción: una lista de claves públicas revocadas que el servidor SSH siempre rechazará.
  • ssh_max_startups
    • Por defecto: '10:30:100'
    • Descripción: especifica el número máximo de conexiones no autenticadas concurrentes al servicio SSH.
  • ssh_macs
    • Por defecto: []
    • Descripción: Cambiar esta lista para sobrescribir macs.
  • ssh_kex
    • Por defecto: []
    • Descripción: Cambiar esta lista para sobrescribir kexs.
  • ssh_ciphers
    • Por defecto: []
    • Descripción: Cambiar esta lista para sobrescribir cifrados.
  • ssh_custom_options
    • Por defecto: []
    • Descripción: líneas personalizadas para la configuración del cliente SSH.
  • sshd_custom_options
    • Por defecto: []
    • Descripción: líneas personalizadas para la configuración del daemon SSH.
  • sshd_syslog_facility
    • Por defecto: 'AUTH'
    • Descripción: el código de instalación que se utiliza al registrar mensajes desde sshd.
  • sshd_log_level
    • Por defecto: 'VERBOSE'
    • Descripción: el nivel de verbosidad que se utiliza al registrar mensajes desde sshd.
  • sshd_strict_modes
    • Por defecto: true
    • Descripción: verifica los modos de archivo y la propiedad de los archivos y directorios del usuario antes de aceptar el inicio de sesión.
  • sshd_authenticationmethods
    • Por defecto: publickey
    • Descripción: especifica los métodos de autenticación que deben completarse con éxito para que un usuario obtenga acceso.

Configuración de opciones no listadas en las variables del rol

Si desea configurar opciones SSH que no están listadas anteriormente, puede utilizar ssh_custom_options (para /etc/ssh/ssh_config) o sshd_custom_options (para /etc/ssh/sshd_config). Estas opciones se establecerán al principio del archivo, por lo que puede anular opciones más abajo en el archivo.

Ejemplo de playbook:

- hosts: localhost
  roles:
    - dev-sec.ssh-hardening
  vars:
    ssh_custom_options:
      - "Include /etc/ssh/ssh_config.d/*"
    sshd_custom_options:
      - "AcceptEnv LANG"

Cambiando el puerto predeterminado y la idempotencia

Este rol utiliza el puerto predeterminado 22 o el puerto configurado en el inventario para conectarse al servidor. Si el puerto ssh predeterminado se cambia a través de ssh_server_ports, una vez que se reinicie el servidor ssh, aún intentará conectarse usando el puerto anterior. Para volver a ejecutar este rol en el mismo servidor, el inventario deberá actualizarse para usar el nuevo puerto ssh.

Si la idempotencia es importante, considere usar el rol ssh-hardening-fallback, que es un envoltorio alrededor de este rol que retrocede al puerto 22 si el puerto configurado no es alcanzable.

Ejemplo de Playbook

- hosts: localhost
  roles:
    - dev-sec.ssh-hardening

Pruebas Locales

La forma preferida de probar localmente el rol es usar Docker. Tendrá que instalar Docker en su sistema. Consulte Comenzar para un paquete de Docker adecuado para su sistema.

También puede usar vagrant y Virtualbox o VMWare para ejecutar pruebas localmente. Tendrá que instalar Virtualbox y Vagrant en su sistema. Consulte Descargas de Vagrant para un paquete de vagrant adecuado para su sistema. Para todas nuestras pruebas utilizamos test-kitchen. Si no está familiarizado con test-kitchen, consulte su guía.

A continuación, instale test-kitchen:

# Instalar dependencias
gem install bundler
bundle install

Pruebas con Docker

# 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

# 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

Para más información, consulte test-kitchen

Preguntas Frecuentes / Problemas Comunes

No puedo iniciar sesión en mi cuenta. He registrado la clave del cliente, pero aún no me deja.

Si ha agotado todos los problemas típicos (firewall, red, clave faltante, clave incorrecta, cuenta desactivada, etc.), puede ser que su cuenta esté bloqueada. La forma más rápida de averiguarlo es ver el hash de contraseña de su usuario:

sudo grep myuser /etc/shadow

Si el hash incluye un !, su cuenta está bloqueada.

La forma adecuada de resolver esto es desbloquear la cuenta (passwd -u myuser). Si el usuario no tiene una contraseña, puede desbloquearlo a través de:

usermod -p "*" myuser

Alternativamente, si tiene la intención de usar PAM, lo habilitó a través de ssh_use_pam: true. PAM permitirá a los usuarios bloqueados entrar con claves.

¿Por qué mi aplicación ya no se conecta a través de SSH?

Siempre consulte los archivos de registro primero y, si es posible, observe la negociación entre el cliente y el 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 colisiona con este módulo de endurecimiento, que redujo la lista de cifrados, 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, los módulos template/copy/file de Ansible ya no funcionan!

Este rol desactiva SFTP de manera predeterminada. Ansible usa SFTP de forma predeterminada para transferir archivos a los hosts remotos. Debe establecer scp_if_ssh = True en su ansible.cfg. De esta manera, Ansible usa SCP para copiar archivos. Alternativamente, puede habilitar SFTP nuevamente configurando sftp_enabled a true.

No se puede reiniciar el servicio sshd por falta de privilegios

Si recibe el siguiente error al ejecutar el manejador "reiniciar sshd":

Unable to restart service ssh: Failed to restart ssh.service: Access denied

o

failure 1 running systemctl show for 'ssh': Failed to connect to bus: No such file or directory

ejecute el playbook como root (sin become: yes en el nivel del playbook), o agregue become: yes al manejador.

Este es un error con Ansible: consulte aquí y aquí para más información.

Contribuciones

Consulte la guía para colaboradores.

Licencia y Autor

Licensed bajo la Licencia Apache, Versión 2.0 (la "Licencia"); no puede usar este archivo excepto en cumplimiento con la Licencia. Puede obtener una copia de la Licencia en

http://www.apache.org/licenses/LICENSE-2.0

A menos que sea requerido por la ley aplicable o acordado por escrito, el software distribuido bajo la Licencia se distribuye en una base "TAL CUAL", SIN GARANTÍAS O CONDICIONES DE NINGÚN TIPO, ya sea expresas o implícitas. Vea la Licencia para el lenguaje que rige los permisos y limitaciones bajo la Licencia.

Acerca del proyecto

This Ansible role provides numerous security-related ssh configurations, providing all-round base protection.

Instalar
ansible-galaxy install dev-sec.ssh-hardening
Licencia
Unknown
Descargas
3.3M
Propietario
Security + DevOps: Automatic Server Hardening