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 :
surveillance d’un groupe précis,
exécution de tous les processus avec leurs arguments,
accès aux ressources interdites,
changements de répertoires,
appels aux commandes mount et umount,
créations et suppressions d’IPC (Inter-Process Communication),
signaux,
tentatives de fork échouées,
changement de temps.
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 :
restriction de la lecture de /proc aux processus de l’utilisateur,
restrictions des liens symboliques pour éviter les race conditions,
restrictions sur le FIFO,
restrictions sur Dmesg,
améliorations du chemin d’exécution sécurisé,
restrictions des sockets par rapport aux groupes,
possibilité de logger les adresses ip distantes d’un attaquant,
détection du bruteforcing,
configuration avancée de la gestion des logs en terme de messages.
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.
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).
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.
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.
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
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 :
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.