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 ou yes 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 sur true pour forcer la liaison sur l'adresse par défaut. Réglez sur clientspecified pour permettre au client de spécifier quelle adresse lier.
  • 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 si ssh_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.
  • 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.
  • ssh_client_port
    • Par défaut : '22'
    • Description : spécifie le numéro du port sur lequel se connecter à l'hôte distant.
  • ssh_client_compression
    • Par défaut : faux
    • Description : spécifie si le client demande la compression.
  • 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.
  • ssh_login_grace_time
    • Par défaut : 30s
    • Description : spécifie le temps autorisé pour une authentification réussie auprès du serveur SSH.
  • ssh_max_auth_retries
    • Par défaut : 2
    • Description : spécifie le nombre maximum de tentatives d'authentification autorisées par connexion.
  • ssh_max_sessions
    • Par défaut : 10
    • Description : spécifie le nombre maximum de sessions ouvertes autorisées à partir d'une connexion donnée.
  • ssh_print_debian_banner
    • Par défaut : faux
    • Description : vrai pour imprimer une bannière spécifique à Debian.
  • ssh_server_enabled
    • Par défaut : vrai
    • Description : faux pour désactiver le serveur opensshd.
  • ssh_server_hardening
    • Par défaut : vrai
    • Description : faux pour arrêter le durcissement du serveur.
  • 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".
  • 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.
  • 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.

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

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.

À propos du projet

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

Installer
ansible-galaxy install dev-sec.ssh-hardening
Licence
Unknown
Téléchargements
3.3M
Propriétaire
Security + DevOps: Automatic Server Hardening