• Situation actuelle: Machine virtuelle openvz hébergé par Proxmox. Serveur proftpd mis en place et je voulais « surveiller » les identifications & co avec Fail2ban. Aucun problème pour la surveillance des logs de ssh ou d’Apache. Toutes fois, littéralement impossible de surveiller les logs de proftpd.
  • J’ai trouvé un message d’erreur dans la liste des règles iptables:
    iptables -L...
    fail2ban-proftpd tcp -- anywhere anywhere FATAL: Could not load /lib/modules/2.6.32-4-pve/modules.dep: No such file or directory
    ...

    Bizarre. Liste des modules:
    ls /lib/modules... nada

    Okkk :D Aucun module.
  • Après une rapide recherche, pour la surveillance des logs de proftpd, les modules suivants sont nécessaires:
    iptable_filter
    ipt_length
    ipt_limit
    iptable_mangle
    ipt_REJECT
  • Et pour charger ces modules, bas au final c’est pas bien compliqué, il suffit de le faire à partir de l’hôte:
    vzctl stop ID_VM (arrêt de la machine virtuelle)
    vzctl set ID_VM --iptables iptable_filter --iptables ipt_length --iptables ipt_limit --iptables iptable_mangle --iptables ipt_REJECT --save
    vzctl start ID_VM

=)

Sources:

OpenVZ-Users-Guide.pdf (page 70)

, , ,

Fail2Ban est un petit logiciel écrit en Python qui fait un travail exemplaire : bannir des ip qui tentent de se connecter à une machine. Avec quelques filtres et règles iptables fournit, il arrive à faire un très bon travail et à prévenir de ce qui a été fait.

On peut en fait créer des jails (prisons) par services (ssh, http, …), on renseigne quelques informations (fichier de log, filtre à appliquer, …) et lorsque le filtre trouve une concordance, une action est réalisée (bannissement, mail, whois, …).

Le logiciel est présent sur une grosse partie des distributions, donc un simple:
aptitude install fail2ban
ou:
yum install fail2ban

Devrait suffire =)

1] Surveillance des connections ssh:

A) Mise en place:

Dupliquer le fichier, puis modifier :
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
vi /etc/fail2ban/jail.local
[ssh]
enabled = true
port = ssh,sftp
filter = sshd
banaction = iptables-multiport[name=SSH,port=22,protocol=tcp]
mail[dest="your@mail.com",name="ssh",sender="fail2ban@mail.com"]
# Analyse les 600 dernières secondes (10minutes)
findtime = 600
# bantime de 25h
bantime = 90000
# Fichier de log analysé:
logpath = /var/log/auth.log
# Maximum d'essais ratés: 3
maxretry = 3

Appliquer les modification :
fail2ban-client reload

Avec cette configuration, un mail d’avertissement sera envoyé pour dire qu’une ip a été bloquée pour 25h suite à 3 essais ratés dans les 10 dernières minutes. Un mail sera également envoyé à chaque arrêt/démarrage de la prison ssh.

Le mail reçu contiendra seulement l’information que telle adresse ip a été bannie. Il est possible d’avoir un « whois » en plus.

Pour cela, il suffit de remplacer la ligne :
mail[dest="your@mail.com",name="ssh",sender="fail2ban@mail.com"]
Par :
sendmail-whois[dest="your@mail.com",name="ssh",sender="fail2ban@mail.com"]

Pour voir toutes les autres actions possibles il suffit de regarder les fichiers présents dans le dossier /etc/fail2ban/action.d/.

Et pour avoir des informations sur l’état de la prison ssh :
fail2ban-client status ssh

B) Commandes utiles pour la surveillance de ssh :

  • Lister tous les accès ssh ratés :
    grep 'Failed' /var/log/auth.log|sort |uniq -c
  • Nombre de connections ssh ratées :
    grep 'Failed' /var/log/auth.log|sort |wc -l

2] Surveillance des logs de Fail2ban :

Il est possible qu’une adresse ip tente a plusieurs reprises de se connecter à un service et se fait bannir (par exemple 5 bannissements avec ssh). Ça fait que l’on reçoit 5 mails et qu’il est possible que l’ip continue ses tentatives. Et ça peut également être sur d’autres services.
Plutôt que de subir ces nombreuses tentatives, il est possible de mettre en place un filtre qui analyse le fichier de log de Fail2Ban, pour bannir sur une plus longue durée une adresse IP qui apparaîtrait trop de fois.

