Introduction
Cette page introduit des bases de sécurité dans un système Linux, et ne se veut être un guide complet de sécurité. Ce document donne quelques astuces utilisées personnellement. Voici les différentes étapes que j’ai suivi afin de sécuriser un minimum un système.
Le kernel
Il existe un patch développé par Solar Designer pour le projet Openwall. Il s’agit de secure-linux. Après le téléchargement de ce patch et l’installation dans le kernel nous pouvons lancer une compilation du noyau :
J’ai mis le supports suivants dans la section “Networking options” :
- Network firewall.
- IP firewalling.
- TCP syncookie support
Ainsi qu’activé les patches de sécurité :
Une fois le kernel rebooté avec les patches installés, il ne faut pas s’étonner du résultat de certaines commandes accédant à /proc. Par exemple “ps aux” lancé par un utilisateur affichera que ses process à lui.
L’étape suivante est de se protéger contre le SYN flooding (connexions nombreuses vers un port entrainant un arrêt du service). Il suffit d’ajouter la commande suivante dans les scripts de boot :
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
Ensuite on peut ne pas désirer certains traffics IP tels que des requêtes ICMP, ou connexion vers certains services accessible que depuis un réseau. Voici un exemple avec ipchains :
# Autorise les connexions ssh depuis la machine d'administration ipchains -A input -p tcp -s <IP administration/32> -d <IP DE LA MACHINE/32> 22 -j ACCEPT # Autoriser les connexions vers les ports non privilégiés : ipchains -A input -p tcp -s 0/0 -d <IP DE LA MACHINE/32> 1024:65535 -j ACCEPT # Autoriser le traffic HTTP ipchains -A input -p tcp -s 0/0 -d <IP DE LA MACHINE/32> 80 -j ACCEPT # Autoriser le traffic ident (pour éviter les timeout des requêtes) ipchains -A input -p tcp -s 0/0 -d <IP DE LA MACHINE/32> 113 -j ACCEPT # Autoriser les messages ICMP echo-request and host-unreachable ipchains -A input -i $IF0 -p icmp -s 0/0 -d <IP DE LA MACHINE/32> --icmp-type destination-unreachable -j ACCEPT ipchains -A input -i $IF0 -p icmp -s 0/0 -d <IP DE LA MACHINE/32> --icmp-type echo-request -j ACCEPT # Interdit tout autre type de traffic entrant ipchains -A input -i $IF0 -s 0/0 -d <IP DE LA MACHINE/32> -l -j DENY
L’élaboration de règles de sécurité complètes est plus complêxe, mais les lignes ci-dessus donne une idée.
Il n’est pas forcément nécessaire de tout filtrer. En pratique installer seulement les services nécessaires devrait suffir. Attention à mettre à jour les services immédiatement après l’annonce d’une vulnérabilité. Par exemple, dans le cas précédent, le firewall ne servirait à rien s’il y a un trou de sécurité dans l’applicatif du serveur HTTP.
Configuration système
Par défaut, Linux installe un certain nombre de services qui peuvent souvent s’avérer inutiles. Par exemple un serveur de mail ne sert à rien sur un serveur FTP, tout comme un démon DNS ne sert à rien sur un serveur HTTP.
Les services sont lancés par les scripts de boot et par le démon inetd. La configuration des scripts de boot est spécifique à chaque distribution de linux (en géneral /etc/rc.d/, /etc/rc.d/rc3.d/ ou /etc/rc2.d/), il faut regarder par soi même afin de prendre le même runlevel que celui dans le fichier /etc/inittab (ex : id:3:initdefault:).
Pour connaitre les ports ouverts, la commande netstat -a est très utile, et permet de déterminer les services qui tournent sur une machine afin d’évaluer ceux à supprimer :
tcp 0 0 *:ftp *:* LISTEN tcp 0 0 *:ssh *:* LISTEN tcp 0 0 ntp.domain.com:time *:* LISTEN
Pour désactiver FTP, il suffit de commenter la ligne ftp dans le fichier /etc/inetd.conf (ou de l’enlever dans les scripts de boot, celà dépend des démons FTP).
Une astuce pour connaitre les processus associés à un port ouvert est d’utiliser lsof (list open files). lsof liste les fichiers ouverts : par exemple la commande “lsof -ni” donne tous les processus qui ouvrent une connexion de type socket Internet, ce qui donne :
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME xinetd 68 root 3u IPv4 51 TCP 194.177.xx.yy:daytime (LISTEN) xinetd 68 root 4u IPv4 52 UDP 194.177.xx.yy:daytime sshd 70 root 3u IPv4 58 TCP *:ssh (LISTEN) xntpd 765 root 4u IPv4 12174 UDP *:ntp proftpd 3967 root 0u IPv4 3996315 TCP 194.177.xx.xx:ftp->194.177.xx.xx:63988 (CLOSE_WAIT) proftpd 6149 root 0u IPv4 2073762 TCP *:ftp (LISTEN)
Grâce à lsof, on sait tout sur l’état des connexions réseau.
Quelques logiciels
TCP Wrappers
Les TCP Wrappers permettent de restreindre l’accès à un service dans le fichiers /etc/inetd.conf. Pour connaitre son usage, la manpage hosts_access décrit toutes ses fonctionalités. Voici un exemple simple : on veut limiter l’accès FTP que depuis un réseau et interdire l’accès à tout les autres services gérés par inetd.
Fichier /etc/hosts.deny (on interdit l’accès à tous les services gérés par les TCP Wrappers) :
ALL:ALL
Fichier /etc/hosts.allow (on autorise les connexions FTP depuis le réseau 192.168.0.0/24) :
in.ftpd: 192.168.0.0/255.255.255.0
Aussi il faut vérifier qu’inetd fait appel aux TCP wrappers, celà ce voit lorsque le l’appel du démon est précédé de /usr/sbin/tcpd, exemple :
ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -i -a
Nous pouvons noter qu’il faut préciser le nom du démon à lancer dans le fichier hosts.allow et non le nom du service.
xinetd
xinetd est un démon tel que inetd mais est plus avancé. Il gère lui même le nombre de connexions sur un service, le binding sur une interface réseau par exemple. On peut le télécharger ici.
Voici un exemple de configuration d’un démon talk afin qu’il soit qu’utilisable sur une machine locale :
service talk { socket_type = dgram wait = yes user = root server = /usr/etc/in.talkd bind = 127.0.0.1 }
Ainsi, le service talk n’est disponible que sur la machine locale et seuls les utilisateurs locaux de la machine peuvent dialoguer entre eux.
IP logger
Les IP loggers permettent de logger toutes les connexions vers une machine. Il permettent de déterminer les ports qui ont été tentés d’être ouverts, ou les machines envoyant du traffic ICMP. On peut le télécharger ici.
Après installation, nous voyons les messages dans notre syslog :
Jun 18 21:40:53 myhost icmplogd: ping from [193.194.69.118] Jun 19 01:42:41 myhost tcplogd: smtp connection attempt from mailhost.provider.net [194.177.1.6] Jun 19 01:43:26 myhost tcplogd: www connection attempt from proxy.webisp.com [201.5.65.196]
ssh
ssh est un démon permettant de se connecter sur un système distant, d’exécuter des commandes distantes, ou de copier des fichiers de manière sécurisée grâce à l’encryption et un système d’authentification à double clé. Ainsi ssh peut remplacer ftp, telnet, rlogin, rsh et rcp sur un système, qui sont des services à risque en raison de leurs lacunes en encryption. Découvrir/Télécharger OpenSSH.