
Ce guide déploie Pulp dans un réseau isolé (air-gapped) : servir l'API en HTTPS avec une autorité de certification auto-signée que l'on distribue et approuve proprement, puis transférer le contenu sans accès Internet grâce à l'export/import de Pulp. Public visé : administrateurs de zones cloisonnées (industrie, défense, santé). Prérequis : une instance Pulp (voir Installer Pulp) et openssl. La règle de fond de ce guide : on ne désactive jamais la vérification TLS, on approuve l'autorité.
Un environnement air-gapped pose deux problèmes distincts. D'abord, faire entrer le contenu sans connexion aux dépôts publics : c'est le rôle de l'export/import de Pulp. Ensuite, servir l'instance en HTTPS sans autorité publique reconnue : c'est le rôle d'une CA auto-signée que l'on approuve sur chaque client. Ces deux briques rendent une chaîne d'artefacts totalement souveraine.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Générer une autorité auto-signée et un certificat serveur pour Pulp.
- Approuver cette autorité sur les clients, sans jamais désactiver TLS.
- Exporter des dépôts depuis une instance connectée.
- Importer cette archive dans l'instance isolée.
Servir Pulp en HTTPS avec une CA auto-signée
Section intitulée « Servir Pulp en HTTPS avec une CA auto-signée »Sans autorité publique (Let's Encrypt n'est pas joignable hors ligne), vous créez votre propre autorité. C'est parfaitement sûr tant que la clé de la CA reste protégée et que le certificat est approuvé par les clients.
-
Créer l'autorité et le certificat serveur pour le nom public de votre instance (ici
pulp.interne) :Fenêtre de terminal # Autorité de certification interneopenssl req -x509 -newkey rsa:4096 -nodes -days 3650 \-keyout ca.key -out ca.crt -subj "/CN=Autorité interne Pulp"# Certificat serveur signé par cette autoritéopenssl req -newkey rsa:2048 -nodes -keyout pulp.key -out pulp.csr \-subj "/CN=pulp.interne"printf 'subjectAltName=DNS:pulp.interne' > san.cnfopenssl x509 -req -in pulp.csr -CA ca.crt -CAkey ca.key -CAcreateserial \-out pulp.crt -days 825 -extfile san.cnfLe champ
subjectAltNameest obligatoire : les clients modernes rejettent un certificat sans SAN, même avec unCNcorrect. -
Placer ce certificat sur le reverse proxy qui expose Pulp (voir Installer Pulp pour Traefik). Le proxy termine le TLS avec
pulp.crt/pulp.keyet transmet au conteneur. -
Aligner
CONTENT_ORIGINsur l'URL HTTPS, danssettings/settings.py:CONTENT_ORIGIN = "https://pulp.interne"TOKEN_SERVER = "https://pulp.interne/token/"TOKEN_SIGNATURE_ALGORITHM = "ES256"PUBLIC_KEY_PATH = "/etc/pulp/certs/token_public_key.pem"PRIVATE_KEY_PATH = "/etc/pulp/certs/token_private_key.pem"
Approuver l'autorité sur les clients
Section intitulée « Approuver l'autorité sur les clients »C'est le point qui fâche, et la tentation du --tls-verify=false est grande. Ne cédez pas : désactiver la vérification revient à accepter n'importe quel certificat, donc à ouvrir la porte à une interception. La bonne méthode est d'approuver la CA.
La façon la plus propre est d'ajouter la CA au magasin de confiance du système, une fois, sur chaque machine. Tous les outils en héritent.
sudo cp ca.crt /usr/local/share/ca-certificates/pulp-interne.crtsudo update-ca-certificatessudo cp ca.crt /etc/pki/ca-trust/source/anchors/pulp-interne.crtsudo update-ca-trustUne fois la CA dans le magasin système, curl, pip, dnf et la plupart des outils valident Pulp sans aucune option supplémentaire. Pour les outils qui gèrent leur propre confiance, la configuration par client reste possible :
| Outil | Approuver la CA sans toucher au système |
|---|---|
| podman | Copier ca.crt dans /etc/containers/certs.d/pulp.interne/ca.crt |
| pip | pip install --cert ca.crt ... ou variable PIP_CERT |
| cosign / skopeo | Variable d'environnement SSL_CERT_FILE=ca.crt |
| dnf | sslcacert=/chemin/ca.crt dans le fichier .repo |
Faire entrer le contenu sans Internet
Section intitulée « Faire entrer le contenu sans Internet »Une instance isolée ne peut pas synchroniser depuis PyPI ou Docker Hub. Le mécanisme prévu par Pulp est l'export/import : une instance connectée (upstream) exporte des versions de dépôts dans une archive .tar, que l'on transfère physiquement, puis qu'une instance isolée (downstream) importe.
-
Autoriser les répertoires d'export/import, dans les réglages des deux instances :
ALLOWED_EXPORT_PATHS = ["/data/exports"]ALLOWED_IMPORT_PATHS = ["/data/imports"] -
Sur l'instance connectée, créer un exporter puis lancer l'export des dépôts voulus :
Fenêtre de terminal pulp exporter pulp create --name export-mensuel \--path /data/exports \--repository file:livrables --repository python:pypi-cachepulp exporter pulp run --name export-mensuelPulp produit une archive
.tar(et un fichier-toc.json) contenant les artefacts et leurs métadonnées. Vous pouvez la découper avecchunk_sizepour tenir sur un support amovible. -
Transférer l'archive et le
-toc.jsonvers l'instance isolée (support physique, diode réseau), dans son répertoire/data/imports. -
Sur l'instance isolée, créer un importer puis lancer l'import :
Fenêtre de terminal pulp importer pulp create --name import-mensuelpulp importer pulp run --name import-mensuel \--toc /data/imports/export-....-toc.jsonL'import recrée les versions de dépôts avec leur contenu. Vos clients internes consomment ensuite ces dépôts en HTTPS, exactement comme sur une instance connectée.
À retenir
Section intitulée « À retenir »- Un Pulp air-gapped cumule deux problèmes : servir en HTTPS sans CA publique, et importer le contenu sans Internet.
- On crée une CA auto-signée (avec
subjectAltNameobligatoire) et on approuve cette autorité sur les clients. - La méthode propre est le magasin de confiance système (
update-ca-trust/update-ca-certificates) ; à défaut, une configuration par outil. - Jamais de
--tls-verify=false,--allow-insecure-registrynisslverify=0: approuver la CA, pas ignorer la vérification. - Le contenu entre par export/import, sur des dépôts synchronisés en
policy=immediate, via les cheminsALLOWED_EXPORT_PATHS/ALLOWED_IMPORT_PATHS.