Login
dossier > Informatique > [Tuto] Sécurisation d'un serveur SSH

[Tuto] Sécurisation d'un serveur SSH

Bloquer les attaques brute-force

Bloquer les attaques brute-force



 

fail2ban

fail2ban permet de contrôler les tentatives de connexion sur le serveur ssh, mais aussi sur de nombreux autres services tels que vsftpd, proftpd, postfix, apache... Son fonctionnement est assez simple : il scan le fichier journal des authentifications (/var/log/auth.log) et permet, en association avec Iptables, de bannir les adresses IP à l'origine de plusieurs échecs de connexion dans des délais rapprochés.

Cette méthode semble fonctionner sans problème avec une authentification classique, par login et mot de passe.
Par contre avec la technique des clés RSA, seul la détéction d'une bonne clée est mentionné dans le fichier auth.log, l'échec de saisie d'une passphrase quand à lui n'est pas du tout enregisté. Il est donc quand même possible de bloquer une adresse IP après plusieurs clés soumises rejetées.


 

Installation

Paquets requis avant l'installation :

  • Python >= 2.4


Paquets optionnels mais recommandés :

  • iptables
  • shorewall
  • tcp-wrappers
  • Gamin


Pour installer fail2ban, il sufiit d'installer le paquet suivant :

#  apt-get install fail2ban



 

Configuration

A ce stade de l'installation, fail2ban est opérationnel pour le service ssh, avec les authentifications par login et mot de passe.

Les fichiers de configuration de fail2ban se situent dans le dossier /etc/fail2ban/ :

fail2ban.conf : Fichier de configuration global.
jail.conf : Fichier de configuration des services surveillés.
action.d/ : dossier contenant les actions à effectuer lors de la détection d'un échec d'authentification.
filter.d/ : dossier contenant les différents filtres appliqués sur les fichiers de journal pour détecter les échecs d'authentification.

 
Voici un exemple du fichier de configuration par défaut de jail.conf :

## Paramètres par défaut
[DEFAULT]

# Permet d'ignorer une adresse IP, ici l'adresse de bouclage réseau
ignoreip = 127.0.0.1

# Durée en secondes du ban
bantime  = 600

# Nombre maximum de tentatives par défaut
maxretry = 3

backend = polling

# Email vers lequel envoyer les notifications
destemail = root@localhost


## ACTIONS

# Action par défaut en cas de ban
banaction = iptables-multiport

# Type d'action utilisée pour l'envoi de mails
mta = sendmail

# Protocole par défaut
protocol = tcp

# Raccourci définisants les paramètres des différentes actions applicables
# Banir uniquement
action_ = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]

# Banir, envoyer d'un email contenant le résultat d'une requete whois
action_mw = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]
              %(mta)s-whois[name=%(__name__)s, dest="%(destemail)s", protocol="%(protocol)s]

# Banir, envoyer d'un email contenant le résultat d'une requete whois et les lignes de log concernées
action_mwl = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]
               %(mta)s-whois-lines[name=%(__name__)s, dest="%(destemail)s", logpath=%(logpath)s]
 
# Action à appliquer par défaut
action = %(action_)s


[ssh]

# "true" pour activer la surveillance du service, sinon "false"
enabled = true

# spécification du port ssh utilisé
port    = ssh

# filtre appliqué pour ce service, ici sshd pour filter.d/sshd.conf
filter    = sshd

# chemin vers le fichier de journal des authentifications
logpath  = /var/log/auth.log

# nombre maximum d'échecs avant blocage
maxretry = 6



Les fichiers de journaux sont les suivants :

/var/log/auth.log : journal des authentifications sur le serveur. Il s'agit du fichier journal qui sera surveillé par fail2ban dans le cas du ssh.
Exemple de configuration avec un journal en mode VERBOSE dans la configuration de ssh.
Dans des niveaux de journalisation moins complets, les clés privées soumises invalides ne sont pas enregistrées.

May 17 21:03:50 sshserver sshd[5709]: Connection from 192.168.150.1 port 4456
May 17 21:03:50 sshserver sshd[5709]: Failed password for root from 192.168.150.1 port 4456 ssh2
May 17 21:03:53 sshserver sshd[5709]: Failed password for root from 192.168.150.1 port 4456 ssh2
May 17 21:03:59 sshserver sshd[5709]: Accepted password for root from 192.168.150.1 port 4456 ssh2
May 17 21:03:59 sshserver sshd[5711]: pam_unix(sshd:session): session opened for user root by (uid=0)

