Portsentry : Différence entre versions

De DiouxX's Wiki
Aller à : navigation, rechercher
(Envoi d'un mail)
 
(3 révisions intermédiaires par le même utilisateur non affichées)
Ligne 40 : Ligne 40 :
 
</pre>
 
</pre>
  
À présent nous allons nous attaquer au fichier de configuration principale : '''portsentry.conf'''
+
À présent nous allons nous attaquer au fichier de configuration principale : {{ File | portsentry.conf }}
 
<br>
 
<br>
 
{{ Console root | sudo nano /etc/portsentry/portsentry.conf }}
 
{{ Console root | sudo nano /etc/portsentry/portsentry.conf }}
Ligne 152 : Ligne 152 :
 
192.168.x.x - 255.255.255.255 !H 0 - 0 -
 
192.168.x.x - 255.255.255.255 !H 0 - 0 -
 
</pre>
 
</pre>
 +
 +
= Envoi d'un mail =
 +
 +
Nous allons écrire un script qui va envoyer un mail avec les informations suivante : l'IP initiatrice du scan, le port scanné, le mode de scan (atcp ou audp) et des infos complémentaires sur l'adresse IP ( via whois ).
 +
<br>
 +
On crée le script dasn {{ File | /etc/portsentry/scan_report }}
 +
<syntaxhighlight lang=bash>
 +
#!/bin/bash
 +
 +
MAIL=mail@domain.be
 +
SUJET="[PortsEntry] Scan has been detected"
 +
 +
IP="$1"
 +
PORT="$2"
 +
TYPE="$3"
 +
 +
(
 +
    echo "Scan has been detected :"
 +
    echo "---------------------------------------"
 +
    echo "IP  : $IP"
 +
    echo "PORT : $PORT"
 +
    echo "TYPE : $TYPE"
 +
    echo "---------------------------------------"
 +
    whois --host whois.apnic.net $IP
 +
) | mail -s "$SUJET" "$MAIL"
 +
</syntaxhighlight>
 +
<br>
 +
On n'oublie pas de rendre le script exécutable
 +
<br>
 +
{{ Console root | sudo chmod +x /etc/portsentry/scan_report }}
 +
<br>
 +
On indique à portsentry d'éxécuter ce script. Éditez de nouveau le fichier {{ File | /etc/portsentry/portsentry.conf}} puis recherchez la chaine $TARGET$. Placez à cette endroit du fichier cette ligne (un exemple est commenté) :
 +
<pre>
 +
KILL_RUN_CMD="echo $TARGET$ >> /etc/fail2ban/ip.blacklist && /etc/portsentry/scan_report $TARGET$ $PORT$ $MODE$"
 +
</pre>
 +
<br>
 +
{{ Avertissement | Dans la commande, j'ai rajouté le fait qu'il ajoute l'adresse IP dans le fichier {{ File | /etc/fail2ban/ip.blacklist }} pour que [[Fail2ban#Ban_persistant|Fail2ban]] puisse le bannir également }}
 +
<br>
 +
Vous pourrez modifier la valeur de SCAN_TRIGGER et placer un niveau d'alerte. Par défaut c'est "0" : la réaction est immédiate. De mon coté je l'ai laissé à "0" et je la changerai si ça me pose des problèmes.
 +
 +
La configuration effectuée, vous pouvez maintenant relancer portsentry
 +
<br>
 +
{{ Console root | sudo service portsentry restart }}
 +
<br>
  
 
= Conclusion =
 
= Conclusion =

Version actuelle datée du 26 février 2015 à 12:24

Présentation

Nos serveurs accessibles depuis internet sont de plus en plus vulnérables aux attaques, d’où ce tutoriel où je vais vous parler de Portsentry. Cet outil permet de détecter et de bloquer tout individu scannant les ports de votre machine.

Installation

L’installation se fait simplement via apt :

Konsole.png
[root@ordi ~]# apt-get update && apt-get install portsentry


Configuration

Par défaut, Portsentry ne bloque rien et nous allons devoir le configurer afin de détecter et bloquer le scan de ports. Il va falloir modifier le fichier où sont notifiées les adresses IPs à ne pas bloquer afin de ne pas se bloquer soi-même. Pour cela il existe 2 fichiers : portsentry.ignore et portsentry.ignore.static . Toutes les IPs que vous allez ajouter dans portsentry.ignore.static seront ajoutées dans portsentry.ignore après un redémarrage du service portsentry.

Je décide de modifier le fichier /etc/portsentry/portsentry.ignore et de vérifier que l’adresse 127.0.0.1 soit bien définie :

# IP déjà notifié dans le fichier :
 
127.0.0.1/32
0.0.0.0
 
# autres @ip que vous souhaitez xxx.xxx.xxx.xxx

Configuration de Portsentry

Si vous choisissez les modes atcp et audp (“a” signifie avancé) dans /etc/defaults/portsentry, inutile de préciser les ports, Portsentry va vérifier les ports utilisés et automatiquement “lier” les ports disponibles. C’est l’option la plus efficace. Donc avec cette option, portsentry établit une liste des ports d’écoute, TCP et UDP, et bloque l’hôte se connectant sur ​​ces ports sauf s’il est présent dans le fichier portsentry.ignore configuré auparavant.

Modification du fichier /etc/default/portsentry  :

Remplacer
TCP_MODE="tcp"
UDP_MODE="udp"
 
Par
TCP_MODE="atcp"
UDP_MODE="audp"

À présent nous allons nous attaquer au fichier de configuration principale : portsentry.conf

Konsole.png
[root@ordi ~]# sudo nano /etc/portsentry/portsentry.conf


Mettez en place le blocage en modifiant la section “Ignore options” de la façon suivante :

	
##################
# Ignore Options #
##################
...
# 0 = Do not block UDP/TCP scans.
# 1 = Block UDP/TCP scans.
# 2 = Run external command only (KILL_RUN_CMD)
BLOCK_UDP="1"
BLOCK_TCP="1"

Si comme moi vous utilisez Iptables, commentez toutes les lignes commençant par “KILL_ROUTE” sauf cette dernière qui permet de bloquer les IPs des machines pirates :

	
KILL_ROUTE="/sbin/iptables -I INPUT -s $TARGET$ -j DROP"

Redémarrez le service Portsentry :

Konsole.png
[root@ordi ~]# sudo service portsentry restart


Pour vérifier que Portsentry a bien démarré, taper la commande suivante :

Konsole.png
[root@ordi ~]# sudo tail -n 5 /var/log/syslog


Cette dernière devrait vous retourner ce message :

portsentry[30088]: adminalert: PortSentry is now active and listening.

Tests

Sur une autre machine, nous allons effectuer un scan des ports de la machine précédemment configurée avec nmap :

# nmap -v 192.168.x.x
 
Starting Nmap 5.00 ( http://nmap.org ) at 2015-01-05 16:08 EAT
NSE: Loaded 0 scripts for scanning.
Initiating ARP Ping Scan at 16:08
Scanning 192.168.x.x [1 port]
Completed ARP Ping Scan at 16:08, 0.06s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 16:08
Completed Parallel DNS resolution of 1 host. at 16:08, 6.50s elapsed
Initiating SYN Stealth Scan at 16:08
Scanning sidlol.zehome.org (192.168.x.x) [1000 ports]
Discovered open port 111/tcp on 192.168.x.x
Discovered open port 80/tcp on 192.168.x.x
Discovered open port 22/tcp on 192.168.x.x
Discovered open port 143/tcp on 192.168.x.x
...
Completed SYN Stealth Scan at 16:08, 0.12s elapsed (2002 total ports)
Host sidlol.zehome.org (10.9.8.2) is up (0.000047s latency).
Interesting ports on sidlol.zehome.org (192.168.x.x):
Not shown: 1988 closed ports
PORT STATE SERVICE
1/tcp open tcpmux
11/tcp open systat
15/tcp open netstat
22/tcp open ssh
79/tcp open finger
80/tcp open http
...
MAC Address: xx:xx:xx:xx:xx:xx (xxxxx)
 
Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 6.95 seconds
Raw packets sent: 2003 (88.130KB) | Rcvd: 2011 (80.594KB)


Si on regarde à présent sur le serveur hébergeant portsentry :

Konsole.png
[root@ordi ~]# sudo grep attackalert /var/log/syslog


portsentry[30084]: attackalert: TCP SYN/Normal scan from host: 192.168.x.x/192.168.x.x to TCP port: 22
portsentry[30084]: attackalert: Host: 192.168.x.x/192.168.x.x is already blocked Ignoring
portsentry[18127]: attackalert: TCP SYN/Normal scan from host: 192.168.x.x/192.168.x.x to TCP port: 79
portsentry[18127]: attackalert: Host 192.168.x.x has been blocked via wrappers with string: "ALL: 192.168.x.x : DENY"
portsentry[18127]: attackalert: Host 192.168.x.x has been blocked via dropped route using command: "/sbin/iptables -I INPUT -s 192.168.x.x -j DROP"
portsentry[18127]: attackalert: External command run for host: 192.168.x.x using command: "/sbin/iptables -I INPUT -s 192.168.x.x -j DROP && /sbin/iptables -I INPUT -s 1 


Konsole.png
[root@ordi ~]# sudo cat /etc/hosts.deny


ALL: 192.168.x.x : DENY


Konsole.png
[root@ordi ~]# sudo iptables -S


-À INPUT -s 192.168.x.x/32 -j DROP


Konsole.png
[root@ordi ~]# route


192.168.x.x - 255.255.255.255 !H 0 - 0 -

Envoi d'un mail

Nous allons écrire un script qui va envoyer un mail avec les informations suivante : l'IP initiatrice du scan, le port scanné, le mode de scan (atcp ou audp) et des infos complémentaires sur l'adresse IP ( via whois ).
On crée le script dasn /etc/portsentry/scan_report

#!/bin/bash
 
MAIL=mail@domain.be
SUJET="[PortsEntry] Scan has been detected"
 
IP="$1"
PORT="$2"
TYPE="$3"

(
    echo "Scan has been detected :"
    echo "---------------------------------------"
    echo "IP   : $IP"
    echo "PORT : $PORT"
    echo "TYPE : $TYPE"
    echo "---------------------------------------"
    whois --host whois.apnic.net $IP
) | mail -s "$SUJET" "$MAIL"


On n'oublie pas de rendre le script exécutable

Konsole.png
[root@ordi ~]# sudo chmod +x /etc/portsentry/scan_report


On indique à portsentry d'éxécuter ce script. Éditez de nouveau le fichier /etc/portsentry/portsentry.conf puis recherchez la chaine $TARGET$. Placez à cette endroit du fichier cette ligne (un exemple est commenté) :

KILL_RUN_CMD="echo $TARGET$ >> /etc/fail2ban/ip.blacklist && /etc/portsentry/scan_report $TARGET$ $PORT$ $MODE$"


Warning.png
Attention !
Dans la commande, j'ai rajouté le fait qu'il ajoute l'adresse IP dans le fichier /etc/fail2ban/ip.blacklist pour que Fail2ban puisse le bannir également


Vous pourrez modifier la valeur de SCAN_TRIGGER et placer un niveau d'alerte. Par défaut c'est "0" : la réaction est immédiate. De mon coté je l'ai laissé à "0" et je la changerai si ça me pose des problèmes.

La configuration effectuée, vous pouvez maintenant relancer portsentry

Konsole.png
[root@ordi ~]# sudo service portsentry restart


Conclusion

À présent l’adresse IP de notre pirate a été détectée par Portsentry et bloquée par IPtables. Outil très sympa qui rajoute une couche de sécurité à vos serveurs. Dans la continuité de cet article, il serait intéressant de créer un script nous avertissant par e-mail qu’une intrusion a été détectée et bloquée.