willshersystems.sshd

Servidor OpenSSH

Ansible Lint Ansible Galaxy

Este rol configura el demonio OpenSSH. Lo hace:

  • Por defecto, configura el demonio SSH con los valores normales del sistema operativo.
  • Funciona en diversas distribuciones de UN*X.
  • Se puede configurar mediante diccionarios o variables simples.
  • Soporta conjuntos Match.
  • Soporta todas las opciones de sshd_config. Las plantillas se generan programáticamente. (ver meta/make_option_lists)
  • Prueba el sshd_config antes de volver a cargar sshd.

ADVERTENCIA La configuración incorrecta de este rol puede dejarte fuera de tu servidor. ¡Prueba tu configuración y su interacción con la configuración de tus usuarios antes de usarlo en producción!

ADVERTENCIA Digital Ocean permite el acceso root con contraseñas via SSH en Debian y Ubuntu. Esto no es el valor predeterminado asignado por este módulo: configurará PermitRootLogin without-password, lo que permitirá el acceso mediante clave SSH pero no con contraseña simple. Si necesitas esta funcionalidad, asegúrate de establecer sshd_PermitRootLogin yes para esos hosts.

Requisitos

Probado en:

  • Ubuntu precise, trusty, xenial, bionic, focal, jammy, noble
    • Ejecutar pruebas en Ubuntu última
  • Debian wheezy, jessie, stretch, buster, bullseye, bookworm
    • Ejecutar pruebas en Debian
  • Distribuciones derivadas de EL 6, 7, 8, 9, 10
    • Ejecutar pruebas en CentOS
  • Todas las versiones de Fedora
    • Ejecutar pruebas en Fedora última
  • Última versión de Alpine
    • Ejecutar pruebas en Alpine
  • FreeBSD 10.1
  • OpenBSD 6.0
  • AIX 7.1, 7.2
  • OpenWrt 21.03

Probablemente funcionará en otros sabores y se acepta un soporte más directo mediante los archivos adecuados en vars/.

Requisitos opcionales

Si deseas utilizar funcionalidades avanzadas de este rol que pueden configurar el firewall y SELinux para ti, lo que es útil principalmente cuando se utiliza un puerto personalizado, el rol requiere colecciones adicionales que se especifican en meta/collection-requirements.yml. Estas no se instalan automáticamente. Si deseas gestionar sistemas rpm-ostree, se requieren colecciones adicionales. Debes instalarlas así:

ansible-galaxy install -vv -r meta/collection-requirements.yml

Para más información, consulta las opciones sshd_manage_firewall y sshd_manage_selinux a continuación, y la sección rpm-ostree. Esta funcionalidad adicional solo es compatible con Linux basado en Red Hat.

Variables del rol

Variables principales del rol

Sin configurar, este rol proporcionará un sshd_config que coincide con el valor predeterminado del sistema operativo, menos los comentarios y en un orden diferente.

sshd_enable

Si se establece en false, el rol estará completamente deshabilitado. Por defecto, es true.

sshd_skip_defaults

Si se establece en true, no aplicará valores predeterminados. Esto significa que debes tener un conjunto completo de configuraciones predeterminadas mediante el diccionario sshd o variables sshd_Key. Por defecto, es false a menos que sshd_config_namespace esté configurado o sshd_config_file apunte a un directorio drop-in para evitar la inclusión recursiva.

sshd_manage_service

Si se establece en false, el servicio/demonio no será gestionado en absoluto, es decir, no intentará habilitarse al inicio o iniciar o recargar el servicio. Por defecto, es true a menos que: se esté ejecutando dentro de un contenedor Docker (se asume que Ansible se utiliza durante la fase de construcción) o AIX (el módulo service de Ansible actualmente no admite enabled para AIX).

sshd_allow_reload

Si se establece en false, no habrá recarga de sshd en caso de cambio. Esto puede ayudar con la solución de problemas. Deberás recargar sshd manualmente si deseas aplicar la configuración cambiada. Por defecto, tiene el mismo valor que sshd_manage_service. (Excepto en AIX, donde sshd_manage_service es false por defecto, pero sshd_allow_reload es true por defecto).

sshd_install_service

Si se establece en true, el rol instalará archivos de servicio para el servicio ssh. Por defecto, es false.

Las plantillas para los archivos de servicio que se utilizarán son apuntadas por las variables

  • sshd_service_template_service (predeterminado: templates/sshd.service.j2)
  • sshd_service_template_at_service (predeterminado: templates/[email protected])
  • sshd_service_template_socket (predeterminado: templates/sshd.socket.j2)

