Pour utiliser PaX, ou les patches SSP, il faut être dans un environnement dit 'Hardened' (tout le système doit être re compilé). Les distributions qui permettent leur déploiement sont Gentoo-Hardened et Adamantix.
Address Space Protection : les fichiers /proc/{mem,kmem,port,/{maps,stats}} ne sont plus accessibles par n'importe qui. Par exemple on ne peut plus avoir la liste des programme actifs qui ne vous appartienne pas.
Deter exploit bruteforcing : Quand un fils d'un daemon qui fork est tué par PaX, ou crash a cause d'une instruction illegale, le processus père est suspendu pendant 30 seconds.
Kernel process hidding : Les processus kernel sont tout simplement invisible
Chroot restriction : L'appel systeme chroot est largement amélioré.
Auditing features : Le systeme peut logger des informations sur l'utilisation execve, chdir, mount, les signaux, ... C'est trés pratique de savoir quand un programme segfaulte par exemple.
Dmesg restriction : Cela dissimule beaucoup d'information sur le système
Destroy unused shared memory
Randomize PIDs
NetWork protection : larger entropy pools, randomized source ports, socket restriction (on peut définir des groups qui ne peuvent pas faire de connexion sortante, ou ecouter sur un port, ou les deux)
Grsecurity se présente sous la forme d'un patch à appliquer sur les sources du kernel Linux. Par facilité, vous trouverez à cette addresse : http://www.lse.epita.fr/secu/tools/ les sources d'un noyau déjà patché (le package hardened-sources de gentoo)
La compilation d'un noyeau linux se prépare à l'aide d'un menu de configuration (menuconfig). Le plus simple et d'utiliser la configuration de votre kernel courrant. Les options de Grsec sont dans 'Security Options' -> 'Grsecurity'
Voici la procédure à suivre :
$ tar xjf tarball -C /usr/src
$ cd /usr/src ; ln -sf linux-2.6... linux;
$ cd /usr/src/linux ; make menuconfig
$ make bzImage modules_install
$ mv arch/i386/boot/bzImage /boot/xx
lancer lilo/grub
La première étape consiste à désactiver les services réseaux superflus. Le plus souvent, par défaut, des services standarts (programmes bindés sur un port) sont lancés au démarrage. Ces services, comme tout bout de code éxecutable par un étranger, sont dangereux. A moins que vous sachiez à quoi ils correspondent, et que vous en ayez une réelle utilité, il ne faut pas les lancer en permanance. La commande : netstat '-l' permet d'avoir la liste de l'ensemble des ressources accessible via le réseau puis via des fichiers locaux. Rappellez-vous : RPC = Remote Procedure Call :)
Voici un exemple d'utilisation de netstat, avec le switch "-a" il affiche la liste de toutes les connexions distantes puis locales.
accela ~ # netstat -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 *:x11 *:* LISTEN
tcp 0 0 *:ssh *:* LISTEN
tcp 0 0 accela.lse.epita.fr:x11 accela.lse.epita.:35601 ESTABLISHED
tcp 0 0 accela.lse.epita.:37692 kornbluth.freenode:ircd ESTABLISHED
tcp 0 0 accela.lse.epita.:42229 66.249.93.111:pop3s TIME_WAIT
tcp 0 0 accela.lse.epita.:35148 66.249.85.19:http ESTABLISHED
tcp 0 0 accela.lse.epita.:54861 ns-server.epita.fr:4242 ESTABLISHED
tcp 0 0 accela.lse.epita.:41571 66.249.85.83:http ESTABLISHED
tcp 0 0 accela.lse.epita.:35601 accela.lse.epita.fr:x11 ESTABLISHED
tcp 0 0 accela.lse.epita.:56814 memex.lse.epita.fr:ssh ESTABLISHED
udp 0 0 accela.lse.epita.:32769 porter.lse.epita.fr:ntp ESTABLISHED
udp 0 0 accela.lse.epita.:32905 nova.epita.fr:domain ESTABLISHED
udp 0 0 accela.lse.epita.:10537 nova.epita.fr:domain ESTABLISHED
udp 0 0 *:bootps *:*
udp 0 0 accela.lse.epita.:37577 nova.epita.fr:domain ESTABLISHED
raw 0 0 *:icmp *:* 7
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ACC ] STREAM LISTENING 46563 /tmp/ksocket-tweety/kdeinit__0
unix 2 [ ACC ] STREAM LISTENING 46565 /tmp/ksocket-tweety/kdeinit-:0
unix 2 [ ACC ] STREAM LISTENING 38059 /home/tweety/.evolution/cache/tmp/spamd-socket-path-JOyOTk
unix 2 [ ACC ] STREAM LISTENING 55317 /tmp/xmms_tweety.0
unix 2 [ ACC ] STREAM LISTENING 46596 /tmp/.ICE-unix/dcop6560-1140702771
unix 2 [ ACC ] STREAM LISTENING 663348 /dev/log
unix 2 [ ACC ] STREAM LISTENING 46640 /tmp/ksocket-tweety/klauncherbFAiQa.slave-socket
unix 2 [ ACC ] STREAM LISTENING 11857 /dev/gpmctl
unix 2 [ ACC ] STREAM LISTENING 12294 /tmp/.X11-unix/X0
...
Ensuite il faut utiliser un firewall. La configuration pour une station de travail devrait être la suivante :
Exemple 2.7. exemple de script iptables standard
#!/bin/sh
IP=`ifconfig eth0 | grep 'inet addr'| cut -d':' -f2 | cut -d' ' -f1`
# Vide les règles éxistantes
iptables -F
iptables -X
# Règles par défault : DROP
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# On autorise la loopback (local)
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# note : -s ip-source -d ip-destination
# INPUT
# les connexions déjà initialisée
iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -d $HOST -j ACCEPT
# les ping
iptables -A INPUT -i eth0 -p icmp --icmp-type echo-request -j ACCEPT
# les connexion ssh
iptables -A INPUT -i eth0 -p tcp --dport 22 -d $HOST -j ACCEPT
# OUTPUT : les nouvelles connexions
iptables -A OUTPUT -o eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
/etc/init.d/iptables save
Afin de detecter si le système a été compromis, les anti-rootkits vérifient entre autres :
Comparer les MD5 des fichiers systèmes
Regarder les fichiers de logs et
Tester les fichiers des rootkits courants
Détecter les droits suspects de binaires
Vérifier les chaines suspectes dans les LKM
Regarder les fichiers cachés
Tester les uid qui ne sont pas dans passwd
// FIXME : a lot of things has been deleted here