39. Sécuriser les processus et surveiller le système

39.1. GrSec

GrSec est un correctif de sécurité pour le noyau Linux. Il apporte la restriction nécessaire à l'utilisation de chroot. De plus, il autorise une historisation accrue sur les process utilisés selon cette liste :

Il intègre également un large pool d’entropie, permettant une meilleure gestion aléatoire des Pid, des ports source TCP et des ISN.

Pour finir, GrSec apporte son lot de restrictions au système :

39.2. chroot

Chroot permet de changer le répertoire racine d'un processus de la machine hôte. Notre but ici est de construire un ensemble de répertoires personnels disposant des outils nécessaires et suffisants pour permettre à chaque utilsateur de travailler, sans que ceux-ci ne puissent sortir de leurs répertoires personnels et avoir une vue du système.

39.2.1. Installation

Chroot est installé par défaut sur la plupart des distributions courantes.


vanvincq@Debian-Laptop ~/Bureau/CP2L/JournalDeBord $ whereis chroot
chroot: /usr/sbin/chroot /usr/share/man/man8/chroot.8.gz /usr/share/man/man2/chroot.2.gz

vanvincq@Debian-Laptop ~/Bureau/CP2L/JournalDeBord $ ls -l /usr/sbin/chroot
-rwxr-xr-x 1 root root 31992 28 avril  2010 /usr/sbin/chroot

Nous pouvons constater que le fichier appartient à l’administrateur root et au groupe de même nom (root :root).

39.2.2. Préparation du système

Pour l’exercice qui nous intéresse, à savoir emprisonner un utilisateur dans un espace restreint, nous avons besion de droits supplémentaires.

Pendant un court laps de temps, il est indispensable que le programme usurpe l’identité de l’administrateur (root) pour effectuer les opérations nécessaires. Ce mécanisme est rendu possible grâce au suid.

n.b : l’emploi du suid implique des failles de sécurité potentielles. Il faut le manier avec précaution et bien être conscient des risques encourus. Dans les cas extrêmes, cette situation permet à un utilisateur distant mal intentionné de prendre le contrôle du système en tant qu’administrateur.

Pour suid notre programme, exécutons l’opération suivante :


vanvincq@Debian-Laptop ~/Bureau/CP2L/JournalDeBord $ sudo chmod u+s /usr/sbin/chroot; ls -l /usr/sbin/chroot
-rwsr-xr-x 1 root root 31992 28 avril  2010 /usr/sbin/chroot

Le droit d’exécution x a été remplacé par le droit s, signifiant que le suid est désormais appliqué au programme.

Le système est maintenant en mesure d’utiliser correctement le programme. Nous désirons que dès que l’utilisateur se connectera, il soit enfermé dans l’environnement que nous construisons à cet effet. En ce sens, nous allons créer un script shell qui permettra d’adapter l’entrée de l’utilisateur à notre environnement.

39.2.3. Préparation du compte

Création d'un compte pour les besoins du test :


vanvincq@Debian-Laptop ~ $ sudo groupadd -g 1001 toto
vanvincq@Debian-Laptop ~/Bureau/CP2L/JournalDeBord $ sudo groupadd -g 1001 toto; sudo useradd -u 1001 -g 1001 -d /home/chroot/toto -s /usr/sbin/chroot -c exemple toto
vanvincq@Debian-Laptop ~ $ sudo mkdir /home/chroot/toto
vanvincq@Debian-Laptop ~ $ sudo chown toto:toto /home/chroot/toto

Notre utilisateur toto se voit attribuer les numéros 1001 d’utilisateur et 1001 de groupe et sera loggué dans le répertoire /home/chroot/toto. Le shell qui lui permettra de se connecter est un petit script qui autorise l’emprisonnement de l’utilisateur à son arrivée.

De manière générale, le script peut être écrit :


#!/bin/bash
exec -c /usr/sbin/chroot /home/chroot/$USER /bin/bash

