HSC
Cabinet de consultants en sécurité informatique depuis 1989 - Spécialisé sur Unix, Windows, TCP/IP et Internet
Mode texte : accès au contenu de la page
Hervé Schauer Consultants
Vous êtes ici : Accueil > Ressources > Brèves > Installation de Syslog-NG
Accéder au : Site HSC des formations
Télécharger le catalogue des formations
Recherche :  
English version
   Services   
o Domaines de compétences
o Conseil & Expertise
o Prestations ISO 27001
o Audit & Évaluation
o Tests d'intrusion
o Tests de vulnérabilités (TSAR)
o Analyse Forensique
o Certification ARJEL
o Formations
o E-learning
   Conférences   
o Agenda
o Interventions passées
o Tutoriels
   Ressources   
o Index thématique
o Brèves
o Présentations
o Cours
o Articles
o Outils (téléchargement)
o Veille en vulnérabilité
   Société   
o Hervé Schauer
o Equipe
o Offres d'emploi
o Références
o Historique
o Partenariats
o Associations
   Presse et
 communication
 
 
o Newsletter HSC
o Bulletin juridique HSC
o Revue de presse
o Communiqués de presse
o Publications
   Contacts   
o Coordonnées
o Requêtes particulières
o Accès à nos locaux
o Hôtels proches de nos locaux
|>|Installation de Syslog-NG  

par Jérôme Poggi (29/10/2001)



                  Installation et configuration de Syslog-NG


        --- [ Plan ] ---

A - Introduction
B - Décompactage
C - Compilation et installation
D - Paramétrage
E - Mise en Cage
F - Références


        --- [ A - Introduction ] ---

Syslog-ng est un gestionnaire de journaux système de nouvelle
génération, d'où le nom Syslog-New-Generation.
Il fonctionne sur les plateformes suivantes :

    * FreeBSD (x86) 3.3
    * Solaris (x86, SPARC) 2.5.1, 2.6, 2.7, 2.8
    * Linux (x86) glibc 2.0, 2.1, 2.2
    * ReliantUnix (unknown) 5.43
    * HP-UX (unknown) unknown

Un utilisateur nous rapporte que Syslog-NG à pu être compilé sur SUN en
utilisant le compilateur gcc 3.2 et le ld de sun workshop 5 (compilateurs SUN).

Syslog-ng essaye de rajouter les manques de syslogd :

    * Une configuration puissante
    * Un tri des messages par leur contenu
    * La portabilité
    * Une meilleure redirection des messages sur le réseau
    * La possibilité de le mettre en cage (chroot)
    * UDP et TCP utilisés pour le transport des journaux
    * Chiffrer et authentifier le trafic réseau (en dévelopement)
    * Compresser les journaux (en dévelopement)

Les versions de Syslog-ng respectent la règle de versionning de linux,
c'est à dire que les versions impaires sont dites "instables",
contrairement aux versions paires dites "stables".
exemple : 
 - Version stable   courante 1.4.14
                               ^____ Version stable
 - Version instable courante 1.5.13
                               ^____ Version instable

Le code source est basé sur le code 1.0.x de nsyslog de Darren Reed, et
à complètement été réécrit durant les versions 1.1.x et 1.3.x

La version stable courante est la version 1.4.14

Syslog-ng et libol sont disponibles à l'adresse suivante :
http://www.balabit.hu/en/downloads/syslog-ng/downloads/ 

La libol est une bibliothèque utilisé par syslog-ng pour toutes les
fonctions de parcours de liste, gestion d'entrée/sorties...

Remarque : durant tout le document, toutes les commandes commençant par
un # nécessitent d'être éxécutées sous l'identité root.


        --- [ B - Décompactage ] ---

Une fois les fichiers téléchargés, vous devez les décompacter.
$ cd /usr/local/src
$ gzip -dc syslog-ng-1.4.13.tar.gz | tar -xvf -
$ gzip -dc libol-0.2.23.tar.gz | tar -xvf -
Le fichier d'archive est maintenant décompacté et prêt à être compilé.


        --- [ C - Compilation et installation ] ---

Pour compiler syslog-ng, il vous faut :

    * le compilateur gcc (ou egcs) de version minimum 2.7.2
    * GNU Flex
    * Bison
    * la librarie libol compilée.

1 - Compilation de la libol
$ cd /usr/local/src/libol-0.2.23
$ ./configure
$ make
# make install

Vous pouvez ne pas installer cette bibliothèque, par contre il faudra
indiquer lors de la compilation de syslog-ng où elle se trouve.

2 - Compilation et installation de syslog-ng
$ cd /usr/local/src/syslog-ng-1.4.13
$ ./configure

ou si vous n'avez pas installé la libol :
$ ./configure --with-libtol=/usr/local/src/libol-0.2.23
$ make
# make install

Vous pouvez aussi personnaliser les répertoires d'installation avec les
options --prefix, --exec-prefix ... (voir configure --help)

Si vous désirez remplacer syslogd par syslog-ng, le plus simple est de
faire un lien symbolique se nommant syslogd et pointant sur syslog-ng :
# mv /usr/sbin/syslogd /usr/sbin/syslogd.orig
# ln -s /usr/local/sbin/syslog-ng /usr/sbin/syslogd


        --- [ D - Paramétrage ] ---

1 - Introduction
Pour démarrer, syslog-ng a besoin d'un fichier de configuration :
/etc/syslog-ng/syslog-ng.conf (chez moi)

Ce fichier est divisé en 5 sections :

    * options - Les options générales
    * source - les sources d'événements
    * destination - les destinations de journaux
    * filter - les filtres
    * log - les actions


2 - Exemple d'un fichier de journalisation
Cet exemple est un fichier de paramétrage qui va sauver tous les
événements dans le fichier /var/log/full.log et les afficher aussi sur
le tty12.
Les événements de priorité /info/ à /warning/ sont enregistrés dans le
fichier /var/log/messages.
Le chapitre de mise en cage sera fait suivant cet exemple.

$ cat /etc/syslog-ng/syslog-ng.conf
#########################################
# Exemple de configuration de Syslog-ng #
# 
# Options générales
#
options {
 sync(0);
 log_fifo_size (1000);
};

#
# Source d'évènements
#
source src {
 unix-stream("/dev/log");
 internal();
 file("/proc/kmsg");
};

#
# Destinations de la journalisation
#
destination messages {
 file("/var/log/messages");
};
destination full {
 file("/dev/tty12");
 file("/var/log/full.log" log_fifo_size(5000));
};

#
# Filtres de tri
#
filter f_messages {
 level(info..warn) and not facility(auth, authpriv, mail, news);
};

#
# Actions à entreprendre
#
log {
 source(src);
 filter(f_messages);
 destination(messages);
};
log {
 source(src);
 destination(full);
};


3 - La section OPTIONS
La section options permet de configurer les paramètres généraux :

Voici un exemple détaillé d'une section bien remplie

# Début de la zone des options.
options {
  sync (0); # Nombre d'évènements avant d'écrire dans
            # les journaux
  time_reopen (10); # Attend 10 secondes avant de se reconnecter
                    # si la connexion est tombée
                    # Utilisé dans la centralisations des journaux
                    # par réseaux.
  #time_reap(number); # Ferme un fichier de journalisation non
		      # accedé après N secondes.
  log_fifo_size (1000); # la pile de traitement des évènement est
			# de 1000 lignes, ceci permet de supporter
			# 1000 lignes stocké en mémoire avant écriture
			# Ce qui permet de traiter très rapidement les
			# évènements et de rendre la mains au process
			# qui les a générés, pour les traiter plus tard.
  long_hostnames (off); # Utilisation des nom longs
  use_dns (no);         # Utilisation du DNS pour résoudre les
			# addresses
  use_fqdn (no); # utilisation du nom court de la machine
  owner("root"); # Propiétaire des journaux
  group("root"); # Groupe des journaux
  perm("644");   # Masque des droits des journaux
  keep_hostname (yes); #
  create_dirs (yes);   # Créations des répertoires de stockage des
		       # journaux.
  use_time_recvd(no);  # L'heure contenue dans les journaux ne sera pas
                       # utilisé pour l'horodatage, mais sera remplacé
                       # par l'heure locale
  #gc_idle_threshold(100);# Le "garbage collector" est lancé au bout
			  # de 100 évènements si syslog-ng est inactif.
  #gc_busy_threshold(3000);# Le garbage collector est lancé au bout de
			   # 3000 évènement si syslog-ng est actif.
  #mark(number); # Nombre de secondes entre 2 --MARK--
		 # -non encore disponible-
  #encrypt;      # -non encore disponible-
  #compress;     # Compresse les fichiers de sortie en utilisant la Zlib
		 # -non encore disponible-
  #authentication; # -non encore disponible-
};


