Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
Sécurité avec iptables et l'option RELATED

Problème d'ouvertue de port non désirée sur une configuration IPTABLES

Un problème de contournement des règles iptables fixées par utilisateur peut survenir avec l’utilisation de règles iptables RELATED,ESTABLISH trop générique et le chargement de helper de service non présent ou non utilisé sur la machine (exemple FTP actif, SIP, IRC …).

Rappel sur l’utilisation du drapeau RELATED :

RELATED signifiant que le paquet initie une nouvelle connexion, mais qu'il est associé avec une connexion existante, comme un transfert de données FTP ou une erreur ICMP.

RELATED est associé à conntrack qui utilise différents « HELPER » pour « tracer » et « comprendre » le fonctionnement du protocole.

Description du problème :

Le problème de produit lorsqu’une règle RELATED trop générique est mise en place et que les HELPER sont activés par défaut (car par défaut sur un grand nombre de distribution) :

Exemple :

  • iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT (Syntaxe obsolete)
  • iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT (Dernier syntaxe)

On trouve cette règle dans beaucoup de standard de configuration (y compris la documentation officiel d’Ubuntu). Cependant, cela pose un problème de sécurité, puisqu’il suffit d’envoyer un paquet de forgé spécifique pour déclencher un helper et donc de marquer une connexion comme RELATED. Un exemple du principe de contournement avec FTP (date de 2009 mais toujours valide) :

https://github.com/rtsisyk/linux-iptables-contrack-exploit

Résolution du problème :

Fortement inspiré de http://home.regit.org/wp-content/uploads/2011/11/secure-conntrack-helpers.html

Options 1, supprimer RELATED des règles IPTABLES :

Si le server n’utilise pas de protocole nécessitant l’utilisation de helper et que les règles sont trivials, la suppression de RELATED dans les règles de firewall suffit.

Exemple :

iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # accept established connections
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # allow access to http server
iptables -P INPUT DROP # drop other incoming connections

iptables -P OUTPUT -j ACCEPT # allow any connection from the host

Deviens :

iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT # accept established connections
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # allow access to http server
iptables -P INPUT DROP # drop other incoming connections

iptables -P OUTPUT -j ACCEPT # allow any connection from the host

Options 2 : préciser les helpers utilisés pour les règles RELATED et les paramètres de ceux-ci, limiter le spoofing d’addresse :

1. Désactiver les paramétrages par défaut.

Depuis Linux 3.5, il est possible (et fortement conseillé pour les serveurs en frontal d’internet) de désactiver l’assignement automatique des helpers :

modprobe nf_conntrack nf_conntrack_helper=0

Le paramètre peut être modifier après chargement :

echo 0 > /proc/sys/net/netfilter/nf_conntrack_helper

Attention, les connections déjà associé à un helper le reste, il est donc préférable de redémarrer la machine « après » configuration persistante, ou de vider les tables avec conntrack -F.

Pour les anciens kernel, affecter le ports 0 par défaut met en place la même fonctionnalité.

modprobe nf_conntrack_$PROTO ports=0 avec proto = ftp, irc …

Avec ce paramétrage les flux suivant seront complément désactivé en l’absence de configuration spécifique :

  • ftp
  • irc
  • sane
  • sip
  • tftp

En l’absence de "ports" paramétrés, certains module ne fonctionneront plus :

  • amanda
  • h323
  • netbios_ns
  • pptp
  • snmp

Si les modules ne sont pas charger par default, les règles iptables

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # accept established connections
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # accept established connections

ne s’appliquent plus théoriquement qu’au protocole icmp, il reste conseillé tous de même d’adapter ses règles de filtrage.

2. Paramétrer les « helpers » dans les règles utilisées :

Exemple : Si le servers fait des connections sip et des connections ftp actif :

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # accept established connections
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # accept established connections

ou

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # accept established connections
iptables -A OUPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # accept established connections

Deviens (pour un firewall local a la machine) :

iptables -A OUTPUT -m conntrack --ctstate RELATED -m helper \
       --helper ftp -o $OUT_IFACE -p tcp \
       --dport 1024: -j ACCEPT

iptables -A INPUT -m conntrack --ctstate RELATED -m helper \
       --helper ftp -i $OUT_IFACE -p tcp \
       --dport 1024: -j ACCEPT

iptables -A OUTPUT -m conntrack --ctstate RELATED -m helper \
       --helper sip -d $IPS_RTP_SERVER -p udp -j ACCEPT

Si le serveur est server FTP actif :

iptables -A OUPUT -m conntrack --ctstate RELATED -m helper \
       --helper ftp -d $IPS_MY_FTP_SERVER -p tcp \
       --dport 1024: -j ACCEPT

Si le serveur n’est pas sur un port standard du helper (Kernel >2.6.34):

iptables -A PREROUTING -t raw -p tcp --dport 2121 \
       -d $IPS_MY_FTP_SERVER -j CT --helper ftp

Sinon cela ce configure dans les paramètres du module (Kernel <2.6.34)

modprobe nf_conntrack_ftp ports=21,2121

Outils pour vérifier les états des connections :

/proc/net/nf_conntrack et grep

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment