Comment utiliser Reprepro pour un référentiel de paquets sécurisé sur Ubuntu 14.04

Introduction aux paquets et aux référentiels

Nous sommes tous passés par là - avons besoin d’un programme - et que faisons-nous? La plupart d’entre nous juste et hop! Comme par magie, Postfix est installé.

Ce n’est pas vraiment magique, cependant. Le gestionnaire de paquets apt-get recherche, télécharge et installe le paquet pour vous. C’est très pratique, mais qu’arrive-t-il si apt-get ne trouve pas le programme dont vous avez besoin dans sa liste standard de référentiels? Heureusement, apt-get permet aux utilisateurs de spécifier des emplacements de téléchargement personnalisés (appelés référentiels).

Dans ce didacticiel, nous expliquerons comment configurer votre propre référentiel sécurisé et le rendre public aux autres utilisateurs. Nous allons créer le référentiel sur une Droplet Ubuntu 14.04 LTS et tester le téléchargement depuis un autre Droplet avec la même distribution.

Pour tirer le meilleur parti de ce guide, assurez-vous de consulter notre tutoriel pour https://www.digitalocean.com/community/tutorials/how-to-manage-packages-in-ubuntu-and-de-bian-with-apt -get-apt-cache [gestion des paquets avec apt-get].

Conditions préalables

Deux * gouttelettes Ubuntu 14.04 LTS *

À la fin du guide, vous aurez:

  • Préparé et publié une clé de signature de référentiel

  • Configurer un référentiel avec Reprepro, le gestionnaire de référentiel

  • Rendre le référentiel public avec le serveur Web Nginx

  • Ajout du référentiel sur un autre serveur

Préparer et publier une clé de signature

Premièrement, nous avons besoin d’une clé de signature de paquet valide. Cette étape est cruciale pour un référentiel sécurisé, car nous allons signer numériquement tous les packages. La signature du paquet donne au téléchargeur l’assurance qu’il est possible de faire confiance à la source.

Dans cette section, vous allez générer une clé publique principale cryptée et une sous-clé de signature en procédant comme suit:

  • Générer une clé principale

  • Générer une sous-clé pour la signature du paquet

  • Détacher la clé principale de la sous-clé

Générer une clé principale

Faisons la clé principale. Cette clé doit être gardée en sécurité car c’est ce à quoi les gens vont faire confiance.

Avant de commencer, installons cependant:

apt-get install rng-tools

GPG nécessite des données aléatoires, appelées entropies, pour générer des clés. L’entropie est normalement générée dans le temps par le noyau Linux et stockée dans un pool. Cependant, sur les serveurs cloud (tels que les Droplets), le noyau peut avoir des difficultés à générer la quantité d’entropie requise par GPG. Pour aider le noyau, nous installons le programme rngd (présent dans le paquetage rng-tools). Ce programme demandera au serveur hôte (où sont situées les gouttelettes) d’entropie. Une fois récupéré, + rngd + ajoutera les données au pool d’entropie pour être utilisées par d’autres applications telles que GPG.

Si vous recevez un message comme celui-ci:

Trying to create /dev/hwrng device inode...
Starting Hardware RNG entropy gatherer daemon: (failed).
invoke-rc.d: initscript rng-tools, action "start" failed.

Démarrez le démon manuellement avec:

rngd -r /dev/urandom

Par défaut, rngd recherche un périphérique spécial sur lequel extraire l’entropie. Certaines gouttelettes ne possèdent pas cet appareil. Pour compenser, nous utilisons le périphérique pseudo aléatoire en spécifiant la directive. Pour plus d’informations, vous pouvez consulter notre didacticiel: Comment configurer une entropie supplémentaire .

Maintenant que nous avons un pool d’entropie, nous pouvons générer la clé principale. Faites cela en appelant la commande. Vous verrez une invite semblable à la suivante:

gpg --gen-key
gpg (GnuPG) 1.4.16; Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Please select what kind of key you want:
  (1) RSA and RSA (default)
  (2) DSA and Elgamal
  (3) DSA (sign only)
  (4) RSA (sign only)
Your selection?

Spécifiez la première option, «RSA et RSA (par défaut)» + 1 +, dans l’invite. Cette sélection génèrera d’abord une clé de signature, puis une sous-clé de chiffrement (les deux utilisant l’algorithme RSA). Nous n’avons pas besoin d’une clé de chiffrement pour ce didacticiel, mais comme un grand homme l’a déjà dit: «pourquoi pas?

Hit et vous serez invité pour une taille de clé:

RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)

La taille de la clé est directement liée à la sécurité de votre clé principale. Plus la taille du bit est élevée, plus la clé est sécurisée. Le projet Debian recommande d’utiliser 4096 bits pour toute clé de signature, je le spécifierais donc ici. Si vous préférez l’utiliser, la taille de bit par défaut 2048 est suffisante pour les 2 à 5 prochaines années. Une taille de 1024 est inconfortablement proche d’être dangereuse et ne doit pas être utilisée.

Appuyez sur pour l’invite d’expiration.

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)

Les clés principales n’ont normalement pas de date d’expiration, mais définissez cette valeur aussi longtemps que vous comptez utiliser cette clé. Si vous prévoyez d’utiliser ce référentiel uniquement pour les 6 prochains mois, vous pouvez le spécifier. le rendra valide pour toujours.

Hit, alors. Vous serez invité à générer un «ID utilisateur». Cette information sera utilisée par d’autres personnes et par vous-même pour identifier cette clé - utilisez donc des informations réelles!

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) <[email protected]>"

Real name:
Email address:
Comment:
You selected this USER-ID:
   "Mark Lopez <[email protected]>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?

Si les informations sont correctes, appuyez sur et. Nous devons ajouter un mot de passe pour vous assurer que vous seul avez accès à cette clé. Assurez-vous de * mémoriser ce mot de passe * car il n’y a aucun moyen de récupérer un mot de passe de clé gpg (une bonne chose).

You need a Passphrase to protect your secret key.

Enter passphrase:
Repeat passphrase:

Maintenant, il reste un peu de magie (math). Cela peut prendre un peu de temps, alors asseyez-vous ou prenez une tasse de votre boisson préférée.

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.

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy! (Need 300 more bytes)
+++++
................+++++
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: /root/.gnupg/trustdb.gpg: trustdb created
gpg: key 10E6133F 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
pub   4096R/ 2014-08-16
     Key fingerprint = 1CD3 22ED 54B8 694A 0975  7164 6C1D 28A0 10E6 133F
uid                  Mark Lopez <[email protected]>
sub   4096R/ 2014-08-16

