<!DOCTYPE linuxdoc
               PUBLIC "-//LinuxDoc//DTD LinuxDoc 96//EN" >

<article>

<title>L'écriture de règles Snort
<author>version originale par Martin Roesch &nl;traduction française par Denis Ducamp
<date>24 janvier 2001 - version 1.7 / traduction française 29 avril 2001
<abstract>Comment écrire des règles Snort et garder son équilibre mental

<toc>

<sect>Les bases

<p>Snort utilise un langage simple et léger de description de règles qui est
flexible et assez puissant. Il y a nombre d'indications simples à se
souvenir en développant des règles Snort.

<p>La première est que les règles Snort doivent être complètement contenues
sur une seule ligne, l'analyseur de règles de Snort ne sait pas comment
traiter des règles sur plusieurs lignes.

<p>Les règles Snort sont divisées en deux sections logiques, l'entête de la
règle et les options de la règle. L'entête de règle contient comme
informations l'action de la règle, le protocole, les adresses IP source et
destination et les masques réseau, et les ports source et destination. La
section options de la règle contient les messages d'alerte et les
informations sur les parties du paquet qui doivent être inspectées pour
déterminer si l'action de la règle doit être acceptée.

<p>Voici une règle d'exemple :

<table>
<tabular ca="c">
<bf>alert tcp any any -> 192.168.1.0/24 111 (content:"&verbar;00 01 86 a5&verbar;"; msg: "mountd access";)</bf>
</tabular>
</table>

<p>Figure 1 - Exemple de règle Snort

<p>Le texte jusqu'à la première parenthèse est l'entête de règle et la
section entourée par les parenthèses est les options de la règle. Les mots
avant les deux-points dans la section des options de la règle sont appelés
les mots clés des options. Notez que la section des options de la règle
n'est spécifiquement requise par aucune règle, elles sont juste utilisées
pour le bien de rendre plus strictes les définitions des paquets à collecter
ou à alarmer (ou à ignorer, d'ailleurs). Tous les éléments dans cette
composition de règle doivent être vrais pour que l'action de règle indiquée
soit acceptée. En les prenant ensembles, les éléments peuvent être
considérés comme formant la déclaration d'un ET logique. En même temps, les
diverses règles dans un fichier bibliothèque de règles Snort peuvent être
considérées comme formant une large déclaration d'un OU logique. Commençons
par parler à propos de la section d'entête de règle.

<sect1>Les inclusions

<p>Le mot clé include permet à d'autres fichiers de règles d'être inclus
dans le fichier de règles indiqué sur la ligne de commande de Snort. Il
fonctionne beaucoup comme un "#include" du langage de programmation C,
lisant le contenu de fichier nommé et les mettant en place dans le fichier à
la place où l'include apparaît.

<p>Format :

<p><bf>include: &lt;répertoire/nom du fichier include></bf>

<p>Notez qu'il n'y a pas de point-virgule à la fin de la ligne. Les fichiers
inclus substitueront toute valeur de variable prédéfinie dans le fichier de
règles de Snort.

<sect1>Les variables

<p>Des variables peuvent être définies dans Snort. Ce sont de simples
substitutions des variables fixées avec le mot clé var comme dans la Figure
2.

<p>Format :

<p><bf>var: &lt;nom> &lt;valeur></bf>

<table>
<tabular ca="c">
<bf>var MY&lowbar;NET &lsqb;192.168.1.0/24,10.1.1.0/24]
&nl;alert tcp any any -> $MY&lowbar;NET any (flags: S; msg: "SYN packet";)</bf>
</tabular>            
</table>

<p>Figure 2 - Exemple de définition et d'utilisation de variable

<p>Les noms de variables de règles peuvent être modifiées de plusieurs
façons. Vous pouvez définir des méta-variables en utilisant l'opérateur "$".
Celles-ci peuvent être utilisées avec les opérateurs de modification de
variables, "?" et "-".

<itemize>
<item>$var - défini la méta-variable
<item>$(var) - remplace avec le contenu de la variable "var"
<item>$(var:-défaut) - remplace avec le contenu de la variable "var" ou avec
"défaut" si "var" est indéfini.
<item>$(var:?message) - remplace avec le contenu de la variable "var" ou
affiche le message d'erreur "message" et quitte
</itemize>

<p>Voir Figure 3 pour un exemple de ces modificateurs de règles en action.

<table>
<tabular ca="c">
<bf>var MY&lowbar;NET $(MY&lowbar;NET:-192.168.1.0/24)
&nl;log tcp any any -> $(MY&lowbar;NET:?MY&lowbar;NET is undefined!) 23</bf>
</tabular>
</table>              

<p>Figure 3 - Exemple d'utilisation avancée de variable

<sect>Les entêtes de règle

<sect1>L'action de règle

<p>L'entête de règle contient l'information qui défini le "qui, où, et quoi"
d'un paquet, ainsi que quoi faire dans l'événement où le paquet avec tous
les attributs indiqués dans la règle devrait se présenter. Le premier
élément dans une règle est l'action de règle. L'action de règle dit à Snort
quoi faire quand il trouve un paquet qui correspond aux critères de la
règle. Il y a cinq actions accessibles par défaut dans Snort, alert, log,
pass, activate, et dynamic.

<itemize>
<item>alert - génère une alerte en utilisant la méthode d'alerte
sélectionnée, et alors journalise le paquet
<item>log - journalise le paquet
<item>pass - ignore le paquet
<item>activate - alerte et alors active une autre règle dynamic
<item>dynamic - reste passive jusqu'à être activée par une règle activate,
alors agit comme une règle log
</itemize>

<p>Vous pouvez aussi définir vos propres types de règles et associer un ou
plusieurs plugins de sortie avec eux. Vous pouvez alors utiliser le type de
règle comme action dans les règles Snort.

<p>Cet exemple créera un type qui journalisera juste vers tcpdump :

<verb>            ruletype suspicious 
            { 
                type log 
                output log_tcpdump: suspicious.log 
            }
</verb>

<p>Cet exemple créera un type de règle qui journalisera vers syslog et une
base de données mysql :

<verb>            ruletype redalert 
            { 
                type alert 
                output alert_syslog: LOG_AUTH LOG_ALERT 
                output database: log, mysql, user=snort dbname=snort host=localhost 
            } 
</verb>

<sect1>Les protocoles

<p>Le champ suivant dans une règle est le protocole. Il y a trois protocoles
IP que Snort analyse actuellement pour des comportements suspicieux, tcp,
udp, et icmp. Dans le futur il pourra y en avoir plus, tels que ARP, IGRP,
GRE, OSPF, RIP, IPX, etc.

<itemize>
<item>tcp
<item>udp
<item>icmp
</itemize>

<sect1>Les adresses IP

<p>La section suivante de l'entête de règle s'occupe comme information de
l'adresse IP et du port pour une règle donnée. Le mot clé "any" peut être
utilisé pour définir n'importe quelle adresse. Snort n'a pas de mécanisme
pour fournir de la résolution de nom pour le champ de l'adresse IP dans le
fichier de règles. Les adresses sont formées par une simple adresse IP
numérique et un bloc CIDR. Le bloc CIDR indique le masque réseau qui doit être
appliqué à l'adresse de la règle et à tout paquet qui est testé par rapport
à la règle. Un masque de bloc CIDR de /24 indique un réseau de classe C,
/16 un réseau de classe B, et /32 indique l'adresse spécifique d'une
machine. Par exemple, la combinaison d'adresse/CIDR 192.168.1.0/24 devrait
signifier le bloc d'adresses de 192.168.1.1 à 192.168.1.255. Toute règle
qui utilise cette désignation pour, disons, l'adresse destination devrait
correspondre à toute adresse dans cet intervalle. Les désignations CIDR nous
donne une façon rapide de désigner de larges espaces d'adresses avec juste
quelques caractères.

<p>Dans la Figure 1, l'adresse IP source était fixée pour correspondre à
tout ordinateur parlant, et l'adresse destination était fixée pour
correspondre au réseau de classe C 192.168.1.0 .

<p>Il y a un opérateur qui peut être appliqué aux adresses IP, l'opérateur
de négation. Cet opérateur dit à Snort de correspondre à toute adresse IP
sauf celles indiquées par la liste d'adresses IP. L'opérateur de négation
est indiqué par un "!". Par exemple, une modification facile à l'exemple
initial est de le faire alerter sur tout trafic qui provient de l'extérieur
du réseau local avec l'opérateur de négation comme montré dans la Figure 4.

