Archlinux, un serpent est mort

Avec pacman 4.x, on verra la mort d’un des serpents de mer d’Arch Linux : la signature des paquets et dépôts.

Souvent et de manière récurrente, il fleurissait ici ou là un sujet concernant la sécurité des paquets sous Arch Linux (Dan McGee résume cela dans un article), mais jusqu’à maintenant, aucune implémentation n’avait percée, désormais, c’est chose faite.

Il est maintenant possible de signer les dépôts (à l’aide de repo-add -s) mais aussi les paquets (à l’aide de makepkg --sign), pacman, lors de la phase de vérification d’intégrité et selon la configuration, teste les signatures.

Plusieurs niveaux de vérification sont possibles selon la valeur de la directive SigLevel:

SigLevel = [Database|Package] [TrustOnly|TrustAll]

Il est possible de spécifier une configuration globale en plaçant SigLevel dans la section [options] et/ou une configuration par dépôt en la plaçant dans la section du dépôt concerné, par exemple:

[options]
#...
SigLevel = Optional TrustOnly
#...
[mon_depot]
SigLevel = DatabaseRequired PackageNever TrustOnly

Le fonctionnement ensuite, est totalement transparent à moins qu’une vérification échoue.

Un exemple vaut mieux qu’un long discours et pour avoir un aperçu de tout le cheminement, je vais créer un mini dépôt contenant yaourt-git et package-query-git, les versions stables n’étant pas compatibles avec pacman, ça tombe bien.

Evidemment, il faut avoir une clé pour procéder aux signatures :

$ gpg --fingerprint
/home/test/.gnupg/pubring.gpg
-----------------------------
pub   2048R/EB671452 2011-10-25
    Empreinte de la clé = 8002 883C D06C 06BB BDD1  4D24 C2B0 9F4B EB67 1452
uid                  tuxce 
uid                  tuxce 
uid                  [jpeg image of size 11842]
sub   2048R/DE00D30D 2011-10-25

On récupère les PKGBUILD :

mkdir pkg repo
cd pkg
for pkg in yaourt-git package-query-git; do
  curl http://aur.archlinux.org/packages/$pkg/$pkg.tar.gz | bsdtar -xf -
done

On construit les paquets:

$ cd ..
$ export PKGDEST="$(pwd)/repo"
$ cd pkg/yaourt-git
$ makepkg --sign
# [...]
==> Signature de(s) paquet(s)…

Vous avez besoin d'une phrase de passe pour déverrouiller la
clé secrète pour l'utilisateur: « tuxce  »
clé de 2048 bits RSA, ID EB671452, créée le 2011-10-25

  -> Le fichier /home/test/pkg/yaourt-git/yaourt-git-20111025-1-any.pkg.tar.xz.sig des signatures a été créé.
==> Quitte l'environnement fakeroot.
==> Création finie : yaourt-git 20111025-1 (mar. oct. 25 17:04:14 CEST 2011)
$ cd ../package-query-git
# [...]
==> Signature de(s) paquet(s)…
                           
Vous avez besoin d'une phrase de passe pour déverrouiller la
clé secrète pour l'utilisateur: « tuxce  »
clé de 2048 bits RSA, ID EB671452, créée le 2011-10-25

  -> Le fichier /home/test/pkg/package-query-git/package-query-git-20111025-1-x86_64.pkg.tar.xz.sig des signatures a été créé.
==> Quitte l'environnement fakeroot.
==> Création finie : package-query-git 20111025-1 (mar. oct. 25 17:06:47 CEST 2011)

Création du dépôt:

$ cd ../../repo
$ ls
package-query-git-20111025-1-x86_64.pkg.tar.xz
yaourt-git-20111025-1-any.pkg.tar.xz
package-query-git-20111025-1-x86_64.pkg.tar.xz.sig
yaourt-git-20111025-1-any.pkg.tar.xz.sig
$ repo-add -s mon_depot.db.tar.gz *.xz
==> Ajoute le paquet 'package-query-git-20111025-1-x86_64.pkg.tar.xz'
  -> Calcul des sommes de contrôle…
  -> Ajout de la signature des paquets…
  -> Création de l'entrée 'desc'...
  -> Création de l'entrée 'depends'...
==> Ajoute le paquet 'yaourt-git-20111025-1-any.pkg.tar.xz'
  -> Calcul des sommes de contrôle…
  -> Ajout de la signature des paquets…
  -> Création de l'entrée 'desc'...
  -> Création de l'entrée 'depends'...
==> Création du nouveau fichier de dépôt 'mon_depot.db.tar.gz'
==> Signature de la base de données…

Vous avez besoin d'une phrase de passe pour déverrouiller la
clé secrète pour l'utilisateur: « tuxce  »
clé de 2048 bits RSA, ID EB671452, créée le 2011-10-25

  -> Le fichier mon_depot.db.tar.gz.sig des signatures a été créé.
$ ls
mon_depot.db
mon_depot.db.tar.gz
package-query-git-20111025-1-x86_64.pkg.tar.xz
yaourt-git-20111025-1-any.pkg.tar.xz
mon_depot.db.sig
mon_depot.db.tar.gz.sig
package-query-git-20111025-1-x86_64.pkg.tar.xz.sig
yaourt-git-20111025-1-any.pkg.tar.xz.sig

Rajout du dépôt à /etc/pacman.conf :

[mon_depot]
Server = file:///home/test/repo

Synchronisation :

# pacman -Sy
Avertissement : database file for 'mon_depot' does not exist
:: Synchronisation des bases de données de paquets...
 testing est à jour ;
 core est à jour ;
 extra est à jour ;
 community-testing est à jour ;
 community est à jour ;
 mon_depot                                     1548,0   B   998K/s 00:00 [#########################################] 100%
 mon_depot.sig                                  286,0   B   150K/s 00:00 [#########################################] 100%
Erreur : mon_depot: key "C2B09F4BEB671452" is unknown
:: Importation de la clé PGP EB671452, « tuxce  », 2011-10-25 créée ? [O/n] 

Si vous avez mis TrustAll et que votre clé est disponible sur le serveur de clé configuré (cf wiki / pacman-key), il suffit de répondre « o », sinon, il faudra d’abord importer la clé (que vous auriez par exemple exporté avec gpg --export) :

# pacman-key -a cle_publique.key
==> Mise à jour de la base de données de confiance…
gpg: vérification de la base de confiance inutile

Si pacman-key ne possède pas la clé ou si la vérification échoue, pacman retourne :

Erreur : la base de donnée 'mon_depot' n'est pas valide (base de données invalide ou corrompue (Signature PGP))

L’utilisation est transparente :

# pacman -S yaourt-git package-query-git

En plus de la vérification des paquets et des dépôts, pacman 4.x par le biais de makepkg permet en plus de pouvoir vérifier les sources des paquets soumis à AUR pour peu que l’auteur fournisse un .sig ou .asc, il suffira alors de le spécifier dans le PKGBUILD :

sources=(http://example.org/$pkgname-$pkgver.tar.gz{,.sig})

Voilà, en espérant que la transition se passera sans soucis.


Pacman Package Signing – 1, 2 et 3 d’Allan McRae
Historique par Dan McGee
pacman-key sur le wiki .fr.
Commentaires fermés | Trackback URI