willshersystems.sshd
Servidor OpenSSH
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. (vermeta/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
- Debian wheezy, jessie, stretch, buster, bullseye, bookworm
- Distribuciones derivadas de EL 6, 7, 8, 9, 10
- Todas las versiones de Fedora
- Última versión de 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.
OpenSSH SSH daemon configuration
ansible-galaxy install willshersystems.sshd