<table>
<tabular ca="c">
<bf>alert tcp !192.168.1.0/24 any -> 192.168.1.0/24 111 (content: "&verbar;00 01 86 a5&verbar;"; msg: "external mountd access";)</bf>
</tabular>
</table>

<p>Figure 4 - Un exemple de règle avec négation d'adresse IP

<p>Ces adresses IP de la règle indiquent "tout paquet tcp avec une adresse
source ne provenant pas du réseau interne et à destination du réseau
interne".

<p>Vous pouvez aussi spécifier des listes d'adresses IP. Une liste IP
spécifiée en entourant une liste d'adresses IP et de blocs CIDR séparés par
des virgules entre crochets. Pour le moment, une liste IP ne peut pas
inclure d'espaces entre les adresses. Voir la Figure 3 pour un exemple de
liste IP en action.

<table>
<tabular ca="c">
<bf>alert tcp !&lsqb;192.168.1.0/24,10.1.1.0/24] any -> &lsqb;192.168.1.0/24,10.1.1.0/24] 111 (content: "&verbar;00 01 86 a5&verbar;"; msg: "external mountd access";)</bf>
</tabular>
</table>

<sect1>Les numéros de ports

<p>Les numéros de ports peuvent être spécifiés de nombre de façons, incluant
"any" (ndt : tous les ports), des définitions de ports statiques, des
intervalles et des négations. Les ports "any" sont les valeurs génériques,
signifiant littéralement tous les ports. Les ports statiques sont indiqués
par un seul numéro de port, tel que 111 pour portmapper, 23 pour telnet, ou
80 pour http, etc. Les intervalles de ports sont indiqués avec l'opérateur
d'intervalle ":". L'opérateur d'intervalle peut être appliqué dans nombre de
façons pour prendre différentes significations, tel que dans la Figure 5.

<table> 
<tabular ca="c">
<bf>log udp any any -> 192.168.1.0/24 1:1024</bf>
&nl;<it>journalise le trafic udp provenant de tout port et à destination de
 &nbsp;ports dans l'intervalle de 1 à 1024</it><rowsep>
<bf>log tcp any any -> 192.168.1.0/24 :6000</bf>
&nl;<it>journalise le trafic tcp depuis tout port et allant vers les ports
 &nbsp;inférieurs ou égaux à 6000</it><rowsep>
<bf>log tcp any :1024 -> 192.168.1.0/24 500:</bf>
&nl;<it>journalise le trafic tcp depuis les ports privilégiés inférieurs ou
 &nbsp;égaux à 1024 allant vers les ports supérieurs ou égaux à 500</it>
</tabular>
</table>

<p>Figure 5 - Exemples d'intervalles de ports

<p>La négation de port est indiquée en utilisant l'opérateur de négation
"!". L'opérateur de négation peut être appliqué à tous les autres types de
règles (excepté "any", qui se traduirait en aucun, combien ce serait
Zen...). Par exemple, si pour quelque raison tordue vous voulez tout
journaliser sauf les ports X Windows, vous pourriez faire quelque chose
comme la règle dans la Figure 6.

<table>
<tabular ca="c">
<bf>log tcp any any -> 192.168.1.0/24 !6000:6010</bf>
</tabular>
</table>

<p>Figure 6 - Exemple de négation de port

<sect1>L'opérateur de direction

<p>L'opérateur de direction "->" indique l'orientation, ou la "direction",
du trafic auquel la règle s'applique. L'adresse IP et les numéros de ports
du côté gauche de l'opérateur de direction est considéré comme le trafic
provenant du système source, et les informations d'adresse et de port du
côté droit de l'opérateur est le système destination. Il y a aussi un
opérateur bidirectionel, qui est indiqué par le symbole "&lt;>". Ceci dit à
Snort de considérer les paires adresse/port ou bien en source ou bien en
destination de l'orientation. C'est utile pour enregistrer/analyser les deux
côtés d'une conversation, tel que des sessions telnet ou POP3. Un exemple de
l'opérateur bidirectionel étant utilisé pour enregistrer les deux côtés
d'une session telnet est montré en Figure 7.

<table>
<tabular ca="c">
<bf>log !192.168.1.0/24 any &lt;> 192.168.1.0/24 23</bf>
</tabular>
</table>

<p>Figure 7 - Une règle Snort utilisant l'opérateur bidirectionel

<sect1>Les règles activate/dynamic

<p>Les paires de règles activate/dynamic donnent à Snort une capacité
puissante. Vous pouvez maintenant avoir une règle qui en active une autre
pour un nombre fixé de paquets quand son action est accomplie. Ceci est très
utile si vous voulez configurer Snort pour effectuer l'enregistrement de ce
qui suit quand une règle spécifique "se désactive". Les règles d'activation
se comportent juste comme les règles alert, excepté qu'elles ont un champ
d'option *obligatoire* : "activates". Les règles dynamiques se comportent
juste comme les règles log, mais elles ont un champ d'option différent :
"activated_by". Les règles dynamiques ont également un second champ
obligatoire, "count". Quand la règle "activate" se désactive, elle active la
règle dynamique qui lui est liée (indiquée par les numéros d'option
activates/activated_by) pour "count" paquets (50 dans ce cas).

Mettez les ensembles et elles ressemblent à ceci :

