[size=150]Principes de base de sécurisation SSH[/size]
Ceci n’est pas un tuto pour apprendre à sécuriser son serveur SSH, il y en a suffisamment sur Internet. Mais une rapide piqûre de rappel ne fait jamais de mal, et ça aide à comprendre la raison de ce tuto.
Comme tout le monde sait (ou devrait savoir) les premières choses à faire pour bien sécuriser un serveur SSH sont :
[ul][li] désactiver le login root[/li]
[li] changer de port[/li]
[li] n’autoriser que la deuxième version du protocole[/li]
[li] désactiver l’authentification par mot de passe au profit de l’authentification par clé publique (de préférence de grande taille la clé, 4096 bits est un strict minimum, 8192 bits est bien, 16384 bits pour les paranoïaques comme moi)[/li]
[li] restreindre qui peut se connecter[/li][/ul]
Pour se connecter en root on doit donc passer par un des utilisateurs autorisés à se connecter, puis su / taper le mot de passe. C’est sécurisé, c’est bien.
[size=150]Oui mais ![/size]
Il est tout de même parfois utile de pouvoir se connecter en root, par exemple si on veut faire un montage SSHFS pour pouvoir accéder un peu plus facilement à de nombreux fichiers système (genre pendant la phase de configuration d’un serveur).
Problème : si on autorise root à se connecter directement, c’est un bout de sécurité qui s’en va (oui, même si une clé publique 16384 bits est le seul moyen d’y accéder, ça fait toujours un mot de passe en moins en travers du chemin d’un attaquant). On est foutus ? Non…
[size=150]Automatiser la gestion d’un deuxième serveur SSH, restreint à votre IP[/size]
Le principe c’est de lancer (à la demande) un deuxième serveur SSH sur un autre port, avec une autre configuration qui autorise les connexions root, et de paramétrer iptables pour ne laisser passer que les connexions provenant de votre propre IP. Le tout de manière simple et adaptée aux IPs dynamiques (en IP fixe c’est facile, y’a pas besoin de s’emmerder comme ça).
[ul][li] connexion classique sécurisée (utilisateur => su)[/li]
[li] ssh-unrestricted start qui va détecter automatiquement votre IP actuelle[/li]
[li] on peut maintenant se connecter directement en root sur un port différent[/li]
[li] ssh-unrestricted stop quand c’est fini[/li][/ul]
[size=125]1) Dupliquer et adapter votre fichier de configuration[/size]
# cp /etc/ssh/sshd_config /etc/ssh/sshd_config-unrestricted
[ul][li] modifier /etc/ssh/sshd_config-unrestricted de telle sorte que root puisse se connecter*. Les options importantes à prendre en compte sont Port 1234 ; PermitRootLogin yes ; et éventuellement inclure root dans AllowUsers si vous utilisez cette option.[/li]
[li] IMPORTANT : changer le port d’écoute (dans ce tuto on utilisera le port 1234, le serveur SSH actuel écoutant sur le port 1222)[/li]
[li] IMPORTANT : changer le le fichier de PID, sinon il va y avoir confusion avec le serveur d’origine (lors d’un service ssh restart par exemple). Directive PidFile.[/li][/ul]
b Note :[/b] la technique que je propose ici n’est pas limitée à autoriser les connexions root. Vu qu’il s’agit de lancer un deuxième serveur SSH avec une configuration différente (qu’on suppose moins sécurisée, d’où la restriction par IP) vous pouvez très bien modifier le nouveau fichier de configuration d’une autre manière.
[size=125]2) Adapter votre firewall[/size]
Typiquement, pour autoriser les connexions SSH votre firewall doit déjà contenir une règle ressemblant à ça (1222 étant le port du serveur SSH actuel) :
-A INPUT -p tcp --dport 1222 -j ACCEPT
Immédiatement à la suite, rajoutez les deux règles suivantes (pensez à changer le port) :
-N SSH_UNRESTRICTED
-A INPUT -p tcp --dport 1234 -j SSH_UNRESTRICTED
[size=125]3) Installer le script[/size]
Copier/coller le code suivant dans un nouveau fichier /usr/local/sbin/ssh-unrestricted :
[code]#!/bin/sh
set -e
COLOR_ERROR="\033[01;31m"
COLOR_SAFE="\033[01;32m"
COLOR_WARN="\033[01;33m"
COLOR_NONE="\033[00m"
SSH_PID="$(ps x -U root -o pid,args | grep -E ’ /usr/sbin/sshd -f /etc/ssh/sshd_config-unrestricted$’ | sed ‘s@^ *([0-9]+) /usr/sbin/sshd -f /etc/ssh/sshd_config-unrestricted$@\1@g’)"
case “$1” in
start)
SSH_IP="$(echo -n “~${SSH_CONNECTION}~” | sed ‘s@^~([0-9.]+) .* [0-9]+~$@\1@g;s@^~.*~$@~@g;s@^$@~@g’)"
if [ “$SSH_IP” = “~” ]; then
echo “${COLOR_ERROR}Impossible de déterminer votre adresse IP (êtes-vous déjà connecté via SSH ?). Arrêt.${COLOR_NONE}”
exit 1
fi
if [ “$SSH_PID” = “” ]; then
/usr/sbin/sshd -f /etc/ssh/sshd_config-unrestricted
iptables -A SSH_UNRESTRICTED -s “$SSH_IP” -j ACCEPT
echo “${COLOR_WARN}Le serveur SSH secondaire est maintenant démarré (accès uniquement à partir de ${SSH_IP}).${COLOR_NONE}”
else
echo “${COLOR_WARN}Le serveur SSH secondaire était déjà démarré.${COLOR_NONE}”
fi
;;
stop)
if [ “$SSH_PID” != “” ]; then
kill “$SSH_PID”
echo “${COLOR_SAFE}Le serveur SSH secondaire est maintenant arrêté.${COLOR_NONE}”
else
echo “${COLOR_SAFE}Le serveur SSH secondaire était déjà arrêté.${COLOR_NONE}”
fi
iptables -F SSH_UNRESTRICTED
;;
restart)
SCRIPT_NAME="$(readlink -f “$0”)"
“$SCRIPT_NAME” stop
“$SCRIPT_NAME” start
;;
*)
if [ “$SSH_PID” != “” ]; then
echo “${COLOR_WARN}Le serveur SSH secondaire est actuellement démarré.${COLOR_NONE}”
else
echo “${COLOR_SAFE}Le serveur SSH secondaire est actuellement arrêté.${COLOR_NONE}”
fi
echo “Adresses IP autorisées :”
ADDRESSES="$(iptables -S SSH_UNRESTRICTED | grep -vxE ‘^-N SSH_UNRESTRICTED$’ | sed ‘s@^-A SSH_UNRESTRICTED -s ([^ /]+)/32 -j ACCEPT *$@ \1@g’)"
if [ “$ADDRESSES” = “” ]; then
echo " (aucune)"
else
echo “$ADDRESSES”
fi
;;
esac[/code]
Lui donner les bons droits :
[code]# chown root:root /usr/local/sbin/ssh-unrestricted
chmod a-rwx,u+rx /usr/local/sbin/ssh-unrestricted[/code]
[size=125]4) Se connecter directement en root sans risque supplémentaire de sécurité[/size]
Démarrer le nouveau serveur : (uniquement à partir d’une connexion SSH existante, ça ne marchera pas en terminal/tty local)
[code]$ ssh -p 1222 utilisateur@serveur
(authentification)
$ su
Mot de passe :
ssh-unrestricted start
Le serveur SSH secondaire est maintenant démarré (accès uniquement à partir de 1.2.3.4).[/code]
Vérifier l’état :
# ssh-unrestricted
Le serveur SSH secondaire est actuellement démarré.
Adresses IP autorisées :
1.2.3.4
Arrêter le nouveau serveur : (à partir de n’importe où même un terminal/tty local)
# ssh-unrestricted stop
Enjoy.
TODO : pouvoir ajouter plusieurs IP différentes dans le firewall. J’ai la flemme, si quelqu’un se sent de modifier le script il est le bienvenu et je le mettrai à jour (c’est pour ça que j’ai utilisé une chaîne iptables au départ, mais je suis jamais allé aussi loin).