Maintenant, nous avons une clé principale. La sortie montre que nous avons créé une clé principale pour la signature (`sur la ligne ci-dessus). Votre clé aura différents identifiants. Prenez note de vos clés de signature IS (l’exemple utilise). Nous aurons besoin de ces informations lors des étapes suivantes lors de la création d’une autre sous-clé à signer.

Générer une sous-clé pour la signature du paquet

Nous allons maintenant créer une deuxième clé de signature afin de ne pas avoir besoin de la clé principale sur ce serveur. Pensez à la clé principale en tant qu’autorité racine qui donne l’autorité aux sous-clés. Si un utilisateur approuve la clé principale, la confiance dans une sous-clé est implicite.

Dans le terminal, exécutez:

+ gpg --edit-key +

Remplacez l’exemple d’ID par l’ID de votre clé. Cette commande nous entre dans l’environnement. Ici, nous pouvons éditer notre nouvelle clé et ajouter une sous-clé. Vous verrez le résultat suivant:

gpg (GnuPG) 1.4.16; Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Secret key is available.

pub  4096R/10E6133F  created: 2014-08-16  expires: never       usage: SC
                    trust: ultimate      validity: ultimate
sub  4096R/7B34E07C  created: 2014-08-16  expires: never       usage: E
[ultimate] (1). Mark Lopez <[email protected]>

gpg>

À l’invite, tapez + addkey +:

addkey

Presse . GPG vous demandera votre mot de passe. Entrez le mot de passe que vous avez utilisé pour chiffrer cette clé.

Key is protected.

You need a passphrase to unlock the secret key for
user: "Mark Lopez <[email protected]>"
4096-bit RSA key, ID 10E6133F, created 2014-08-16

gpg: gpg-agent is not available in this session
Enter passphrase: <hidden>

Vous verrez l’invite suivante pour le type de clé.

Please select what kind of key you want:
  (3) DSA (sign only)
  (4) RSA (sign only)
  (5) Elgamal (encrypt only)
  (6) RSA (encrypt only)
Your selection?

Nous voulons créer une sous-clé <i> signature </ i>, sélectionnez donc «RSA (signe uniquement)» + 4 +. RSA est plus rapide pour le client, alors que DSA est plus rapide pour le serveur. Nous choisissons RSA dans ce cas parce que, pour chaque signature que nous faisons sur un paquet, des centaines de clients devront peut-être vérifier. Les deux types sont également sécurisés.

Encore une fois, on nous demande une taille de clé.

RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)

Ce tutoriel utilise pour plus de sécurité.

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)

Nous avons déjà une clé principale, le délai d’expiration de la sous-clé est donc moins important. Un an est un bon laps de temps.

Appuyez sur Entrée, puis tapez (oui) deux fois pour les deux invites suivantes. Certains maths vont générer une autre clé.

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.
............+++++
.+++++

pub  4096R/10E6133F  created: 2014-08-16  expires: never       usage:
                    trust: ultimate      validity: ultimate
sub  4096R/7B34E07C  created: 2014-08-16  expires: never       usage:
sub  4096R/  created: 2014-08-16  expires: 2015-08-16  usage:
[ultimate] (1). Mark Lopez <[email protected]>

gpg>

Tapez à l’invite.

save

Dans la sortie ci-dessus, la clé principale de de nous indique que la clé sert uniquement à la signature et à la certification. Le moyen que la clé ne peut être utilisé que pour le cryptage. Notre clé de signature peut être correctement vue avec seulement le.

Notez le nouvel identifiant de votre clé de signature (l’exemple est présenté à la deuxième ligne ci-dessus). L’identité de votre clé sera différente.

Entrez pour revenir au terminal et enregistrer votre nouvelle clé.

save

Détacher la clé principale de la sous-clé

Le but de la création de la sous-clé est de ne pas avoir besoin de la clé principale sur notre serveur, ce qui le rend plus sécurisé. Nous allons maintenant détacher notre clé principale de notre sous-clé. Nous devrons exporter la clé principale et la sous-clé, puis supprimer les clés du stockage de GPG, puis réimporter uniquement la sous-clé.

Premièrement, utilisons les commandes et pour exporter la clé entière. N’oubliez pas d’utiliser l’identifiant de votre clé principale!

gpg --export-secret-key  > private.key
gpg --export  >> private.key

Par défaut et affichera la clé sur notre console, nous dirigerons donc la sortie vers un nouveau fichier (). Assurez-vous de spécifier votre propre ID de clé principale, comme indiqué ci-dessus.

  • Important: Faites une copie du fichier dans un endroit sûr * (pas sur le serveur). Les emplacements possibles sont sur une disquette ou un lecteur USB. Ce fichier contient votre clé privée, votre clé publique, votre sous-clé de chiffrement et votre sous-clé de signature.

  • Après avoir sauvegardé ce fichier dans un emplacement sûr, * supprimez le fichier:

#back up the private.key file before running this# rm private.key

Exportez maintenant votre clé publique et votre sous-clé. Veillez à modifier les identifiants pour qu’ils correspondent à la clé principale et à la deuxième sous-clé générée (n’utilisez pas la première sous-clé).

gpg --export  > public.key
gpg --export-secret-subkeys  > signing.key

Maintenant que nous avons une sauvegarde de nos clés, nous pouvons retirer notre clé principale de notre serveur.

gpg --delete-secret-key

Réimportez uniquement notre sous-clé de signature.

gpg --import public.key signing.key

Vérifiez que nous n’avons plus notre clé principale sur notre serveur:

gpg --list-secret-keys
sec  4096R/10E6133F 2014-08-16
uid                  Mark Lopez <[email protected]>
ssb   4096R/7B34E07C 2014-08-16
ssb   4096R/A72DB3EF 2014-08-16

Notez le * # * après * sec *. Cela signifie que notre clé principale n’est pas installée. Le serveur ne contient que notre sous-clé de signature.

Nettoyez vos clés:

rm public.key signing.key

La dernière chose à faire est de publier votre clé de signature.

gpg --keyserver keyserver.ubuntu.com --send-key

Cette commande publie votre clé sur un magasin public de clés - dans ce cas, le propre serveur de clés d’Ubuntu. Cela permet aux autres de télécharger votre clé et de vérifier facilement vos paquets.

Configurer un référentiel à l’aide de Reprepro

Passons maintenant au but de ce tutoriel: créer un référentiel apt-get. Les dépôts d’Apt-get ne sont pas les choses les plus faciles à gérer. Heureusement, R. Bernhard a créé Reprepro, qui «produisait, gérait et synchronisait un référentiel local de paquets Debian» (également connu sous le nom de Mirrorer). Reprepro est sous licence GNU et complètement open source.

Installer et configurer Reprepro

Reprepro peut être installé à partir des référentiels Ubuntu par défaut.

apt-get update
apt-get install reprepro

La configuration de Reprepro est spécifique à un référentiel, ce qui signifie que vous pouvez avoir différentes configurations si vous créez plusieurs référentiels. Commençons par créer une maison pour notre référentiel.

Créez un dossier dédié pour ce référentiel et accédez-y.

mkdir -p /var/repositories/
cd /var/repositories/

Créez le répertoire de configuration.

mkdir conf
cd conf/

Créez deux fichiers de configuration vides (et).

touch options distributions

Ouvrez le fichier dans votre éditeur de texte préféré (installé par défaut).

nano options

Ce fichier contient des options pour Reprepro et sera lu à chaque exécution de Reprepro. Vous pouvez spécifier ici plusieurs options. Voir le manuel pour les autres options.

Dans votre éditeur de texte, ajoutez ce qui suit.

ask-passphrase

La directive indique à Reprepro de demander un mot de passe GPG lors de la signature. Si nous n’ajoutons pas cela aux options, Reprepro mourra si notre clé est cryptée (c’est le cas).

Ctrl + x puis y et Enter enregistreront nos modifications et retourneront à la console.

Ouvrez le fichier.

nano distributions

Ce fichier contient quatre directives obligatoires. Ajoutez-les au fichier.

Codename:
Components:
Architectures:
SignWith:

La directive concerne directement le nom de code des distributions Debian publiées et est obligatoire. Il s’agit du nom de code de la distribution qui téléchargera les packages et ne doit pas nécessairement correspondre à la distribution de ce serveur. Par exemple, la version Ubuntu 14.04 LTS s’appelle * trusty *, Ubuntu 12.04 LTS s’appelle * precise * et Debian 7.6 est appelé * wheezy *. Ce référentiel est pour Ubuntu 14.04 LTS, donc * confiance * devrait être définie ici.

Ce champ est requis. Ceci n’est qu’un simple référentiel, donc définissez + main + ici. Il existe d’autres espaces de noms tels que «non-free» ou «contrib» - référez-vous à apt-get pour des schémas de nommage appropriés.

est un autre champ obligatoire. Ce champ répertorie les architectures binaires de ce référentiel séparées par des espaces. Ce référentiel hébergera des packages pour les serveurs 32 bits et 64 bits, donc est défini ici. Ajoutez ou supprimez des architectures selon vos besoins.

Pour indiquer comment les autres ordinateurs vérifieront nos packages, nous utilisons la directive. Il s’agit d’une directive facultative, mais requise pour la signature. La clé de signature plus haut dans cet exemple avait l’ID, c’est donc défini ici. Modifiez ce champ pour qu’il corresponde à l’ID de sous-clé que vous avez généré.

Enregistrez et quittez le fichier avec Ctrl + `x puis y et Entrée.

Vous avez maintenant configuré la structure requise pour Reprepro.

Ajouter un paquet avec Reprepro

Commençons par changer notre répertoire en un emplacement temporaire.

mkdir -p /tmp/debs
cd /tmp/debs

Nous avons besoin de quelques exemples de paquets avec lesquels travailler - avec:

wget https://github.com/Silvenga/examples/raw/master/example-helloworld_1.0.0.0_amd64.deb
wget https://github.com/Silvenga/examples/raw/master/example-helloworld_1.0.0.0_i386.deb

Ces packages ont été conçus uniquement pour ce guide et contiennent un script bash simple pour prouver la fonctionnalité de notre référentiel. Vous pouvez utiliser différents forfaits si vous le souhaitez.

L’exécution du programme + ls + devrait nous donner cette disposition:

ls
example-helloworld_1.0.0.0_amd64.deb  example-helloworld_1.0.0.0_i386.deb

Nous avons maintenant deux exemples de paquets. Un pour les ordinateurs 32 bits (i386), un autre pour les ordinateurs 64 bits (amd64). Vous pouvez les ajouter à notre référentiel avec:

reprepro -b /var/repositories includedeb  example-helloworld_1.0.0.0_*

L’argument * -b * spécifie le répertoire “(b) ase” pour le référentiel. La commande nécessite deux arguments - + <nom du code de distribution> et <chemin (s) de fichier> +. Reprepro demandera deux fois notre code secret pour la sous-clé.

Exporting indices...
C3D099E3A72DB3EF Mark Lopez <[email protected]> needs a passphrase
Please enter passphrase:
C3D099E3A72DB3EF Mark Lopez <[email protected]> needs a passphrase
Please enter passphrase:

Succès!

Liste et suppression

Nous pouvons lister les packages gérés avec la commande suivie du nom de code. Par exemple:

reprepro -b /var/repositories/ list

trusty|main|i386: example-helloworld 1.0.0.0
trusty|main|amd64: example-helloworld 1.0.0.0

Pour supprimer un package, utilisez la commande. La commande remove nécessite le nom de code du package et son nom. Par exemple:

reprepro -b /var/repositories/ remove

Rendre le référentiel public

Nous avons maintenant un référentiel de paquets local avec quelques paquets. Nous allons ensuite installer Nginx en tant que serveur Web pour rendre ce référentiel public.

Installer Nginx

apt-get update
apt-get install nginx

Nginx est installé avec un exemple de configuration par défaut. Faites une copie du fichier au cas où vous voudriez le consulter à un autre moment.

mv /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak
touch /etc/nginx/sites-available/default

Maintenant que nous avons un fichier de configuration vide, nous pouvons commencer à configurer notre serveur Nginx pour héberger notre nouveau référentiel.

Ouvrez le fichier de configuration avec votre éditeur de texte préféré.

nano /etc/nginx/sites-available/default

Et ajoutez les directives de configuration suivantes:

server {

   ## Let your repository be the root directory
   root        /var/repositories;

   ## Always good to log
   access_log  /var/log/nginx/repo.access.log;
   error_log   /var/log/nginx/repo.error.log;

   ## Prevent access to Reprepro's files
   location ~ /(db|conf) {
       deny        all;
       return      404;
   }
}

Nginx a quelques défauts plutôt sains. Tout ce que nous avions besoin de configurer était le répertoire racine, tout en refusant l’accès aux fichiers de Reprepro. Voir les commentaires en ligne pour plus de détails.

Redémarrez le service Nginx pour charger ces nouvelles configurations.

service nginx restart

Votre référentiel public Ubuntu est prêt à être utilisé!

Vous aurez besoin de l’adresse IP de votre Droplet pour permettre aux utilisateurs de connaître l’emplacement du référentiel. Si vous ne connaissez pas l’adresse publique de votre Droplet, vous pouvez la trouver avec.

ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 04:01:23:f9:0e:01
         inet addr:  Bcast:198.199.114.255  Mask:255.255.255.0
         inet6 addr: fe80::601:23ff:fef9:e01/64 Scope:Link
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:16555 errors:0 dropped:0 overruns:0 frame:0
         TX packets:16815 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1000
         RX bytes:7788170 (7.7 MB)  TX bytes:3058446 (3.0 MB)

Dans l’exemple ci-dessus, l’adresse du serveur est 198.199.114.168. Le vôtre sera différent.

Avec l’adresse IP de votre serveur Reprepro, vous pouvez maintenant ajouter ce référentiel à n’importe quel autre serveur approprié.

Installer un paquet à partir de notre nouveau référentiel

Si vous ne l’avez pas déjà fait, lancez une autre Droplet avec Ubuntu 14.04 LTS afin de pouvoir effectuer une installation de test à partir de votre nouveau référentiel.

Sur le nouveau serveur, téléchargez votre clé publique pour vérifier les packages à partir de votre référentiel. Rappelez-vous que vous avez publié votre clé.

Ceci est fait avec la commande.

apt-key adv --keyserver keyserver.ubuntu.com --recv-keys

Cette commande télécharge la clé spécifiée et l’ajoute à la base de données apt-get. La commande demande à GPG de télécharger la clé. Les deux autres arguments sont passés directement à GPG. Puisque vous avez téléchargé votre clé sur «keyserver.ubuntu.com», utilisez la directive pour la retransmettre à partir du même emplacement. La directive spécifie la clé exacte à ajouter.

Ajoutez maintenant l’adresse du référentiel à rechercher. Vous aurez besoin de l’adresse IP de votre serveur de référentiel de l’étape précédente. Cela se fait facilement avec le programme.

add-apt-repository "deb http:/// trusty main"

Notez la chaîne que nous donnons. La plupart des référentiels Debian peuvent être ajoutés au format général suivant:

deb (repository location) (current distribution code name)  (the components name)

L’emplacement du référentiel doit être défini sur l’emplacement de votre serveur. Nous avons un serveur HTTP donc le protocole est * http: // *. L’emplacement de l’exemple était. Le nom de code de notre serveur est * trusty *. Ceci est un simple référentiel, nous avons donc appelé le composant "principal".

Après avoir ajouté le référentiel, veillez à exécuter un. Cette commande vérifiera tous les référentiels connus à la recherche de mises à jour et de modifications (y compris celle que vous venez de créer).

apt-get update

Après avoir mis à jour apt-get, vous pouvez maintenant installer le paquet exemple depuis votre référentiel. Utilisez la commande normalement.

apt-get install example-helloworld

Si tout réussit, vous pouvez maintenant exécuter et voir:

Hello, World!
This package was successfully installed!

Toutes nos félicitations! Vous venez d’installer un paquet à partir du référentiel que vous avez créé!

Pour supprimer le package exemple, exécutez cette commande:

apt-get remove example-helloworld

Cela supprime l’exemple de package que vous venez d’installer.

Conclusion

Dans ce guide, vous avez décidé de créer un référentiel APT sécurisé. Vous avez appris à créer une clé sécurisée pour signer des packages. comment créer et gérer un référentiel avec Reprepro; et comment ajouter ce référentiel à un autre serveur. Consultez les autres guides ici pour approfondir vos connaissances sur les bonnes choses qu’Open Source et Linux vous permettent de faire.