<table>
<tabular ca="c">
activate tcp !$HOME&lowbar;NET any -> $HOME&lowbar;NET 143 (flags: PA; content: "&verbar;E8C0FFFFFF&verbar;\bin&verbar;; activates: 1; msg: "IMAP buffer overflow!";)
&nl;
&nl;dynamic tcp !$HOME&lowbar;NET any -> $HOME&lowbar;NET 143 (activated&lowbar;by: 1; count: 50;)
</tabular>
</table>

<p>Figure 8 - exemple de règles activate/dynamic

<p>Ces règles disent à Snort d'alerter quand il détecte un débordement de
tampon dans IMAP et collecte les 50 prochains paquets destinés au port 143
provenant de l'extérieur de $HOME_NET et destinés à $HOME_NET. Si le
débordement de tampon arrive et a réussi, il y a de très bonnes possibilités
que des données utiles seront contenues dans les prochains 50 (ou quel que
soit) paquets allant au même port de service sur le réseau, ainsi il y a
avantage à collecter ces paquets pour une analyse ultérieure.

<sect>Les options de règle

<p>Les options de règle forment le coeur du moteur de détection d'intrusion
de Snort, combinant facilité d'utilisation, puissance et flexibilité. Toutes
les options de règle de Snort sont séparées les unes des autres par un
caractère point virgule ";". Les mots clés des options de règle sont séparés
de leurs arguments avec un caractère deux points ":". Au moment de la
rédaction, il y a 15 mots clé d'option de règle disponibles dans Snort :

<itemize>

<item>msg - affiche un message dans les alertes et journalise les paquets
<item>logto - journalise le paquet dans un fichier nommé par l'utilisateur
au lieu de la sortie standard
<item>ttl - teste la valeur du champ TTL de l'entête IP
<item>tos - teste la valeur du champ TOS de l'entête IP
<item>id - teste le champ ID de fragment de l'entête IP pour une valeur
spécifiée
<item>ipoption - regarde les champs des options IP pour des codes
spécifiques
<item>fragbits - teste les bits de fragmentation de l'entête IP
<item>dsize - teste la taille de la charge du paquet contre une valeur
<item>flags - teste les drapeaux TCP pour certaines valeurs
<item>seq - teste le champ TCP de numéro de séquence pour une valeur
spécifique
<item>ack - teste le champ TCP d'acquittement pour une valeur spécifiée
<item>itype - teste le champ type ICMP contre une valeur spécifiée
<item>icode - teste le champ code ICMP contre une valeur spécifiée
<item>icmp_id - teste la champ ICMP ECHO ID contre une valeur spécifiée
<item>icmp_seq - teste le numéro de séquence ECHO ICMP contre une valeur
spécifique
<item>content - recherche un motif dans la charge d'un paquet
<item>content-list - recherche un ensemble de motifs dans la charge d'un
paquet
<item>offset - modifie l'option content, fixe le décalage du début de la
tentative de correspondance de motif
<item>depth - modifie l'option content, fixe la profondeur maximale de
recherche pour la tentative de correspondance de motif
<item>nocase - correspond à la procédure de chaîne de contenu sans
sensibilité aux différences majuscules/minuscules
<item>session - affiche l'information de la couche applicative pour la
session donnée
<item>rpc - regarde les services RPC pour des appels à des
applications/procédures spécifiques
<item>resp - réponse active (ferme les connexions, etc)
<item>react - réponse active (bloque les sites web)
</itemize>

<sect1>Msg

<p>L'option de règle msg dit au moteur de journalisation et d'alerte le
message à imprimer avec une sauvegarde du paquet ou une alerte. C'est une
simple chaîne texte qui utilise "\" comme caractère d'échappement pour
indiquer un caractère discret qui pourrait autrement rendre confus
l'analyseur de règles de Snort (tel que le caractère point virgule ";").

<p>Format :

<p><bf>msg: "&lt;message texte>";</bf>

<sect1>Logto

<p>L'option logto dit à Snort de journaliser tous les paquets qui
déclenchent cette règle vers un fichier journal de sortie spécial. C'est
spécialement pratique pour combiner les données de choses comme les
activités NMAP, les scans CGI HTTP, etc. Il doit être noté que cette option
ne marche pas quand Snort est en mode de journalisation binaire.

<p>Format :

<p><bf>logto: "&lt;nom de fichier>";</bf>

<sect1>TTL

<p>Cette règle d'option est utilisée pour fixer la valeur time-to-live à
tester. Le test qu'il effectué est réussi seulement sur une correspondance
exacte. Ce mot de clé d'option était destiné à être utilisé pour détecter
les tentatives de traceroute.

<p>Format :

<p><bf>ttl: "&lt;nombre>";</bf>

<sect1>TOS

<p>Le mot clé "tos" vous permet de vérifier le champ TOS de l'entête IP pour
une valeur spécifique. Le test effectué est réussi seulement sur une
correspondance exacte.

<p>Format :

<p><bf>tos: "&lt;nombre>";</bf>

<sect1>ID

<p>Ce mot clé d'option est utilisé pour tester une correspondance exacte
dans le champ ID de fragment de l'entête IP. Quelques programmes de pirates
(et d'autres programmes) fixent ce champ spécifiquement pour différents
besoins, par exemple la valeur 31337 est très populaire avec certains
pirates. Ceci peut être retourné contre eux en mettant en place une simple
règle pour tester ceci et quelques autres "nombres de pirates".

<p>Format :

<p><bf>id: "&lt;nombre>";</bf>

<sect1>Ipoption

<p>Si des options IP sont présentes dans un paquet, cette option va chercher
l'utilisation d'une option spécifique, tel que le routage par la source. Les
arguments valides de cette option sont :

<itemize>
<item>rr - Record route (ndt : enregistrement de la route)
<item>eol - End of list (ndt : fin de liste)
<item>nop - No op (ndt : pas d'opération)
<item>ts - Time Stamp (ndt : horaire)
<item>sec - IP security option (ndt : option de sécurité IP)
<item>lsrr - Loose source routing (ndt : routage vague par la source)
<item>ssrr - Strict source routing (ndt : routage stricte par la source)
<item>satid - Stream identifier
</itemize>

<p>Les options IP les plus fréquemment regardées sont les routages vague et
stricte par la source qui ne sont utilisés dans aucune application Internet.
Seulement une seule option peut être spécifiée par règle.

<p>Format :

<p><bf>ipopts: &lt;option>;</bf>

<sect1>Fragbits

<p>Cette règle inspecte les bits de fragment et le bit réservé dans
l'entête IP. Il y a trois bits qui peuvent être vérifiés, le bit Reserved
Bit (RB), le bit More Fragments (MF) et le bit Dont Fragment (DF). Ces bits
peuvent être vérifiés pour une variété de combinaisons. Utilisez les valeurs
suivantes pour indiquer les bits spécifiques :

<itemize>
<item>R - Reserved Bit
<item>D - DF bit
<item>M - MF bit
</itemize>

Vous pouvez également utiliser des modificateurs pour indiquer des critères
logiques de correspondance pour les bits spécifiés :

<itemize>
<item>+ - Tous les drapeaux, correspond si au moins les bits spécifiés sont
positionnés
<item>* - Au moins un drapeau, correspond si au moins un des bits spécifiés
est positionné
<item>! - Aucun drapeau, correspond si aucun des bits spécifiés n'est
positionné
</itemize>

<p>Format :

<p><bf>fragbits: &lt;valeurs des bits>;</bf>

<table>
<tabular ca="c">
<bf>alert tcp !$HOME&lowbar;NET any -> $HOME&lowbar;NET any (fragbits: R+; msg: "Reserved IP bit set!";)</bf>
</tabular>
</table>

<p>Figure 9 - Exemple d'utilisation de la détection par fragbits

<sect1>Dsize

<p>L'option dsize est utilisée pour tester la taille de la charge du paquet.
Il peut être fixé à toute valeur, utilise en plus les signes
supérieur/inférieur pour indiquer des intervalles et des limites. Par
exemple, si vous savez qu'un certain service a un tampon d'une certaine
taille, vous pouvez fixer cette option pour regarder les tentatives de
débordement de tampons. Cela a l'avantage supplémentaire d'être une façon
bien plus rapide de tester contre les débordements de tampons qu'une
vérification de contenu de la charge.

<p>Format :

<p><bf>dsize: &lsqb;>|&lt;] &lt;nombre>;</bf>

<p><it>Note : Les opérateurs > et &lt; sont optionnels !</it>

<sect1>Content

<p>Le mot clé content est une des fonctionnalités les plus importantes de
Snort. Il autorise l'utilisateur de fixer des règles qui recherchent un
contenu spécifique dans la charge du paquet et déclencher une réponse basée
sur les données. A chaque fois que l'option content de correspondance de
motif est exécutée, la fonction de correspondance de motif de Boyer-Moore
est appelée et le test (plutôt cher en temps de calcul) est effectué contre
le contenu du paquet. Si une donnée correspondant exactement à la chaîne de
donnée en argument est contenue n'importe où dans la charge de paquet, le
test est réussi et le reste des options de la règle est exécutée. Sachez que
ce test fait la différence entre majuscules et minuscules.

<p>La donnée d'option pour le mot clé content est quelque peu complexe; il
peut contenir du texte et des données binaires mélangées. Les données
binaires sont généralement entourées dans des caractères barre verticale
("|") et représentées en tant que bytecode. Un bytecode représente une
donnée binaire comme des nombres hexadécimaux et c'est une bonne méthode de
raccourci pour décrire des données binaires complexes. La Figure 7 contient
un exemple de mélange de textes et de données binaires dans une règle Snort.

<table>
<tabular ca="c">
<bf>alert tcp any any -> 192.168.1.0/24 143 (content: "&verbar;90C8 C0FF FFFF&verbar;/bin/sh"; msg: "IMAP buffer overflow!";)</bf>
</tabular>
</table>

<p>Figure 10 - Mélange de bytecode binaire et de texte dans une option de
règle content

<p>Format :

<p><bf>content: "&lt;chaîne de contenu>";</bf>

<sect1>Offset

<p>L'option de règle offset est utilisée comme un modificateur des règles
utilisant le mot clé d'option content. Ce mot clé modifie la position de
début de recherche pour la fonction de correspondance de motif depuis le
début de la charge du paquet. Il est très utile pour des choses comme des
règles de détection de scans CGI où la chaîne de recherche de contenu n'est
jamais trouvée dans les quatre premiers octets de la charge. Soin doit être
pris à ne pas fixer la valeur offset trop strictement sous peine de
manquer potentiellement une attaque ! Ce mot clé d'option de règle ne peut
pas être utilisé sans spécifier également l'option de règle content.

<p>Format :

<p><bf>offset: &lt;nombre>;</bf>

<sect1>Depth

<p>Depth est une autre modification de l'option de règle content. Ceci fixe
la profondeur maximale de recherche dans la fonction content de
correspondance de motif de recherche depuis le début de sa région de
recherche. Il est utile pour limiter la fonction de correspondance de motif
d'exécuter des recherches inefficaces une fois que la région de recherche
probable pour un ensemble de contenus donné a été dépassée. (C'est à dire
que si vous recherchez "cgi-bin/phf" dans un paquet relatif au web, vous
n'avez probablement pas besoin de perdre du temps à rechercher dans la
charge après les 20 premiers octets!) Voir la Figure 8 pour un exemple de
règle de recherche combinant content, offset et depth.

<p>Format :

<p><bf>depth: &lt;nombre>;</bf>

<table>
<tabular ca="c">
<bf>alert tcp any any -> 192.168.1.0/24 80 (content: "cgi-bin/phf"; offset: 3; depth: 22; msg: "CGI-PHF access";)</bf>
</tabular>
</table>

<p>Figure 11 - Règle combinant content, offset et depth

<sect1>Nocase

<p>L'option nocase est utilisée pour désactiver la différence
majuscules/minuscules dans une règle "content". Elle est spécifiée seule
dans une règle et tout caractère ASCII qui est comparé à la charge du
paquet est traité comme si il était soit en majuscule soit en minuscule.

<p>Format :

<p><bf>nocase;</bf>

<table>
<tabular ca="c">
<bf>alert tcp any any -> 192.168.1.0/24 21 (content: "USER root"; nocase; msg: "FTP root user access attempt";)</bf>
</tabular>
</table>

<p>Figure 12 - Règle content avec le modificateur nocase

<sect1>Flags

<p>Cette règle teste les drapeaux TCP pour une correspondance. Il y a
actuellement 8 drapeaux variables qui sont disponibles dans Snort :

<itemize>
<item>F - FIN (le bit le moins significatif dans l'octet des drapeaux TCP)
<item>S - SYN
<item>R - RST
<item>P - PSH
<item>A - ACK
<item>U - URG
<item>2 - bit réservé 2
<item>1 - bit réservé 1
</itemize>

<p>Il y a aussi des opérateurs logiques qui peuvent être utilisés pour
spécifier des critères de correspondance pour les drapeaux indiqués :

<itemize>
<item>+ - Tous les drapeaux, correspond si au moins les bits spécifiés sont
positionnés
<item>* - Au moins un drapeau, correspond si au moins un des bits spécifiés
est positionné
<item>! - Aucun drapeau, correspond si aucun des bits spécifiés n'est
positionné
</itemize>

<p>Les bits réservés peuvent être utilisés pour détecter des comportements
non usuels, tels que des tentatives d'empreintes digitales de piles IP ou
d'autres activités suspicieuses. La Figure 13 montre un règle de détection
d'un scan SYN-FIN .

<p>Format :

<p><bf>flags: &lt;valeurs de drapeaux>;</bf>

<table>
<tabular ca="c">
<bf>alert any any -> 192.168.1.0/24 any (flags: SF; msg: "Possible SYN FIN scan";)</bf>
</tabular>
</table>

<p>Figure 13 - Exemple de spécification de drapeaux TCP

<sect1>Seq

<p>Cette option de règle se réfère aux numéros de séquence TCP.
Essentiellement, il détecte si le paquet a un numéro de séquence statique
fixé, et donc plutôt peu utilisé. Elle a été incluse pour le bien de
l'exhaustivité.

<p>Format :

<p><bf>seq: &lt;nombre>;</bf>

<sect1>Ack

<p>Le mot clé ack d'option de règle se réfère au champ d'acquittement de
l'entête TCP. Cette règle a un propos pratique jusqu'ici : détecter les
pings TCP NMAP. Un ping TCP NMAP fixe ce champ à zéro et envoie un paquet
avec le drapeau ACK TCP pour déterminer si un système réseau est actif. La
règle pour détecter l'activité est montrée dans la Figure 14.

<p>Format :

<p><bf>ack: &lt;nombre>;</bf>

<table>
<tabular ca="c">
<bf>alert any any -> 192.168.1.0/24 any (flags: A; ack: 0; msg: "NMAP TCP ping";)</bf>
</tabular>
</table>

<p>Figure 14 - Utilisation du champ ACK TCP

<sect1>Itype

<p>Cette règle teste la valeur du champ type ICMP. Il est fixé en utilisant
la valeur numérique du champ. Pour une liste des valeurs disponibles,
regardez dans le fichier decode.h inclus avec Snort ou dans toute référence
ICMP. Il doit être noté que les valeurs peuvent être fixées en dehors de
l'intervalle pour détecter des valeurs de type ICMP invalides qui sont
quelques fois utilisées dans des dénis de services et des attaques en
inondations.

<p>Format :

<p><bf>itype: &lt;nombre>;</bf>

<sect1>Icode

<p>Le mot clé d'option de règle icode est plutôt identique à la règle itype,
fixez juste une valeur numérique ici et Snort va détecter tout trafic en
utilisant cette valeur de code ICMP. Les valeurs hors intervalle peut
également être fixé pour détecter le trafic suspicieux.

<p>Format :

<p><bf>icode: &lt;nombre>;</bf>

<sect1>Session

<p>Le mot clé session est nouveau depuis la version 1.3.1.1 et est utilisé
pour extraire les données utilisateurs depuis les sessions TCP. Il est
extrêmement utile pour voir ce que les utilisateurs tapent dans telnet,
rlogin, ftp et même les sessions web. Il y a deux mots clé disponibles en
argument pour l'option de règle session, printable ou all. Le mot clé
printable affiche seulement les données que l'utilisateur verrait
normalement ou serait capable de taper. Le mot clé all substitue les
caractères non imprimables avec leurs équivalents hexadécimaux. Cette
fonction peut ralentir considérablement Snort, donc elle ne devrait pas être
utilisée dans des situations de charge importante, et est probablement mieux
adaptée au post-traitement de fichiers journaux binaires (format tcpdump).
Voir la Figure 15 pour un bon exemple de règle de session telnet.

<p>Format :

<p><bf>session: &lsqb;printable|all];</bf>

<table>
<tabular ca="c">
<bf>log tcp any any &lt;> 192.168.1.0/24 23 (session: printable;)</bf>
</tabular>
</table>

<p>Figure 15 - Journalisation des données imprimables d'une session telnet

<sect1>Icmp_id

<p>L'option icmp_id examine le numéro ICMP ID d'un paquet ECHO ICMP pour une
valeur spécifique. C'est utile car quelques programmes de canaux cachés
utilisent des champs ICMP statiques quand ils communiquent. Ce plugin
particulier a été développé pour activer la règle de détection de
stacheldraht écrite par Max Vision, mais c'est certainement utile pour
détecter un nombre potentiel d'attaques.

<p>Format :

<p><bf>icmp_id: &lt;nombre>;</bf>

<sect1>Icmp_seq

<p>L'option Icmp_seq examine le champ séquence ICMP d'un paquet ECHO ICMP
pour une valeur spécifique. C'est utile car quelques programmes de canaux
cachés utilisent des champs ICMP statiques quand ils communiquent. Ce plugin
particulier a été développé pour activer la règle de détection de
stacheldraht écrite par Max Vision, mais c'est certainement utile pour
détecter un nombre potentiel d'attaques. (Et oui, je sais que l'information
pour ce champ est presque identique à la description de icmp_id, c'est
pratiquement la même fichue chose!)

<p>Format :

<p><bf>icmp_seq: &lt;nombre>;</bf>

<sect1>Rpc

<p>Cette option regarde les requêtes RPC et décode automatiquement
l'application, la procédure et la version de programme, en indiquant un
succès quand les trois variables correspondent toutes. Le format de l'option
d'appel est "application,procédure,version". Les caractères génériques sont
valides pour la procédure et les numéros de version et sont indiquées par
une "*".

<p>Format :

<p><bf>icmp_seq: &lt;nombre,&lsqb;nombre|*],&lsqb;nombre|*]>;</bf>

