Recherche de site Web

Comment sécuriser votre serveur SSH


SSH, qui signifie Secure Shell, n'est pas très sécurisé par défaut, optant pour une authentification par mot de passe de base sans autres limites. Si vous souhaitez vraiment sécuriser votre serveur, vous devrez faire plus de configurations.

Ne permettez pas les connexions par mot de passe - utilisez des clés SSH

La première chose à faire est d'éliminer complètement l'authentification par mot de passe et de passer à l'utilisation de clés SSH. Les clés SSH sont une forme de cryptographie à clé publique ; vous avez une clé publique qui agit comme votre nom d'utilisateur, et une clé privée qui agit comme votre mot de passe (sauf que ce mot de passe fait 2 048 caractères). Votre clé privée est stockée sur votre disque, mais elle est chiffrée avec une phrase de passe et un agent ssh. Lorsque vous essayez de vous connecter à un serveur via SSH, au lieu de demander votre mot de passe, l'agent ssh se connecte au serveur en utilisant vos clés.

Même si vous utilisez déjà des clés SSH, vous voudrez toujours vous assurer que vos connexions par mot de passe sont désactivées, car les deux ne sont pas mutuellement exclusives.

Générer des clés SSH

Vous pouvez générer une nouvelle clé SSH en utilisant l'outil ssh-keygen, installé par défaut sur la plupart des systèmes Unix.

ssh-keygen

Cela vous demandera une phrase secrète pour chiffrer le fichier de clé local. Elle n'est pas utilisée pour l'authentification avec le serveur, mais doit tout de même rester secrète.

ssh-keygen enregistrera votre clé privée dans ~/.ssh/id_rsa, et enregistrera également votre clé publique dans ~/.ssh/id_rsa.pub. La clé privée reste sur votre disque dur, mais la clé publique doit être téléchargée sur le serveur afin que le serveur puisse vérifier votre identité et confirmer que vous avez l'autorisation d'accéder à ce serveur.

Le serveur garde une liste des utilisateurs autorisés, généralement stockée dans ~/.ssh/authorized_keys. Vous pouvez ajouter manuellement votre fichier de clé à ce fichier, ou vous pouvez utiliser l'utilitaire ssh-copy-id :

ssh-copy-id -i ~/.ssh/id_rsa.pub user@host

Remplacez user@host par votre propre nom d'utilisateur et le nom d'hôte du serveur. Vous serez invité à vous connecter avec votre ancien mot de passe une fois de plus, après quoi vous ne devriez plus être invité à le faire, et vous pouvez désactiver la connexion par mot de passe.

Désactiver la connexion par mot de passe SSH

Maintenant que vous pouvez accéder au serveur avec vos clés, vous pouvez désactiver complètement l'authentification par mot de passe. Assurez-vous que l'authentification par clé fonctionne, sinon vous serez exclu de votre serveur.

Sur le serveur, ouvrez le fichier /etc/ssh/sshd_config dans votre éditeur de texte préféré, et recherchez la ligne qui commence par:

#PasswordAuthentication

Vous voudrez décommenter ceci (enlever le dièse) et changer « oui » en « non » :

PasswordAuthentication no

Ensuite, redémarrez sshd avec :

systemctl restart sshd

Vous devriez être contraint de vous reconnecter, et si votre fichier de clé est incorrect, vous ne serez pas invité à entrer un mot de passe.

Si vous le souhaitez, vous pouvez également forcer l'authentification basée sur une clé publique, ce qui bloquera toutes les autres méthodes d'authentification. Ajoutez les lignes suivantes à /etc/ssh/sshd_config:

AuthenticationMethods publickey

PubkeyAuthentication yes

et redémarrez sshd.

Verrouillez les attaquants avec denyhosts

denyhosts est un utilitaire pour empêcher les tentatives de connexion échouées répétées via SSH, similaire à la façon dont votre téléphone vous verrouille après trop de tentatives. Ce n'est pas installé par défaut, donc vous devrez l'installer à partir du gestionnaire de paquets de votre distribution. Pour les systèmes basés sur Debian comme Ubuntu, cela serait :

sudo apt-get install denyhosts -y

Une fois installé, activez-le avec :

sudo systemctl enable denyhosts

denyhosts devrait maintenant s'exécuter automatiquement, mais vous voudrez ajouter votre adresse IP à la liste blanche au cas où vous seriez verrouillé. Vous pourriez toujours réessayer depuis une autre adresse IP, mais cela vous évitera des tracas.

Ouvrez /etc/hosts.allow, et à la fin du fichier ajoutez :

sshd: your-ip-address

remplacer votre-adresse-ip par votre adresse IP.

Par défaut, denyhosts verrouillera après une tentative échouée pour les utilisateurs root et cinq tentatives échouées pour les autres utilisateurs. Vous pouvez modifier ce comportement en éditant /etc/denyhosts.conf.