4 - La section source
Syntaxe :
source <identifier> { source-driver(params); source-driver(params); ... };
Cette section permet de définir les sources de journalisation:

    * réseau
    * fichiers locaux
    * périphériques
    * tube (pipe)
    * flux (stream)

Les lignes suivantes sont suffisantes sur un Linux
source src {
  unix-stream("/dev/log");
  internal();
  file("/proc/kmsg");
};

Elle permet d'aller lire dans le flux /dev/log, de recevoir les messages
internes à syslog-ng et d'aller puisser les messages de démarrage du noyau.
Les sources possible sont :

    * unix-stream (<filename>) : pour les tubes de type flux (utilisés
      dans linux).
    * unix-dgram  (<filename>) : pour les tubes de type paquets
      (utilisés dans les *BSD).
    * sun-stream (<filename>) : cette option est spécifique au Sun et
      permet de puisser dans des flux Sun.
    * file (<filename>) : pour les données de type fichier. Les messages
      du noyau Linux par exemple.
    * pipe (<filename>) : pour les tubes nommés (à créer avec mkfifo(1)).
    * tcp (<ip>,<port>) et udp (<ip>,<port>) : permettent d'écouter
      sur une adresse et un port.
    * internal() : pour tous les messages internes à syslog-ng.

Plusieurs sources peuvent êtres définies afin de clarifier la
configuration.

Le type de la source dépend de l'architecture de la gestion des
événements du système d'exploitation :
- Linux              : source stdlog { unix-stream("/dev/log"); };
- BSDi               : source stdlog { unix-dgram("/var/run/log"); };
- Solaris (<= 2.5.1) : source stdlog { sun-stream("/dev/log"); };
- Solaris (>= 2.6)   : source stdlog { sun-streams("/dev/log"
                                                   door("/etc/.syslog_door")); };
- AIX                : source stdlog { unix-dgram("/dev/log"); };
- HP-UX              : source stdlog { pipe("/dev/log"); };

exemples :
Avec 2 interfaces (192.168.0.100 et 192.168.5.100) vous collecter les
journaux par de deux réseaux différent.

source collecte1_log { tcp(ip(192.168.0.100) port(514) max-connections(20)); }
source collecte2_log { tcp(ip(192.168.5.100) port(514) max-connections(20)); }

ou pour collecter sur toutes les interfaces en même temps.

source collecte_log { tcp(ip(0.0.0.0) port(514) max-connections(20)); }


5 - La section destination
Syntaxe:
destination <identifier> { destination-driver(params); destination-driver(params); ... };

Cette section, comme son nom l'indique, permet de définir les
destinations des journaux, les possibilités offertes sont :

    * file(<filename>) : pour envoyer vers un fichier
    * tcp(<ip>,<port>) et udp(<ip>,<port>) : pour envoyer les
      journaux à destination d'une autre machine sur le réseau.
    * unix-stream(<filename>) : pour les tubes de type flux (utilisés
      dans linux)
    * unix-dgram(<filename>) : pour les tubes de type paquets (utilisés
      dans *BSD)
    * userttyr(<user>) : pour envoyer vers les consoles de l'utilisateur
      <user>, seulement s'il est connecté.
      Remarque: le meta caractère * peut être utilisé pour envoyer les
      messages à tout le monde.
    * program(<commandtorun>) : pour envoyer vers un programme.

Une section peut avoir plusieurs destinations.
exemples :
destination debug { file("/var/log/debug.log"); };
destination messages { file("/var/log/messages.log"); };
destination console { usertty("root"); };
destination xconsole { pipe("/dev/xconsole"); };
destination mail2admin { program("/usr/bin/MailToAdmin"); };
destination full {
  file("/dev/tty12");
  file("/var/log/full.log" log_fifo_size(2000));
};

A remarquer dans cet exemple l'option log_fifo_size(2000), qui permet de
montrer que des options particulières peuvent être rajoutées à chaque
destination.

