Sommaire

1. Installation des packages
2. Création du répertoire incoming
3. Création du répertoire personnel de debarchiver
4. Gestion des clefs GnuPG pour l'upload
5. Création d'une clef GnuPG pour le dépôt lui-même
6. Le fichier /etc/debarchiver.conf complet
7. Configuration de dupload
8. Accès au dépôt via HTTP

1  Installation des packages

Pour mettre en place notre dépôt, il est nécessaire d'installer les trois packages suivants : Donc :
# apt-get install devscripts dupload debarchiver
  [...]
  Warning: The home dir /var/lib/debarchiver you specified already exists.
  Ajout de l'utilisateur système « debarchiver » (identifiant : 121)...
  Ajout du nouvel utilisateur « debarchiver » (identifiant : 121) avec le
  groupe « debarchiver »...
  Le répertoire personnel « /var/lib/debarchiver » existe déjà.
  Pas de copie des fichiers depuis « /etc/skel ».
  adduser : Warning: The home directory `/var/lib/debarchiver' does not belong to the user you are currently creating.
  Setting owner for /var/cache/debarchiver to debarchiver.
  Setting owner for /var/lib/debarchiver/dists to debarchiver.
  Setting group owner for /var/lib/debarchiver/incoming to
  debarchiver.

# ls -l
  total 8
  drwxr-xr-x 5 debarchiver debarchiver 4096 2007-11-18 19:25 dists
  drwxrwsr-x 5 root        debarchiver 4096 2007-11-18 17:05 incoming
Par défaut, nous avons le répertoire /var/lib/debarchiver qui : Nous allons modifier cette structure et séparer chaque élément au fur et à mesure de l'installation.

2  Création du répertoire incoming

Nous partons du principe que toute personne uploadant un paquet sur le serveur le fera à partir d'un compte unique debuploaders. Une fois connectés, les utilisateurs doivent déposer les paquets dans un répertoire incoming afin d'être validés par debarchiver avant le transfert vers le référentiel. Pour ce faire, nous créons ce compte de la manière suivante.
# adduser --no-create-home debuploaders
# mkdir -p /home/debuploaders/incoming
# chown -R debuploaders.debuploaders /home/debuploaders
# chmod -R o-rx /home/debuploaders
# chmod g+w /home/debuploaders/incoming
Debarchiver doit pouvoir accéder à incoming donc nous l'ajoutons au groupe debuploaders :
# usermod -G debuploaders debarchiver
Nous précisons à debarchiver où se trouve le répertoire incoming.
# grep -n \$inputdir /etc/debarchiver.conf
8:$inputdir = "/home/debuploaders/incoming";
17:# into $inputdir (not %distinputdirs).

3  Création du répertoire personnel de debarchiver

Les informations GnuPG sont considérées comme sensibles et stockées dans le répertoire personnel de debarchiver. Par conséquent, nous lui créons aussi son répertoire personnel afin d'éviter de travailler dans /var/lib/debarchiver.
# mkdir /home/debarchiver
# chown debarchiver:debarchiver /home/debarchiver
# usermod -d /home/debarchiver debarchiver
Soit :
# grep debarchiver /etc/passwd
  debarchiver:x:121:119:Deb archiving tool,,,:/home/debarchiver:/bin/false
L'utilisateur debarchiver n'a pas la possibilité de se logguer du fait de son shell /bin/false.

4  Gestion des clefs GnuPG pour l'upload

Tous les paquets uploadés doivent être signés. Il faut donc permettre à debarchiver de savoir quelles signatures doivent être considérées comme valides ou non valides. Créons donc une clef à l'aide de la commande gpg --gen-key

Note : Si vous avez déjà une clef GnuPG, il ne vous est pas nécessaire d'en créer une nouvelle, vous pouvez suivre la même démarche. En admettant que la clef soit la suivante :
# gpg --list-key
  /root/.gnupg/pubring.gpg
  ------------------------
  pub   1024D/C8B395E4 2007-11-18 [expires: 2008-11-17]
  uid                  DebUploaders (Uploader group for Debian) <debuploaders@dthconnex.com>
Nous l'exportons dans un fichier afin de pouvoir la fournir à debarchiver, pour l'associer à un keyring spécifique pour les uploaders.
# gpg -a --output debuploaders.asc --export C8B395E4
# mv /root/debuploaders.asc /home/debarchiver/
# chown debarchiver:debarchiver /home/debarchiver/debuploaders.asc
Pour modifier la configuration GnuPG de debarchiver, il nous faut nous logguer en tant que ce même utilisateur or nous avons mis en évidence que son shell était /bin/false auparavant. Modifions donc cela :
# chsh -s /bin/bash debarchiver
Maintenant, il est possible de se logguer :
# su debarchiver
$ cd ~
Nous initialisons GnuPG :
$ gpg --list-key
  gpg: directory `/home/debarchiver/.gnupg' created
  gpg: can't open `/gnupg/options.skel': Aucun fichier ou répertoire de ce type
  gpg: keyring `/home/debarchiver/.gnupg/pubring.gpg' created
  gpg: /home/debarchiver/.gnupg/trustdb.gpg: trustdb created
Nous créons le keyring uploaders.gpg contenant le clef présente dans le fichier debuploaders.asc :
$ gpg --no-default-keyring --keyring uploaders.gpg --import debuploaders.asc 
  gpg: keyring `/home/debarchiver/.gnupg/secring.gpg' created
  gpg: keyring `/home/debarchiver/.gnupg/uploaders.gpg' created
  gpg: key C8B395E4: public key "DebUploaders (Uploader group for Debian) <deb_uploaders@dthconnex.com>" imported
  gpg: Total number processed: 1
  gpg:               imported: 1
Pour toutes les clefs des uploaders, il faut refaire la même manipulation. Le fichier debuploaders.asc n'est plus utile à présent, donc nous pouvons le supprimer :
$ rm debuploaders.asc
Il faut maintenant renseigner devscript pour qu'il prenne en compte le keyring uploaders.gpg lors de l'utilisation de la commande dscverify (validation de l'upload du package). Pour ce faire, il faut dans un premier temps obtenir la configuration par défaut de devscript présente dans le fichier /etc/devscripts.conf et ensuite la modifier :
$ cp /etc/devscripts.conf ~/.devscripts
$ grep -n DSCVERIFY_KEYRINGS .devscripts 
  310:DSCVERIFY_KEYRINGS="~/.gnupg/uploaders.gpg"
Si vous voulez vérifier que la commande dscverify fonctionne correctement, vous pouvez ajouter un paquet signé avec la clef créée plus haut ; vous devriez obtenir une sortie de ce type :
$ dscverify mypackage.changes
	    mypackage.changes:
             	Good signature found
	    validating mypackage.dsc
	        Good signature found
	    validating mypackage.orig.tar.gz
	    validating mypackage.diff.gz
	    validating mypackage.deb
	    All files validated successfully.
Debarchiver n'emploiera pas cette commande à moins qu'on ne le lui spécifie. Une modification du fichier de configuration de debarchiver s'impose :
$ exit
# grep -n -e vrfycmd -e verifysignatures /etc/debarchiver.conf 
  12:$vrfycmd = "dscverify";
  18:$verifysignatures = 1;
  26:$verifysignaturesdistinput = 0;

5  Création d'une clef GnuPG pour le dépôt lui-même

Pour se conformer aux dépôts Debian officiels, le référentiel lui-même signera un fichier Release.gpg qui assurera que les paquets sont associés au dépôt. Si le client ne possède pas la clef GnuPG, il en sera averti par apt lors de la mise à jour du dépôt. Nous créons la clef
# su debarchiver
$ cd ~

$ gpg --gen-key
  gpg (GnuPG) 1.4.6; Copyright (C) 2006 Free Software Foundation, Inc.
  This program comes with ABSOLUTELY NO WARRANTY.
  This is free software, and you are welcome to redistribute it
  under certain conditions. See the file COPYING for details.

  Please select what kind of key you want:
     (1) DSA and Elgamal (default)
     (2) DSA (sign only)
     (5) RSA (sign only)
  Your selection? 2
  DSA keypair will have 1024 bits.
  Please specify how long the key should be valid.
           0 = key does not expire
        <n>  = key expires in n days
        <n>w = key expires in n weeks
        <n>m = key expires in n months
        <n>y = key expires in n years
  Key is valid for? (0) 1y
  Key expires at lun 17 nov 2008 13:02:36 CET
  Is this correct? (y/N) y

  You need a user ID to identify your key; the software constructs the user ID
  from the Real Name, Comment and Email Address in this form:
      "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

  Real name: DthConnex Repository
  Email address: debrepository@dthconnex.com
  Comment: Unofficial Debian Repository
  You selected this USER-ID:
      "DthConnex Repository (Unofficial Debian Repository) <debrepository@dthconnex.com>"

  Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
  You need a Passphrase to protect your secret key.

  We need to generate a lot of random bytes. It is a good idea to perform
  some other action (type on the keyboard, move the mouse, utilize the
  disks) during the prime generation; this gives the random number
  generator a better chance to gain enough entropy.
  .+++++++++++++++++++++++++.+++++..++++++++++++++++++++++++++++++.+++++....+++++++++++++++++++++++++++++++++
  .+++++++++++++++..+++++++++++++++>.++++++++++..............................................................
  ...........................................................................................................
  ...........................................................................................................
  ...........................+++++

  gpg: key 7EBD107F marked as ultimately trusted
  public and secret key created and signed.

  gpg: checking the trustdb
  gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
  gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
  gpg: next trustdb check due at 2008-11-17
  pub   1024D/7EBD107F 2007-11-18 [expires: 2008-11-17]
        Key fingerprint = 19CC 7D33 DEBA F8A0 72AF  BEB7 B30C 57E5 7EBD 107F
  uid                  DthConnex Repository (Unofficial Debian Repository) <debrepository@dthconnex.com>

  Note that this key cannot be used for encryption.  You may want to use
  the command "--edit-key" to generate a subkey for this purpose.

$ gpg --list-key
  /home/debarchiver/.gnupg/pubring.gpg
  ------------------------------------
  pub   1024D/7EBD107F 2007-11-18 [expires: 2008-11-17]
  uid                  DthConnex Repository (Unofficial Debian Repository) <debrepository@dthconnex.com>
Nous avons créé la clef propre au dépôt avec une passphrase, par conséquent afin que debarchiver puisse signer le fichier Release.gpg, il est nécessaire de lui fournir la passphrase.
$ echo "mypassphrase..." > /home/debarchiver/.gnupg/passphrase
$ chmod 600 /home/debarchiver/.gnupg/passphrase
Nous créons le keyring associé au dépôt dans debian-dthconnex-keyring.gpg.
$ gpg -a --output debian-dthconnex-keyring.asc --export 7EBD107F

$ gpg --no-default-keyring --keyring debian-dthconnex-keyring.gpg --import debian-dthconnex-keyring.asc 
  gpg: keyring `/home/debarchiver/.gnupg/debian-dthconnex-keyring.gpg' created
  gpg: key 7EBD107F: public key "DthConnex Repository (Unofficial Debian Repository) <debrepository@dthconnex.com<" imported
  gpg: Total number processed: 1
  gpg:               imported: 1
  gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
  gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
  gpg: next trustdb check due at 2008-11-17

$ rm debian-dthconnex-keyring.asc
Ce fichier va nous permettre de distribuer le keyring à toute personne utilisant le dépôt par l'installation d'un paquet debian-dthconnex-keyring. Le paquet se chargera d'ajouter la clef du depôt à apt-secure.

Les sources sont les suivantes : debian-dthconnex-keyring_2007.11.19.tar.gz

Nous remettons le shell par défaut de debarchiver et supprimons toutes traces des manipulations effectuées avec cet utilisateur :
$ rm ~/.bash_history
$ exit
# chsh -s /bin/false debarchiver
Indiquons à debarchiver d'utiliser la nouvelle clef pour signer les archives :
# grep -n -e gpgkey -e gpgpassfile /etc/debarchiver.conf 
  96:$gpgkey = "7EBD107F";
  101:$gpgpassfile = "$ENV{HOME}/.gnupg/passphrase";

6  Le fichier /etc/debarchiver.conf complet

$destdir = "/var/lib/debarchiver/dists";
$inputdir = "/home/debuploaders/incoming";
$copycmd = "cp -af";
$movecmd = "mv";
$rmcmd = "rm -f";
$vrfycmd = "dscverify";
$cinstall = "installed";
#$distinputcriteria = "^linux.*\\.deb\$";

# Choose to enable or disable signature verification for packages uploaded
# into $inputdir (not %distinputdirs).
$verifysignatures = 1;