Si vous vous êtes accidentellement enfermé dehors, vous devrez arrêter denyhosts et retirer votre adresse IP de quelques endroits :

  • /etc/hosts.deny
  • /var/lib/denyhosts/hosts
  • /var/lib/denyhosts/hosts-restricted
  • /var/lib/denyhosts/hosts-root
  • /var/lib/denyhosts/hosts-valid
  • /var/lib/denyhosts/utilisateurs-hôtes

Redémarrez denyhosts et vous devriez pouvoir vous reconnecter.

Liste blanche d'accès SSH

Bien que forcer des clés SSH avec denyhosts soit probablement suffisant en termes de sécurité, vous pouvez mettre sur liste blanche des adresses IP spécifiques. La plupart des fournisseurs de serveurs proposent des outils pour le faire depuis une interface web. Si cela est possible, vous voudrez mettre des adresses IP sur liste blanche à partir de là plutôt que depuis le serveur SSH, car vous pourrez toujours changer l'adresse IP autorisée en cas de verrouillage.

S'il ne s'agit pas d'une option, vous devrez configurer manuellement /etc/hosts.deny pour bloquer tout le trafic des hôtes non autorisés.

Remarque importante : Si vous mettez votre maison sur liste blanche, il se peut que votre fournisseur d'accès Internet ne vous attribue pas d'adresse IP statique, et votre adresse IP peut changer à tout moment. Vous voudrez vous assurer que cela ne se produira pas avant de mettre sur liste noire toutes les autres adresses IP, ou d'ajouter plusieurs adresses en tant que sauvegarde, ou simplement de sauter cette étape.

Ouvrez /etc/hosts.allow et assurez-vous que votre adresse IP est dans le fichier :

sshd: your-ip-address

Si c'est le cas, vous pouvez procéder et refuser toutes les autres connexions:

echo 'sshd: ALL' >> /etc/hosts.deny

Redémarrez sshd et vous devriez voir vos modifications.

Alternativement, configurez un proxy devant votre serveur SSH.

Si vous ne souhaitez pas exposer votre serveur SSH à Internet mais avez besoin d'y accéder depuis plusieurs adresses IP, vous pouvez mettre en place un proxy devant celui-ci pour gérer la connexion. Cela pourrait être un autre serveur cloud ou même une machine fonctionnant chez vous.

Le serveur SSH doit être configuré pour n'accepter que les connexions provenant du serveur proxy, et le serveur proxy doit accepter des connexions de n'importe où. Vous pouvez configurer le serveur proxy comme bon vous semble, mais même une simple connexion netcat fonctionnera. Gardez à l'esprit que ce serveur proxy sera le seul point d'accès pour votre serveur SSH, donc si le proxy tombe en panne, vous serez bloqué à moins que vous n'ayez une adresse de secours.

Ne pas autoriser la connexion root

Au lieu de cela, créez un nouvel utilisateur et donnez à cet utilisateur des privilèges sudo. Cela revient fondamentalement au même mais présente une différence majeure : les éventuels attaquants devront connaître le nom de votre compte utilisateur pour commencer à attaquer votre serveur, car cela ne sera pas aussi simple que root@votre serveur.

En dehors de la sécurité, il est généralement bon de ne pas être connecté en tant que root tout le temps, car root ne crée pas de journaux et ne demande pas de confirmation lors de l'accès à des ressources protégées.

Créez un nouvel utilisateur sur votre serveur SSH :

adduser myfancyusername

et définissez un mot de passe pour cet utilisateur :

passwd myfancyusername

Vous ne vous connecterez pas avec ce mot de passe car vous utiliserez toujours des clés SSH, mais il est requis. Idéalement, faites en sorte qu'il soit différent de votre mot de passe root.

Ajoutez cet utilisateur à /etc/sudoers pour lui donner des permissions d'administrateur :

echo 'myfancyusername ALL=(ALL) ALL' >> /etc/sudoers

Passez à cet utilisateur avec su myfancyusername, et vérifiez que vous pouvez revenir à l'utilisateur root avec sudo su (ce qui ne nécessite pas le mot de passe de root). Si c'est le cas, vous avez accès à sudo.

Maintenant, vous voudrez bloquer la connexion root. Dans /etc/ssh/sshd_config, vous voudrez changer :

#PermitRootLogin yes

Retirez le hashtag et changez « oui » en « non » :

PermitRootLogin no

Redémarrez sshd et votre serveur devrait bloquer toutes les demandes de connexion en tant que root.

Configurer l'authentification à deux facteurs

C'est certainement excessif, mais si vous êtes paranoïaque à l'idée que quelqu'un puisse voler vos clés SSH privées, vous pouvez configurer votre serveur SSH pour utiliser l'authentification à deux facteurs.

La façon la plus simple de le faire est d'utiliser Google Authenticator avec un appareil Android ou iOS, bien que SSH prenne en charge de nombreuses méthodes de double authentification. Avec Google Authenticator, vous recevrez un code QR que vous pourrez scanner à partir de l'application mobile Google Authenticator pour lier votre téléphone au serveur, et vous recevrez également quelques codes de secours pour récupérer en cas de perte de votre téléphone. Ne conservez pas ces codes sur votre machine principale, sinon ce n'est pas vraiment une double authentification.