A) Création du filtre :

Créer un nouveau fichier : /etc/fail2ban/filter.d/fail2ban.conf :
# Fail2Ban: fichier de configuration
#
# Author: Tom Hendrikx
# Traduction: Gardouille
#
# Version: 1.0
#
[Definition]
# Option: failregex
# Notes.: regex qui correspond aux messages d'erreur relatifs
# à un mauvais mot de passe dans le fichier de log.
# L'hote doit correspondre à un groupe nommé "host".
# Le tag "<HOST>" peut être utilisé pour faire correspondre
# les IP/hostname et c'est seulement un alias pour
# (?:::f{4,6}:)?(?P<host>\S+)
# Valeur: Texte
#
# Compter toutes les ip bannies dans le fichier de log
failregex = fail2ban.actions: WARNING \[(.*)\] Ban
# Option: ignoreregex
# Notes.: regex à ignorer. Si cette regex correspond, la ligne est ignorée.
# Valeur: Texte
#
# Ignorer nos propres bannissements, pour garder nos comptes exacts.
# Dans le fichier de config, nommer la prison 'fail2ban', ou alors changer cette ligne!
ignoreregex = fail2ban.actions: WARNING \[fail2ban\] Ban

B) Définition de la prison (jail) :

Si ce n’est pas déjà fait, créer une copie du fichier de configuration :
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Créer ensuite une nouvelle prison dans ce dernier fichier :
[fail2ban]
enabled = true
filter = fail2ban
action = iptables-allports[name=fail2ban]
sendmail-whois[dest="votre@mail.com",name="fail2ban",sender="fail2ban"]
# Fichier de log analysé :
logpath = /var/log/fail2ban.log
# Analyse les logs sur 1 semaine
findtime = 604800
# bantime: 1 semaine
bantime = 604800

Note : « sendmail-whois » permet d’avoir un « whois » sur l’adresse IP qui a fait de nombreuses tentatives. Ça me paraît intéressant vu que l’adresse IP a vraisemblablement beaucoup insisté.

3] Divers:

A) Débannir une adresse IP:

Pour connaître la liste des adresses ip bannies :
iptables -LChain fail2ban-ssh (1 reference)
target prot opt source destination
DROP all -- XX.YY.WWW.ZZZ anywhere
RETURN all -- anywhere anywhere

Il y a trois méthodes pour débloquer une adresse ip :
iptables -D nom_de_la_chaine numéro_de_la_ligne
iptables -D fail2ban-ssh 1
iptables -D INPUT -s XX.YY.WWW.ZZZ -j DROP

Avec cette méthode, l’adresse ip ne sera pas rebannie si elle se trompe 3 fois de mot de passe. Pour réactiver ce bannissement automatique, il faut stopper et relancer fail2ban :
fail2ban-client stop
fail2ban-client start

B) Changer la langue des mails reçus :

Par défaut, les fichiers de configuration de Fail2Ban sont en anglais, par conséquent, les mails envoyés seront également en anglais. Cependant on va vu ci-dessus qu’il était possible de un double des fichiers de configuration (*.local). Il suffit de faire pareil pour les fichiers qui définisse les actions puis de traduire le texte que l’on veut dans chaque fichier.

Pour commencer, il faut déterminer quelle action est utilisée pour envoyer un mail, pour savoir quel fichier dupliquer. Cela dépend des prisons définies. Il faut donc aller regarder dans le fichier : /etc/fail2ban/jail.local (ou si il n’existe pas encore : /etc/fail2ban/jail.conf).
Par exemple pour la prison « ssh », on a :
mail[dest="your@mail.com",name="ssh",sender="fail2ban@mail.com"]
Il faudra donc dupliquer le fichier : /etc/fail2ban/action.d/mail.conf.
Pour « fail2ban », on a :
sendmail-whois[dest="votre@mail.com",name="fail2ban",sender="fail2ban"]
Il faudra donc dupliquer le fichier : /etc/fail2ban/action.d/sendmail-whois.conf.