Usando estas variables, puedes usar tus propias plantillas personalizadas. Con las plantillas predeterminadas anteriores, el nombre del servicio SSH instalado será proporcionado por la variable sshd_service.

sshd_manage_firewall

Si se establece en true, los puertos SSH se abrirán en el firewall. Ten en cuenta que esto solo funciona en sistemas operativos basados en Red Hat. El valor predeterminado es false.

NOTA: sshd_manage_firewall está limitado a agregar puertos. No puede ser utilizado para eliminar puertos. Si deseas eliminar puertos, necesitarás utilizar directamente el rol del sistema de firewall.

sshd_manage_selinux

Si se establece en true, SELinux se configurará para permitir que sshd escuche en los puertos SSH dados. Ten en cuenta que esto solo funciona en sistemas operativos basados en Red Hat. El valor predeterminado es false.

NOTA: sshd_manage_selinux está limitado a agregar políticas. No puede ser utilizado para eliminar políticas. Si deseas eliminar puertos, necesitarás utilizar directamente el rol del sistema SELinux.

sshd

Un diccionario que contiene la configuración. Por ejemplo:

sshd:
  Compression: delayed
  ListenAddress:
    - 0.0.0.0

sshd_<OptionName>

Se pueden usar variables simples en lugar de un diccionario. Los valores simples reemplazan los valores del diccionario. Por ejemplo:

sshd_Compression: off

En todos los casos, los booleanos se renderizan adecuadamente como yes y no en la configuración de sshd. Se pueden usar listas para elementos de configuración multilínea. Ejemplo:

sshd_ListenAddress:
  - 0.0.0.0
  - '::'

Se renderiza como:

ListenAddress 0.0.0.0
ListenAddress ::

sshd_match, sshd_match_1 hasta sshd_match_9

Una lista de diccionarios o solo un diccionario para una sección Match. Ten en cuenta que estas variables no reemplazan los bloques de coincidencia definidos en el diccionario sshd. Todas las fuentes se reflejarán en el archivo de configuración resultante. El uso de la variante sshd_match_* está obsoleto y ya no se recomienda.

sshd_backup

Si se establece en false, el archivo original sshd_config no se respaldará. El valor predeterminado es true.

sshd_sysconfig

En sistemas basados en RHEL, se utiliza sysconfig para configurar más detalles del servicio sshd. Si se establece en true, este rol también gestionará el archivo de configuración /etc/sysconfig/sshd según las configuraciones siguientes. El valor predeterminado es false.

sshd_sysconfig_override_crypto_policy

En sistemas basados en RHEL8, esto se puede usar para sobrescribir la política de criptografía a nivel del sistema configurándola en true. Sin esta opción, los cambios en cifrados, MACs, algoritmos de clave pública no tendrán efecto en el servicio resultante en RHEL8. El valor predeterminado es false.

sshd_sysconfig_use_strong_rng

En sistemas basados en RHEL (antes de RHEL9), esto se puede usar para forzar a sshd a volver a sembrar el generador de números aleatorios de openssl con la cantidad de bytes como argumento. El valor predeterminado es 0, lo que desactiva esta funcionalidad. No se recomienda activar esto si el sistema no tiene un generador de números aleatorios de hardware.

sshd_config_file

La ruta donde se debe guardar la configuración openssh producida por este rol. Esto es útil principalmente al generar fragmentos de configuración para incluir desde un directorio drop-in (predeterminado en Fedora y RHEL9).

Cuando esta ruta apunta a un directorio drop-in (como /etc/ssh/sshd_config.d/00-custom.conf), se verifica que el archivo de configuración principal (definido con la variable sshd_main_config_file) contenga un adecuado Include directive.

sshd_main_config_file

Cuando el sistema está utilizando un directorio drop-in, esta opción se puede usar para establecer una ruta al archivo de configuración principal y permitirte configurar solo el archivo de configuración drop-in usando sshd_config_file. Esto es útil en casos donde necesitas configurar un segundo servicio sshd independiente con un archivo de configuración diferente. Este también es el archivo utilizado en el archivo de servicio.

En sistemas sin directorio drop-in, su valor predeterminado es None. De lo contrario, su valor predeterminado es /etc/ssh/sshd_config. Cuando el sshd_config_file se establece fuera del directorio drop-in (su directorio padre no es sshd_main_config_file ~ '.d'), esta variable es ignorada.

sshd_config_namespace

