Table des matières
LIDS est un patch Noyau qui permet de blinder un système Linux et notamment :
de contrôler l'accès au système de fichiers
de limiter à un programme exécuter en root d'accéder aux 'Capabities' du système.
Il est ainsi possible de forcer l'accès à un répertoire en lecture seule pour tous les utilisateurs, root compris :) ou encore d'autoriser un programme (et lui seul) d'accéder à un répertoire ou fichier, ou bien ne pas permettre aux programme root d'utiliser la CAPABILITIE SETUID et bien d'autres choses encore :)
voir http://talby.csu.umist.ac.uk/~mc/_unix_security/unix_sec_kernel_lids.htm
Tout dabord installons les sources du noyau Linux et patchons le.
cd /usr/src wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2 tar xvjf linux-2.6.18.tar.bz2 cd /tmp wget http://www.lids.org/download/v2.6/2.6.14/lids-2.2.2-2.6.14.tar.gz tar xvzf lids-2.2.2-2.6.14.tar.gz cd /usr/src/linux-2.6.18 patch -p1 < /tmp/lids-2.2.2-2.6.14/lids-2.2.2-2.6.14.patch
Il faut maintenant que notre future noyau puisse prendre en charge le patch que nous venons d'appliquer.
Nota: Pour récupérer la configuration du noyau de la distribution : cp /boot/config-2.6.18 /usr/src/linux-2.6.18/.config
make menuconfig
Les modifications suivantes sont necessaires à travers les menus:
Cryptographic options --->
<*> SHA256 digest algorithm
Security options --->
< > Default Linux Capabilities
LIDS support --->
<*> Linux Intrusion Detection System support (EXPERIMENTAL)
--- LIDS Options
[*] Attempt not to flood logs
[*] Allow switching the LFS and States
[*] Allow switch the Linux Free Session
[ ] Restrict mode switching to specified terminals
On lance maintenant la compilation du noyau et des ses modules:
make bzImage make modules make modules_install make install
Et enfin le bootloader prend en charge le nouvau noyau. Pour cela éditer le fichier menu.lst de grub ou lilo.conf et y ajouter quelque chose comme:
Dans meu.lst
title LIDS Core (2.6.18-lids)
root (hd0,0)
kernel /boot/bzImage-2.6.18 ro root=/dev/sda1
ou lilo.conf
image=/boot/vmlinuz-2.6.18
label="2.6.18-lids"
root=/dev/hda1
read-only
Et voilà LIDS sera pris en charge lors du prochain démarrage.
Lids est livré avec des utilitaires nous permettant de le configurer que nous allons immédiatement installer.
cd /tmp wget http://www.lids.org/download/v2.6/lidstools/lidstools-2.2.7.tar.gz tar xvzf lidstools-2.2.7.tar.gz && cd lidstools-2.2.7 ./configure make make install
Ajoutons un mot de passe à LIDS:
/sbin/lidsconf -P
Si nous redémarrons maintenant LIDS serait immédiatement
fonctionnel et nous aurrons surement du mal à terminer le processus de
boot. En effet aucun paramétrage n'ayant encore été fait LIDS va tout de
même mettre en fonction ses mécanismes de protection. Pour que LIDS
démarre en mode 'Apprentissage' modifions le fichier
/etc/lids/lids.ini
ACL_DISCOVERY=1
Une mise à jour des ACL s'impose.
/sbin/lidsconf -U /sbin/lidsconf -U BOOT /sbin/lidsconf -U POSTBOOT /sbin/lidsconf -U SHUTDOWN /sbin/lidsconf -C
Et enfin on redémarrage :)
Si l'on veut que LIDS démarre en même temps que le système ajouter les lignes suivantes au fichier /etc/rc.local
echo "Execution de LIDS ..." /sbin/lidsadm -I
Nous débutons par un exemple simple qui consistera à cacher le
répertoire /usr/local/test à tous le système
excepter au script /usr/local/test.pl .
Commençons par purger les règles de LIDS. Pour effectuer cette action nous devons désactiver LIDS. ( lidsadm -S -- -LIDS )
lidsadm -S -- -LIDS /sbin/lidsconf -Z /sbin/lidsconf -Z BOOT /sbin/lidsconf -Z POSTBOOT /sbin/lidsconf -Z SHUTDOWN
Ensuite il nous faut mettre à jour les fichiers *.cap pour qu'auncune restriction ne soit mise en place. Pour cela toutes les CAPABILITY doivent être positionnées à '+'.
Pour lister les CAPABILITY :
lidsadm -V
Plutot que de modifier les CAPABILITY à la main, il est aussi possible de changer l'état de chacune par la commande suivante :
lidsadm -S -- [+|-]CAP_XXXX lidsadm -S -- +CAP_SETUID lidsadm -S -- -ACL_DISCOVERY ...
On met à jour les règles ... cela a pour effet de créer les fichiers *.acl pour chacun des états.
/sbin/lidsconf -U /sbin/lidsconf -U BOOT /sbin/lidsconf -U POSTBOOT /sbin/lidsconf -U SHUTDOWN /sbin/lidsconf -C
Et en effet il n'y a plus de règles actives.
[STATE: 0] /etc/lids/lids.conf
[STATE: 1] /etc/lids/lids.boot.conf
ACL Discovery is OFF
Compiling into /etc/lids/lids.boot.acl
Total 0 ACLs
[STATE: 2] /etc/lids/lids.postboot.conf
ACL Discovery is OFF
Compiling into /etc/lids/lids.postboot.acl
Total 0 ACLs
[STATE: 3] /etc/lids/lids.shutdown.conf
ACL Discovery is OFF
Compiling into /etc/lids/lids.shutdown.acl
Total 0 ACLsSi nous activons LIDS ( lidsadm -S -- +LIDS et lidsadm -S -- +LIDS_GLOBAL ) celui-ci se comportera comme un système normal sans aucune restriction.
Limitons maintenant l'accès à
/usr/local/test
Les objets sur lesquels les règles s'appliquent doivent exister
mkdir /usr/local/test
Et le script perl:
#!/usr/bin/perl use strict; open(iF,">/usr/local/test/TEST") or die "Ecriture impossible : $!\n"; print F "TEST"; close F; print "OK : Ecriture du fichier /usr/local/test/TEST\n";
/sbin/lidsconf -A -o /usr/local/test -j DENY
'-A' ajouter la règle (-j) DENY pour (-o) l'objet concerné.
/sbin/lidsconf -A -o /usr/local/test.pl -j READONLY /sbin/lidsconf -A -s /usr/local/test.pl -o /usr/local/test -j WRITE
Nous déclarons le script test.pl et lui affectons le droit de lire /usr/local/test.
Enfin mise à jour des nouvelle règles:
/sbin/lidsconf -U lidsadm -S -- +RELOAD_CONF
Et pour finir prise en compte des règles au niveau global:
lidsadm -S -- +LIDS_GLOBAL
Pour résumer tout celà voici les deux scripts d'activation et désactivation de LIDS.
razlids.sh
#!/bin/sh echo "Desactivation de LIDS" lidsadm -S -- -LIDS lidsadm -S -- -LIDS_GLOBAL echo "RAZ des regles" /sbin/lidsconf -Z /sbin/lidsconf -Z BOOT /sbin/lidsconf -Z POSTBOOT /sbin/lidsconf -Z SHUTDOWN echo "Compilation des regles" /sbin/lidsconf -U /sbin/lidsconf -C echo "Rechargement de la configuration" lidsadm -S -- +RELOAD_CONF
lids_1.sh
#!/bin/sh echo "Ajout de regles" /sbin/lidsconf -A POSTBOOT -o /usr/local/test/ -j DENY /sbin/lidsconf -A POSTBOOT -o /usr/local/test.pl -j READONLY /sbin/lidsconf -A POSTBOOT -s /usr/local/test.pl -o /usr/local/test/ -j WRITE echo "Mise a jour des regles" /sbin/lidsconf -U echo "Compilation des regles" /sbin/lidsconf -C echo "Rechargement des regles" lidsadm -S -- +RELOAD_CONF echo "Activation de LIDS" lidsadm -S -- +LIDS lidsadm -S -- +LIDS_GLOBAL
Vérifons que nos règles sont correctement configuées:
# ./razlids.sh ... # ./lids_1.sh ... # ls /usr/local/test ls: /usr/local/test: Aucun fichier ou répertoire de ce type # /usr/local/test.pl OK : Ecriture du fichier /usr/local/test/TEST
Et ça fonctionne :)
LIDS va maintenant nous aider à protéger nos logs d'une modification malveillante.
Rien de plus simple, copions nos regles
' lids_1.sh' en ' lids_2.sh' et
modifions ce dernier pour qu'il devient:
#!/bin/sh echo "Ajout de regles" /sbin/lidsconf -A POSTBOOT -o /var/log -j APPEND echo "Mise a jour des regles" /sbin/lidsconf -U echo "Compilation des regles" /sbin/lidsconf -C echo "Rechargement des regles" lidsadm -S -- +RELOAD_CONF echo "Activation de LIDS" lidsadm -S -- +LIDS lidsadm -S -- +LIDS_GLOBAL
La regle APPEND n'autorise
que l'ajout dans les fichiers déjà existants et dons la modification,
suppression et ajout de nouveaux fichiers dans le répertoire
/var/log devient impossible.
Testons:
# rm /var/log/messages rm: ne peut enlever `/var/log/messages': Opération non permise # echo "TEST" >> /var/log/messages # tail -n 1 -f /var/log/messages TEST # touch /var/log/toto touch: initialisation des dates de `/var/log/toto': Aucun fichier ou répertoire de ce type
Cool nos logs sont protégés :)
Mais peut être le sont ils trop :-(. En effet certains programmes
doivent accéder à ce répertoire avec des droits particuliers. Par
exemple ' logrotate' scrute le répertoire des logs
et y fait diverses manipulations telles que la compressions et la
rotation des logs.
Il nous faut donc tenir compte de tous les cas particuliers :(
Pour nous faciliter la vie nous pouvons utiliser la CAPACITY
ACL_DISCOVERY qui nous founie un mode
de découverte des ressources utilisées. Celles-ci sont loguées dans
/var/log/messages.
lidsadm -S -- +ACL_DISCOVERY tail -f /var/log/messages
Si j'éxécute /usr/sbin/logrotate /etc/lorate.conf je vois
apparaitre dans /var/log/messages:
Jan 14 16:22:19 localhost kernel: LIDS_ACL_DISCOVERY:[state 2]572431:3145731:logrotate:7:0:1422654:3145731:apache2:0-0 Jan 14 16:22:19 localhost kernel: LIDS_ACL_DISCOVERY:[state 2]572431:3145731:logrotate:7:0:1424583:3145731:access.log.1.gz:0-0 Jan 14 16:22:19 localhost last message repeated 3 times Jan 14 16:22:19 localhost kernel: LIDS_ACL_DISCOVERY:[state 2]572431:3145731:logrotate:7:0:1422654:3145731:apache2:0-0
Pour permettre à logrotate
d'ecrire dans /var/log il suffit d'ajouter ces
lignes à nos règles:
/sbin/lidsconf -A POSTBOOT -o /usr/sbin/logrotate -j READONLY /sbin/lidsconf -A POSTBOOT -s /usr/sbin/logrotate -o /var/log -j WRITE
Si je relance logrotate plus aucune ligne n'apparait dans le log.
Le mode ACL_DISCOVERY nous permet donc donc de loguer tous les accès qui sont contraire aux règles en place. Il nous permet d'affiner les règles en place.
De la meme manière nous protégerons les binaires:
/sbin/lidsconf -A POSTBOOT -o /sbin -j READONLY /sbin/lidsconf -A POSTBOOT -o /bin -j READONLY /sbin/lidsconf -A POSTBOOT -o /usr -j READONLY
De même nous protéderons les fichiers de configuration du
répertoire /etc .
/sbin/lidsconf -A POSTBOOT -o /etc -j READONLY /sbin/lidsconf -A POSTBOOT -o /etc/lids -j DENY
Attention: Si
le repertoire /etc/lids devient DENY, les utilitaires lidsconf et lidsadm ne
pourront plus accéder à leur fichiers de configuration. Pour toute
modification il nous faudra tout dabord sortir du mode LIDS ( lidsadmm -S -- -LIDS), faire les modifs et
réentrer dans le mode LIDS.
Un conseil donc: protéger le répertoire
/etc/lids qu'a la fin des tests.



Commentaires: