Comment protéger votre accès ssh

Publié
Commentaires Aucun

Comment se protéger contre les attaques force brute sur les accès SSH

Si vous avez commencé à utiliser un serveur Linux, pour votre cloud personnel, votre serveur web, votre serveur de messagerie ou bien d’autres usages, vous avez logiquement besoin d’accéder à distance pour faire la maintenance de ce serveur.

hack

Pour avoir la main sur le serveur il est nécessaire de se connecter en ssh en autres.

Le problème, c’est que dès que votre serveur expose le port 22 sur internet, il devient immédiatement la cible des robots qui vont chercher à se connecter en root en essayant de nombreux mots de passe.

En général on appelle cela une attaque par force brute. Le serveur distant va essayer de nombreux mots de passe tirés de dictionnaires. Peut importe le temps qu’il faut, il y a une chance réelle qu’un des mots de passe essayé finisse par correspondre à celui du compte root.

Quelques fois également, ils vont essayer des comptes utilisés fréquemment
Ci dessous les logins le plus souvent testés :

  root (58%),test (1%),oracle (< 1%),admin,info,user,postgres,mysql,backup,guest,web,tomcat,michael,r00t,upload,alex,sales,linux,bin,ftp,support,temp,nagios,user1,www,test1,nobody

Nous allons voir ci dessous les quelques précautions de base à prendre

Utiliser un mot de passe complexe pour tous les comptes

password.jpg

Un utilitaire existe pour générer des mot de passe aléatoires, il s’agit de pwgen

sudo apt-get install pwgen

On lance ensuite l’utilitaire

joel@monserveur:~$ pwgen
aiRohJ8u Iuc1ohqu hoovei0S lah3Teey aepheiS6 Kaequ4ei See1eeSe utoad3Pe
OoTie2zu pohx0oDu Eeng0Ieh euSh3coh quiqu0At wa5Eim0k FooRoin4 ioPaeQu2
......
......
de2Voiqu nieHaiN1 thu1Sai8 Ac9aiFuc zee3Sa8n Ahh2nei1 GeaB5li1 ied6Pheh
roh4haeJ oha2Oexi eiDah6uj eT4die8r gaVoof3h Aiy8gohr ooj4Thei wahye3Mo

Il ne reste plus qu’a choisir

J’ai pour habitude d’assembler 2 ou 3 mots de passe pour avoir un mot de passe plutôt fort

ewioy9Iuaec6Ain6

Interdire la connexion avec le compte root depuis un accès externe

no root

La configuration ssh permet de bloquer un accès avec un accès distant et de n’autoriser la connexion root qu’avec une console locale (écran clavier souris)

Pour cela il suffit de modifier le fichier de configuration /etc/ssh/sshd_config

nano /etc/ssh/sshd_config

Modifier la ligne : PermitRootLogin yes
Remplacer par : PermitRootLogin no
Et relancer le service

service ssh restart

Attention Avant de procéder à cette manipulation, vous devez avoir la possibilité de vous connecter en console ou bien vous devez avoir un compte personnel sur la machine avec les droits root. En effet à partir du moment ou vous appliquez cette modification, il n’est plus possible d’ouvrir une session root en ssh à distance

Modifier le port d’écoute

ecoute.jpg

Si vous pouvez accéder à votre serveur sur n’importe quel port, alors vous pouvez changer le port d’écoute du serveur ssh
Les robots ne chercherons pas à parcourir tous les ports du serveurs pour deviner quel port supporte le ssh

Attention si vous êtes derrière un pare-feu, il faut vérifier que le port choisi est bien autorisé

Il suffit de modifier le fichier de configuration /etc/ssh/sshd_config

nano /etc/ssh/sshd_config

Modifier la ligne suivante :
Port 22
avec par exemple
port 5687

Relancer le service

service ssh restart

Maintenant pour accéder à votre machine toto.com en ssh avec le compte marcel il faut entrer la commande

ssh -p 5687 marcel@toto.com 

