Blog Haypo

Aller au contenu | Aller au menu | Aller à la recherche

mardi 18 décembre 2007

Nom de domaine et Apache en IPv6

J'héberge plusieurs sites Internet, la série hachoir.org, sur mon serveur personnel. Le serveur repose sur Ubuntu Feisty (il faudrait que je pense à migrer à Gutsty...) et exécute Apache, Trac, SSH, Courier (serveur IMAP), MySQL, etc. Histoire de permettre à mes visiteurs d'accéder aux sites Internet en IPv6, je suis allé voir dans le manager OVH si je peux créer un enregistrement DNS de type AAAA. Comme je le craignais, OVH ne supporte pas les champs AAAA.

J'ai alors décidé d'héberger le nom de domaine hachoir.org chez Xname.org qui offre une configuration complète, rien à voir avec OVH. On a accès aux paramètres TTL et à tous les types de champ existant. Voici ma configuration :

$ host -a hachoir.org
(...)
hachoir.org.            3395    IN      NS      ns0.xname.org.
hachoir.org.            3395    IN      AAAA    2a01:5d8:58a0:425b:216:76ff:feab:79ed
hachoir.org.            86198   IN      A       88.160.66.91
hachoir.org.            3395    IN      NS      ns1.xname.org.

Chaque sous-domaine est un alias vers le domaine principal (hachoir.org) :

$ host fusil.hachoir.org
fusil.hachoir.org is an alias for hachoir.org.
hachoir.org has address 88.160.66.91
hachoir.org has IPv6 address 2a01:5d8:58a0:425b:216:76ff:feab:79ed

Comme OVH utilise un TTL d'une journée par défaut, j'ai attendu deux jours pour tester ma nouvelle configuration DNS. J'ai installé l'extension ShowIP de Firefox pour vérifier ma configuration. Au passage, je déteste Firefox, il est lent et s'intègre mal à Gnome et KDE, pourquoi Ubuntu n'utilise pas Epiphany ? Capture d'écran de Firefox (notez l'excellent NoScript, le pare-feu Javascript !) montrant l'IPv6 dans la barre d'état (dans une horrible couleur verte) :

Pour les tests, on peut aussi utiliser « ping6 fusil.hachoir.org » et « host -t AAAA fusil.hachoir.org ».

Enfin, j'ai configuré le reverse DNS de mon IPv4 publique dans l'interface de configuration Free via « Fonctionnalités optionnelles > Personnaliser mon reverse DNS ». Même problème ici, Free n'offre pas (encore ?) de reverse DNS IPv6.

Ah oui, je parlais d'Apache dans le titre... Hé bien, il n'y a rien à faire ;-) Ça marche tout seul.

dimanche 16 décembre 2007

Historique des commandes bash (HISTIGNORE)

Un ami, toady, m'a appris une super astuce pour l'interpréteur bash : la variable d'environnement $HISTIGNORE. Elle permet d'éviter que certaines commandes soient mises dans l'historique. Voici ma configuration actuelle :

export HISTIGNORE='&:[bf]g:exit:*>|*:history*:svn revert*:svnrevert*:*rm*-rf*:*rm*-f*'
  • « & » évite de sauver plusieurs fois la même commande
  • « [bf]g » ignore les commandes « bg » et « fg »
  • « *>|* » ignore toutes les commandes contenant >| (redirige la sortie dans un fichier même s'il existe déjà)
  • « history* » ignore les commandes contenant « history » (ex: "history|tail")
  • « svn revert* » et « svnrevert* » ignore la commande svn revert (et mon alias svnrevert)
  • « *rm*-rf* » et « *rm*-f* » ignorent « rm -rf » et « rm -f »

Cette configuration m'empêche en particulier de reproduire la boulette suivante :

svn diff > ~/patch
(...)
svn diff >| ~/patch
svnrevert >| ~/patch   # aïe !

jeudi 13 décembre 2007

Découverte d'IPv6

Adresse IPv6

Maintenant que j'ai activé IPv6 chez Free, mes machines se voient attribuer une IPv6. Voyons comment elles sont construites en prenant « 2a01:5d8:58a0:425b:216:96ff:feab:79ea » comme exemple :

  • « 2a01:5d8 » (32 bits) : le préfixe IPv6 de Free
  • « 58a0:425b » (32 bits) : mon IPv4 publique (88.160.66.91)
  • « 0216:96ff:feab:79ea » (64 bits) : mon adresse MAC (00:16:96:AB:79:EA, 48 bits) étendue sur 64 bits. Les deux premiers chiffres de l'adresse MAC (00) changent (02), car le second bit est inversé pour indiquer que c'est une adresse globale (Internet) et non plus locale (Intranet). Les chiffres « ff:fe » sont fixes. Lire l'annexe A de la RFC 4291 pour les détails : Creating Modified EUI-64 Format Interface Identifiers.

On peut donc facilement retrouver l'IPv4 et l'adresse MAC à partir de l'IPv6. Ceci peut poser des problèmes de confidentialité car l'adresse MAC est parfois utilisée pour tracer l'activité d'un utilisateur. Microsoft Office écrit par exemple l'adresse MAC de la machine dans chaque document généré (jusqu'à Office version 2001 je crois bien). Par contre, l'IPv6 semble fixe pour une même machine étant donnée qu'elle est calculée selon l'adresse MAC.

