[{"data":1,"prerenderedAt":2556},["ShallowReactive",2],{"/de-de/blog/tutorial-security-scanning-in-air-gapped-environments":3,"navigation-de-de":1773,"banner-de-de":2204,"footer-de-de":2212,"blog-post-authors-de-de-Fernando Diaz":2453,"blog-related-posts-de-de-tutorial-security-scanning-in-air-gapped-environments":2468,"blog-promotions-de-de":2493,"next-steps-de-de":2546},{"id":4,"title":5,"authors":6,"body":8,"category":1750,"date":1751,"description":1752,"extension":1753,"externalUrl":1754,"faq":1754,"featured":421,"heroImage":1755,"meta":1756,"navigation":421,"path":1757,"seo":1758,"slug":1764,"stem":1765,"tags":1766,"template":1771,"updatedDate":1754,"__hash__":1772},"blogPosts/de-de/blog/tutorial-security-scanning-in-air-gapped-environments.md","Security-Scanning in Air-Gapped-Umgebungen mit GitLab",[7],"Fernando Diaz",{"type":9,"value":10,"toc":1733},"minimark",[11,15,50,55,58,61,65,68,91,155,159,162,201,204,211,217,223,230,236,240,246,257,263,267,273,276,280,283,294,297,301,304,316,321,324,542,548,637,643,647,650,655,882,887,962,978,982,985,999,1006,1011,1014,1280,1286,1292,1296,1300,1303,1344,1348,1351,1489,1493,1496,1502,1506,1510,1513,1555,1570,1574,1580,1586,1590,1596,1599,1613,1616,1622,1626,1632,1635,1661,1665,1668,1671,1729],[12,13,14],"p",{},"Air-Gapped-Umgebungen (luftspaltgesicherte Systeme) sind Computer-Netzwerke oder Systeme, die physisch von unsicheren Netzwerken isoliert sind – beispielsweise vom öffentlichen Internet oder unsicheren lokalen Netzwerken. Diese Isolation dient als Sicherheitsmaßnahme zum Schutz sensibler Daten und kritischer Systeme vor externen Cyberbedrohungen:",[16,17,18,26,32,38,44],"ul",{},[19,20,21,25],"li",{},[22,23,24],"strong",{},"Erhöhte Sicherheit:"," Durch physische Isolation von externen Netzwerken verhindern Air-Gapped-Umgebungen Remote-Angriffe, Malware-Infektionen und unbefugten Datenzugriff – entscheidend für hochsensible Daten und kritische Systeme.",[19,27,28,31],{},[22,29,30],{},"Datenschutz:"," Air-Gapping bietet den stärksten Schutz gegen Datenexfiltration, da keine direkte Verbindung existiert, die Angreifer zum Datendiebstahl nutzen können.",[19,33,34,37],{},[22,35,36],{},"Schutz kritischer Infrastrukturen:"," Für Systeme, die vitale Infrastruktur steuern (beispielsweise Kraftwerke, Wasseraufbereitungsanlagen oder militärische Systeme), verhindert Air-Gapping potenziell katastrophale Cyberangriffe.",[19,39,40,43],{},[22,41,42],{},"Compliance-Anforderungen:"," Viele regulatorische Frameworks verlangen Air-Gapping für bestimmte Arten sensibler Daten oder kritischer Systeme, insbesondere in Behörden, Gesundheitswesen und Finanzsektor.",[19,45,46,49],{},[22,47,48],{},"Malware-Schutz:"," Ohne Netzwerkverbindung sind Systeme vor netzwerkbasierten Malware-Infektionen und Ransomware-Angriffen geschützt.",[51,52,54],"h2",{"id":53},"für-deutsche-unternehmen-könnte-dies-folgende-themen-betreffen","Für deutsche Unternehmen könnte dies folgende Themen betreffen:",[12,56,57],{},"Teams, die Security-Scanning in isolierten Umgebungen implementieren, adressieren möglicherweise auch regulatorische Anforderungen – beispielsweise in Bereichen wie Schwachstellenmanagement und kritische Infrastruktur.",[12,59,60],{},"Regulatorische Frameworks wie NIS2, ISO 27001 und BSI IT-Grundschutz behandeln ähnliche Air-Gapped-Security-Themen. Für konkrete Compliance-Anforderungen empfiehlt sich Rücksprache mit entsprechender Fachberatung.",[51,62,64],{"id":63},"gitlab-security-scanner-für-air-gapped-umgebungen","GitLab Security-Scanner für Air-Gapped-Umgebungen",[12,66,67],{},"GitLab bietet verschiedene Security-Scanner für den gesamten Application-Lifecycle. Die folgenden Scanner unterstützen Air-Gapped-Umgebungen:",[16,69,70,73,76,79,82,85,88],{},[19,71,72],{},"Static Application Security Testing (SAST)",[19,74,75],{},"Dynamic Application Security Testing (DAST)",[19,77,78],{},"Secret Detection",[19,80,81],{},"Container Scanning",[19,83,84],{},"Dependency Scanning",[19,86,87],{},"API Fuzzing",[19,89,90],{},"License Scanning",[92,93,94,103],"blockquote",{},[12,95,96,99,102],{},[22,97,98],{},"📖 Scanner-Dokumentation",[100,101],"br",{},"\nDetaillierte Konfigurationsanleitungen für jeden Scanner finden sich in der GitLab-Dokumentation (englischsprachig):",[16,104,105,113,120,127,134,141,148],{},[19,106,107],{},[108,109,112],"a",{"href":110,"rel":111},"https://docs.gitlab.com/user/application_security/sast/#running-sast-in-an-offline-environment",[],"SAST Offline Configuration",[19,114,115],{},[108,116,119],{"href":117,"rel":118},"https://docs.gitlab.com/user/application_security/dast/browser/configuration/offline_configuration/",[],"DAST Offline Configuration",[19,121,122],{},[108,123,126],{"href":124,"rel":125},"https://docs.gitlab.com/user/application_security/secret_detection/pipeline/#offline-configuration",[],"Secret Detection Offline",[19,128,129],{},[108,130,133],{"href":131,"rel":132},"https://docs.gitlab.com/user/application_security/container_scanning/#running-container-scanning-in-an-offline-environment",[],"Container Scanning Offline",[19,135,136],{},[108,137,140],{"href":138,"rel":139},"https://docs.gitlab.com/user/application_security/dependency_scanning/#offline-environment",[],"Dependency Scanning Offline",[19,142,143],{},[108,144,147],{"href":145,"rel":146},"https://docs.gitlab.com/user/application_security/api_fuzzing/configuration/offline_configuration/",[],"API Fuzzing Offline",[19,149,150],{},[108,151,154],{"href":152,"rel":153},"https://docs.gitlab.com/user/compliance/license_scanning_of_cyclonedx_files/#running-in-an-offline-environment",[],"License Scanning Offline",[51,156,158],{"id":157},"problem-standard-deployment-funktioniert-offline-nicht","Problem: Standard-Deployment funktioniert offline nicht",[12,160,161],{},"Standardmäßig laden GitLab Self-Managed-Instanzen Security-Scanner-Images aus der öffentlichen GitLab Container Registry (registry.gitlab.com) und speichern diese in der integrierten lokalen GitLab Container Registry. Der folgende Workflow demonstriert dies anhand einer Pipeline, die auf einem Sample-Projekt nach Secrets scannt:",[163,164,169],"pre",{"className":165,"code":166,"language":167,"meta":168,"style":168},"language-yaml shiki shiki-themes github-light","    include:\n      - template: Jobs/Secret-Detection.gitlab-ci.yml\n","yaml","",[170,171,172,185],"code",{"__ignoreMap":168},[173,174,177,181],"span",{"class":175,"line":176},"line",1,[173,178,180],{"class":179},"shJU0","    include",[173,182,184],{"class":183},"sgsFI",":\n",[173,186,188,191,194,197],{"class":175,"line":187},2,[173,189,190],{"class":183},"      - ",[173,192,193],{"class":179},"template",[173,195,196],{"class":183},": ",[173,198,200],{"class":199},"sYBdl","Jobs/Secret-Detection.gitlab-ci.yml\n",[12,202,203],{},"Bei Ausführung in einer internetverbundenen GitLab-Instanz ist der Job erfolgreich:",[12,205,206],{},[207,208],"img",{"alt":209,"src":210},"GitLab Runner mit Internet-Zugriff lädt erfolgreich aus externer Registry","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750099328/Blog/Content%20Images/Blog/Content%20Images/pass-1_aHR0cHM6_1750099328577.png",[212,213,214],"center",{},[215,216,209],"i",{},[12,218,219,221],{},[100,220],{},[100,222],{},[12,224,225,226,229],{},"Wenn jedoch der Internet-Zugriff zur VM mit GitLab deaktiviert wird, schlägt der ",[170,227,228],{},"secret-detection","-Job fehl, da das Container-Image nicht heruntergeladen werden kann:",[12,231,232],{},[207,233],{"alt":234,"src":235},"GitLab Runner ohne Internet-Zugriff kann nicht aus externer Registry laden","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750099328/Blog/Content%20Images/Blog/Content%20Images/fail-1_aHR0cHM6_1750099328577.png",[212,237,238],{},[215,239,234],{},[12,241,242,244],{},[100,243],{},[100,245],{},[12,247,248,249,252,253,256],{},"Die Cache-Strategie bietet eine Teillösung: Bei Pull-Image-Policy ",[170,250,251],{},"if-not-present"," statt ",[170,254,255],{},"always"," lässt sich die gecachte Scanner-Version laden, falls diese zuvor bei Internet-Zugriff ausgeführt wurde:",[12,258,259],{},[207,260],{"alt":261,"src":262},"GitLab Runner ohne Internet-Zugriff lädt erfolgreich aus internem Registry-Cache","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750099329/Blog/Content%20Images/Blog/Content%20Images/pass-2_aHR0cHM6_1750099328579.png",[212,264,265],{},[215,266,261],{},[12,268,269,271],{},[100,270],{},[100,272],{},[12,274,275],{},"Diese Cache-Strategie ist jedoch nicht systematisch reproduzierbar für echte Air-Gapped-Umgebungen. Die folgende Lösung zeigt den vollständigen Offline-Deployment-Workflow.",[51,277,279],{"id":278},"voraussetzungen-für-offline-scanning","Voraussetzungen für Offline-Scanning",[12,281,282],{},"Die Ausführung von Security-Scannern in Air-Gapped-Umgebungen erfordert:",[16,284,285,288,291],{},[19,286,287],{},"GitLab Ultimate Subscription",[19,289,290],{},"Offline Cloud License",[19,292,293],{},"GitLab Self-Managed Cluster",[12,295,296],{},"Dieses Tutorial lässt sich in jeder GitLab Self-Managed EE-Instanz nachvollziehen (auch solchen, die nicht luftspaltgesichert sind), um Image-Transfer und -Ausführung in Air-Gapped-Umgebungen zu erlernen.",[51,298,300],{"id":299},"lösung-systematischer-offline-scanner-deployment","Lösung: Systematischer Offline-Scanner-Deployment",[12,302,303],{},"Der Prozess zum Laden von Security-Scannern in Air-Gapped-Umgebungen umfasst drei Schritte:",[305,306,307,310,313],"ol",{},[19,308,309],{},"Container-Images aus öffentlichem Internet herunterladen und paketieren",[19,311,312],{},"Images in Offline-Umgebung transferieren",[19,314,315],{},"Transferierte Images in Offline-Container-Registry laden",[317,318,320],"h3",{"id":319},"schritt-1-air-gapped-testumgebung-erstellen","Schritt 1: Air-Gapped-Testumgebung erstellen",[12,322,323],{},"Für dieses Tutorial wird eine GitLab-EE-Instanz in einer Google Compute VM verwendet, bei der durch Firewall-Regeln der gesamte ausgehende Internet-Traffic blockiert wird:",[163,325,329],{"className":326,"code":327,"language":328,"meta":168,"style":168},"language-bash shiki shiki-themes github-light","    # Egress-Firewall-Regel zum Blockieren allen ausgehenden Internet-Traffics\n    $ gcloud compute firewall-rules create deny-internet-egress \\\n        --direction=EGRESS \\\n        --priority=1000 \\\n        --network=default \\\n        --action=DENY \\\n        --rules=all \\\n        --destination-ranges=0.0.0.0/0 \\\n        --target-tags=no-internet\n\n    # Allow-Regel für internen Traffic mit höherer Priorität\n    $ gcloud compute firewall-rules create allow-internal-egress \\\n        --direction=EGRESS \\\n        --priority=900 \\\n        --network=default \\\n        --action=ALLOW \\\n        --rules=all \\\n        --destination-ranges=10.0.0.0/8,192.168.0.0/16,172.16.0.0/12 \\\n        --target-tags=no-internet\n\n    # Tag auf VM anwenden\n    $ gcloud compute instances add-tags YOUR_VM_NAME \\\n        --zone=YOUR_ZONE \\\n        --tags=no-internet\n","bash",[170,330,331,337,362,370,378,386,394,402,410,416,423,429,447,454,462,469,477,484,492,497,502,508,528,536],{"__ignoreMap":168},[173,332,333],{"class":175,"line":176},[173,334,336],{"class":335},"sAwPA","    # Egress-Firewall-Regel zum Blockieren allen ausgehenden Internet-Traffics\n",[173,338,339,343,346,349,352,355,358],{"class":175,"line":187},[173,340,342],{"class":341},"s7eDp","    $",[173,344,345],{"class":199}," gcloud",[173,347,348],{"class":199}," compute",[173,350,351],{"class":199}," firewall-rules",[173,353,354],{"class":199}," create",[173,356,357],{"class":199}," deny-internet-egress",[173,359,361],{"class":360},"sYu0t"," \\\n",[173,363,365,368],{"class":175,"line":364},3,[173,366,367],{"class":360},"        --direction=EGRESS",[173,369,361],{"class":360},[173,371,373,376],{"class":175,"line":372},4,[173,374,375],{"class":360},"        --priority=1000",[173,377,361],{"class":360},[173,379,381,384],{"class":175,"line":380},5,[173,382,383],{"class":360},"        --network=default",[173,385,361],{"class":360},[173,387,389,392],{"class":175,"line":388},6,[173,390,391],{"class":360},"        --action=DENY",[173,393,361],{"class":360},[173,395,397,400],{"class":175,"line":396},7,[173,398,399],{"class":360},"        --rules=all",[173,401,361],{"class":360},[173,403,405,408],{"class":175,"line":404},8,[173,406,407],{"class":360},"        --destination-ranges=0.0.0.0/0",[173,409,361],{"class":360},[173,411,413],{"class":175,"line":412},9,[173,414,415],{"class":360},"        --target-tags=no-internet\n",[173,417,419],{"class":175,"line":418},10,[173,420,422],{"emptyLinePlaceholder":421},true,"\n",[173,424,426],{"class":175,"line":425},11,[173,427,428],{"class":335},"    # Allow-Regel für internen Traffic mit höherer Priorität\n",[173,430,432,434,436,438,440,442,445],{"class":175,"line":431},12,[173,433,342],{"class":341},[173,435,345],{"class":199},[173,437,348],{"class":199},[173,439,351],{"class":199},[173,441,354],{"class":199},[173,443,444],{"class":199}," allow-internal-egress",[173,446,361],{"class":360},[173,448,450,452],{"class":175,"line":449},13,[173,451,367],{"class":360},[173,453,361],{"class":360},[173,455,457,460],{"class":175,"line":456},14,[173,458,459],{"class":360},"        --priority=900",[173,461,361],{"class":360},[173,463,465,467],{"class":175,"line":464},15,[173,466,383],{"class":360},[173,468,361],{"class":360},[173,470,472,475],{"class":175,"line":471},16,[173,473,474],{"class":360},"        --action=ALLOW",[173,476,361],{"class":360},[173,478,480,482],{"class":175,"line":479},17,[173,481,399],{"class":360},[173,483,361],{"class":360},[173,485,487,490],{"class":175,"line":486},18,[173,488,489],{"class":360},"        --destination-ranges=10.0.0.0/8,192.168.0.0/16,172.16.0.0/12",[173,491,361],{"class":360},[173,493,495],{"class":175,"line":494},19,[173,496,415],{"class":360},[173,498,500],{"class":175,"line":499},20,[173,501,422],{"emptyLinePlaceholder":421},[173,503,505],{"class":175,"line":504},21,[173,506,507],{"class":335},"    # Tag auf VM anwenden\n",[173,509,511,513,515,517,520,523,526],{"class":175,"line":510},22,[173,512,342],{"class":341},[173,514,345],{"class":199},[173,516,348],{"class":199},[173,518,519],{"class":199}," instances",[173,521,522],{"class":199}," add-tags",[173,524,525],{"class":199}," YOUR_VM_NAME",[173,527,361],{"class":360},[173,529,531,534],{"class":175,"line":530},23,[173,532,533],{"class":360},"        --zone=YOUR_ZONE",[173,535,361],{"class":360},[173,537,539],{"class":175,"line":538},24,[173,540,541],{"class":360},"        --tags=no-internet\n",[12,543,544,547],{},[22,545,546],{},"Validierung der Isolation:"," Nach SSH-Verbindung zur VM lässt sich verifizieren, dass keine Verbindung zu registry.gitlab.com möglich ist:",[163,549,551],{"className":326,"code":550,"language":328,"meta":168,"style":168},"    # Nachweis: Kein Zugriff auf GitLab Container Registry\n    $ ping registry.gitlab.com\n    PING registry.gitlab.com (35.227.35.254) 56(84) bytes of data.\n    ^C\n    --- registry.gitlab.com ping statistics ---\n    3 packets transmitted, 0 received, 100% packet loss, time 2031ms\n",[170,552,553,558,568,585,590,605],{"__ignoreMap":168},[173,554,555],{"class":175,"line":176},[173,556,557],{"class":335},"    # Nachweis: Kein Zugriff auf GitLab Container Registry\n",[173,559,560,562,565],{"class":175,"line":187},[173,561,342],{"class":341},[173,563,564],{"class":199}," ping",[173,566,567],{"class":199}," registry.gitlab.com\n",[173,569,570,573,576,579,582],{"class":175,"line":364},[173,571,572],{"class":341},"    PING",[173,574,575],{"class":199}," registry.gitlab.com",[173,577,578],{"class":183}," (35.227.35.254) 56(",[173,580,581],{"class":341},"84",[173,583,584],{"class":183},") bytes of data.\n",[173,586,587],{"class":175,"line":372},[173,588,589],{"class":341},"    ^C\n",[173,591,592,595,597,599,602],{"class":175,"line":380},[173,593,594],{"class":341},"    ---",[173,596,575],{"class":199},[173,598,564],{"class":199},[173,600,601],{"class":199}," statistics",[173,603,604],{"class":360}," ---\n",[173,606,607,610,613,616,619,622,625,628,631,634],{"class":175,"line":388},[173,608,609],{"class":341},"    3",[173,611,612],{"class":199}," packets",[173,614,615],{"class":199}," transmitted,",[173,617,618],{"class":360}," 0",[173,620,621],{"class":199}," received,",[173,623,624],{"class":199}," 100%",[173,626,627],{"class":199}," packet",[173,629,630],{"class":199}," loss,",[173,632,633],{"class":199}," time",[173,635,636],{"class":199}," 2031ms\n",[12,638,639,642],{},[22,640,641],{},"Hinweis:"," Ingress ist weiterhin erlaubt, um Dateien zu kopieren und per SSH auf die Maschine zuzugreifen.",[317,644,646],{"id":645},"schritt-2-container-images-herunterladen-und-paketieren","Schritt 2: Container-Images herunterladen und paketieren",[12,648,649],{},"In einer separaten Umgebung mit Internet-Zugang wird das Container-Image für Secret Detection heruntergeladen. Für dieses Beispiel wird Podman Desktop verwendet, alternativ lassen sich Docker Desktop oder andere Tools nutzen.",[12,651,652],{},[22,653,654],{},"Container-Image pullen:",[163,656,658],{"className":326,"code":657,"language":328,"meta":168,"style":168},"    $ podman pull registry.gitlab.com/security-products/secrets:6\n    Trying to pull registry.gitlab.com/security-products/secrets:6...\n    Getting image source signatures\n    Copying blob sha256:999745130ac045f2b1c29ecce088b43fc4a95bbb82b7960fb7b8abe0e3801bf8\n    Copying blob sha256:a4f7c013bb259c146cd8455b7c3943df7ed84b157e42a2348eef16546d8179b1\n    Copying blob sha256:1f3e46996e2966e4faa5846e56e76e3748b7315e2ded61476c24403d592134f0\n    Copying blob sha256:400a41f248eb3c870bd2b07073632c49f1e164c8efad56ea3b24098a657ec625\n    Copying blob sha256:9090f17a5a1bb80bcc6f393b0715210568dd0a7749286e3334a1a08fb32d34e6\n    Copying blob sha256:c7569783959081164164780f6c1b0bbe1271ee8d291d3e07b2749ae741621ea3\n    Copying blob sha256:20c7ca6108f808ad5905f6db4f7e3c02b21b69abdea8b45abfa34c0a2ba8bdb5\n    Copying blob sha256:e8645a00be64d77c6ff301593ce34cd8c17ffb2b36252ca0f2588009a7918d2e\n    Copying config sha256:0235ed43fc7fb2852c76e2d6196601968ae0375c72a517bef714cd712600f894\n    Writing manifest to image destination\n    WARNING: image platform (linux/amd64) does not match the expected platform (linux/arm64)\n    0235ed43fc7fb2852c76e2d6196601968ae0375c72a517bef714cd712600f894\n\n    $ podman images\n    REPOSITORY                                                  TAG     IMAGE ID      CREATED      SIZE\n    registry.gitlab.com/security-products/secrets               6       0235ed43fc7f  4 hours ago  85.3 MB\n",[170,659,660,673,686,700,711,720,729,738,747,756,765,774,784,799,818,823,827,836,856],{"__ignoreMap":168},[173,661,662,664,667,670],{"class":175,"line":176},[173,663,342],{"class":341},[173,665,666],{"class":199}," podman",[173,668,669],{"class":199}," pull",[173,671,672],{"class":199}," registry.gitlab.com/security-products/secrets:6\n",[173,674,675,678,681,683],{"class":175,"line":187},[173,676,677],{"class":341},"    Trying",[173,679,680],{"class":199}," to",[173,682,669],{"class":199},[173,684,685],{"class":199}," registry.gitlab.com/security-products/secrets:6...\n",[173,687,688,691,694,697],{"class":175,"line":364},[173,689,690],{"class":341},"    Getting",[173,692,693],{"class":199}," image",[173,695,696],{"class":199}," source",[173,698,699],{"class":199}," signatures\n",[173,701,702,705,708],{"class":175,"line":372},[173,703,704],{"class":341},"    Copying",[173,706,707],{"class":199}," blob",[173,709,710],{"class":199}," sha256:999745130ac045f2b1c29ecce088b43fc4a95bbb82b7960fb7b8abe0e3801bf8\n",[173,712,713,715,717],{"class":175,"line":380},[173,714,704],{"class":341},[173,716,707],{"class":199},[173,718,719],{"class":199}," sha256:a4f7c013bb259c146cd8455b7c3943df7ed84b157e42a2348eef16546d8179b1\n",[173,721,722,724,726],{"class":175,"line":388},[173,723,704],{"class":341},[173,725,707],{"class":199},[173,727,728],{"class":199}," sha256:1f3e46996e2966e4faa5846e56e76e3748b7315e2ded61476c24403d592134f0\n",[173,730,731,733,735],{"class":175,"line":396},[173,732,704],{"class":341},[173,734,707],{"class":199},[173,736,737],{"class":199}," sha256:400a41f248eb3c870bd2b07073632c49f1e164c8efad56ea3b24098a657ec625\n",[173,739,740,742,744],{"class":175,"line":404},[173,741,704],{"class":341},[173,743,707],{"class":199},[173,745,746],{"class":199}," sha256:9090f17a5a1bb80bcc6f393b0715210568dd0a7749286e3334a1a08fb32d34e6\n",[173,748,749,751,753],{"class":175,"line":412},[173,750,704],{"class":341},[173,752,707],{"class":199},[173,754,755],{"class":199}," sha256:c7569783959081164164780f6c1b0bbe1271ee8d291d3e07b2749ae741621ea3\n",[173,757,758,760,762],{"class":175,"line":418},[173,759,704],{"class":341},[173,761,707],{"class":199},[173,763,764],{"class":199}," sha256:20c7ca6108f808ad5905f6db4f7e3c02b21b69abdea8b45abfa34c0a2ba8bdb5\n",[173,766,767,769,771],{"class":175,"line":425},[173,768,704],{"class":341},[173,770,707],{"class":199},[173,772,773],{"class":199}," sha256:e8645a00be64d77c6ff301593ce34cd8c17ffb2b36252ca0f2588009a7918d2e\n",[173,775,776,778,781],{"class":175,"line":431},[173,777,704],{"class":341},[173,779,780],{"class":199}," config",[173,782,783],{"class":199}," sha256:0235ed43fc7fb2852c76e2d6196601968ae0375c72a517bef714cd712600f894\n",[173,785,786,789,792,794,796],{"class":175,"line":449},[173,787,788],{"class":341},"    Writing",[173,790,791],{"class":199}," manifest",[173,793,680],{"class":199},[173,795,693],{"class":199},[173,797,798],{"class":199}," destination\n",[173,800,801,804,806,809,812,815],{"class":175,"line":456},[173,802,803],{"class":341},"    WARNING:",[173,805,693],{"class":199},[173,807,808],{"class":199}," platform",[173,810,811],{"class":183}," (linux/amd64) does not match the expected platform (",[173,813,814],{"class":341},"linux/arm64",[173,816,817],{"class":183},")\n",[173,819,820],{"class":175,"line":464},[173,821,822],{"class":341},"    0235ed43fc7fb2852c76e2d6196601968ae0375c72a517bef714cd712600f894\n",[173,824,825],{"class":175,"line":471},[173,826,422],{"emptyLinePlaceholder":421},[173,828,829,831,833],{"class":175,"line":479},[173,830,342],{"class":341},[173,832,666],{"class":199},[173,834,835],{"class":199}," images\n",[173,837,838,841,844,847,850,853],{"class":175,"line":486},[173,839,840],{"class":341},"    REPOSITORY",[173,842,843],{"class":199},"                                                  TAG",[173,845,846],{"class":199},"     IMAGE",[173,848,849],{"class":199}," ID",[173,851,852],{"class":199},"      CREATED",[173,854,855],{"class":199},"      SIZE\n",[173,857,858,861,864,867,870,873,876,879],{"class":175,"line":494},[173,859,860],{"class":341},"    registry.gitlab.com/security-products/secrets",[173,862,863],{"class":360},"               6",[173,865,866],{"class":199},"       0235ed43fc7f",[173,868,869],{"class":360},"  4",[173,871,872],{"class":199}," hours",[173,874,875],{"class":199}," ago",[173,877,878],{"class":360},"  85.3",[173,880,881],{"class":199}," MB\n",[12,883,884],{},[22,885,886],{},"Image als Tarball speichern:",[163,888,890],{"className":326,"code":889,"language":328,"meta":168,"style":168},"    $ podman save -o secret-detection.tar registry.gitlab.com/security-products/secrets:6\n    $ chmod +r secret-detection.tar\n    $ ls -al secret-detection.tar\n    -rw-r--r--@ 1 fern  staff  85324800 Jan 10 10:25 secret-detection.tar\n",[170,891,892,909,922,934],{"__ignoreMap":168},[173,893,894,896,898,901,904,907],{"class":175,"line":176},[173,895,342],{"class":341},[173,897,666],{"class":199},[173,899,900],{"class":199}," save",[173,902,903],{"class":360}," -o",[173,905,906],{"class":199}," secret-detection.tar",[173,908,672],{"class":199},[173,910,911,913,916,919],{"class":175,"line":187},[173,912,342],{"class":341},[173,914,915],{"class":199}," chmod",[173,917,918],{"class":199}," +r",[173,920,921],{"class":199}," secret-detection.tar\n",[173,923,924,926,929,932],{"class":175,"line":364},[173,925,342],{"class":341},[173,927,928],{"class":199}," ls",[173,930,931],{"class":360}," -al",[173,933,921],{"class":199},[173,935,936,939,942,945,948,951,954,957,960],{"class":175,"line":372},[173,937,938],{"class":341},"    -rw-r--r--@",[173,940,941],{"class":360}," 1",[173,943,944],{"class":199}," fern",[173,946,947],{"class":199},"  staff",[173,949,950],{"class":360},"  85324800",[173,952,953],{"class":199}," Jan",[173,955,956],{"class":360}," 10",[173,958,959],{"class":199}," 10:25",[173,961,921],{"class":199},[92,963,964],{},[12,965,966,969,971,972,977],{},[22,967,968],{},"Alternative Methode",[100,970],{},"\nDas offizielle GitLab-Template lässt sich in einer Umgebung mit Internet-Zugang verwenden, um Container-Images herunterzuladen und als Job-Artefakte zu speichern oder in die Container Registry des Projekts zu pushen. Details in der ",[108,973,976],{"href":974,"rel":975},"https://docs.gitlab.com/user/application_security/offline_deployments/#using-the-official-gitlab-template",[],"Offline Deployments Dokumentation",".",[317,979,981],{"id":980},"schritt-3-images-in-offline-umgebung-transferieren","Schritt 3: Images in Offline-Umgebung transferieren",[12,983,984],{},"Der Tarball-Transfer in die Air-Gapped-Umgebung lässt sich auf verschiedene Weisen durchführen:",[16,986,987,990,993,996],{},[19,988,989],{},"Physische Medien (USB, externe Festplatten)",[19,991,992],{},"Data Diodes (unidirektionale Netzwerkverbindungen)",[19,994,995],{},"Guard Systems (kontrollierte Transfer-Gateways)",[19,997,998],{},"Cross-Domain Solutions (CDS)",[12,1000,1001,1002,1005],{},"Für dieses Tutorial wird SCP (Secure Copy Protocol) verwendet, um das Tarball direkt auf die VM zu übertragen, die keinen Egress-Zugriff hat, aber Ingress erlaubt. ",[22,1003,1004],{},"Wichtig:"," In Produktionsumgebungen sollten die Sicherheitsrichtlinien und Transfer-Verfahren der eigenen Organisation für Air-Gapped-Umgebungen konsultiert werden.",[12,1007,1008],{},[22,1009,1010],{},"Cache-Status verifizieren:",[12,1012,1013],{},"Vor dem Transfer werden Docker-Images für Secret Detection auf der GitLab-Instanz gelöscht, um sicherzustellen, dass die Lösung ohne Cache funktioniert:",[163,1015,1017],{"className":326,"code":1016,"language":328,"meta":168,"style":168},"    $ docker images\n    REPOSITORY                                            TAG              IMAGE ID       CREATED        SIZE\n    registry.gitlab.com/security-products/secrets         6                0235ed43fc7f   9 hours ago    84.8MB\n    registry.gitlab.com/security-products/secrets         \u003Cnone>           16d88433af61   17 hours ago   74.9MB\n\n    $ docker image rmi 16d88433af61 -f\n    Untagged: registry.gitlab.com/security-products/secrets@sha256:f331da6631d791fcd58d3f23d868475a520f50b02d64000e2faf1def66c75d48\n    Deleted: sha256:16d88433af618f0b405945031de39fe40b3e8ef1bddb91ca036de0f5b32399d7\n    Deleted: sha256:1bb06f72f06810e95a70039e797481736e492201f51a03b02d27db055248ab6f\n    Deleted: sha256:a5ef2325ce4be9b39993ce301f8ed7aad1c854d7ee66f26a56a96967c6606510\n    Deleted: sha256:f7cdac818a36d6c023763b76a6589c0db7609ca883306af4f38b819e62f29471\n    Deleted: sha256:5eabf4d47287dee9887b9692d55c8b5f848b50b3b7248f67913036014e74a0e9\n    Deleted: sha256:51b7cb600604c0737356f17bc02c22bac3a63697f0bf95ba7bacb5b421fdb7da\n    Deleted: sha256:1546193b011d192aa769a15d3fdd55eb4e187f201f5ff7506243abb02525dc06\n    Deleted: sha256:1ea72408d0484c3059cc0008539e6f494dc829caa1a97d156795687d42d9cb57\n    Deleted: sha256:1313ee9da7716d85f63cfdd1129f715e9bbb6c9c0306e4708ee73672b3e40f26\n    Deleted: sha256:954ebfd83406f0dfed93eb5157ba841af5426aa95d4054174fff45095fd873a1\n\n    $ docker image rmi 0235ed43fc7f -f\n    Untagged: registry.gitlab.com/security-products/secrets:6\n    Deleted: sha256:0235ed43fc7fb2852c76e2d6196601968ae0375c72a517bef714cd712600f894\n    Deleted: sha256:f05f85850cf4fac79e279d93afb6645c026de0223d07b396fce86c2f76096c1f\n    Deleted: sha256:7432b0766b885144990edd3166fbabed081be71d28d186f4d525e52729f06b1f\n    Deleted: sha256:2c6e3361c2ee2f43bd75fb9c7c12d981ce06df2d51a134965fa47754760efff0\n    Deleted: sha256:7ad7f7245b45fbe758ebd5788e0ba268a56829715527a9a4bc51708c21af1c7f\n    Deleted: sha256:3b73a621115a59564979f41552181dce07f3baa17e27428f7fff2155042a1901\n    Deleted: sha256:78648c2606a7c4c76885806ed976b13e4d008940bd3d7a18b52948a6be71b60d\n    Deleted: sha256:383d4a6dc5be9914878700809b4a3925379c80ab792dfe9e79d14b0c1d6b5fad\n",[170,1018,1019,1028,1046,1066,1096,1100,1117,1125,1133,1140,1147,1154,1161,1168,1175,1182,1189,1196,1200,1215,1221,1227,1234,1241,1248,1256,1264,1272],{"__ignoreMap":168},[173,1020,1021,1023,1026],{"class":175,"line":176},[173,1022,342],{"class":341},[173,1024,1025],{"class":199}," docker",[173,1027,835],{"class":199},[173,1029,1030,1032,1035,1038,1040,1043],{"class":175,"line":187},[173,1031,840],{"class":341},[173,1033,1034],{"class":199},"                                            TAG",[173,1036,1037],{"class":199},"              IMAGE",[173,1039,849],{"class":199},[173,1041,1042],{"class":199},"       CREATED",[173,1044,1045],{"class":199},"        SIZE\n",[173,1047,1048,1050,1053,1056,1059,1061,1063],{"class":175,"line":364},[173,1049,860],{"class":341},[173,1051,1052],{"class":360},"         6",[173,1054,1055],{"class":199},"                0235ed43fc7f",[173,1057,1058],{"class":360},"   9",[173,1060,872],{"class":199},[173,1062,875],{"class":199},[173,1064,1065],{"class":199},"    84.8MB\n",[173,1067,1068,1070,1074,1077,1080,1083,1086,1089,1091,1093],{"class":175,"line":372},[173,1069,860],{"class":341},[173,1071,1073],{"class":1072},"sD7c4","         \u003C",[173,1075,1076],{"class":199},"non",[173,1078,1079],{"class":183},"e",[173,1081,1082],{"class":1072},">",[173,1084,1085],{"class":199},"           16d88433af61",[173,1087,1088],{"class":360},"   17",[173,1090,872],{"class":199},[173,1092,875],{"class":199},[173,1094,1095],{"class":199},"   74.9MB\n",[173,1097,1098],{"class":175,"line":380},[173,1099,422],{"emptyLinePlaceholder":421},[173,1101,1102,1104,1106,1108,1111,1114],{"class":175,"line":388},[173,1103,342],{"class":341},[173,1105,1025],{"class":199},[173,1107,693],{"class":199},[173,1109,1110],{"class":199}," rmi",[173,1112,1113],{"class":199}," 16d88433af61",[173,1115,1116],{"class":360}," -f\n",[173,1118,1119,1122],{"class":175,"line":396},[173,1120,1121],{"class":341},"    Untagged:",[173,1123,1124],{"class":199}," registry.gitlab.com/security-products/secrets@sha256:f331da6631d791fcd58d3f23d868475a520f50b02d64000e2faf1def66c75d48\n",[173,1126,1127,1130],{"class":175,"line":404},[173,1128,1129],{"class":341},"    Deleted:",[173,1131,1132],{"class":199}," sha256:16d88433af618f0b405945031de39fe40b3e8ef1bddb91ca036de0f5b32399d7\n",[173,1134,1135,1137],{"class":175,"line":412},[173,1136,1129],{"class":341},[173,1138,1139],{"class":199}," sha256:1bb06f72f06810e95a70039e797481736e492201f51a03b02d27db055248ab6f\n",[173,1141,1142,1144],{"class":175,"line":418},[173,1143,1129],{"class":341},[173,1145,1146],{"class":199}," sha256:a5ef2325ce4be9b39993ce301f8ed7aad1c854d7ee66f26a56a96967c6606510\n",[173,1148,1149,1151],{"class":175,"line":425},[173,1150,1129],{"class":341},[173,1152,1153],{"class":199}," sha256:f7cdac818a36d6c023763b76a6589c0db7609ca883306af4f38b819e62f29471\n",[173,1155,1156,1158],{"class":175,"line":431},[173,1157,1129],{"class":341},[173,1159,1160],{"class":199}," sha256:5eabf4d47287dee9887b9692d55c8b5f848b50b3b7248f67913036014e74a0e9\n",[173,1162,1163,1165],{"class":175,"line":449},[173,1164,1129],{"class":341},[173,1166,1167],{"class":199}," sha256:51b7cb600604c0737356f17bc02c22bac3a63697f0bf95ba7bacb5b421fdb7da\n",[173,1169,1170,1172],{"class":175,"line":456},[173,1171,1129],{"class":341},[173,1173,1174],{"class":199}," sha256:1546193b011d192aa769a15d3fdd55eb4e187f201f5ff7506243abb02525dc06\n",[173,1176,1177,1179],{"class":175,"line":464},[173,1178,1129],{"class":341},[173,1180,1181],{"class":199}," sha256:1ea72408d0484c3059cc0008539e6f494dc829caa1a97d156795687d42d9cb57\n",[173,1183,1184,1186],{"class":175,"line":471},[173,1185,1129],{"class":341},[173,1187,1188],{"class":199}," sha256:1313ee9da7716d85f63cfdd1129f715e9bbb6c9c0306e4708ee73672b3e40f26\n",[173,1190,1191,1193],{"class":175,"line":479},[173,1192,1129],{"class":341},[173,1194,1195],{"class":199}," sha256:954ebfd83406f0dfed93eb5157ba841af5426aa95d4054174fff45095fd873a1\n",[173,1197,1198],{"class":175,"line":486},[173,1199,422],{"emptyLinePlaceholder":421},[173,1201,1202,1204,1206,1208,1210,1213],{"class":175,"line":494},[173,1203,342],{"class":341},[173,1205,1025],{"class":199},[173,1207,693],{"class":199},[173,1209,1110],{"class":199},[173,1211,1212],{"class":199}," 0235ed43fc7f",[173,1214,1116],{"class":360},[173,1216,1217,1219],{"class":175,"line":499},[173,1218,1121],{"class":341},[173,1220,672],{"class":199},[173,1222,1223,1225],{"class":175,"line":504},[173,1224,1129],{"class":341},[173,1226,783],{"class":199},[173,1228,1229,1231],{"class":175,"line":510},[173,1230,1129],{"class":341},[173,1232,1233],{"class":199}," sha256:f05f85850cf4fac79e279d93afb6645c026de0223d07b396fce86c2f76096c1f\n",[173,1235,1236,1238],{"class":175,"line":530},[173,1237,1129],{"class":341},[173,1239,1240],{"class":199}," sha256:7432b0766b885144990edd3166fbabed081be71d28d186f4d525e52729f06b1f\n",[173,1242,1243,1245],{"class":175,"line":538},[173,1244,1129],{"class":341},[173,1246,1247],{"class":199}," sha256:2c6e3361c2ee2f43bd75fb9c7c12d981ce06df2d51a134965fa47754760efff0\n",[173,1249,1251,1253],{"class":175,"line":1250},25,[173,1252,1129],{"class":341},[173,1254,1255],{"class":199}," sha256:7ad7f7245b45fbe758ebd5788e0ba268a56829715527a9a4bc51708c21af1c7f\n",[173,1257,1259,1261],{"class":175,"line":1258},26,[173,1260,1129],{"class":341},[173,1262,1263],{"class":199}," sha256:3b73a621115a59564979f41552181dce07f3baa17e27428f7fff2155042a1901\n",[173,1265,1267,1269],{"class":175,"line":1266},27,[173,1268,1129],{"class":341},[173,1270,1271],{"class":199}," sha256:78648c2606a7c4c76885806ed976b13e4d008940bd3d7a18b52948a6be71b60d\n",[173,1273,1275,1277],{"class":175,"line":1274},28,[173,1276,1129],{"class":341},[173,1278,1279],{"class":199}," sha256:383d4a6dc5be9914878700809b4a3925379c80ab792dfe9e79d14b0c1d6b5fad\n",[12,1281,1282,1285],{},[22,1283,1284],{},"Problem demonstrieren:"," Der Job wird erneut ausgeführt, um den Fehler zu zeigen:",[12,1287,1288],{},[207,1289],{"alt":1290,"src":1291},"GitLab Runner ohne Internet-Zugriff schlägt beim Laden aus internem Registry-Cache fehl","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750099328/Blog/Content%20Images/Blog/Content%20Images/image2_aHR0cHM6_1750099328580.png",[212,1293,1294],{},[215,1295,1290],{},[317,1297,1299],{"id":1298},"schritt-4-tarball-auf-gitlab-instanz-übertragen","Schritt 4: Tarball auf GitLab-Instanz übertragen",[12,1301,1302],{},"Von der lokalen Maschine wird die Datei per SCP auf die GitLab-Instanz übertragen:",[163,1304,1306],{"className":326,"code":1305,"language":328,"meta":168,"style":168},"    $ gcloud compute scp secret-detection.tar INSTANCE:~ --zone=ZONE\n    secret-detection.tar                                  100%   81MB  21.5MB/s   00:03\n",[170,1307,1308,1327],{"__ignoreMap":168},[173,1309,1310,1312,1314,1316,1319,1321,1324],{"class":175,"line":176},[173,1311,342],{"class":341},[173,1313,345],{"class":199},[173,1315,348],{"class":199},[173,1317,1318],{"class":199}," scp",[173,1320,906],{"class":199},[173,1322,1323],{"class":199}," INSTANCE:~",[173,1325,1326],{"class":360}," --zone=ZONE\n",[173,1328,1329,1332,1335,1338,1341],{"class":175,"line":187},[173,1330,1331],{"class":341},"    secret-detection.tar",[173,1333,1334],{"class":199},"                                  100%",[173,1336,1337],{"class":199},"   81MB",[173,1339,1340],{"class":199},"  21.5MB/s",[173,1342,1343],{"class":199},"   00:03\n",[317,1345,1347],{"id":1346},"schritt-5-image-in-offline-container-registry-laden","Schritt 5: Image in Offline-Container-Registry laden",[12,1349,1350],{},"Per SSH auf die VM verbinden und das Docker-Image laden:",[163,1352,1354],{"className":326,"code":1353,"language":328,"meta":168,"style":168},"    $ gcloud compute ssh INSTANCE --zone=ZONE\n\n    $ sudo docker load -i secret-detection.tar\n    c3c8e454c212: Loading layer [==================================================>]  2.521MB/2.521MB\n    51e93afaeedc: Loading layer [==================================================>]  32.55MB/32.55MB\n    e8a25e39bb30: Loading layer [==================================================>]  221.2kB/221.2kB\n    390704968493: Loading layer [==================================================>]  225.8kB/225.8kB\n    76cf57e75f63: Loading layer [==================================================>]  17.64MB/17.64MB\n    c4c7a681fd10: Loading layer [==================================================>]  4.608kB/4.608kB\n    f0690f406157: Loading layer [==================================================>]  24.01MB/24.01MB\n    Loaded image: registry.gitlab.com/security-products/secrets:6\n",[170,1355,1356,1372,1376,1393,1407,1419,1431,1443,1455,1467,1479],{"__ignoreMap":168},[173,1357,1358,1360,1362,1364,1367,1370],{"class":175,"line":176},[173,1359,342],{"class":341},[173,1361,345],{"class":199},[173,1363,348],{"class":199},[173,1365,1366],{"class":199}," ssh",[173,1368,1369],{"class":199}," INSTANCE",[173,1371,1326],{"class":360},[173,1373,1374],{"class":175,"line":187},[173,1375,422],{"emptyLinePlaceholder":421},[173,1377,1378,1380,1383,1385,1388,1391],{"class":175,"line":364},[173,1379,342],{"class":341},[173,1381,1382],{"class":199}," sudo",[173,1384,1025],{"class":199},[173,1386,1387],{"class":199}," load",[173,1389,1390],{"class":360}," -i",[173,1392,921],{"class":199},[173,1394,1395,1398,1401,1404],{"class":175,"line":372},[173,1396,1397],{"class":341},"    c3c8e454c212:",[173,1399,1400],{"class":199}," Loading",[173,1402,1403],{"class":199}," layer",[173,1405,1406],{"class":183}," [==================================================>]  2.521MB/2.521MB\n",[173,1408,1409,1412,1414,1416],{"class":175,"line":380},[173,1410,1411],{"class":341},"    51e93afaeedc:",[173,1413,1400],{"class":199},[173,1415,1403],{"class":199},[173,1417,1418],{"class":183}," [==================================================>]  32.55MB/32.55MB\n",[173,1420,1421,1424,1426,1428],{"class":175,"line":388},[173,1422,1423],{"class":341},"    e8a25e39bb30:",[173,1425,1400],{"class":199},[173,1427,1403],{"class":199},[173,1429,1430],{"class":183}," [==================================================>]  221.2kB/221.2kB\n",[173,1432,1433,1436,1438,1440],{"class":175,"line":396},[173,1434,1435],{"class":341},"    390704968493:",[173,1437,1400],{"class":199},[173,1439,1403],{"class":199},[173,1441,1442],{"class":183}," [==================================================>]  225.8kB/225.8kB\n",[173,1444,1445,1448,1450,1452],{"class":175,"line":404},[173,1446,1447],{"class":341},"    76cf57e75f63:",[173,1449,1400],{"class":199},[173,1451,1403],{"class":199},[173,1453,1454],{"class":183}," [==================================================>]  17.64MB/17.64MB\n",[173,1456,1457,1460,1462,1464],{"class":175,"line":412},[173,1458,1459],{"class":341},"    c4c7a681fd10:",[173,1461,1400],{"class":199},[173,1463,1403],{"class":199},[173,1465,1466],{"class":183}," [==================================================>]  4.608kB/4.608kB\n",[173,1468,1469,1472,1474,1476],{"class":175,"line":418},[173,1470,1471],{"class":341},"    f0690f406157:",[173,1473,1400],{"class":199},[173,1475,1403],{"class":199},[173,1477,1478],{"class":183}," [==================================================>]  24.01MB/24.01MB\n",[173,1480,1481,1484,1487],{"class":175,"line":425},[173,1482,1483],{"class":341},"    Loaded",[173,1485,1486],{"class":199}," image:",[173,1488,672],{"class":199},[317,1490,1492],{"id":1491},"schritt-6-scanner-ausführen","Schritt 6: Scanner ausführen",[12,1494,1495],{},"Die Pipeline wird manuell erneut ausgeführt. Der Scanner wird aus dem Cache geladen, und nach Abschluss zeigt sich der erfolgreiche Secret-Detection-Job:",[12,1497,1498],{},[207,1499],{"alt":1500,"src":1501},"GitLab Runner ohne Internet-Zugriff lädt erfolgreich aus internem Registry-Cache nach Image-Loading","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750099328/Blog/Content%20Images/Blog/Content%20Images/image7_aHR0cHM6_1750099328581.png",[212,1503,1504],{},[215,1505,1500],{},[51,1507,1509],{"id":1508},"konfigurationsoptionen","Konfigurationsoptionen",[12,1511,1512],{},"Falls das Image von einem anderen Standort geladen oder Images anders getaggt werden sollen, lässt sich die Konfiguration anpassen:",[163,1514,1516],{"className":165,"code":1515,"language":167,"meta":168,"style":168},"    include:\n      - template: Jobs/Secret-Detection.gitlab-ci.yml\n\n    variables:\n      SECURE_ANALYZERS_PREFIX: \"localhost:5000/analyzers\"\n",[170,1517,1518,1524,1534,1538,1545],{"__ignoreMap":168},[173,1519,1520,1522],{"class":175,"line":176},[173,1521,180],{"class":179},[173,1523,184],{"class":183},[173,1525,1526,1528,1530,1532],{"class":175,"line":187},[173,1527,190],{"class":183},[173,1529,193],{"class":179},[173,1531,196],{"class":183},[173,1533,200],{"class":199},[173,1535,1536],{"class":175,"line":364},[173,1537,422],{"emptyLinePlaceholder":421},[173,1539,1540,1543],{"class":175,"line":372},[173,1541,1542],{"class":179},"    variables",[173,1544,184],{"class":183},[173,1546,1547,1550,1552],{"class":175,"line":380},[173,1548,1549],{"class":179},"      SECURE_ANALYZERS_PREFIX",[173,1551,196],{"class":183},[173,1553,1554],{"class":199},"\"localhost:5000/analyzers\"\n",[92,1556,1557],{},[12,1558,1559,1562,1564,1565],{},[22,1560,1561],{},"Weitere Konfigurationsdetails",[100,1563],{},"\nDie vollständige Offline-Environments-Dokumentation bietet zusätzliche Optionen: ",[108,1566,1569],{"href":1567,"rel":1568},"https://docs.gitlab.com/user/application_security/offline_deployments/",[],"Offline Deployments Guide",[51,1571,1573],{"id":1572},"scanner-ergebnisse-anzeigen","Scanner-Ergebnisse anzeigen",[12,1575,1576,1577],{},"Nach Abschluss des Scanners im Default-Branch wird der Vulnerability Report mit allen Findings befüllt. Der Zugriff erfolgt über die Seitenleiste: ",[22,1578,1579],{},"Secure > Vulnerability Report",[12,1581,1582],{},[207,1583],{"alt":1584,"src":1585},"GitLab Vulnerability Report mit Secret-Detection-Findings","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750099328/Blog/Content%20Images/Blog/Content%20Images/vulnerability_report_aHR0cHM6_1750099328581.png",[212,1587,1588],{},[215,1589,1584],{},[12,1591,1592,1594],{},[100,1593],{},[100,1595],{},[12,1597,1598],{},"Der Vulnerability Report bietet:",[16,1600,1601,1604,1607,1610],{},[19,1602,1603],{},"Gesamt-Vulnerabilities pro Severity-Level",[19,1605,1606],{},"Filter für gängige Vulnerability-Attribute",[19,1608,1609],{},"Details jeder Vulnerability im Tabellenformat",[19,1611,1612],{},"Zeitstempel der letzten Aktualisierung mit Link zur aktuellen Pipeline",[12,1614,1615],{},"Zwei Vulnerabilities wurden vom Secret-Detection-Scanner erkannt. Ein Klick auf eine Vulnerability öffnet die Vulnerability-Seite:",[12,1617,1618],{},[207,1619],{"alt":1620,"src":1621},"GitLab Vulnerability Page mit detaillierten Insights","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750099329/Blog/Content%20Images/Blog/Content%20Images/insights_aHR0cHM6_1750099328582.png",[212,1623,1624],{},[215,1625,1620],{},[12,1627,1628,1630],{},[100,1629],{},[100,1631],{},[12,1633,1634],{},"Die Vulnerability-Seite bietet Details für Triage und Remediation:",[16,1636,1637,1640,1643,1646,1649,1652,1655,1658],{},[19,1638,1639],{},"Description",[19,1641,1642],{},"Erkennungszeitpunkt",[19,1644,1645],{},"Aktueller Status",[19,1647,1648],{},"Verfügbare Aktionen",[19,1650,1651],{},"Verknüpfte Issues",[19,1653,1654],{},"Actions-Log",[19,1656,1657],{},"Dateiname und Zeilennummer (falls verfügbar)",[19,1659,1660],{},"Severity",[51,1662,1664],{"id":1663},"weitere-security-scanner-implementieren","Weitere Security-Scanner implementieren",[12,1666,1667],{},"Der in diesem Tutorial gezeigte Workflow lässt sich auf alle GitLab-Security-Scanner anwenden, die Air-Gapped-Umgebungen unterstützen. Jeder Scanner erfordert das Herunterladen des entsprechenden Container-Images, Transfer in die Offline-Umgebung und Loading in die lokale Registry.",[1669,1670],"hr",{},[92,1672,1673,1678,1681,1686,1702,1707],{},[12,1674,1675],{},[22,1676,1677],{},"📚 Weiterführende Ressourcen",[12,1679,1680],{},"Die folgenden GitLab-Ressourcen sind in englischer Sprache verfügbar:",[12,1682,1683],{},[22,1684,1685],{},"Produktinformationen:",[16,1687,1688,1695],{},[19,1689,1690],{},[108,1691,1694],{"href":1692,"rel":1693},"https://about.gitlab.com/pricing/ultimate/",[],"GitLab Ultimate",[19,1696,1697],{},[108,1698,1701],{"href":1699,"rel":1700},"https://about.gitlab.com/solutions/application-security-testing/",[],"Security and Compliance Solutions",[12,1703,1704],{},[22,1705,1706],{},"Technische Dokumentation:",[16,1708,1709,1714,1721],{},[19,1710,1711],{},[108,1712,1569],{"href":1567,"rel":1713},[],[19,1715,1716],{},[108,1717,1720],{"href":1718,"rel":1719},"https://docs.gitlab.com/user/application_security/",[],"Application Security Documentation",[19,1722,1723,1728],{},[108,1724,1727],{"href":1725,"rel":1726},"https://docs.gitlab.com/user/application_security/offline_deployments/#scanner-images",[],"Scanner-spezifische Offline-Konfigurationen"," (SAST, DAST, Container Scanning, etc.)",[1730,1731,1732],"style",{},"html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}",{"title":168,"searchDepth":187,"depth":187,"links":1734},[1735,1736,1737,1738,1739,1747,1748,1749],{"id":53,"depth":187,"text":54},{"id":63,"depth":187,"text":64},{"id":157,"depth":187,"text":158},{"id":278,"depth":187,"text":279},{"id":299,"depth":187,"text":300,"children":1740},[1741,1742,1743,1744,1745,1746],{"id":319,"depth":364,"text":320},{"id":645,"depth":364,"text":646},{"id":980,"depth":364,"text":981},{"id":1298,"depth":364,"text":1299},{"id":1346,"depth":364,"text":1347},{"id":1491,"depth":364,"text":1492},{"id":1508,"depth":187,"text":1509},{"id":1572,"depth":187,"text":1573},{"id":1663,"depth":187,"text":1664},"security","2025-02-05","Tutorial für Security-Scanner in luftspaltgesicherten Umgebungen: Offline-Installation und Vulnerability-Detection ohne externe Abhängigkeiten.","md",null,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1750099301/Blog/Hero%20Images/Blog/Hero%20Images/AdobeStock_1097303277_6gTk7M1DNx0tFuovupVFB1_1750099300786.jpg",{},"/de-de/blog/tutorial-security-scanning-in-air-gapped-environments",{"title":5,"description":1759,"ogTitle":5,"ogDescription":1759,"noIndex":1760,"ogImage":1755,"ogUrl":1761,"ogSiteName":1762,"ogType":1763,"canonicalUrls":1761},"Security-Scanner-Deployment in luftspaltgesicherten Umgebungen: Offline-Installation, systematische Vulnerability-Detection ohne externe Abhängigkeiten.",false,"https://about.gitlab.com/blog/tutorial-security-scanning-in-air-gapped-environments","https://about.gitlab.com","article","tutorial-security-scanning-in-air-gapped-environments","de-de/blog/tutorial-security-scanning-in-air-gapped-environments",[1767,1750,1768,1769,1770],"tutorial","public sector","DevSecOps platform","features","BlogPost","odi2cB3oGAV0F8RVwxpNtaypy4q5NSQlPuc0QNFs-CI",{"logo":1774,"freeTrial":1779,"sales":1784,"login":1789,"items":1794,"search":2122,"minimal":2156,"duo":2174,"switchNav":2183,"pricingDeployment":2194},{"config":1775},{"href":1776,"dataGaName":1777,"dataGaLocation":1778},"/de-de/","gitlab logo","header",{"text":1780,"config":1781},"Kostenlose Testversion anfordern",{"href":1782,"dataGaName":1783,"dataGaLocation":1778},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de&glm_content=default-saas-trial/","free trial",{"text":1785,"config":1786},"Demo anfordern",{"href":1787,"dataGaName":1788,"dataGaLocation":1778},"/de-de/sales/?contact-topic=request-demo","sales",{"text":1790,"config":1791},"Anmelden",{"href":1792,"dataGaName":1793,"dataGaLocation":1778},"https://gitlab.com/users/sign_in/","sign in",[1795,1824,1925,1930,2044,2100],{"text":1796,"config":1797,"menu":1799},"Plattform",{"dataNavLevelOne":1798},"platform",{"type":1800,"columns":1801},"cards",[1802,1808,1816],{"title":1796,"description":1803,"link":1804},"Die intelligente Orchestrierungsplattform für DevSecOps",{"text":1805,"config":1806},"Die Plattform erkunden",{"href":1807,"dataGaName":1798,"dataGaLocation":1778},"/de-de/platform/",{"title":1809,"description":1810,"link":1811},"GitLab Duo Agent Platform","Agentische KI für den gesamten Software-Lebenszyklus",{"text":1812,"config":1813},"Lerne GitLab Duo kennen",{"href":1814,"dataGaName":1815,"dataGaLocation":1778},"/de-de/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1817,"description":1818,"link":1819},"Warum GitLab?","Erfahre, warum sich Unternehmen für GitLab entscheiden",{"text":1820,"config":1821},"Mehr erfahren",{"href":1822,"dataGaName":1823,"dataGaLocation":1778},"/de-de/why-gitlab/","why gitlab",{"text":1825,"left":421,"config":1826,"menu":1828},"Produkt",{"dataNavLevelOne":1827},"solutions",{"type":1829,"link":1830,"columns":1834,"feature":1905},"lists",{"text":1831,"config":1832},"Alle Lösungen anzeigen",{"href":1833,"dataGaName":1827,"dataGaLocation":1778},"/de-de/solutions/",[1835,1860,1883],{"title":1836,"description":1837,"link":1838,"items":1843},"Automatisierung","CI/CD und Automatisierung zur Beschleunigung der Bereitstellung",{"config":1839},{"icon":1840,"href":1841,"dataGaName":1842,"dataGaLocation":1778},"AutomatedCodeAlt","/de-de/solutions/delivery-automation/","automated software delivery",[1844,1848,1851,1856],{"text":1845,"config":1846},"CI/CD",{"href":1847,"dataGaLocation":1778,"dataGaName":1845},"/de-de/solutions/continuous-integration/",{"text":1809,"config":1849},{"href":1814,"dataGaLocation":1778,"dataGaName":1850},"gitlab duo agent platform - product menu",{"text":1852,"config":1853},"Quellcodeverwaltung",{"href":1854,"dataGaLocation":1778,"dataGaName":1855},"/de-de/solutions/source-code-management/","Source Code Management",{"text":1857,"config":1858},"Automatische Softwarebereitstellung",{"href":1841,"dataGaLocation":1778,"dataGaName":1859},"Automated software delivery",{"title":1861,"description":1862,"link":1863,"items":1868},"Sicherheit","Entwickle Code schneller ohne Abstriche bei der Sicherheit",{"config":1864},{"href":1865,"dataGaName":1866,"dataGaLocation":1778,"icon":1867},"/de-de/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1869,1873,1878],{"text":1870,"config":1871},"Anwendungssicherheitstests",{"href":1865,"dataGaName":1872,"dataGaLocation":1778},"Application security testing",{"text":1874,"config":1875},"Schutz der Software-Lieferkette",{"href":1876,"dataGaLocation":1778,"dataGaName":1877},"/de-de/solutions/supply-chain/","Software supply chain security",{"text":1879,"config":1880},"Software-Compliance",{"href":1881,"dataGaName":1882,"dataGaLocation":1778},"/de-de/solutions/software-compliance/","software compliance",{"title":1884,"link":1885,"items":1890},"Messung",{"config":1886},{"icon":1887,"href":1888,"dataGaName":1889,"dataGaLocation":1778},"DigitalTransformation","/de-de/solutions/visibility-measurement/","visibility and measurement",[1891,1895,1900],{"text":1892,"config":1893},"Sichtbarkeit und Messung",{"href":1888,"dataGaLocation":1778,"dataGaName":1894},"Visibility and Measurement",{"text":1896,"config":1897},"Wertstrommanagement",{"href":1898,"dataGaLocation":1778,"dataGaName":1899},"/de-de/solutions/value-stream-management/","Value Stream Management",{"text":1901,"config":1902},"Analysen und Einblicke",{"href":1903,"dataGaLocation":1778,"dataGaName":1904},"/de-de/solutions/analytics-and-insights/","Analytics and insights",{"title":1906,"type":1829,"items":1907},"GitLab für",[1908,1914,1920],{"text":1909,"config":1910},"Enterprise",{"icon":1911,"href":1912,"dataGaLocation":1778,"dataGaName":1913},"Building","/de-de/enterprise/","enterprise",{"text":1915,"config":1916},"Kleinunternehmen",{"icon":1917,"href":1918,"dataGaLocation":1778,"dataGaName":1919},"Work","/de-de/small-business/","small business",{"text":1921,"config":1922},"Öffentlicher Sektor",{"icon":1923,"href":1924,"dataGaLocation":1778,"dataGaName":1768},"Organization","/de-de/solutions/public-sector/",{"text":1926,"config":1927},"Preise",{"href":1928,"dataGaName":1929,"dataGaLocation":1778,"dataNavLevelOne":1929},"/de-de/pricing/","pricing",{"text":1931,"config":1932,"menu":1934},"Ressourcen",{"dataNavLevelOne":1933},"resources",{"type":1829,"link":1935,"columns":1939,"feature":2033},{"text":1936,"config":1937},"Alle Ressourcen anzeigen",{"href":1938,"dataGaName":1933,"dataGaLocation":1778},"/de-de/resources/",[1940,1973,2000],{"title":1941,"items":1942},"Erste Schritte",[1943,1948,1953,1958,1963,1968],{"text":1944,"config":1945},"Installieren",{"href":1946,"dataGaName":1947,"dataGaLocation":1778},"/de-de/install/","install",{"text":1949,"config":1950},"Kurzanleitungen",{"href":1951,"dataGaName":1952,"dataGaLocation":1778},"/de-de/get-started/","quick setup checklists",{"text":1954,"config":1955},"Lernen",{"href":1956,"dataGaLocation":1778,"dataGaName":1957},"https://university.gitlab.com/","learn",{"text":1959,"config":1960},"Produktdokumentation",{"href":1961,"dataGaName":1962,"dataGaLocation":1778},"https://docs.gitlab.com/","product documentation",{"text":1964,"config":1965},"Best-Practice-Videos",{"href":1966,"dataGaName":1967,"dataGaLocation":1778},"/de-de/getting-started-videos/","best practice videos",{"text":1969,"config":1970},"Integrationen",{"href":1971,"dataGaName":1972,"dataGaLocation":1778},"/de-de/integrations/","integrations",{"title":1974,"items":1975},"Entdecken",[1976,1981,1986,1991,1995],{"text":1977,"config":1978},"Kundenerfolge",{"href":1979,"dataGaName":1980,"dataGaLocation":1778},"/de-de/customers/","customer success stories",{"text":1982,"config":1983},"Blog",{"href":1984,"dataGaName":1985,"dataGaLocation":1778},"/de-de/blog/","blog",{"text":1987,"config":1988},"Demo-Hub",{"href":1989,"dataGaName":1990,"dataGaLocation":1778},"/de-de/demo-hub/","demo hub",{"text":1992,"config":1993},"The Source",{"href":1994,"dataGaName":1985,"dataGaLocation":1778},"/de-de/the-source/",{"text":1996,"config":1997},"Remote",{"href":1998,"dataGaName":1999,"dataGaLocation":1778},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":2001,"items":2002},"Vernetzen",[2003,2008,2013,2018,2023,2028],{"text":2004,"config":2005},"GitLab-Services",{"href":2006,"dataGaName":2007,"dataGaLocation":1778},"/de-de/services/","services",{"text":2009,"config":2010},"Beitragen",{"href":2011,"dataGaName":2012,"dataGaLocation":1778},"https://contributors.gitlab.com","contribute",{"text":2014,"config":2015},"Community",{"href":2016,"dataGaName":2017,"dataGaLocation":1778},"/community/","community",{"text":2019,"config":2020},"Forum",{"href":2021,"dataGaName":2022,"dataGaLocation":1778},"https://forum.gitlab.com/","forum",{"text":2024,"config":2025},"Veranstaltungen",{"href":2026,"dataGaName":2027,"dataGaLocation":1778},"/events/","events",{"text":2029,"config":2030},"Partner",{"href":2031,"dataGaName":2032,"dataGaLocation":1778},"/de-de/partners/","partners",{"config":2034,"title":2037,"text":2038,"link":2039},{"background":2035,"textColor":2036},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","Neues bei GitLab","Über die neuesten Funktionen und Verbesserungen auf dem Laufenden bleiben.",{"text":2040,"config":2041},"Aktuelle Nachrichten",{"href":2042,"dataGaName":2043,"dataGaLocation":1778},"/de-de/whats-new/","whats new",{"text":2045,"config":2046,"menu":2048},"Unternehmen",{"dataNavLevelOne":2047},"company",{"type":1829,"columns":2049},[2050],{"items":2051},[2052,2057,2063,2065,2070,2075,2080,2085,2090,2095],{"text":2053,"config":2054},"Über",{"href":2055,"dataGaName":2056,"dataGaLocation":1778},"/de-de/company/","about",{"text":2058,"config":2059,"footerGa":2062},"Karriere",{"href":2060,"dataGaName":2061,"dataGaLocation":1778},"/jobs/","jobs",{"dataGaName":2061},{"text":2024,"config":2064},{"href":2026,"dataGaName":2027,"dataGaLocation":1778},{"text":2066,"config":2067},"Geschäftsführung",{"href":2068,"dataGaName":2069,"dataGaLocation":1778},"/company/team/e-group/","leadership",{"text":2071,"config":2072},"Handbuch",{"href":2073,"dataGaName":2074,"dataGaLocation":1778},"https://handbook.gitlab.com/","handbook",{"text":2076,"config":2077},"Investor Relations",{"href":2078,"dataGaName":2079,"dataGaLocation":1778},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":2081,"config":2082},"Trust Center",{"href":2083,"dataGaName":2084,"dataGaLocation":1778},"/de-de/security/","trust center",{"text":2086,"config":2087},"AI Transparency Center",{"href":2088,"dataGaName":2089,"dataGaLocation":1778},"/de-de/ai-transparency-center/","ai transparency center",{"text":2091,"config":2092},"Newsletter",{"href":2093,"dataGaName":2094,"dataGaLocation":1778},"/company/contact/#contact-forms","newsletter",{"text":2096,"config":2097},"Presse",{"href":2098,"dataGaName":2099,"dataGaLocation":1778},"/press/","press",{"text":2101,"config":2102,"menu":2103},"Kontakt",{"dataNavLevelOne":2047},{"type":1829,"columns":2104},[2105],{"items":2106},[2107,2112,2117],{"text":2108,"config":2109},"Vertrieb kontaktieren",{"href":2110,"dataGaName":2111,"dataGaLocation":1778},"/de-de/sales/","talk to sales",{"text":2113,"config":2114},"Support-Portal",{"href":2115,"dataGaName":2116,"dataGaLocation":1778},"https://support.gitlab.com/hc/en-us","support portal",{"text":2118,"config":2119},"Kundenportal",{"href":2120,"dataGaName":2121,"dataGaLocation":1778},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":2123,"login":2124,"suggestions":2131},"Schließen",{"text":2125,"link":2126},"Um Repositorys und Projekte zu durchsuchen, melde dich an bei",{"text":2127,"config":2128},"gitlab.com",{"href":1792,"dataGaName":2129,"dataGaLocation":2130},"search login","search",{"text":2132,"default":2133},"Vorschläge",[2134,2136,2141,2143,2148,2153],{"text":1809,"config":2135},{"href":1814,"dataGaName":1809,"dataGaLocation":2130},{"text":2137,"config":2138},"Codevorschläge (KI)",{"href":2139,"dataGaName":2140,"dataGaLocation":2130},"/de-de/solutions/code-suggestions/","Code Suggestions (AI)",{"text":1845,"config":2142},{"href":1847,"dataGaName":1845,"dataGaLocation":2130},{"text":2144,"config":2145},"GitLab auf AWS",{"href":2146,"dataGaName":2147,"dataGaLocation":2130},"/de-de/partners/technology-partners/aws/","GitLab on AWS",{"text":2149,"config":2150},"GitLab auf Google Cloud",{"href":2151,"dataGaName":2152,"dataGaLocation":2130},"/de-de/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":1817,"config":2154},{"href":1822,"dataGaName":2155,"dataGaLocation":2130},"Why GitLab?",{"freeTrial":2157,"mobileIcon":2162,"desktopIcon":2167,"secondaryButton":2170},{"text":2158,"config":2159},"Kostenlos testen",{"href":2160,"dataGaName":1783,"dataGaLocation":2161},"https://gitlab.com/-/trials/new/","nav",{"altText":2163,"config":2164},"GitLab-Symbol",{"src":2165,"dataGaName":2166,"dataGaLocation":2161},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":2163,"config":2168},{"src":2169,"dataGaName":2166,"dataGaLocation":2161},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1941,"config":2171},{"href":2172,"dataGaName":2173,"dataGaLocation":2161},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de/get-started/","get started",{"freeTrial":2175,"mobileIcon":2179,"desktopIcon":2181},{"text":2176,"config":2177},"Mehr über GitLab Duo erfahren",{"href":1814,"dataGaName":2178,"dataGaLocation":2161},"gitlab duo",{"altText":2163,"config":2180},{"src":2165,"dataGaName":2166,"dataGaLocation":2161},{"altText":2163,"config":2182},{"src":2169,"dataGaName":2166,"dataGaLocation":2161},{"button":2184,"mobileIcon":2189,"desktopIcon":2191},{"text":2185,"config":2186},"/Option",{"href":2187,"dataGaName":2188,"dataGaLocation":2161},"#contact","switch",{"altText":2163,"config":2190},{"src":2165,"dataGaName":2166,"dataGaLocation":2161},{"altText":2163,"config":2192},{"src":2193,"dataGaName":2166,"dataGaLocation":2161},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":2195,"mobileIcon":2200,"desktopIcon":2202},{"text":2196,"config":2197},"Zurück zur Preisübersicht",{"href":1928,"dataGaName":2198,"dataGaLocation":2161,"icon":2199},"back to pricing","GoBack",{"altText":2163,"config":2201},{"src":2165,"dataGaName":2166,"dataGaLocation":2161},{"altText":2163,"config":2203},{"src":2169,"dataGaName":2166,"dataGaLocation":2161},{"title":2205,"button":2206,"config":2210},"GitLab Orbit ist da: die Kontextebene für KI-Agenten",{"text":1820,"config":2207},{"href":2208,"dataGaName":2209,"dataGaLocation":1778},"/de-de/gitlab-orbit/","orbit",{"layout":2211,"disabled":1760},"release",{"data":2213},{"text":2214,"source":2215,"edit":2221,"contribute":2226,"config":2231,"items":2236,"minimal":2442},"Git ist eine Marke von Software Freedom Conservancy und unsere Verwendung von „GitLab“ erfolgt unter Lizenz.",{"text":2216,"config":2217},"Quelltext der Seite anzeigen",{"href":2218,"dataGaName":2219,"dataGaLocation":2220},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":2222,"config":2223},"Diese Seite bearbeiten",{"href":2224,"dataGaName":2225,"dataGaLocation":2220},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":2227,"config":2228},"Beteilige dich",{"href":2229,"dataGaName":2230,"dataGaLocation":2220},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":2232,"facebook":2233,"youtube":2234,"linkedin":2235},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[2237,2282,2335,2377,2409],{"title":1926,"links":2238,"subMenu":2253},[2239,2243,2248],{"text":2240,"config":2241},"Tarife anzeigen",{"href":1928,"dataGaName":2242,"dataGaLocation":2220},"view plans",{"text":2244,"config":2245},"Vorteile von Premium",{"href":2246,"dataGaName":2247,"dataGaLocation":2220},"/de-de/pricing/premium/","why premium",{"text":2249,"config":2250},"Vorteile von Ultimate",{"href":2251,"dataGaName":2252,"dataGaLocation":2220},"/de-de/pricing/ultimate/","why ultimate",[2254],{"title":2101,"links":2255},[2256,2258,2260,2262,2267,2272,2277],{"text":2108,"config":2257},{"href":2110,"dataGaName":1788,"dataGaLocation":2220},{"text":2113,"config":2259},{"href":2115,"dataGaName":2116,"dataGaLocation":2220},{"text":2118,"config":2261},{"href":2120,"dataGaName":2121,"dataGaLocation":2220},{"text":2263,"config":2264},"Status",{"href":2265,"dataGaName":2266,"dataGaLocation":2220},"https://status.gitlab.com/","status",{"text":2268,"config":2269},"Nutzungsbedingungen",{"href":2270,"dataGaName":2271,"dataGaLocation":2220},"/terms/","terms of use",{"text":2273,"config":2274},"Datenschutzerklärung",{"href":2275,"dataGaName":2276,"dataGaLocation":2220},"/de-de/privacy/","privacy statement",{"text":2278,"config":2279},"Cookie-Einstellungen",{"dataGaName":2280,"dataGaLocation":2220,"id":2281,"isOneTrustButton":421},"cookie preferences","ot-sdk-btn",{"title":1825,"links":2283,"subMenu":2292},[2284,2288],{"text":2285,"config":2286},"DevSecOps-Plattform",{"href":1807,"dataGaName":2287,"dataGaLocation":2220},"devsecops platform",{"text":2289,"config":2290},"KI-unterstützte Entwicklung",{"href":1814,"dataGaName":2291,"dataGaLocation":2220},"ai-assisted development",[2293],{"title":2294,"links":2295},"Themen",[2296,2300,2305,2310,2315,2320,2325,2330],{"text":1845,"config":2297},{"href":2298,"dataGaName":2299,"dataGaLocation":2220},"/de-de/topics/ci-cd/","cicd",{"text":2301,"config":2302},"GitOps",{"href":2303,"dataGaName":2304,"dataGaLocation":2220},"/de-de/topics/gitops/","gitops",{"text":2306,"config":2307},"DevOps",{"href":2308,"dataGaName":2309,"dataGaLocation":2220},"/de-de/topics/devops/","devops",{"text":2311,"config":2312},"Versionskontrolle",{"href":2313,"dataGaName":2314,"dataGaLocation":2220},"/de-de/topics/version-control/","version control",{"text":2316,"config":2317},"DevSecOps",{"href":2318,"dataGaName":2319,"dataGaLocation":2220},"/de-de/topics/devsecops/","devsecops",{"text":2321,"config":2322},"Cloud-nativ",{"href":2323,"dataGaName":2324,"dataGaLocation":2220},"/de-de/topics/cloud-native/","cloud native",{"text":2326,"config":2327},"KI für das Programmieren",{"href":2328,"dataGaName":2329,"dataGaLocation":2220},"/de-de/topics/devops/ai-for-coding/","ai for coding",{"text":2331,"config":2332},"Agentische KI",{"href":2333,"dataGaName":2334,"dataGaLocation":2220},"/de-de/topics/agentic-ai/","agentic ai",{"title":2336,"links":2337},"Lösungen",[2338,2341,2343,2348,2352,2355,2358,2361,2363,2365,2367,2372],{"text":1870,"config":2339},{"href":1865,"dataGaName":2340,"dataGaLocation":2220},"Application Security Testing",{"text":1857,"config":2342},{"href":1841,"dataGaName":1842,"dataGaLocation":2220},{"text":2344,"config":2345},"Agile Entwicklung",{"href":2346,"dataGaName":2347,"dataGaLocation":2220},"/de-de/solutions/agile-delivery/","agile delivery",{"text":2349,"config":2350},"SCM",{"href":1854,"dataGaName":2351,"dataGaLocation":2220},"source code management",{"text":1845,"config":2353},{"href":1847,"dataGaName":2354,"dataGaLocation":2220},"continuous integration & delivery",{"text":1896,"config":2356},{"href":1898,"dataGaName":2357,"dataGaLocation":2220},"value stream management",{"text":2301,"config":2359},{"href":2360,"dataGaName":2304,"dataGaLocation":2220},"/de-de/solutions/gitops/",{"text":1909,"config":2362},{"href":1912,"dataGaName":1913,"dataGaLocation":2220},{"text":1915,"config":2364},{"href":1918,"dataGaName":1919,"dataGaLocation":2220},{"text":1921,"config":2366},{"href":1924,"dataGaName":1768,"dataGaLocation":2220},{"text":2368,"config":2369},"Bildungswesen",{"href":2370,"dataGaName":2371,"dataGaLocation":2220},"/de-de/solutions/education/","education",{"text":2373,"config":2374},"Finanzdienstleistungen",{"href":2375,"dataGaName":2376,"dataGaLocation":2220},"/de-de/solutions/finance/","financial services",{"title":1931,"links":2378},[2379,2381,2383,2385,2388,2390,2393,2395,2397,2399,2401,2403,2405,2407],{"text":1944,"config":2380},{"href":1946,"dataGaName":1947,"dataGaLocation":2220},{"text":1949,"config":2382},{"href":1951,"dataGaName":1952,"dataGaLocation":2220},{"text":1954,"config":2384},{"href":1956,"dataGaName":1957,"dataGaLocation":2220},{"text":1959,"config":2386},{"href":1961,"dataGaName":2387,"dataGaLocation":2220},"docs",{"text":1982,"config":2389},{"href":1984,"dataGaName":1985,"dataGaLocation":2220},{"text":2391,"config":2392},"Neuerungen",{"href":2042,"dataGaName":2043,"dataGaLocation":2220},{"text":1977,"config":2394},{"href":1979,"dataGaName":1980,"dataGaLocation":2220},{"text":1996,"config":2396},{"href":1998,"dataGaName":1999,"dataGaLocation":2220},{"text":2004,"config":2398},{"href":2006,"dataGaName":2007,"dataGaLocation":2220},{"text":2009,"config":2400},{"href":2011,"dataGaName":2012,"dataGaLocation":2220},{"text":2014,"config":2402},{"href":2016,"dataGaName":2017,"dataGaLocation":2220},{"text":2019,"config":2404},{"href":2021,"dataGaName":2022,"dataGaLocation":2220},{"text":2024,"config":2406},{"href":2026,"dataGaName":2027,"dataGaLocation":2220},{"text":2029,"config":2408},{"href":2031,"dataGaName":2032,"dataGaLocation":2220},{"title":2045,"links":2410},[2411,2413,2415,2417,2419,2421,2426,2431,2433,2435,2437],{"text":2053,"config":2412},{"href":2055,"dataGaName":2047,"dataGaLocation":2220},{"text":2058,"config":2414},{"href":2060,"dataGaName":2061,"dataGaLocation":2220},{"text":2066,"config":2416},{"href":2068,"dataGaName":2069,"dataGaLocation":2220},{"text":2071,"config":2418},{"href":2073,"dataGaName":2074,"dataGaLocation":2220},{"text":2076,"config":2420},{"href":2078,"dataGaName":2079,"dataGaLocation":2220},{"text":2422,"config":2423},"Nachhaltigkeit",{"href":2424,"dataGaName":2425,"dataGaLocation":2220},"/sustainability/","Sustainability",{"text":2427,"config":2428},"Vielfalt, Inklusion und Zugehörigkeit",{"href":2429,"dataGaName":2430,"dataGaLocation":2220},"/de-de/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":2081,"config":2432},{"href":2083,"dataGaName":2084,"dataGaLocation":2220},{"text":2091,"config":2434},{"href":2093,"dataGaName":2094,"dataGaLocation":2220},{"text":2096,"config":2436},{"href":2098,"dataGaName":2099,"dataGaLocation":2220},{"text":2438,"config":2439},"Transparenzerklärung zu moderner Sklaverei",{"href":2440,"dataGaName":2441,"dataGaLocation":2220},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":2443},[2444,2447,2450],{"text":2445,"config":2446},"Terms",{"href":2270,"dataGaName":2271,"dataGaLocation":2220},{"text":2448,"config":2449},"Cookies",{"dataGaName":2280,"dataGaLocation":2220,"id":2281,"isOneTrustButton":421},{"text":2451,"config":2452},"Datenschutz",{"href":2275,"dataGaName":2276,"dataGaLocation":2220},[2454],{"id":2455,"title":7,"body":1754,"config":2456,"content":2458,"description":1754,"extension":2462,"meta":2463,"navigation":421,"path":2464,"seo":2465,"stem":2466,"__hash__":2467},"blogAuthors/en-us/blog/authors/fernando-diaz.yml",{"template":2457},"BlogAuthor",{"name":7,"config":2459},{"headshot":2460,"ctfId":2461},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659556/Blog/Author%20Headshots/fern_diaz.png","fjdiaz","yml",{},"/en-us/blog/authors/fernando-diaz",{},"en-us/blog/authors/fernando-diaz","lxRJIOydP4_yzYZvsPcuQevP9AYAKREF7i8QmmdnOWc",[2469,2477,2485],{"title":2470,"description":2471,"heroImage":2472,"category":1750,"date":2473,"authors":2474,"slug":2476,"externalUrl":1754},"Wie GitLab Schwachstellen über Refactorings hinweg verfolgt","Das verbesserte Scope+Offset-Fingerprinting hält das Tracking stabil, wenn Kommentare, Leerzeilen oder Reformatierungen dazukommen.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1759320418/xjmqcozxzt4frx0hori3.png","2026-08-12",[2475],"Julian Thome","improved-scope-offset-fingerprinting",{"title":2478,"description":2479,"heroImage":2472,"category":1750,"date":2480,"authors":2481,"slug":2484,"externalUrl":1754},"GitLab Secrets Manager unterstützt ESO, Terraform und API","GitLab Secrets Manager liefert Secrets sicher an Kubernetes, Terraform und externe Workflows, aus einer einzigen Quelle für die gesamte Toolchain.","2026-08-06",[2482,2483],"Erick Bajao","Joe Randazzo","gitlab-secrets-manager-add-eso-terraform-api-support",{"title":2486,"description":2487,"heroImage":2488,"category":1750,"date":2489,"authors":2490,"slug":2492,"externalUrl":1754},"Mit Claude und GitLab jeden Commit bis zur Produktion absichern","Claude Security findet Schwachstellen in der Coding-Session. GitLab übernimmt danach: Scans, Policy-Durchsetzung und Audit-Nachweise im Lebenszyklus.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1756122536/akivvcnafog9c4dhhzkp.png","2026-08-03",[2491],"Alisa Ho","claude-security-and-gitlab",{"promotions":2494},[2495,2509,2521,2532],{"id":2496,"categories":2497,"header":2499,"text":2500,"button":2501,"image":2506},"ai-modernization",[2498],"ai","Hält KI, was uns versprochen wurde?","Das Quiz dauert maximal 5 Minuten.",{"text":2502,"config":2503},"Ermittle deinen KI-Reifegrad",{"href":2504,"dataGaName":2505,"dataGaLocation":1985},"/de-de/assessments/ai-modernization-assessment/","modernization assessment",{"config":2507},{"src":2508},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":2510,"categories":2511,"header":2513,"text":2500,"button":2514,"image":2518},"devops-modernization",[2512,2319],"product","Verwaltest du Tool-Chaos oder stellst du Innovationen bereit?",{"text":2515,"config":2516},"Ermittle deinen DevOps-Reifegrad",{"href":2517,"dataGaName":2505,"dataGaLocation":1985},"/de-de/assessments/devops-modernization-assessment/",{"config":2519},{"src":2520},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":2522,"categories":2523,"header":2524,"text":2500,"button":2525,"image":2529},"security-modernization",[1750],"Tauschst du Schnelligkeit gegen Sicherheit ein?",{"text":2526,"config":2527},"Ermittle deinen Sicherheitsreifegrad",{"href":2528,"dataGaName":2505,"dataGaLocation":1985},"/de-de/assessments/security-modernization-assessment/",{"config":2530},{"src":2531},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":2533,"paths":2534,"header":2537,"text":2538,"button":2539,"image":2544},"github-azure-migration",[2535,2536],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Ist dein Team bereit für den Umzug von GitHub nach Azure?","GitHub stellt bereits auf Azure um. Finde heraus, was das für dich bedeutet.",{"text":2540,"config":2541},"Erfahre, wie GitLab im Vergleich zu GitHub abschneidet",{"href":2542,"dataGaName":2543,"dataGaLocation":1985},"/de-de/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":2545},{"src":2520},{"header":2547,"blurb":2548,"button":2549,"secondaryButton":2554},"Beginne noch heute, schneller zu entwickeln","Entdecke, was dein Team mit der intelligenten Orchestrierungsplattform für DevSecOps erreichen kann.\n",{"text":2550,"config":2551},"Kostenlosen Test starten",{"href":2552,"dataGaName":1783,"dataGaLocation":2553},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/de-de/","feature",{"text":2108,"config":2555},{"href":2110,"dataGaName":1788,"dataGaLocation":2553},1786803737961]