dev-sec.ssh-hardening
durcissement-ssh (Rôle Ansible)
Attention : Ce rôle a été déplacé vers notre collection de durcissement :
Veuillez ouvrir tous les problèmes et les demandes de tirage là-bas !
Exigences
- Ansible > 2.5
Variables de Rôle
network_ipv6_enable
- Par défaut : faux
- Description : vrai si IPv6 est nécessaire.
ssh_listen_to
doit également être configuré pour écouter les adresses IPv6 (par exemple[::]
).
ssh_server_ports
- Par défaut : ['22']
- Description : ports sur lesquels le serveur ssh doit écouter
ssh_client_port
- Par défaut : '22'
- Description : port auquel le client ssh doit se connecter
ssh_listen_to
- Par défaut : ['0.0.0.0']
- Description : une ou plusieurs adresses IP auxquelles le serveur ssh doit écouter. Par défaut, c'est toutes les adresses IPv4, mais cela doit être configuré sur des adresses spécifiques pour des raisons de sécurité !
ssh_host_key_files
- Par défaut : []
- Description : Clés d'hôte pour sshd. Si vide, ['/etc/ssh/ssh_host_rsa_key', '/etc/ssh/ssh_host_ecdsa_key', '/etc/ssh/ssh_host_ed25519_key'] seront utilisés, dans la mesure où cela est supporté par la version installée de sshd.
ssh_host_key_algorithms
- Par défaut : []
- Description : Algorithmes de clés d'hôte offerts par le serveur. Si vide, la liste par défaut sera utilisée, sinon cela remplacera le paramètre par la liste spécifiée d'algorithmes.
ssh_client_alive_interval
- Par défaut : 600
- Description : spécifie un intervalle pour l'envoi de messages de maintien de connexion.
ssh_client_alive_count
- Par défaut : 3
- Description : définit à quelle fréquence les messages de maintien de connexion sont envoyés.
ssh_permit_tunnel
- Par défaut : faux
- Description : vrai si le tunneling de port SSH est requis.
ssh_remote_hosts
- Par défaut : []
- Description : un ou plusieurs hôtes et leurs options personnalisées pour le client ssh. Par défaut, c'est vide. Voir des exemples dans
defaults/main.yml
.
ssh_permit_root_login
- Par défaut : non
- Description : Désactive la connexion en tant que root. Réglez sur
without-password
ouyes
pour permettre la connexion en tant que root.
ssh_allow_tcp_forwarding
- Par défaut : non
- Description :
'no'
pour désactiver le transfert TCP. Réglez sur'yes'
pour autoriser le transfert TCP. Si vous utilisez OpenSSH >= 6.2, vous pouvez spécifier'yes'
,'no'
,'all'
ou'local'
.
Remarque : les valeurs passées à cette variable doivent être des chaînes, donc les valeurs'yes'
et'no'
doivent être passées entre guillemets.
ssh_gateway_ports
- Par défaut :
faux
- Description :
faux
pour désactiver la liaison des ports transférés aux adresses non-boucle. Réglez surtrue
pour forcer la liaison sur l'adresse par défaut. Réglez surclientspecified
pour permettre au client de spécifier quelle adresse lier.
- Par défaut :
ssh_allow_agent_forwarding
- Par défaut : faux
- Description : faux pour désactiver le transfert d'agent. Réglez sur vrai pour permettre le transfert d'agent.
ssh_x11_forwarding
- Par défaut : faux
- Description : faux pour désactiver le transfert X11. Réglez sur vrai pour permettre le transfert X11.
ssh_pam_support
- Par défaut : vrai
- Description : vrai si SSH a un support PAM.
ssh_use_pam
- Par défaut : vrai
- Description : faux pour désactiver l'authentification PAM.
ssh_gssapi_support
- Par défaut : faux
- Description : vrai si SSH a un support GSSAPI.
ssh_kerberos_support
- Par défaut : vrai
- Description : vrai si SSH a un support Kerberos.
ssh_deny_users
- Par défaut : ''
- Description : si spécifié, la connexion est interdite pour les noms d'utilisateur correspondant à l'un des motifs.
ssh_allow_users
- Par défaut : ''
- Description : si spécifié, la connexion est autorisée uniquement pour les noms d'utilisateur correspondant à l'un des motifs.
ssh_deny_groups
- Par défaut : ''
- Description : si spécifié, la connexion est interdite pour les utilisateurs dont le groupe principal ou la liste de groupe supplémentaires correspondent à l'un des motifs.
ssh_allow_groups
- Par défaut : ''
- Description : si spécifié, la connexion est autorisée uniquement pour les utilisateurs dont le groupe principal ou la liste de groupe supplémentaires correspondent à l'un des motifs.
ssh_authorized_keys_file
- Par défaut : ''
- Description : changer le fichier par défaut qui contient les clés publiques pouvant être utilisées pour l'authentification des utilisateurs.
ssh_trusted_user_ca_keys_file
- Par défaut : ''
- Description : spécifie le fichier contenant les clés publiques des autorités de certification de confiance utilisées pour signer les certificats utilisateurs.
ssh_trusted_user_ca_keys
- Par défaut : []
- Description : définit les clés publiques des autorités de certification de confiance utilisées pour signer les certificats utilisateurs. Utilisé uniquement si
ssh_trusted_user_ca_keys_file
est défini.
ssh_authorized_principals_file
- Par défaut : ''
- Description : spécifie le fichier contenant les principaux autorisés. Utilisé uniquement si
ssh_trusted_user_ca_keys_file
est défini.
ssh_authorized_principals
- Par défaut : []
- Description : liste des hachages contenant les chemins de fichiers et les principaux autorisés, voir
default_custom.yml
pour toutes les options. Utilisé uniquement sissh_authorized_principals_file
est défini.
ssh_print_motd
- Par défaut : faux
- Description : faux pour désactiver l'impression du MOTD.
ssh_print_pam_motd
- Par défaut : faux
- Description : faux pour désactiver l'impression du MOTD via pam (Debian et Ubuntu).
ssh_print_last_log
- Par défaut : faux
- Description : faux pour désactiver l'affichage des informations de dernière connexion.
sftp_enabled
- Par défaut : faux
- Description : vrai pour activer la configuration sftp.
sftp_umask
- Par défaut : '0027'
- Description : Spécifie l'umask pour sftp.
sftp_chroot
- Par défaut : vrai
- Description : faux pour désactiver le chroot pour sftp.
sftp_chroot_dir
- Par défaut : /home/%u
- Description : changer l'emplacement par défaut du chroot sftp.
ssh_client_roaming
- Par défaut : faux
- Description : activer le roaming client expérimental.
sshd_moduli_file
- Par défaut : '/etc/ssh/moduli'
- Description : chemin vers le fichier moduli SSH.
sshd_moduli_minimum
- Par défaut : 2048
- Description : supprimer les paramètres de Diffie-Hellman plus petits que la taille définie pour atténuer le logjam.
ssh_challengeresponseauthentication
- Par défaut : faux
- Description : Spécifie si l'authentification par réponse à défi est autorisée (par exemple via PAM).
ssh_client_password_login
- Par défaut : faux
- Description :
vrai
pour autoriser l'authentification par mot de passe avec le client ssh.
ssh_server_password_login
- Par défaut : faux
- Description :
vrai
pour autoriser l'authentification par mot de passe avec le serveur ssh.
ssh_banner
- Par défaut :
faux
- Description :
vrai
pour imprimer une bannière à la connexion.
- Par défaut :
ssh_banner_path
- Par défaut : '/etc/sshd/banner.txt'
- Description : chemin vers le fichier de bannière SSH.
ssh_client_hardening
- Par défaut :
vrai
- Description :
faux
pour arrêter le durcissement du client.
- Par défaut :
ssh_client_port
- Par défaut :
'22'
- Description : spécifie le numéro du port sur lequel se connecter à l'hôte distant.
- Par défaut :
ssh_client_compression
- Par défaut :
faux
- Description : spécifie si le client demande la compression.
- Par défaut :
ssh_compression
- Par défaut :
faux
- Description : spécifie si la compression côté serveur est activée après que l'utilisateur s'est authentifié avec succès.
- Par défaut :
ssh_login_grace_time
- Par défaut :
30s
- Description : spécifie le temps autorisé pour une authentification réussie auprès du serveur SSH.
- Par défaut :
ssh_max_auth_retries
- Par défaut :
2
- Description : spécifie le nombre maximum de tentatives d'authentification autorisées par connexion.
- Par défaut :
ssh_max_sessions
- Par défaut :
10
- Description : spécifie le nombre maximum de sessions ouvertes autorisées à partir d'une connexion donnée.
- Par défaut :
ssh_print_debian_banner
- Par défaut :
faux
- Description :
vrai
pour imprimer une bannière spécifique à Debian.
- Par défaut :
ssh_server_enabled
- Par défaut :
vrai
- Description :
faux
pour désactiver le serveur opensshd.
- Par défaut :
ssh_server_hardening
- Par défaut :
vrai
- Description :
faux
pour arrêter le durcissement du serveur.
- Par défaut :
ssh_server_match_address
- Par défaut : ''
- Description : Introduit un bloc conditionnel. Si tous les critères de la ligne Match sont satisfaits, les mots-clés sur les lignes suivantes remplacent ceux définis dans la section globale du fichier de configuration, jusqu'à ce qu'une autre ligne Match ou la fin du fichier soit atteinte.
ssh_server_match_group
- Par défaut : ''
- Description : Introduit un bloc conditionnel. Si tous les critères de la ligne Match sont satisfaits, les mots-clés sur les lignes suivantes remplacent ceux définis dans la section globale du fichier de configuration, jusqu'à ce qu'une autre ligne Match ou la fin du fichier soit atteinte.
ssh_server_match_user
- Par défaut : ''
- Description : Introduit un bloc conditionnel. Si tous les critères de la ligne Match sont satisfaits, les mots-clés sur les lignes suivantes remplacent ceux définis dans la section globale du fichier de configuration, jusqu'à ce qu'une autre ligne Match ou la fin du fichier soit atteinte.
ssh_server_match_local_port
- Par défaut : ''
- Description : Introduit un bloc conditionnel. Si tous les critères de la ligne Match sont satisfaits, les mots-clés sur les lignes suivantes remplacent ceux définis dans la section globale du fichier de configuration, jusqu'à ce qu'une autre ligne Match ou la fin du fichier soit atteinte.
ssh_server_permit_environment_vars
- Par défaut :
non
- Description :
oui
pour spécifier que ~/.ssh/environment et les options environment= dans ~/.ssh/authorized_keys sont traitées par sshd. Avec la version openssh 7.8, il est possible de spécifier une liste blanche de noms de variables d'environnement en plus des réglages globaux "oui" ou "non".
- Par défaut :
ssh_server_accept_env_vars
- Par défaut : ''
- Description : spécifie quelles variables d'environnement envoyées par le client seront copiées dans l'environnement de la session, plusieurs variables d'environnement peuvent être séparées par des espaces.
ssh_use_dns
- Par défaut :
faux
- Description : spécifie si sshd doit rechercher le nom d'hôte distant et vérifier que le nom d'hôte résolu pour l'adresse IP distante correspond à la même adresse IP.
- Par défaut :
ssh_server_revoked_keys
- Par défaut : []
- Description : une liste de clés publiques révoquées que le serveur ssh rejettera toujours, utile pour révoquer les clés connues comme étant faibles ou compromises.
ssh_max_startups
- Par défaut : '10:30:100'
- Description : spécifie le nombre maximum de connexions simultanées non authentifiées au démon SSH.
ssh_macs
- Par défaut : []
- Description : change cette liste pour remplacer les macs. Les valeurs par défaut se trouvent dans
defaults/main.yml
.
ssh_kex
- Par défaut : []
- Description : change cette liste pour remplacer les kexs. Les valeurs par défaut se trouvent dans
defaults/main.yml
.
ssh_ciphers
- Par défaut : []
- Description : change cette liste pour remplacer les chiffres. Les valeurs par défaut se trouvent dans
defaults/main.yml
.
ssh_custom_options
- Par défaut : []
- Description : lignes personnalisées pour la configuration du client SSH.
sshd_custom_options
- Par défaut : []
- Description : lignes personnalisées pour la configuration du démon SSH.
sshd_syslog_facility
- Par défaut : 'AUTH'
- Description : Le code de l'installation utilisé lors de la journalisation des messages provenant de sshd.
sshd_log_level
- Par défaut : 'VERBOSE'
- Description : le niveau de verbosité utilisé lors de la journalisation des messages provenant de sshd.
sshd_strict_modes
- Par défaut : vrai
- Description : Vérifier les modes de fichier et la propriété des fichiers et du répertoire personnel de l'utilisateur avant d'accepter la connexion.
sshd_authenticationmethods
- Par défaut :
publickey
- Description : spécifie les méthodes d'authentification qui doivent être complétées avec succès pour qu'un utilisateur obtienne l'accès. Assurez-vous de définir toutes les variables requises pour la méthode d'authentification sélectionnée. Les valeurs par défaut se trouvent dans
defaults/main.yml
.
- Par défaut :
Configurer des paramètres non listés dans les variables de rôle
Si vous souhaitez configurer des options ssh qui ne sont pas listées ci-dessus, vous pouvez utiliser ssh_custom_options
(pour /etc/ssh/ssh_config
) ou sshd_custom_options
(pour /etc/ssh/sshd_config
) pour les définir. Ces options seront définies au début du fichier afin que vous puissiez remplacer les options plus bas dans le fichier.
Exemple de playbook :
- hosts: localhost
roles:
- dev-sec.ssh-hardening
vars:
ssh_custom_options:
- "Include /etc/ssh/ssh_config.d/*"
sshd_custom_options:
- "AcceptEnv LANG"
Changer le port par défaut et l'idempotence
Ce rôle utilise le port par défaut 22 ou le port configuré dans l'inventaire pour se connecter au serveur. Si le port ssh par défaut est modifié via ssh_server_ports
, une fois le serveur ssh redémarré, il essaiera toujours de se connecter en utilisant le port précédent. Pour exécuter ce rôle à nouveau sur le même serveur, l'inventaire devra être mis à jour pour utiliser le nouveau port ssh.
Si l'idempotence est importante, envisagez d'utiliser le rôle ssh-hardening-fallback
, qui est un wrapper autour de ce rôle qui revient au port 22 si le port configuré n'est pas accessible.
Exemple de Playbook
- hosts: localhost
roles:
- dev-sec.ssh-hardening
Tests Locaux
La meilleure façon de tester localement le rôle est d'utiliser Docker. Vous devrez installer Docker sur votre système. Consultez Démarrer pour un paquet Docker adapté à votre système.
Vous pouvez également utiliser vagrant et Virtualbox ou VMWare pour exécuter des tests localement. Vous devrez installer Virtualbox et Vagrant sur votre système. Consultez Téléchargements Vagrant pour un paquet vagrant adapté à votre système. Pour tous nos tests, nous utilisons test-kitchen
. Si vous n'êtes pas familier avec test-kitchen
, veuillez consulter leur guide.
Ensuite, installez test-kitchen :
# Installer les dépendances
gem install bundler
bundle install
Tester avec Docker
# test rapide sur une machine
bundle exec kitchen test ssh-ubuntu1804-ansible-latest
# tester sur toutes les machines
bundle exec kitchen test
# pour le développement
bundle exec kitchen create ssh-ubuntu1804-ansible-latest
bundle exec kitchen converge ssh-ubuntu1804-ansible-latest
bundle exec kitchen verify ssh-ubuntu1804-ansible-latest
# nettoyage
bundle exec kitchen destroy ssh-ubuntu1804-ansible-latest
Tester avec Virtualbox
# test rapide sur une machine
KITCHEN_YAML=".kitchen.vagrant.yml" bundle exec kitchen test ssh-ubuntu-1804
# tester sur toutes les machines
KITCHEN_YAML=".kitchen.vagrant.yml" bundle exec kitchen test
# pour le développement
KITCHEN_YAML=".kitchen.vagrant.yml" bundle exec kitchen create ssh-ubuntu-1804
KITCHEN_YAML=".kitchen.vagrant.yml" bundle exec kitchen converge ssh-ubuntu-1804
Pour plus d'informations, voir test-kitchen
FAQ / Pièges
Je ne peux pas me connecter à mon compte. J'ai enregistré la clé cliente, mais il ne me laisse toujours pas me connecter.
Si vous avez épuisé tous les problèmes typiques (pare-feu, réseau, clé manquante, clé erronée, compte désactivé, etc.), il se peut que votre compte soit verrouillé. Le moyen le plus rapide de le savoir est de regarder le hachage du mot de passe pour votre utilisateur :
sudo grep myuser /etc/shadow
Si le hachage inclut un !
, votre compte est verrouillé :
myuser:!:16280:7:60:7:::
La bonne façon de résoudre cela est de déverrouiller le compte (passwd -u myuser
). Si l'utilisateur n'a pas de mot de passe, vous pouvez le déverrouiller via :
usermod -p "*" myuser
Alternativement, si vous envisagez d'utiliser PAM, vous l'avez activé via ssh_use_pam: true
. PAM permettra aux utilisateurs verrouillés d'entrer avec des clés.
Pourquoi mon application ne se connecte-t-elle plus via SSH ?
Regardez toujours d'abord les fichiers journaux et, si possible, examinez la négociation entre le client et le serveur qui se termine lors de la connexion.
Nous avons rencontré des problèmes dans des applications (basées sur python et ruby) en raison de leur utilisation d'un ensemble cryptographique obsolète. Cela entre en collision avec ce module de durcissement, qui a réduit la liste des chiffres, des codes d'authentification des messages (MACs) et des algorithmes d'échange de clés (KEX) à une sélection plus sécurisée.
Après avoir utilisé le rôle, le module template/copy/file d'Ansible ne fonctionne plus !
Ce rôle désactive par défaut SFTP. Ansible utilise par défaut SFTP pour transférer des fichiers vers les hôtes distants. Vous devez définir scp_if_ssh = True
dans votre ansible.cfg. De cette manière, Ansible utilise SCP pour copier des fichiers. Alternativement, vous pouvez réactiver SFTP en définissant sftp_enabled
sur true
.
Impossible de redémarrer le service sshd en raison de manque de privilèges
Si vous obtenez l'erreur suivante lors de l'exécution du gestionnaire "redémarrer sshd"
Impossible de redémarrer le service ssh : Échec du redémarrage du ssh.service : Accès refusé
ou
échec 1 lors de l'exécution de systemctl show pour 'ssh' : Échec de la connexion au bus : Aucun fichier ou répertoire de ce type
exécutez le playbook en tant que root
(sans become: yes
au niveau du playbook), ou ajoutez become: yes
au gestionnaire.
Il s'agit d'un bug avec Ansible : voir ici et ici pour plus d'informations.
Contribution
Voir guide du contributeur.
Licence et Auteur
- Auteur : Sebastian Gumprich
- Auteur : Christoph Hartmann chris@lollyrock.com
Sous licence de l'Apache License, Version 2.0 (la "Licence") ; vous ne pouvez pas utiliser ce fichier sauf en conformité avec la Licence. Vous pouvez obtenir une copie de la Licence à
http://www.apache.org/licenses/LICENSE-2.0
Sauf disposition contraire requise par la loi ou convenu par écrit, le logiciel distribué sous la Licence est distribué "TEL QUEL", SANS GARANTIES NI CONDITIONS D'AUCUNE SORTE, explicites ou implicites. Voir la Licence pour les droits spécifiques régissant les permissions et les limitations selon la Licence.
This Ansible role provides numerous security-related ssh configurations, providing all-round base protection.
ansible-galaxy install dev-sec.ssh-hardening