May 17 21:15:19 sshserver sshd[7035]: Failed publickey for root from 192.168.150.1 port 4602 ssh2

May 17 21:15:40 sshserver sshd[7046]: Connection from 192.168.150.1 port 4618
May 17 21:15:40 sshserver sshd[7046]: Found matching RSA key: bc:cf:ff:3c:89:5c:35:80:da:26:1f:3e:84:b6:65:f5
May 17 21:15:43 sshserver sshd[7046]: Found matching RSA key: bc:cf:ff:3c:89:5c:35:80:da:26:1f:3e:84:b6:65:f5
May 17 21:15:43 sshserver sshd[7046]: Accepted publickey for root from 192.168.150.1 port 4618 ssh2
May 17 21:15:43 sshserver sshd[7048]: pam_unix(sshd:session): session opened for user root by (uid=0)

 
/var/log/fail2ban.log : journal des actions de fail2ban.
Les messages importants sont signalés par le label WARNING [service].
Ici nous pouvons constater que

2008-05-17 18:57:16,776 fail2ban.actions: WARNING [ssh] Ban 192.168.150.1
2008-05-17 18:58:16,796 fail2ban.actions: WARNING [ssh] Unban 192.168.150.1

 

Parmis les filtres diponnibles, nous utiliserons sshd.conf situé dans filter.d/ . Les règles de filtrage sont définies suivant des expressions régulières.
Voici un extrait de ce fichier :

[INCLUDES]

# Read common prefixes. If any customizations available -- read them from
# common.local
before = common.conf


[Definition]

_daemon = sshd


# Option:  failregex
# failregex est constitué d'expressions régulières permettant de détécter les echecs d'authentification
# dans le fichier /var/log/auth.log. Le label "<HOST>" peut être utilisé pour définir le nom de la machine
# ou l'adresse IP, au lieu d'utiliser l'expression suivante :     (?:::f{4,6}:)?(?P<host>\S+)
#
failregex = ^%(__prefix_line)s(?:error: PAM: )?Authentication failure for .* from <HOST>\s*$
            ^%(__prefix_line)sFailed [-/\w]+ for .* from <HOST>(?: port \d*)?(?: ssh\d*)?$
            ^%(__prefix_line)sROOT LOGIN REFUSED.* FROM <HOST>\s*$
            ^%(__prefix_line)s[iI](?:llegal|nvalid) user .* from <HOST>\s*$
            ^%(__prefix_line)sUser .+ from <HOST> not allowed because not listed in AllowUsers$
            ^%(__prefix_line)sUser .+ from <HOST> not allowed because none of user's groups are listed in AllowGroups\s*$
            ^%(__prefix_line)sauthentication failure; logname=\S* uid=\S* euid=\S* tty=\S* ruser=\S* rhost=<HOST>(?:\s+user=.*)?\s*$
            ^%(__prefix_line)srefused connect from \S+ \(<HOST>\)\s*$
            ^%(__prefix_line)sAddress <HOST> .* POSSIBLE BREAK-IN ATTEMPT\s*$


# Option:  ignoreregex
# ignoreregex permet de spécifier les inscriptions à ignorer dans le fichier journal, c des
# expressions régulières.
#
ignoreregex =

 

 Pour que fail2ban detecte et bloque les tentatives de connexions répétées avec une clée érronée, ajoutez cette ligne dans l'option failregex du fichier sshd.conf :

            ^%(__prefix_line)sFailed publickey for .* from <HOST>(?: port \d*)?(?: ssh\d*)?$

Notez que bloquer la soumission de mauvaises clés reste peu efficace, étant donné qu'une personne voulant s'introduire sur votre serveur, le fera en possession de la clé. Cela sécurise tout de même un peu plus que sans surveillance.

Une bonne passphrase est donc indispensable lors de la génération de votre clée (utilisation de lettres majuscules, minuscules, chiffres, caractères spéciaux et au minimum 8 caractères).



Fail2Ban doit normalement être fonctionnel, vous permettant maintenant de réduire presque à neant les tentatives d'intrusions sur votre serveur.

 

 


Réalisation

Code & Design : Sébastien Cardona

Page générée en : 0.019075s