Date de la publication : 4 novembre 2025

Lecture : 11 min

Tutoriel : sécurisez vos environnements air-gapped

Sécurisez vos environnements air-gapped avec le scanning de sécurité GitLab et détectez les menaces internes pour garantir l'intégrité de vos systèmes.

Les environnements air-gapped désignent des réseaux ou systèmes informatiques physiquement isolés de tout réseau non sécurisé, comme l'Internet public ou certains réseaux locaux non protégés. Cette isolation vise à renforcer la sécurité, car elle protège les données sensibles et les infrastructures critiques contre les cyberattaques externes.

Elle présente les avantages suivants :

  • Une sécurité renforcée : totalement déconnectés des réseaux externes, les environnements air-gapped réduisent considérablement les risques d'attaques à distance, d'infections par des logiciels malveillants et d'accès non autorisé aux données, un impératif pour les systèmes et données les plus critiques.

  • Une protection des données : l'air-gapping constitue une barrière quasi infranchissable contre l'exfiltration de données, puisqu'aucune connexion directe ne peut être exploitée par des attaquants pour dérober des informations.

  • Une résilience des infrastructures critiques : pour les systèmes qui pilotent des infrastructures vitales (centrales électriques, stations de traitement des eaux ou installations militaires), l'air-gapping empêche les cyberattaques susceptibles d'avoir des conséquences majeures.

  • Une conformité réglementaire : de nombreux frameworks réglementaires imposent l'utilisation d'environnements air-gapped pour certains types de données sensibles ou de systèmes critiques, notamment dans les secteurs public, médical et financier.

  • Une protection contre les logiciels malveillants : dépourvus de connexion réseau, ces systèmes sont naturellement protégés contre les infections provenant de logiciels malveillants ou les attaques par ransomware via Internet.

Même isolés, les systèmes air-gapped ne sont pas totalement à l'abri des failles de sécurité. D'où l'importance des scannings de sécurité réguliers pour les détecter avant qu'elles ne soient exploitées. Dans cet article, vous découvrirez les différents types de scanners de sécurité proposés par GitLab, ainsi que la manière de les ajouter ou de les mettre à jour dans un environnement à connectivité limitée.

→ Essayez GitLab Ultimate et GitLab Duo Enterprise gratuitement.

Scanners de sécurité GitLab dans les environnements air-gapped

GitLab propose une gamme complète de scanners de sécurité couvrant l'ensemble du cycle de vie des applications. Les scanners compatibles avec les environnement air-gapped sont les suivants :

Par défaut, les instances GitLab Self-Managed effectuent un pull des images du scanner de sécurité depuis le registre de conteneurs public GitLab (registry.gitlab.com) avant de les stocker dans le registre de conteneurs local. L'exemple ci-dessous illustre ce flux à travers l'exécution d'un pipeline qui analyse les secrets d'un projet de démonstration :


include:
  - template: Jobs/Secret-Detection.gitlab-ci.yml

Lorsque le job s'exécute sur une instance GitLab connectée à Internet, il s'effectue correctement :

GitLab Runner avec un accès Internet qui effectue correctement un pull depuis le registre
externe

GitLab Runner avec un accès Internet qui effectue correctement un pull depuis le registre externe



En revanche, si l'accès Internet est désactivé sur la machine virtuelle hébergeant GitLab, le job secret-detection ne parviendra pas à télécharger l'image de conteneur et provoquera son échec :

GitLab Runner sans accès Internet qui ne parvient pas à effectuer un pull depuis le registre
externe

GitLab Runner sans accès Internet qui ne parvient pas à effectuer un pull depuis le registre externe



Sinon, en définissant la politique de pull d'image de nos GitLab Runners sur if-not-present plutôt que always, nous pouvons charger la version mise en cache du scanner localement, à condition qu'il ait déjà été exécuté avec un accès à Internet en réutilisant l'image stockée dans notre registre Docker local :

GitLab Runner sans accès Internet qui effectue correctement un pull depuis le cache
du registre
interne

GitLab Runner sans accès Internet qui effectue correctement un pull depuis le cache du registre interne



Configuration des prérequis pour des scannings hors ligne

L'exécution des scanners de sécurité dans un environnement air-gapped nécessite les éléments suivants :

Vous pouvez suivre ce tutoriel sur n'importe quelle instance GitLab Self-Managed EE (même celles qui ne sont pas air-gapped) afin d'apprendre à transférer et à exécuter des images dans un environnement air-gapped. Dans ce tutoriel, nous vous expliquerons comment charger les images des scanners sur une instance GitLab EE hébergée sur une machine virtuelle (MV) Google Compute, où nous avons bloqué toute sortie EGRESS en mettant en place des règles de pare-feu :


# egress firewall rule to block all outbound traffic to the internet

$ gcloud compute firewall-rules create deny-internet-egress \
    --direction=EGRESS \
    --priority=1000 \
    --network=default \
    --action=DENY \
    --rules=all \
    --destination-ranges=0.0.0.0/0 \
    --target-tags=no-internet

# Create an allow rule for internal traffic with higher priority

$ gcloud compute firewall-rules create allow-internal-egress \
    --direction=EGRESS \
    --priority=900 \
    --network=default \
    --action=ALLOW \
    --rules=all \
    --destination-ranges=10.0.0.0/8,192.168.0.0/16,172.16.0.0/12 \
    --target-tags=no-internet

# Apply tag to VM

$ gcloud compute instances add-tags YOUR_VM_NAME \
    --zone=YOUR_ZONE \
    --tags=no-internet

Ensuite, une fois que nous avons accédé à notre MV via SSH, vous pouvez constater que nous ne pouvons pas nous connecter à registry.gitlab.com :


# showing I can't access the gitlab container registry

$ ping registry.gitlab.com

PING registry.gitlab.com (35.227.35.254) 56(84) bytes of data.

^C

--- registry.gitlab.com ping statistics ---

3 packets transmitted, 0 received, 100% packet loss, time 2031ms

Remarque : nous autorisons toujours l'Ingress afin de pouvoir copier des fichiers et des SSH dans la machine.

Charger des scanners de sécurité dans les environnements air-gapped

Pour exécuter les différents scanners de sécurité dans des environnements air-gapped, GitLab Runner doit pouvoir récupérer les images de conteneur des scanners depuis le registre de conteneurs intégré de GitLab. Ces images doivent donc être préalablement téléchargées et empaquetées dans un environnement disposant d'un accès à l'Internet public. Le processus de chargement des scanners de sécurité dans un environnement air-gapped se déroule en trois étapes :

  1. Télécharger et empaqueter les images de conteneurs depuis l'Internet public.

  2. Transférer les images vers l'environnement hors ligne.

  3. Charger les images transférées dans le registre de conteneurs hors ligne.

Voyons maintenant comment configurer la détection des secrets de GitLab dans un environnement air-gapped.

Télécharger et empaqueter les images de conteneurs depuis l'Internet public

Commençons par télécharger l'image de conteneur dédiée à la détection des secrets et par l'enregistrer dans notre registre de conteneurs local. D'autres images de scanners sont disponibles dans la documentation GitLab sur les déploiements hors ligne. Dans cet exemple, nous utilisons Podman Desktop pour effectuer le téléchargement, mais vous pouvez tout aussi bien utiliser Docker Desktop ou tout autre outil équivalent.

  1. Effectuez un pull de l'image de détection des secrets de GitLab.

$ podman pull registry.gitlab.com/security-products/secrets:6

Trying to pull registry.gitlab.com/security-products/secrets:6...

Getting image source signatures

Copying blob
sha256:999745130ac045f2b1c29ecce088b43fc4a95bbb82b7960fb7b8abe0e3801bf8

Copying blob
sha256:a4f7c013bb259c146cd8455b7c3943df7ed84b157e42a2348eef16546d8179b1

Copying blob
sha256:1f3e46996e2966e4faa5846e56e76e3748b7315e2ded61476c24403d592134f0

Copying blob
sha256:400a41f248eb3c870bd2b07073632c49f1e164c8efad56ea3b24098a657ec625

Copying blob
sha256:9090f17a5a1bb80bcc6f393b0715210568dd0a7749286e3334a1a08fb32d34e6

Copying blob
sha256:c7569783959081164164780f6c1b0bbe1271ee8d291d3e07b2749ae741621ea3

Copying blob
sha256:20c7ca6108f808ad5905f6db4f7e3c02b21b69abdea8b45abfa34c0a2ba8bdb5

Copying blob
sha256:e8645a00be64d77c6ff301593ce34cd8c17ffb2b36252ca0f2588009a7918d2e

Copying config
sha256:0235ed43fc7fb2852c76e2d6196601968ae0375c72a517bef714cd712600f894

Writing manifest to image destination

WARNING: image platform (linux/amd64) does not match the expected platform
(linux/arm64)

0235ed43fc7fb2852c76e2d6196601968ae0375c72a517bef714cd712600f894


$ podman images

REPOSITORY                                                  TAG
IMAGE ID      CREATED      SIZE

registry.gitlab.com/security-products/secrets               6
0235ed43fc7f  4 hours ago  85.3 MB

  1. Enregistrez l'image sous forme d'archive compressée (fichier tarball).

