PROJET 4.5 : MISE EN PLACE D’UN IDS/IPS - …Catégories d’IDSEn considèrent les différentes...
Transcript of PROJET 4.5 : MISE EN PLACE D’UN IDS/IPS - …Catégories d’IDSEn considèrent les différentes...
PROJET 4.5 : MISE EN PLACE D’UN IDS/IPS
Table des matières
Introduction.............................................................................................................................2 Fonctionnalités d’un IDS....................................................................................................2 Architecture d’un IDS.........................................................................................................4 Catégories d’IDS................................................................................................................5Préparation du système.........................................................................................................5 Configuration de l’accès réseau.........................................................................................6 Configuration du gestionnaire de paquet APT...................................................................8 Préparation de l’espace de travail (Workbench)................................................................9 Installation de OpenSSH-Server......................................................................................11Installation de Suricata.........................................................................................................18 Installation de la chaîne de compilation...........................................................................18 Installation des dépendances..........................................................................................19 Compilation de Suricata...................................................................................................20 Configuration de Suricata................................................................................................21Installation de Snorby...........................................................................................................23 Installation de Ruby..........................................................................................................23 Installation des dépendances supplémentaires...............................................................24 Installation de Apache......................................................................................................25 Installation de MySQL......................................................................................................26 Installation de Snorby......................................................................................................27 Installation de la passerelle Apache................................................................................30Installation de Barnyard2.....................................................................................................32Démarrage manuel des services.........................................................................................34Démarrage automatique des services.................................................................................34Mise à jour des signatures avec OinkMaster.......................................................................35
Baptiste MOINE 1 Projet 4.5
INTRODUCTION
Avec la création d’un Internet basé sur l’anonymat appelé « Onion Router », la diffusion àgrande échelle de faille 0day mais aussi de pack d’exploitation (« exploit pack »),n’importe quel initié aux nouvelles technologies et à leurs enjeux en termes de sécurité del’information, est capable de procéder à une attaque ciblée sans pour autant en connaîtrele fonctionnement. Ainsi les technologies des systèmes de détection d’intrusion (IDS, ou« Intrusion Detection System ») ont connus un engouement considérable de la part desinstitutions de renom.
Un IDS a pour principale fonction d’analyser l’activité d’un réseau ou d’un hôte donné entemps réel ou différé, afin de détecter toute tentative d’intrusion et agir face à cettetentative, par exemple, en exécutant un script pré-configuré permettant d’agir sur le pare-feu du système distant et rejeter les autres requêtes de l’hôte ayant effectué ou tenté uneintrusion, cependant un IDS reste moins performant qu’un IPS (« Intrusion PreventionSystem ») lorsqu’il s’agit de rejeter les requêtes suite à la découverte d’une intrusion, onparle alors d’action passive lors de la détection et active lorsqu’un principe de préventionest mise en œuvre (e.g. rejet de connexion).
Un IDS peut analyser les éléments de la couche Application (7), Transport (4) et Réseau(3) du modèle OSI. Il permet également, en fonction de la solution adoptée, d’alerterl’administrateur par e-mail voire en utilisant des modules matériels complémentaires,d’envoyer un SMS afin de lui permettre d’appliquer un correctif ou encore d’entreprendreun processus judiciaire.
Cela a pour but, en repérant les activités et événements anormaux ou suspects,d’entretenir une gestion proactive de la sécurité des systèmes d’information.
Fonctionnalités d’un IDS
Un IDS possède diverses fonctionnalités permettant la détection d’anomalies telles que :
• Une attaque ciblée, en règle générale un IDS permet dans ce cas de :
◦ Détecter les analyses réseau par découverte (e.g. XMAS, NULL ACK), prémicesd’une attaque informatique. En effet, l’attaquant va procéder à une découverteglobale de l’architecture du SI en utilisant des outils permettant tout d’abord delancer de manière récursive des requêtes ARP afin de mapper l’ensemble deshôtes présent sur le réseau, l’attaquant va ensuite pouvoir interroger par « force-brute » tous les ports de connexion TCP ou UDP et attendre une réponse. Enfonction des réponses, l’attaquant est capable de connaître, par exemple, laversion du service interrogé ou encore le protocole utilisé et, par la même,établir une cartographie du réseau logique ;
◦ Détecter le DoS (déni de services), permettant à l’attaquant en envoyant desrequêtes arbitraires et en diminuant le temps de réponse des services, depouvoir, par exemple, usurper ce service et dérober les données d’un client(« spoofing ») ;
◦ Détecter l’exploitation de vulnérabilité protocolaire ou applicative, par exempleen détectant l’utilisation de « shellcode », il s’agit d’une portion de codeassembler permettant l’exécution d’instructions non-gérées en altérant lefonctionnement initial du protocole/programme (« reverse engineering ») ;
Baptiste MOINE 2 Projet 4.5
◦ Détecter une exploitation sans pour autant avoir détecté l’attaque, en récupérantpar exemple la réponse du service (e.g. authentification réussie).
• Une anomalie relative à une attaque globale du réseau, par exemple, l’utilisationd’un « ver ». Un ver est un programme malveillant capable de s’auto-répliquer surl’ensemble des machines en exploitant leurs vulnérabilités (i.e. mécanisme derebonds). Dans ce cas un IDS pourrait permettre de :
◦ Cartographier ou lister l’ensemble des zones affectées ;
◦ Identifier la source de l’infection et, le cas échéant, identifier la source ou auteurde l’infection. En effet dues aux nombreuses infections, il devient très complexede déterminer l’infection initiale dans la mesure où les machines infectéesdeviennent à leur tour les sources de cette diffusion.
• Une anomalie relative à un dysfonctionnement applicatif ou protocolaire, à unemauvaise configuration ou un délai de réponse anormal. Dans ce cas un IDSpermet potentiellement de :
◦ Proposer le remplacement de protocoles obsolètes, par exemple en détectantl’utilisation de Telnet (i.e. protocole déprécié) ;
◦ Indiquer à l’administrateur des délais de réponse anormalement long, ce genred’information peut paraître anodin mais peut par exemple révéler l’existenced’une porte dérobé sur l’hôte distant.
En résumé un IDS permet de :
• Collecter et analyser des traces en vu de développer leur force probante lors d’uneintrusion ;
• Alerter et journaliser de manière centralisée la découverte d’intrusion ;
• Agir de manière préventive ou curative aux anomalies.
Baptiste MOINE 3 Projet 4.5
Architecture d’un IDS
Un IDS peut être dé-composé en plusieurs niveaux :
• Le senseur ou sonde, il s’agit du niveau où se passe tout le procédé de collected’information ;
• La source de données, en général il s’agit de captures de trames réseaux ou dejournaux d’événements ;
• Le filtre, il permet à l’administrateur de classer les résultats, en utilisant par exempledes motifs ;
• Le canal de réponse, il permet de faire transiter l’information relevée ;
• La console, elle permet à l’administrateur d’effectuer le monitoring à partir desréponses de l’IDS.
Baptiste MOINE 4 Projet 4.5
Illustration 1: Architecture d'un IDS
Catégories d’IDS
En considèrent les différentes sources de données utilisées pour la détection d’intrusion,une autre classification des IDS peut être utilisée en termes de type d’éléments protégés :
• Le HIDS (« host based IDS »), il utilise les informations d’un seul hôte / système ;
• Le NIDS (« network based IDS »), il exploite l’audit d’un périmètre défini du réseau.
PRÉPARATION DU SYSTÈME
Afin de déployer Suricata, il est possible d’utiliser bon nombre de système d’exploitation.En effet, cette solution faisant partie des plus renommées, celui-ci est maintenu surl’ensemble des distributions les plus utilisées en entreprise (principalement Linux), àsavoir :
• Debian ;
• CentOS ;
• Fedora ;
• OpenSuse ;
• Ubuntu.
Dans notre cas nous utiliserons Debian, notamment pour sa bonne gestion desressources matérielle et sa meilleure capacité d’administration depuis l’implémentation desystemd.
Baptiste MOINE 5 Projet 4.5
Illustration 2: Catégories d’IDS
Configuration de l’accès réseau
Configuration des contrôleurs d’interface réseau :
# cat <<-'EOF' >/etc/network/interfaces
auto lo
iface lo inet loopback
# Configuration IPv4 statique du NIC Ethernet
# Administration
auto eth0
allow-hotplug eth0
iface eth0 inet static
address 10.16.0.35
netmask 255.255.128.0
gateway 10.16.0.1
dns-nameservers 10.16.0.30
# Collecte
auto eth1
allow-hotplug eth1
iface eth1 inet manual
up /etc/network/if-up.d/netconf
EOF
Configuration de la résolution de noms :
# cat <<-'EOF' >/etc/resolv.conf
# DNS GSB
search swiss-galaxy.com
nameserver 10.16.0.30
# DNS OpenNIC project
nameserver 185.83.217.248
nameserver 108.61.210.58
EOF
Baptiste MOINE 6 Projet 4.5
Montage des cartes d’interface réseau :
# ifup eth0
# ifup eth1
Ajout d’un script de configuration du réseau :
# cat <<-'EOF' >/etc/network/if-up.d/netconf
#!/bin/bash
# Promiscuous mode on eth1
ifconfig eth1 promisc up
# IPv4 forwarding (IPS)
# echo '1' >/proc/sys/net/ipv4/ip_forward
# echo '1' >/proc/sys/net/ipv4/conf/all/forwarding
# IPTables rules for NFQUEUE (IPS mode)
# iptables -F
# iptables -t nat -A POSTROUTING -j MASQUERADE
# iptables -A INPUT -i eth1 -j NFQUEUE
# iptables -I FORWARD -j NFQUEUE
# Display rules and exit
# iptables -vnL
exit 0
EOF
# chmod 755 /etc/network/if-up.d/netconf
Baptiste MOINE 7 Projet 4.5
Configuration du gestionnaire de paquet APT
Ajout des sources (dépôts) pour le téléchargement de paquets deb :
# cat <<-'EOF' >/etc/apt/sources.list
# Dépôt de base de Debian Jessie
deb http://httpredir.debian.org/debian/ jessie main contrib
deb-src http://httpredir.debian.org/debian/ jessie main contrib
# Mises à jour distribution stable
deb http://httpredir.debian.org/debian/ jessie-updates main
deb-src http://httpredir.debian.org/debian/ jessie-updates main
# Mises à jour vers distribution stable
deb http://httpredir.debian.org/debian/ jessie-backports main
deb-src http://httpredir.debian.org/debian/ jessie-backports main
# Mises à jour de sécurité
deb http://security.debian.org/ jessie/updates main
deb-src http://security.debian.org/ jessie/updates main
EOF
Téléchargement et installation de la clé GPG (« GNU Privacy Guard ») du dépôt deDebian :
# gpg --keyserver pgpkeys.mit.edu --recv-key 8B48AD6246925553
# gpg -a --export 8B48AD6246925553 | sudo apt-key add -
Mise à niveau des paquets :
# apt-get update
# apt-get -fy upgrade
# apt-get -fy dist-upgrade
Baptiste MOINE 8 Projet 4.5
Préparation de l’espace de travail (Workbench)
Installation d’utilitaires usuels :
# apt-get -fy install curl mercurial git subversion netcat python3.4 vim ntpdate
Configuration de la date et heure en utilisant un service NTP (« Network Time Protocol ») :
# ntpdate 0.fr.pool.ntp.org
Configuration du nom d’hôte :
# export HOSTNAME=suricata
# export DOMAIN=swiss-galaxy.com
# cat <<EOF >/etc/hostname
${HOSTNAME}
EOF
# cat <<EOF >/etc/hosts
127.0.0.1 localhost
10.16.0.35 ${HOSTNAME}.${DOMAIN} ${HOSTNAME}
# IPv6
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
EOF
# hostname ${HOSTNAME}
# hostname -b ${HOSTNAME}
# domainname ${HOSTNAME}.${DOMAIN}
# domainname -b ${HOSTNAME}.${DOMAIN}
# hostnamectl set-hostname ${HOSTNAME}
# systemctl restart networking.service
Baptiste MOINE 9 Projet 4.5
Création d’un utilisateur simple :
# export USR=user
# useradd -u 1337 -UG users -s /bin/bash -d /home/${USR}/ ${USR}
# mkdir -p /home/${USR}
# find /etc/skel/ -mindepth 1 -exec cp -r {} /home/${USR}/ \;
# chown -R 1337:1337 /home/${USR}/
# chmod -R 700 /home/${USR}/
# passwd ${USR}
Ajout de l’utilisateur aux membres du groupe sudo pour l’exécution rapide de tâches entant qu’utilisateur root :
# apt-get install sudo
# usermod -aG sudo
OU (conseillé), suppression de la gestion sudo, l’exécution de commandesd’administrations sensibles ne seront possibles que dans un contexte d’exécutionprivilégié (root) non hérité :
# apt-get purge sudo
Baptiste MOINE 10 Projet 4.5
Installation de OpenSSH-Server
Téléchargement du paquet openssh-server en utilisant le gestionnaire APT :
# apt-get -fy install openssh-server
Arrêt du service en utilisant systemd :
# systemctl stop ssh.service
Génération de nouveaux nombres premiers de 4096 bits pour le Diffie-Hellman GroupExchange : (à défaut d’unité de calcul graphique, cette étape est très coûteuse en termesde temps processeur) :
# ssh-keygen -G /tmp/moduli -b 4096
Test de sûreté et validation des nombres premiers et suppression des nombres premiers :
# ssh-keygen -T /etc/ssh/moduli -f /tmp/moduli
# rm /tmp/moduli
Génération d’un nouveau jeu de clé publique et privée pour le serveur :
# rm /etc/ssh/ssh_host_*key*
# ssh-keygen -N '' -t ed25519 -f /etc/ssh/ssh_host_ed25519_key < /dev/null
# ssh-keygen -N '' -t rsa -b 4096 -f /etc/ssh/ssh_host_rsa_key < /dev/null
Ajout d’un message d’avertissement pour éviter tout problème en cas de procéduresjudiciaires suite à un potentiel piratage ou autre accès non autorisé :
# cat >/etc/issue <<-'EOF'
#############################################
# AVERTISSEMENT: L’accès à ce système est #
# restreint au personnel administratif de #
# Galaxy Swiss Bourdin #
# #
# Tout accès non autorisé constitue une #
# violation sujette à poursuite judiciaire. #
#############################################
EOF
Baptiste MOINE 11 Projet 4.5
Configuration du client
Sauvegarde de la configuration d’origine :
# cp /etc/ssh/ssh_config{,.bak}
Création d’une nouvelle configuration pour l’authentification SSH en tant que client :
# cat <<-'EOF' >/etc/ssh/ssh_config
# Configuration par défaut pour l'authentification sur tous les hôtes
Host *
# Pas d'authentification par mot de passe
PasswordAuthentication no
ChallengeResponseAuthentication no
# Authentification par clés publiques
PubkeyAuthentication yes
# Privilégie l'utilisation de EdDSA (Ed25519) à RSA
IdentityFile ~/.ssh/id_ed25519
IdentityFile ~/.ssh/id_rsa
# Désactive le Roaming (CVE-2016-0777 et CVE-2016-0778)
UseRoaming no
# Variables d'environnement relatives à la langue
SendEnv LANG LC_*
# N'affiche pas les noms d'hôtes en clair
HashKnownHosts yes
# Divers
VisualHostKey yes
EOF
Baptiste MOINE 12 Projet 4.5
Configuration du service
Sauvegarde de la configuration d’origine :
# cp /etc/ssh/sshd_config{,.bak}
Création d’une nouvelle configuration pour le service SSH :
# cat <<-'EOF' >/etc/ssh/sshd_config
#### Réseau ####
# Port d'écoute du service, non standard conseillé afin d'éviter les scans intempestifs (n’augmente en aucun cas le niveau de sécurité !)
Port 22
# Accélération du processus d’authentification pour les clients n’utilisant pasde paramètres DNS valides
UseDNS no
# Utilisation du protocole SSH-2 uniquement
Protocol 2
# Écoute IPv4 uniquement et sur le réseau d'administration
AddressFamily inet
ListenAddress 10.16.0.35
# Désactivation de la redirection du flux Xorg
X11Forwarding no
X11DisplayOffset 10
# Désactive les messages de type TCPKeepAlive, ces messages ne sont pas diffusés dans le canal chiffré
TCPKeepAlive no
# Alternative chiffrée au TCPKeepAlive, désauthentification après 3 min d’inactivité (3*60sec)
ClientAliveInterval 60
ClientAliveCountMax 3
Baptiste MOINE 13 Projet 4.5
#### Clés ####
# Clés d’hôte pour le protocole SSH-2
# Privilégie l’utilisation de EdDSA (Ed25519) à RSA
HostKey /etc/ssh/ssh_host_ed25519_key
HostKey /etc/ssh/ssh_host_rsa_key
# Séparation des privilèges, prévient les exploits de type privilege escalation
UsePrivilegeSeparation yes
UseLogin no
# Authentification par clé publique
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys
#### Authentification ####
# Whitelist
AllowGroups ssh-user
# 30 secondes pour saisir la passphrase
LoginGraceTime 30
# Interdit l'authentification avec un utilisateur root
PermitRootLogin no
# Vérification des permissions sur les fichiers de clés et les répertoires
StrictModes yes
# N’utilise pas les fichiers ~/.rhosts et ~/.shosts
IgnoreRhosts yes
# Pas d’authentification basée sur l’hôte
HostbasedAuthentication no
Baptiste MOINE 14 Projet 4.5
# Ne fait pas confiance en ~/.ssh/known_hosts pour l’authentification RhostsRSAAuthentication
IgnoreUserKnownHosts yes
RSAAuthentication yes
RhostsRSAAuthentication no
# Interdit l’authentification sans mot de passe
PermitEmptyPasswords no
# Utilisation de clés publique/privée pour l’authentification
PasswordAuthentication no
# Désactivation du ChallengeResponse (à activer pour une authentification TOTP)
UsePAM no
ChallengeResponseAuthentication no
#### Divers ####
# Journalisation dans /var/log/auth.log
SyslogFacility AUTH
LogLevel INFO
# Affichage de la dernière connexion
PrintLastLog yes
MaxAuthTries 2
MaxStartups 10:30:60
# Affichage d’une bannière de login
Banner /etc/issue
PrintMotd no
# Autorise les clients à passer des variables locales d’environnement
AcceptEnv LANG LC_*
Subsystem sftp /usr/lib/openssh/sftp-server
EOF
Baptiste MOINE 15 Projet 4.5
Configuration de l’utilisateur
Création d’un groupe et ajout de l’utilisateur autorisé pour l’authentification sur le serviceSSH (voir Whitelist) :
# groupadd ssh-user
# usermod -aG ssh-user user
Création des jeux de clés (depuis le client) :
# mkdir ~/.ssh
# cd ~/.ssh
# ssh-keygen -t ed25519 -f ~/.ssh/[email protected]_ed25519
# ssh-keygen -t rsa -b 4096 -f ~/.ssh/[email protected]_rsa
# cat ~/.ssh/[email protected]_{ed25519,rsa}.pub
Mise à jour des clés publiques pour l’utilisateur (depuis le serveur) :
# mkdir /home/user/.ssh/
# cd /home/user/.ssh/
# cat <<-'EOF' >/home/user/.ssh/authorized_keys
<contenu de [email protected]_ed25519.pub>
<contenu de [email protected]_rsa.pub>
EOF
# chown -R user:user /home/user/.ssh/
# chmod 0500 /home/user/.ssh/
# chmod 0400 /home/user/.ssh/authorized_keys
Redémarrage du service OpenSSH (depuis le serveur) :
# systemctl restart ssh.service
Suppression des clés publiques (depuis le client) :
# chmod -R 0700 ~/.ssh
# rm ~/.ssh/[email protected]_{ed25519,rsa}.pub
Baptiste MOINE 16 Projet 4.5
Configuration de l’authentification client (depuis le client) :
# cat <<-'EOF' >~/.ssh/config
Host suricata.swiss-galaxy.com
User user
IdentityFile ~/.ssh/[email protected]_ed25519
EOF
# touch ~/.ssh/known_hosts
# chmod 0500 ~/.ssh
# chmod 0700 ~/.ssh/known_hosts
# chmod 0400 ~/.ssh/[email protected]_ed25519
# chmod 0400 ~/.ssh/[email protected]_rsa
# chmod 0400 ~/.ssh/config
Test et validation de l’authentification par clé publique (depuis le client) :
# ssh suricata.swiss-galaxy.com
Baptiste MOINE 17 Projet 4.5
INSTALLATION DE SURICATA
Installation de la chaîne de compilation
Afin de compiler Suricata ainsi que ses dépendances, il est nécessaire d’installer sur lesystème, une chaîne de compilation.
Analyseurs lexicaux et syntaxiques
Composantes du début de la chaîne de compilation, les analyseurs consistent àdécomposer les chaînes de caractères en entités lexicales (« tokens ») en se basant surdes expressions rationnelles, définissant des séquences de caractères autorisés. Ceprocessus s’appelle la segmentation (« tokenization »). Les plus utilisés sont :
• GNU Bison : Compilateur de compilateur chargé de l’analyse sémantique etsyntaxique ;
• Flex : Analyseur de motifs lexicaux.
Installation
# apt-get -fy install flex bison
Autotools
Autotools désigne un ensemble d’outils de build du projet GNU, parmi lesquels :
• GNU Make : Fournit une aide à la compilation et à l’édition de liens par la créationde fichier de description d’installation des dépendances appelés makefile ;
• GNU AutoMake : Permet la génération d’un makefile à partir d’une description deplus haut niveau ;
• GNU AutoConf : Permet la génération d’un script shell de configuration del’environnement de développement « configure » à partir de programmes basés surle préprocesseur GNU M4 ;
• GNU LibTool : Utilisé avec AutoConf et AutoMake afin de simplifier le processus decompilation, indépendamment du système utilisé, par la création de bibliothèquesdynamiques dépendantes au processus d’installation ;
• GNU AutoGen : Fournit une approche similaire à Flex dans la génération defichiers makefile.
Installation
# apt-get -fy install make automake autoconf libtool autogen m4
Baptiste MOINE 18 Projet 4.5
Compilateur
Le compilateur GCC (« GNU Compiler Collection ») est un ensemble de compilateurnotamment utilisé pour le langage C et C++. En complément de cette bibliothèque decompilation, il est parfois nécessaire d’installer d’autre outils pouvant être utilisées dans lachaîne de compilation :
• GNU BinUtils : Ensemble d’outils permettant la création et la gestion deprogrammes binaires et sources assembleur ;
• GNU Debugger : Fournit une large ensemble d’outils pour tracer ou altérerl’exécution d’un programme (debugging) ;
• GNU C++ : Compilateur pour C++.
Installation
# apt-get -fy install binutils gcc g++ gdb build-essential linux-headers-$(uname -r)
Installation des dépendances
Afin de fonctionner, Suricata se base principalement sur 5 bibliothèques (libraries) :
• LibPCRE : Fournit des fonctions pour la gestion d’expressions rationnelles baséessur PCRE (« Perl Compatible Regular Expressions ») ;
• LibPCap : Fournit des fonctions pour la capture de trafic réseau ;
• LibNet : Fournit des fonctions d’interaction réseau bas-niveau telles que lamanipulation de tables (e.g. ARP, routage), pare-feu (e.g. ipchains, ipfw), IPtunnelling, etc ;
• LibYAML : Fournit des fonctions de traitement de données en utilisant le standardde forme YAML ;
• LibNetFilter : Fournit des fonctions d’interaction avec le pare-feu du noyau,composant essentiel pour la configuration de Suricata en mode IPS ;
• Zlib : Fournit des fonctions pour la compression / décompression de données ;
• LibJansson : Fournit des fonctions pour le traitement de données utilisant le formatJSON (JavaScript Object Notation).
Installation
# apt-get -fy install libpcre3 libpcre3-dbg libpcre3-dev libpcap-dev libnet1-dev libyaml-0-2 libyaml-dev libnetfilter-queue-dev zlib1g zlib1g-dev libmagic-dev libcap-ng-dev libjansson-dev pkg-config magic coccinelle
Baptiste MOINE 19 Projet 4.5
Compilation de Suricata
# cd /tmp/
# git clone git://phalanx.openinfosecfoundation.org/oisf.git
# cd oisf/
# git clone https://github.com/ironbee/libhtp
# ./autogen.sh
Installation de Suricata en inline mode dans /usr/bin/suricata, les fichiers de configurationseront dans le répertoire /etc/suricata et les journaux dans /var/log/suricata :
# ./configure --enable-nfqueue --prefix=/usr --sysconfdir=/etc --localstatedir=/var
# make
# make install
Reconfiguration du chargeur des bibliothèques partagées :
# ldconfig
Création d’un nouvel utilisateur dédié à l’exécution du service :
# groupadd suricata
# useradd -g suricata -s /bin/false suricata
Création du répertoire de stockage des journaux d’événements :
# mkdir /var/log/suricata
# chown suricata:suricata /var/log/suricata
Création de répertoire de stockage des règles :
# mkdir -p /etc/suricata/rules
Baptiste MOINE 20 Projet 4.5
Configuration de Suricata
Création des fichiers de configuration :
# cp {suricata.yaml,classification.config,reference.config} /etc/suricata/
# touch /etc/suricata/threshold.config
Modification du fichier de configuration suricata.yaml
# vim /etc/suricata/suricata.yaml
Désactivation des règles permettant l’envoie d’alertes au SIEM (« Security Information &Event Management System ») Prelude :
# alert output to prelude (http://www.prelude-technologies.com/) only
# available if Suricata has been compiled with --enable-prelude
# - alert-prelude:
# enabled: no
# profile: suricata
# log-packet-content: no
# log-packet-header: yes
Note : Pour commenter un bloc de texte, en utilisant vim :
• Appuyer sur CTRL+v pour passer en mode sélection de bloc visuel ;
• Sélectionner le premier caractère de chacune des lignes du bloc de texte àcommenter en descendant (touche j) ou en montant (touche k) ;
• Passer en mode insertion en pressant la touche I (i majuscule) ;
• Commenter la ligne avec le caractère approprié (# en général) ;
• Quitter le mode d’insertion en pressant la touche ÉCHAP.
Configuration du contexte d’exécution utilisateur du service :
# Run suricata as user and group.
run-as:
user: suricata
group: suricata
Baptiste MOINE 21 Projet 4.5
Modification des variables locales de Suricata :
# Holds the address group vars that would be passed in a Signature.
# These would be retrieved during the Signature address parsing stage.
address-groups:
HOME_NET: "10.16.0.0/17"
Configuration des flux de journalisation :
# Define your logging outputs. If none are defined, or they are all
# disabled you will get the default - console output.
outputs:
- console:
enabled: yes
- file:
enabled: yes
filename: /var/log/suricata/suricata.log
Configuration des flux de sortie pour Barnyard2 :
# alert output for use with Barnyard2
- unified2-alert:
enabled: yes
filename: unified2.alert
Ajout de règles à Suricata
Afin de commencer sur une base saine et pouvoir mieux appréhender le fonctionnementintrinsèque de Suricata ainsi que la syntaxe utilisée pour la création de ses règles, nousallons commencer par utiliser un package de règles pré-établies et si besoin est, lesmodifier par la suite :
# cd /tmp/
# wget http://rules.emergingthreats.net/open/suricata/emerging.rules.tar.gz
# tar xvfz emerging.rules.tar.gz
# mv /tmp/rules/*.rules /etc/suricata/rules/
# chown -R suricata:suricata /etc/suricata/
Baptiste MOINE 22 Projet 4.5
INSTALLATION DE SNORBY
Installation de Ruby
Installation de Ruby en utilisant le serveur subversion RVM :
# curl -#LO https://rvm.io/mpapis.asc
# gpg --import mpapis.asc
# curl -sSL https://get.rvm.io | bash -s stable --quiet-curl --ruby=1.9.3
# source /usr/local/rvm/scripts/rvm
Validation des pré-requis :
# rvm requirements
Ajout de Ruby à la variable d’environnement PATH (remarque : ajout dans /etc/profilepossible) :
# export PATH=/usr/local/rvm/gems/ruby-1.9.3-p551/bin:$PATH
# rvm use ruby-1.9.3-p551
Mise à jour de rdoc (corrige des problèmes d’encodage dans Ruby on Rails) :
# gem update rdoc
# gem rdoc --all --overwrite
Baptiste MOINE 23 Projet 4.5
Installation des dépendances supplémentaires
Ajout du dépôt de Wheezy comme nouvelle source pour APT :
# cat <<-'EOF' >>/etc/apt/sources.list
# Dépôt de base de Debian Wheezy
deb http://httpredir.debian.org/debian/ wheezy main
deb-src http://httpredir.debian.org/debian/ wheezy main
EOF
Mise à jour des caches APT :
# apt-get update
Installation des dépendances :
# apt-get -fy install libssl-dev libreadline6-dev libsqlite3-dev libsqlite3-ruby1.9.1 ruby1.9.3 libxml++2.6-dev libxml2-dev imagemagick libmagickwand-dev openjdk-7-jdk ghostscript graphviz-dev libfftw3-dev libgv-ruby libjpeg-dev ruby-dev ttf-dejavu unzip xorg libcrypt-ssleay-perl libwww-perl libyaml-dev openssl libcurl4-openssl-dev libxslt1-dev libxslt-dev wkhtmltopdf default-jre-headless
# wget https://aws-eu-cache01.rubygems.org/gems/text-hyphen-1.2.gem
# gem install --force --local text-hyphen-1.2.gem
# export LD_LIBRARY="/usr/lib/*-linux-gnu"
# wget https://aws-eu-cache01.rubygems.org/gems/text-format-1.0.0.gem
# gem install --force text-format-1.0.0.gem
# mkdir -p /usr/src/PGM/BUILD/libxml/
# cd /usr/src/PGM/BUILD/libxml/
# wget ftp://xmlsoft.org/libxml2/libxml2-2.8.0.tar.gz
# tar xvzf libxml2-2.8.0.tar.gz
# cd /usr/include
# gem install nokogiri -v '1.5.9' -- --with-xml2-include=/usr/src/PGM/BUILD/libxml/libxml2-2.8.0/include ./INS_NOKO
# gem install thor i18n bundler tzinfo builder memcache-client rack rack-test erubis mail rack-mount sqlite3 rails activesupport
# gem install rake --version=0.9.2
# gem install net-ssh -v 2.2.2 --no-ri --no-rdoc
# gem install do_mysql -v '0.10.12'
# gem install arel ezprint
# gem install dm-rails -v 1.2.1
# gem install bundler -v 1.2.1
Baptiste MOINE 24 Projet 4.5
Installation de Apache
Installation de Apache et PHP en utilisant le gestionnaire de paquet APT :
# apt-get -fy install apache2 php5 php5-common php5-mysql libapache2-mod-php5
Arrêt du service Apache :
# systemctl stop apache2.service
Configuration de Apache :
# cat <<-'EOF' >/etc/apache2/sites-enabled/000-default.conf
ServerName localhost
<VirtualHost *:80>
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
EOF
Création d’une nouvelle arborescence WWW :
# rm -rf /var/www/*
# mkdir -p /var/www/html
# chown www-data:www-data /var/www/html
Démarrage du service :
# systemctl start apache2.service
Baptiste MOINE 25 Projet 4.5
Installation de MySQL
Installation de MySQL en utilisant le gestionnaire de paquet APT :
# apt-get -fy install mysql-server mysql-client libmysqlclient-dev
Arrêt du service MySQL :
# systemctl stop mysql.service
Configuration de MySQL :
# mv /etc/mysql/conf.d/mysqld_safe_syslog.cnf{,.bak}
# cat <<-'EOF' >>/etc/mysql/my.cnf
[mysqld_safe]
log_error=/var/log/mysql/mysql-error.log
[mysqld]
log_error=/var/log/mysql/mysql_error.log
general_log_file=/var/log/mysql/mysql.log
general_log=1
log_slow_queries=/var/log/mysql-slow.log
long_query_time=2
log-queries-not-using-indexes
EOF
Création des fichiers pour la journalisation d’événements de MySQL :
# touch /var/log/mysql/mysql{,-slow,-error}.log
# chown -Rf mysql /var/log/mysql
Configuration de l’utilisateur et de la base de données pour Suricata :
# mysql -u root -p
mysql> CREATE DATABASE snorby DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
mysql> CREATE USER 'snorby'@'localhost' IDENTIFIED BY 'sMKn@6jE';
mysql> GRANT ALL PRIVILEGES ON snorby.* TO 'snorby'@'localhost' WITH GRANT OPTION;
Baptiste MOINE 26 Projet 4.5
Installation de Snorby
Suite à de nombreux essais pour la compilation et l’utilisation de snorby, plusieursproblèmes ont été rencontrés (e.g. failles XSS, gestion de version et référencesincorrectes, erreurs de syntaxe). J’ai donc pris l’initiative d’apporter ma contribution (e.g.Updates by Creased · Pull Request #425) au projet en corrigeant moi-même ces erreursde conceptions.
En attendant l’approbation de la part de l’équipe de développement du projet, ces commitrestent au statut de pull request (Request for Comments) et n’est donc, pour l’heure, pasune composante du projet officiel, il est cependant possible d’exploiter le contenu de cePR pour mettre à jour le contenu de la base de fichiers locale :
# git clone https://github.com/Snorby/snorby.git
# cd /var/www/snorby/
# git pull origin pull/425/head
Vérification des modifications :
# git reflog
f8b0794 HEAD@{0}: pull origin pull/425/head: Fast-forward
94c7f18 HEAD@{1}: clone: from https://github.com/Snorby/snorby.git
# git log 94c7f18..f8b0794 --format="format:Commit hash: %C(green)%h%C(reset)%nAuthor: %C(yellow)%aN <%aE>%C(reset)%nSubject: %C(cyan)%s%C(reset)%nCommitDate: %C(red)%cd%C(reset)%n"
Commit hash: f8b0794
Author: Baptiste MOINE <[email protected]>
Subject: Update Gemfile.lock
CommitDate: Thu Mar 17 16:57:27 2016 +0100
[...]
Commit hash: 29dda93
Author: Baptiste MOINE <[email protected]>
Subject: Update Ruby version requirement
CommitDate: Thu Mar 17 14:00:46 2016 +0100
OU, en utilisant mon fork :
# git clone https://github.com/Creased/snorby.git
Baptiste MOINE 27 Projet 4.5
Configuration de Snorby :
# cd /var/www/snorby/config/
# mv database.yml{.example,}
# mv snorby_config.yml{.example,}
# sed -i s/"\/usr\/local\/bin\/wkhtmltopdf"/"\/usr\/bin\/wkhtmltopdf"/g snorby_config.yml
# cat <<-'EOF' >/var/www/snorby/config/database.yml
# Snorby Database Configuration
#
# Please set your database password/user below
# NOTE: Indentation is important.
#
snorby: &snorby
adapter: mysql
username: snorby
password: "sMKn@6jE"
host: localhost
development:
database: snorby
<<: *snorby
test:
database: snorby
<<: *snorby
production:
database: snorby
<<: *snorby
EOF
Installation de Snorby :
# cd /var/www/snorby/
# bundle install --deployment --path vendor/cache
Baptiste MOINE 28 Projet 4.5
Tel qu’indiqué dans le commit #8b7a905, j’ai conseillé la modification de certains scriptstels que ezprint, afin de corriger des erreurs syntaxiques :
# sed -i 's/\(^.*\)\(Mime::Type.register.*application\/pdf.*$\)/\1if Mime::Type.lookup_by_extension(:pdf) != "application\/pdf"\n\1 \2\n\1end/' vendor/cache/ruby/*.*.*/bundler/gems/ezprint-*/lib/ezprint/railtie.rb
# sed -i 's/\(^.*\)\(Mime::Type.register.*application\/pdf.*$\)/\1if Mime::Type.lookup_by_extension(:pdf) != "application\/pdf"\n\1 \2\n\1end/' vendor/cache/ruby/*.*.*/gems/actionpack-*/lib/action_dispatch/http/mime_types.rb
# sed -i 's/\(^.*\)\(Mime::Type.register.*application\/pdf.*$\)/\1if Mime::Type.lookup_by_extension(:pdf) != "application\/pdf"\n\1 \2\n\1end/' vendor/cache/ruby/*.*.*/gems/railties-*/guides/source/action_controller_overview.textile
Configuration de la messagerie électronique pour l’envoi d’alertes :
# cat <<-'EOF' >/var/www/snorby/config/initializers/mail_config.rb
ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.smtp_settings = {
:address => "bluemind.swiss-galaxy.com",
:port => 587,
:domain => "swiss-galaxy.com",
:user_name => "ids",
:password => "5ur1cAt@",
:authentication => "plain",
:enable_starttls_auto => true
}
ActionMailer::Base.delivery_method = :sendmail
ActionMailer::Base.sendmail_settings = {
:location => '/usr/sbin/sendmail',
:arguments => '-i -t'
}
ActionMailer::Base.perform_deliveries = true
ActionMailer::Base.raise_delivery_errors = true
ActionMailer::Base.perform_deliveries = true
ActionMailer::Base.raise_delivery_errors = true
# Mail.register_interceptor(DevelopmentMailInterceptor) if Rails.env.development?
EOF
Installation des configurations de Snorby :
# bundle exec rake snorby:setup
Baptiste MOINE 29 Projet 4.5
Installation de la passerelle Apache
Snorby étant principalement développé en Ruby, son interfaçage avec Apache doit êtrefait avec une passerelle.
Installation des composants supplémentaires :
# apt-get -fy install apache2-dev apache2.2-common libapr1-dev libaprutil1-dev libcurl4-openssl-dev
Arrêt du service Apache :
# systemctl stop apache2.service
Installation de la passerelle :
# gem install passenger --no-ri --no-rdoc
# /usr/local/rvm/gems/ruby-1.9.3-p551/bin/passenger-install-apache2-module -a
Ajout du module dans Apache :
# cat <<-'EOF' >/etc/apache2/mods-available/passenger.load
LoadModule passenger_module `find /usr/local/rvm/gems/ -type f -name "*mod_passenger*.so" | head -n1`
<IfModule mod_passenger.c>
PassengerRoot `find /usr/local/rvm/gems/ -type d -name "passenger-*" | head -n1`
PassengerRuby /usr/local/rvm/rubies/ruby-1.9.3-p551/bin/ruby
</IfModule>
EOF
Activation des modules tiers :
# a2enmod passenger
# a2enmod rewrite
# a2enmod ssl
Démarrage du service Apache :
# systemctl start apache2.service
Baptiste MOINE 30 Projet 4.5
A présent, il est possible de se rendre sur la console de Snorby tel que présenté surl'Illustration 3.
Les identifiants sont par défaut (Il est préférable de les modifier) :
• Email : [email protected]
• Password : snorby
Ici on les remplacera par :
• Email: [email protected]
• Password : admini
Baptiste MOINE 31 Projet 4.5
Illustration 3: Page d'authentification de Snorby
INSTALLATION DE BARNYARD2
Compilation des dépendances :
# cd /usr/src/
# wget http://www.tcpdump.org/release/libpcap-1.7.4.tar.gz
# tar xvzf libpcap-1.7.4.tar.gz
# cd libpcap-1.7.4/
# ./configure "CFLAGS=-fPIC -g -O2" --prefix=/usr --enable-shared
# make
# make install
# cd /usr/src/
# wget https://libdnet.googlecode.com/files/libdnet-1.12.tgz
# tar zxf libdnet-1.12.tgz
# cd libdnet-1.12/
# ./configure "CFLAGS=-fPIC -g -O2" --prefix=/usr --enable-shared
# make
# make install
# cd /usr/src/
# git clone https://github.com/luigirizzo/netmap
# cd netmap/LINUX/
# ./configure --no-drivers
# make
# make install
# cd /usr/src/
# wget https://www.snort.org/downloads/snort/daq-2.0.6.tar.gz
# tar xzvf daq-2.0.6.tar.gz
# cd daq-2.0.6/
# ./configure "CFLAGS=-fPIC -g -O2" --disable-ipq-module --disable-ipfw-module --disable-afpacket-module --disable-dump-module --with-libpcap-includes=/usr/include/libnetfilter_queue --with-libpcap-libraries=/usr/lib --with-pic
# make
# make install
Baptiste MOINE 32 Projet 4.5
Compilation de Barnyard2 :
# cd /usr/src/
# git clone https://github.com/firnsy/barnyard2.git
# cd barnyard2
# ./autogen.sh
# ./configure --with-mysql-libraries=/usr/lib/*-linux-gnu
# make
# make install
Configuration de Barnyard2 :
# cp /usr/src/barnyard2/etc/barnyard2.conf /etc/suricata/
# sed -i 's/\(^config reference_file:\s*\/etc\/\)snort\(\/reference.config$\)/\1suricata\2/' /etc/suricata/barnyard2.conf
# sed -i 's/\(^config classification_file:\s*\/etc\/\)snort\(\/classification.config$\)/\1suricata\2/' /etc/suricata/barnyard2.conf
# sed -i 's/\(^config gen_file:\s*\/etc\/\)snort\(\/gen-msg.map$\)/\1suricata\/rules\2/' /etc/suricata/barnyard2.conf
# sed -i 's/\(^config sid_file:\s*\/etc\/\)snort\(\/sid-msg.map$\)/\1suricata\/rules\2/' /etc/suricata/barnyard2.conf
# sed -i 's/^#\(config waldo_file:\s*\).*$/\1\/var\/log\/suricata\/suricata.waldo/' /etc/suricata/barnyard2.conf
# sed -i 's/^#\(\s*output database: log, mysql, user=\).*\(\spassword=\).*\(\sdbname=\).*\(\shost=\).*$/\1snorby\2sMKn@6jE\3snorby\4localhost/' /etc/suricata/barnyard2.conf
# sed -i 's/^#\(config interface:\s*\).*$/\1eth1/' /etc/suricata/barnyard2.conf
Création de l’arborescence de journalisation :
# mkdir /var/log/barnyard2
# touch /var/log/suricata/suricata.waldo
Ajout des filtres pour Barnyard2 :
# wget http://rules.emergingthreats.net/open/suricata/rules/sid-msg.map -O /etc/suricata/rules/sid-msg.map
# wget http://rules.emergingthreats.net/open/suricata/rules/gen-msg.map -O /etc/suricata/rules/gen-msg.map
Baptiste MOINE 33 Projet 4.5
DÉMARRAGE MANUEL DES SERVICES
La pile IDS étant composée, nous pouvons démarrer chacun des services manuellementen mode daemon pour vérifier leurs fonctionnements :
# cd /var/www/snorby/
# bundle exec rails server -e production -d # Démarrage de Snorby
# suricata -c /etc/suricata/suricata.yaml -i eth1 -D # Démarrage de Suricata
# barnyard2 -c /etc/suricata/barnyard2.conf -d /var/log/suricata -f unified2.alert -w /var/log/suricata/suricata.waldo -D # Démarrage de Barnyard2
DÉMARRAGE AUTOMATIQUE DES SERVICES
À défaut de scripts de démarrage pour chacun des services composant cette pile, j’aiprocédé à l’écriture des scripts pour la gestion de ces différents services.
Chacun des fichiers nécessaires à la mise en place de ces services sous SystemD sonttéléchargeables depuis mon registre GitHUB.
Application des scripts au système :
# cd /tmp/
# git clone https://github.com/Creased/ids-services.git
# cd ids-services/
Copie des configurations :
# cp ./etc/default/{barnyard2,snorby,suricata} /etc/default/
# chmod 644 /etc/default/{barnyard2,snorby,suricata}
Copie des scripts :
# cp ./usr/sbin/{barnyard2,snorby}.sh /usr/sbin/
# chmod 755 /usr/sbin/{barnyard2,snorby}.sh
# cp ./etc/init.d/suricata /etc/init.d/
# chmod 755 /etc/init.d/suricata
Copie et activation des services dans SystemD :
# cp ./etc/systemd/system/{barnyard2,snorby}.service /etc/systemd/system/
# systemctl enable barnyard2.service
# systemctl enable snorby.service
# systemctl enable suricata.service
Baptiste MOINE 34 Projet 4.5
MISE À JOUR DES SIGNATURES AVEC OINKMASTER
Oinkmaster est un outil destiné à simplifier la gestion des signatures. Même s’il est conçupour Snort, il peut également fonctionner pour Suricata.
Installation de OinkMaster en utilisant le dépôt Debian :
# apt-get install oinkmaster
Configuration de OinkMaster par l’ajout d’un URI pour la récupération des signaturesdepuis EmergingThreats :
# sed -i 's/^# \(url =\) http:\/\/www\.emergingthreats\.net\/rules\/emerging\.rules\.tar\.gz/\1 http:\/\/rules.emergingthreats.net\/open\/suricata\/emerging.rules.tar.gz/' /etc/oinkmaster.conf
Mise à jour de la configuration de Suricata afin de s’assurer que chacune des règles seraprise en compte suite à la mise à jour :
# vim /etc/suricata/suricata.yaml
Remplacer :
classification-file: /etc/suricata/classification.config
reference-config-file: /etc/suricata/reference.config
par :
classification-file: /etc/suricata/rules/classification.config
reference-config-file: /etc/suricata/rules/reference.config
Au besoin, mettre à jour la liste des règles utilisées par Suricata :
rule-files:
- botcc.rules
- ciarmy.rules
- compromised.rules
- drop.rules
- dshield.rules
- emerging-activex.rules
- emerging-attack_response.rules
- emerging-chat.rules
Baptiste MOINE 35 Projet 4.5
- emerging-current_events.rules
- emerging-dns.rules
- emerging-dos.rules
- emerging-exploit.rules
- emerging-ftp.rules
- emerging-games.rules
- emerging-icmp_info.rules
# - emerging-icmp.rules
- emerging-imap.rules
- emerging-inappropriate.rules
- emerging-malware.rules
- emerging-misc.rules
- emerging-mobile_malware.rules
- emerging-netbios.rules
- emerging-p2p.rules
- emerging-policy.rules
- emerging-pop3.rules
- emerging-rpc.rules
- emerging-scada.rules
- emerging-scan.rules
- emerging-shellcode.rules
- emerging-smtp.rules
- emerging-snmp.rules
- emerging-sql.rules
- emerging-telnet.rules
- emerging-tftp.rules
- emerging-trojan.rules
- emerging-user_agents.rules
- emerging-voip.rules
- emerging-web_client.rules
- emerging-web_server.rules
- emerging-web_specific_apps.rules
- emerging-worm.rules
- tor.rules
- decoder-events.rules # available in suricata sources under rules dir
- stream-events.rules # available in suricata sources under rules dir
- http-events.rules # available in suricata sources under rules dir
- smtp-events.rules # available in suricata sources under rules dir
Baptiste MOINE 36 Projet 4.5
# - dns-events.rules # available in suricata sources under rules dir
- tls-events.rules # available in suricata sources under rules dir
# - modbus-events.rules # available in suricata sources under rules dir
# - app-layer-events.rules # available in suricata sources under rules dir
Il est également possible de désactiver une catégorie, simplement en commutant lesymbole de commentaire (« # ») devant la catégorie concernée, par exemple :
# - app-layer-events.rules # Catégorie désactivée
Cependant, il est également possible de désactiver une règle spécifique sans pour autanten désactiver la catégorie, ainsi il sera nécessaire de récupérer son identifiant (sid pour« Signature IDentifier ») et ajouter une instruction dans le fichier de configuration deOinkMaster, par exemple :
# cat <<-'EOF' >>/etc/oinkmaster.conf
disablesid 2008983 # Désactivation de la signature « BlackSun » de emerging-user_agents.rules
EOF
Téléchargement initial manuel des règles :
# oinkmaster -C /etc/oinkmaster.conf -o /etc/suricata/rules/
Ajout d’une règle dans la Crontab pour l’automatisation de cette tâche :
# crontab -e -u suricata
00 00 * * * oinkmaster -C /etc/oinkmaster.conf -o /etc/suricata/rules/ &>/dev/null 2>&1
Baptiste MOINE 37 Projet 4.5