Si nous utilisons la ligne de commande qui constitue ce script dans une phase de test, une erreur va nous être retournée :


vanvincq@Debian-Laptop ~ $ touch script.sh
vanvincq@Debian-Laptop ~ $ vim script.sh 
vanvincq@Debian-Laptop ~ $ chmod +x script.sh
vanvincq@Debian-Laptop ~ $ sudo -u toto ./script.sh
/usr/sbin/chroot: failed to run command `/bin/bash': No such file or directory

Que se passe t’il donc ?

La réponse est simple. L’invocation du shell, ici /bin/bash, se fait après le déplacement de la racine. Il cherche donc au pied de cette nouvelle racine un répertoire bin contenant l’utilitaire bash. Cependant, puisque nous n’avons jusqu’alors inséré aucun outil, le système refuse la commande.

Que faire dans ce cas ? La réponse est assez simple, nous allons construire l’environnement nécessaire à l’utilisation de la prison. Cela signifie que chaque commande que vous désirerez utiliser dans cet espace restreint doit y être copiée dans le répertoire approprié.


vanvincq@Debian-Laptop ~ $ cd /home/chroot/toto/
vanvincq@Debian-Laptop /home/chroot/toto $ sudo mkdir bin
vanvincq@Debian-Laptop /home/chroot/toto $ sudo cp /bin/bash bin/

Il faut également fournir les librairies nécessaires à son utilisation. Nous utiliserons l’outil ldd pour déter- miner les fichiers nécessaires.


vanvincq@Debian-Laptop /home/chroot/toto $ ldd /bin/bash 
	linux-vdso.so.1 =>  (0x00007fff3e9ff000)
	libncurses.so.5 => /lib/libncurses.so.5 (0x00007f5104dc0000)
	libdl.so.2 => /lib/libdl.so.2 (0x00007f5104bbc000)
	libc.so.6 => /lib/libc.so.6 (0x00007f5104859000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f5105018000)

vanvincq@Debian-Laptop /home/chroot/toto $ sudo mkdir lib; sudo mkdir lib64
vanvincq@Debian-Laptop /home/chroot/toto $ sudo cp /lib/libncurses.so.5 ./lib; sudo cp /lib/libdl.so.2 ./lib/; sudo cp /lib/libc.so.6 ./lib/; sudo cp /lib64/ld-linux-x86-64.so.2 ./lib64/

Voilà, il ne reste plus qu’à tester en s’identifiant sous l’utilisateur toto :


vanvincq@Debian-Laptop ~ $ sudo -u toto ./script.sh 
bash-4.1$ pwd
/
bash-4.1$ ls
bash: ls: command not found
bash-4.1$ exit
exit

Notre premier travail, créer un espace restreint pour un utilisateur, est achevé. La tâche ne s’arrête pas là. Tout comme nous avons copié le shell bash, il faut de même insérer tous les utilitaires nécessaires ou vitaux tels que ls, chmod, rm, etc.

39.2.4. Mise en script

Pour ne pas effectuer une tâche répétitive, il est plus intelligent de créer un script qui travaillera pour nous et qui aura le mérite d’être réutilisable :


#!/bin/bash
# On vérifie que le nom de l’utilisateur souhaité est bien
# passé en paramètre
if [ "$#" != 1 ];
then
   echo "Usage : $0 <login>"
   exit 255;
fi

# Nom d’utilisateur
LOGIN=$1
# Groupe attribué à l’utilisateur
GROUP=chroot
# Répertoire par défaut des shell chrootés
REP=/home/chroot

# Utilitaires présents dans /bin
OUTILB="bash cat chmod chown cp grep gunzip \
gzip ls mkdir more mv rm tar"

echo "-- Création du groupe \"${GROUP}\""
groupadd "${GROUP}" > /dev/null 2>&1

echo "-- Création de l’utilisateur \"${LOGIN}\""
useradd \
	-c "Utilisateur en espace restreint" \
	-d "/home/${LOGIN}/" \
	-g "${GROUP}" \
	-s "/bin/chroot" \
	"${LOGIN}"

echo "-- Son mot de passe : "
passwd "${LOGIN}" > /dev/null

echo "-- Création de l’arbre de son Répertoire personnel --"
mkdir -p $REP/${LOGIN}/bin/ $REP/${LOGIN}/lib/ $REP/${LOGIN}/dev/

# Mise en place des droits sur les répertoires
cd $REP
chmod -R 700 ${LOGIN}

# Copie des programmes et de leurs librairies
for I in $OUTILB;
do
    cp /bin/$I $REP/${LOGIN}/bin/
    # Pour chaque programme, on recherche
    # les librairies correspondantes.
    # On termine en demandant l’exécution par bash des
    # lignes renvoyées par awk
    ldd /bin/$I | awk -v "LOGIN=$LOGIN" \
   ’{ print "cp "$3 $REP"/"LOGIN"/lib/" }’ | bash
done

# Création de l’espace /dev
mknod $REP/${LOGIN}/dev/null c 1 3 -m 666
chown -R "${LOGIN}:${GROUP}" $REP/${LOGIN}

# Fin de la création du compte utilisateur.
echo ">> Utilisateur \"${LOGIN}\" créée et emprisonné"

if [ ! -e /bin/chroot ]; then
    echo "-- Création du programme /bin/chroot"
    cat < /bin/chroot
    #!/bin/bash
    exec -c /usr/sbin/chroot /home/chroot\$USER /bin/bash
    EOF
    chmod 555 /bin/chroot
fi

39.3. HIDS

Un HIDS (host-based intrusion detection system) permet par exemple de vérifier l'intégrité des binaires (CRC, etc.) en les comparant avec une base de référence préalablement établie. Cette technique permet de prévenir toute modification ultérieur d'un binaire.

Exercice : à l’aide d’un script, réalisez votre propre HIDS sur les fichiers binaires essentiels :

39.4. SNMP

SNMP (Simple Network Management Protocol) est un protocole de communication qui permet aux administrateurs réseau de gérer les équipements du réseau, de superviser et de diagnostiquer des problèmes réseaux et matériels à distance.

Exercice : installez un serveur snmp et interrogez-le à l’aide de la commande snmpwalk. De nombreuses informations peuvent être transmises via snmp, c’est pourquoi il est important de bien configurer son serveur, voire, lorsque c’est possible, utiliser la version 3 de ce protocole :

Pour utiliser SNMP, il suffit d'installer les paquets snmp et snmpd. Le daemon snmpd écoute sur le port 161 en UDP.


vanvincq@Debian-Laptop ~ $ sudo head -n 15 /etc/snmp/snmpd.conf 
###############################################################################
#
# EXAMPLE.conf:
#   An example configuration file for configuring the Net-SNMP agent ('snmpd')
#   See the 'snmpd.conf(5)' man page for details
#
#  Some entries are deliberately commented out, and will need to be explicitly activated
#
###############################################################################
#
#  AGENT BEHAVIOUR
#

#  Listen for connections from the local system only
agentAddress  udp:127.0.0.1:161

vanvincq@Debian-Laptop ~ $ snmpwalk -v 1 -c public 127.0.0.1
iso.3.6.1.2.1.1.1.0 = STRING: "Linux Debian-Laptop 2.6.32-5-amd64 #1 SMP Thu Mar 22 17:26:33 UTC 2012 x86_64"
iso.3.6.1.2.1.1.2.0 = OID: iso.3.6.1.4.1.8072.3.2.10
iso.3.6.1.2.1.1.3.0 = Timeticks: (164682) 0:27:26.82
iso.3.6.1.2.1.1.4.0 = STRING: "Me <me@example.org>"
iso.3.6.1.2.1.1.5.0 = STRING: "Debian-Laptop"
iso.3.6.1.2.1.1.6.0 = STRING: "Sitting on the Dock of the Bay"
iso.3.6.1.2.1.1.7.0 = INTEGER: 72
iso.3.6.1.2.1.1.8.0 = Timeticks: (1) 0:00:00.01
iso.3.6.1.2.1.1.9.1.2.1 = OID: iso.3.6.1.6.3.10.3.1.1
iso.3.6.1.2.1.1.9.1.2.2 = OID: iso.3.6.1.6.3.11.3.1.1
iso.3.6.1.2.1.1.9.1.2.3 = OID: iso.3.6.1.6.3.15.2.1.1
iso.3.6.1.2.1.1.9.1.2.4 = OID: iso.3.6.1.6.3.1
iso.3.6.1.2.1.1.9.1.2.5 = OID: iso.3.6.1.2.1.49
iso.3.6.1.2.1.1.9.1.2.6 = OID: iso.3.6.1.2.1.4
iso.3.6.1.2.1.1.9.1.2.7 = OID: iso.3.6.1.2.1.50
iso.3.6.1.2.1.1.9.1.2.8 = OID: iso.3.6.1.6.3.16.2.2.1
iso.3.6.1.2.1.1.9.1.3.1 = STRING: "The SNMP Management Architecture MIB."
iso.3.6.1.2.1.1.9.1.3.2 = STRING: "The MIB for Message Processing and Dispatching."
iso.3.6.1.2.1.1.9.1.3.3 = STRING: "The management information definitions for the SNMP User-based Security Model."
iso.3.6.1.2.1.1.9.1.3.4 = STRING: "The MIB module for SNMPv2 entities"
iso.3.6.1.2.1.1.9.1.3.5 = STRING: "The MIB module for managing TCP implementations"
iso.3.6.1.2.1.1.9.1.3.6 = STRING: "The MIB module for managing IP and ICMP implementations"
iso.3.6.1.2.1.1.9.1.3.7 = STRING: "The MIB module for managing UDP implementations"
iso.3.6.1.2.1.1.9.1.3.8 = STRING: "View-based Access Control Model for SNMP."
iso.3.6.1.2.1.1.9.1.4.1 = Timeticks: (1) 0:00:00.01
iso.3.6.1.2.1.1.9.1.4.2 = Timeticks: (1) 0:00:00.01
iso.3.6.1.2.1.1.9.1.4.3 = Timeticks: (1) 0:00:00.01
iso.3.6.1.2.1.1.9.1.4.4 = Timeticks: (1) 0:00:00.01
iso.3.6.1.2.1.1.9.1.4.5 = Timeticks: (1) 0:00:00.01
iso.3.6.1.2.1.1.9.1.4.6 = Timeticks: (1) 0:00:00.01
iso.3.6.1.2.1.1.9.1.4.7 = Timeticks: (1) 0:00:00.01
iso.3.6.1.2.1.1.9.1.4.8 = Timeticks: (1) 0:00:00.01
iso.3.6.1.2.1.25.1.1.0 = Timeticks: (285536) 0:47:35.36
iso.3.6.1.2.1.25.1.2.0 = Hex-STRING: 07 DC 04 08 12 22 20 00 2B 02 00 
iso.3.6.1.2.1.25.1.3.0 = INTEGER: 1536
iso.3.6.1.2.1.25.1.4.0 = STRING: "BOOT_IMAGE=/boot/vmlinuz-2.6.32-5-amd64 root=UUID=72052cc5-33ec-4fd4-a709-b722c1d1176b ro quiet
"
iso.3.6.1.2.1.25.1.5.0 = Gauge32: 3
iso.3.6.1.2.1.25.1.6.0 = Gauge32: 143
iso.3.6.1.2.1.25.1.7.0 = INTEGER: 0
End of MIB

Ce protocole est largement utilisé dans les outils de supervision comme Centreon, Zabbix, Nagios, etc.