Relecture : Sébastien Lebel.
Copyright © 2004 Laurent Archambault.
Ce document peut être librement copié, distribué et/ou modifié selon les termes et conditions de la GNU Free Documentation Licence, version1.1 ou ultérieure la dernière version est disponible ici : www.fsf.org
Historique des versions | |
---|---|
Version 1.0 | 20 juillet 2004 |
Version 1.1 | 10 novembre 2004 Corrections diverses, ajouts des options et comment éffectuer un rapport hebdomadaire. |
Table des matières
Liste des illustrations
Le contrôle des logs d'un pare-feu avec « Iptables » (ou Netfilter) bien que relativement simple, est un moment souvent pénible, amplifié parfois par la grosseur des fichiers logs. Il est donc important d'essayer d'automatiser cette étape de façon simple, précise et si possible graphique. La combinaison d'un logiciel « Analog » et d'un script« Fwanalog » vont résoudre ceci, toutefois les pages créées sont au format HTML et les images au format png. Un serveur HTTP est donc le bienvenu pour exploiter rapidement et simplement ces données. En prenant en compte des restrictions sécuritaires, la commande scp peut-être employée vers une autre machine de supervision ... Ces 2 produits sont dédiés aux analyses des fichiers de log, Analog est spécialisé dans les fichiers de log des serveurs « web », mais des extensions existent comme Fwanalog, et permettent d'exploiter la puissance de Analog pour analyser d'autres fichiers, dans notre cas un pare-feu.
Cette documentation s'adresse aux administrateurs possédant déjà de bonnes connaissances de Gnu/Linux et du monde du libre.
Ce document n'est qu'un début mais va permettre une analyse d'un pare-feu, d'autres versions ne sont pas exclues.
Analog utilise une licence Freeware, Fwanalog est sous licence GPL
Table des matières
L'installation via les packages Debian ou RPM n'est pas prise en compte, elle reste typique à votre distribution, le plus difficile n'est pas là... Personnellement, je préfère passer dès que possible par la compilation, optimisation et meilleurs contrôles des installations et des options ...
L'installation des dépendances n'est pas prise en compte dans ce document, toutes les librairies nécessaires sont souvent installées par défaut, elles ne présentent aucun risque lors de l'installation des RPM ou des paquets Debian. Fwanalog a besoin de Analog pour fonctionner...
La librairie libpcre-3.4 est disponible à ici, Analog utilise parfois Perl pour ces analyses. Les versions supérieures sont compatibles avec Analog.
La librairie gd-1.8.4 ou supérieure est disponible à ici , la version 2.0 est compatible avec Analog.
La librairie zlib est disponible à ici
La librairie libpng en version 1.2 ou supérieure est disponible ici
La librairie jpeg en version 6B est disponible à ici
Via la commande mkdir /usr/local/analog , ensuite décompressez l'archive à cet emplacement.
Depuis les sources, il suffit de faire make ou gmake ...et c'est tout, pour l'installer il suffit de copier le fichier analog dans /usr/local/bin ...
Analog utilise un fichier spécifique pour le support des langues étrangères, mais aussi des images. Il est fortement conseillé de copier les répertoires et leurs fichiers lang et images dans /usr/share/analog/
Comme Fwanalog est un script son installation est très simple, il suffit de copier des fichiers dans les bons répertoires, ce qui donne :
La 1ère partie représente les fichiers et les répertoires après décompression. La 2ème partie (quelques espaces après) représente la destination des fichiers.
CONTRIBUTORS COPYING ChangeLog README README.firewall README.sudo TODO fwanalog-dom.tab fwanalog.analog.conf fwanalog.analog.conf.local fwanalog.lng fwanalog.opts.freebsd fwanalog.opts.fw1 fwanalog.opts.linux22 fwanalog.opts.linux24 fwanalog.opts.master fwanalog.opts.openbsd fwanalog.opts.openbsd3 fwanalog.opts.pix fwanalog.opts.solarisipf fwanalog.opts.watchguard fwanalog.opts.zynos fwanalog.sh langfiles services.conf support
--- /etc/ --- /etc/fwanalog/ >>> /etc/fwanalog/fwanalog.sh >>> /etc/fwanalog/fwanalog-dom.tab >>> /etc/fwanalog/fwanalog.lng >>> /etc/fwanalog/services.conf >>> /etc/fwanalog/fwanalog.analog.conf >>> /etc/fwanalog/fwanalog.analog.conf.local >>> /etc/fwanalog/fwanalog.opts --- /usr/ --- /usr/share/ --- /usr/share/doc/ --- /usr/share/doc/fwanalog-0.6.4/ --- /usr/share/doc/fwanalog-0.6.4/support/ >>> /usr/share/doc/fwanalog-0.6.4/support/daily-report.sh.gz >>> /usr/share/doc/fwanalog-0.6.4/support/mklangfile.de.sh.gz >>> /usr/share/doc/fwanalog-0.6.4/support/mklangfile.us.sh.gz >>> /usr/share/doc/fwanalog-0.6.4/support/mkopts.sh.gz >>> /usr/share/doc/fwanalog-0.6.4/support/mkservices.conf.sh.gz >>> /usr/share/doc/fwanalog-0.6.4/support/well_known_ports.conf.gz >>> /usr/share/doc/fwanalog-0.6.4/CONTRIBUTORS.gz >>> /usr/share/doc/fwanalog-0.6.4/ChangeLog.gz >>> /usr/share/doc/fwanalog-0.6.4/README.gz --- /usr/share/doc/fwanalog-0.6.4/langfiles/ >>> /usr/share/doc/fwanalog-0.6.4/langfiles/README.gz >>> /usr/share/doc/fwanalog-0.6.4/langfiles/fwanalog.lng.de.4.16.gz >>> /usr/share/doc/fwanalog-0.6.4/langfiles/fwanalog.lng.de.5.1.gz >>> /usr/share/doc/fwanalog-0.6.4/langfiles/ >>> /usr/share/doc/fwanalog-0.6.4/langfiles/fwanalog.lng.fr.5.31.gz >>> /usr/share/doc/fwanalog-0.6.4/langfiles/fwanalog.lng.us.4.01.gz >>> /usr/share/doc/fwanalog.lng.us.4.11.gz >>> /usr/share/doc/fwanalog-0.6.4/langfiles/fwanalog.lng.us.4.16.gz >>> /usr/share/doc/fwanalog-0.6.4/langfiles/fwanalog.lng.us.5.0.gz >>> /usr/share/doc/fwanalog-0.6.4/langfiles/fwanalog.lng.us.4.91b1.gz >>> /usr/share/doc/fwanalog-0.6.4/langfiles/fwanalog.lng.us.5.1.gz >>> /usr/share/doc/fwanalog-0.6.4/langfiles/fwanalog.lng.us.5.21.gz >>> /usr/share/doc/fwanalog-0.6.4/langfiles/fwanalog.lng.us.5.22.gz >>> /usr/share/doc/fwanalog-0.6.4/langfiles/fwanalog.lng.us.5.30.gz
Manuellement cela donne :
Création des répertoires /etc/fwanalog et /usr/share/doc/fwanalog-0.6.4 (pour la version 0.6.4)
Copie des fichiers selon le listing ci-dessus, sachant que le répertoire /usr/share/doc/fwanalog-0.6.4 comme tous les autres, ne contient que des documents à lire, aucun script exécutable...
Pour franciser Fwanalog, dans le répertoire /usr/share/doc/fwanalog-0.6.4/langfiles/ , décompressez le fichier fwanalog.lng.fr.5.31.gz par gzip -d fwanalog.lng.fr.5.31.gz, puis copiez le fichier fwanalog.lng.fr.5.31 dans /etc/fwanalog/fwanalog.lng (ecrasement du fichier d'origine).
Et voilà, Fwanalog est installé ...passons à la configuration.
-h ou --help -> Affiche l'aide et quitte le script.
-r-> Fait une rotation du fichier de log.
-c fichier_de_configuration -> Doit utiliser le fichier de configuration fichier_de_configuration, par défaut fwanalog.opts.
-t -> Met à jour uniquement les données pour aujourd'hui ( à utiliser avec la crontab ), les options du fichier fwanalog.opts sep_hosts et sep_packets ne sont pas prises en compte.
-y -> Identique à l'option -t mais pour la journée d'hier.
-a et -p ->Création de rapports séparés par clients(hosts) pour -a et par paquets pour -p.
Les essais ont été réalisés avec une machine configurée en pare-feu composé d'Iptables/Netfilter et d'un serveur WWW avec accès possible uniquement sur le port 81, et uniquement depuis le LAN. Tout ceci pour dire que je n'ai pas essayé Analog+Fwanalog sans serveur WWW. Comment réagit Analog dans ce cas, théoriquement aucun souci à avoir.
Tous les fichiers de configuration se trouvent dans /etc/fwanalog, dont voici le listing juste après installation :
-rw------- 1 root root 4953 Jul 17 00:26 fwanalog-dom.tab -rw------- 1 root root 5276 Jul 17 08:45 fwanalog.analog.conf -rw------- 1 root root 3153 Jul 17 08:50 fwanalog.analog.conf.local -rw------- 1 root root 14826 Mar 18 17:41 fwanalog.lng -rw------- 1 root root 4190 Jul 17 08:51 fwanalog.opts -rwx------ 1 root root 66957 Jul 17 00:26 fwanalog.sh -rw------- 1 root root 134812 Jul 17 00:26 services.conf drwxr-xr-x 2 root root 256 Mar 18 17:41 support
Analog et Fwanalog sont prévus pour fonctionner sous Gnu/Linux par défaut, il y a peu de fichiers de configuration à modifier, dans une version dite standard ...
Le fichier fwanalog-dom.tab ne doit pas être modifié si vous êtes relié à internet, dans le cas d'un intranet, des changements peuvent peut-être effectués pour apporter des statistiques sur des sous domaines (???).
Le fichier fwanalog.analog.conf , rien à modifier.
Le fichier fwanalog.analog.conf.local doit être modifié sur les points suivants :
La variable HOSTNAME "représente le nom de votre machine" sera utilisée lors des filtrages.
Cette variable CONFIGFILE ./support/well_known_ports.conf va inclure un fichier de réference de ports et d'applications complémentaires, plus complet que le fichier services.conf fourni avec Fwanalog.
Listing de mon fichier (variable HOSTNAME volontairement non à jour):
# Some examples for possible changes - edit and/or uncomment them to activate # See http://www.analog.cx/docs/custom.html for more information # Credits # HOSTURL http://tud.at/programm/fwanalog/ HOSTNAME "le nom de votre machine" # If you want to exclude blocked packets from some hosts (e.g. your private network) # HOSTEXCLUDE 192.168.1.* # If you want to include your corporate stylesheet # STYLESHEET /style/mycorporationsflashydesign.css # Change the report order if you want. This is a good order for firewall # logs, I think. REPORTORDER xiurSZo5746HhwDdWmQ1zvbfPscJpBKknNIEtlLRMjYy # Analog 5.x VHOST ON # Interface report, you can turn it off if you have only one interface SIZE OFF # Blocked packet size - not very interesting in many cases BROWSERREP OFF # Set to ON if you want the mac addresses reported and your firewall logs it # Switching on reports for all output files. DAILYREP ON # Set to OFF if you don't want the statistics for the last N days DAYROWS 21 # The last 21 days in the daily report #QUARTERREP ON # Quarter-hour-report for the last day(s) #QUARTERREPROWS 264 # A full day in the five-minute-report FIVEREP ON # Five-minute-report for the last day(s) FIVEREPROWS 264 # A full day in the five-minute-report # This is European style, I know. Change if you want to. WEEKBEGINSON MONDAY # I don't want warnings about surpressed reports WARNINGS -R # If you don't want pie charts, uncomment this ALLCHART ON # Or deactivate them one by one: # HOSTCHART OFF # DOMCHART OFF # etc. # Set higher floors so reports don't become too long A FLOOR line consist of the following: # {rep}FLOOR {number}{suffix} # The following variants make sense with fwanalog: # Nr at least N blocks in the report's period # N%r at least N percent of the total blocks in the report's period # -Nr the top N objects (hosts, ports etc.) # See the examples above and README for analog => fwanalog mappings DOMFLOOR -30R # Max. 30 top level domains SUBDOMFLOOR -30R # Max. 30 top level domains VHOSTFLOOR 5r # Interfaces with at least 5 blocked packets ORGFLOOR 0.5%r # Organizations with at least 0.5 % of the blocked packets HOSTFLOOR 0.5%r # Hosts with at least 0.5 % of the blocked packets DIRFLOOR 1r # Each targeted host SUBDIRFLOOR -40r # Max. 40 different blocked packets (per host) REFFLOOR -20r # Top 20 source ports BROWREPFLOOR 2r # MAC Address report: addresses with at least 2 tries REQFLOOR 2Nr # Blocked port report: two ports # Expanding large items in the Blocked Packet chart # - this has to be customized for your most-blocked IP addresses. DIRCHARTEXPAND /IPAddress1/,/IPAddress2/ # If old logs are bzip2ed or gzipped, uncompress them using this program UNCOMPRESS *.gz,*.Z "zcat" UNCOMPRESS *.bz2,*.bz "bzcat" # Include the config file with lots of rare service definitions if you want CONFIGFILE ./support/well_known_ports.conf # Uncomment the next line if your firewall logs numeric ICMP types DIROUTPUTALIAS REGEXPI:^/(.+)/(ICMP)/(.+)/$ "$1/$2, unknown type $3" # /ipaddress/icmp/type => ipaddress/icmp, type
Le fichier fwanalog.lng a déjà été expliqué plus haut, c'est le fichier de francisation dans mon cas.
Le fichier fwanalog.opts mérite un soin particulier lors des modifications, c'est un peu le coeur du système ...
#!/bin/sh ########################################################################### # # User-changeable options for fwanalog.sh # # $Id: fwanalog.opts.linux24,v 1.17 2003/11/25 17:11:31 bb Exp $ # ########################################################################### outdir="/home/httpd/htdocs/fwanalog.out" # The directory where the output goes to, without / at the end. You need write # permissions, of course, and should secure this directory with permissions, # minefields, guard dogs etc. It will be created if you don`t have it yet. logformat="iptables" # What log format your firewall writes. # Currently available options: # iptables Linux 2.4 iptables (probably in /var/log/messages) # ipchains Linux 2.2 ipchains (probably in /var/log/messages) # ipf BSD/Solaris ipfilter (probably in /var/log/ipflog) # openbsd this was the same as ipf until OpenBSD 2.9; this also # seems to work on NetBSD # freebsd FreeBSD`s output format (probably in /var/log/ipflog) # solarisipf Solaris 8.0 Intel ipf 3.4.20 (using ipmon -sn &) # pf_30 OpenBSD 3.0 pf binary log format # fwanalog *must* run on OpenBSD 3.0 for this to work # (because of the special tcpdump of OpenBSD) # zynos ZyNOS (ZyXEL, Netgear) logfile # pix Cisco Pix (tested with version 6.22/IOS) # watchguard Watchguard Firebox # fw1 Checkpoint Firewall-One (not fw-1 NG!) # Feel free to program a parser for your firewall if it is not supported. # See the comments in iptables() and ipf() # # The officially maintained formats are pf_30 and iptables. inputfiles_mask="kern*" # The name of your logfiles, with a wildcard if you want inputfiles_dir="/var/log" # The directory where your logfiles are in, # e.g. /var/log inputfiles_mtime="31" # How old the logfiles can be # You can change this to your log rotate interval + 1 day (so you never miss a logfile entry) inputfiles=`find $inputfiles_dir -maxdepth 1 -name "$inputfiles_mask" -mtime -$inputfiles_mtime | sort -r` # This should find the names of the logfiles you want to parse # It MUST return the names in reverse order (chronologically) or you # will have LOTS of duplicate lines in your log. onehost=true # Available options: false true dynip # Default: false # Set to true if this firewall runs on one machine only and you want to see # the source hosts (not the protected target hosts) in the Blocked Packet # Report. This is suggested if you protect one server, but loses information # if you protect a network. # Set to "dynip" if your firewall has a dynamic IP address. # After changing onehost, you must delete everything in $outdir! sep_hosts=false # Set to true if you want fwanalog to create a separate, additional report for # each attacking host IP. # WARNING: this can run for hours using 100 % CPU and consume lots of hard # disk space (up to 25 kB per host) so you can easily fill up your server if # too many packets from different hosts were blocked. # Also, this makes only limited sense with onehost mode set to true. # If you set this option after having used fwanalog, some hosts won`t be # linked in the report. You can create a report for a host with the # "-a <IP-address>" command line option. sep_packets=false # Like sep_hosts, but for blocked packets. # The corresponding command line option is "-p <packet>" # Program invocations - add path if needed analog="analog" # Full pathname if you need, or "nice analog" if you want to de-priorize it date="date" # should be GNU date or one which can print the timezone. # see "timezone" below grep="grep" # should be GNU grep egrep="egrep" # should be GNU egrep zegrep="egrep" # this is just a shellscript on most systems. If you don`t # have it, copy it from another Unix-lookalike. gzcat="gzcat" # needed only on OpenBSD 3.x sed="sed" perl="perl" tcpdump="tcpdump" # needed only on OpenBSD 3.x timezone=`$date +%z` # Which timezone the server is in. Correct if the server fwanalog runs on # is not in the timezone the firewall is in. # The %z option of date is supported on GNU/Linux and OpenBSD, # but apparently NOT on FreeBSD so you will have to insert your # timezone difference (e.g. -0500) yourself or use GNU date.
Passons en détail les modifications :
outdir représente le répertoire où les pages web et les images seront créées, en général "/var/www/...." ou dans les distributions plus anciennes "/home/httpd....".
logformat = "iptables" (un grand classique).
input_files_mask représente le nom du fichier ou les log d'Iptables sont enregistrés (kern.log ou messages.log en général).
input_files_dir est le répertoire ou le fichier de log d'Iptables est stocké.
inputfiles=`find $inputfiles_dir -maxdepth 1 -name "$inputfiles_mask" -mtime -$inputfiles_mtime | sort -r`, Fwanalog fonctionne très bien sans changement ...
inputfiles_mtime=31 , cette valeur représente le nombre de fichiers log stockés (par rotation), soit 31 jours. Donc Analog(Fwanalog) ne remontera à pas plus de 31 fichiers. Pour une analyse hebdomadaire, il faut modifier pour une valeur de 6.
onehost=false peut prendre les valeurs true/false ou dynip, la valeur true est à utiliser dans le cas d'une seule machine, false dans le cas où plusieurs machines interviennent (DMZ ...).
sep_host=false doit rester à FALSE, il est clairement marqué que le CPU sera utilisé fortement pendant environ 04 heures, si la valeur est a true.
sep_packets=false est comme sep_hosts mais pour les paquets, donc la valeur doit être à false. Ces 2 dernieres valeurs sont des analyses fines par identités ou par paquets, ces analyses sont créées dans un répertoire particulier, et les fichiers sont nombreux (dépend du trafic ...).
timezone=`$date +%z`peut-être remplacé par timezone="CEST", pour un léger gain de temps.
Voilà pour ce fichier.
Le fichier fwanalog.sh est le fichier/script exécutable qui permet les analyses et les rapports ...
Le fichier services.conf est similaire plus ou moins à /etc/services.
support est un répertoire qui contient des scripts dont le fichier well_known_ports.conf. Il est possible de le modifier, supprimer et d'ajouter des lignes, aucun script n'a été utilisé dans ce répertoire ...
Table des matières
Manuellement : sh /etc/fwanalog/fwanalog.sh puis soyez patient ...
Automatiquement : A placer dans la crontab via la commande crontab -e root , puis ajouter : 55 23 * * * sh /etc/fwanalog/fwanalog.sh. Cette valeur de 23h55, laissera à Fwanalog le temps de travailler et d'afficher les données pour une journée complète...
Les fichiers générés :
-rw-r--r-- 1 root root 3088 Jul 24 00:06 alldates-dir.png -rw-r--r-- 1 root root 4318 Jul 24 00:06 alldates-dom.png -rw-r--r-- 1 root root 3196 Jul 24 00:06 alldates-host.png -rw-r--r-- 1 root root 3933 Jul 24 00:06 alldates-org.png -rw-r--r-- 1 root root 2381 Jul 24 00:06 alldates-ref.png -rw-r--r-- 1 root root 2486 Jul 24 00:06 alldates-vhost.png -rw-r--r-- 1 root root 1536805 Jul 24 00:08 alldates.html -rw-r--r-- 1 root root 267368 Jul 24 00:02 analog-domains.tab -rw-r--r-- 1 root root 452033512 Jul 24 00:08 analog.err -rw-r--r-- 1 root root 159259261 Jul 23 23:58 fwanalog.all.log lrwxrwxrwx 1 root root 10 Jul 18 06:51 index.html -> today.html -rw-r--r-- 1 root root 3961 Jul 24 00:08 lastweek-dir.png -rw-r--r-- 1 root root 4201 Jul 24 00:08 lastweek-dom.png -rw-r--r-- 1 root root 4434 Jul 24 00:08 lastweek-host.png -rw-r--r-- 1 root root 3708 Jul 24 00:08 lastweek-org.png -rw-r--r-- 1 root root 2265 Jul 24 00:08 lastweek-ref.png -rw-r--r-- 1 root root 2327 Jul 24 00:08 lastweek-vhost.png -rw-r--r-- 1 root root 462451 Jul 24 00:08 lastweek.html drwxr-xr-x 2 root root 48 Jul 20 22:11 out -rw-r--r-- 1 root root 3801 Jul 24 00:07 today-dir.png -rw-r--r-- 1 root root 3898 Jul 24 00:07 today-dom.png -rw-r--r-- 1 root root 4118 Jul 24 00:07 today-host.png -rw-r--r-- 1 root root 3582 Jul 24 00:07 today-org.png -rw-r--r-- 1 root root 2251 Jul 24 00:07 today-ref.png -rw-r--r-- 1 root root 2418 Jul 24 00:07 today-vhost.png -rw-r--r-- 1 root root 127965 Jul 24 00:08 today.html -rw-r--r-- 1 root root 106054 Jul 24 00:02 today.txt
Il est regretable que Fwanalog ne crée pas de fichier d'index. Pour ma configuration, à 23h55 tous les dimanches est exécutée la commande 55 23 * * 0 rm -f /var/www/httpd/htdocs/fwanalog/*.{tab,all.log,png,txt,err};. Autre possibilité, inscrire cette ligne au début du script de /etc/fwanalog/fwanalog.sh. A vous de voir ...
Cette solution évite le « grossissement » de certains fichiers ... par contre certaines données restent inaccessibles pendant quelques minutes.
Pour résoudre ce petit problème j'ai modifié le script Fwanalog en remplacant les mots alldates.html(5) par index.html, il suffit dans ce cas d'éditer le fichier fwanalog.sh avec vim puis de lancer la commande :%s/alldates.html/index.html/g. Et c'est tout.
Fwanalog génère automatiquement 3 fichiers HTML,alldates.html lastweek.html et today.html.
Le fichier alldates.html génére un rapport depuis la date du 1er lancement de Fwanalog jusqu'à la dernière analyse, c'est donc un fichier important par sa taille et ses données. Le fichier today.html est le résultat des analyses pour les dernières 24 heures. Le fichier lastweek.html donne les analyses pour le dernier week-end.
Résumé
Après analyses de différents outils et en prenant en compte les contraintes des licences, des logiciels (support d'Iptables...), Fwanalog est probablement le meilleur produit à ce jour pour analyser les logs d'un pare-feu. Par contre Fwanalog ne procède pas à des analyses en temps réel, ce qui est un peu regretable, cette fonction doit être prise en compte par un autre produit. Dans le cas d'un pare-feu, il est important de prendre en compte que Fwanalog analyse les connexions et les protocoles (via Iptables/Netfilter), à aucun moment celui-ci analyse les données. Il est donc important de compléter toutes ces analyses par un NIDS (Network Intrusion Detection System), Les plus connues dans le monde du libre sont Snort et Prelude-nids, ils sont capablent d'intercepter et d'analyser à la volée les paquets transitant sur un réseau, et son particulièrement performants pour la détection de tentatives d'intrusions à distance. Ensuite les patchs de sécurité doivent être systématiquement appliqués sur les serveurs sensibles. Le cas contraire les spécialistes osent même dire : "effectuer une installation de base et ne plus s'en occuper n'est pas seulement à considerer comme une hérésie, c'est une provocation"(extrait Linux magazine hors série).