<table>
<tabular ca="c">
<bf>alert tcp any any -> 192.168.1.0/24 111 (rpc: 100000,*,3; msg:"RPC getport (TCP)";)</bf>
<rowsep><bf>alert udp any any -> 192.168.1.0/24 111 (rpc: 100000,*,3; msg:"RPC getport (UDP)";)</bf>
<rowsep><bf>alert udp any any -> 192.168.1.0/24 111 (rpc: 100083,*,*; msg:"RPC ttdb";)</bf>
<rowsep><bf>alert udp any any -> 192.168.1.0/24 111 (rpc: 100232,10,*; msg:"RPC sadmin";)</bf>
</tabular>
</table>

<p>Figure 16 - Diverses alertes d'appels RPC

<sect1>Resp

<p>Le mot clé resp met en oeuvre les réponses flexibles (FlexResp) au trafic
qui correspond à une règle Snort. Le code FlexResp permet à Snort de fermer
activement les connexions en infraction. Les arguments suivants sont valides
pour ce module :

<itemize>
<item>rst_snd - envoie des paquets TCP-RST à la socket expéditrice
<item>rst_rcv - envoie des paquets TCP-RST à la socket destinataire
<item>rst_all - envoie des paquets TCP_RST dans les deux directions
<item>icmp_net - envoie un paquet ICMP_NET_UNREACH à l'expéditeur
<item>icmp_host - envoie un paquet ICMP_HOST_UNREACH à l'expéditeur
<item>icmp_port - envoie un paquet ICMP_PORT_UNREACH à l'expéditeur
<item>icmp_all - envoie tous les paquets ci-dessus à l'expéditeur
</itemize>

<p>Les options peuvent être combinées pour envoyer des réponses multiples au
système cible. Les arguments multiples sont séparés par des virgules.

<p>Format :

<p><bf>resp: &lt;resp_modifier&lsqb;, resp_modifier...]>;</bf>

<table>
<tabular ca="c">
<bf>alert tcp any any -> 192.168.1.0/24 1524 (flags: S; resp: rst&lowbar;all; msg: "Root shell backdoor attempt";)</bf>
<rowsep><bf>alert udp any any -> 192.168.1.0/24 31 (resp: icmp&lowbar;port,icmp&lowbar;host; msg: "Hacker's Paradise access attempt";)</bf>
</tabular>
</table>

<p>Figure 17 - Exemples d'utilisation de FlexResp

<sect1>Content-list

<p>Le mot clé content-list permet à de multiples chaînes de contenu d'être
spécifiées à la place d'une unique option de contenu. Les motifs qui seront
recherchés doivent pour chacun être spécifiés sur une seule ligne du fichier
content-file comme montré dans la Figure 1, mais sinon ils sont traités
identiquement aux chaînes de contenue spécifiées comme un argument à la
directive standard content. Cette option est la base pour le mot clé react.

<table>
<tabular ca="c">
<bf># adult sites 
&nl;porn
&nl;adults
&nl;hard core
&nl;www.pornsite.com
&nl;# ...
</bf>
</tabular>
</table>

<p>Figure 18 - fichier d'exemple de content-list pour adultes

<p>Format :

<p><bf>content-list: "&lt;nom de fichier>";</bf>

<sect1>React

<p>Le mot clé react basé sur les réponses flexibles (FlexResp) met en oeuvre
la réaction flexible au trafic qui correspond à une règle Snort. La réaction
de base est de bloquer les sites intéressants que les utilisateurs veulent
accéder : New York Times, slashdot, ou quelque chose de vraiment important -
napster et les sites pornos. Le code Flex Resp permet à Snort de fermer
activement les connexions en infraction et/ou d'envoyer un message visible
au navigateur (modificateur d'avertissement disponible bientôt). Le message
peut inclure votre propre commentaire. Les argument suivants (modificateurs
de base) sont valides pour cette option :

<itemize>
<item>block - ferme la connexion et envoie message visible
<item>warn - envoie le message d'avertissement visible (sera disponible
bientôt)
&nl;L'argument de base peut être combiné avec les arguments suivants
(modificateurs supplémentaires) :
<item>msg - inclut le texte de l'option msg dans le message visible de
bloquage
<item>proxy: &lt;port_nr> - utilise le port du relais pour envoyer le message
visible
</itemize>

<p>Des arguments additionnels multiples sont séparés par une virgule. Le mot
clé react doit être placé en dernier dans la liste des options.

<p>Format :

<p><bf>react: &lt;react_basic_modifier&lsqb;, react_additional_modifier...]>;</bf>

<table>
<tabular ca="c">
<bf>alert tcp any any &lt;> 192.168.1.0/24 80 (content-list: "adults"; msg: "Not for children!"; react: block, msg;)</bf>
<rowsep><bf>alert tcp any any &lt;> 192.168.1.0/24 any (content-list: "adults"; msg: "Adults list access attempt"; react: block;)</bf>
</tabular>
</table>

<p> Figure 19 - Exemples d'utilisation de React

<sect>Les préprocesseurs

<sect1>Vue d'ensemble des préprocesseurs

<p>Les préprocesseurs ont été introduits dans la version 1.5 de Snort. Ils
permettent à snort la fonctionnalité d'être étendu en permettant aux
utilisateurs et aux programmeurs d'insérer assez facilement dans Snort des
"plugins" modulaires. Le code du préprocesseur est exécuté avant que le
moteur de détection soit appelé, mais après que le paquet ait été décodé. Le
paquet peut être modifié ou analysé de manière non classique au travers de
ce mécanisme.

<p>Les préprocesseurs sont chargés et configurés en utilisant le mot clé
<it>preprocessor</it>. Le format de la directive preprocessor dans les
règles de Snort est :

<p><bf>preprocessor &lt;nom>: &lt;options></bf>

<table>
<tabular ca="c">
<bf>preprocessor minfrag: 128</bf>
</tabular>
</table>

<p>Figure 20 - Exemple de Format de la Directive Preprocessor

<sect1>Les modules préprocesseurs accessibles

<sect2>Minfrag

<p>Le préprocesseur minfrag examine les paquets fragmentés pour une valeur
limite de taille spécifiée. Quand les paquets sont fragmentés, c'est
généralement causé par des routeurs entre la source et la destination.
Généralement, il n'y a pas d'équipement réseau commercial qui fragmente les
paquets en tailles plus petites que 512 octets, donc nous pouvons utiliser
ce fait pour activer la surveillance du réseau pour de petits fragments qui
sont généralement indicatifs de quelqu'un essayant de cacher son trafic
derrière la fragmentation.

<p>Format :

<p><bf>minfrag: &lt;valeur limite></bf>

<sect2>HTTP Decode

<p>HTTP Decode est utilisé pour traiter les chaînes HTTP URI et convertir
leurs données en chaînes ASCII non obscurcies. Ceci est fait pour vaincre
les scanners évasifs d'URL web et les attaques hostiles qui pourraient
autrement échapper aux chaînes d'analyse de contenu utilisées pour examiner
dans le trafic HTTP des activités suspicieuses. Le module préprocesseur
prend des numéros de ports HTTP (séparés par des espaces) pour être
normalisés en arguments (typiquement 80 et 8080).

<p>Format :

<p><bf>http_decode: &lt;liste de ports></bf>

<table>
<tabular ca="c">
<bf>preprocessor http&lowbar;decode: 80 8080</bf>
</tabular>
</table>

<p>Figure 21 - Exemple de Format de la Directive HTTP Decode

<sect2>Portscan Detector

<p>Le préprocesseur de scans de ports de Snort est développé par Patrick
Mullen et (beaucoup) d'autres informations sont disponibles sur sa <htmlurl
url="http://spyjurenet.com/linuxrc.org/projects/snort/" name="page web">.

<p>Ce que le préprocesseur de scans de ports de Snort fait :

<p>Journaliser le début et la fin de scans de ports depuis une unique IP
source vers la facilité de journalisation standard.

<p>Si un fichier journal est spécifié, il journalise les IP destinations et
les ports scannés ainsi que le type de scan.

<p>Un scan de ports est défini comme des tentatives de connexion TCP vers
plus de P ports en T secondes ou des paquets UDP envoyés à plus de P ports
en T secondes. Les ports peuvent être répartis au travers de tout nombre
d'adresses IP destinations, et peuvent tous être le même port si ils sont
répartis au travers de multiples IP. Cette version fait les scans de ports
unique->unique et unique->plusieurs. La prochaine version majeure fera les
scans de ports distribués (multiple->unique ou multiple->multiple). Un scan
de ports est également défini comme un unique paquet de "scan furtif", tel
que NULL, FIN, SYNFIN, XMAS, etc. Ceci signifie que dans scan-lib dans la
distribution standard de snort vous devez commenter la section pour les
paquets de scans furtifs. Le bénéfice est qu'avec le module de scans de
ports ces alertes ne devraient apparaître qu'une fois, plutôt qu'une fois
pour chaque paquet. Si vous utilisez la fonctionnalité de journalisation
externe vous pouvez voir la technique et le type dans le fichier journal.

<p>Les arguments de ce module sont :

<itemize>
<item>le réseau à surveiller - Le bloc réseau/CIDR à surveiller pour les
scans de ports
<item>le nombre de ports - le nombre de ports accédés durant la période de
détection
<item>la période de détection - le nombre de secondes à compter durant
laquelle la limite d'accès aux ports est considérée
<item>répertoire/fichier - le répertoire/fichier où placer les alertes. Les
alertes sont également écrites vers le fichier d'alerte standard.
</itemize>

<p>Format :

<p><bf>portscan: &lt;réseau à surveiller> &lt;nombre de ports> &lt;période de détection> &lt;répertoire/fichier></bf>

<table>
<tabular ca="c">
<bf>preprocessor portscan: 192.168.1.0/24 5 7 /var/log/portscan.log</bf>
</tabular>
</table>

<p>Figure 22 - Exemple de configuration du module de scans de ports

<sect2>Portscan Ignorehosts

<p>Un autre module de Patrick Mullen qui modifie le fonctionnement du
système de détection de scans de ports. Si vous avez des serveurs qui
tendent à activer le détecteur de scans de ports (tels que des serveurs NTP,
NFS et DNS), vous pouvez dire au module d'ignorer les SYN TCP et les scans
de ports UDP de certains systèmes. Les arguments de ce module sont une liste
de blocs IP/CIDR à ignorer.

<p>Format :

<p><bf>portscan-ignorehosts: &lt;liste de systèmes></bf>

<table>
<tabular ca="c">
<bf>preprocessor portscan-ignorehosts: 192.168.1.5/32 192.168.3.0/24</bf>
</tabular>
</table>

<p>Figure 23 - Exemple de configuration du module Portscan Ignorehosts

<sect2>Defrag

<p>Le module defrag (de Dragos Ruiu) permet à Snort d'effectuer de la
défragmentation IP, rendant plus difficile pour les pirates de contourner
simplement les capacités de détection du système. Il est très simple dans
son usage, requérant simplement l'addition d'une directive préprocesseur au
fichier de configuration sans aucun argument. Ce module ***supercedes***
généralement la fonctionnalité du module minfrag (c.-à-d. vous n'avez pas
besoin d'utiliser minfrag si vous utilisez defrag).

<p>Format :

<p><bf>defrag</bf>

<table>
<tabular ca="c">
<bf>preprocessor defrag</bf>
</tabular>
</table>

<p>Figure 24 - Exemple de configuration du préprocesseur defrag

<sect2>Stream

<p><bf>Ce module est toujours en BETA test, utilisez avec précautions</bf>

<p>Le plugin stream fournit la fonctionnalité de réassemblage de sessions
TCP à Snort. Les sessions TCP sur les ports configurés avec de petits
segments seront réassemblés en un flux de données que Snort peut évaluer
proprement pour des activités suspicieuses. Ce plugin prend plusieurs
arguments :

<itemize>
<item>timeout - le temps maximal en secondes pendant lequel une session sera
gardée vivante si elle n'a pas vu un paquet pour elle.
<item>port - un port serveur à surveiller. Nous ne voulons pas surveiller
toutes les sessions tcp (le voulons nous ?)
<item>maxbytes - le nombre maximal d'octets dans notre paquet reconstruit
</itemize>

<p>Format :

<p><bf>stream: timeout &lt;temps maximal>, ports &lt;ports>, maxbytes &lt;maximum d'octets></bf>

<table>
<tabular ca="c">
<bf>preprocessor stream: timeout 5, ports 21 23 80 8080, maxbytes 16384</bf>
</tabular>
</table>

<p>Figure 25 - Exemple de configuration du réassembleur de sessions TCP

<sect2>Spade : the Statistical Packet Anomaly Detection Engine

<p>Dans l'intéret de l'opportunité et du bon sens, je suggérerais de
consulter le fichier README.Spade dans la distribution Snort ainsi que de
consulter <htmlurl url="http://www.silicondefense.com/spice/"
name="http://www.silicondefense.com/spice/">

<p>Ce module permet à Snort d'être capable d'effectuer de la détection
statistique d'anomalies sur votre réseau, et il est essentiellement un
nouveau moteur de détection pour Snort. Si vous êtes intéressé dans ce genre
de capacité, vous devriez réellement lire la documentation dans la
distribution Snort ainsi que celle sur le site <htmlurl
url="http://www.silicondefense.com" name="SiliconDefense">

<sect>Les modules de sortie

<sect1>Vue d'ensemble des modules de sortie

<p>Les modules de sortie sont une nouveauté de la version 1.6. Ils
permettent à Snort d'être bien plus flexible dans le formatage et la
présentation des sorties à ses utilisateurs. Les modules de sortie son
exécutés quand les sous-systèmes d'alerte ou de journalisation de Snort sont
appelés, après les préprocesseurs et le moteur de détection. Le format des
directives dans le fichier de règles est très similaire à celui des
préprocesseurs.

Plusieurs plugins de sortie peuvent être spécifiés dans le fichier de
configuration de Snort. Quand plusieurs plugins du même type (journal,
alert) sont spécifiés, ils sont "empilés" et appelés en séquence quand un
événement se produit. Comme avec les systèmes standards de journalisation et
d'alerte, les plugins de sortie envoient leurs données à /var/log/snort par
défaut ou vers un répertoire désigné par un utilisateur (en utilisant
l'option de la ligne de commande "-l").

Les modules de sortie sont chargés au moment de l'exécution en spécifiant le
mot clé <it>output</it> dans le fichier de règles :

<p><bf>output &lt;nom>: &lt;options></bf>

<table>
<tabular ca="c">
<bf>output alert&lowbar;syslog: LOG&lowbar;AUTH LOG&lowbar;ALERT</bf>
</tabular>
</table>

<p>Figure 26 - Exemple de Configuration de Module de Sortie

<sect1>Les modules de sortie accessibles

<sect2>Alert_syslog

<p>Ce module envoie les alertes à la facilité syslog (comme l'option -s de
la ligne de commande). Ce module permet également à l'utilisateur de
spécifier la facilité de journalisation et la priorité dans le fichier de
règles de Snort, en donnant aux utilisateurs une plus grande flexibilité
dans la journalisation des alertes.

<p>Mots clés disponibles :

<itemize>
<item>Options
<itemize>
<item>LOG_CONS
<item>LOG_NDELAY
<item>LOG_PERROR
<item>LOG_PID
</itemize>
<item>Facilités
<itemize>
<item>LOG_AUTH
<item>LOG_AUTHPRIV
<item>LOG_DAEMON
<item>LOG_LOCAL0
<item>LOG_LOCAL1
<item>LOG_LOCAL2
<item>LOG_LOCAL3
<item>LOG_LOCAL4
<item>LOG_LOCAL5
<item>LOG_LOCAL6
<item>LOG_LOCAL7
<item>LOG_USER
</itemize>
<item>Priorités
<itemize>
<item>LOG_EMERG
<item>LOG_ALERT
<item>LOG_CRIT
<item>LOG_ERR
<item>LOG_WARNING
<item>LOG_NOTICE
<item>LOG_INFO
<item>LOG_DEBUG
</itemize>
</itemize>

<p>Format :

<p><bf>alert&lowbar;syslog: &lt;facilité> &lt;priorité> &lt;options></bf>

<sect2>Alert_fast

<p>Ceci imprimera les alertes de Snort dans un format rapide d'une ligne
vers un fichier de sortie spécifié. C'est une méthode d'alerte plus rapide
que les alertes <it>full</it> car elle n'a pas besoin d'afficher toutes les
entêtes des paquets vers le fichier de sortie.

<p>Format :

<p><bf>alert_fast: &lt;nom du fichier de sortie></bf>

<table>
<tabular ca="c">
<bf>output alert&lowbar;fast: alert.fast</bf>
</tabular>
</table>

<p>Figure 27 - Configuration des alertes "fast"

<sect2>Alert_full

<p>Affiche les messages d'alerte de Snort avec l'intégralité des entêtes des
paquets. Cette facilité d'alerte est généralement plutôt lente car elle
requière que le programme fasse beaucoup plus d'analyse de données pour
formater les données à être imprimées. Les alertes seront écrites dans le
répertoire de journalisation par défaut (/var/log/snort) ou le répertoire de
journalisation spécifié sur la ligne de commande.

<p>Format :

<p><bf>alert_full: &lt;nom du fichier de sortie></bf>

<table>
<tabular ca="c">
<bf>output alert&lowbar;full: alert.full</bf>
</tabular>
</table>

<p>Figure 28 - configuration des alertes "full"

<sect2>Alert_smb

<p>Ce plugin envoie des messages d'alerte WinPopup aux noms de machines
NETBIOS indiqués dans le fichier spécifié comme argument à ce plugin de
sortie. Il doit être noté que l'utilisation de ce plugin <bf>n'est pas</bf>
encouragé puisqu'il exécute un exécutable binaire externe (smbclient) au
même niveau de privilèges que Snort, communément root. Le format du fichier
des stations de travail est une liste de noms NETBIOS des systèmes qui
souhaitent recevoir les alertes, un par ligne dans ce fichier.

<p>Format :

<p><bf>alert_smb: &lt;nom du fichier des stations de travail à alerter></bf>

<table>
<tabular ca="c">
<bf>output alert&lowbar;smb: workstation.list</bf>
</tabular>
</table>

<p>Figure 29 - Configuration des alertes "smb"

<sect2>Alert_unixsock

<p>Configure une socket du domaine UNIX et y envoie les rapports d'alertes.
Des programmes / processus externes peuvent écouter cette socket et recevoir
les alertes Snort et les données des paquets en temps réel. C'est
actuellement une interface expérimentale.

<p>Format :

<p><bf>alert_unixsock</bf>

<table>
<tabular ca="c">
<bf>output alert&lowbar;unixsock</bf>
</tabular>
</table>

<p>Figure 30 - Configuration des alertes "unixsock"

<sect2>Log_tcpdump

<p>Le module log_tcpdump enregistre les paquets vers un fichier au format
tcpdump. Ceci est utile pour effectuer des analyses post traitement sur le
trafic collecté avec le grand nombre d'outils qui sont disponibles pour
examiner des fichiers au format tcpdump. Ce module ne prend qu'un seul
argument, le nom du fichier de sortie.

<p>Format :

<p><bf>log_tcpdump: &lt;nom du fichier de sortie></bf>

<table>
<tabular ca="c">
<bf>output log&lowbar;tcpdump: snort.log</bf>
</tabular>
</table>

<p>Figure 31 - Exemple de configuration du module de sortie "tcpdump"

<sect2>Xml

<p>Le plugin XML active la journalisation de snort en SNML - simple network
markup language alias (snort markup language) vers un fichier ou au travers
du réseau. La DTD est disponible dans le répertoire contrib de la
distribution de snort et à : http://www.cert.org/DTD/snml-1.0.dtd. Vous
pouvez utiliser ce plugin avec une ou plusieurs sondes snort pour
journaliser vers une base de données centrale et créer des infrastructures
de détection d'intrusion hautement configurables dans votre réseau. Le
plugin vous permettra également de rapporter automatiquement les alertes au
Centre de Coordination du CERT, votre équipe de réponse, ou votre
fournisseur de gestion d'IDS.

<p>Ce plugin a été développé par Jed Pickel et Roman Danyliw du Centre de
Coordination du CERT comme partie du projet AIRCERT.

<p>Soyez conscient que la DTD SNML est dans sa phase précoce de
développement et il est probable qu'elle soit modifiée pendant que l'examen
public se déroule.

<p>Voyez http://www.cert.org/kb/snortxml pour les informations et
documentations les plus à jour à propos de ce plugin.

<p>La ligne de configuration sera au format suivant :

<p><bf>output xml: &lsqb;log | alert], &lsqb;liste de paramètres]</bf>