$ podman save -o secret-detection.tar
registry.gitlab.com/security-products/secrets:6

$ chmod +r secret-detection.tar

$ ls -al secret-detection.tar

-rw-r--r--@ 1 fern  staff  85324800 Jan 10 10:25 secret-detection.tar

Vous pouvez également utiliser le template GitLab officiel dans un environnement connecté à Internet pour télécharger les images de conteneurs nécessaires aux scanners de sécurité, puis les enregistrer en tant qu'artefacts de job ou effectuer un push vers le registre de conteneurs du projet où s'exécute le pipeline.

Transférer les images vers un environnement hors ligne

Transférons maintenant le tarball vers notre environnement air-gapped. Plusieurs méthodes sont possibles selon vos besoins :

  • Transfert de supports physiques

  • Diodes de données

  • Systèmes de protection

  • Solutions interdomaines (CDS)

Nous allons utiliser le protocole SCP (Secure Copy Protocol) pour copier directement le tarball sur notre machine virtuelle sans accès sortant, mais qui autorise l'Ingress. Cette procédure est présentée à titre de démonstration uniquement. Avant toute mise en œuvre réelle, vérifiez toujours les politiques de sécurité et les protocoles officiels de transfert de votre entreprise pour les environnements air-gapped.

Vérifier que l'image n'est pas mise en cache

Avant de transférer le fichier, nous allons supprimer les images Docker liées à la détection des secrets présentes sur notre instance GitLab afin d'éliminer toute version mise en cache :


$ docker images

REPOSITORY
TAG              IMAGE ID       CREATED        SIZE

registry.gitlab.com/security-products/secrets
6                0235ed43fc7f   9 hours ago    84.8MB

registry.gitlab.com/security-products/secrets
<none>           16d88433af61   17 hours ago   74.9MB


$ docker image rmi 16d88433af61 -f

Untagged:
registry.gitlab.com/security-products/secrets@sha256:f331da6631d791fcd58d3f23d868475a520f50b02d64000e2faf1def66c75d48

Deleted:
sha256:16d88433af618f0b405945031de39fe40b3e8ef1bddb91ca036de0f5b32399d7

Deleted:
sha256:1bb06f72f06810e95a70039e797481736e492201f51a03b02d27db055248ab6f

Deleted:
sha256:a5ef2325ce4be9b39993ce301f8ed7aad1c854d7ee66f26a56a96967c6606510

Deleted:
sha256:f7cdac818a36d6c023763b76a6589c0db7609ca883306af4f38b819e62f29471

Deleted:
sha256:5eabf4d47287dee9887b9692d55c8b5f848b50b3b7248f67913036014e74a0e9

Deleted:
sha256:51b7cb600604c0737356f17bc02c22bac3a63697f0bf95ba7bacb5b421fdb7da

Deleted:
sha256:1546193b011d192aa769a15d3fdd55eb4e187f201f5ff7506243abb02525dc06

Deleted:
sha256:1ea72408d0484c3059cc0008539e6f494dc829caa1a97d156795687d42d9cb57

Deleted:
sha256:1313ee9da7716d85f63cfdd1129f715e9bbb6c9c0306e4708ee73672b3e40f26

Deleted:
sha256:954ebfd83406f0dfed93eb5157ba841af5426aa95d4054174fff45095fd873a1


$ docker image rmi 0235ed43fc7f -f

Untagged: registry.gitlab.com/security-products/secrets:6

Deleted:
sha256:0235ed43fc7fb2852c76e2d6196601968ae0375c72a517bef714cd712600f894

Deleted:
sha256:f05f85850cf4fac79e279d93afb6645c026de0223d07b396fce86c2f76096c1f

Deleted:
sha256:7432b0766b885144990edd3166fbabed081be71d28d186f4d525e52729f06b1f

Deleted:
sha256:2c6e3361c2ee2f43bd75fb9c7c12d981ce06df2d51a134965fa47754760efff0

Deleted:
sha256:7ad7f7245b45fbe758ebd5788e0ba268a56829715527a9a4bc51708c21af1c7f

Deleted:
sha256:3b73a621115a59564979f41552181dce07f3baa17e27428f7fff2155042a1901

Deleted:
sha256:78648c2606a7c4c76885806ed976b13e4d008940bd3d7a18b52948a6be71b60d

Deleted:
sha256:383d4a6dc5be9914878700809b4a3925379c80ab792dfe9e79d14b0c1d6b5fad

Ensuite, nous allons relancer le job pour afficher l'erreur :

GitLab Runner sans accès Internet qui ne parvient pas à effectuer le pull d'une image depuis le
cache
du registre

GitLab Runner sans accès Internet qui ne parvient pas à effectuer le pull d'une image depuis le cache du registre interne

Transférer le fichier SCP vers l'instance GitLab

Depuis notre ordinateur local, nous allons transférer le fichier vers notre instance GitLab à l'aide du protocole SCP, comme suit :


$ gcloud compute scp secret-detection.tar INSTANCE:~ --zone=ZONE

secret-detection.tar
100%   81MB  21.5MB/s   00:03

Charger les images transférées dans le registre de conteneurs hors ligne

Ensuite, nous allons nous connecter à notre MV via SSH et charger l'image Docker :


$ gcloud compute ssh INSTANCE --zone=ZONE


$ sudo docker load -i secret-detection.tar

c3c8e454c212: Loading layer
[==================================================>]  2.521MB/2.521MB

51e93afaeedc: Loading layer
[==================================================>]  32.55MB/32.55MB

e8a25e39bb30: Loading layer
[==================================================>]  221.2kB/221.2kB

390704968493: Loading layer
[==================================================>]  225.8kB/225.8kB

76cf57e75f63: Loading layer
[==================================================>]  17.64MB/17.64MB

c4c7a681fd10: Loading layer
[==================================================>]  4.608kB/4.608kB

f0690f406157: Loading layer
[==================================================>]  24.01MB/24.01MB

Loaded image: registry.gitlab.com/security-products/secrets:6

Exécuter les scanners

Nous allons relancer le pipeline manuellement afin que le scanner fasse l'objet d'un pull depuis le cache. Une fois l'exécution du pipeline terminée, vous constatez que le job de détection des secrets n'émet plus d'erreur :

GitLab Runner sans accès Internet qui effectue correctement un pull depuis
le cache du registre interne après le chargement de
l'image

GitLab Runner sans accès Internet qui effectue correctement un pull depuis le cache du registre interne après le chargement de l'image



Si vous souhaitez effectuer un pull de l'image depuis un autre emplacement ou utiliser un autre système de tags pour vos images, vous pouvez modifier la configuration comme suit :


include:
  - template: Jobs/Secret-Detection.gitlab-ci.yml

variables:
  SECURE_ANALYZERS_PREFIX: "localhost:5000/analyzers"

Pour en savoir plus, consultez la documentation sur les environnements hors ligne.

Afficher les résultats du scanner

Une fois que le scanner a terminé son analyse sur la branche par défaut, il génère automatiquement un rapport de vulnérabilités qui présente l'ensemble des problèmes identifiés.

Pour accéder à ce rapport, ouvrez l'onglet latéral et sélectionnez Sécurisation > Rapport de vulnérabilités :

Rapport de vulnérabilités GitLab avec les résultats
de la détection des secrets

Rapport de vulnérabilités GitLab avec les résultats de la détection des secrets



Le rapport de vulnérabilités du projet fournit :

  • Le nombre total de vulnérabilités par niveau de gravité

  • Des filtres pour les attributs de vulnérabilité les plus courants

  • Les détails de chaque vulnérabilité, présentés sous forme de tableau

  • Un horodatage indiquant la dernière mise à jour, y compris un lien vers le dernier pipeline

Dans notre exemple, le scanner de détection de secrets a détecté deux vulnérabilités. En cliquant sur l'une d'elles, nous accédons à sa page dédiée :

Page de vulnérabilité GitLab avec des
informations clés

Page de vulnérabilité GitLab avec des informations clés



La page consacrée aux vulnérabilités fournit des informations clés qui permettent de les trier et d'identifier les mesures correctives à appliquer, à savoir :

  • Sa description

  • La date de détection

  • Son statut actuel

  • Les actions disponibles pour y remédier

  • Les tickets liés à cette vulnérabilité

  • Le log des actions effectuées sur cette vulnérabilité

  • Le nom du fichier et le numéro de ligne de la vulnérabilité (si disponible)

  • Sa gravité

En savoir plus

Pour en savoir plus sur GitLab et l'exécution de scanners de sécurité dans des environments air-gapped, consultez les ressources suivantes :

→ Essayez GitLab Ultimate et GitLab Duo Enterprise gratuitement.

Votre avis nous intéresse

Cet article de blog vous a plu ou vous avez des questions ou des commentaires ? Partagez vos réflexions en créant un sujet dans le forum de la communauté GitLab.
Share your feedback

Plus de 50 % des entreprises du classement Fortune 100 font confiance à GitLab

Commencez à livrer des logiciels de meilleurs qualité plus rapidement

Découvrez comment la plateforme DevSecOps intelligente

peut aider votre équipe.