Archives du mot-clé SSL

Lister toutes les règles « iptables »

iptables : Table nat et redirection de port

iptables : Table nat et redirection de port

Effectuer des actions sur un serveur qui a été géré par un autre n’est souvent pas chose facile : il est très compliqué de savoir ce qui a été fait avant et pourquoi ça ne fonctionne pas.

Récemment, pour prouver qu’un certificat X.509 permettait de mettre en œuvre TLS, j’ai dû configurer Apache avec ce certificat. C’est une opération plutôt simple, surtout que la plupart des distributions proposent un fichier de configuration « SSL » où il ne reste qu’à modifier les chemins vers la clé privée, la clé publique et l’éventuel certificat intermédiaire.

Après quelques configurations qui ne fonctionnent pas, pour cause de «Connection refused», alors que tout semble être correct, j’entreprends des vérifications plus poussées. Apache écoute-t-il sur le port 443 ? Oui. Le trafic IPv4 ou IPv6 arrive-t-il bien sur le port 443 du serveur ? Oui. La configuration réseau est-elle correcte ? Oui. « iptables » contient-il des règles qui pourraient bloquer le trafic sur le port 443 ? Aucune règle présente dans « iptables », et l’action par défaut est « ACCEPT ».

De plus, ce qui est encore plus étrange, c’est que bien qu’un accès soit totalement impossible depuis l’extérieur du serveur, un accès local fonctionne parfaitement.

Comment est-ce possible alors que « iptables » est vide ? Totalement vide ? Non, car une irréductible table de « iptables » est passée inaperçue : la table NAT.

C’est après avoir passé une bonne vingtaine de minutes à chercher pourquoi ça ne fonctionnait pas, que je suis tombé sur la table NAT qui redirigeait le port 443 sur un autre port … Du coup, voici une commande qui va permettre de lister vraiment toutes les règles de toutes les tables mise en place dans « iptables » :

for t in filter nat mangle raw security ; do echo -e "##########\nTable $t\n##########" ; iptables -t $t -L -n ; done

Et voici la même commande pour IPv6 :

for t in filter mangle raw security ; do echo -e "##########\nTable $t\n##########" ; ip6tables -t $t -L -n ; done

Finalement, après avoir supprimé cette règle de redirection de port dans la table NAT, tout fonctionne correctement.

SSL : qu’est-ce que c’est réellement ?

La représentation la plus commune de SSL : un cadenas

La représentation la plus commune de SSL : un cadenas

Il est communément admis que SSL (qu’on devrait plutôt appeler aujourd’hui TLS) permet d’assurer la confidentialité des échanges, en chiffrant les échanges. Mais est-ce sa seule fonction ?

TLS ne se limite pas à assurer la confidentialité des échanges, c’est simplement la fonction la plus mise en avant par les sites de commerce en ligne, et à présent par l’ensemble des sites web depuis les révélations faites par Edward Snowden concernant les écoutes effectuées par la NSA et les services secrets britanniques.

TLS répond par l’intermédiaire de ses fonctions principales à 3 besoins différents. D’autres fonctions existent, mais leur utilisation reste plutôt confidentielle.

Confidentialité

Le premier besoin est la confidentialité des échanges : le chiffrement des échanges permet de s’assurer qu’un tiers ne pourra pas consulter (facilement) le contenu des données échangées.

Authentification

Le second besoin est celui d’authentifier le serveur, c’est-à-dire de s’assurer qu’on communique bien avec le bon serveur. La mise en place des autorités de certifications qui doivent respecter un cahier des charges pour délivrer un certificat uniquement au propriétaire d’un domaine. Les certificats SSL dit « auto-signés » font l’impasse sur cette fonctionnalité de TLS, car ils ne sont pas émis par une autorité de certification et ne seront pas reconnus.

Intégrité

Le troisième besoin est celui d’être certain que le message n’a pas été modifié pendant la transmission. C’est une partie de la méthode de chiffrement qui prend en charge cette fonction. Cette fonction permet de s’assurer qu’un tiers n’a pas modifié le message échangé entre le client et le serveur.

Un certificat SSL par adresse IP

Erreur affichées lors d'un problème de nom de certificat

Erreur affichées lors d’un problème de nom de certificat

Dans la majorité des esprits, il est communément admis qu’il est nécessaire d’avoir une adresse IP par certificat SSL. C’est-à-dire qu’il n’est possible d’héberger qu’un seul site web en SSL par adresse IP.

Cette pensée provient d’une limitation du protocole TLS, qui ne permettait pas de différencier le DNS demandé avant d’avoir renvoyé le certificat SSL. Il existait donc un risque de renvoyer un certificat SSL qui ne corresponds pas au DNS demandé (et donc afficher un avertissement concernant l’incohérence entre le nom demandé et le certificat renvoyé).

Cette pensée commune reste ancrée dans l’esprit des administrateurs système du monde entier, alors qu’il existe des solutions à l’état de norme depuis 2006, et des solutions concrètes depuis 2007-2008 (coté serveur et coté client).

Cette solution est une extension du protocole TLS appelée « Server Name Indication » (SNI) présentée dans la RFC 4366. Le SNI permet d’envoyer le nom DNS du serveur demandé pendant l’initialisation de l’échange TLS. De ce fait, le serveur pourra renvoyer le certificat correspondant à celui qui a été demandé.

Cette pensée reste ancrée, alors que la plupart des navigateurs Web « récents » supporte SNI :

  • Internet Explorer 7 (depuis 2006)
  • Mozilla Firefox 2.0 (depuis 2006)
  • Opera 8.0 (depuis 2005)
  • Google Chrome 6 (depuis 2010)
  • Safari 3.0 (depuis 2007)
  • Konqueror/KDE 4.7 (depuis 2011)

Pire encore, certains pensent qu’il n’est pas possible d’utiliser des certificats différents sur la même adresse IP mais sur des services (ports) différents. Par exemple, un serveur Web et un serveur IMAP n’utilisant pas le même port ni la même configuration utiliseraient forcément le même certificat. Étant donné que la configuration et le port des deux services sont totalement différents, il n’y a aucune raison de ne pas pouvoir choisir deux certificats différents (et ceci sans employer l’extension SNI).

A l’heure actuelle, en utilisant des versions actuelles (supportées) de système d’exploitation, serveurs et clients, il n’est plus nécessaire de multiplier les adresses IP.