« Dupliquer » un fichier signifie de simplement en faire une copie avec l’extension « .local » à la place de « .conf ». Ainsi Fail2Ban commencera par regarder si il existe un fichier « .local » avec les informations qu’il veut et ensuite, il regardera le fichier « .conf ».
Donc une fois le fichier « mail.local » ou « sendmail-whois.local » crée, il suffit de traduire les commentaires, le texte, … Libre à vous =).

,

1) Accéder aux partitions:

Sans accès au grub, j’ai eu besoin de récupérer un mot de passe root. Pour y arriver, je me suis servi du system rescue cd.
On démarre donc sur le cd:

Le clavier que l’on veut utiliser est demandé lors du démarrage du système. Il suffit donc de préciser « fr » pour avoir un clavier « azerty »:

Si vous avez raté le choix du clavier, une fois logué sur le prompt, il suffit de taper:
loadkeys fr

Il faut ensuite déterminer quelle partition correspond à notre partition système principal (/):
parted --list
ou:
fdisk -l
/dev/sda1 * 1 25 194560 83 Linux
/dev/sda2 25 3188 25600001 5 Extended
/dev/sda5 25 2456 19529728 83 Linux
/dev/sda6 2456 3064 4881408 83 Linux
/dev/sda7 3064 3188 991232 82 Linux swap / Solaris
Dans mon cas, ça sera donc /dev/sda5. Si vous n’arrivez pas à déterminer quelle partition est la partition principale, il est possible de les monter une par une et de voir laquelle contient le répertoire qui nous intéresse (/etc/).

On monte la partition sur un emplacement temporaire:
mkdir /tmp/root
mount -t ext4 /dev/sda5 /tmp/root

2) Supprimer le mot de passe:

Faire un backup du fichier /mnt/root/etc/shadow:
cp /tmp/root/etc/shadow{,.backup}
Ouvrir le fichier:
vi /tmp/root/etc/shadow
Aller à la ligne:
user:$mon_mot_de_passe_tout_crypté:14866:0:99999:7:::
Supprimer « $mon_mot_de_passe_tout_crypté » pour que ça ressemble à:
user::14866:0:99999:7:::
Pour sauvegarder le fichier et quitter « vi »: [Echap] puis taper « :wq« .

3) Modifier le mot de passe:

Plutôt que de supprimer le mot de passe, il est possible de le modifier directement. Pour se faire, il faut d’abord déterminer le type de hash utilisé par le système principal. Pour le savoir, regarder les trois premiers caractères du mot de passe dans /tmp/root/etc/shadow:

$1$: hash md5
$6$: hash sha-512

On génère ensuite un mot de passe hashé en fonction du type géré par le système

mkpasswd -m md5
mkpasswd -m sha-512

Au cas ou, l’utilitaire « mkpasswd » est fourni par le paquet « whois » =).

Il suffit ensuite de remplacer le mot de passe dans /tmp/root/etc/shadow par le résultat de la commande précédente. Pour ceux qui ne saurait pas faire de copier/coller en ligne de commande l’utilitaire screen permet de copier du contenu dans son buffer pour ensuite le recoller où l’on veut. ;)

-> Sous ubuntu, root n’a pas de compte à proprement parler. Il faut donc supprimer ou modifier le mot de passe d’un compte sensé avoir des droits en sudo.

4) Retour sur le système principal:

Puis on redémarre sur notre système principal =)
reboot

Il est maintenant possible de s’identifier sans mot de passe pour le compte choisi. Pour accéder au sudo, il faut remettre un nouveau mot de passe:
passwd
Chose très importante à faire dans tous les cas ^^ (y compris root!).

5) Conclusion …:

Au final, la grande question: comment sécuriser son système avec ces différents moyens pour récupérer un pass root?

  • Utiliser des lvm cryptés me paraît déjà un bon choix
  • Sécuriser le grub avec un mot de passe (pour le lien en fin de page) et verrouiller chaque entrée du grub pour éviter les modifications
  • Un cadenas (… ^^)
  • Enfermer le pc
  • Forcer le démarrage sur cd/dvd + mot de passe bios

Si j’avais eu accès au grub: http://www.korben.info/changer-le-mot-de-passe-dubuntu-quand-on-la-oublie.html

, ,