Tests IPv6

Testons notre connectivité IPv6. Pour commencer, « ping6 ::1 » permet de pinger sa propre machine. Le test ultime est celui de la tortue KAME : en IPv4 elle est floue, alors qu'en IPv6 l'animation est nette :-)

Quelques serveurs publics à pinger en IPv6 :

  • ipv6.teleglobe.net
  • www.kame.net
  • www.enst.fr

Commande pour obtenir les enregistrements DNS en IPv6 :

$ host -t AAAA www.kame.net
www.kame.net has IPv6 address 2001:200:0:8002:203:47ff:fea5:3085

(au passage, www.free.fr n'est pas accessible en IPv6, c'est un comble)

Dans un navigateur web, on peut spécifier une IPv6 en l'écrivant entre crochets : « http://[2001:200:0:8002:203:47ff:fea5:3085]/ ». On peut toujours spécifier le port TCP sur lequel contacter le serveur si besoin est : « http://[2001:200:0:8002:203:47ff:fea5:3085]:80/ » (ici le port 80 pour l'exemple).

Utilisateur du serveur IRC Freenode, je m'empresse de me connecter à « ipv6.chat.eu.freenode.net ». Mais je perd régulièrement ma connexion, je suis alors repassé en IPv4 en attendant que ça se stabilise du côté de chez Free (rappel : IPv6 est en phase de test chez Free).

Outils pour IPv6

Outils réseaux à installer pour jouer avec IPv6 :

  • nc6 : netcat (client TCP générique) compatible IPv6
  • nmap : le scanneur de port par excellence, l'option -6 active le mode IPv6
  • traceroute6 : affiche les nœuds réseaux entre votre machine et un serveur

Pour les installer :

sudo apt-get install netcat6 nmap iputils-tracepath

En testant rapidement, la première chose qu'on réalise est que bien que la Freebox soit en mode routeur avec du NAT, les machines en IPv6 sont directement accessibles depuis Internet ! Je m'empresse de configurer le parefeu Netfilter pour éviter les mauvaises surprises. Règles pour accepter le ping (ICMPv6) et le port TCP 80 :

#!/bin/sh
ip6tables -F
ip6tables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
ip6tables -A INPUT -p icmpv6 -j ACCEPT
ip6tables -A INPUT -j DROP

Pour en savoir plus

IPv6 chez Free

Depuis hier, le fournisseur d'accès Internet français Free propose l'IPv6 en test aux clients ADSL dégroupés. Ça tombe bien, c'est mon fournisseur. Je me suis donc empressé de tester cette nouvelle option ! Il faut activer manuellement l'option dans « Fonctionnalités optionnelles de la Freebox > Autres fonctions > Support IPV6 [x] » puis redémarrer la Freebox. Dans mon cas, un nouveau firmware (version 1.3) a été installé.

Il était temps que Free réagisse à la pétition ipv6pourtous lancée en août 2005 ! Nerim proposait déjà IPv6 depuis mars 2003, et Orange avait réalisé des tests (mais le service a été coupé). Pour Free, ce n'est pas encore de l'IPv6 natif, mais un tunnel IPv6 dans IPv4 (4to6) non standard conçu par Rémi Després (concepteur de Transpac). Depuis 2004, ce dernier tentait d'imposer son 4to6 Unified IPv4-to-IPv6 Transition Model (brouillon de novembre 2004). En 2005, il monte une maquette avec la participation de l'ENST-B : IPv4&6 : Une Architecture Unifiée pour la Coexistence IPv4-IPv6, présenté en février 2005 durant la Journée Cohabitation IPv4 - IPv6.

Lire le billet IPv6 chez Free ! pour les détails techniques, et le journal linuxfr pour les trolls sur IPv6.

lundi 3 décembre 2007

Mes liens favoris (del.icio.us)

Pour noter mes liens favoris, j'avais trouvé une bonne méthode : ajouter des liens externes à l'article Wikipédia associé. En particulier, j'avais noté de chouettes liens sur le noyau Linux.

Malheureusement (pour moi), ce qui devait arriver arriva, j'ai été découvert : « 22 novembre 2007 à 18:50. Chtit draco. (Annulation des modifications 23234174 de Haypo : lien externe absolument pas de référence, anecdotique et sans utilité, cfr Wikipédia:Liens externes) » (commentaire du changement de l'article). Fort heureusement, j'avais choisi Wikipédia comme base de donnée car chaque modification est archivée et je peux donc retrouver les liens même après effacement ;-)

