lalahop

L'article « Quelques pistes sur le renforcement de la sécurité autour du protocole de routage BGP » a été publié aux pages 60-65 du numéro 70 (novembre/décembre 2013) de MISC. Ayant un peu étudié la sécurité de BGP, je souhaite donner mon avis qui tiendra compte du format (revue papier) qui oblige les auteurs à fortement résumer leurs propos.

Je réagis maintenant car j'achète, éventuellement (si une thématique abordée m'intéresse), la version PDF de ce magazine à l'unité et qu'il faut attendre la publication du numéro suivant pour que le numéro précédent devienne disponible au téléchargement. Je ne trollerai pas sur cette pratique ni sur celle qui consiste à faire payer le même prix pour la version numérique (pixellisée, mauvaise qualité) que pour la version papier alors que les coûts de production ne sont pas identiques (dupliquer un fichier, PDF ou pas, on frôle le zéro en coût de production). Oui, j'imagine bien qu'il faut rémunérer la production initiale (le contenu, la mise en page) et le fait que la version numérique n'est pas dominante sur la version papier, ce qui oblige à imprimer des exemplaires avec un risque d'invendus à provisionner mais quand même ...

Je mets une copie de cet article à votre disposition.

Mon premier regret sera que l'article ne met pas directement en évidence les deux catégories d'attaques existantes : celles qui visent la communication entre deux pairs BGP et celles qui visent à injecter de fausses informations qui se propageront de pair en pair. Une mention de la différence sera néanmoins faite dans la première conclusion (section 2.6).

De même, l'article ne met pas suffisamment en évidence la solution bien actuelle pour garantir l'origine d'une annonce BGP, RPKI+ROA, au profit des solutions historiques dont on sait qu'elles ne seront ni normalisées en l'état ni déployées. C'est dommage car on a l'impression que l'article est tourné vers le passé plutôt que vers le présent/futur et incite à l'immobilisme ("aucune vraie solution pour sécuriser BGP").

La section 2.2 (« Le contrôle par les secrets partagés ») traite uniquement de MD5, ce qui est assez dommage de nos jours ... Alors oui, IPsec et TCP AO ne sont pas encore suffisamment déployés pour justifier de faire la une des journaux TV mais je m'attendais à ce qu'ils soient cités dans cet article publié dans une revue spécialisée sur la sécurité informatique.

Les exemples de configuration sont mal formulés. Exemple : « neighbor «destination_adresse» password «mot» ». Ne serait-il pas plus exact de parler de « adresse_pair » au lieu de « destination_adresse » ?

Section 2.3 - « Le contrôle par les TTLs » :

En effet, partant du principe que les sessions de routage BGP entre deux routeurs sont généralement directes, les paquets IP contenant des informations de routage BGP émis par un routeur doivent arriver à l’autre routeur avec un TTL = TTL -1.

Le TTL est décrémenté uniquement en cas de forward. Un routeur reçoit un paquet, se rend compte qu'il ne lui est pas destiné, cherche une entrée dans sa FIB, décrémente le TTL. Si TTL = 0, il détruit le paquet et envoie un message ICMP « Time to Live exceeded in Transit » (type 11, code 0 😉 ) à celui qui prétend en être l'expéditeur. Si TTL > 0, le routeur forward le paquet.

Le RFC 5082 - The Generalized TTL Security Mechanism (GTSM) explique clairement que le paquet doit avoir un TTL fixé à 255 à l'émission et qu'il doit être inchangé à la réception. On lit souvent, y compris dans la CLI Cisco[1], que l'on doit avoir un TTL supérieur ou égal 254 à la réception : c'est une erreur ou plutôt, d'après mes recherches, un sacrifice de la sécurité sur l'autel de la compatibilité avec de vieilles architectures qui ne devaient pas gérer correctement la décrémentation du TTL (source : le plus loin que j'ai pu remonter, la présentation de cette proposition de TTL à 255 lors de la 27e rencontre NANOG : The BGP TTL Security Hack (BTSH)).

GTSM (Generalized TTL Security Mechanism) permet de généraliser cette approche à plusieurs sauts possibles et autres protocoles [RFC3682].

Le RFC 5082 a rendu obsolète le RFC 3682.

Sections 3.2 et 3.3 - « sBGP (secure BGP) » et « soBGP (secure origin BGP) » :

La première initiative a été le protocole sBGP (secure-BGP)

Ni S-BGP ni soBGP ne sont des protocoles.

Section 3.2 - « sBGP (secure BGP) » :

La validation de l’origine d’une route repose sur de la cryptographie à clé asymétrique nécessitant la mise en œuvre d’un système à clé publique où chaque système autonome possède alors un certificat électronique. La structure de gestion de clés proposée permet de traiter les extensions pour les blocs d’adresses certifiant l’appartenance d’une adresse à un AS.

Heu ... je ne comprends pas la dernière phrase ... En plus clair : les certificats x509 seront étendus avec de nouveaux types qui permettront de lier le titulaire de la clé privée du certificat à un préfixe IP/ASN. Ces extensions sont normalisées dans le RFC 3779 et doivent être présentes dans les certificats utilisés dans RPKI+ROA.

Un certificat est donc délivré à chaque organisme propriétaire d’un bloc d’adresse IP par l’entité responsable del’attribution des adresses IP. En partant du haut, on trouve l’IANA (Internet Assigned Numbers Autority) qui gère l’espace d’adressage d’Internet et l’assignation des blocs de numéros d’AS.

L'IANA gère, au plus haut niveau, toutes les ressources numériques uniques d'Internet, que ça soit les numéros d'AS, l'adressage IP ou bien encore les nombres dans les protocoles (exemple : les valeurs possibles pour les champs « Protocol »/« Next header » de la couche IP).

La validation du chemin pris par une annonce de route repose aussi sur de la cryptographie à clé asymétrique permettant de signer à chaque saut d’AS le chemin émis (avec sa clé privée) vers un autre système autonome comme l’illustre la figure 2 (les signatures s’empilent alors comme les couches d’un oignon).

Ce n'est pas ce que j'ai retenu de S-BGP. Pour moi, il y a autant de Route Attestation que d'AS traversés et elles ne sont pas empaquetées en oignon, chacune est indépendante. La présentation d'un des auteurs nous dit :

To validate a route received from ASn, ASn+1 requires:
[...]
- An RA corresponding to each AS along the path (ASn to AS1), where the RA generated and signed by the router in ASn encompasses the Network Layer Reachability Information (NLRI) and the path from ASn+1 through AS1

- A certified public key for each S-BGP router that signed an RA along the path (ASn to AS1), to check the signatures on the corresponding RAs

[...] The router verifies the signature on each RA and verifies the correspondence between the signer of the RA and the authorization to represent the AS in question. There also must be a correspondence between each AS in the path and an appropriate RA. If all of these checks pass, the UPDATE is valid.

On arrive à la section consacrée à RPKI+ROA, la plus floue de toute, ce qui est dommage compte tenu que RPKI+ROA est la solution normalisée à l'IETF pour initier la définition d'un routage inter-AS sécurisé.

Cette nouvelle initiative de l’IANA (groupe de travail sur la sécurité du routage inter-domaine (SIDR)) [...]

SIDR est le nom d'un groupe de travail de l'IETF. RPKI+ROA n'a rien à voir avec l'IANA. C'est assez comique de lire ça quand on sait que personne n'a voulu de l'IANA comme racine unique de la RPKI.

La solution repose sur :
- Une infrastructure de distribution de certificats numériques dont l’objectif est de prouver qu’un AS a le droit d’annoncer un préfixe. Elle s’appelle la RPKI (Resource Public Key Infrastructure)

Non, les certificats certifient que le détenteur de la clé privée associée à la clé publique contenue dans ce certificat est le titulaire des ressources (préfixes IP) mentionnées dans le certificat et qu'il peut en distribuer tout ou partie.

- Le ROA (Route Origin Authorization) est un objet signé par une autorité indiquant que « le préfixe y peut être originé par un AS donné x ». Plus spécifiquement, il s’agit d’un fichier signé avec la clé du certificat de l’autorité donnant les AS qui peuvent être à l’origine d’un ou plusieurs préfixes.

Non, un ROA ne peut contenir qu'un seul ASN. Il peut en revanche contenir plusieurs préfixes. L'"autorité" qui signe un ROA est un opérateur réseau qui détient un certificat lui procurant droit sur un préfixe IP.

L’autorité peut donc publier son certificat et ses ROAs dans des bases de données publiques (RIPE, etc.).

Ce n'est pas faux dans la pratique mais attention : la base de données publique, la RPKI, est un ensemble de dépôts dont tout un chacun peut obtenir une copie en utilisant le protocole rsync (ce que font les logiciels cités plus bas dans l'article RPKI Validator, rcynic ou bien encore RPSTIR). Ce système de dépôts est distribué et hiérarchique. Seul l'usage fait que, pour l'instant, il ne semble pas exister d'autres instances de publication que celles des 5 RIR.