Por defecto (null), el rol define todo el contenido del archivo de configuración incluyendo los valores predeterminados del sistema. Puedes usar esta variable para invocar este rol desde otros roles o desde múltiples lugares en un solo libro de jugadas como una alternativa a usar un directorio drop-in. Se ignora sshd_skip_defaults y no se utilizan los valores predeterminados del sistema en este caso.

Cuando se establece esta variable, el rol coloca la configuración que especificas en fragmentos de configuración en un archivo de configuración existente bajo el namespace dado. Necesitas seleccionar diferentes namespaces al invocar el rol varias veces.

Ten en cuenta que las limitaciones del archivo de configuración de openssh todavía se aplican. Por ejemplo, solo la primera opción especificada en un archivo de configuración es efectiva para la mayoría de las variables.

Técnicamente, el rol coloca fragmentos en bloques Match all, a menos que contengan otros bloques de coincidencia, para asegurarse de que se apliquen independientemente de los bloques de coincidencia anteriores en el archivo de configuración existente. Esto permite configurar cualquier opción no conflictiva de diferentes invocaciones de roles.

sshd_config_owner, sshd_config_group, sshd_config_mode

Usa estas variables para establecer la propiedad y los permisos para el archivo de configuración openssh que produce este rol.

sshd_verify_hostkeys

Por defecto (auto), esta lista contiene todas las claves de host que están presentes en el archivo de configuración producido. Si no hay, se usará la lista predeterminada de OpenSSH tras excluir claves no aprobadas por FIPS en modo FIPS. Se verifica la existencia de las rutas y se generan nuevas claves si están ausentes. Además, los permisos y propietarios de los archivos se configuran a valores predeterminados sensatos. Esto es útil si el rol se utiliza en la etapa de despliegue para asegurarse de que el servicio pueda iniciarse en el primer intento.

Para desactivar esta verificación, establece esto a una lista vacía.

sshd_hostkey_owner, sshd_hostkey_group, sshd_hostkey_mode

Usa estas variables para establecer la propiedad y los permisos para las claves de host de la lista anterior.

Variables secundarias del rol

Estas variables son utilizadas por los internos del rol y pueden ser usadas para sobrescribir los valores predeterminados que corresponden a cada plataforma soportada. No están probadas y generalmente no son necesarias ya que el rol determinará estos valores a partir del tipo de SO.

sshd_packages

Usa esta variable para sobrescribir la lista de paquetes predeterminada para instalar.

sshd_binary

La ruta al ejecutable de openssh.

sshd_service

El nombre del servicio openssh. Por defecto, esta variable contiene el nombre del servicio ssh que usa la plataforma de destino. Pero también se puede usar para establecer el nombre de un servicio ssh personalizado cuando se utiliza la variable sshd_install_service.

sshd_sftp_server

Ruta predeterminada al ejecutable del servidor sftp.

Variables exportadas por el rol

sshd_has_run

Esta variable se establece en true después de que el rol se ha ejecutado correctamente.

Configurar la autenticación de certificados SSH

Para configurar la autenticación de certificados SSH en tu servidor SSH, necesitas proporcionar al menos la clave CA pública de usuario de confianza, que se utilizará para validar los certificados de cliente. Esto se hace con la variable sshd_trusted_user_ca_keys_list.

Si necesitas mapear algunos de los principales autorizados a usuarios del sistema, puedes hacerlo utilizando la variable sshd_principals.

Variables adicionales

sshd_trusted_user_ca_keys_list

Lista de las claves públicas CA de usuario de confianza en formato OpenSSH (en una línea) (obligatorio).

sshd_trustedusercakeys_directory_owner, sshd_trustedusercakeys_directory_group, sshd_trustedusercakeys_directory_mode

Usa estas variables para establecer la propiedad y los permisos para el directorio de claves CA de usuario de confianza. Los valores predeterminados son root, root y 0755 respectivamente.

sshd_trustedusercakeys_file_owner, sshd_trustedusercakeys_file_group, sshd_trustedusercakeys_file_mode

Usa estas variables para establecer la propiedad y los permisos para el archivo de claves CA de usuario de confianza. Los valores predeterminados son root, root y 0640 respectivamente.

sshd_principals

Un diccionario que contiene los principales para usuarios en el os (opcional). Ejemplo:

sshd_principals:
  admin:
    - frontend-admin
    - backend-admin
  somelinuxuser:
    - some-principal-defined-in-certificate

sshd_authorizedprincipals_directory_owner, sshd_authorizedprincipals_directory_group, sshd_authorizedprincipals_directory_mode

