Modifications entre les versions 4 et 5
Version 4 à la date du 2006-11-09 10:55:21
Taille: 9614
Commentaire: précision sur l'usage avec Vserver
Version 5 à la date du 2008-02-21 22:10:04
Taille: 9614
Éditeur: localhost
Commentaire: converted to 1.6 markup
Texte supprimé. Texte ajouté.
Ligne 1: Ligne 1:
[[TableOfContents]] <<TableOfContents>>

Cette page a pour ambition de devenir à terme et avec l'aide de tous un howto pour gérer ses logs avec syslog-ng et mettre ainsi en place un serveur de log.

Intéret

Ordonner et classer ses logs

Syslog-ng permet de gérer ses logs avec beaucoup plus de souplesse qu'avec syslog grâce à la possibilité de filtrer les messages. Ce filtrage peut être basé sur le contenu, le nom du programme émetteur ou encore la criticité du message.

A l'aide de ces filtres on peut donc mettre en place une politique de classification de ses logs et les stocker dans une arborescence que l'on aura défini.

Sauvegarder ses logs

Un autre intéret majeur de syslog-ng est de pouvoir déporter ou copier les logs d'une machine sur une machine distante (un serveur de log). Cette approche est particulièrement recommandée pour les machines exposées à un réseau qui n'est pas de confiance (par exemple internet) afin de garder une trace des logs et des attaques éventuelles que le serveur a subi. On peut ainsi garder une trace d'éventuelles attaques même si le pirate a tenté d'effacer ses marques sur la machine cible.

Alléger un serveur

Enfin la possibilité de déporter ses logs sur un serveur de logs peut permettre d'alléger un serveur qui tourne sous une configuration minimale avec très peu d'espace disque.

Par exemple ce type de configuration prend tout son sens sur un Pare feu qui fonctionne avec un flash disk IDE d'un Go

Installation et premiers pas

Installation sous Debian GNU/Linux

Syslog-ng va remplacer syslog sur votre système. L'installation se fait via la commande :

# aptitude install syslog-ng

Configuration

La configuration de syslog-ng se fait dans le fichier /etc/syslong-ng/syslog-ng.conf. Sous Debian syslog-ng est configuré par défaut pour effectuer le même travail que le défunt syslog.

Dans ce fichier de configuration on va retrouver quatre notions essentielles qui vont nous permettre de gérer nos logs comme bon nous semble :

  • La notion de "source"
  • La notion de "destination"
  • La notion de "filtre"
  • La déclaration d'un "log"

La notion de source

Une "source" est le media d'arrivée d'un log, c'est à dire par quel moyen l'information va t elle arriver à syslog-ng. Il peut s'agir :

  • d'un flux local
  • d'un flux réseau (tcp ou udp)
  • d'une socket unix
  • ...

Pour une liste exhaustive des sources disponibles, reportez vous à l'aide de syslog-ng qui est très bien faite et naturellement disponible sous Debian dans /usr/share/doc/syslog-ng/.

La syntaxe de déclaration d'une source est :

source <identifier> { source-driver(params); source-driver(params); ... };

Par exemple pour déclarer comme source les logs générés par la machine via la socket /dev/log :

source s_machineLocale {
    unix-stream("/dev/log");
}

Il est possible de combiner plusieurs sources dans une même déclaration :

source s_machineLocale {
    internal();
    unix-stream("/dev/log");
}

Voici par exemple la déclaration d'une source réseau afin que syslog-ng écoute les logs qui lui sont envoyés en tcp sur le port 514 (port par défaut):

source s_fluxReseau {
    tcp(port(514));
}

Note : les matériels propriétaires genre Cisco ou Netopia demandent un accès UDP plutôt que TCP.

La notion de destination

La déclaration d'une destination va permettre de définir ce que l'on fait d'un fichier de log que l'on vient de recevoir. Il est alors possible de :

  • Stocker les messages dans un fichier (ce que l'on fait la plupart du temps)
  • renvoyer les logs à une machine distante
  • envoyer les logs à un utilisateur connecté sur un terminal
  • ...

La syntaxe de déclaration d'une destination est :

destination <identifier> { destination-driver(params); destination-driver(params); ... };

Intéressons nous ici au stockage des fichiers de log dans un fichier.

Par exemple voici la destination pour le fichier auth.log :

destination df_auth { file("/var/log/auth.log"); };

Il est aussi possible de classer automatiquement ses logs. Par exemple l'on souhaite classer les logs par année/mois/jour :

destination df_auth { 
    file("/var/log/$YEAR/$MONTH/$DAY/auth.log"); 
    owner("root")
    group("adm")
    perm(0600)
    create_dirs(yes));
};

La notion de filtre

Le filtre est un peu la table de routage de syslog-ng. Un filtre permet d'identifier un "type" de logs pour ensuite lui appliquer un une destination.

