Cet article décrit la détection d'intrusion de Snort comme une mesure de sécurité pour Linux.
Snort est un IDS en réseau open source. Il peut être utilisé gratuitement sous la GPL (GNU General Public License).
Il est toujours en cours de développement, vous pouvez donc télécharger et utiliser gratuitement le dernier jeu de règles.
Snort est fourni dans la source, vous devez donc télécharger et maik la source.
Par conséquent, si une bibliothèque qui dépend fortement de l'environnement n'est pas installée, une erreur se produira dans configure et vous devrez vérifier la dépendance et l'installer vous-même.
Dans cet article, j'expliquerai comment construire Snort en utilisant CentOS 7 comme exemple. La version de Snort etc. est la version au moment de la rédaction de cet article.
Environnement de cet article: CentOS Linux version 7.7.1908 (Core)
Snort
# cd /usr/local/src/
--Télécharger Snort
# wget https://www.snort.org/downloads/snort/snort-2.9.16.tar.gz
# tar xzvf snort-2.9.16.tar.gz
# cd snort-2.9.16
# ./coonfigure
** J'obtiens une erreur lorsque j'exécute configure
sur CentOS 7 avec une configuration minimale installée.
Ce qui suit décrit comment installer les bibliothèques requises pour les erreurs qui se produisent après l'exécution de configure
dans le répertoire Snort. ** **
Libpcap
checking for pcap_datalink in -lpcap... no
checking pfring.h usability... no
checking pfring.h presence... no
checking for pfring.h... no
checking for pfring_open in -lpfring... no
checking for pfring_open in -lpcap... no
ERROR! Libpcap library/headers (libpcap.a (or .so)/pcap.h)
not found, go get it from http://www.tcpdump.org
or use the --with-libpcap-* options, if you have it installed
in unusual place. Also check if your libpcap depends on another
shared library that may be installed in an unusual place
--Télécharger libpcap
# wget http://www.tcpdump.org/release/libpcap-1.9.1.tar.gz
# tar xzvf libpcap-1.9.1.tar.gz
# cd libpcap-1.9.1
# ./configure
# make
# make install
Libpcre
./configure: line 15614: pcre-config: command not found
./configure: line 15620: pcre-config: command not found
checking pcre.h usability... no
checking pcre.h presence... no
checking for pcre.h... no
ERROR! Libpcre header not found.
Get it from http://www.pcre.org
--Télécharger pcre
# wget ftp://ftp.pcre.org/pub/pcre/pcre2-10.34.tar.gz
# tar xzvf pcre2-10.34.tar.gz
# cd pcre2-10.34
# ./configure
# make
# make install
pcre-devel
./configure: line 15614: pcre-config: command not found
./configure: line 15620: pcre-config: command not found
checking pcre.h usability... no
checking pcre.h presence... no
checking for pcre.h... no
ERROR! Libpcre header not found.
Get it from http://www.pcre.org
--Installation de pcre-devel
# yum install -y pcre-devel
dnet header
checking for SHA256_Init in -lcrypto... no
checking for MD5_Init in -lcrypto... no
checking dnet.h usability... no
checking dnet.h presence... no
checking for dnet.h... no
checking dumbnet.h usability... no
checking dumbnet.h presence... no
checking for dumbnet.h... no
ERROR! dnet header not found, go get it from
http://code.google.com/p/libdnet/ or use the --with-dnet-*
options, if you have it installed in an unusual place
--Installation de libdnet et libdnet-devel
# yum install -y libdnet libdnet-devel
daq
./configure: line 16267: daq-modules-config: command not found
checking for daq_load_modules in -ldaq_static... no
ERROR! daq_static library not found, go get it from
http://www.snort.org/.
--Télécharger daq
# wget https://www.snort.org/downloads/snort/daq-2.0.7.tar.gz
# tar xzvf daq-2.0.7.tar.gz
# cd daq-2.0.7
# ./configure
# make
Une erreur s'est produite dans make, alors exécutez ʻautoreconf` et compilez à nouveau
CDPATH="${ZSH_VERSION+.}:" && cd . && /bin/sh /usr/local/src/daq-2.0.7/missing aclocal-1.15 -I m4
/usr/local/src/daq-2.0.7/missing:Ligne 81: aclocal-1.15:Commande non trouvée
WARNING: 'aclocal-1.15' is missing on your system.
You should only need it if you modified 'acinclude.m4' or
'configure.ac' or m4 files included by 'configure.ac'.
The 'aclocal' program is part of the GNU Automake package:
<http://www.gnu.org/software/automake>
It also requires GNU Autoconf, GNU m4 and Perl in order to run:
<http://www.gnu.org/software/autoconf>
<http://www.gnu.org/software/m4/>
<http://www.perl.org/>
make: *** [aclocal.m4]Erreur 127
# autoreconf
# ./configure
# make
# make install
zlib
checking zlib.h usability... no
checking zlib.h presence... no
checking for zlib.h... no
ERROR! zlib header not found, go get it from
http://www.zlib.net
--installation de zlib
# yum install -y zlib zlib-devel
LuaJIT
checking for luajit... no
ERROR! LuaJIT library not found. Go get it from http://www.luajit.org/ (or)
Try compiling without openAppId using '--disable-open-appid'
configure: error: "Fatal!"
--Installation de LuaJIT-devel
# yum install -y luajit-devel.x86_64
openssl-devel
checking openssl/x509.h usability... no
checking openssl/x509.h presence... no
checking for openssl/x509.h... no
ERROR! openssl/x509.h or openssl library not found.
Try compiling without openAppId using '--disable-open-appid'
configure: error: "Fatal!"
--Installation de openssl-devel
# yum install openssl-devel.x86_64
Dans l'environnement de cet article, une fois l'installation de openssl-devel terminée, le configure
de Snort s'est finalement terminé normalement. Ce qui suit est en cours d'exécution dans le répertoire Snort.
# ./configure
# make
# make install
Après avoir installé Snort, certains paramètres sont nécessaires pour utiliser Snort.
Ensuite, lorsque vous utilisez la commande cp
, elle est exécutée dans le répertoire / usr / local / src / snort-2.9.16
.
--Utilisateur créé
# useradd snort
Le fichier / etc / sysconfig / snort
configure le service.
--Copie de snort.sysconfig
# cp rpm/snort.sysconfig /etc/sysconfig/snort
--Modifier snort.sysconfig
# vi /etc/sysconfig/snort
Remplacez la valeur de INTERFACE par la valeur de l'interface que vous utilisez.
< INTERFACE=eth0
---
> INTERFACE=enp0s8
Le chemin d'exécution du script de démarrage par défaut est / usr / sbin / snort
. Créez un lien symbolique car il est différent du chemin d'installation.
--Création d'un script de démarrage
# cp rpm/snortd /etc/init.d/
# chmod 755 /etc/init.d/snortd
--Création d'un lien symbolique
# ln -s /usr/local/bin/snort /usr/sbin/snort
Généralement, dans les logiciels de sécurité et IDS, le modèle d'accès caractéristique d'un attaquant est appelé une signature. Snort détecte les paquets malveillants en se référant à la signature décrite dans l'ensemble de règles (fichier de règles). La version communautaire du jeu de règles sur le site officiel est gratuite.
--Télécharger l'ensemble de règles
# cd /tmp
# wget https://www.snort.org/downloads/community/community-rules.tar.gz
# tar xzvf community-rules.tar.gz
# cd community-rules
--Création d'un répertoire
# mkdir -p /etc/snort/rules
--Copie de sid-msg.map
# cp sid-msg.map /etc/snort/
# cp community.rules /etc/snort/rules/
--Changement d'autorisation
# chown -R snort.snort /etc/snort
--Création d'un répertoire
# mkdir /var/log/snor
--Changement d'autorisation
# chown -R snort.snort /var/log/snort
--Copie de snort.logrotate
# cd /usr/local/src/snort-2.9.16
# cp rpm/snort.logrotate /etc/logrotate.d/snort
Le fichier / etc / snort / snort.conf
est le fichier de paramétrage de l'opération.
--Modifier snort.conf
# vi /etc/snort/snort.conf
Modifiez la valeur de ** ipvar HOME_NET ** pour spécifier le réseau à surveiller.
< ipvar HOME_NET any
---
> ipvar HOME_NET 192.168.1.0/24
Définissez l'adresse réseau externe. En gros, spécifiez la valeur par défaut "any".
ipvar EXTERNAL_NET any
Modifiez le chemin relatif des variables suivantes sur le chemin actuel.
< var RULE_PATH ../rules
< var SO_RULE_PATH ../so_rules
< var PREPROC_RULE_PATH ../preproc_rules
---
> var RULE_PATH ./rules
> var SO_RULE_PATH ./so_rules
> var PREPROC_RULE_PATH ./preproc_rules
113,114c113,114
< var WHITE_LIST_PATH ../rules
< var BLACK_LIST_PATH ../rules
---
> var WHITE_LIST_PATH ./rules
> var BLACK_LIST_PATH ./rules
510,512c510,513
Commentez les paramètres inutilisés et ajoutez community.rules.
< nested_ip inner, \
< whitelist $WHITE_LIST_PATH/white_list.rules, \
< blacklist $BLACK_LIST_PATH/black_list.rules
---
> # nested_ip inner, \
> nested_ip inner
> # whitelist $WHITE_LIST_PATH/white_list.rules, \
> # blacklist $BLACK_LIST_PATH/black_list.rules
< include $RULE_PATH/app-detect.rules
< include $RULE_PATH/attack-responses.rules
< include $RULE_PATH/backdoor.rules
< include $RULE_PATH/bad-traffic.rules
< include $RULE_PATH/blacklist.rules
< include $RULE_PATH/botnet-cnc.rules
< include $RULE_PATH/browser-chrome.rules
< include $RULE_PATH/browser-firefox.rules
< include $RULE_PATH/browser-ie.rules
< include $RULE_PATH/browser-other.rules
< include $RULE_PATH/browser-plugins.rules
< include $RULE_PATH/browser-webkit.rules
< include $RULE_PATH/chat.rules
< include $RULE_PATH/content-replace.rules
< include $RULE_PATH/ddos.rules
< include $RULE_PATH/dns.rules
< include $RULE_PATH/dos.rules
< include $RULE_PATH/experimental.rules
< include $RULE_PATH/exploit-kit.rules
< include $RULE_PATH/exploit.rules
< include $RULE_PATH/file-executable.rules
< include $RULE_PATH/file-flash.rules
< include $RULE_PATH/file-identify.rules
< include $RULE_PATH/file-image.rules
< include $RULE_PATH/file-multimedia.rules
< include $RULE_PATH/file-office.rules
< include $RULE_PATH/file-other.rules
< include $RULE_PATH/file-pdf.rules
< include $RULE_PATH/finger.rules
< include $RULE_PATH/ftp.rules
< include $RULE_PATH/icmp-info.rules
< include $RULE_PATH/icmp.rules
< include $RULE_PATH/imap.rules
< include $RULE_PATH/indicator-compromise.rules
< include $RULE_PATH/indicator-obfuscation.rules
< include $RULE_PATH/indicator-shellcode.rules
< include $RULE_PATH/info.rules
< include $RULE_PATH/malware-backdoor.rules
< include $RULE_PATH/malware-cnc.rules
< include $RULE_PATH/malware-other.rules
< include $RULE_PATH/malware-tools.rules
< include $RULE_PATH/misc.rules
< include $RULE_PATH/multimedia.rules
< include $RULE_PATH/mysql.rules
< include $RULE_PATH/netbios.rules
< include $RULE_PATH/nntp.rules
< include $RULE_PATH/oracle.rules
< include $RULE_PATH/os-linux.rules
< include $RULE_PATH/os-other.rules
< include $RULE_PATH/os-solaris.rules
< include $RULE_PATH/os-windows.rules
< include $RULE_PATH/other-ids.rules
< include $RULE_PATH/p2p.rules
< include $RULE_PATH/phishing-spam.rules
< include $RULE_PATH/policy-multimedia.rules
< include $RULE_PATH/policy-other.rules
< include $RULE_PATH/policy.rules
< include $RULE_PATH/policy-social.rules
< include $RULE_PATH/policy-spam.rules
< include $RULE_PATH/pop2.rules
< include $RULE_PATH/pop3.rules
< include $RULE_PATH/protocol-finger.rules
< include $RULE_PATH/protocol-ftp.rules
< include $RULE_PATH/protocol-icmp.rules
< include $RULE_PATH/protocol-imap.rules
< include $RULE_PATH/protocol-pop.rules
< include $RULE_PATH/protocol-services.rules
< include $RULE_PATH/protocol-voip.rules
< include $RULE_PATH/pua-adware.rules
< include $RULE_PATH/pua-other.rules
< include $RULE_PATH/pua-p2p.rules
< include $RULE_PATH/pua-toolbars.rules
< include $RULE_PATH/rpc.rules
< include $RULE_PATH/rservices.rules
< include $RULE_PATH/scada.rules
< include $RULE_PATH/scan.rules
< include $RULE_PATH/server-apache.rules
< include $RULE_PATH/server-iis.rules
< include $RULE_PATH/server-mail.rules
< include $RULE_PATH/server-mssql.rules
< include $RULE_PATH/server-mysql.rules
< include $RULE_PATH/server-oracle.rules
< include $RULE_PATH/server-other.rules
< include $RULE_PATH/server-webapp.rules
< include $RULE_PATH/shellcode.rules
< include $RULE_PATH/smtp.rules
< include $RULE_PATH/snmp.rules
< include $RULE_PATH/specific-threats.rules
< include $RULE_PATH/spyware-put.rules
< include $RULE_PATH/sql.rules
< include $RULE_PATH/telnet.rules
< include $RULE_PATH/tftp.rules
< include $RULE_PATH/virus.rules
< include $RULE_PATH/voip.rules
< include $RULE_PATH/web-activex.rules
< include $RULE_PATH/web-attacks.rules
< include $RULE_PATH/web-cgi.rules
< include $RULE_PATH/web-client.rules
< include $RULE_PATH/web-coldfusion.rules
< include $RULE_PATH/web-frontpage.rules
< include $RULE_PATH/web-iis.rules
< include $RULE_PATH/web-misc.rules
< include $RULE_PATH/web-php.rules
< include $RULE_PATH/x11.rules
---
> include $RULE_PATH/community.rules
Définissez le mode cas promis pour recevoir les paquets destinés à d'autres hôtes. Ajoutez la valeur de paramètre ** PROMISC ** au fichier d'interface.
--Paramètres réseau
# vi /etc/sysconfig/network-scripts/ifcfg-enp0s8
PROMISC=yes
Créez une règle de vérification et vérifiez l'opération. Dans cet article, la détection de ping est utilisée comme exemple.
Le fichier de règles est stocké sous / etc / snort / rules
.
Décrit le fichier de règles.
La signature du fichier de règles se compose d'un en-tête de règle et d'un corps de règle.
En-tête de règle: adhésion à la règle/protocole/adresse IP/Port/Opérateur de direction/adresse IP/Port/
Corps de la règle: facultatif
Il existe les types d'actions de règle suivants.
Type | Aperçu |
---|---|
alert | Sort les paquets qui correspondent aux règles dans le journal et génère un avertissement |
log | Sortir les paquets qui correspondent aux règles dans le journal |
pass | Ignorer les paquets qui correspondent à la règle |
acitive | Afficher un avertissement pour les paquets qui correspondent à la règle et effectuer l'action de la règle dynamique correspondante |
dynamic | Sortir le paquet correspondant dans le journal |
--Modifier les règles locales
# vi /etc/snort/rules/local.rules
alert icmp any any -> any any (msg: "ICMP Packet detected"; sid:999999;)
Vous devrez redémarrer snort après avoir modifié la règle.
L'option -D
est spécifiée dans le script de démarrage par défaut, donc si vous exécutez le script de démarrage, il démarrera en mode démon.
# /etc/init.d/snortd start
** Vérifiez le syslog pour vous assurer qu'il n'y a pas d'erreurs au démarrage. ** **
S'il démarre normalement, vous pouvez vérifier le processus suivant.
[root@localhost snort-2.9.16]# ps aux | grep snort | grep -v grep
snort 11481 0.0 6.3 164828 64456 ? Ssl 03:03 0:07 /usr/sbin/snort -A fast -b -d -D -i enp0s8 -u snort -g snort -c /etc/snort/snort.conf -l /var/log/snort
Vous pouvez également le démarrer en tant que renifleur comme indiqué ci-dessous. Si vous le démarrez en tant que renifleur, le traitement prendra du temps, donc, fondamentalement, vous ne l'utiliserez pas pour autre chose que vérifier l'opération.
# snort -v
Running in packet dump mode
--== Initializing Snort ==--
Initializing Output Plugins!
pcap DAQ configured to passive.
Acquiring network traffic from "enp0s3".
Decoding Ethernet
--== Initialization Complete ==--
,,_ -*> Snort! <*-
o" )~ Version 2.9.16 GRE (Build 118)
'''' By Martin Roesch & The Snort Team: http://www.snort.org/contact#team
Copyright (C) 2014-2020 Cisco and/or its affiliates. All rights reserved.
Copyright (C) 1998-2013 Sourcefire, Inc., et al.
Using libpcap version 1.9.1 (with TPACKET_V3)
Using PCRE version: 8.32 2012-11-30
Using ZLIB version: 1.2.7
Commencing packet processing (pid=17768)
Exécutez un ping depuis un autre terminal. Si vous regardez le journal ci-dessous, vous pouvez voir que le paquet ICMP a été détecté.
# tail -f /var/log/snort/alert
04/22-03:04:27.545270 [**] [1:999999:0] ICMP Packet detected [**] [Priority: 0] {ICMP} 192.168.1.10 -> 192.168.1.16
Il est difficile d'installer Snot, mais en fonctionnement réel, il est nécessaire d'ajuster le jeu de règles et de vérifier les anomalies à partir d'une énorme quantité de journaux.
Il existe un outil appelé Oinkmaster qui peut mettre à jour automatiquement le fichier de règles et SnortSnarf qui peut convertir la sortie du fichier journal par Snort en un fichier HTML afin qu'il puisse être vérifié sur un navigateur Web.
En passant, Snort signifie renifler.