Défense: comment se protéger ?

Augmenter la sécurité d'un noyau Linux avec Grsecurity

Introduction

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.

Fonctionnalité de Grsec

  • 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)

Exercice: Mettre en place un noyau Grsec

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
      

N'autoriser que le minimum de connexions réseaux

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
    

Les IDS locaux et les anti-rootkits

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

Exercice: faire un rapide checkup de votre système

Lancer dés à présent la commande rkhunter -c