Table des matières

Système de détection d'intrusion

Prérequis

Disposer d'un serveur LAMP opérationnel:

Introduction

En matière de sécurité informatique, si la mise en place d'un pare-feu est une chose indispensable pour prévenir les risques d'attaques du serveur, il est également essentiel d'être en mesure d'identifier la menace pour pouvoir le cas échéant mettre en place les contre-mesures nécessaires à la suppression d'une faille du système d'information.

C'est le rôle d'un IDS (Intrusion Detection System).

On peut distinguer 3 types d'IDS:

C'est donc cette dernière solution que nous allons implémenter. Un IDS hybride très répandu sur les systèmes Linux est Prelude-IDS, disponible sous licence GPL, il permet aussi bien de récupérer les informations renvoyées par le système d'exploitation que celles renvoyées par le réseau. Pour cela, Prelude tire partie de multiples sondes dont le rôle est de récupérer les informations provenant d'une ou plusieurs sources pour permettre une comparaison avec une base de donnée contenant des signatures d'attaques connues.

L'installation décrite ci-dessous reçoit ses alertes à l'aide des 2 sondes suivantes:

A ces 2 sondes, nous pouvons en ajouter une troisième dont le but est de permettre la corrélation entre les alertes remontées par les précédentes sondes. Le moteur de corrélation actuellement proposé avec prelude est toujours en cours de développement, pour cette raison so configuration reste en l'état très basiques.

Dans une dernière étape, il est possible d'accéder aux alertes détectées par l'intermédiaire de l'interface web d'administration de prelude: prewikka. Cette interface permet à l'administrateur de visualiser les différentes alertes renvoyées par les sondes.

Schéma de principe du fonctionnement de l'IDS:

Récupérer les sources

Dans cette installation j'ai choisi de ne pas utiliser les paquets prépackagés pour lenny mais d'utiliser directement la dernière version de prelude-ids car cette dernière dispose de fonctionnalités supplémentaires permettant par exemple d'accéder à des graphiques de statistiques.

Nous devons donc commencer par récupérer les sources sur le site officiel:

mkdir prelude && cd ./prelude
URI="http://www.prelude-technologies.com/download/releases"
VERSION="1.0.0"
PACKAGES="libprelude libpreludedb prelude-lml prelude-manager prewikka prelude-correlator"
for SOURCE in $PACKAGES; do wget ${URI}/${SOURCE}/${SOURCE}-${VERSION}.tar.gz; done

Compiler les sources

Pour compiler nos différents paquets, nous devons installer un compilateur sur la machine:

apt-get install g++ make

Ensuite on peut passer à la compilation des sources:

apt-get install libgnutls-dev python-dev pkg-config
tar xvpf libprelude-1.0.0.tar.gz
cd libprelude-1.0.0/
./configure
[...]
*** Dumping configuration ***
    - Generate documentation   : no
    - LUA binding              : no
    - Perl binding             : yes
    - Python binding           : yes
    - Ruby binding             : no
    - Easy bindings            : yes

make
make check
make install
cd ../

Après chaque installation on recharge ldconfig:

/sbin/ldconfig /usr/local/lib
apt-get install libmysqlclient15-dev
tar xvpf libpreludedb-1.0.0.tar.gz
cd libpreludedb-1.0.0/
./configure --with-postgresql=no --with-mysql=yes
*** Dumping configuration ***
    - Generate documentation      : no
    - Enable MySQL plugin         : yes
    - Enable PostgreSQL plugin    : no
    - Enable SQLite3 plugin       : no
    - Perl binding                : yes
    - Python binding              : yes

make
make check
make install
/sbin/ldconfig /usr/local/lib
cd ../
mysql -u root -p
mysql> CREATE database prelude_database;
mysql> GRANT ALL PRIVILEGES ON prelude_database.* TO prelude_user@'localhost' IDENTIFIED BY 'password';
mysql> exit;
mysql -u prelude_user -p prelude_database < /usr/local/share/libpreludedb/classic/mysql.sql
apt-get install libwrap-dev
tar xvpf prelude-manager-1.0.0.tar.gz
cd prelude-manager-1.0.0/
./configure
*** Dumping configuration ***
    - TCP wrapper support    : no
    - XML plugin support     : no
    - Database plugin support: yes

make
make check
make install
/sbin/ldconfig /usr/local/lib
cd ../
apt-get install python-cheetah gettext python-cairo
tar xvpf prewikka-1.0.0.tar.gz
mkdir -p /usr/share/prewikka/htdocs/{css,js,images}
mkdir -p /usr/share/prewikka/{database,cgi-bin}
cd prewikka-1.0.0
cp -rf htdocs/ /usr/share/prewikka/
cp -rf database/ /usr/share/prewikka/
cp -rf cgi-bin/ /usr/share/prewikka/
cp -rf locale/fr/LC_MESSAGES/prewikka.mo /usr/share/locale/fr/LC_MESSAGES/
python setup.py install
cd ../
mysql -u root -p
mysql> CREATE database prewikka_database;
mysql> GRANT ALL PRIVILEGES ON prewikka_database.* TO prewikka_user@'localhost' IDENTIFIED BY 'password';
mysql> exit;
mysql -u prewikka_user -p prewikka_database < /usr/share/prewikka/database/mysql.sql
apt-get install libpcre3 libpcre3-dev
tar xvpf prelude-lml-1.0.0.tar.gz
cd prelude-lml-1.0.0/
./configure --enable-unsupported-rulesets
*** Dumping configuration ***
    - Favor libICU over Iconv    : no
    - Enable unsupported rulesets: yes

make
make check
make install
/sbin/ldconfig /usr/local/lib
cd ../

L'erreur suivante peut-être ignorée lors de la phase de tests:

Making check in tests
make[1]: entrant dans le répertoire « /root/prelude/prelude-lml-1.0.0/tests »
./loggrep.py ../plugins/pcre/ruleset/*.rules | ../src/prelude-lml --quiet --dry-run --metadata=nowrite,head --batch-mode --no-resolve --pcre --dump-unmatched --config ./prelude-lml.conf 2>&1 | /bin/grep -Fvf ./ignored
Invalid option -- "pcre" (0).
Invalid option -- "dump-unmatched" (0).
./prelude-lml.conf:52: invalid section : "Pcre".
./prelude-lml.conf:53: invalid option "ruleset" in "global" section.
24 Feb 18:58:57 (process:2938) ERROR: couldn't open config file /usr/local/etc/prelude-lml/plugins.rules. (regex.c:168 get_regex_table)
24 Feb 18:58:57 (process:2938) WARNING: error while setting option 'file'.
Traceback (most recent call last):
  File "./loggrep.py", line 29, in <module>
    print i[:-1]
IOError: [Errno 32] Broken pipe
apt-get install python-setuptools
tar xvpf prelude-correlator-1.0.0.tar.gz
cd prelude-correlator-1.0.0
python setup.py install

A ce stade tous les paquets nécessaires au framework sont installés.

Configurer le framework

L'étape suivante va consister à configurer l'ensemble de nos paquets pour qu'ils fonctionnent et intéragissent correctement.

nano /usr/local/etc/prelude-manager/prelude-manager.conf
include = /usr/local/etc/prelude/default/global.conf
listen = 10.10.1.30
[db]
type = mysql
host = localhost
port = 3306
name = prelude_database
user = prelude_user
pass = password
prelude-admin add prelude-manager --uid 0 --gid 0
nano /etc/prewikka/prewikka.conf
external_link_new_window
[interface]
software: Prewikka
place: Maison du libre 29.
title: Intrusion Detection System

[host_commands]
whois: /usr/bin/whois $host
traceroute: /usr/bin/traceroute $host

[idmef_database]
type: mysql
host: localhost
user: prelude_user
pass: password
name: prelude_database

[database]
type: mysql
host: localhost
user: prewikka_user
pass: password
name: prewikka_database

[auth loginpassword]
expiration: 60
initial_admin_user: admin
initial_admin_pass: admin
apt-get install whois traceroute
nano /etc/apache2/sites-enabled/000-default 
<VirtualHost *:80>
    [...]
    Alias /prewikka/prewikka/ /usr/share/prewikka/htdocs/
    ScriptAlias /prewikka/ /usr/share/prewikka/cgi-bin/prewikka.cgi
    <Directory /usr/share/prewikka/htdocs/>
        Options None
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>
    <Directory /usr/share/prewikka/cgi-bin/>
        AllowOverride None
        Options ExecCGI
        <IfModule mod_mime.c>
            AddHandler cgi-script .cgi
        </IfModule>
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>
/etc/init.d/apache2 restart

Configurer et enregistrer les sondes

L'enregistrement d'une sonde auprès du manager se fait en utilisant 2 shells, le premier envoie la demande d'enregistrement tandis que le second fournis un password et valide l'enregistrement de la sonde. Les 2 captures d'écran suivantes montrent les infos importantes à repérer dans chacun des 2 shells:

nano /usr/local/etc/prelude-lml/prelude-lml.conf
include = /usr/local/etc/prelude/default/idmef-client.conf
[prelude]
server-addr = 10.10.1.30

[format=syslog]
time-format = "%b %d %H:%M:%S"
prefix-regex = "^(?P<timestamp>.{15}) (?P<hostname>\S+) (?:(?P<process>\S+?)(?:\[(?P<pid>[0-9]+)\])?:$
file = /var/log/archive/*/messages

[format=apache]
time-format = "%d/%b/%Y:%H:%M:%S"
prefix-regex = "(?P<hostname>\S+) \S+ \S+ \[(?P<timestamp>.{20}) [+-].{4}\] "
file = /var/log/archive/apache.mdl29/02/apache-access.log
file = /var/log/archive/syslog.mdl29/02/apache-access.log

[format=apache-error]
time-format = "%a %b %d %H:%M:%S %Y"
prefix-regex = "^\[(?P<timestamp>.{24})\] \S+ (\[client (?P<hostname>\S+)\] )?"
file = /var/log/archive/apache.mdl29/02/apache-error.log
file = /var/log/archive/syslog.mdl29/02/apache-error.log

[Pcre]

ruleset=/usr/local/etc/prelude-lml/ruleset/pcre.rules

Notez bien l'adresse IP du serveur (10.10.1.30), elle correspond à l'adresse à laquelle écoute le manager (cf /usr/local/etc/prelude-lml/prelude-lml.conf)

 * Premier shell
prelude-admin register prelude-lml "idmef:w admin:r" 10.10.1.30 --uid 0 --gid 0
 * Second shell
prelude-admin registration-server prelude-manager

L'adresse IP indiquée dans le premier shell doit correspondre avec celle à laquelle écoute le manager (cf /usr/local/etc/prelude-manager/prelude-manager.conf)

nano /etc/prelude-correlator/prelude-correlator.conf
[BruteForcePlugin]
disable = false

[BusinessHourPlugin]
disable = true

[OpenSSHAuthPlugin]
disable = false

[EventScanPlugin]
disable = false

[EventStormPlugin]
disable = false

[EventSweepPlugin]
disable = false

[WormPlugin]
disable = false
repeat-target = 5

[DshieldPlugin]
disable = false
reload  = 604800
server  = www.dshield.org
uri     = /ipsascii.html?limit=10000
timeout = 10

[FirewallPlugin]
disable = True
flush-protected-hosts = 3600

Contrairement au fichier de config de la sonde prelude-lml, ici nous n'avons pas renseigné l'adresse IP sur laquelle écoute le manager, nous allons le faire dans le fichier de configuration global des clients:

nano /usr/local/etc/prelude/default/client.conf
server-addr = 10.10.1.30
 * Premier shell
prelude-admin register prelude-correlator "idmef:w admin:r" 10.10.1.30 --uid 0 --gid 0
 * Second shell
prelude-admin registration-server prelude-manager

Lancement des services

Nous allons devoir créer plusieurs scripts de démarrage pour chacun de nos services:

nano /etc/init.d/prelude-manager
#! /bin/sh

PRELUDEMANAGER=/usr/local/bin/prelude-manager
PROGNAME=prelude-manager

manager_start() {
    echo "Starting ${PROGNAME}..."
    start-stop-daemon --start --quiet --exec ${PRELUDEMANAGER} -- ${OPTIONS} -d &> /dev/null
    echo $?
}

manager_stop() {
    echo "Stopping ${PROGNAME}..."
    start-stop-daemon --stop --quiet --exec ${PRELUDEMANAGER} &> /dev/null
    echo $?
}

case "$1" in
  start)
    manager_start || exit 1
    ;;
  stop)
    manager_stop || exit 1
    ;;
  restart)
    manager_stop
    manager_start || exit 1
    ;;
  *)
    echo "Usage: /etc/init.d/$PROGNAME {start|stop|restart}" >&2
    exit 1
    ;;
esac

exit 0
nano /etc/init.d/prelude-lml 
#! /bin/sh

PRELUDELML=/usr/local/bin/prelude-lml
PROGNAME=prelude-lml

lml_start() {
    echo "Starting ${PROGNAME}..."
    start-stop-daemon --start --quiet --exec ${PRELUDELML} -- ${OPTIONS} -d &> /dev/null
    echo $?
}

