Sécurité sous Linux

Introduction

Attention! Cette page date de 1997 et n’a pas été maintenue depuis 2000; les informations y figurant sont aujourd’hui obsoletes et peuvent exploitées uniquement pour recherche historique.

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.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

New day, new adventure