Date de la publication : 4 novembre 2025
Lecture : 11 min
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.
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 :

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 :

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 :

L'exécution des scanners de sécurité dans un environnement air-gapped nécessite les éléments suivants :
Un cluster GitLab Self-Managed
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.
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 :
Télécharger et empaqueter les images de conteneurs depuis l'Internet public.
Transférer les images vers l'environnement hors ligne.
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.
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.
$ 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
$ 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é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.
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 :

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

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

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 :

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