lml_stop() {
    echo "Stopping ${PROGNAME}..."
    start-stop-daemon --stop --quiet --exec ${PRELUDELML} &> /dev/null
    echo $?
}

case "$1" in
  start)
    lml_start || exit 1
    ;;
  stop)
    lml_stop || exit 1
    ;;
  restart)
    lml_stop
    lml_start || exit 1
    ;;
  *)
    echo "Usage: /etc/init.d/$PROGNAME {start|stop|restart}" >&2
    exit 1
    ;;
esac

exit 0
nano /etc/init.d/prelude-correlator
#! /bin/sh

CORRELATOR=/usr/local/bin/prelude-correlator
PROGNAME=prelude-correlator

correlator_start() {
    echo "Starting ${PROGNAME}..."
    start-stop-daemon --start --quiet --exec ${CORRELATOR} -- ${OPTIONS} -d &> /dev/null
    echo $?
}

correlator_stop() {
    echo "Stopping ${PROGNAME}..."
    start-stop-daemon --stop --quiet --exec ${CORRELATOR} &> /dev/null
    echo $?
}

case "$1" in
  start)
    correlator_start || exit 1
    ;;
  stop)
    correlator_stop || exit 1
    ;;
  restart)
    correlator_stop
    correlator_start || exit 1
    ;;
  *)
    echo "Usage: /etc/init.d/$PROGNAME {start|stop|restart}" >&2
    exit 1
    ;;
esac

exit 0

Voila, il ne reste plus qu'à rendre ces scripts exécutables et à lancer les services:

for i in manager lml correlator; do
    chmod +x /etc/init.d/prelude-$i
    /etc/init.d/$i start
done

L'interface d'administration est accessible à l'url: http://localhost/prewikka/

Installation de la sonde NIDS

La sonde snort sera installée de préférence à un endroit stratégique de notre réseau, ici nous l'installons sur chaque machine offrant un service extérieur.

apt-get install snort

Le script de démarrage fourni semble ne pas fonctionner correctement avec prelude, on en fait une sauvegarde:

/etc/init.d/snort stop
mv /etc/init.d/snort /etc/snort/snort.init.d/bak

Voici le nouveau script de démarrage:

nano /etc/init.d/snort
#! /bin/sh

DAEMON=/usr/sbin/snort
PROGNAME=snort
PIDPATH="/var/run"
PIDFILE="snort_eth0.pid"
CONFIG="/etc/snort/snort.conf"
IFACE="eth0"

start() {
    echo "Starting ${PROGNAME}..."
                    set +e
    start-stop-daemon --start --quiet --exec \
              ${DAEMON} -- --nolock-pidfile \
              --pid-path ${PIDPATH} \
              -i $IFACE -c $CONFIG >/dev/null 2>&1 &
                    set -e
}

stop() {
    echo "Stopping ${PROGNAME}..."
    start-stop-daemon --stop --quiet --pidfile ${PIDPATH}/${PIDFILE} &> /dev/null
    sleep 15
}

case "$1" in
  start)
    start || exit 1
    ;;
  stop)
    stop || exit 1
    ;;
  restart)
    stop
    start || exit 1
    ;;
  *)
    echo "Usage: /etc/init.d/$PROGNAME {start|stop|restart}" >&2
    exit 1
    ;;
esac

exit 0

On passe à la configuration du démon, on va modifier la façon dont snort renvoie ses alertes et désactiver les règles relatives au protocoles snmp et rpc pour éviter d'avoir trop d'alertes liées au fonctionnement normal de la plateforme:

nano /etc/snort/snort.conf
[...]
#output log_tcpdump: tcpdump.log
[...]
output alert_prelude: profile=snort 
[...]
#include $RULE_PATH/rpc.rules
[...]
#include $RULE_PATH/snmp.rules
[...]

On passe à la configuration pour prelude:

nano /etc/prelude/default/client.conf
server-addr = 10.10.1.30
nano /etc/prelude/default/global.conf
node-name = vm_1.domain.tld
address = 10.10.1.41
netmask = 255.255.255.0
vlan-name = vm_1.domain.tld

On termine par l'enregistrement de la sonde; sur le client:

prelude-admin register snort "idmef:w admin:r" 10.10.1.30 --uid 0 --gid 0

sur le serveur:

prelude-admin registration-server prelude-manager

That's All Folks ;)