La syntaxe générale de déclaration d'un filtre est :

filter <identifier> { expression; };

Un filtre peut être établi en fonction de la criticité et facilité d'un log mais aussi grâce au nom du programme émetteur ou encore via une expression régulière.

Voici par exemple la déclaration du filtre pour le auth.log :

filter f_auth { facility(auth, authpriv); };

Déclaration d'un log

La déclaration d'un log est le liant de notre sauce ! Un log selon syslog-ng est donc composé :

  • d'une source
  • d'une destination
  • de filtres éventuels

Par exmple voici la déclaration pour auth.log :

log {
        source(s_machineLocale);
        filter(f_auth);
        destination(df_auth);
};

Mise en oeuvre

Prenons maintenant un cas pratique avec la gestion des logs d'un pare-feu déporté sur un serveur de log. Les deux serveurs utilisent syslog-ng.

  • Notre pare-feu "firewall" a une patte sur le réseau local avec l'adresse 192.168.1.254
  • Notre serveur de log "logger" a pour adresse 192.168.1.10
  • Notre pare-feu logue les régles iptables avec le préfixe "FIREWALL-IN" "FIREWALL-OUT" ou "FIREWALL-FWD"

Dans ce cas pratique on ne s'occupera que des logs "auth.log" et des logs générés par iptables sur le parefeu.

Configuration du serveur de log

Ajout d'une source réseau

La première chose à faire est de déclarer une nouvelle source sur le réseau dans le fichier /etc/syslog-ng/syslog-ng.conf :

# Network source
source s_network {
        tcp(port(514));
};

Il est alors judicieux d'autoriser le flux réseau spécifié entre le serveur de log et le pare-feu

Déclaration des destinations

On veut stocker les messages issus de notre pare-feu dans une arborescence du type /var/log/adresse_ip/Année/Mois/Jour.

On va donc déclarer une destination pour notre fichier auth.log ainsi que pour les logs iptables que l'on va stocker dans un fichier firewall.log :

# Destination pour le auth.log
destination ndf_auth { 
        file("/var/log/$HOST/$YEAR/$MONTH/$DAY/auth.log"
        owner("root")
        group("adm")
        perm(0600)
        create_dirs(yes));
};
# Destination pour le firewall.log
destination ndf_firewall { 
        file("/var/log/$HOST/$YEAR/$MONTH/$DAY/firewall.log"
        owner("root")
        group("adm")
        perm(0600)
        create_dirs(yes));
};

Déclaration des filtres

Le filtre concernant le fichier auth.log est défini par défaut dans syslog-ng. On va donc le réutiliser. Par contre on va en créer un nouveau pour ce qui concerne les logs de notre pare-feu :

filter f_firewall{
        match("FIREWALL-IN")
        or match("FIREWALL-OUT")
        or match("FIREWALL-FWD");
};

Déclaration des logs

Enfin on va déclarer deux nouveaux "log" pour le auth.log et le firewall.log en spécifiant à chaque fois la source, destination et le filtre :

# Pour le auth.log du pare-feu
log {
        source(s_network);
        filter(f_auth);
        destination(ndf_auth);
};
# Pour le firewall.log du pare-feu
log {
        source(s_network);
        filter(f_firewall);
        destination(ndf_firewall);
};

Configuration de la machine émettrice

Il ne nous reste plus qu'à configurer la machine émettrice pour lui dire d'envoyer les logs sur le serveur de log. Pour cela une fois syslog-ng installé, il va falloir spécifier une nouvelle destination (le serveur de log) et déporter ainsi les logs souhaités.

Ajout d'une destination

Dans le fichier syslog-ng.conf ajouter la destination du serveur de log :

destination d_logger {tcp ("192.168.1.10" port(514)); };

Modification des logs souhaités

Ensuite il suffit de remplacer dans les blocs log la destination par celle du serveur de log :

log {
        source(s_all);
        filter(f_syslog);
        #destination(df_syslog);
        destination(d_logger);
};

...

Cas particuliers

Dans un Vserver

Un Vserver restreint les accès à certains fichiers dans /proc et en particulier /proc/kmsg. Il faut donc mettre en commentaire la ligne file("/proc/kmsg" ...); dans la source s_all livrée en standard. Cette mesure concerne uniquement les serveurs virtualisés (les guest) ; le serveur maître (le host), lui, y a accès et pourra donc extraire les logs du noyau, par exemple vers un syslog-ng commun virtualisé.

Depuis un environnement restreint

Afin de permettre à un service de générer des logs depuis un environnement restreint, de type chroot, il faut créer une socket dans l'environnement, par exemple /srv/chroot/bind/dev/log, et ajouter une ligne unix-stream("/srv/chroot/bind/dev/log"); dans vos sources de logs (typiquement dans s_all).

Syslog-ng (dernière édition le 2008-02-21 22:10:04 par localhost)