# Force install of changes files even if some files already exists with
# wrong size or md5 hash.
# $ignoredestcheck = 0;

# Choose to enable or disable signature verification for packages uploaded
# into %distinputdirs. This works indepentently from $verifysignatures.
$verifysignaturesdistinput = 0;

# Generate bzip2 files or not (1 will generate and 0 will not do so).
# $bzip = 0;

# Time to allow .changes files to be incomplete in seconds. Allow this time
# for slow uploads.
# Defaults to 24 hours.
# $incompletetime = 24*60*60;

# This one is used for debarchives that matches distinput criteria.
%distinputdirs =
        (
#       stable => 'stable',
#       testing => 'testing',
        unstable => 'unstable'
        );

# What distributions that should exist.
@distributions = ('unstable');

# Default major section to install to, if not defined in the uploaded files.
$majordefault = "main";

# Mapping of aliases.
# OBS! If you create a mapping that will only be created if you have
#  added the key to @distributions above. If you want the symlink to be created
#  in a proper way you MUST add them at the same time. Else you will have
#  two directories that are independent (and not mapped).
%distmapping =
        (
        unstable => 'sid'
        );

# What architectures that should exist (automatically created).
# All and source will exist anyway.
@architectures = ('i386', 'amd64');

# What sections that should exist.
@sections = ('main');

# What changes file fields that should be used for determine where to send
# mail. If there is an '@' character is found here it will be used directly
# without consulting the .changes-file. Default is to mail no one. If there
# is an '@' character in the beginning, the user owning the file will be
# prepended.
@mailtos = ('Maintainer',          #The Maintainer field in control file
            'Uploaders',           #The Uploaders field in control file
            'debrepository@dthconnex.com',   #An explicit email address
            'Changed-By');         #The email in the changelog file

# Specify the sender of emails.
# Default to none.
# $mailfrom = "";

# If you want additional information in the generated Release files you have
# to set this hash-value.  Supported keys are origin, label, and description.

%release = (    'origin' => "DthConnex.com",
                'label' => "DthConnex.com Unofficial Repository",
                'description' => "Unofficial packages from DthConnex.com");

# Where to put the apt-ftparchive cache files if --index is used.  Default
# is /var/cache/debarchiver.  Must be a directory.
$cachedir = '/var/cache/debarchiver';

# GnuPG key to use to sign the archive.
$gpgkey = "7EBD107F";

# File to provide password to GnuPG.
# If you use a key with an empty passphrase, set this variable to 0 or "".
# If the file does not exist, debarchiver will also fall back to "".
$gpgpassfile = "$ENV{HOME}/.gnupg/passphrase";

# The configuraton file need to return a true value.
1;

7  Configuration de dupload

Dupload nous permet d'uploader les packages dans le répertoire incoming. La configuration de celui-ci se fait via le fichier /etc/dupload.conf où il est possible de définir des configurations pour chaque dépôt. En considérant que : Nous pouvons ajouter la configuration suivante au fichier /etc/dupload.conf :
$cfg{'dthconnex'} = {
        fqdn => "diamond.dthconnex.com",
        method => "scpb",
        login => "debuploaders",
        incoming => "/home/debuploaders/incoming/",
        dinstall_runs => 1,
};
Pour se connecter au serveur et charger le package, il suffit de lui fournir le fichier changes et de lui préciser à l'aide de l'option -t la configuration à utiliser. Soit :
$ dupload -t dthconnex mypackage.changes
D'autres options sont disponibles, et explicitées dans la man page de dupload.conf.

8  Accès au dépôt via HTTP

Pour autoriser des clients à accéder à notre dépôt en utilisant HTTP, il faut ajouter la configuration suivante à notre serveur web.
Alias /debian /var/lib/debarchiver/

<Directory "/var/lib/debarchiver">
    Options Indexes FollowSymLinks +Includes
    
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>
Les clients modifieront sans doute la configuration de leur fichier sources.list pour adopter le dépôt et permettre des mise à jour faciles.
deb http://www.dthconnex.com/debian/ sid main
deb-src http://www.dthconnex.com/debian/ sid main
Ici je n'utilise que la section main pour la branche unstable, mais il est possible d'y ajouter, en fonction de sa configuration, les sections contrib et non-free, ainsi que les branches stables et instables. Lors du premier update, vous obtiendrez un message d'avertissement, vous disant que la clef publique pour le dépôt dthconnex.com n'a pas pu être vérifiée. C'est tout à fait normal, puisque vous ne la possédez pas encore.
# apt-get update
  [...]
  Lecture des listes de paquets... Fait
  W: GPG error: http://www.dthconnex.com sid Release: Les signatures
  suivantes n'ont pas pu être vérifiées car la clé publique n'est pas
  disponible : NO_PUBKEY B30C57E57EBD107F
  W: Vous pouvez lancer « apt-get update » pour corriger ces problèmes.

# apt-key list
 /etc/apt/trusted.gpg
 --------------------
 pub   1024D/2D230C5F 2006-01-03 [expired: 2007-02-07]
 uid                  Debian Archive Automatic Signing Key (2006) <ftpmaster@debian.org>

 pub   1024D/6070D3A1 2006-11-20 [expires: 2009-07-01]
 uid                  Debian Archive Automatic Signing Key (4.0/etch) <ftpmaster@debian.org>

 pub   1024D/ADB11277 2006-09-17
 uid                  Etch Stable Release Key <debian-release@lists.debian.org>
Pour l'installer :
# apt-get install debian-dthconnex-keyring

# apt-key list
  [...]
  pub   1024D/7EBD107F 2007-11-18 [expires: 2008-11-17]
  uid                  DthConnex Repository (Unofficial Debian Repository) <debrepository@dthconnex.com>