Maintenance Whois

Comment mettre en place le nécessaire pour gérer vous-même vos objets dans la base du Ripe.

Introduction

Le Ripe

Le Ripe est l'organisme qui est en charge de la gestion des ressources internet publiques pour la zone Europe et Moyen-Orient. Ces ressources sont notamment les adresses IP (v4 et v6) et les numéros d'AS.

Afin d'assurer la gestion et la documentation de l'usage de ces ressources, mais aussi bien d'autres informations, le Ripe maintient une base de données à laquelle il est abusivement fait référence avec le nom du protocole qui sert à l'interroger.

Le «whois» et la base

Whois est un protocole très simple (je vous laisse lire la très courte RFC 3912. C'est lui qui est utilisé pour interroger la base du Ripe, mais pas pour la mettre à jour. En effet la structure de la base est beaucoup plus complexe, elle utilise un langage ramifié appelé RSPL, qui permet de distribuer l'information dans des «objets» typés (probablement des tables en fait).

La mise à jour de ces objets se fait essentiellement par deux moyens : l'interface en ligne sur le site Web du Ripe, et la messagerie électronique. L'objectif ici est d'arriver à mettre en place des échanges par mail signés avec PGP, mais au passage on va utiliser aussi les autres outils.

Authentification

Afin de garantir un niveau de sécurité suffisant, les objets maintenus dans la base sont protégés par des mécanismes de droits. Dans certains cas un algorithme qui fait appel à des vérifications de droits sur plusieurs objets déjà déclarés est employé pour valider une modification sur un autre objet.

Ces mécanismes d'autorisation ne sont pas détaillés ici, on ne traite que la partie authentification.

L'authentification peut se faire soit par mot de passe (par le Web et par mail) soit grâce à la signature PGP des objets modifiés (par mail uniquement). Dire quels clés et quels mots de passe permettent d'authentifier un requérant, c'est la fonction des objets «mainteneur» (maintainer en anglais) et dans la base : mntner.

Le ''mntner''

Le contenu d'un objet descriptif de mainteneur peut être assez détaillé :

mntner:         [mandatory]  [single]     [primary/lookup key]
descr:          [mandatory]  [multiple]   [ ]
org:            [optional]   [multiple]   [inverse key]
admin-c:        [mandatory]  [multiple]   [inverse key]
tech-c:         [optional]   [multiple]   [inverse key]
upd-to:         [mandatory]  [multiple]   [inverse key]
mnt-nfy:        [optional]   [multiple]   [inverse key]
auth:           [mandatory]  [multiple]   [inverse key]
remarks:        [optional]   [multiple]   [ ]
notify:         [optional]   [multiple]   [inverse key]
abuse-mailbox:  [optional]   [multiple]   [inverse key]
mnt-by:         [mandatory]  [multiple]   [inverse key]
referral-by:    [mandatory]  [single]     [ ]
changed:        [mandatory]  [multiple]   [ ]
source:         [mandatory]  [single]     [ ]

Chaque ligne ci-dessus décrit un renseignement à fournir, précise s'il est obligatoire (mandatory) ou s'il peut être omis (optional), s'il doit être unique ou s'il peut être présent plusieurs fois, et éventullement comment il est utilisé dans la base de données comme clé.

Quand on ne souhaite pas remplir une information (et donc qu'elle est optionnelle) la ligne doit être retirée. Quand on a plusieurs valeurs différentes à indiquer on peut soit mettre la ligne autant de fois qu'il y a de valeur, soit mettre les autres valeurs sur des lignes qui commencent par du blanc et sans répéter le nom du champ.

Le but pour nous est de créer un objet de type maintainer, que vous pourrez utiliser par la suite pour vous authentifier et maintenir d'autres objets.

Mise en place

John Doe travaille pour une association nommée Lasso, située à Trifouillis-les-oies. Il a besoin de maintenir des objets pour l'association dans la base du Ripe, et pour cela il a besoin de mettre en place quelques éléments.

Les objets

Ces objets sont destinés à décrire John (objet person), sa clé PGP (objet key-cert), à la mentionner dans un objet mainteneur (mntnr). Problème : il y a un cercle de dépendance parce lors de la création de la clé il faut dire par qui elle sera maintenue, et pour avoir un mainteneur il faut lui confier des clés.

Pour sortir de ce piège, on va commencer par créer l'objet mntner avec le formulaire spécialement dédié à cet usage.

Ce formulaire permet de jeter les bases pour deux objets : person et mntner, et de mettre en place un mot de passe.

La personne

Un objet person est en principe composé comme suit :

person:         [mandatory]  [single]     [lookup key]
address:        [mandatory]  [multiple]   [ ]
phone:          [mandatory]  [multiple]   [ ]
fax-no:         [optional]   [multiple]   [ ]
e-mail:         [optional]   [multiple]   [lookup key]
org:            [optional]   [multiple]   [inverse key]
nic-hdl:        [mandatory]  [single]     [primary/lookup key]
remarks:        [optional]   [multiple]   [ ]
notify:         [optional]   [multiple]   [inverse key]
abuse-mailbox:  [optional]   [multiple]   [inverse key]
mnt-by:         [mandatory]  [multiple]   [inverse key]
changed:        [mandatory]  [multiple]   [ ]
source:         [mandatory]  [single]     [ ]

Mais dans le cadre de ce formulaire, seuls les champs nécessaires sont demandés.

Dans le champ nic-hdl qui doit être fixé par le Ripe pour s'assurer de l'unicité de l'identifiant, on utilise un mot clé AUTO qui peut être suffixé avec 1 à 4 lettres comme des initiales, pour faciliter la mémorisation ultérieure. Donc on va mettre AUTO-1JNDO.

On renseigne donc :

  • person: John Doe
  • nic-hdl: AUTO-1JNDO
  • address: FR
  • phone : +3312345678
  • email: john.do@emaple.org

Ensuite…

Le mainteneur

On a vu le descriptif de cet objet plus haut. Ici on a besoin du minimum d'informations

  • le nom de l'objet mntner, par exemple : LASSO-MNT
  • un mot de passe.

Ce mot de passe va être le moyen initial par lequel on pourra s'authentifier.

Postez le formulaire, et voilà :

person nic-hdl: JNDO1-RIPE
person: John Doe
address: FR
phone: +33950315474
e-mail: john.doe@example.org
nic-hdl: JNDO1-RIPE
mnt-by: LASSO-MNT
changed: john.doe@example.org 20130222
source: RIPE
maintainer name: LASSO-MNT
mntner: LASSO-MNT
descr: Maintainer
admin-c: JNDO1-RIPE
upd-to: john.doe@example.org
auth: MD5-PW $1$693YaSJ8$O47.NQn8FJ7/49/AAB6ka/
mnt-by: LASSO-MNT
referral-by: LASSO-MNT
notify: john.doe@example.org
changed: john.doe@example.org 20130222
remarks: Accepted the RIPE Database Terms and Conditions
source: RIPE

C'est également ce qu'on obtient désormais en interrogeant la base avec la commande suivante :

john$ whois -r -B LASSO-MNT

Le mot de passee n'apparait que sous forme de hash md5. Mais ce n'est pas le système d'authentification désiré, nous allons ajouter une clé PGP.

La clé PGP

Supposons que John ait déjà une clé PGP (sinon : pgp –keygen). Il a besoin de l'exporter sous format ASCII pour pouvoir la déclarer dans la base du Ripe.

john$ gpg --fingerprint "John doe"
pub   2048D/9CD59B4D 2013-02-22
    Empreinte de la clé = 7299 1457 A949 DAA5 02CC  3E2D 36DE A423 9CD5 9B4D
uid                  John Doe (Oscar) <john.doe@example.org>
john$ gpg -a --export "John Doe"
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.10 (GNU/Linux)
 
mQMuBFEnYYURCACPPBa5ArdlcPtSJ95Qx5lqLxCAMyYsaXwon+bdiNff810Juo1+
tMJI+zEVKKEdS9slRiHuN/ykoTZghnnEhmC61CLh73Om6/PnwO6xUEyQ1jmnj5U5
qxUlG4RrcYtJzAh3KgKK4veop/N/GuaLOp68nU/DpfnhdKEkSI6BYGt5H16BJm2P
...
ACIFAlEnYYUCGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEDbepCOc1ZtN
YGEA/1QLYl936xILQwhpQnZF3PZnZRAsOydvlPLGOEr35+ylAP4op2pEUlw/YqpF
58W/RUaXOGbRdWNhXtOmsSuUiGa4pA==
=/tGB
-----END PGP PUBLIC KEY BLOCK-----

C'est ce avec quoi nous allons remplir les lignes certif de l'objet key-cert (autant de lignes que nécessaire) :

key-cert:       [mandatory]  [single]     [primary/lookup key]
method:         [generated]  [single]     [ ]
owner:          [generated]  [multiple]   [ ]
fingerpr:       [generated]  [single]     [inverse key]
certif:         [mandatory]  [multiple]   [ ]
org:            [optional]   [multiple]   [inverse key]
remarks:        [optional]   [multiple]   [ ]
notify:         [optional]   [multiple]   [inverse key]
admin-c:        [optional]   [multiple]   [inverse key]
tech-c:         [optional]   [multiple]   [inverse key]
mnt-by:         [mandatory]  [multiple]   [inverse key]
changed:        [mandatory]  [multiple]   [ ]

Mais aussi, afin d'authentifier la demande, on va rajouter un champ pour indiquer le mot de passe :

password : mot_de_passe

Le mieux à ce stade sera de ne pas utiliser le mail pour déclarer cet objet, car sinon le mot de passe circulerait en clair jusqu'aux Pays-Bas. On préfèrera donc l'interface Web SSL du Ripe disponible ici.

A réception, le Ripe va calculer le md5 et le comparer à celui stocké dans l'objet mntner LASSO-MNT. Si cela correspond, alors, le Ripe autorisera la création de cette clé dans la base, avec LASSO-MNT pour la maintenir.

Voici l'objet une fois rempli et avant sa soumission au Ripe :

key-cert:       PGPKEY-9CD59B4D
method:         PGP
owner:          John Doe (Oscar) <john.doe@example.org>
fingerpr:       7299 1457 A949 DAA5 02CC  3E2D 36DE A423 9CD5 9B4D
certif: -----BEGIN PGP PUBLIC KEY BLOCK-----
certif: Version: GnuPG v1.4.10 (GNU/Linux)
certif:
certif: mQMuBFEnYYURCACPPBa5ArdlcPtSJ95Qx5lqLxCAMyYsaXwon+bdiNff810Juo1+
certif: tMJI+zEVKKEdS9slRiHuN/ykoTZghnnEhmC61CLh73Om6/PnwO6xUEyQ1jmnj5U5
certif: qxUlG4RrcYtJzAh3KgKK4veop/N/GuaLOp68nU/DpfnhdKEkSI6BYGt5H16BJm2P
 ...
certif: ACIFAlEnYYUCGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEDbepCOc1ZtN
certif: YGEA/1QLYl936xILQwhpQnZF3PZnZRAsOydvlPLGOEr35+ylAP4op2pEUlw/YqpF
certif: 58W/RUaXOGbRdWNhXtOmsSuUiGa4pA==
certif: =/tGB
certif: -----END PGP PUBLIC KEY BLOCK-----
mnt-by:         LASSO-MNT
changed:        john.doe@example.org
password : mot_de_passe
source:         RIPE

L'ordre des lignes (autres que certif) n'est pas très important.

Dans l'objet publié, bien entendu, la ligne password aura été retirée.

Ajout de la clé

Il suffit à présent d'ajouter la clé dans le mntner. Pour ce faire il faut modifier l'objet existant, ce qui nécessite d'en récupérer une copie fidèle et de la corriger.

john$ whois -r -B LASSO-MNT > mntner-LASSO.src

Et on le modifie comme suit :

maintainer name: LASSO-MNT
mntner: LASSO-MNT
descr: Maintainer
admin-c: JNDO1-RIPE
upd-to: john.doe@example.org
auth: MD5-PW $1$693YaSJ8$O47.NQn8FJ7/49/AAB6ka/
auth: PGPKEY-9CD59B4D
mnt-by: LASSO-MNT
referral-by: LASSO-MNT
notify: john.doe@example.org
changed: john.doe@example.org 20130222
changed: john.doe@example.org
password: mot_de_passe
source: RIPE

Quelques remarques :

  • on a supprimé la ligne remark qui est optionnelle, mais on aurait pu la laisser ou la changer
  • la ligne password est ajoutée pour s'authentifier
  • la seconde ligne auth qui fait référence à la clé de john

Et on pourra ainsi à loisir rajouter des clés PGP pour d'autres personnes dans cet objet (ou d'autres mots de passe) en rajoutant à chaque fois une nouvelle ligne auth.

Une nouvelle fois on passe par le formulaire en ligne, en spécifiant LASSO-MNT comme objet de type mntner à rechercher et modifier. Il y a deux options : l'édition assistée champ par champ, ou bien dans une grande zone de texte libre.

NB : le mot de passe peut être spécifié via une case spéciale dans la colonne de droite, au lieu d'être inclus dans les lignes de l'objet (auquel il n'appartient pas vraiment) les deux fonctionnent.

Utilisation

On a désormais tout ce qu'il faut pour travailler.

Mot de passe

Si on veut continuer par la suite à faire des mises à jour via l'interface en ligne du Ripe, il faut conserver un mot de passe. Sans quoi on peut à présent le retirer du mntner.

Clé PGP

Pour utiliser la clé PGP il suffit de rédiger chaque objet qui doit être ajouté ou modifié dans un fichier à part, et de le signer avec la clé qui est déclarée dans le mntner indiqué dans le champ mnt-by de l'objet. Le ficher contenant l'objet signé doit ensuite être envoyé au robot du Ripe : auto-dbm(at)ripe(dot)net

Authentification VS. autorisation

Mais tout ceci ne concerne que la partie authentification. Ce n'est pas parce que le Ripe sait qui lui fait la demande qu'il va autoriser n'importe quoi : il faut encore avoir les droits suffisants pour certaines opérations. Ce jeu de droits est pris en charge par les champs mnt-* dans les objets. mnt-by est le plus standard, mais d'autres existent comme mnt-domain pour dire qui a le droit de gérer les reverse DNS, mnt-ref pour autoriser à faire référence à un objet, mnt-lower pour les objets moins spécifiques, mnt-routes pour gérer l'association de routes et de leur AS de provenance…

Pour plus d'information sur ce sujet consulter la FAQ du Ripe sur sa base de données.