Ce sont les ROAs qui seront traduits en une liste de filtrage au niveau de l’équipement réseau.

Sémantiquement incorrect. Les ROA contiennent des assertions. Exemple : « l'AS 64501 est autorisé à être à l'origine d'une annonce pour les préfixes 192.0.2.0/24 et 2001:0DB8::/32 ». Cette assertion sera transmise au routeur, qui la stockera en vue de la comparer aux annonces BGP qu'il reçoit. Il réalisera ensuite l'action choisie par l'administrateur en fonction de l'état de sortie de cette comparaison. Si l'état de sortie est « invalid » et que l'administrateur a configuré une politique pour affecter une local pref moindre aux annonces dont l'origine sera marquée invalide, alors la route contenue dans l'annonce recevra une local pref moindre. Il n'y a pas de traduction en ACL ou que sais-je comme la tournure de phrase le laisse supposer.

Cependant et comme l’injection de la liste de filtrage ROAs en mémoire sur un équipement semble dans bien des cas tout simplement impossible (tous les routeurs ne sont pas forcément puissants), une architecture via un cache-validateur semble donc être requise via le protocole RTR (RPKI/Router Protocol).

Aucun rapport. L'injection des assertions contenues dans les ROA consomme de la RAM quelle que soit la manière dont on les transmet au routeur (RTR, manuellement, ...). Les caches-validateurs sont là pour déporter le travail de récupération et de validation cryptographique des objets de la RPKI.

Le cache/validateur ne revoit que les ROAs pour des AS donnés, la décision de routage restant à la décision du routeur via sa configuration

Non. Le cache-validateur envoie au routeur toutes les assertions contenues dans les ROA qu'il a réussi à valider cryptographiquement.

Nous sommes arrivés à la fin de l'article.

[1] La commande « show tcp tcb <tcb> » affiche : « Mininum incoming TTL 254, Outgoing TTL 255 » lors de l'utilisation de la fonctionnalité « ttl-security hops 1 ».

Ce billet présente les quelques changements qui surviennent avec la nouvelle version stable d'OpenWRT. Je sais, je suis un peu en retard de plus d'un an m'enfin bon ... 😛

Table des matières

Ce billet est dans la continuité de mes autres billets sur OpenWRT et notamment de ce billet : Créez votre image personnalisée d’OpenWRT : ce qui change avec Backfire 10.03.1. Référez-vous à ces billets si quelque chose ne vous semble pas clair dans ce billet.

Ce qui change / ce que je change

Depuis tout ce temps, il y a eu des mises à jour que ça soit pour la sécurité ou le confort. Passer de Backfire à Attitude Adjustment permet d'en profiter.

Je ne souhaite plus faire de DROP en output sauf ce qui est autorisé. Je souhaite tout autoriser en sortie. D'un point de vue de la sécurité pure, c'est une perte. D'un point de vue du confort des utilisateurs placés derrière ce firewall, c'est un gain. Et comme je ne suis plus le seul utilisateur de ce réseau ... Il suffira de modifier le script /etc/init.d/firewall qui positionne les règles.

J'aurais souhaité remplacer mon récursif-cache DNS actuel, djbdns dnscache, par un autre, comme Unbound. La raison est que dnscache ne supporte pas des types d'enregistrements (exemple : NAPTR) et surtout, il ne fait pas de validation DNSSEC. Malheureusement, en choisissant Unbound et Unbound-anchor, la taille de l'image générée est de 4,5M. En supprimant LuCi, je peux tomber à 4,1M. Dans tous les cas, l'image est trop imposante pour mon WRT54GL. Donc il n'y aura pas encore de récursif-cache validant sur ce réseau puisque je suis contraint de rester avec dnscache.

Je n'ai plus besoin du package ddns-scripts proposé par OpenWRT car je n'utilise plus DynDNS (ou un autre service équivalent) mais ma propre méthode. Il faudra simplement créer le fichier /etc/crontab/root et placer la clé privée dans l'arborescence de Buildroot comme indiqué dans le billet linké.

J'effectuerai la compilation dans un tmpfs. Cela permet un gain important, notamment quand vous utilisez une machine qui est limitée par ses IO disk comme moi. La compilation utilise ccache. Il faudra le configurer car, par défaut, il met ses fichiers dans le home directory de l'utilisateur ... donc le gain du tmpfs dans ce cas-là est quasi-nul ...

Recréer l’image officielle

Presque rien ne change par rapport à mon billet sur Backfire à part l'utilisation d'un tmpfs et quelques URL.

Nous allons d'abord préparer notre Debian Wheezy (qui est devenue stable, depuis 😉 ) pour recevoir Buildroot :

sudo apt-get install asciidoc autoconf bison build-essential fastjar flex gawk gettext git-core intltool libextutils-autoinstall-perl libncurses5-dev libssl-dev libtool subversion zlib1g-dev