Mais bon, faut pas abuser alors j'ai décidé de migrer mes liens sur le site Delicious : voir mes favoris del.ico.us. Forcément, j'ai retrouvé d'autres amis geeks ce qui me permet de votre quels liens ils apprécient. Et puis, les outils pour trouver des liens proches des miens, grâce aux tags, ont l'air bien foutus. Je me suis déjà abonné aux liens concernant le fuzzing pour voir.

Options de GCC

J'adore GCC ! C'est une collection de compilateurs pour de nombreux langages : C, ObjectiveC, C++, Java, Pascal, Ada, Fortran, etc. Il n'est peut être pas le compilateur le plus rapide (quoique...), mais celui qui supporte le plus d'architectures (processeurs et systèmes d'exploitation). Il permet d'ailleurs de compiler pour une architecture différente du système hôte (cross-compilation). Exemples : compiler depuis Linux pour Windows, compiler depuis Linux sur un processeur IA32 pour un ARM, etc. Je pense également qu'il respecte au plus près les standards (comme ISO C99).

Options -Wall -Wextra -Werror

Chaque nouvelle version de GCC détecte un peu plus de bugs. Ils sont soit rapportés sous forme d'avertissements, soit sous forme d'erreurs (bloque la compilation). Par expérience, je vous conseille d'activer tous les avertissements et de les corriger au plus tôt. L'option « -Wall » est censée activer tous les avertissements (vu son nom)... mais il existe « -Wextra » qui active encore plus d'avertissements ! Notez que -Wextra s'appellait « -W » tout court pour les versions inférieures à GCC 4.0. Si vous êtes pointilleux, vous pouvez utiliser « -Werror » qui va traduire les avertissements en erreur. Ceci oblige à corriger les avertissements sous peine de ne pas pouvoir compiler le programme.

Avec « -Wall -Wextra -Werror » on pourrait penser que GCC a fait de son mieux, mais que neni ! Il existe encore d'autres options « secrètes » comme par exemple l'option « -Wconversion » qui est pourtant utile : elle détecte les conversions de type dangereuses. Je pense que cette option est désactivée par défaut car elle produit beaucoup d'avertissements dont une bonne partie de faux positifs.

Détails de quelques options

Si je ne me trompe pas, les options suivantes sont toutes activées par « -Wall -Wextra ».

  • -Waddress détecte les comparaisons de pointeur (et non pas de la valeur pointée) comme dans « char *hello="Hello"; if (hello == "Hello") ... »
  • -Wuninitialized détecte l'utilisation de variable non initialisée : « char *x; printf("x=%s\n", x); »
  • -Wunused détecte les varibles inutiliséees : « void rien() { char x = 42; } »
  • -Wno-int-to-pointer-cast / -Wpointer-to-int-cast avertit des conversions implicites entre pointeur et entier : « void *x = NULL; int y = x; ». Ceci est problématique sur certaines architectures telle qu'AMD64 où un entier int fait 32 bits alors qu'un pointeur fait 64 bits !
  • -Wparentheses et -Wmissing-braces proposent d'ajouter des parenthèses / accolades pour du code prêtant à confusion
  • -Wformat détecte appels erronés à printf (argument manquant ou en trop, ou encore type incompatible) : « printf("Bonjour %s\n"); »

Notez que vous pouvez écrire « -Wno-(...) » pour désactiver un avertissement, comme par exemple : « -Wno-format ».

Lire également mon autre article sur GCC

dimanche 2 décembre 2007

Bugs des générateurs de nombres pseudo-aléatoires

Maintenant que vous savez ce qu'est qu'un générateur de nombres pseudo-aléatoires, voyons en les bugs historiques, ainsi que les utilisations incorrectes qui en sont faites. Une mauvaise initialisation de la graine peut compromettre la sécurité de votre application. De même, la fonction rand() doit également être utilisée correctement sous peine d'abaisser l'entropie du résultat. Ce billet présente de multiple exemples dont le numéro de séquence TCP, pour finir sur les fuites d'information.

Lire la suite

Générateurs de nombres pseudo-aléatoires

Récemment, plusieurs vulnérabilités ont été trouvées dans des générateurs de nombre pseudo-aléatoires : Linux, Windows, FreeBSD et OpenSSL. Je prépare un billet dessus, mais avant je vais m'attarder sur les générateurs : comment un ordinateur purement déterministe pourrait être aléatoire ? Ce billet présente les algorithmes utilisés, comment mesurer la qualité d'un générateur, le groupe de travail du NIST, le choix de la graine et enfin les générateurs matériels.

Lire la suite