Cet article vous permettra de protéger et de dissimuler vos accès SSH contre les scanners à l’aide de HAProxy®.
Préambule
HAProxy® est un répartiteur de charge et un proxy open source pour les applications TCP et HTTP. HAProxy® est disponible gratuitement dans sa version communautaire, ou également de manière commerciale sous le nom de Hapee (version packagée) et Aloha (version appliance).
SSH est un protocole généralement utilisé pour l’administration de serveurs et d’appliances.
Cet article explique comment sécuriser et masquer votre connexion SSH à l’aide de HAProxy.
HAProxy
Dans cet article nous allons traiter la configuration suivante :
- Utiliser le port 443 pour masquer les connexions SSH
- Identifier une connexion SSH
- Frapper avant d’entrer
- Bannir les clients réalisant trop de requêtes
Utiliser le port 443 pour masquer les connexions SSH
Utiliser le port 443 a plusieurs avantages. La premier est de réduire le nombre de scanner SSH qui testerait seulement le port standard (port 22). Le second est que le port 443 est souvent ouvert au niveau des firewalls car celui-ci est le port standard du HTTPS.
Pour réaliser cela nous allons faire écouter HAProxy sur le port 443 (bind 0.0.0.0:443). Le port 443 local de HAProxy sera ensuite renvoyé sur le port 22 du serveur SSH souhaité (server srv_ssh 192.168.1.42:22).
frontend ft_ssl
mode tcp
bind 192.168.1.22:443
option tcplog
default_backend bk_ssh
backend bk_ssh
mode tcp
timeout server 2h
server local_ssh 192.168.1.42:22
Vérifier que la connexion SSH respecte bien l’identification du protocole
Lors d’une connexion SSH, une chaîne d’identification doit être envoyée par le client et le serveur (rfc4253). Le fait de reconnaître cette chaîne va nous permettre d’identifier le protocole SSH, et ainsi nous permettre de mutualiser le port 443 pour d’autres protocoles (ex : HTTPS/VPN/…).
Les connexions avec l’identification du protocole SSH iront vers le serveur SSH. Les autres connexions iront vers le serveur WEB. Pour réaliser cela, nous allons devoir inspecter les données reçues (tcp-request inspect-delay 5s) puis créer une ACL (if { payload(0,7) -m bin 5353482d322e30 }) ainsi qu’une redirection du flux vers un autre backend que celui par défaut (use_backend bk_ssh).
tcp-request inspect-delay 5s
use_backend bk_ssh if { payload(0,7) -m bin 5353482d322e30 }
# ou alors l'équivalent (plus lisible)
# use_backend bk_ssh if { payload(0,7) -m str "SSH-2.0" }
Modifiez ensuite votre backend par défaut (default_backend bk_https) pour le faire pointer vers votre serveur WEB (HTTP), ou bien supprimez la ligne du backend par défaut. La suppression de la ligne « default_backend » aura pour effet de n’accepter que les connexions avec l’identification du protocole SSH.
default_backend bk_local_https
Frapper avant d’entrer
Pour éviter les scanners il est possible de refuser les 3 premières tentatives de connexion puis autoriser la quatrième connexion. Une fois autorisé, l’utilisateur pourra se connecter sans restriction pendant 12 heures.
Pour cela nous allons devoir créer une stick-table pour stocker l’adresse IP (type ip) de l’utilisateur et le nombre de connexions demandées pendant 12 heures (store conn_rate(12h). Cette stick-table peut conserver jusqu’à 1 million d’entrée (size 1m). Les données sont supprimées de la table au bout de 12 heures (expire 12h).
backend st_tcp_src
stick-table type ip size 1m expire 12h store conn_rate(30m)
Après avoir créé la stick-table, il faut demander à HAProxy de stocker les données (tcp-request content track-sc2 src table st_tcp_src) puis créer l’acl permettant de bloquer l’utilisateur tant qu’il n’a pas essayé plus de trois connexions (tcp-request content reject if { sc2_conn_rate(st_tcp_src) le 3 }). Ces directives sont à ajouter dans votre backend.
tcp-request content track-sc0 src table st_tcp_src
tcp-request content reject if { sc0_conn_rate(st_tcp_src) le 3 }
Refuser les clients réalisant trop de requêtes
Si un utilisateur réalise un trop grand nombre de requêtes SSH alors ses connexions seront refusées (tcp-request content reject). Nous fixerons cette limite à 50 connexions en 12 heures (if { sc0_conn_rate(st_tcp_src) gt 50 }). Cette directive est à ajouter dans votre backend.
tcp-request content reject if { sc0_conn_rate(st_tcp_src) gt 50 }
Fichier de configuration HAProxy
Si vous le souhaitez vous pouvez télécharger le fichier de configuration complet ci-dessous. Il vous faudra modifier au minimum les adresses IP ainsi que le chemin vers votre certificat SSL (si vous prenez la version qui mutualise le port 443 pour le service SSH et HTTPS).
Version basique : haproxy.cfg
Version mutualisée : haproxy.cfg