<p>Arguments :

<p><bf>&lsqb;log | alert]</bf> - spécifiez log ou alert pour connecter le
plugin xml à la facilité de journalisation ou d'alerte.

<p><bf>&lsqb;liste de paramètres]</bf> - La liste de paramètres consiste en
paires de clés valeurs. Le format correct est une liste de paires clé=valeur
chacune séparée par un espace.

<table>
<tabular ca="l|l">

file
<colsep>quand c'est le seul paramètre il journalisera vers un fichier 
 &nbsp;sur la machine locale. Autrement, si http ou https est employé (voir 
 &nbsp;protocole), c'est le script qui est exécuté sur le système distant.

<rowsep>protocol
<colsep>Les valeurs possibles pour ce champ sont
&nl;
&nl;http - envoie un POST dans HTTP à un serveur web (requis : un paramètre 
 &nbsp;&lsqb;file])
&nl;https - juste comme http mais chiffré et mutuellement authentifié par 
 &nbsp;ssl. (requis : les paramètres &lsqb;file], &lsqb;cert], &lsqb;key])
&nl;tcp - une simple connexion tcp. Vous avez besoin d'utiliser une 
 &nbsp;quelconque sorte de récepteur (requis : un paramètre &lsqb;port])
&nl;iap - une mise en oeuvre de Intrusion Alert Protocol (ndt : Protocole 
 &nbsp;d'Alertes d'Intrusion) (ceci ne marche pas encore).

<rowsep>host
<colsep>système distant où les journaux doivent être envoyés

<rowsep>port
<colsep>le numéro de port auquel se connecter (les ports par défaut sont)
&nl;
&nl;http 80
&nl;https 443
&nl;tcp 9000
&nl;iap 9000

<rowsep>cert
<colsep>le certificat X.509 client à utiliser avec https (au format PEM)

<rowsep>key
<colsep>la clé privée cliente à utiliser avec https (au format PEM)

<rowsep>ca
<colsep>le certificat CA utilisé pour valider le certificat du serveur
 &nbsp;https (au format PEM)

<rowsep>server
<colsep>le fichier contenant une liste de serveurs valides avec lesquels
 &nbsp;communiquer. Il est utilisé pour que Snort puisse authentifier le
 &nbsp;serveur. Chaque serveur est identifié par une chaîne formée par le
 &nbsp;sujet du certificat X.509 du serveur. Cette chaîne peut être créée
 &nbsp;par :
&nl;
&nl;% openssl x509 -subject -in &lt;server certificate>.
&nl;
&nl;Typiquement seulement quelqu'un déployant le serveur HTTPS aura à
 &nbsp;effectuer cette tâche (puisqu'ils ont accès au certificat du
 &nbsp;serveur). Cette entité doit publier cette chaîne sujet pour
 &nbsp;configuration dans chaque sonde snort.

<rowsep>sanatize

<colsep>L'argument est une combinaison réseau/masque pour un intervalle d'IP
 &nbsp;que vous souhaitez être nettoyés. Toute adresse IP dans l'intervalle
 &nbsp;que vous spécifiez sera représenté par "xxx.xxx.xxx.xxx". Également,
 &nbsp;pour les alertes nettoyées, aucune charge de paquet ne sera
 &nbsp;journalisé. Vous pouvez utiliser le paramètre sanitize plusieurs
 &nbsp;fois pour représenter plusieurs intervalles IP.

<rowsep>encoding

<colsep>La charge des paquets et les options des données sont binaires et il
 &nbsp;n'y a pas une façon standard de les représenter en texte ASCII. Vous
 &nbsp;pouvez choisir l'option de codage binaire qui convient le mieux à
 &nbsp;votre environnement. Chacun a ses propres avantages et désavantages.
&nl;
&nl;hex : (défaut) représente les données binaires comme une chaîne
 &nbsp;hexadécimale.
&nl;besoins de stockage... - 2x la taille du binaire
&nl;recherches... - très bonnes
&nl;lisibilité humaine... - non lisible à moins que vous ne soyez un
 &nbsp;véritable intello requière du traitement ultérieur
&nl;
&nl;base64 : représente les données binaires comme une chaîne en base 64.
&nl;besoins de stockage... - &tilde;1.3x la taille du binaire
&nl;recherches... - impossible sans traitement ultérieur
&nl;lisibilité humaine... - non lisible nécessite du traitement ultérieur
&nl;
&nl;ascii : représente les données binaires comme une chaîne ascii. C'est la
 &nbsp;seule option où vous perdrez effectivement des données. Les données
 &nbsp;non ascii sont représentées en tant qu'un ".". Si vous choisissez
 &nbsp;cette option alors les données pour les IP et les options tcp seront
 &nbsp;toujours représentées comme "hex" car cela n'a pas de sens pour ces
 &nbsp;données d'être en ascii.
&nl;besoins de stockage... - Bien plus large que les données binaires car
 &nbsp;quelques caractères ont besoin d'être échappés (&amp;, &lt, >)
&nl;recherches... - très bonne pour rechercher uns chaîne de texte
 &nbsp;impossible si vous voulez rechercher du binaire
&nl;lisibilité humaine... - très bonne

<rowsep>detail
<colsep>Combien de données détaillées voulez-vous enregistrer ? Les options
sont :
&nl;
&nl;full : (défaut) journalise tous les détails d'un paquet qui a causé une
 &nbsp;alerte (en incluant les options ip et tcp et la charge)
&nl;
&nl;fast: journalise seulement une quantité minimale de données. Vous
 &nbsp;limitez sévèrement le potentiel de quelques application d'analyse si
 &nbsp;vous choisissez cette option, mais ceci est toujours le meilleur
 &nbsp;choix pour quelques applications. Les champs suivants sont
 &nbsp;journalisés (horaire, signature, ip source, ip destination, port
 &nbsp;source, port destination, drapeaux tcp et protocole)

</tabular>
</table>

<p>Format :

<p><bf>xml: &lt;facilité de sortie></bf>

<table>
<tabular ca="c">
<bf>output xml: log,   file=output</bf>
<rowsep><bf>output xml: log, protocol=https host=air.cert.org file=alert.snort cert=mycert.crt key=mykey.pem ca=ca.crt server=srv&lowbar;list.lst</bf>
</tabular>
</table>

<p>Figure 32 - exemples de configuration du plugin de sortie XML

<sect2>Database

<p>Ce module de Jed Pickel envoie les données de Snort à une variété de
bases de données SQL. Plus d'informations sur l'installation et la
configuration de ce module peuvent être trouvées sur la <htmlurl
url="http://www.incident.org/snortdb" name="page web d'Incident.org">. Les
arguments de ce plugin sont le nom de la base de données vers laquelle
journaliser et une liste de paramètres. Les paramètres sont spécifiés avec
le format <it>paramètre</it> = <it>argument</it>. Les paramètres suivants
sont disponibles.

<table>
<tabular ca="l|l">
host
<colsep>Le système auquel se connecter. Si une chaîne de longueur non nulle
 &nbsp;est spécifiée, une communication TCP/IP est utilisée. Sans un nom de
 &nbsp;machine, il se connectera en utilisant une socket du domaine Unix
 &nbsp;local.

<rowsep>port
<colsep>Le numéro de port auquel se connecter au système serveur, ou une
 &nbsp;extension de nom de fichier de socket pour les connexions de domaine
 &nbsp;Unix.

<rowsep>dbname
<colsep>Le nom de la base de données

<rowsep>user
<colsep>Le nom de l'utilisateur de la base de donnée pour l'authentification

<rowsep>password
<colsep>Le mot de passe utilisé si la base de données demande une
 &nbsp;authentification par mot de passe

<rowsep>sensor&lowbar;name
<colsep>Spécifie votre propre nom pour cette sonde snort. Si vous ne
 &nbsp;spécifiez pas de nom un sera généré automatiquement

<rowsep>encoding
<colsep>Parce que la charge du paquet et les options des données sont
binaires, il n'y a pas une façon simple et portable de les enregistrer dans
une base de données. BLOBS ne sont pas utilisés car ils ne sont pas portable
entre les bases de données. Donc je vous laisse l'option de codage. Vous
pouvez choisir parmi les options suivantes. Chacune a ses propres avantages
et des désavantages :
&nl;
&nl;hex : (défaut) représente les données binaires comme une chaîne
 &nbsp;hexadécimale.
&nl;besoins de stockage... - 2x la taille du binaire
&nl;recherches... - très bonnes
&nl;lisibilité humaine... - non lisible à moins que vous ne soyez un
 &nbsp;véritable intello requière du traitement ultérieur
&nl;
&nl;base64 : représente les données binaires comme une chaîne en base 64.
&nl;besoins de stockage... - &tilde;1.3x la taille du binaire
&nl;recherches... - impossible sans traitement ultérieur
&nl;lisibilité humaine... - non lisible nécessite du traitement ultérieur
&nl;
&nl;ascii : représente les données binaires comme une chaîne ascii. C'est la
 &nbsp;seule option où vous perdrez effectivement des données. Les données
 &nbsp;non ascii sont représentées en tant qu'un ".". Si vous choisissez
 &nbsp;cette option alors les données pour les IP et les options tcp seront
 &nbsp;toujours représentées comme "hex" car cela n'a pas de sens pour ces
 &nbsp;données d'être en ascii.
&nl;besoins de stockage... - Bien plus large que les données binaires car
 &nbsp;quelques caractères ont besoin d'être échappés (&amp;, &lt, >)
&nl;recherches... - très bonne pour rechercher uns chaîne de texte
 &nbsp;impossible si vous voulez rechercher du binaire
&nl;lisibilité humaine... - très bonne

<rowsep>detail
<colsep>Combien de données détaillées voulez-vous enregistrer ? Les options
sont :
&nl;
&nl;full : (défaut) journalise tous les détails d'un paquet qui a causé une
 &nbsp;alerte (en incluant les options ip et tcp et la charge)
&nl;
&nl;fast: journalise seulement une quantité minimale de données. Vous
 &nbsp;limitez sévèrement le potentiel de quelques application d'analyse si
 &nbsp;vous choisissez cette option, mais ceci est toujours le meilleur
 &nbsp;choix pour quelques applications. Les champs suivants sont
 &nbsp;journalisés (horaire, signature, ip source, ip destination, port
 &nbsp;source, port destination, drapeaux tcp et protocole)

</tabular>
</table>

<p>De plus, il y a une méthode de journalisation et un type de base de
données qui doivent être définis. Il y a deux types de journalisation
disponibles, <it>log</it> et <it>alert</it>. Fixer le type à log attache la
fonctionnalité de journalisation de database à la facilité de journalisation
dans le programme. Si vous fixez le type à log, le plugin sera appelé dans
la chaîne de sortie log. Fixer le type à <it>alert</it> attache le plugin à
la chaîne de sortie alert dans le programme.

<p>Il y a quatre bases de données disponibles dans la version courante du
plugin qui sont MySQL, PostgreSQL, Oracle et les bases de données
compatibles unixODBC. Fixez le type pour correspondre à la base de données
que vous utilisez.

<p>Format :

<p><bf>database: &lt;log | alert>, &lt;type de base de données>, &lt;liste de paramètres></bf>

<table>
<tabular ca="c">
<bf>output database: log, mysql, dbname=snortuser=snort host=localhost password=xyz</bf>
</tabular>
</table>

<p>Figure 33 - Configuration du plugin de sortie "database"

<sect>Construire de bonnes règles

<p>Il y a quelques concepts généraux à garder à l'esprit en développant des
règles Snort pour maximiser l'efficacité et la vitesse. Je ferai des rajouts
à cette section quand ma muse le voudra. :)

<sect1>Les règles de contenus différencient majuscules et minuscules (à moins que vous n'utilisiez l'option "nocase")

<p>N'oubliez pas que les règles content font la différence entre majuscules
et minuscules et que beaucoup de programmes utilisent typiquement les
lettres majuscules pour indiquer les commandes. FTP en est un bon exemple.
Considérez les deux règles suivantes :

<p><bf>alert tcp any any -> 192.168.1.0/24 21 (content: "user root"; msg:
"FTP root login";) </bf>

<p><bf>alert tcp any any -> 192.168.1.0/24 21 (content: "USER root"; msg:
"FTP root login";)</bf>

<p>La seconde de ces deux règles va capturer la plupart des tentatives de
connexion root automatiques, mais aucune qui utilise les caractères
minuscules pour "user".

<sect1>Accélérer les règles qui ont des options de contenus

<p>L'ordre dans lequel les règles sont testées par le moteur de détection
est complètement indépendant de l'ordre dans lequel elles sont écrites dans
une règle. Le dernier test de règle qui est effectué (quand nécessaire) est
toujours l'option de règle content. Prenez avantage de ce fait en utilisant
d'autres options de règles plus rapides qui peuvent détecter si oui ou non
le contenu a besoin d'être vérifié. Par exemple, la plupart du temps quand
des données sont envoyées du client au serveur après qu'une session TCP soit
établie, les drapeaux PSH et ACK sont fixés sur le paquet contenant les
données. Ce fait peut être utilisé avantageusement par les règles qui ont
besoin de tester le contenu de la charge provenant du client vers le serveur
avec un simple test de drapeaux TCP qui nécessite bien moins de ressources
en calculs que l'algorithme de correspondance de motifs. En sachant cela,
une façon simple d'accélérer les règles qui utilisent l'option content est
d'effectuer également un test flag, comme dans la Figure 23. L'idée de base
est que lorsque les drapeaux PSH et ACK ne sont pas fixés, il n'y a pas
besoin de tester la charge du paquet pour la règle donnée. Si les drapeaux
sont fixés, la puissance de calcul additionnelle nécessaire pour effectuer le
test est négligeable.

<table>
<tabular ca="c">
<bf>alert tcp any any -> 192.168.1.0/24 80 (content: "cgi-bin/phf"; flags: PA; msg: "CGI-PHF probe";)</bf>
</tabular>
</table>

<p>Figure 34 - Utilisation des tests de drapeaux TCP pour accélérer les
règles de contenu

<table>
<tabular ca="c">
<it>Version 1.2, Tous droits réservés, © Copyright 1999-2001 Martin Roesch</it>
<rowsep><it>traduction française © Copyright 2001 Denis Ducamp</it>
</tabular>
</table>

</article>