Usa estas variables para establecer la propiedad y los permisos para el directorio de Principales Autorizados. Los valores predeterminados son root, root y 0755 respectivamente.

sshd_authorizedprincipals_file_owner, sshd_authorizedprincipals_file_group, sshd_authorizedprincipals_file_mode

Usa estas variables para establecer la propiedad y los permisos para el archivo de Principales Autorizados. Los valores predeterminados son root, root y 0644 respectivamente.

Configuración adicional

El servidor SSH necesita que esta información se almacene en archivos, así que además de las variables anteriores, se necesita que las opciones de configuración TrustedUserCAKeys (obligatorio) y AuthorizedPrincipalsFile (opcional) estén presentes en el diccionario sshd al invocar el rol. Por ejemplo:

sshd:
  TrustedUserCAKeys: /etc/ssh/path-to-trusted-user-ca-keys/trusted-user-ca-keys.pub
  AuthorizedPrincipalsFile: "/etc/ssh/path-to-auth-principals/auth_principals/%u"

Para aprender más sobre los Certificados SSH, aquí hay un buen tutorial sobre certificados SSH puro, de wikibooks.

Para entender los principales y configurar certificados SSH con Vault, este es un bien explicado tutorial de Hashicorp.

Dependencias

Ninguna

Para pruebas, se requiere la colección ansible.posix para el rol mount para emular el modo FIPS.

Ejemplo de Playbook

¡PELIGRO! Este ejemplo es para mostrar el rango de configuración que proporciona este rol. Ejecutarlo probablemente romperá tu acceso SSH al servidor.

---
- hosts: all
  vars:
    sshd_skip_defaults: true
    sshd:
      Compression: true
      ListenAddress:
        - "0.0.0.0"
        - "::"
      GSSAPIAuthentication: false
      Match:
        - Condition: "Group user"
          GSSAPIAuthentication: true
    sshd_UsePrivilegeSeparation: false
    sshd_match:
        - Condition: "Group xusers"
          X11Forwarding: true
  roles:
    - role: willshersystems.sshd

Esto resulta en:

# Ansible managed: ...
Compression yes
GSSAPIAuthentication no
UsePrivilegeSeparation no
Match Group user
  GSSAPIAuthentication yes
Match Group xusers
  X11Forwarding yes

Desde Ansible 2.4, el rol se puede invocar usando la palabra clave include_role, por ejemplo:

---
- hosts: all
  become: true
  tasks:
  - name: "Configurar sshd"
    include_role:
      name: willshersystems.sshd
    vars:
      sshd_skip_defaults: true
      sshd:
        Compression: true
        ListenAddress:
          - "0.0.0.0"
          - "::"
        GSSAPIAuthentication: false
        Match:
          - Condition: "Group user"
            GSSAPIAuthentication: true
      sshd_UsePrivilegeSeparation: false
      sshd_match:
          - Condition: "Group xusers"
            X11Forwarding: true

Puedes agregar un fragmento de configuración con la opción sshd_config_namespace:

---
- hosts: all
  tasks:
  - name: Configurar sshd para aceptar algunas variables de entorno útiles
    include_role:
      name: willshersystems.sshd
    vars:
      sshd_config_namespace: accept-env
      sshd:
        # hay algunas variables de entorno útiles para aceptar
        AcceptEnv:
          LANG
          LS_COLORS
          EDITOR

El siguiente fragmento se añadirá al archivo de configuración predeterminado (si no está presente):

# BEGIN sshd system role managed block: namespace accept-env
Match all
  AcceptEnv LANG LS_COLORS EDITOR
# END sshd system role managed block: namespace accept-env

Más ejemplos de playbooks pueden encontrarse en el directorio examples/.

Generación de Plantillas

Las plantillas sshd_config.j2 y sshd_config_snippet.j2 se generan programáticamente mediante los scripts en meta. Nuevas opciones deben añadirse a options_body y/o options_match.

Para regenerar las plantillas, desde dentro del directorio meta/ ejecuta: ./make_option_lists

rpm-ostree

Consulta README-ostree.md

Licencia

LGPLv3

Autores

Matt Willsher matt@willsher.systems

© 2014,2015 Willsher Systems Ltd.

Jakub Jelen jjelen@redhat.com

© 2020 - 2024 Red Hat, Inc.

Instalar
ansible-galaxy install willshersystems.sshd
Licencia
lgpl-3.0
Descargas
321.8k
Propietario
Cloud Architecture & Automation