Pour envoyer tous vos journaux vers un cerveur central (192.168.0.100) :
destination central_log { tcp("192.168.0.100" port(514)); }

Une chose assez intéressante est l'utilisation des Macros dans les noms
de fichiers de destination. Il existe en effet, un ensemble de macros
telles que : FACILITY, PRIORITY or LEVEL, DATE, FULLDATE, ISODATE, YEAR,
MONTH, DAY, HOUR, MIN, SEC, FULLHOST, HOST et quelques autres macros
plus ou moins utiles.

exemples :
destination full {
  file("/dev/tty12");
  file("/var/log/full_$DAY-$MONTH-$YEAR.log"
       owner("root")
       group("adm")
       perm(0640));
};
destination hosts {
  file("/var/log/HOSTS/$HOST/$FACILITY/$YEAR/$MONTH/$DAY/$FACILITY$YEAR$MONTH$DAY"
       owner(root)
       group(root)
       perm(0600)
       dir_perm(0700)
       create_dirs(yes));
};

avec des destinations telle que celles ci, plus besoin de se soucier
comment tourner les journaux ;-)
Sauf qu'il ne faut pas oublier de supprimer les plus vieux ou de les
archiver...

Remarque : il faut faire attention si vous avez des machines avec des
fuseaux horaires différents, dans ce cas là il faut voir si l'utilisation
de l'option générale use_time_recvd(yes) est pertinante.

* Le petit plus sécurité avec Linux :
Le système de fichier EXT2 de Linux permet de forcer un fichier ou un
répertoire en "ajout seulement" (append). Ainsi vous pouvez définir la
racine de vos log en "ajout seulement".

# lsattr -d /var/log/HOSTS/
------------ /var/log/HOSTS/
# chattr +a /var/log/HOSTS/
# lsattr -d /var/log/HOSTS/
----a------- /var/log/HOSTS/

A partir de ce moment personne ne pourra supprimmer, modifier un
répertoire ou un fichier contenue dans /var/log/HOSTS/, seul le root en
effacent ce drapeau pourra le faire.
Tous les nouveau objets créé dans /var/log/HOSTS/ hériterons du drapeau,
pensez à le positionner sur les objets déjà créé dans /var/log/HOSTS/ si
ce n'est pas fait :)

Remarque : Il faut de la place disque :)

6 - La section filtrage
Syntaxe :
filter <identifier> { expression; };

Voici la partie la plus interressante de ce produit :-)
Les expressions peuvent contenir "AND" "OR" et ou "NOT".
Les expressions sont définies par les mots clefs suivant :

    * facility(faciliy[,facility]) : afin de filter par type.
    * level(pri[,pri1..pri2[,pri3]]) : pour filtrer sur les priorités
      ou niveaux.
    * program(regexp) : permet de filtrer sur le nom du programme
      générant le message.
    * host(regexp) : filtrage sur une expression régulière du nom
      d'hôte de l'expéditeur du message.
    * match(regexp) : filtrage du message sur une expression régulière.
    * filter(filtername) : utilise un autre filtre.

Tous ces mots clefs peuvent êtres utilisés plusieurs fois et séparés par
des opérateurs booléens (AND, OR et NOT) exemples :
filter f_iptables { match("IN=.*OUT=.*MAC=.*"); };
filter f_snort { match("snort: "); };
filter f_full { not filter(f_snort) AND NOT filter(f_iptables); };
filter f_messages { level(info..warn) and not facility(auth, authpriv, mail, news); };

7 - La section de journalisation
Cette partie est la plus importante, car c'est elle qui va permettre de
décider ou envoyer quoi et suivant quels critères.
Sa syntaxe est très simple :

log { source(s1); source(s2); ...
      filter(f1); filter(f2); ...
      destination(d1); destination(d2); ...
      flags(flag1[, flag2...]); };

exemples :
log { source(src);
      filter(f_news); filter(f_notice);
      destination(newsnotice);
};
log { source(src);
      destination(full);
};


        --- [ E - Mise en Cage ] ---

La mise en cage peut être utilisée sur des machines centralisant les
journaux par le réseau. Par contre elle ne peut se faire qu'avec une
version de syslog-ng 1.5 et plus.
Nous allons faire une configuration de mise en cage avec changement
d'identité, avec le fichier de configuration donné en exemple plus haut 
(§D-2)

