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