Bloquer les accès réseau des indésirables

lock.jpg

Malgré toutes ces précautions, les robots vont quand même attaquer votre serveur

Mar 18 10:18:48 toto.com kernel: [141894.007510] Anti SSH-Bruteforce : IN=eth0 OUT= MAC=b8:27:eb:59:d1:9b:00:24:d4:aa:a2:8d:08:00:45:00:00:3c:3e:b1:40:00:2f:06:9b:03 SRC=123.183.209.137 DST=108.95.32.25 LEN=60 TOS=0x00 PREC=0x00 TTL=47 ID=16049 DF PROTO=TCP SPT=62572 D$
Mar 18 10:18:51 toto.com kernel: [141897.013287] Anti SSH-Bruteforce : IN=eth0 OUT= MAC=b8:27:eb:59:d1:9b:00:24:d4:aa:a2:8d:08:00:45:00:00:3c:3e:b3:40:00:2f:06:9b:01 SRC=123.183.209.137 DST=108.95.32.25 LEN=60 TOS=0x00 PREC=0x00 TTL=47 ID=16051 DF PROTO=TCP SPT=62572 D$
Mar 18 10:19:17 toto.com kernel: [141923.716181] Anti SSH-Bruteforce : IN=eth0 OUT= MAC=b8:27:eb:59:d1:9b:00:24:d4:aa:a2:8d:08:00:45:00:00:3c:8a:55:40:00:2f:06:4f:5f SRC=123.183.209.137 DST=108.95.32.25 LEN=60 TOS=0x00 PREC=0x00 TTL=47 ID=35413 DF PROTO=TCP SPT=62402 D$
Mar 18 10:19:19 toto.com kernel: [141925.719974] Anti SSH-Bruteforce : IN=eth0 OUT= MAC=b8:27:eb:59:d1:9b:00:24:d4:aa:a2:8d:08:00:45:00:00:3c:8a:56:40:00:2f:06:4f:5e SRC=123.183.209.137 DST=108.95.32.25 LEN=60 TOS=0x00 PREC=0x00 TTL=47 ID=35414 DF PROTO=TCP SPT=62402 D$
Mar 18 10:19:24 toto.com kernel: [141930.724185] Anti SSH-Bruteforce : IN=eth0 OUT= MAC=b8:27:eb:59:d1:9b:00:24:d4:aa:a2:8d:08:00:45:00:00:3c:a5:73:40:00:2f:06:34:41 SRC=123.183.209.137 DST=108.95.32.25 LEN=60 TOS=0x00 PREC=0x00 TTL=47 ID=42355 DF PROTO=TCP SPT=45927 D$
Mar 18 10:19:26 toto.com kernel: [141932.725306] Anti SSH-Bruteforce : IN=eth0 OUT= MAC=b8:27:eb:59:d1:9b:00:24:d4:aa:a2:8d:08:00:45:00:00:3c:26:34:40:00:2f:06:b3:80 SRC=123.183.209.137 DST=108.95.32.25 LEN=60 TOS=0x00 PREC=0x00 TTL=47 ID=9780 DF PROTO=TCP SPT=30034 DP$
Mar 18 10:19:27 toto.com kernel: [141933.724528] Anti SSH-Bruteforce : IN=eth0 OUT= MAC=b8:27:eb:59:d1:9b:00:24:d4:aa:a2:8d:08:00:45:00:00:3c:26:35:40:00:2f:06:b3:7f SRC=123.183.209.137 DST=108.95.32.25 LEN=60 TOS=0x00 PREC=0x00 TTL=47 ID=9781 DF PROTO=TCP SPT=30034 DP$

On va donc utiliser iptables comme firewall et commencer par bloquer toute tentative de connexion en ssh qui se répète plus de 5 fois en 5 minutes

Si vous vous connectez à votre serveur vous avez donc droit à 5 tentatives par tranches de 5 minutes(réussies ou ratées)

A partir de la 6eme tentative chacune de vos connexions sera rejetée et il faut attendre 5 minutes avant que le compteur repasse à zéro

On ajoute les règles dans iptables et on ajoute une règle de log qui permettra de surveiller les rejets

iptables -A INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent  --set
iptables -A INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent  --update --seconds 300 --hitcount 5 -j LOG --log-prefix "Anti SSH-Bruteforce : "
iptables -A INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent  --update --seconds 300 --hitcount 5 -j DROP

—seconds 300 —hitcount 5
Pour 300 secondes et 5 tentatives, vous pouvez adapter ces valeurs pour vos besoins

Maintenant on va compter quelles sont les adresses IP source qui tentent d’accéder à votre serveur et on va les bloquer définitivement.

On recherche dans les logs les lignes qui contiennent le motif que l’on a défini (Anti SSH-Bruteforce : ), et on compte le nombre de tentatives
On va donc rapidement identifier les adresses des robots

cat /var/log/syslog | grep "SSH-Bruteforce" | awk '{ print  $13 }' | awk -F "=" '{ print  $2 }' | sort | uniq -c |less

123.183.209.137 2092
123.31.34.44 1
193.201.224.199 30
58.218.199.145 1033
85.105.15.13 7

On cherche maintenant à qui appartient l’adresse 58.218.199.145 qui à été bannie 1033 fois en 2 heures

whois 58.218.199.145
% [whois.apnic.net]
% Whois data copyright terms    http://www.apnic.net/db/dbcopyright.html

% Information related to '58.208.0.0 - 58.223.255.255'

inetnum:        58.208.0.0 - 58.223.255.255
netname:        CHINANET-JS
descr:          CHINANET jiangsu province network

Je n’utilise pas d’adresses venant de chine pour me connecter à mon serveur, donc j’enlève tout le range d’adresses

iptables -A INPUT -i eth0  --source 58.208.0.0/16 -j DROP

le script final

### BEGIN INIT INFO
# Provides:          skeleton
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Configuration Iptables
# Description:       This file should be used to construct scripts to be
#                    placed in /etc/init.d.
### END INIT INFO

#!/bin/sh
# /etc/init.d/firewall
# chkconfig: 3 21 91
# description: Firewall

IPT=/sbin/iptables

case "$1" in
start)
$IPT -N LOGGING
$IPT -A INPUT -j LOGGING

#blocage
# China Telecom
$IPT -A INPUT -i eth0  --source 123.180.0.0/16 -j DROP
$IPT -A INPUT -i eth0  --source 123.183.0.0/16 -j DROP

$IPT -A INPUT -i eth0  --source 116.31.116.47 -j DROP
$IPT -A INPUT -i eth0  --source 146.148.51.164 -j DROP
$IPT -A INPUT -i eth0  --source 163.172.119.99 -j DROP

# blocage si plus de 4 connections en 5 minutes
$IPT -A INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent  --set
$IPT -A INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent  --update --seconds 300 --hitcount 4 -j LOG --log-prefix "Anti SSH-Bruteforce : "
$IPT -A INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent  --update --seconds 300 --hitcount 4 -j DROP
#$IPT -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables-Dropped: " --log-level 4

exit 0
;;

stop)
$IPT -F
$IPT --table nat --flush
i="LOGGING";
$IPT -F $i && $IPT -Z $i && $IPT -X $i

exit 0
;;

*)
echo "Usage: /etc/init.d/firewall {start|stop}"
exit 1
;;
esac

exit 0

### END INIT INFO

Pour que le script se lance automatiquement à chaque démarrage, il faut l’enregistrer dans /etc/init.d/
et il faut le rendre exécutable

chmod 700 /etc/init.d/firewall

et l’ajouter en lancement automatique au démarrage ou au reboot

update-rc.d firewall defaults

Si vous voulez l’effacer du démarrage automatique

update-rc.d -f firewall remove
 

Auteur

Commentaires

Commentaires fermés pour cet article.

← Plus anciens Plus récents →