1 - Préparation de la cage
Notre cage se situera dans /var/syslog-ng

Tout d'abord, nous avons besoin d'un groupe et d'un utilisateur associé
à syslog-ng.
Cet utilisateur ne doit pouvoir ni se connecter, ni avoir de shell.

Voici un script permettant de créer la cage pour un Linux et la remplir :

#!/bin/sh
echo "------------------------------------"
echo " Création d'une cage pour Syslog-NG"
echo " sous Linux 2.2.x/2.4.x"
echo " Hervé Schauer Consultants"
echo " http://www.hsc.fr/"
echo " Jérôme Poggi (jp@hsc.fr)"
echo "------------------------------------"
echo ""
echo "- Création des répertoires"
umask 022
cd /var
# A changer si vous ne voulez pas votre cage ici
# Tout le reste du script est en relatif :)
mkdir syslog-ng
cd syslog-ng
mkdir -p ./etc/syslog-ng
mkdir -p ./var/log ./var/run
chown syslog:syslog ./var/log ./var/run
mkdir ./dev ./lib ./tmp
chmod 1777 ./tmp
echo "- Création des périphériques"
cd dev
mknod null  c 1  3
mknod tty12 c 4 12
chown root:root null
chown root:tty  tty12
chmod 0666 null tty12
cd ..
echo "- Copie des bibliothèques et fichiers necessaires"
cp -pv /etc/group     ./etc/group
cp -pv /etc/passwd    ./etc/passwd
cp -pv /etc/localtime ./etc/localtime
# A changer si votre fichier de conf ne se trouve pas ici
cp -pv /etc/syslog-ng/syslog-ng.conf ./etc/syslog-ng/syslog-ng.conf
# copie des bibliothèques systèmes
# Spécifique à linux !
for Lib in ld-2.2.3.so ld-linux.so.2 libc-2.2.3.so libc.so.6 \
           libnsl-2.2.3.so libnsl.so.1 libnss_compat-2.2.3.so
do
  cp -pv /lib/$Lib ./lib/$Lib
done
exit 0

Ca y est notre cage est prête :-)

Attention : Pour un autre système d'exploitation les bibliothèques
risque de ne pas avoir le même nom et les périphériques ne seront pas
construits de la même façon.

N'oubliez pas que dans le fichier de configuration la nouvelle racine
est /var/syslog-ng et plus /, ce qui signifie que tous les journaux vont
se retrouver dans /var/syslog-ng/var/log
Il faut aussi penser à changer les propriétaires et les droits dans le
fichier de configuration (perm(), group() et owner())

Si vous avez besoin d'autres périphériques n'oubliez pas de les créer.

Remarque : les sources sont ouvertes AVANT le changement de racine de la
mise en cage.

2 - Lancement de syslog-ng dans la cage
# syslog-ng --chroot=/var/syslog-ng --user=syslog --group=syslog

c'est tout :-)
Bonne lecture de journaux...


        --- [ F - Références ] ---

. Le site officiel de Syslog-NG
http://www.balabit.hu/en/downloads/syslog-ng/

. Téléchargement de la version 1.5 (Béta)
http://www.balabit.hu/downloads/syslog-ng/1.5/
Les version dite Béta sont de très bonne qualité, malgrès leur
classification en Béta.

. Téléchargement de la version 1.4 (Stable)
http://www.balabit.hu/downloads/syslog-ng/1.4/

. Pour vous inscrire à la mailing list de Syslog-ng
http://lists.balabit.hu/mailman/listinfo/syslog-ng
Très bonne liste, non modérée mais de qualité.

. La documentation HTML
http://www.balabit.hu/static/syslog-ng/reference/book1.html
Documentation malheureusement imcomplète, les auteurs le reconnaisse eux
même :) Sinon les fichiers de Lex et Yacc sont assez explicite pour
comprendre et découvrir les options supplémentaires.

. Mon Email :)
jerome.poggi(O)hsc.fr

        --- [ Fin ] ---

$Id: syslog-ng.tip,v 1.13 2002/11/25 10:48:40 poggi Exp $



Dernière modification le 12 novembre 2003 à 13:55:01 CET - webmaster@hsc.fr
Mentions légales - Informations sur ce serveur - © 1989-2013 Hervé Schauer Consultants