Nous allons créer le tmpfs (source : tmpfs : utiliser sa RAM comme répertoire de stockage. - Génération Linux. Personnellement, /tmp utilise déjà tmpfs. J'augmente donc simplement sa taille :

sudo mount -t tmpfs -o remount,size=7G tmpfs /tmp

En dessous de 8G de RAM, oubliez l'idée d'un tmpfs car la compilation du toolchain, du noyau et des packages que je sélectionne occupe facilement 5G/5,5G. Avec 8G de RAM, vous pouvez avoir un tmpfs de 7G qui vous permettra de compiler le cross-compiler, le noyau et les packages que vous voudrez (j'insiste : vous ne pourrez pas compiler tous les packages en "module").

Avec 7G sur 8G attribués au tmpfs, faites attention à ne pas lancer des applications gourmandes en RAM comme Firefox ou Eclipse (au pif hein 😛 ) en parallèle sinon le noyau va s'énerver et vous allez recevoir la visite de l'OOM Killer.

On se positionne dans notre tmpfs, on récupère les sources d'Attitude Adjustment (pour connaître l'adresse des dépôts : GetSource - OpenWrt) puis on se positionne dans le dossier des sources :

cd /tmp
svn co svn://svn.openwrt.org/openwrt/branches/attitude_adjustment
cd attitude_adjustment/

Dans la suite de ce billet, sauf mention contraire, je considérerai que votre répertoire courant est attitude_adjustment, c'est-à-dire la racine du buildroot.

On s'assure que tout le nécessaire est bien présent :

make defconfig && make prereq

On met à jour la liste des packages disponibles :

./scripts/feeds update -a && ./scripts/feeds install -a

Ensuite, on efface les fichiers de configuration de la compilation (créés automatiquement par make menuconfig, par exemple, nous y reviendrons) :

rm .config && rm .config.old

On récupère le fichier de configuration officiel (ici : déclinaison brcm47xx) :

wget http://downloads.openwrt.org/attitude_adjustment/12.09/brcm47xx/generic/config.brcm47xx_generic -O .config

Pour raccourcir le temps de la compilation, on désactive la compilation de l'image builder (« Build the OpenWrt Image Builder ») et du SDK (« Build the OpenWrt SDK ») :

make menuconfig

Par défaut, tous les packages sont compilés (en module) puis exclus de l’image finale. Pour éviter cette perte de temps lors de la compilation, on va demander à ce que les packages qui ne seront pas intégrés à l’image ne soient pas compilés. Pour cela, on commente les lignes qui finissent par “=m” (module) avec la commande suivante :

sed -i 's,^.*=m,# & is not set,g' .config

On configure ccache pour écrire dans le tmpfs au lieu du home directory de l'utilisateur courant :

export CCACHE_DIR=/tmp/.ccache

On lance la compilation :

make -j 9

La compilation va se vautrer :

make[3] -C package/dnsmasq compile
make -r world: build failed. Please re-run make with V=s to see what's going on
make: *** [world] Erreur 1

Je n'ai pas creusé l'origine de cette erreur mais il suffit de relancer la compilation (avec la même commande que ci-dessus) et cette fois, ça se passe sans emcombres.

Ajouter/supprimer des packages

Je garde les mêmes logiciels qu'avant (à l'exception de ddns-scripts, comme expliqué ci-dessus) et je ne supprime plus ppp/ppp-mod-pppoe (ce cela me semble être sans effet mais je n'ai pas creusé la question). Donc ça nous donne :

  • etherwake dans Network.
  • tcpdump-mini dans Network.
  • djbdns-dnscache dans Network -> IP adresses and Names.
  • ntpd dans Network -> Time Synchronization.
  • iptables-mod-conntrack-extra dans Network -> Firewall -> Iptables.
  • luci-i18n-french dans LuCi -> Translations

Je me suis rendu compte que Busybox intègre un serveur NTP minimaliste qui ne fournit pas le support des queries (il ne répond pas aux requêtes d'administration) ni les tools additionnels qui vont bien (ntpq par exemple). Source : NTP client/ NTP server sur le Wiki OpenWRT. Comme je souhaite conserver l'implé ntpd "classique" de l'université du Delaware (pour la possibilité de monitoring / de jouer avec ntpq principalement et aussi car c'est une valeur sûre à mes yeux depuis le temps que je l'utilise), je désactive le support NTP de Busybox dans base system -> busybox -> Networking utilities

On lance la compilation avec la méthode habituelle :

sed -i 's,^.*=m,# & is not set,g' .config
make -j9

La compilation va planter sur OpenSSL (qui est activé et compilé par dépendance pour ntpd, même si vous n'avez pas coché le support ntpd-ssl, mais qui ne sera pas intégré à l'image finale semble-t-il) :

make[6]: Entering directory `/media/montmpfs/attitude_adjustment/build_dir/target-mipsel_uClibc-0.9.33.2/openssl-1.0.1e/crypto/sha'
ccache_cc -I.. -I../.. -I../modes -I../asn1 -I../evp -I../../include  -fPIC -DOPENSSL_PIC -DZLIB_SHARED -DZLIB -DDSO_DLFCN -DHAVE_DLFCN_H -I/media/montmpfs/attitude_adjustment/staging_dir/target-mipsel_uClibc-0.9.33.2/usr/include -I/media/montmpfs/attitude_adjustment/staging_dir/target-mipsel_uClibc-0.9.33.2/include -I/media/montmpfs/attitude_adjustment/staging_dir/toolchain-mipsel_gcc-4.6-linaro_uClibc-0.9.33.2/usr/include -I/media/montmpfs/attitude_adjustment/staging_dir/toolchain-mipsel_gcc-4.6-linaro_uClibc-0.9.33.2/include -DOPENSSL_SMALL_FOOTPRINT -DHAVE_CRYPTODEV -DOPENSSL_NO_ERR -DTERMIO -fhonour-copts -Wno-error=unused-but-set-variable -msoft-float -fpic -fomit-frame-pointer -Wall -DSHA1_ASM -DSHA256_ASM -DAES_ASM -c   -c -o sha256-mips.o sha256-mips.S
sha256-mips.S: Assembler messages:
sha256-mips.S:1960: Error: opcode not supported on this processor: mips1 (mips1) `bnel $5,$23,.Loop'
make[6]: *** [sha256-mips.o] Error 1

La solution est donné sur la ML OpenSSL-dev : sha256-mips.S:1960: Error: opcode not supported on this processor: mips1 (mips1) `bnel $5,$23,.Loop'. La correction se fait comme suit :

sed -i 's/bnel/bne/' ./build_dir/target-mipsel_uClibc-0.9.33.2/openssl-1.0.1e/crypto/sha/asm/sha512-mips.pl

Le reste du billet Créez votre image personnalisée d’OpenWRT : ce qui change avec Backfire 10.03.1 (modifier les options du noyau, modifier les options de busybox, configurer les logiciels, ...) est encore valable donc je ne le reprends pas ici.

On constate que l'image de base occupe 3,2M au lieu de 3M pour une image Backfire 10.03.1 et que mon image personnalisée occupe 3,5M contre 3,2M à l'époque Backfire. Cela signifie que l'on s'approche de plus en plus de la limite de stockage d'un WRT54GL, qui, si la taille de l'image continue à augmenter, ne pourra plus accueillir de logiciels supplémentaires (comme etherwake, dnscache, ...) ...

Va te faire foutre, UEFI !

Un billet inutile pour relater ma première fois avec UEFI (et pour déverser un peu de colère près de chez vous durant ces fêtes mollassonnes).

Des Moldus ont acheté un ordinateur desktop dans une grande surface et me demandent d'assurer la maintenance et leur propre formation à partir de 0. Je me rends compte que Windows 8 est préinstallé sur la pauvre bécane.

Je passe sur le fait que la vente liée est interdite en France (enfin, c'est un vrai sac de nœuds, comme d'habitude avec la législation : Actualité : archives | groupe "Non aux Racketiciels" de l'Association Francophone des Utilisateurs de Logiciels Libres (AFUL), La vente liée et Internet - JDN) mais que le législateur s'en bat les couilles complet encore en 2013.

J'indique que je n'assure pas la maintenance de winwin (moins de stress (généré par la peur de faire une connerie grave) pour les gens, pas de virus à supprimer toutes les semaines pour moi, ...) ... Finalement, on part sur un système Debian GNU/Linux stable. Pour surfer sur le web, scanner des documents et envoyer des mails, Debian est laaaaaaargement suffisant.

Avant de passer à l'action, je réfléchis ... Windows 8 ... Il doit y avoir UEFI pas loin ... Et qui dit UEFI dit Secure Boot. Qui dit Secure Boot dit galère pour installer un OS propre, j'ai déjà lu ça plusieurs fois et notamment chez Le Hollandais Volant ... Une recherche sur le web me confirme tout ça rapidement.

Donc il faut accéder à l'interface UEFI, désactiver Secure Boot et changer l'ordre des périphériques lus au boot. Il ne reste plus qu'à savoir comment y accéder ...

Premier réflexe : lire la documentation. OK, il y a trois livrets fournis avec l'ordinateur :

  • L'un contient le schéma pour brancher les câbles et du blabla (sécurité, CLUF) dans plusieurs langues ;
  • L'autre est une publicité pour HP Connected Music (en partenariat avec Universal, ça commence bien) dans plusieurs langues ;
  • Le dernier livret présente les « Concepts de base de Windows 8 ».

C'est hallucinant ... Je me souviens de mon dernier desktop acheté dans une grande surface ... C'était au début de l'année 2002 ... C'était un Medion MD-771 ... Et la documentation était une vraie documentation. Elle présentait le matériel que j'avais acheté dont les paramètres que je pouvais changer dans le BIOS ! Sisi ! De la vraie documentation, de plus d'une centaine de pages ! Sisi ! Sisi ... En 2013, la documentation d'un ordinateur consiste en une pub et une présentation succincte de l'OS (donc du truc dont on a forcé la vente ... je trouve ça croustillant) qui peut être changé par le client ... Quelle régression en 11 ans ... Je suis déception et tristesse ...

Évidemment, j'ai tenté de chercher le manuel sur le web. Au mieux, j'ai trouvé que les documents déjà en ma possession.

Lire la documentation ces temps-ci est une erreur. L'ignorance, c'est la force.

Deuxième réflexe : tester les touches les plus souvent utilisées en mode bourrin. F1-F12 et Suppr. À part F2 qui m'a conduit à un utilitaire de dépannage UEFI, je n'ai rien trouvé.

Troisième réflexe : rechercher sur le web avec la référence du bouzin : HP Compaq CQ2900EF (C3V36EA).

Je tombe sur un thread sur le forum Ubuntu-fr : Comment Installer Ubuntu à la place de Windows 8. Comme la procédure décrite par GP974 est fonctionnelle, je la reproduis ici :

Appuyez la touche Windows + C
Cliquez Paramètres.
Cliquez Modifier les Paramètres PC.
Sous Paramètres PC, sélectionnez Général.
Sous démarrage Avancé, cliquez Redémarrer maintenant. Le système redémarrera et affichera menu de démarrage Windows 8.
Dans le menu de démarrage, sélectionnez Dépannage.
Dans menu Dépannage, sélectionnez Options Avancées.
Dans le menu Options Avancées, sélectionnez Paramètres Firmware UEFI.
Cliquez Redémarrer pour redémarrer le système et accéder au (BIOS) UEFI.

De manière assez ironique, durant la procédure, le menu de démarrage Windows 8 m'indiquera que je peux utiliser F10 pour aller plus vite ... Sans blague ! Sauf que j'ai essayé et que ça ne marche pas, ducon !

Arrivé dans l'interface UEFI, trois choses m'interpellent.

La première : comme sur tous les BIOS de machines achetées dans les grandes surfaces, les options accessibles sont en dessous du strict minimum vital ...

La deuxième : quasiment tout est rangé sous le menu Sécurité ... Activer/désactiver l'audio intégré ? De la sécurité ! Activer/désactiver la carte réseau intégrée ? De la sécurité ! Pareil pour les ports SATA ... Connaître l'ID du système (référence exacte) ? De la sécurité ! Activer/désactiver les ports USB ? De la sécurité. Ce dernier élément est assez drôle ... Sachant qu'il n'y a pas de ports dédiés à la souris et au clavier sur ce matériel, il faut forcément laisser deux ports activés (un avec un hub, pour les pénibles 😉 )... Donc on repassera pour la sécurité. Activer/désactiver les instructions de virtualisation ? De la sécurité. Je peux comprendre (Blue Pill) mais ça me semble assez foireux. À mon avis, tout cela suit la même logique : celle de la peur pour contrôler l'usage aka « Connard de client, touche pas à ça sinon ta sécurité est remise en cause, tu vas mourir dans d'atroces souffrances MOUAHAHAHAHAHA ! ».

La troisième : la bonne vieille interface BIOS en anglais était plus compréhensible que cette interface traduite dans un français déroutant ... Quel intérêt de traduire ça ? Permettre à tout un chacun de consulter/modifier les paramètres ? Avec une procédure aussi compliquée pour y accéder ?! En leur faisant peur "sécurité holalala attention !" ?! Hé bah ...

On va donc dans le menu « Sécurité », « Configuration d'amorçage sécurisée », on passe le warning qui nous dit qu'on peut faire des choses atroces et dangereuses avec F10, on active « Assistance pour anciens équipements » (selon moi, c'est l'équivalent à un bon vieux "legacy support"), on désactive « Amorçage sécurisé ». On sauvegarde avec F10. On va dans le menu « Stockage » puis « Ordre de démarrage ». on passe « Disque dur USB » (c'est sous cette appellation que ma clé USB d'install Debian est reconnue) en premier avec la touche entrée et les flèches directionnelles du clavier. Je désactive aussi le « Windows Boot Manager » avec F5.

On enregistre les modifications en allant dans le menu « Fichier », « Enregistrer les modifications et quitter ». L'ordinateur va redémarrer et là, c'est le drame ! Un message s'affiche pour prévenir qu'une odieuse modification de l'ordre des périph' d'amorçage a eu lieu et il faut taper un code pour vérifier que vous êtes bien la personne qui a effectué ces modifications ... Sauf que le code à taper est donné sur l'écran ... Security fail again ... Je ne vois pas d'autre intérêt à cet écran que celui d'infantiliser l'utilisateur. En cas d'erreur, la personne qui est capable de faire les modifs une fois sait bien que si elle s'est trompée, ça ne bootera pas et il suffira de retourner dans l'interface UEFI pour retenter sa chance ... Pas besoin d'une confirmation supplémentaire avec un code donné à l'écran ! Ou peut-être savent-ils que la touche F10 ne fonctionne pas et qu'il faut absolument passer par Windows pour modifier les paramètres ? 🙂

Conformément au billet de Julien sur le blog du Hollandais Volant, je souhaite désactiver FastStartup. Je me trouve un tutoriel pour faire ça (en passant, on notera la simplicité prétendue de Windows) : Fast Startup - Turn On or Off in Windows 8.

Je branche ma clé USB d'install Debian, je reboote et fini les conneries, je reviens enfin dans un monde logique, un monde d'ouverture. L'installation se déroule de manière tout à fait normale. Au reboot, j'ai un beau menu GRUB et Debian boote sans problèmes.

Chose intrigante : depuis l'installation de Debian, j'arrive bien à accéder à l'UEFI en pressant la touche F10 lors du boot ... Je ne l'explique pas de manière sérieuse (la piste non sérieuse est de considérer que Debian > *, pour info). Peut-être la désactivation du FastStartup ? Je suis sûr d'avoir testé la touche F10 correctement auparavant.

Pour conclure, je me souviens qu'il y a quelques années, des geeks de toute part râlaient déjà contre UEFI en disant que ça allait être la merde pour installer un système libre et propre et tout et tout ... Évidemment traités de paranos et d'autres termes flatteurs ces derniers temps ... C'est croustillant de se remémorer ces râleries du bon vieux temps après avoir touché un UEFI. C'est avoir tort que d'avoir raison trop tôt. 🙂

RPKI+ROA et BIRD pour s’amuser

Aujourd'hui, nous allons voir comment utiliser RPKI+ROA avec BIRD et plus précisément comment prendre en compte les autorisations signées que sont les ROA comme éléments supplémentaires pour prendre une décision lors de la construction de la table de routage.

Table des matières

Si vous ne savez pas bien ce qu'est RPKI+ROA : sécuriser le routage sur Internet - RPKI+ROA.

On ne traitera pas de la manière de créer ses objets signés (ROA, Ghostbusters) quand on est opérateur ou LIR. Des pistes sont données dans le travail linké ci-dessus mais ça reste dans le cadre d'une maquette.

On se concentrera uniquement sur BIRD, une mise en pratique avec Quagga ayant déjà était réalisée dans le travail linké ci-dessus.

Pour sortir un peu du monde des maquettes, nous mettrons ça en pratique sur l'infra d'ARN, FAI associatif en Alsace. 🙂

« Pour s'amuser » dans le titre de ce billet signifie que ce que je vais vous présenter n'est pas la bonne manière de faire en production (exemples : programme additionnel, choix du cache-validateur, sécurité du dernier kilomètre, ...) et que ce billet rapporte juste une expérience, un délire, une envie de découvrir et de mettre en pratique, bref, un truc fait "for ze fun". Bref, ne suivez pas ce billet pour faire prendre des décisions de routing à des routeurs en production.

Bout d'essai

Nous allons créer une table destinée à stocker les VRP (les assertions « tel AS est autorisé à être à l'origine de tels préfixes » qui sont les contenus des ROA (VRP = Validated ROA Payload)) dans BIRD puis nous ferons prendre à BIRD une décision en fonction de la validité (ou non) d'une annonce BGP conformément à une assertion.

Dans bird6.conf (c'est pareil avec bird.conf, juste que c'est v4), on ajoute :

roa table testroa {
        roa 2001:660::/32 max 32 as 64501; # RENATER
}

On déclare donc une table des VRP nommée « testroa ». On la remplit avec une assertion : l'allocation v6 de RENATER doit être originée par l'AS 64501 (ASN faisant partie des ASN réservés à l'IANA pour faire des tests). On est d'accord que c'est faux (ASN de RENATER = 2200) mais, dans RPKI+ROA, les assertions font foi : pour BIRD, ça sera l'annonce BGP qu'il recevra qui sera incorrecte et non l'inverse.

Dans BIRD, l'opérateur « roa_check() » permet d'examiner la conformité d'une annonce BGP vis-à-vis d'une table de VRP (source : documentation BIRD - opérateurs). Il sort selon les 3 états normalisés (RFC 6811) :

  • ROA_UNKNOWN : aucun VRP ne couvre le préfixe annoncé.
  • ROA_VALID : au moins un VRP couvre le préfixe annoncé et l'AS d'un VRP correspond à l'AS "d'origine" indiqué dans l'annonce BGP.
  • ROA_INVALID : au moins un VRP couvre le préfixe annoncé mais aucun n'indique l'AS "d'origine" indiqué dans l'annonce BGP.

On peut donc utiliser roa_check() dans un filtre. Chez ARN, on a déjà un filtre en entrée de nos transitaires qui appelle plusieurs fonctions (une pour filtrer les martians, une pour forcer l'IP de sortie, ...). Voici le montage approximatif que l'on aura :

function verif_roa_test()
{
#       Nos manipulations avec les ROA.
}
 
filter cleaner 
{
        if avoid_martians() then
                accept;
 
        [...]
 
        if verif_roa_test() then
                accept;
 
        reject;
}
 
protocol bgp transitaire1 {
        debug all;
        description "transitaire1";
 
        local as 60630;
        neighbor 2001:db8::1 as 64502;
 
        import filter cleaner; 
        export filter arn_subnet;
}

Alors oui, on n'est pas obligé de faire une fonction mais on tient à laisser le filtre le plus clair possible.

Dans verif_roa_test(), nous pouvons mettre ce que nous voulons. Exemple :

if roa_check(testroa) = ROA_INVALID then return false;
 
return true;

Ici, si la vérification sort avec un état « invalide », l'annonce correspondante sera ignorée.

Pour vérifier, il suffit de demander à BIRD de relire la configuration et de créer la table des VRP (configure soft) puis de re-analyser chaque annonce (restart <nom_protocol>) :

# bird6c 
bird> configure soft
Reading configuration from /etc/bird6.conf
Reconfigured.
bird> restart transitaire1

On patiente un peu et on demande :

bird> show route 2001:660::/32
Network not in table
bird>

L'annonce concernant l'allocation v6 de RENATER a bien été ignorée car l'AS qui prétend en être à l'origine (2200) ne correspondait pas à celui indiquée dans l'assertion présente dans la table (AS 64501). Si vous n'obtenez pas ce comportement, alors vous recevez certainement une annonce pour cette alloc' via une autre session BGP (peering, autre transitaire).

Évidement, cet exemple est mauvais : un opérateur préférera toujours la connectivité à la sécurité car c'est son rôle : fournir de la connectivité. Donc, il ne faut pas rejeter les annonces dans le cas d'une vérification qui sort avec l'état « ROA_INVALID ». Je doute que ces annonces soient rejetées un jour sur des routeurs de production. Le fait de rejeter ces annonces ne permet aucune tolérance aux erreurs (erreur humaine dans la RPKI, erreur matérielle dans la RPKI, erreur humaine dans la création des ROA, ROA qui ne correspondent plus à la topologie, ...).

Le mieux est de leur attribuer une préférence locale différente permettant d'établir une hiérarchie : VALID > UNKNOWN > INVALID. Ainsi, si seulement une annonce invalide parvient au routeur, le préfixe de celle-ci sera quand même ajouté à la table de routage. Si des annonces valide et invalide cohabitent (ce qui est le cas lors d'une attaque par détournement de préfixe), alors l'annonce valide sera privilégiée.

Exemple de mise en pratique :

function verif_roa_test()
{
        if roa_check(testroa) = ROA_INVALID then bgp_local_pref = 90;
 
        if roa_check(testroa) = ROA_UNKNOWN then bgp_local_pref = 100;
 
        if roa_check(testroa) = ROA_VALID then bgp_local_pref = 110;
 
        return true;
}

Demandez à BIRD de recharger sa configuration et de re-analyser toutes les annonces et vous verrez que l'allocation v6 de RENATER se voit affecter une local-pref de 90 :

show route all 2001:660::/32
2001:660::/32      via 2001:db8::1 on eth0 [transitaire1 Oct03] * (100) [AS2200i]
	Type: BGP unicast univ
	BGP.origin: IGP
        [...]
	BGP.local_pref: 90 
        [...]

Soyez plus dynamique svp !

Bon, la vérification de la conformité des annonces vis-à-vis des VRP fonctionne mais si l'on doit ajouter toutes les assertions à la main ... Les routeurs doivent récupérer automatiquement ces assertions depuis un cache-validateur. Le protocole utilisé est RTR (RPKI To Router). Les routeurs doivent implémenter ce protocole. Ce n'est pas encore le cas de BIRD.

Néanmoins, BIRD permet de mettre à jour dynamiquement une table de VRP grâce à des commandes dans birdc(6) :

  • flush roa table <nom_table> : vider une table de toutes les assertions ajoutées dynamiquement (donc pas celles ajoutées depuis le fichier de configuration).
  • add roa <prefixe> max <int_max> as <ASN> table <nom_table> : ajouter une assertion dans une table.
  • del roa <prefixe> max <int_max> as <ASN> table <nom_table> : supprimer une assertion dans une table.

Il nous faut donc écrire un petit programme qui se connecte à un cache-validateur et, en fonction de ce qu'il reçoit, ajoute ou supprime des assertions dans notre table dans BIRD en utilisant birdc(6).

La RTRlib permet de se simplifier le travail puisqu'elle prend en charge la connexion à un cache-validateur et la réception des VRP. Je ne vous explique pas comment installer cette lib, c'est déjà très bien expliqué sur le wiki officiel : installation - RTRlib.

rtrclient est un petit logiciel fourni avec la RTRlib qui permet de la tester. Il se contente d'afficher les VRP qu'il récupère depuis un cache-validateur. Il suffit donc de modifier ce programme pour notre usage. En réalité, je me suis contenté :

  • D'ajouter un « flush roa table testroa » lors de l'initialisation pour éviter tout problème (programme qui plante, état incomplet, ...).
  • De commenter l'affichage « Prefix Prefix Length ASN ».
  • De modifier la fonction de callback « update_cb » pour changer l'action à exécuter pour chaque ajout ou suppression d'une assertion.

ÉDIT du 20/12/2016 à 20h30 : Sinon, de nos jours, on utilise bird-rtrlib-cli qui fait pile poil le même travail mais avec du code plus robuste et en lequel avoir confiance. Fin de l'édit.

Ce n'est pas du grand art mais ça fait le job :

#include <stdlib.h>
#include <pthread.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
#include "rtrlib/rtrlib.h"
 
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
 
static void print_usage(char** argv){
    printf("Usage:\n");
    printf(" %s tcp <host> <port>\n", argv[0]);
 
    printf("\nExamples:\n");
    printf(" %s tcp rpki.realmv6.org 42420\n", argv[0]);
}
 
 
static void update_cb(struct pfx_table* p __attribute__((unused)), const pfx_record rec, const bool added){
    char ip[INET6_ADDRSTRLEN];
    ip_addr_to_str(&(rec.prefix), ip, sizeof(ip));
 
    char buff[100];
 
    if(added)
        sprintf(buff, "add roa %s/%u max %u as %u table testroa", ip, rec.min_len, rec.max_len, rec.asn);
    else
        sprintf(buff, "delete roa %s/%u max %u as %u table testroa", ip, rec.min_len, rec.max_len, rec.asn);
 
    if (fork() > 0)
    {
        /* On ne veut pas d'affichage informatif donc on redirige stdout vers /dev/null */
        int fd = open("/dev/null", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
        dup2(fd, 1);
        close(fd);
 
        if (rec.prefix.ver == IPV6)
	    execl("/usr/sbin/birdc6", "/usr/sbin/birdc6", buff, (char *) NULL);
	else
	    execl("/usr/sbin/birdc", "/usr/sbin/birdc", buff, (char *) NULL);
    }
}
 
 
 
int main(int argc, char** argv){
    enum mode_t { TCP, SSH } mode;
    char* host;
    char* port;
    char* user;
    char* privkey;
    char* pubkey;
    if(argc == 1){
        print_usage(argv);
        return(EXIT_FAILURE);
    }
 
    if(strncasecmp(argv[1], "tcp", strlen(argv[1])) == 0){
        if(argc != 4){
            print_usage(argv);
            return(EXIT_FAILURE);
        }
        mode = TCP;
        host = argv[2];
        port = argv[3];
 
    }
    else if(strncasecmp(argv[1], "ssh", strlen(argv[1])) == 0){
        if(argc != 7){
            print_usage(argv);
            return(EXIT_FAILURE);
        }
 
        mode = SSH;
        host = argv[2];
        port = argv[3];
        user = argv[4];
        privkey = argv[5];
        pubkey = argv[6];
    }
    else{
        print_usage(argv);
        return(EXIT_FAILURE);
    }
 
    tr_socket tr_sock;
    if(mode == TCP){
        tr_tcp_config config = {
            host,
            port,
        };
        tr_tcp_init(&config, &tr_sock);
    }
 
 
    rtr_socket rtr;
    rtr.tr_socket = &tr_sock;
 
    rtr_mgr_group groups[1];
    groups[0].sockets_len = 1;
    groups[0].sockets = malloc(1 * sizeof(rtr_socket*));
    groups[0].sockets[0] = &rtr;
    groups[0].preference = 1;
 
    rtr_mgr_config conf;
    conf.groups = groups;
    conf.len = 1;
 
 
    /* On vide la table pour éviter tout problème */
    if (fork() > 0)
        execl("/usr/sbin/birdc", "/usr/sbin/birdc", "flush roa table testroa", (char *) NULL);
    if (fork() > 0)
        execl("/usr/sbin/birdc6", "/usr/sbin/birdc6", "flush roa table testroa", (char *) NULL);
 
 
    rtr_mgr_init(&conf, 1, 520, &update_cb);
    rtr_mgr_start(&conf);
    //printf("%-40s %3s %3s %3s\n", "Prefix", "Prefix Length", "", "ASN");
    pause();
    rtr_mgr_stop(&conf);
    rtr_mgr_free(&conf);
    free(groups[0].sockets);
 
    return(EXIT_SUCCESS);
}

Je ne suis pas satisfait de l'absence de contrôle des valeurs de retour des appels systèmes, du traitement du buffer et des optimisations restantes. Mais je relativise : c'est juste un PoC et je m'en remets au formalisme et à la rigueur de la RTRlib.

Pour le compiler :

gcc rtrclient-bird.c -o rtrclient-bird -lrtr

Pour l'exécuter (exemple) :

./rtrclient-bird tcp rpki.realmv6.org 42420

Dans cet exemple, j'utilise le cache-validateur mis à disposition par les devs de la RTRlib. Je le fais sans sécurité ce qui est très mal dans un contexte de production surtout quand le cache-validateur n'est pas sur le même réseau L2 que le routeur ! Je signale que le cache-validateur rpki.realmv6.org peut aussi être utilisé over SSH. Voir : RTRlib - Usage.

Ce programme est un peu violent à son lancement : environ 6800 ROA à l'heure actuelle donc 6800 « birdc(6) roa add » donc 6800 fork() + exec() ... Mais en vitesse de croisière, avec +/- 1 ROA par-ci, par-là, ça se passe gentiment.

Pensez à supprimer/commenter le préfixe v6 de RENATER de votre table de VRP et à demander un « configure soft » à BIRD.

Voilà : la table des assertions dans BIRD se remplit toute seule et se maintient à jour toute seule (aussi longtemps que vit le programme rtrclient-bird). À partir de maintenant, BIRD prendra en compte ces assertions en fonction de votre filtre. Pour que ça soit rétroactif, il faut « restart <nom_protocol> ».

Faire des stats

Ce qu'on a vu plus haut, c'est du bonus, pour découvrir. Ce n'est clairement pas une bonne idée de faire tourner l'assemblage présenté ci-dessus (un logiciel maison mal-codé non-revu et qui ne sera pas suivi, une librairie installée en dehors d'un système de paquets, ...) sur une machine en production et surtout de baser une partie du processus de choix des routes sur cet assemblage.

Ce que je voulais obtenir, en vrai, c'est des statistiques comme celles de LACNIC ou celles du RIPE (exemple). Parce que c'est sympa d'avoir ses stats personnelles, que c'est formateur de chercher à les obtenir et aussi parce que l'outil de LACNIC est souvent en rade. ÉDIT du 20/12/2016 à 20h30 : Depuis son apparition en 2013, l'observatoire de la résilience de l'Internet français mesure aussi le déploiement de RPKI+ROA. Fin de l'édit.

Et faire des stats, ça ne nécessite pas d'utiliser les VRP comme une donnée supplémentaire dans le processus de sélection des routes. Vous pouvez donc commenter la fonction verif_roa_test() ou supprimer son appel par le filtre (et « reconfigure » BIRD, of course).

Afficher le nombre d'assertions

birdc "show roa table testroa" | wc -l
birdc6 "show roa table testroa" | wc -l

Afficher le nombre de préfixes par état

birdc show route where roa_check(testroa) = ROA_VALID protocol transitaire1 count
birdc6 show route where roa_check(testroa) = ROA_VALID protocol transitaire1 count
 
birdc show route where roa_check(testroa) = ROA_INVALID protocol transitaire1 count
birdc6 show route where roa_check(testroa) = ROA_INVALID protocol transitaire1 count
 
birdc show route where roa_check(testroa) = ROA_UNKNOWN protocol transitaire1 count
birdc6 show route where roa_check(testroa) = ROA_UNKNOWN protocol transitaire1 count

Il n'est pas obligatoire de spécifier un protocole, c'est juste pour éviter les doublons si vous avez plusieurs transitaires, du peering, ...

Résultats

Voilà ce que l'on obtient, en v4, sur le routeur d'ARN :

birdc "show roa table testroa" | wc -l
5881
 
bird> show route protocol transitaire1 count 
463627 of 927572 routes for 463629 networks
 
bird> show route where roa_check(testroa) = ROA_VALID protocol transitaire1 count 
17167 of 927571 routes for 463628 networks
 
bird> show route where roa_check(testroa) = ROA_INVALID protocol transitaire1 count 
1609 of 927567 routes for 463626 networks
 
bird> show route where roa_check(testroa) = ROA_UNKNOWN protocol transitaire1 count 
444851 of 927571 routes for 463628 networks

Voilà, ce que l'on obtient, en v6, sur le routeur d'ARN :

birdc6 "show roa table testroa" | wc -l
949
 
bird> show route protocol transitaire1 count
14375 of 28809 routes for 14376 networks
 
bird> show route where roa_check(testroa) = ROA_VALID protocol transitaire1 count 
879 of 28809 routes for 14376 networks
 
bird> show route where roa_check(testroa) = ROA_INVALID protocol transitaire1 count 
59 of 28807 routes for 14375 networks
 
bird> show route where roa_check(testroa) = ROA_UNKNOWN protocol transitaire1 count 
13437 of 28809 routes for 14376 networks

On constate qu'environ 8% des routes v4 dont au moins un ROA leur est associé sont invalides. On est a 6% en v6.

On obtient des chiffres assez proches de ceux de LACNIC (attention à additionner v4 et v6 si vous voulez comparer) :

Route counts for the last 24 hours
 
Current INVALID route count for all repositories: 2000
 
Bad MaxLen: 1655
 
Wrong BGP Origin AS: 345
 
Current VALID route count for all repositories: 18277

On constate qu'environ 10% des routes dont au moins un ROA leur est associé sont invalides.

ÉDIT du 26/01/2014 à 20h45 : Voici les stats récoltées aujourd'hui sur le routeur d'ARN :
En v4 :

birdc-arn "show roa table testroa" | wc -l
7005
 
bird> show route protocol transitaire1 count 
474565 of 949513 routes for 474566 networks
 
bird> show route where roa_check(testroa) = ROA_VALID protocol transitaire1 count
18640 of 949510 routes for 474567 networks
 
bird> show route where roa_check(testroa) = ROA_INVALID protocol transitaire1 count
2102 of 949498 routes for 474559 networks
 
bird> show route where roa_check(testroa) = ROA_UNKNOWN protocol transitaire1 count
453815 of 949497 routes for 474558 networks

En v6 :

birdc6-arn "show roa table testroa" | wc -l
1094
 
bird> show route protocol transitaire1 count
15978 of 32033 routes for 15979 networks
 
bird> show route where roa_check(testroa) = ROA_VALID protocol transitaire1 count
999 of 32030 routes for 15978 networks
 
bird> show route where roa_check(testroa) = ROA_INVALID protocol transitaire1 count
60 of 32031 routes for 15978 networks
 
bird> show route where roa_check(testroa) = ROA_UNKNOWN protocol transitaire1 count
14917 of 32031 routes for 15978 networks

On constate qu'environ 10% (augmentation) des routes v4 dont au moins un ROA leur est associé sont invalides. On est a 6% en v6 (stagnation).

Le site web de LACNIC est down depuis plusieurs heures et depuis plusieurs points du réseau donc impossible de comparer.
Fin de l'édit

ÉDIT du 01/03/2014 à 14h30 : Voici les stats récoltées aujourd'hui sur le routeur d'ARN :
En v4 :

birdc "show roa table testroa" | wc -l
7654
 
bird> show route protocol transitaire1 count 
478065 of 956517 routes for 478066 networks
 
bird> show route where roa_check(testroa) = ROA_VALID protocol transitaire1 count 
19182 of 956497 routes for 478056 networks
 
bird> show route where roa_check(testroa) = ROA_INVALID protocol transitaire1 count 
2045 of 956463 routes for 478040 networks
 
bird> show route where roa_check(testroa) = ROA_UNKNOWN protocol transitaire1 count 
456811 of 956463 routes for 478039 networks

En v6 :

birdc6 "show roa table testroa" | wc -l
1202
 
bird> show route protocol transitaire1 count
16413 of 32905 routes for 16414 networks
 
bird> show route where roa_check(testroa) = ROA_VALID protocol transitaire1 count 
1078 of 32905 routes for 16414 networks
 
bird> show route where roa_check(testroa) = ROA_INVALID protocol transitaire1 count 
57 of 32905 routes for 16414 networks
 
bird> show route where roa_check(testroa) = ROA_UNKNOWN protocol transitaire1 count 
15276 of 32902 routes for 16413 networks

On constate qu'environ 10% (stagnation) des routes v4 dont au moins un ROA leur est associé sont invalides. On est a 5% en v6 (diminution). v4 et v6 cumulés : 9%

En comparaison, les chiffres obtenus par LACNIC :

Route counts for the last 24 hours
 
Current INVALID route count for all repositories: 2596
 
Bad MaxLen: 2065
 
Wrong BGP Origin AS: 531
 
Current VALID route count for all repositories: 20765
 
Dataset processed on: March 1, 2014

Fin de l'édit

ÉDIT du 20/12/2016 à 20h30 : Voici les stats récoltées aujourd'hui sur le routeur d'ARN :

En v4 :

birdc "show roa table testroa" | wc -l
25822
 
bird> show route protocol transitaire1 count 
616508 of 616508 routes for 616508 networks
 
bird> show route where roa_check(testroa) = ROA_VALID protocol transitaire1 count 
40657 of 616500 routes for 616500 networks
 
bird> show route where roa_check(testroa) = ROA_INVALID protocol transitaire1 count 
3985 of 616492 routes for 616492 networks
 
bird> show route where roa_check(testroa) = ROA_UNKNOWN protocol transitaire1 count 
571869 of 616517 routes for 616517 networks

En v6 :

birdc6 "show roa table testroa" | wc -l
3650
 
bird> show route protocol transitaire1 count
34642 of 34642 routes for 34642 networks
 
bird> show route where roa_check(testroa) = ROA_VALID protocol transitaire1 count 
3745 of 34651 routes for 34651 networks
 
bird> show route where roa_check(testroa) = ROA_INVALID protocol transitaire1 count 
214 of 34652 routes for 34652 networks
 
bird> show route where roa_check(testroa) = ROA_UNKNOWN protocol transitaire1 count 
30692 of 34651 routes for 34651 networks

En comparaison, les chiffres obtenus par LACNIC :

Route counts for the last 24 hours
 
Current INVALID route count for all repositories: 4848
 
Bad MaxLen: 3575
 
Wrong BGP Origin AS: 1273
 
Current VALID route count for all repositories: 45581
 
Dataset processed on: Dec. 20, 2016

Fin de l'édit du 20/12/2016 à 20h30

Progression

En février 2012, le RIPE dénombrait environ 1800 ROA qui couvraient environ 8200 routes. Environ 40 % des routes dont au moins un ROA leur est associé étaient invalides.

En avril dernier, je dénombrais environ 3000 ROA.

Aujourd'hui, je dénombre environ 6800 ROA qui couvrent environ 19700 routes. Environ 8 % à 10 % des routes dont au moins un ROA leur est associé sont invalides.

ÉDIT du 26/01/2014 à 20h45 : Aujourd'hui, je dénombre environ 8100 ROA qui couvrent environ 21800 routes. Environ 8 % des routes dont au moins un ROA leur est associé sont invalides. Fin de l'édit.

ÉDIT du 01/03/2014 à 14h30 : Aujourd'hui, je dénombre environ 8800 ROA qui couvrent environ 22300 routes. Environ 9 % des routes dont au moins un ROA leur est associé sont invalides. Fin de l'édit.

ÉDIT du 20/12/2016 à 20h30 : Aujourd'hui, je dénombre environ 29500 ROA qui couvrent environ 48600 préfixes. Environ 8,6 % des préfixes dont au moins un ROA leur est associé sont invalides. Fin de l'édit.

Sécuriser le routage sur Internet

Aujourd'hui, je vous propose un long billet sur le routage inter-domaine, sa sécurité actuelle et RPKI+ROA.

Attention : RPKI+ROA est encore un mécanisme tout jeune. Cela signifie que, bien que les concepts de base ne changeront pas et que ce travail date de mai 2013, certaines informations contenues dans ce travail vont devenir obsolètes à plus ou moins long terme.

Pour lire la version HTML, il suffit de cliquer sur le lien "Lire la suite" (et/ou de poursuivre ci-dessous). Pour ceux qui préfèrent lire un si gros pavé en PDF, c'est par là : Sécuriser le routage sur Internet.

Je mets également les sources LaTeX à votre disposition. Ces sources LaTeX peuvent servir de base à d'autres documents. Sources.

Vous pouvez également récupérer la maquette (vous comprendrez la raison de son existence en lisant le pavé). Elle peut servir pour mieux visualiser le fonctionnement de RPKI+ROA ou pour simplement tester ses différents composants. Elle repose sur LXC. Le tar contient la maquette compressée avec LZMA ainsi que les instructions d'utilisation au format texte. Maquette RPKI-ROA. Les fichiers de configurations principaux pour refaire une maquette from scratch sont disponibles ici : Fichiers de configuration principaux de ma maquette RPKI-ROA.

Et pour terminer, vous pouvez également récupérer le visuel projeté durant ma soutenance et ses sources. Support visuel soutenance | Sources LaTeX support visuel soutenance.

Si vous voulez tout récupérer (maquette, sources, pdf) en un seul coup, c'est par là : Sécuriser le routage sur Internet - Pack all-in-one.

Le tout (les sources LaTeX, les pdf, les images, la maquette, ...) est diffusé sous la licence habituelle de ce blog, à savoir : CC-BY-SA 3.0 France.

Lire la suite >>