Aller au contenu
Développement medium

Pulp en air-gapped : HTTPS auto-signé et transfert hors-ligne

8 min de lecture

Logo Pulp

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.

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

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.

  1. 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 interne
    openssl 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.cnf
    openssl x509 -req -in pulp.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
    -out pulp.crt -days 825 -extfile san.cnf

    Le champ subjectAltName est obligatoire : les clients modernes rejettent un certificat sans SAN, même avec un CN correct.

  2. Placer ce certificat sur le reverse proxy qui expose Pulp (voir Installer Pulp pour Traefik). Le proxy termine le TLS avec pulp.crt / pulp.key et transmet au conteneur.

  3. Aligner CONTENT_ORIGIN sur l'URL HTTPS, dans settings/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"

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.

Fenêtre de terminal
sudo cp ca.crt /usr/local/share/ca-certificates/pulp-interne.crt
sudo update-ca-certificates

Une 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 :

OutilApprouver la CA sans toucher au système
podmanCopier ca.crt dans /etc/containers/certs.d/pulp.interne/ca.crt
pippip install --cert ca.crt ... ou variable PIP_CERT
cosign / skopeoVariable d'environnement SSL_CERT_FILE=ca.crt
dnfsslcacert=/chemin/ca.crt dans le fichier .repo

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.

  1. Autoriser les répertoires d'export/import, dans les réglages des deux instances :

    ALLOWED_EXPORT_PATHS = ["/data/exports"]
    ALLOWED_IMPORT_PATHS = ["/data/imports"]
  2. 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-cache
    pulp exporter pulp run --name export-mensuel

    Pulp produit une archive .tar (et un fichier -toc.json) contenant les artefacts et leurs métadonnées. Vous pouvez la découper avec chunk_size pour tenir sur un support amovible.

  3. Transférer l'archive et le -toc.json vers l'instance isolée (support physique, diode réseau), dans son répertoire /data/imports.

  4. Sur l'instance isolée, créer un importer puis lancer l'import :

    Fenêtre de terminal
    pulp importer pulp create --name import-mensuel
    pulp importer pulp run --name import-mensuel \
    --toc /data/imports/export-....-toc.json

    L'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.

  • 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 subjectAltName obligatoire) 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-registry ni sslverify=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 chemins ALLOWED_EXPORT_PATHS / ALLOWED_IMPORT_PATHS.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn