Pages Menu
TwitterRss
Categories Menu

Posted on 4 Jan, 2011 in Linux |

Dépôt Debian perso avec debarchiveur

Tutoriel copié sur dthconnex.com

Voici le tuto que j’ai suivi pour créer un dépôt Debian conforme avec signature pour ZinuD

1  Installation des packages

Pour mettre en place notre dépôt, il est nécessaire d’installer les trois packages suivants :

devscripts pour vérifier les packages uploadés,

dupload pour uploader les packages sur le serveur,

debarchiver pour construire le dépôt.

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.

Par défaut, nous avons le répertoire /var/lib/debarchiver qui :

  • est le répertoire personnel de debarchiver,
  • contient le référentiel des paquets sous dists,
  • contient le répertoire incoming qui récupère les paquets uploadés sur le serveur.

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 :

(fqdn) le serveur sur lequel se trouve le dépôt, ou tout du moins le répertoire incoming, est diamond.dthconnex.com,

(method) l’accès au serveur est effectué par SSH,

(login) le compte auquel se connecter est debuploaders

(incoming) le chemin pour le répertoire incoming est /home/debuploaders/incoming/

(dinstall_runs) aucun mail ne doit être envoyé pour mettre en évidence l’upload car le serveur s’en chargera.

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