Comment configurer DNSSEC pour Bind (named)

DNSSEC est une extension du protocole DNS qui sécurise la résolution de noms de domaine. Il y a une ébauche d’explication en français sur Wikipedia, mais pour des infos plus consistantes rendez-vous sur la page en anglais.

La configuration est un peu compliquée ; il faut créer une clef pour signer la zone (Zone Signing Key, ZSK), une clef pour signer la clef (Key Signing Key, KSK), ajouter ces clefs au fichier de zone (Zone file). Comme ce fichier est modifié, il faut incrémenter son numéro de série (Serial).

Ensuite il faut signer la zone, configurer Bind pour utiliser le fichier signé au lieu du fichier original, relancer Bind et… attendre.

Quand le ou les DNS secondaires sont à jour, il faut déclarer la clef KSK à la zone parent, ce qui se fait généralement chez le registrar.

Voici un script qui effectue la plupart des opérations, mais s’arrête juste avant la mise en œuvre.

Il ouvre named.conf dans Vim à la ligne à mettre à jour éventuellement. Le fichier signé a le même nom que le fichier d’origine suivi de .signed.

Le script est à vérifier et à adapter. En particulier, les utilitaires Unix/Linux peuvent différer d’un système à l’autre et certaines options peuvent ne pas exister. ZSU est un script Perl qui incrémente le numéro de série.

#!/bin/bash
 
DOMAIN=6502.fr
ZONEDIR=/var/named/run-root/var
ZONEFILE=$DOMAIN
 
# All files must be in Zone directory
# Beware, named is chrooted
cd $ZONEDIR
 
# ZSU - update serial numbers in DNS zone files
# http://search.cpan.org/~azs/zsu-1.20/zsu
ZSU=/root/zsu
 
# Generate ZSK file
ZSK=`dnssec-keygen -a RSASHA1 -b 1024 -r /dev/urandom -n ZONE $DOMAIN`
ZSK_PUBLIC=${ZSK}.key
 
# Generate KSK file
KSK=`dnssec-keygen -a RSASHA1 -b 2048 -r /dev/urandom -n ZONE -f KSK $DOMAIN`
ID=${KSK/?*+}
KSK_PUBLIC=${KSK}.key
FLAG=`awk '{print $4}' $KSK_PUBLIC`
ALGO=`awk '{print $6}' $KSK_PUBLIC`
 
# Add keys to zone file after removing old keys
sed -i.bak -e "/K${DOMAIN}/d" $ZONEFILE
echo "\$include $ZSK_PUBLIC" >> $ZONEFILE
echo "\$include $KSK_PUBLIC" >> $ZONEFILE
# Increment Serial
$ZSU $ZONEFILE
 
# Sign the zone, validity is 1 year (31556926 seconds)
dnssec-signzone -e now+31556926 -p -g -k $KSK_PUBLIC -o $DOMAIN $ZONEFILE $ZSK_PUBLIC
 
# Edit named.conf to use ZONEFILE.signed
/usr/bin/vim /etc/named.conf "+/file .*$DOMAIN"
 
# Print info to configure the parent zone
echo "Id:    $ID"
echo "Flag:    $FLAG"
echo "Algorithm: $ALGO"
echo "Public key:"
cut -d" " -f7- $KSK_PUBLIC

À faire à la main

  • Relancer bind
/etc/init.d/named restart
  • Déclarer la clef dans la zone parent (le script imprime les paramètres à déclarer).

Google maps prend en compte la circulation dans ses itinéraires

En mode itinéraire, Google Maps classe ses suggestions par temps de parcours croissant — temps calculé sans circulation. Mais depuis le 29 mars 2012, le temps de parcours estimé avec circulation est affiché, avec une puce verte, jaune ou rouge qui indique la dégradation par rapport au temps initial.

Du Père Lachaise à Charles de Gaulle

Comment faire le ménage sous Subversion

Vous avez besoin de faire du ménage dans votre projet géré sous Subversion ? Si vous avez quelques fichiers à supprimer, la commande à passer est simple :

$ svn rm admin/images/graphs/THUMB~JT.DBE
D         admin/images/graphs/THUMB~JT.DBE

C’est fastidieux au-delà de quelques fichiers. Dans ce cas détruisez les fichiers par la méthode qui vous convient (par exemple une synchronisation avec BeyondCompare). Ensuite, un svn status vous donnera l’état des lieux.

$ svn st
D       admin/images/graphs/THUMB~JT.DBE
!       admin/images/graphs/Thumbs.db
!       admin/images/graphs/dummy
!       admin/images/graphs/.cvsignore
M       images/ramey-noir.jpg

Les fichiers manquants sont marqués par un bang (un point d’exclamation, en hacker). Le fichier que nous avons déjà détruit est signalé par un D, les fichiers modifiés par un M. Nous allons filtrer les lignes qui commencent par ! (^! pour grep) et récupérer le nom de fichier, qui est le deuxième élément de la ligne ($2 pour awk).

$ svn st|grep '^!'|awk '{print $2}'
admin/images/graphs/Thumbs.db
admin/images/graphs/dummy
admin/images/graphs/.cvsignore

Plutôt que de les regarder, nous allons les supprimer du repository.

$ svn st|grep '^!'|awk '{print $2}'|xargs svn rm
D         admin/images/graphs/Thumbs.db
D         admin/images/graphs/dummy
D         admin/images/graphs/.cvsignore

Finalement, on commite le tout :

$ svn ci -m"Ménage fait !"

Et hop !

Installer mcrypt pour PHP sur Mac OS X Snow Leopard

Mcrypt est une librairie qui remplace crypt. Voici comment l’installer sur Mac OS X Snow Leopard.

Vous aurez besoin de :

  • Xcode (disponible sur le DVD d’installation de Snow Leopard)
  • Libmcrypt version 2.5.8, téléchargeable ici
  • Le code source de votre version de PHP, par exemple 5.3.3, téléchargeable ici

Décomprimez libmcrypt et passez les commandes suivantes :

$ cd libmcrypt-2.5.8
$ MACOSX_DEPLOYMENT_TARGET=10.6 CFLAGS='-O3 -fno-common -arch i386 -arch x86_64' LDFLAGS='-O3 -arch i386 -arch x86_64' CXXFLAGS='-O3 -fno-common -arch i386 -arch x86_64' ./configure --disable-dependency-tracking
$ make -j6
$ sudo make install

Terminé pour mcrypt, passons à PHP.

$ cd php-5.3.3
$ cd ext/mcrypt
$ phpize
$ MACOSX_DEPLOYMENT_TARGET=10.6 CFLAGS='-O3 -fno-common -arch i386 -arch x86_64' LDFLAGS='-O3 -arch i386 -arch x86_64' CXXFLAGS='-O3 -fno-common -arch i386 -arch x86_64' ./configure --with-php-config=/Developer/SDKs/MacOSX10.6.sdk/usr/bin/php-config
$ make -j6
$ sudo make install

Vérifiez dans php.ini que enable_dl = On. Déclarez mcrypt dans la section Dynamic Extensions en ajoutant extension=mcrypt.so.

Relancez Apache, vous pouvez maintenant vérifier avec phpinfo() que mcrypt est bien disponible.

mcrypt sous phpinfo

Application exemple : installation de Prestashop, avant :

Installation de Prestashop sans mcrypt

Après :

Installation de Prestashop avec mcrypt

Et hop !

Merci à Michael Gracie

Éditer les gems avec gemedit

La gem que vous utilisez a un comportement inattendu ? Allez lire le code !

Mais il est parfois fastidieux de trouver où est la gem, et gemedit facilite la vie en ajoutant une commande edit à gem.

$ sudo gem install gemedit
$ gem edit gemedit

Vous pouvez indiquer l’éditeur que vous voulez lancer grâce aux variables d’environnement $GEMEDITOR, $VISUAL ou $EDITOR. Pour utiliser TextMate, ajoutez cette ligne dans votre .profile :

export GEMEDITOR=mate

Gem gemedit opened in TextMate

Ou pour Xcode :

export GEMEDITOR=xed

C’est tout de même plus rapide de taper gem edit gemedit que mate /usr/local/lib/ruby/gems/1.8/gems/gemedit-0.9.0 !

GEM Editor via Stop Googling (John Nunemaker)

Les ressources dans l’architecture REST : la source

Traduction de la section « Resources and Resource Identifiers » de la thèse de Roy T. Fielding.

5.2.1.1 Ressources et identificateurs de ressources

La ressource est le fondement de l’abstraction de l’information dans REST. Toute information qui peut être nommée peut être une ressource : un document ou une image, un service momentané (par exemple « le temps à Los Angeles aujourd’hui »), un ensemble d’autres ressources, un objet non virtuel (par exemple une personne), etc. Autrement dit, tout concept pouvant être la cible d’un lien hypertexte répond nécessairement à la définition de ressource. Une ressource est la référence conceptuelle1 vers un ensemble d’entités, pas une entité qui correspondrait à la référence à un instant donné.

Plus précisément, une ressource R est une fonction d’appartenance2 MR(t), qui au temps t associe un ensemble d’entités, ou de valeurs, qui sont équivalentes. Les valeurs de cet ensemble peuvent être des représentation de ressources3 ou des identifiants de ressources4. Une ressource peut être associée à l’ensemble vide, ce qui permet de faire référence à un concept avant qu’aucune réalisation de ce concept n’existe — une notion étrangère à la plupart des systèmes hypertextes avant le Web. Certaines ressources sont statiques dans le sens où, examinées à tout moment après leur création, elles correspondent toujours au même ensemble de valeurs. D’autres ont un degré de variabilité élevé dans le temps. La seule chose qui doit être statique pour une ressource est la sémantique de la référence, puisque la sémantique est ce qui distingue une ressource d’une autre.

Par exemple, la « version préférée de l’auteur » d’une publication académique est une référence dont la valeur varie dans le temps, alors que la « version publiée dans les actes du colloque X » est statique. Ce sont deux ressources distinctes, même si elles font référence à la même valeur à un instant donné. La distinction est nécessaire pour que les deux ressources puissent être identifiées et classées indépendamment. Un exemple similaire dans le domaine de l’ingénierie logicielle est l’identification distincte d’un fichier de code source dans un système de gestion de versions, comme la « dernière révision », la « révision numéro 1.2.7 » ou la « révision incluse dans la version Orange ».

Cette définition abstraite d’une ressource rend possible des fonctions essentielles de l’architecture du Web. Premièrement, elle généralise en englobant plusieurs sources d’information sans les distinguer artificiellement par type ou par implémentation. Deuxièmement, elle autorise l’attachement tardif5 de la référence à une représentation, ce qui rend possible une négociation de contenu6 basée sur les caractéristiques de la requête. Finalement, elle permet à l’auteur de référencer le concept plutôt qu’une représentation singulière de ce concept, supprimant ainsi le besoin de modifier tous les liens existants à chaque fois que la représentation change (en supposant que l’auteur a utilisé les bons identificateurs).

REST utilise un identificateur de ressource7 pour identifier la ressource impliquée dans une interaction entre composants. Les connecteurs REST offrent une interface générique pour atteindre et manipuler l’ensemble de valeurs d’une ressource, indépendamment de la manière dont la fonction d’appartenance est définie ou du logiciel qui traite la requête. L’autorité de nommage qui a affecté l’identificateur de ressource, rendant possible le référencement de celle-ci, a la responsabilité du maintien de la validité sémantique de la référence8 dans le temps (c’est-à-dire de s’assurer que la fonction d’appartenance ne change pas).

Les systèmes hypertextes traditionnels, qui opèrent typiquement en environnement clos ou local, utilisent des nœuds uniques ou des identificateurs de documents qui changent à chaque fois que l’information change, s’appuyant sur des serveurs de liens pour maintenir la référence séparément du contenu. Comme les serveurs de liens centralisés sont un anathème pour les exigences pluri-organisationnelles et à échelle gigantesque du Web, REST se repose au contraire sur l’auteur pour choisir l’identificateur de ressource qui convient le mieux à la nature du concept identifié. Naturellement, la qualité d’un identificateur est souvent proportionnelle à l’argent dépensé pour maintenir sa validité, ce qui conduit aux liens brisés, au fur et à mesure de la disparition ou du déplacement d’information éphémère ou peu maintenue.

Notes

  1. a conceptual mapping []
  2. membership function []
  3. resources representations []
  4. resource identifiers []
  5. late binding []
  6. content negociation []
  7. resource identifier []
  8. mapping []

Déploiement Capistrano : Création d’un repository git distant

Vous utilisez git pour gérer votre source dans un dépôt local (local repository). Après quelques jours de développement, vous êtes prêt à déployer la première version du logiciel sur votre serveur. Capistrano est l’outil idéal, mais il nécessite un dépôt accessible à partir de votre serveur (remote repository). Il est peu probable que votre dépôt local le soit.

Si vous avez un accès ssh, il est très simple de créer ce dépôt.

Si ce n’est déjà fait, copiez votre clef SSH sur le serveur. Ensuite, clonez votre dépôt et téléchargez-le sur votre serveur.

$ git clone --bare application/.git /tmp/application.git
$ scp -r /tmp/application.git monlogin@monserveur.com:git

Vous avez maintenant un dépôt distant.

$ git clone ssh://monlogin@monserveur.com/~monlogin/git/application.git

Pour le mettre à jour :

$ git push ssh://monlogin@monserveur.com/~monlogin/git/application.git master

Ou pour éviter de taper tout ça :

$ git remote add production ssh://limproviste@limproviste.com/~limproviste/private/git/limproviste.git
$ git push production

Et hop !

Reliques : l’Osborne 1

L’Osborne 1 a été le premier portable (définition : qui a une poignée). TechRepublic publie une belle galerie de photos

TDD en trois fiches

Brian Di Croce a résumé le TDD en trois fiches dont voici la première.

Card #1. Uncle Bob’s Three Laws

1 000 204 886 016 octets

Mon nouveau disque dur externe fait 1To (un teraoctet) soit 1.000.204.886.016 octets (mille milliards d’octets), ou encore 1012 octets. Conformément aux habitudes des vendeurs de disques durs, il ne fait pas 240 octets (1 Tio ou 1.099.511.627.776 octets). Pour tous savoir sur les unités SI et binaire, l’article de Wikipedia est intéressant.

disque dur externe iomega

disque dur externe iomega

C’est un eGo Desktop Hard Drive couleur Midnight Blue ; la photo ne lui rend pas justice. Il est inaudible quand il est inactif (pas de ventilateur) et silencieux quand il est en service, le seul bruit notable étant la légère vibration au démarrage et le clic de parcage de la tête de lecture.