
This chef cookbook fournit des configurations sécurisées pour ssh-client et ssh-server.
Ce cookbook fournit des configurations sécurisées pour ssh-client et ssh-server. Ce cookbook ne fournit pas de fonctionnalités de gestion des utilisateurs et/ou des clés ssh, veuillez utiliser d'autres cookbooks pour cela.
Vous trouverez ci-dessous la documentation des attributs et leurs valeurs par défaut.
Remarque : Certaines valeurs par défaut des attributs de ce cookbook sont définies dans les recettes. Vous devez utiliser un niveau de précédence d'attributs plus élevé pour remplacer ces attributs. Ces attributs sont signalés par #override attribute# dans la liste ci-dessous. Exemple pour remplacer un tel attribut :
override['ssh-hardening']['ssh']['server']['listen_to'] = node['ipaddress']
['ssh-hardening']['network']['ipv6']['enable'] - false. Définir sur true si IPv6 est nécessaire['ssh-hardening']['ssh']['ports'] - 22. Ports sur lesquels ssh-server doit écouter et auxquels ssh-client doit se connecter['ssh-hardening']['ssh'][{'client', 'server'}]['kex'] - nil pour calculer le meilleur échange de clés (KEX) en fonction de la version du serveur, sinon spécifier une chaîne de valeurs Kex['ssh-hardening']['ssh'][{'client', 'server'}]['mac'] - nil pour calculer les meilleurs codes d'authentification de message (MAC) en fonction de la version du serveur, sinon spécifier une chaîne de valeurs Mac['ssh-hardening']['ssh'][{'client', 'server'}]['cipher'] - nil pour calculer les meilleurs chiffrements en fonction de la version du serveur, sinon spécifier une chaîne de valeurs Cipher['ssh-hardening']['ssh'][{'client', 'server'}]['cbc_required'] - false. Définir sur true si CBC est requis pour les chiffrements. Cela n'est généralement nécessaire que si d'anciens mécanismes M2M doivent communiquer avec SSH, qui n'ont aucun des chiffrements sécurisés configurés activés. CBC est une alternative faible. Tout ce qui est plus faible doit être évité et n'est donc pas disponible.['ssh-hardening']['ssh'][{'client', 'server'}]['weak_hmac'] - false. Définir sur true si des mécanismes HMAC plus faibles sont requis. Cela n'est généralement nécessaire que si d'anciens mécanismes M2M doivent communiquer avec SSH, qui n'ont aucun des HMAC sécurisés configurés activés.['ssh-hardening']['ssh'][{'client', 'server'}]['weak_kex'] - false. Définir sur true si des mécanismes d'échange de clés (KEX) plus faibles sont requis. Cela n'est généralement nécessaire que si d'anciens mécanismes M2M doivent communiquer avec SSH, qui n'ont aucun des KEX sécurisés configurés activés.['ssh-hardening']['ssh']['client']['remote_hosts'] - [] - un ou plusieurs hôtes, auxquels ssh-client peut se connecter.['ssh-hardening']['ssh']['client']['password_authentication'] - false. Définir sur true si l'authentification par mot de passe doit être activée.['ssh-hardening']['ssh']['client']['roaming'] - false. Définir sur true si le roaming expérimental du client doit être activé. Il est connu pour causer des problèmes potentiels de divulgation de secrets à des serveurs malveillants et est désactivé par défaut.['ssh-hardening']['ssh']['client']['extras'] - {}. Ajouter des options de configuration supplémentaires, voir ci-dessous pour plus de détails['ssh-hardening']['ssh']['server']['host_key_files'] - nil pour calculer la meilleure configuration de clé d'hôte en fonction de la version du serveur, sinon spécifier un tableau de chemins de fichiers (par exemple /etc/ssh/ssh_host_rsa_key)['ssh-hardening']['ssh']['server']['dh_min_prime_size'] - 2048 - Longueur minimale acceptable du nombre premier en bits dans /etc/ssh/moduli. Les nombres premiers inférieurs à ce nombre seront supprimés. (Voir ceci pour plus d'informations et le contexte)['ssh-hardening']['ssh']['server']['dh_build_primes'] - false - Si vos propres nombres premiers doivent être générés. Cette régénération ne se produit qu'une seule fois et prend beaucoup de temps (~ 1,5 à 2 h sur du matériel moderne pour une longueur de 4096).['ssh-hardening']['ssh']['server']['dh_build_primes_size'] - 4096 - Longueur du nombre premier à générer. Cette option n'est valide que si dh_build_primes est activé.['ssh-hardening']['ssh']['server']['listen_to'] #override attribute# - une ou plusieurs adresses IP, sur lesquelles ssh-server doit écouter. Par défaut, il écoute sur toutes les interfaces. Il doit être configuré pour des raisons de sécurité !['ssh-hardening']['ssh']['server']['allow_root_with_key'] - false pour désactiver complètement la connexion root. Définir sur true pour autoriser root à se connecter via un mécanisme basé sur les clés['ssh-hardening']['ssh']['server']['allow_tcp_forwarding'] - false. Définir sur true pour autoriser le transfert TCP['ssh-hardening']['ssh']['server']['allow_agent_forwarding'] - false. Définir sur true pour autoriser le transfert d'agent['ssh-hardening']['ssh']['server']['allow_x11_forwarding'] - false. Définir sur true pour autoriser le transfert X11['ssh-hardening']['ssh']['server']['permit_tunnel'] - false pour désactiver le transfert de périphérique tun. Définir sur true pour autoriser le transfert de périphérique tun. Autres valeurs acceptées : 'yes', 'no', 'point-to-point', 'ethernet'. Voir man sshd_config pour les comportements exacts. Remarque : vous devrez également activer allow_tcp_forwarding.['ssh-hardening']['ssh']['server']['use_pam'] - true. Définir sur false pour désactiver l'authentification pam de sshd['ssh-hardening']['ssh']['server']['challenge_response_authentication'] - false. Définir sur true pour activer l'authentification par réponse au défi.['ssh-hardening']['ssh']['server']['deny_users'] - [] pour configurer DenyUsers, si spécifié, la connexion est interdite pour les noms d'utilisateur qui correspondent à l'un des modèles.['ssh-hardening']['ssh']['server']['allow_users'] - [] pour configurer AllowUsers, si spécifié, la connexion n'est autorisée que pour les noms d'utilisateur qui correspondent à l'un des modèles.['ssh-hardening']['ssh']['server']['deny_groups'] - [] pour configurer DenyGroups, si spécifié, la connexion est interdite pour les utilisateurs dont le groupe principal ou la liste des groupes supplémentaires correspond à l'un des modèles.['ssh-hardening']['ssh']['server']['allow_groups'] - [] pour configurer AllowGroups, si spécifié, la connexion n'est autorisée que pour les utilisateurs dont le groupe principal ou la liste des groupes supplémentaires correspond à l'un des modèles.['ssh-hardening']['ssh']['server']['print_motd'] - false. Définir sur true pour activer l'affichage du MOTD['ssh-hardening']['ssh']['server']['print_last_log'] - false. Définir sur true pour activer l'affichage des informations de dernière connexion['ssh-hardening']['ssh']['server']['banner'] - nil. Définir un chemin comme '/etc/issue.net' pour activer la bannière['ssh-hardening']['ssh']['server']['os_banner'] - false pour désactiver les informations de version pendant la négociation du protocole (famille debian uniquement). Définir sur true pour l'activer['ssh-hardening']['ssh']['server']['use_dns'] - nil pour utiliser la valeur par défaut d'openssh. Définir sur true ou false pour activer/désactiver la recherche DNS et la vérification de l'hôte distant['ssh-hardening']['ssh']['server']['use_privilege_separation'] - nil pour calculer la meilleure valeur en fonction de la version du serveur, sinon définir sur true ou false['ssh-hardening']['ssh']['server']['login_grace_time'] - 30s. Temps pendant lequel la connexion doit réussir, sinon l'utilisateur est déconnecté.['ssh-hardening']['ssh']['server']['max_auth_tries'] - 2. Le nombre de tentatives d'authentification par connexion['ssh-hardening']['ssh']['server']['max_sessions'] - 10 Le nombre de sessions par connexion['ssh-hardening']['ssh']['server']['password_authentication'] - false. Définir sur true si l'authentification par mot de passe doit être activée['ssh-hardening']['ssh']['server']['log_level'] - verbose. Le niveau de journalisation de sshd. Voir LogLevel dans man 5 sshd_config pour les valeurs possibles.['ssh-hardening']['ssh']['server']['sftp']['enable'] - false. Définir sur true pour activer la fonctionnalité SFTP du démon OpenSSH['ssh-hardening']['ssh']['server']['sftp']['group'] - sftponly. Définit l'option Match Group de SFTP pour autoriser SFTP uniquement pour les utilisateurs dédiés['ssh-hardening']['ssh']['server']['sftp']['chroot'] - /home/%u. Définit le répertoire dans lequel l'utilisateur SFTP doit être placé en chroot['ssh-hardening']['ssh']['server']['sftp']['authorized_keys_path'] - nil. Si non nul, chemin complet vers un ou plusieurs fichiers de clés autorisées séparés par des espaces qui seront définis dans le Match Group pour l'accès SFTP uniquement['ssh-hardening']['ssh']['server']['sftp']['password_authentication'] - false. Définir sur true si l'authentification par mot de passe doit être activée['ssh-hardening']['ssh']['server']['authorized_keys_path'] - nil. Si non nul, le chemin complet vers un ou plusieurs fichiers de clés autorisées séparés par des espaces est attendu.['ssh-hardening']['ssh']['server']['extras'] - {}. Ajouter des options de configuration supplémentaires, voir ci-dessous pour plus de détails['ssh-hardening']['ssh']['server']['match_blocks'] - {}. Bloc de configuration Match, voir ci-dessous pour plus de détailsAjoutez les recettes à la run_list :
"recipe[ssh-hardening]"
Cela installera ssh-server et ssh-client. Vous pouvez également choisir un seul via :
"recipe[ssh-hardening::server]"
"recipe[ssh-hardening::client]"
Configurez les attributs :
"ssh-hardening": {
"ssh" : {
"server" : {
"listen_to" : "10.2.3.4"
}
}
}
La valeur par défaut pour listen_to est 0.0.0.0. Il est fortement recommandé de modifier cette valeur.
Pour activer la configuration SFTP, ajoutez l'une des recettes suivantes à la run_list :
"recipe[ssh-hardening]"
ou
"recipe[ssh-hardening::server]"
Configurez les attributs :
"ssh-hardening": {
"ssh" : {
"server": {
"sftp" : {
"enable" : true,
"chroot" : "/home/sftp/%u",
"group" : "sftusers"
}
}
}
}
Cela activera le serveur SFTP et placera en chroot chaque utilisateur du groupe sftpusers dans le répertoire /home/sftp/%u.
Des options de configuration supplémentaires peuvent être ajoutées aux fichiers de configuration du client ou du serveur. Cela peut être utilisé pour remplacer des valeurs définies statiquement, ou ajouter des options de configuration non disponibles autrement via les attributs.
La syntaxe est la suivante :
# => Configuration supplémentaire du serveur
default['ssh-hardening']['ssh']['server']['extras'].tap do |extra|
extra['#Some Comment'] = 'Heres the Comment'
extra['AuthenticationMethods'] = 'publickey,keyboard-interactive'
end
# => Configuration supplémentaire du client
default['ssh-hardening']['ssh']['client']['extras'].tap do |extra|
extra['PermitLocalCommand'] = 'no'
extra['Tunnel'] = 'no'
end
Les blocs Match doivent être placés à la fin de sshd_config. Cela peut être réalisé en utilisant l'arborescence d'attributs match_blocks :
default['ssh-hardening']['ssh']['server']['match_blocks'].tap do |match|
match['User root'] = <<~ROOT
AuthorizedKeysFile .ssh/authorized_keys
ROOT
match['User git'] = <<~GIT
Banner none
AuthorizedKeysCommand /bin/false
AuthorizedKeysFile .ssh/authorized_keys
GSSAPIAuthentication no
PasswordAuthentication no
GIT
end
Veuillez installer chef-dk, VirtualBox ou VMware Workstation et Vagrant.
Le linting est vérifié avec rubocop et foodcritic :
$ chef exec rake lint
.....
Les tests unitaires/spécifications sont effectués avec chefspec :
$ chef exec rake spec
.....
Les tests d'intégration sont effectués avec test-kitchen et inspec :
$ chef exec rake kitchen
.....
# ou vous pouvez utiliser kitchen directement
$ kitchen test
Je n'arrive pas à me connecter à mon compte. J'ai enregistré la clé du client, mais cela ne me laisse toujours pas entrer.
Si vous avez épuisé tous les problèmes typiques (pare-feu, réseau, clé manquante, mauvaise clé, 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 de votre utilisateur :
sudo grep myuser /etc/shadow
Si le hachage contient un !, votre compte est verrouillé :
myuser:!:16280:7:60:7:::
La bonne façon de résoudre ce problème 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 avez l'intention d'utiliser PAM, vous l'avez activé via ['ssh-hardening']['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 ?
Consultez toujours d'abord les fichiers journaux et, si possible, examinez la négociation entre le client et le serveur qui est effectuée lors de la connexion.
Nous avons constaté certains problèmes dans des applications (basées sur python et ruby) dus à leur utilisation d'un ensemble cryptographique obsolète. Cela entre en collision avec ce module de durcissement, qui a réduit la liste des chiffrements, des codes d'authentification de message (MAC) et des algorithmes d'échange de clés (KEX) à une sélection plus sécurisée.
Si vous constatez que cela ne suffit pas, n'hésitez pas à activer les attributs cbc_requires pour les chiffrements, weak_hmac pour les MAC et weak_kex pour les KEX dans les espaces de noms ['ssh-hardening']['ssh']['client'] ou ['ssh-hardening']['ssh']['server'] selon l'endroit où vous souhaitez les prendre en charge.
Pourquoi ne puis-je pas me connecter au serveur SFTP après avoir ajouté un utilisateur à mon groupe SFTP ?
C'est un problème de propriété de ChrootDirectory. sshd rejettera les connexions SFTP vers les comptes qui sont configurés pour être placés en chroot dans un répertoire dont la propriété/les permissions sont considérées comme non sécurisées par sshd. Les exigences strictes de propriété/permissions de sshd stipulent que chaque répertoire du chemin de chroot doit appartenir à root et être accessible en écriture uniquement par le propriétaire. Ainsi, par exemple, si l'environnement de chroot est /home, il doit appartenir à root.
Ce cookbook est principalement basé sur les guides de :
Merci à vous tous !!
Sous licence 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 à l'adresse
http://www.apache.org/licenses/LICENSE-2.0
Sauf si requis par la loi applicable ou convenu par écrit, le logiciel distribué sous la Licence est distribué « EN L'ÉTAT », SANS GARANTIES NI CONDITIONS D'AUCUNE SORTE, expresses ou implicites. Voir la Licence pour le langage spécifique régissant les permissions et les limitations de la Licence.