[{"data":1,"prerenderedAt":2034},["ShallowReactive",2],{"/de-de/blog/automating-role-based-access-control-rbac-at-scale":3,"navigation-de-de":1227,"banner-de-de":1658,"footer-de-de":1666,"blog-post-authors-de-de-James Wormwell|Paul Meresanu|Kees Valkhof":1907,"blog-related-posts-de-de-automating-role-based-access-control-rbac-at-scale":1946,"blog-promotions-de-de":1971,"next-steps-de-de":2024},{"id":4,"title":5,"authors":6,"body":10,"category":1212,"date":1213,"description":1214,"extension":1215,"externalUrl":1216,"faq":1216,"featured":118,"heroImage":1217,"meta":1218,"navigation":118,"path":1219,"seo":1220,"slug":1222,"stem":1223,"tags":1224,"template":1225,"updatedDate":1216,"__hash__":1226},"blogPosts/de-de/blog/automating-role-based-access-control-rbac-at-scale.md","RBAC mit GitLab und Keycloak automatisieren",[7,8,9],"James Wormwell","Paul Meresanu","Kees Valkhof",{"type":11,"value":12,"toc":1199},"minimark",[13,17,20,23,26,42,51,54,57,62,65,68,84,87,98,101,279,283,288,299,303,306,311,375,379,487,491,494,497,500,506,526,531,611,616,686,690,693,1016,1024,1028,1035,1038,1046,1053,1086,1089,1092,1100,1103,1115,1139,1144,1148,1151,1154,1157,1160,1163,1166,1170,1173,1176,1180,1183,1195],[14,15,16],"p",{},"Sicherheit beginnt mit Struktur. Der Aufbau einer skalierbaren und sicheren Entwicklungsplattform erfordert die richtige Grundlage – insbesondere rollenbasierte Zugriffskontrolle (RBAC).",[14,18,19],{},"Die NIS2-Richtlinie (EU) 2022/2555 fordert in Artikel 21 \"Maßnahmen zur Verwaltung des Zugriffs auf Netz- und Informationssysteme\". Automatisierte RBAC erfüllt diese Anforderung durch systematische Zugriffskontrolle nach dem Least-Privilege-Prinzip mit lückenloser Audit-Trail-Dokumentation.",[14,21,22],{},"GitLab entwickelte den RBAC Accelerator – ein modulares, ergebnisorientiertes Enablement-Programm, das große Unternehmen bei der Definition, Durchsetzung und Skalierung von Zugriffsrichtlinien in GitLab unterstützt.",[14,24,25],{},"Diese Grundlage ermöglicht umfassendere Transformation. Der Secure SDLC Accelerator, aufbauend auf dem RBAC Accelerator, befähigt Kunden zur Integration von Compliance, Sicherheit und DevSecOps-Best-Practices in ihre Workflows.",[14,27,28,29,35,36,41],{},"GitLab-Kunde ",[30,31,34],"a",{"href":32,"rel":33},"https://www.lelyna.com/us/",[],"Lely",", ein bedeutender niederländischer Hersteller landwirtschaftlicher Maschinen und Roboter, nutzte diesen Ansatz für die Migration zu GitLab Dedicated. Lely automatisierte die Nutzer-Bereitstellung via Azure AD mittels OpenID Connect (OIDC), erzwang ",[30,37,40],{"href":38,"rel":39},"https://about.gitlab.com/blog/the-ultimate-guide-to-least-privilege-access-with-gitlab/",[],"Least-Privilege-Richtlinien"," und schuf ein skalierbares, wiederverwendbares Zugriffsmodell zur Unterstützung zukünftiger Entwicklungsinitiativen.",[14,43,44,45,50],{},"Diese Anleitung führt durch eine praktische Implementierung von GitLab + ",[30,46,49],{"href":47,"rel":48},"https://www.keycloak.org/",[],"Keycloak"," + OIDC, von der Ausführung des Setups in einer Docker-Umgebung über die Automatisierung des Rollen-Mappings und den Entwurf einer skalierbaren Gruppenhierarchie bis zur Ausrichtung der GitLab-Zugriffskontrollen an Unternehmensstruktur und Compliance-Zielen.",[14,52,53],{},"Dies ist ein lokales Demo-Setup ausschließlich für Proof-of-Concept-Zwecke.",[14,55,56],{},"Ob beim Einstieg oder bei der Optimierung im großen Maßstab: Diese modulare Grundlage gewährleistet nicht nur sichere Zugriffskontrolle, sondern ermöglicht alles Weitere.",[58,59,61],"h2",{"id":60},"erste-schritte-mit-zugriffskontroll-planung","Erste Schritte mit Zugriffskontroll-Planung",[14,63,64],{},"Vor der Implementierung von Tooling ist das Verständnis der Zugriffslandschaft wesentlich.",[14,66,67],{},"Zu berücksichtigen:",[69,70,71,75,78,81],"ul",{},[72,73,74],"li",{},"Welche GitLab-Ressourcen benötigen Schutz (Projekte, Gruppen, Umgebungen)?",[72,76,77],{},"Wer sind die Personas (Developers, Maintainers, Guests usw.)?",[72,79,80],{},"Welche Organisationseinheiten (Abteilungen, Kostenstellen) sollen Zugriff regeln?",[72,82,83],{},"Wie definiert die IdP-Struktur (Keycloak) Nutzer und Rollen?",[14,85,86],{},"In dieser Phase lassen sich entwerfen:",[69,88,89,92,95],{},[72,90,91],{},"Zugriffskontroll-Matrix",[72,93,94],{},"GitLab-Gruppenhierarchie (team- oder produktbasiert)",[72,96,97],{},"Least-Privilege-Richtlinien-Annahmen",[14,99,100],{},"Beispiel Gruppenhierarchie:",[102,103,108],"pre",{"className":104,"code":105,"language":106,"meta":107,"style":107},"language-mermaid shiki shiki-themes github-light","\n\ngraph TD\n    Root[\"Root (Root Group)\"]\n    FirmwareTeam[\"Firmware-Team\"]\n    FirmwareDevelopers[\"Developers (GitLab Developer Role)\"]\n    FirmwareMaintainers[\"Maintainers (GitLab Maintainer Role)\"]\n    FirmwareReporters[\"Reporters (GitLab Reporter Role)\"]\n    HardwareTeam[\"Hardware-Team\"]\n    HardwareDevelopers[\"Developers\"]\n    SoftwareTeam[\"Software-Team\"]\n    SoftwareDevelopers[\"Developers\"]\n    SoftwareMaintainers[\"Maintainers\"]\n    SoftwareReporters[\"Reporters\"]\n    \n    Enterprise --> FirmwareTeam\n    Enterprise --> HardwareTeam\n    Enterprise --> SoftwareTeam\n    \n    FirmwareTeam --> FirmwareDevelopers\n    FirmwareTeam --> FirmwareMaintainers\n    FirmwareTeam --> FirmwareReporters\n    \n    HardwareTeam --> HardwareDevelopers\n    \n    SoftwareTeam --> SoftwareDevelopers\n    SoftwareTeam --> SoftwareMaintainers\n    SoftwareTeam --> SoftwareReporters\n","mermaid","",[109,110,111,120,125,132,138,144,150,156,162,168,174,180,186,192,198,204,210,216,222,227,233,239,245,250,256,261,267,273],"code",{"__ignoreMap":107},[112,113,116],"span",{"class":114,"line":115},"line",1,[112,117,119],{"emptyLinePlaceholder":118},true,"\n",[112,121,123],{"class":114,"line":122},2,[112,124,119],{"emptyLinePlaceholder":118},[112,126,128],{"class":114,"line":127},3,[112,129,131],{"class":130},"sgsFI","graph TD\n",[112,133,135],{"class":114,"line":134},4,[112,136,137],{"class":130},"    Root[\"Root (Root Group)\"]\n",[112,139,141],{"class":114,"line":140},5,[112,142,143],{"class":130},"    FirmwareTeam[\"Firmware-Team\"]\n",[112,145,147],{"class":114,"line":146},6,[112,148,149],{"class":130},"    FirmwareDevelopers[\"Developers (GitLab Developer Role)\"]\n",[112,151,153],{"class":114,"line":152},7,[112,154,155],{"class":130},"    FirmwareMaintainers[\"Maintainers (GitLab Maintainer Role)\"]\n",[112,157,159],{"class":114,"line":158},8,[112,160,161],{"class":130},"    FirmwareReporters[\"Reporters (GitLab Reporter Role)\"]\n",[112,163,165],{"class":114,"line":164},9,[112,166,167],{"class":130},"    HardwareTeam[\"Hardware-Team\"]\n",[112,169,171],{"class":114,"line":170},10,[112,172,173],{"class":130},"    HardwareDevelopers[\"Developers\"]\n",[112,175,177],{"class":114,"line":176},11,[112,178,179],{"class":130},"    SoftwareTeam[\"Software-Team\"]\n",[112,181,183],{"class":114,"line":182},12,[112,184,185],{"class":130},"    SoftwareDevelopers[\"Developers\"]\n",[112,187,189],{"class":114,"line":188},13,[112,190,191],{"class":130},"    SoftwareMaintainers[\"Maintainers\"]\n",[112,193,195],{"class":114,"line":194},14,[112,196,197],{"class":130},"    SoftwareReporters[\"Reporters\"]\n",[112,199,201],{"class":114,"line":200},15,[112,202,203],{"class":130},"    \n",[112,205,207],{"class":114,"line":206},16,[112,208,209],{"class":130},"    Enterprise --> FirmwareTeam\n",[112,211,213],{"class":114,"line":212},17,[112,214,215],{"class":130},"    Enterprise --> HardwareTeam\n",[112,217,219],{"class":114,"line":218},18,[112,220,221],{"class":130},"    Enterprise --> SoftwareTeam\n",[112,223,225],{"class":114,"line":224},19,[112,226,203],{"class":130},[112,228,230],{"class":114,"line":229},20,[112,231,232],{"class":130},"    FirmwareTeam --> FirmwareDevelopers\n",[112,234,236],{"class":114,"line":235},21,[112,237,238],{"class":130},"    FirmwareTeam --> FirmwareMaintainers\n",[112,240,242],{"class":114,"line":241},22,[112,243,244],{"class":130},"    FirmwareTeam --> FirmwareReporters\n",[112,246,248],{"class":114,"line":247},23,[112,249,203],{"class":130},[112,251,253],{"class":114,"line":252},24,[112,254,255],{"class":130},"    HardwareTeam --> HardwareDevelopers\n",[112,257,259],{"class":114,"line":258},25,[112,260,203],{"class":130},[112,262,264],{"class":114,"line":263},26,[112,265,266],{"class":130},"    SoftwareTeam --> SoftwareDevelopers\n",[112,268,270],{"class":114,"line":269},27,[112,271,272],{"class":130},"    SoftwareTeam --> SoftwareMaintainers\n",[112,274,276],{"class":114,"line":275},28,[112,277,278],{"class":130},"    SoftwareTeam --> SoftwareReporters\n",[58,280,282],{"id":281},"demo-system-setup-gitlab-keycloak-in-lokaler-docker-umgebung","Demo-System-Setup: GitLab + Keycloak in lokaler Docker-Umgebung",[284,285,287],"h3",{"id":286},"voraussetzungen","Voraussetzungen",[69,289,290,293,296],{},[72,291,292],{},"Docker, Docker Compose, OpenSSL",[72,294,295],{},"GitLab Version 17.7.3 und Keycloak Version 23.0.7 Container-Images",[72,297,298],{},"Selbstsignierte Zertifikate",[284,300,302],{"id":301},"env-konfiguration",".env-Konfiguration",[14,304,305],{},"Das Demo-Setup nutzt folgende GitLab- und Keycloak-Versionen, Ports und Secrets.",[307,308,310],"h4",{"id":309},"gitlab-konfiguration","GitLab-Konfiguration",[102,312,316],{"className":313,"code":314,"language":315,"meta":107,"style":107},"language-bash shiki shiki-themes github-light","\n\nGITLAB_VERSION=17.7.3-ee.0\n\n\nGITLAB_EXTERNAL_URL=http://localhost:8081\n\n\nGITLAB_SSH_PORT=8222\n\n\n","bash",[109,317,318,322,326,339,343,347,357,361,365],{"__ignoreMap":107},[112,319,320],{"class":114,"line":115},[112,321,119],{"emptyLinePlaceholder":118},[112,323,324],{"class":114,"line":122},[112,325,119],{"emptyLinePlaceholder":118},[112,327,328,331,335],{"class":114,"line":127},[112,329,330],{"class":130},"GITLAB_VERSION",[112,332,334],{"class":333},"sD7c4","=",[112,336,338],{"class":337},"sYBdl","17.7.3-ee.0\n",[112,340,341],{"class":114,"line":134},[112,342,119],{"emptyLinePlaceholder":118},[112,344,345],{"class":114,"line":140},[112,346,119],{"emptyLinePlaceholder":118},[112,348,349,352,354],{"class":114,"line":146},[112,350,351],{"class":130},"GITLAB_EXTERNAL_URL",[112,353,334],{"class":333},[112,355,356],{"class":337},"http://localhost:8081\n",[112,358,359],{"class":114,"line":152},[112,360,119],{"emptyLinePlaceholder":118},[112,362,363],{"class":114,"line":158},[112,364,119],{"emptyLinePlaceholder":118},[112,366,367,370,372],{"class":114,"line":164},[112,368,369],{"class":130},"GITLAB_SSH_PORT",[112,371,334],{"class":333},[112,373,374],{"class":337},"8222\n",[307,376,378],{"id":377},"keycloak-konfiguration","Keycloak-Konfiguration",[102,380,382],{"className":313,"code":381,"language":315,"meta":107,"style":107},"\n\nKEYCLOAK_VERSION=latest\n\n\nKEYCLOAK_ADMIN=\u003Cyour-admin-username>\n\n\nKEYCLOAK_ADMIN_PASSWORD=\u003Cyour-admin-password>\n\n\nKEYCLOAK_HTTPS_PORT=8443\n\n\nKEYCLOAK_CLIENT_SECRET=\u003Cyour-client-secret>  # Get this from Keycloak after setup\n\n\n",[109,383,384,388,392,402,406,410,424,428,432,444,448,452,462,466,470],{"__ignoreMap":107},[112,385,386],{"class":114,"line":115},[112,387,119],{"emptyLinePlaceholder":118},[112,389,390],{"class":114,"line":122},[112,391,119],{"emptyLinePlaceholder":118},[112,393,394,397,399],{"class":114,"line":127},[112,395,396],{"class":130},"KEYCLOAK_VERSION",[112,398,334],{"class":333},[112,400,401],{"class":337},"latest\n",[112,403,404],{"class":114,"line":134},[112,405,119],{"emptyLinePlaceholder":118},[112,407,408],{"class":114,"line":140},[112,409,119],{"emptyLinePlaceholder":118},[112,411,412,415,418,421],{"class":114,"line":146},[112,413,414],{"class":130},"KEYCLOAK_ADMIN",[112,416,417],{"class":333},"=\u003C",[112,419,420],{"class":337},"your-admin-username",[112,422,423],{"class":333},">\n",[112,425,426],{"class":114,"line":152},[112,427,119],{"emptyLinePlaceholder":118},[112,429,430],{"class":114,"line":158},[112,431,119],{"emptyLinePlaceholder":118},[112,433,434,437,439,442],{"class":114,"line":164},[112,435,436],{"class":130},"KEYCLOAK_ADMIN_PASSWORD",[112,438,417],{"class":333},[112,440,441],{"class":337},"your-admin-password",[112,443,423],{"class":333},[112,445,446],{"class":114,"line":170},[112,447,119],{"emptyLinePlaceholder":118},[112,449,450],{"class":114,"line":176},[112,451,119],{"emptyLinePlaceholder":118},[112,453,454,457,459],{"class":114,"line":182},[112,455,456],{"class":130},"KEYCLOAK_HTTPS_PORT",[112,458,334],{"class":333},[112,460,461],{"class":337},"8443\n",[112,463,464],{"class":114,"line":188},[112,465,119],{"emptyLinePlaceholder":118},[112,467,468],{"class":114,"line":194},[112,469,119],{"emptyLinePlaceholder":118},[112,471,472,475,477,480,483],{"class":114,"line":200},[112,473,474],{"class":130},"KEYCLOAK_CLIENT_SECRET",[112,476,417],{"class":333},[112,478,479],{"class":337},"your-client-secret",[112,481,482],{"class":333},">",[112,484,486],{"class":485},"sAwPA","  # Get this from Keycloak after setup\n",[58,488,490],{"id":489},"ssl-zertifikate-generieren","SSL-Zertifikate generieren",[14,492,493],{},"Zur Etablierung von Vertrauen zwischen GitLab und Keycloak, insbesondere in einer selbst gehosteten Docker-Umgebung, müssen selbstsignierte SSL-Zertifikate generiert werden. Diese Zertifikate ermöglichen verschlüsselte HTTPS-Kommunikation und stellen sicher, dass GitLab sicher mit Keycloak während des OIDC-Authentifizierungsprozesses kommunizieren kann.",[14,495,496],{},"Für Produktivumgebungen empfiehlt sich die Nutzung von Zertifikaten einer vertrauenswürdigen Certificate Authority (CA), für lokales Testen und Entwicklung sind selbstsignierte Zertifikate ausreichend.",[14,498,499],{},"Schrittweise Anleitung:",[501,502,503],"ol",{},[72,504,505],{},"Ordner für die Zertifikate erstellen.",[102,507,511],{"className":508,"code":509,"language":510,"meta":107,"style":107},"language-shell shiki shiki-themes github-light","mkdir -p certs\n","shell",[109,512,513],{"__ignoreMap":107},[112,514,515,519,523],{"class":114,"line":115},[112,516,518],{"class":517},"s7eDp","mkdir",[112,520,522],{"class":521},"sYu0t"," -p",[112,524,525],{"class":337}," certs\n",[501,527,528],{"start":122},[72,529,530],{},"Selbstsigniertes Zertifikat mit OpenSSL generieren.",[102,532,534],{"className":313,"code":533,"language":315,"meta":107,"style":107},"\n\nopenssl req -x509 -nodes -days 365 -newkey rsa:2048 \\\n  -keyout certs/tls.key \\\n  -out certs/tls.crt \\\n  -subj \"/CN=keycloak\" \\\n  -addext \"subjectAltName=DNS:keycloak,DNS:localhost\"\n",[109,535,536,540,544,573,583,593,603],{"__ignoreMap":107},[112,537,538],{"class":114,"line":115},[112,539,119],{"emptyLinePlaceholder":118},[112,541,542],{"class":114,"line":122},[112,543,119],{"emptyLinePlaceholder":118},[112,545,546,549,552,555,558,561,564,567,570],{"class":114,"line":127},[112,547,548],{"class":517},"openssl",[112,550,551],{"class":337}," req",[112,553,554],{"class":521}," -x509",[112,556,557],{"class":521}," -nodes",[112,559,560],{"class":521}," -days",[112,562,563],{"class":521}," 365",[112,565,566],{"class":521}," -newkey",[112,568,569],{"class":337}," rsa:2048",[112,571,572],{"class":521}," \\\n",[112,574,575,578,581],{"class":114,"line":134},[112,576,577],{"class":521},"  -keyout",[112,579,580],{"class":337}," certs/tls.key",[112,582,572],{"class":521},[112,584,585,588,591],{"class":114,"line":140},[112,586,587],{"class":521},"  -out",[112,589,590],{"class":337}," certs/tls.crt",[112,592,572],{"class":521},[112,594,595,598,601],{"class":114,"line":146},[112,596,597],{"class":521},"  -subj",[112,599,600],{"class":337}," \"/CN=keycloak\"",[112,602,572],{"class":521},[112,604,605,608],{"class":114,"line":152},[112,606,607],{"class":521},"  -addext",[112,609,610],{"class":337}," \"subjectAltName=DNS:keycloak,DNS:localhost\"\n",[501,612,613],{"start":127},[72,614,615],{},"PKCS12-Keystore für Keycloak erstellen.",[102,617,619],{"className":313,"code":618,"language":315,"meta":107,"style":107},"\n\nopenssl pkcs12 -export \\\n  -in certs/tls.crt \\\n  -inkey certs/tls.key \\\n  -out certs/keystore.p12 \\\n  -name keycloak \\\n  -password pass:password\n",[109,620,621,625,629,641,650,659,668,678],{"__ignoreMap":107},[112,622,623],{"class":114,"line":115},[112,624,119],{"emptyLinePlaceholder":118},[112,626,627],{"class":114,"line":122},[112,628,119],{"emptyLinePlaceholder":118},[112,630,631,633,636,639],{"class":114,"line":127},[112,632,548],{"class":517},[112,634,635],{"class":337}," pkcs12",[112,637,638],{"class":521}," -export",[112,640,572],{"class":521},[112,642,643,646,648],{"class":114,"line":134},[112,644,645],{"class":521},"  -in",[112,647,590],{"class":337},[112,649,572],{"class":521},[112,651,652,655,657],{"class":114,"line":140},[112,653,654],{"class":521},"  -inkey",[112,656,580],{"class":337},[112,658,572],{"class":521},[112,660,661,663,666],{"class":114,"line":146},[112,662,587],{"class":521},[112,664,665],{"class":337}," certs/keystore.p12",[112,667,572],{"class":521},[112,669,670,673,676],{"class":114,"line":152},[112,671,672],{"class":521},"  -name",[112,674,675],{"class":337}," keycloak",[112,677,572],{"class":521},[112,679,680,683],{"class":114,"line":158},[112,681,682],{"class":521},"  -password",[112,684,685],{"class":337}," pass:password\n",[58,687,689],{"id":688},"service-mit-docker-compose-starten","Service mit Docker Compose starten",[14,691,692],{},"Mit den Zertifikaten lässt sich die lokale GitLab + Keycloak-Umgebung mittels Docker Compose aufsetzen:",[102,694,698],{"className":695,"code":696,"language":697,"meta":107,"style":107},"language-yaml shiki shiki-themes github-light","\n\nversion: '3.8' services:\n gitlab:\n   image: gitlab/gitlab-ee:${GITLAB_VERSION}\n   container_name: gitlab restart: unless-stopped environment:\n     GITLAB_OMNIBUS_CONFIG: | external_url '${GITLAB_EXTERNAL_URL:-http://localhost:8081}' gitlab_rails['gitlab_shell_ssh_port'] = ${GITLAB_SSH_PORT:-8222}\n       gitlab_rails['display_initial_root_password'] = true\n\n       # OAuth Configuration gitlab_rails['omniauth_enabled'] = true gitlab_rails['omniauth_allow_single_sign_on'] = ['openid_connect'] gitlab_rails['omniauth_block_auto_created_users'] = false gitlab_rails['omniauth_providers'] = [\n           { 'name' => 'openid_connect', 'label' => 'Keycloak', 'args' => { 'name' => 'openid_connect', 'scope' => ['openid', 'profile', 'email'], 'response_type' => 'code', 'issuer' => 'https://localhost:8443/realms/GitLab', 'client_auth_method' => 'query', 'discovery' => false, 'uid_field' => 'preferred_username', 'pkce' => true, 'client_options' => { 'identifier' => 'gitlab', 'secret' => '${KEYCLOAK_CLIENT_SECRET}', 'redirect_uri' => '${GITLAB_EXTERNAL_URL:-http://localhost:8081}/users/auth/openid_connect/callback', 'authorization_endpoint' => 'https://localhost:8443/realms/GitLab/protocol/openid-connect/auth', 'token_endpoint' => 'https://keycloak:8443/realms/GitLab/protocol/openid-connect/token', 'userinfo_endpoint' => 'https://keycloak:8443/realms/GitLab/protocol/openid-connect/userinfo', 'jwks_uri' => 'https://keycloak:8443/realms/GitLab/protocol/openid-connect/certs'\n                   }\n               }\n           }\n       ] volumes:\n     - gl-config:/etc/gitlab\n     - gl-data:/var/opt/gitlab\n     - ./certs/tls.crt:/etc/gitlab/trusted-certs/keycloak.crt\n   ports:\n     - '${GITLAB_EXTERNAL_PORT:-8081}:8081'\n     - '${GITLAB_SSH_PORT:-8222}:22'\n   shm_size: '256m' keycloak:\n   image: quay.io/keycloak/keycloak:${KEYCLOAK_VERSION}\n   container_name: keycloak-server restart: unless-stopped command: [ \"start-dev\", \"--import-realm\", \"--https-port=${KEYCLOAK_HTTPS_PORT}\", \"--https-key-store-file=/etc/x509/https/keystore.p12\", \"--https-key-store-password=password\"\n   ] volumes:\n     - ./data:/opt/keycloak/data/import\n     - ./certs:/etc/x509/https\n   environment:\n     KEYCLOAK_ADMIN: ${KEYCLOAK_ADMIN}\n     KEYCLOAK_ADMIN_PASSWORD: ${KEYCLOAK_ADMIN_PASSWORD}\n   ports:\n     - \"${KEYCLOAK_HTTPS_PORT}:8443\"\n\nvolumes:\n gl-config:\n gl-data:\n","yaml",[109,699,700,704,708,726,733,743,760,774,779,783,788,793,798,803,808,813,821,828,835,842,849,856,870,879,920,930,937,944,951,962,973,980,988,993,1000,1008],{"__ignoreMap":107},[112,701,702],{"class":114,"line":115},[112,703,119],{"emptyLinePlaceholder":118},[112,705,706],{"class":114,"line":122},[112,707,119],{"emptyLinePlaceholder":118},[112,709,710,714,717,720,723],{"class":114,"line":127},[112,711,713],{"class":712},"shJU0","version",[112,715,716],{"class":130},": ",[112,718,719],{"class":337},"'3.8'",[112,721,722],{"class":712}," services",[112,724,725],{"class":130},":\n",[112,727,728,731],{"class":114,"line":134},[112,729,730],{"class":712}," gitlab",[112,732,725],{"class":130},[112,734,735,738,740],{"class":114,"line":140},[112,736,737],{"class":712},"   image",[112,739,716],{"class":130},[112,741,742],{"class":337},"gitlab/gitlab-ee:${GITLAB_VERSION}\n",[112,744,745,748,750,753,755,758],{"class":114,"line":146},[112,746,747],{"class":712},"   container_name",[112,749,716],{"class":130},[112,751,752],{"class":712},"gitlab restart",[112,754,716],{"class":130},[112,756,757],{"class":712},"unless-stopped environment",[112,759,725],{"class":130},[112,761,762,765,767,770],{"class":114,"line":152},[112,763,764],{"class":712},"     GITLAB_OMNIBUS_CONFIG",[112,766,716],{"class":130},[112,768,769],{"class":333},"|",[112,771,773],{"class":772},"sB1qb"," external_url '${GITLAB_EXTERNAL_URL:-http://localhost:8081}' gitlab_rails['gitlab_shell_ssh_port'] = ${GITLAB_SSH_PORT:-8222}\n",[112,775,776],{"class":114,"line":158},[112,777,778],{"class":337},"       gitlab_rails['display_initial_root_password'] = true\n",[112,780,781],{"class":114,"line":164},[112,782,119],{"emptyLinePlaceholder":118},[112,784,785],{"class":114,"line":170},[112,786,787],{"class":337},"       # OAuth Configuration gitlab_rails['omniauth_enabled'] = true gitlab_rails['omniauth_allow_single_sign_on'] = ['openid_connect'] gitlab_rails['omniauth_block_auto_created_users'] = false gitlab_rails['omniauth_providers'] = [\n",[112,789,790],{"class":114,"line":176},[112,791,792],{"class":337},"           { 'name' => 'openid_connect', 'label' => 'Keycloak', 'args' => { 'name' => 'openid_connect', 'scope' => ['openid', 'profile', 'email'], 'response_type' => 'code', 'issuer' => 'https://localhost:8443/realms/GitLab', 'client_auth_method' => 'query', 'discovery' => false, 'uid_field' => 'preferred_username', 'pkce' => true, 'client_options' => { 'identifier' => 'gitlab', 'secret' => '${KEYCLOAK_CLIENT_SECRET}', 'redirect_uri' => '${GITLAB_EXTERNAL_URL:-http://localhost:8081}/users/auth/openid_connect/callback', 'authorization_endpoint' => 'https://localhost:8443/realms/GitLab/protocol/openid-connect/auth', 'token_endpoint' => 'https://keycloak:8443/realms/GitLab/protocol/openid-connect/token', 'userinfo_endpoint' => 'https://keycloak:8443/realms/GitLab/protocol/openid-connect/userinfo', 'jwks_uri' => 'https://keycloak:8443/realms/GitLab/protocol/openid-connect/certs'\n",[112,794,795],{"class":114,"line":182},[112,796,797],{"class":337},"                   }\n",[112,799,800],{"class":114,"line":188},[112,801,802],{"class":337},"               }\n",[112,804,805],{"class":114,"line":194},[112,806,807],{"class":337},"           }\n",[112,809,810],{"class":114,"line":200},[112,811,812],{"class":337},"       ] volumes:\n",[112,814,815,818],{"class":114,"line":206},[112,816,817],{"class":130},"     - ",[112,819,820],{"class":337},"gl-config:/etc/gitlab\n",[112,822,823,825],{"class":114,"line":212},[112,824,817],{"class":130},[112,826,827],{"class":337},"gl-data:/var/opt/gitlab\n",[112,829,830,832],{"class":114,"line":218},[112,831,817],{"class":130},[112,833,834],{"class":337},"./certs/tls.crt:/etc/gitlab/trusted-certs/keycloak.crt\n",[112,836,837,840],{"class":114,"line":224},[112,838,839],{"class":712},"   ports",[112,841,725],{"class":130},[112,843,844,846],{"class":114,"line":229},[112,845,817],{"class":130},[112,847,848],{"class":337},"'${GITLAB_EXTERNAL_PORT:-8081}:8081'\n",[112,850,851,853],{"class":114,"line":235},[112,852,817],{"class":130},[112,854,855],{"class":337},"'${GITLAB_SSH_PORT:-8222}:22'\n",[112,857,858,861,863,866,868],{"class":114,"line":241},[112,859,860],{"class":712},"   shm_size",[112,862,716],{"class":130},[112,864,865],{"class":337},"'256m'",[112,867,675],{"class":712},[112,869,725],{"class":130},[112,871,872,874,876],{"class":114,"line":247},[112,873,737],{"class":712},[112,875,716],{"class":130},[112,877,878],{"class":337},"quay.io/keycloak/keycloak:${KEYCLOAK_VERSION}\n",[112,880,881,883,885,888,890,893,896,899,902,905,907,910,912,915,917],{"class":114,"line":252},[112,882,747],{"class":712},[112,884,716],{"class":130},[112,886,887],{"class":712},"keycloak-server restart",[112,889,716],{"class":130},[112,891,892],{"class":712},"unless-stopped command",[112,894,895],{"class":130},": [ ",[112,897,898],{"class":337},"\"start-dev\"",[112,900,901],{"class":130},", ",[112,903,904],{"class":337},"\"--import-realm\"",[112,906,901],{"class":130},[112,908,909],{"class":337},"\"--https-port=${KEYCLOAK_HTTPS_PORT}\"",[112,911,901],{"class":130},[112,913,914],{"class":337},"\"--https-key-store-file=/etc/x509/https/keystore.p12\"",[112,916,901],{"class":130},[112,918,919],{"class":337},"\"--https-key-store-password=password\"\n",[112,921,922,925,928],{"class":114,"line":258},[112,923,924],{"class":130},"   ] ",[112,926,927],{"class":712},"volumes",[112,929,725],{"class":130},[112,931,932,934],{"class":114,"line":263},[112,933,817],{"class":130},[112,935,936],{"class":337},"./data:/opt/keycloak/data/import\n",[112,938,939,941],{"class":114,"line":269},[112,940,817],{"class":130},[112,942,943],{"class":337},"./certs:/etc/x509/https\n",[112,945,946,949],{"class":114,"line":275},[112,947,948],{"class":712},"   environment",[112,950,725],{"class":130},[112,952,954,957,959],{"class":114,"line":953},29,[112,955,956],{"class":712},"     KEYCLOAK_ADMIN",[112,958,716],{"class":130},[112,960,961],{"class":337},"${KEYCLOAK_ADMIN}\n",[112,963,965,968,970],{"class":114,"line":964},30,[112,966,967],{"class":712},"     KEYCLOAK_ADMIN_PASSWORD",[112,969,716],{"class":130},[112,971,972],{"class":337},"${KEYCLOAK_ADMIN_PASSWORD}\n",[112,974,976,978],{"class":114,"line":975},31,[112,977,839],{"class":712},[112,979,725],{"class":130},[112,981,983,985],{"class":114,"line":982},32,[112,984,817],{"class":130},[112,986,987],{"class":337},"\"${KEYCLOAK_HTTPS_PORT}:8443\"\n",[112,989,991],{"class":114,"line":990},33,[112,992,119],{"emptyLinePlaceholder":118},[112,994,996,998],{"class":114,"line":995},34,[112,997,927],{"class":712},[112,999,725],{"class":130},[112,1001,1003,1006],{"class":114,"line":1002},35,[112,1004,1005],{"class":712}," gl-config",[112,1007,725],{"class":130},[112,1009,1011,1014],{"class":114,"line":1010},36,[112,1012,1013],{"class":712}," gl-data",[112,1015,725],{"class":130},[102,1017,1022],{"className":1018,"code":1020,"language":1021,"meta":107},[1019],"language-text","\n\ndocker-compose up -d\n\n\n","text",[109,1023,1020],{"__ignoreMap":107},[58,1025,1027],{"id":1026},"keycloak-realm-konfiguration","Keycloak-Realm-Konfiguration",[14,1029,1030,1031,1034],{},"Der Keycloak-Realm wird beim Start automatisch konfiguriert, wie in der ",[109,1032,1033],{},"docker-compose","-Datei definiert.",[14,1036,1037],{},"Die Realm-Konfiguration umfasst:",[69,1039,1040,1043],{},[72,1041,1042],{},"Vorkonfigurierter GitLab-Client",[72,1044,1045],{},"Standard-Client-Secret",[14,1047,1048,1049,1052],{},"Zugriff auf die Keycloak-Admin-Konsole unter ",[109,1050,1051],{},"https://localhost:8443",":",[69,1054,1055,1058,1065],{},[72,1056,1057],{},"Username: admin",[72,1059,1060,1061,1064],{},"Passwort: aus der ",[109,1062,1063],{},".env","-Datei",[72,1066,1067,1068],{},"Zur Verifikation des Setups:\n",[69,1069,1070,1073,1080],{},[72,1071,1072],{},"In Keycloak-Admin-Konsole einloggen",[72,1074,1075,1079],{},[1076,1077,1078],"strong",{},"GitLab","-Realm auswählen",[72,1081,1082,1085],{},[1076,1083,1084],{},"Clients > gitlab"," prüfen",[14,1087,1088],{},"Die Client-Konfiguration gegen die Umgebung verifizieren.",[14,1090,1091],{},"Zur Demonstration des automatisierten RBAC-Mechanismus sind folgende Schritte erforderlich:",[69,1093,1094,1097],{},[72,1095,1096],{},"Realm-Rollen auf GitLab-Rollen mappen",[72,1098,1099],{},"Gruppenstruktur mit Rollen-Mapping erstellen, entsprechend dem Gruppe-Untergruppe-Projekt-Muster in GitLab",[14,1101,1102],{},"Vor der Bereitstellung erster Nutzer in die Nutzergruppen empfiehlt sich der Login in die GitLab-Instanz zum Abruf des Instanz-Root-Passworts:",[501,1104,1105,1112],{},[72,1106,1107,1108,1111],{},"GitLab unter ",[109,1109,1110],{},"http://localhost:8081"," aufrufen.",[72,1113,1114],{},"Root-Passwort abrufen:",[102,1116,1118],{"className":313,"code":1117,"language":315,"meta":107,"style":107},"docker exec gitlab grep 'Password:' /etc/gitlab/initial_root_password\n",[109,1119,1120],{"__ignoreMap":107},[112,1121,1122,1125,1128,1130,1133,1136],{"class":114,"line":115},[112,1123,1124],{"class":517},"docker",[112,1126,1127],{"class":337}," exec",[112,1129,730],{"class":337},[112,1131,1132],{"class":337}," grep",[112,1134,1135],{"class":337}," 'Password:'",[112,1137,1138],{"class":337}," /etc/gitlab/initial_root_password\n",[501,1140,1141],{"start":127},[72,1142,1143],{},"Als Root mit dem abgerufenen Passwort einloggen.",[58,1145,1147],{"id":1146},"alles-zusammenführen","Alles zusammenführen",[14,1149,1150],{},"Zur Demonstration der Leistungsfähigkeit dieses integrierten RBAC-Modells beginnt ein realer Nutzer-Journey – von der Identität zum Zugriff.",[14,1152,1153],{},"In Keycloak wird ein Nutzer gezeigt, der spezifischen Realm-Rollen (z.B. developer, maintainer) und Gruppen (z.B. /engineering/platform) zugewiesen ist. Diese Rollen wurden via OIDC-Claims auf GitLab-Zugriffsebenen gemappt, während Gruppenzugehörigkeiten mit GitLabs strukturierter Hierarchie von Root-Gruppen, Untergruppen und Projekten übereinstimmen.",[14,1155,1156],{},"Beim Login über GitLabs SSO-Keycloak-Endpoint wird der Nutzer automatisch in die korrekte Gruppe bereitgestellt und erhält die entsprechende Rolle – ohne manuelle Intervention.",[14,1158,1159],{},"In GitLab lässt sich sehen, dass der Nutzer mit dem zugewiesenen Projekt interagieren kann: Ein Developer kann beispielsweise Code pushen und einen Merge Request öffnen, aber nicht in geschützte Branches mergen – Validierung des Least-Privilege-Modells.",[14,1161,1162],{},"ISO 27001 Anhang A.9.2 fordert Verwaltung privilegierter Zugriffsrechte. Die automatisierte OIDC-basierte Rollenbereitstellung erfüllt diese Anforderung durch systematische Zugriffskontrolle: Nutzer erhalten ausschließlich die minimal erforderlichen Berechtigungen, dokumentiert durch Audit-Trails in GitLab und Keycloak.",[14,1164,1165],{},"Abschließend lässt sich Zugriff über mehrere Teams oder Produkte demonstrieren, die zentral in Keycloak verwaltet, aber präzise in GitLab durch Gruppensynchronisation und Berechtigungsvererbung durchgesetzt werden. Diese Demo illustriert nicht nur Rollenzuweisung, sondern wie GitLab und Keycloak gemeinsam Echtzeit-Zugriffs-Governance im großen Maßstab liefern – bereit für sichere, konforme Enterprise-Softwareentwicklung.",[58,1167,1169],{"id":1168},"warum-gitlab","Warum GitLab?",[14,1171,1172],{},"GitLabs umfassende, intelligente DevSecOps-Plattform ist die ideale Grundlage für sichere, skalierbare Zugriffsverwaltung. Mit nativem OIDC-Support, granularer Rollen-Durchsetzung, SCIM-basierter Nutzer-Bereitstellung und integriertem Audit-Logging ermöglicht GitLab Unternehmen, Kontrolle zu zentralisieren ohne Agilität zu beeinträchtigen. Die flexible Gruppenhierarchie spiegelt Unternehmensstrukturen wider und erleichtert die Zugriffsverwaltung über Teams hinweg.",[14,1174,1175],{},"Die Integration mit Identity-Providern wie Keycloak automatisiert Onboarding, gewährleistet Least-Privilege-Zugriff und schafft eine nahtlose Identität-zu-Berechtigung-Pipeline, die regulatorische und Sicherheitsziele unterstützt. Als Kernkomponente von GitLabs Sicherheitsfunktionen ist RBAC direkt mit CI/CD, Policy-Durchsetzung und Vulnerability-Management-Workflows verbunden.",[58,1177,1179],{"id":1178},"zusammenfassung","Zusammenfassung",[14,1181,1182],{},"RBAC ist erst der Anfang. Mit GitLab und Keycloak wird nicht nur Zugriff gesichert, sondern strukturierte, automatisierte Governance ermöglicht, die skaliert. Bei der Erweiterung auf Policy-Durchsetzung, Secure SDLC und DevSecOps-Automatisierung wird diese Grundlage zum Startpunkt für nachhaltige Enterprise-Software-Delivery.",[1184,1185,1186],"blockquote",{},[14,1187,1188,1189,1194],{},"Starte noch heute mit RBAC in GitLab mit einer kostenlosen Testversion von GitLab Ultimate. ",[30,1190,1193],{"href":1191,"rel":1192},"https://about.gitlab.com/de-de/free-trial/",[],"Jetzt anmelden","!",[1196,1197,1198],"style",{},"html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}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 .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}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 .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .sB1qb, html code.shiki .sB1qb{--shiki-default:#B31D28;--shiki-default-font-style:italic}",{"title":107,"searchDepth":122,"depth":122,"links":1200},[1201,1202,1206,1207,1208,1209,1210,1211],{"id":60,"depth":122,"text":61},{"id":281,"depth":122,"text":282,"children":1203},[1204,1205],{"id":286,"depth":127,"text":287},{"id":301,"depth":127,"text":302},{"id":489,"depth":122,"text":490},{"id":688,"depth":122,"text":689},{"id":1026,"depth":122,"text":1027},{"id":1146,"depth":122,"text":1147},{"id":1168,"depth":122,"text":1169},{"id":1178,"depth":122,"text":1179},"security","2025-12-09","Rollenbasierte Zugriffskontrolle – Docker-Setup und NIS2-konforme Governance-Automatisierung.","md",null,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659561/Blog/Hero%20Images/securitycheck.png",{},"/de-de/blog/automating-role-based-access-control-rbac-at-scale",{"noIndex":1221,"title":5,"description":1214},false,"automating-role-based-access-control-rbac-at-scale","de-de/blog/automating-role-based-access-control-rbac-at-scale",[1212],"BlogPost","_4bp5HBIwg3crHQuVDnFJSvoOxs6mAMp2RfNsSVJDDc",{"logo":1228,"freeTrial":1233,"sales":1238,"login":1243,"items":1248,"search":1576,"minimal":1610,"duo":1628,"switchNav":1637,"pricingDeployment":1648},{"config":1229},{"href":1230,"dataGaName":1231,"dataGaLocation":1232},"/de-de/","gitlab logo","header",{"text":1234,"config":1235},"Kostenlose Testversion anfordern",{"href":1236,"dataGaName":1237,"dataGaLocation":1232},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de&glm_content=default-saas-trial/","free trial",{"text":1239,"config":1240},"Demo anfordern",{"href":1241,"dataGaName":1242,"dataGaLocation":1232},"/de-de/sales/?contact-topic=request-demo","sales",{"text":1244,"config":1245},"Anmelden",{"href":1246,"dataGaName":1247,"dataGaLocation":1232},"https://gitlab.com/users/sign_in/","sign in",[1249,1277,1379,1384,1498,1554],{"text":1250,"config":1251,"menu":1253},"Plattform",{"dataNavLevelOne":1252},"platform",{"type":1254,"columns":1255},"cards",[1256,1262,1270],{"title":1250,"description":1257,"link":1258},"Die intelligente Orchestrierungsplattform für DevSecOps",{"text":1259,"config":1260},"Die Plattform erkunden",{"href":1261,"dataGaName":1252,"dataGaLocation":1232},"/de-de/platform/",{"title":1263,"description":1264,"link":1265},"GitLab Duo Agent Platform","Agentische KI für den gesamten Software-Lebenszyklus",{"text":1266,"config":1267},"Lerne GitLab Duo kennen",{"href":1268,"dataGaName":1269,"dataGaLocation":1232},"/de-de/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1169,"description":1271,"link":1272},"Erfahre, warum sich Unternehmen für GitLab entscheiden",{"text":1273,"config":1274},"Mehr erfahren",{"href":1275,"dataGaName":1276,"dataGaLocation":1232},"/de-de/why-gitlab/","why gitlab",{"text":1278,"left":118,"config":1279,"menu":1281},"Produkt",{"dataNavLevelOne":1280},"solutions",{"type":1282,"link":1283,"columns":1287,"feature":1358},"lists",{"text":1284,"config":1285},"Alle Lösungen anzeigen",{"href":1286,"dataGaName":1280,"dataGaLocation":1232},"/de-de/solutions/",[1288,1313,1336],{"title":1289,"description":1290,"link":1291,"items":1296},"Automatisierung","CI/CD und Automatisierung zur Beschleunigung der Bereitstellung",{"config":1292},{"icon":1293,"href":1294,"dataGaName":1295,"dataGaLocation":1232},"AutomatedCodeAlt","/de-de/solutions/delivery-automation/","automated software delivery",[1297,1301,1304,1309],{"text":1298,"config":1299},"CI/CD",{"href":1300,"dataGaLocation":1232,"dataGaName":1298},"/de-de/solutions/continuous-integration/",{"text":1263,"config":1302},{"href":1268,"dataGaLocation":1232,"dataGaName":1303},"gitlab duo agent platform - product menu",{"text":1305,"config":1306},"Quellcodeverwaltung",{"href":1307,"dataGaLocation":1232,"dataGaName":1308},"/de-de/solutions/source-code-management/","Source Code Management",{"text":1310,"config":1311},"Automatische Softwarebereitstellung",{"href":1294,"dataGaLocation":1232,"dataGaName":1312},"Automated software delivery",{"title":1314,"description":1315,"link":1316,"items":1321},"Sicherheit","Entwickle Code schneller ohne Abstriche bei der Sicherheit",{"config":1317},{"href":1318,"dataGaName":1319,"dataGaLocation":1232,"icon":1320},"/de-de/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1322,1326,1331],{"text":1323,"config":1324},"Anwendungssicherheitstests",{"href":1318,"dataGaName":1325,"dataGaLocation":1232},"Application security testing",{"text":1327,"config":1328},"Schutz der Software-Lieferkette",{"href":1329,"dataGaLocation":1232,"dataGaName":1330},"/de-de/solutions/supply-chain/","Software supply chain security",{"text":1332,"config":1333},"Software-Compliance",{"href":1334,"dataGaName":1335,"dataGaLocation":1232},"/de-de/solutions/software-compliance/","software compliance",{"title":1337,"link":1338,"items":1343},"Messung",{"config":1339},{"icon":1340,"href":1341,"dataGaName":1342,"dataGaLocation":1232},"DigitalTransformation","/de-de/solutions/visibility-measurement/","visibility and measurement",[1344,1348,1353],{"text":1345,"config":1346},"Sichtbarkeit und Messung",{"href":1341,"dataGaLocation":1232,"dataGaName":1347},"Visibility and Measurement",{"text":1349,"config":1350},"Wertstrommanagement",{"href":1351,"dataGaLocation":1232,"dataGaName":1352},"/de-de/solutions/value-stream-management/","Value Stream Management",{"text":1354,"config":1355},"Analysen und Einblicke",{"href":1356,"dataGaLocation":1232,"dataGaName":1357},"/de-de/solutions/analytics-and-insights/","Analytics and insights",{"title":1359,"type":1282,"items":1360},"GitLab für",[1361,1367,1373],{"text":1362,"config":1363},"Enterprise",{"icon":1364,"href":1365,"dataGaLocation":1232,"dataGaName":1366},"Building","/de-de/enterprise/","enterprise",{"text":1368,"config":1369},"Kleinunternehmen",{"icon":1370,"href":1371,"dataGaLocation":1232,"dataGaName":1372},"Work","/de-de/small-business/","small business",{"text":1374,"config":1375},"Öffentlicher Sektor",{"icon":1376,"href":1377,"dataGaLocation":1232,"dataGaName":1378},"Organization","/de-de/solutions/public-sector/","public sector",{"text":1380,"config":1381},"Preise",{"href":1382,"dataGaName":1383,"dataGaLocation":1232,"dataNavLevelOne":1383},"/de-de/pricing/","pricing",{"text":1385,"config":1386,"menu":1388},"Ressourcen",{"dataNavLevelOne":1387},"resources",{"type":1282,"link":1389,"columns":1393,"feature":1487},{"text":1390,"config":1391},"Alle Ressourcen anzeigen",{"href":1392,"dataGaName":1387,"dataGaLocation":1232},"/de-de/resources/",[1394,1427,1454],{"title":1395,"items":1396},"Erste Schritte",[1397,1402,1407,1412,1417,1422],{"text":1398,"config":1399},"Installieren",{"href":1400,"dataGaName":1401,"dataGaLocation":1232},"/de-de/install/","install",{"text":1403,"config":1404},"Kurzanleitungen",{"href":1405,"dataGaName":1406,"dataGaLocation":1232},"/de-de/get-started/","quick setup checklists",{"text":1408,"config":1409},"Lernen",{"href":1410,"dataGaLocation":1232,"dataGaName":1411},"https://university.gitlab.com/","learn",{"text":1413,"config":1414},"Produktdokumentation",{"href":1415,"dataGaName":1416,"dataGaLocation":1232},"https://docs.gitlab.com/","product documentation",{"text":1418,"config":1419},"Best-Practice-Videos",{"href":1420,"dataGaName":1421,"dataGaLocation":1232},"/de-de/getting-started-videos/","best practice videos",{"text":1423,"config":1424},"Integrationen",{"href":1425,"dataGaName":1426,"dataGaLocation":1232},"/de-de/integrations/","integrations",{"title":1428,"items":1429},"Entdecken",[1430,1435,1440,1445,1449],{"text":1431,"config":1432},"Kundenerfolge",{"href":1433,"dataGaName":1434,"dataGaLocation":1232},"/de-de/customers/","customer success stories",{"text":1436,"config":1437},"Blog",{"href":1438,"dataGaName":1439,"dataGaLocation":1232},"/de-de/blog/","blog",{"text":1441,"config":1442},"Demo-Hub",{"href":1443,"dataGaName":1444,"dataGaLocation":1232},"/de-de/demo-hub/","demo hub",{"text":1446,"config":1447},"The Source",{"href":1448,"dataGaName":1439,"dataGaLocation":1232},"/de-de/the-source/",{"text":1450,"config":1451},"Remote",{"href":1452,"dataGaName":1453,"dataGaLocation":1232},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1455,"items":1456},"Vernetzen",[1457,1462,1467,1472,1477,1482],{"text":1458,"config":1459},"GitLab-Services",{"href":1460,"dataGaName":1461,"dataGaLocation":1232},"/de-de/services/","services",{"text":1463,"config":1464},"Beitragen",{"href":1465,"dataGaName":1466,"dataGaLocation":1232},"https://contributors.gitlab.com","contribute",{"text":1468,"config":1469},"Community",{"href":1470,"dataGaName":1471,"dataGaLocation":1232},"/community/","community",{"text":1473,"config":1474},"Forum",{"href":1475,"dataGaName":1476,"dataGaLocation":1232},"https://forum.gitlab.com/","forum",{"text":1478,"config":1479},"Veranstaltungen",{"href":1480,"dataGaName":1481,"dataGaLocation":1232},"/events/","events",{"text":1483,"config":1484},"Partner",{"href":1485,"dataGaName":1486,"dataGaLocation":1232},"/de-de/partners/","partners",{"config":1488,"title":1491,"text":1492,"link":1493},{"background":1489,"textColor":1490},"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":1494,"config":1495},"Aktuelle Nachrichten",{"href":1496,"dataGaName":1497,"dataGaLocation":1232},"/de-de/whats-new/","whats new",{"text":1499,"config":1500,"menu":1502},"Unternehmen",{"dataNavLevelOne":1501},"company",{"type":1282,"columns":1503},[1504],{"items":1505},[1506,1511,1517,1519,1524,1529,1534,1539,1544,1549],{"text":1507,"config":1508},"Über",{"href":1509,"dataGaName":1510,"dataGaLocation":1232},"/de-de/company/","about",{"text":1512,"config":1513,"footerGa":1516},"Karriere",{"href":1514,"dataGaName":1515,"dataGaLocation":1232},"/jobs/","jobs",{"dataGaName":1515},{"text":1478,"config":1518},{"href":1480,"dataGaName":1481,"dataGaLocation":1232},{"text":1520,"config":1521},"Geschäftsführung",{"href":1522,"dataGaName":1523,"dataGaLocation":1232},"/company/team/e-group/","leadership",{"text":1525,"config":1526},"Handbuch",{"href":1527,"dataGaName":1528,"dataGaLocation":1232},"https://handbook.gitlab.com/","handbook",{"text":1530,"config":1531},"Investor Relations",{"href":1532,"dataGaName":1533,"dataGaLocation":1232},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1535,"config":1536},"Trust Center",{"href":1537,"dataGaName":1538,"dataGaLocation":1232},"/de-de/security/","trust center",{"text":1540,"config":1541},"AI Transparency Center",{"href":1542,"dataGaName":1543,"dataGaLocation":1232},"/de-de/ai-transparency-center/","ai transparency center",{"text":1545,"config":1546},"Newsletter",{"href":1547,"dataGaName":1548,"dataGaLocation":1232},"/company/contact/#contact-forms","newsletter",{"text":1550,"config":1551},"Presse",{"href":1552,"dataGaName":1553,"dataGaLocation":1232},"/press/","press",{"text":1555,"config":1556,"menu":1557},"Kontakt",{"dataNavLevelOne":1501},{"type":1282,"columns":1558},[1559],{"items":1560},[1561,1566,1571],{"text":1562,"config":1563},"Vertrieb kontaktieren",{"href":1564,"dataGaName":1565,"dataGaLocation":1232},"/de-de/sales/","talk to sales",{"text":1567,"config":1568},"Support-Portal",{"href":1569,"dataGaName":1570,"dataGaLocation":1232},"https://support.gitlab.com/hc/en-us","support portal",{"text":1572,"config":1573},"Kundenportal",{"href":1574,"dataGaName":1575,"dataGaLocation":1232},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1577,"login":1578,"suggestions":1585},"Schließen",{"text":1579,"link":1580},"Um Repositorys und Projekte zu durchsuchen, melde dich an bei",{"text":1581,"config":1582},"gitlab.com",{"href":1246,"dataGaName":1583,"dataGaLocation":1584},"search login","search",{"text":1586,"default":1587},"Vorschläge",[1588,1590,1595,1597,1602,1607],{"text":1263,"config":1589},{"href":1268,"dataGaName":1263,"dataGaLocation":1584},{"text":1591,"config":1592},"Codevorschläge (KI)",{"href":1593,"dataGaName":1594,"dataGaLocation":1584},"/de-de/solutions/code-suggestions/","Code Suggestions (AI)",{"text":1298,"config":1596},{"href":1300,"dataGaName":1298,"dataGaLocation":1584},{"text":1598,"config":1599},"GitLab auf AWS",{"href":1600,"dataGaName":1601,"dataGaLocation":1584},"/de-de/partners/technology-partners/aws/","GitLab on AWS",{"text":1603,"config":1604},"GitLab auf Google Cloud",{"href":1605,"dataGaName":1606,"dataGaLocation":1584},"/de-de/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":1169,"config":1608},{"href":1275,"dataGaName":1609,"dataGaLocation":1584},"Why GitLab?",{"freeTrial":1611,"mobileIcon":1616,"desktopIcon":1621,"secondaryButton":1624},{"text":1612,"config":1613},"Kostenlos testen",{"href":1614,"dataGaName":1237,"dataGaLocation":1615},"https://gitlab.com/-/trials/new/","nav",{"altText":1617,"config":1618},"GitLab-Symbol",{"src":1619,"dataGaName":1620,"dataGaLocation":1615},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1617,"config":1622},{"src":1623,"dataGaName":1620,"dataGaLocation":1615},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1395,"config":1625},{"href":1626,"dataGaName":1627,"dataGaLocation":1615},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de/get-started/","get started",{"freeTrial":1629,"mobileIcon":1633,"desktopIcon":1635},{"text":1630,"config":1631},"Mehr über GitLab Duo erfahren",{"href":1268,"dataGaName":1632,"dataGaLocation":1615},"gitlab duo",{"altText":1617,"config":1634},{"src":1619,"dataGaName":1620,"dataGaLocation":1615},{"altText":1617,"config":1636},{"src":1623,"dataGaName":1620,"dataGaLocation":1615},{"button":1638,"mobileIcon":1643,"desktopIcon":1645},{"text":1639,"config":1640},"/Option",{"href":1641,"dataGaName":1642,"dataGaLocation":1615},"#contact","switch",{"altText":1617,"config":1644},{"src":1619,"dataGaName":1620,"dataGaLocation":1615},{"altText":1617,"config":1646},{"src":1647,"dataGaName":1620,"dataGaLocation":1615},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1649,"mobileIcon":1654,"desktopIcon":1656},{"text":1650,"config":1651},"Zurück zur Preisübersicht",{"href":1382,"dataGaName":1652,"dataGaLocation":1615,"icon":1653},"back to pricing","GoBack",{"altText":1617,"config":1655},{"src":1619,"dataGaName":1620,"dataGaLocation":1615},{"altText":1617,"config":1657},{"src":1623,"dataGaName":1620,"dataGaLocation":1615},{"title":1659,"button":1660,"config":1664},"GitLab Orbit ist da: die Kontextebene für KI-Agenten",{"text":1273,"config":1661},{"href":1662,"dataGaName":1663,"dataGaLocation":1232},"/de-de/gitlab-orbit/","orbit",{"layout":1665,"disabled":1221},"release",{"data":1667},{"text":1668,"source":1669,"edit":1675,"contribute":1680,"config":1685,"items":1690,"minimal":1896},"Git ist eine Marke von Software Freedom Conservancy und unsere Verwendung von „GitLab“ erfolgt unter Lizenz.",{"text":1670,"config":1671},"Quelltext der Seite anzeigen",{"href":1672,"dataGaName":1673,"dataGaLocation":1674},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1676,"config":1677},"Diese Seite bearbeiten",{"href":1678,"dataGaName":1679,"dataGaLocation":1674},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1681,"config":1682},"Beteilige dich",{"href":1683,"dataGaName":1684,"dataGaLocation":1674},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1686,"facebook":1687,"youtube":1688,"linkedin":1689},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1691,1736,1789,1831,1863],{"title":1380,"links":1692,"subMenu":1707},[1693,1697,1702],{"text":1694,"config":1695},"Tarife anzeigen",{"href":1382,"dataGaName":1696,"dataGaLocation":1674},"view plans",{"text":1698,"config":1699},"Vorteile von Premium",{"href":1700,"dataGaName":1701,"dataGaLocation":1674},"/de-de/pricing/premium/","why premium",{"text":1703,"config":1704},"Vorteile von Ultimate",{"href":1705,"dataGaName":1706,"dataGaLocation":1674},"/de-de/pricing/ultimate/","why ultimate",[1708],{"title":1555,"links":1709},[1710,1712,1714,1716,1721,1726,1731],{"text":1562,"config":1711},{"href":1564,"dataGaName":1242,"dataGaLocation":1674},{"text":1567,"config":1713},{"href":1569,"dataGaName":1570,"dataGaLocation":1674},{"text":1572,"config":1715},{"href":1574,"dataGaName":1575,"dataGaLocation":1674},{"text":1717,"config":1718},"Status",{"href":1719,"dataGaName":1720,"dataGaLocation":1674},"https://status.gitlab.com/","status",{"text":1722,"config":1723},"Nutzungsbedingungen",{"href":1724,"dataGaName":1725,"dataGaLocation":1674},"/terms/","terms of use",{"text":1727,"config":1728},"Datenschutzerklärung",{"href":1729,"dataGaName":1730,"dataGaLocation":1674},"/de-de/privacy/","privacy statement",{"text":1732,"config":1733},"Cookie-Einstellungen",{"dataGaName":1734,"dataGaLocation":1674,"id":1735,"isOneTrustButton":118},"cookie preferences","ot-sdk-btn",{"title":1278,"links":1737,"subMenu":1746},[1738,1742],{"text":1739,"config":1740},"DevSecOps-Plattform",{"href":1261,"dataGaName":1741,"dataGaLocation":1674},"devsecops platform",{"text":1743,"config":1744},"KI-unterstützte Entwicklung",{"href":1268,"dataGaName":1745,"dataGaLocation":1674},"ai-assisted development",[1747],{"title":1748,"links":1749},"Themen",[1750,1754,1759,1764,1769,1774,1779,1784],{"text":1298,"config":1751},{"href":1752,"dataGaName":1753,"dataGaLocation":1674},"/de-de/topics/ci-cd/","cicd",{"text":1755,"config":1756},"GitOps",{"href":1757,"dataGaName":1758,"dataGaLocation":1674},"/de-de/topics/gitops/","gitops",{"text":1760,"config":1761},"DevOps",{"href":1762,"dataGaName":1763,"dataGaLocation":1674},"/de-de/topics/devops/","devops",{"text":1765,"config":1766},"Versionskontrolle",{"href":1767,"dataGaName":1768,"dataGaLocation":1674},"/de-de/topics/version-control/","version control",{"text":1770,"config":1771},"DevSecOps",{"href":1772,"dataGaName":1773,"dataGaLocation":1674},"/de-de/topics/devsecops/","devsecops",{"text":1775,"config":1776},"Cloud-nativ",{"href":1777,"dataGaName":1778,"dataGaLocation":1674},"/de-de/topics/cloud-native/","cloud native",{"text":1780,"config":1781},"KI für das Programmieren",{"href":1782,"dataGaName":1783,"dataGaLocation":1674},"/de-de/topics/devops/ai-for-coding/","ai for coding",{"text":1785,"config":1786},"Agentische KI",{"href":1787,"dataGaName":1788,"dataGaLocation":1674},"/de-de/topics/agentic-ai/","agentic ai",{"title":1790,"links":1791},"Lösungen",[1792,1795,1797,1802,1806,1809,1812,1815,1817,1819,1821,1826],{"text":1323,"config":1793},{"href":1318,"dataGaName":1794,"dataGaLocation":1674},"Application Security Testing",{"text":1310,"config":1796},{"href":1294,"dataGaName":1295,"dataGaLocation":1674},{"text":1798,"config":1799},"Agile Entwicklung",{"href":1800,"dataGaName":1801,"dataGaLocation":1674},"/de-de/solutions/agile-delivery/","agile delivery",{"text":1803,"config":1804},"SCM",{"href":1307,"dataGaName":1805,"dataGaLocation":1674},"source code management",{"text":1298,"config":1807},{"href":1300,"dataGaName":1808,"dataGaLocation":1674},"continuous integration & delivery",{"text":1349,"config":1810},{"href":1351,"dataGaName":1811,"dataGaLocation":1674},"value stream management",{"text":1755,"config":1813},{"href":1814,"dataGaName":1758,"dataGaLocation":1674},"/de-de/solutions/gitops/",{"text":1362,"config":1816},{"href":1365,"dataGaName":1366,"dataGaLocation":1674},{"text":1368,"config":1818},{"href":1371,"dataGaName":1372,"dataGaLocation":1674},{"text":1374,"config":1820},{"href":1377,"dataGaName":1378,"dataGaLocation":1674},{"text":1822,"config":1823},"Bildungswesen",{"href":1824,"dataGaName":1825,"dataGaLocation":1674},"/de-de/solutions/education/","education",{"text":1827,"config":1828},"Finanzdienstleistungen",{"href":1829,"dataGaName":1830,"dataGaLocation":1674},"/de-de/solutions/finance/","financial services",{"title":1385,"links":1832},[1833,1835,1837,1839,1842,1844,1847,1849,1851,1853,1855,1857,1859,1861],{"text":1398,"config":1834},{"href":1400,"dataGaName":1401,"dataGaLocation":1674},{"text":1403,"config":1836},{"href":1405,"dataGaName":1406,"dataGaLocation":1674},{"text":1408,"config":1838},{"href":1410,"dataGaName":1411,"dataGaLocation":1674},{"text":1413,"config":1840},{"href":1415,"dataGaName":1841,"dataGaLocation":1674},"docs",{"text":1436,"config":1843},{"href":1438,"dataGaName":1439,"dataGaLocation":1674},{"text":1845,"config":1846},"Neuerungen",{"href":1496,"dataGaName":1497,"dataGaLocation":1674},{"text":1431,"config":1848},{"href":1433,"dataGaName":1434,"dataGaLocation":1674},{"text":1450,"config":1850},{"href":1452,"dataGaName":1453,"dataGaLocation":1674},{"text":1458,"config":1852},{"href":1460,"dataGaName":1461,"dataGaLocation":1674},{"text":1463,"config":1854},{"href":1465,"dataGaName":1466,"dataGaLocation":1674},{"text":1468,"config":1856},{"href":1470,"dataGaName":1471,"dataGaLocation":1674},{"text":1473,"config":1858},{"href":1475,"dataGaName":1476,"dataGaLocation":1674},{"text":1478,"config":1860},{"href":1480,"dataGaName":1481,"dataGaLocation":1674},{"text":1483,"config":1862},{"href":1485,"dataGaName":1486,"dataGaLocation":1674},{"title":1499,"links":1864},[1865,1867,1869,1871,1873,1875,1880,1885,1887,1889,1891],{"text":1507,"config":1866},{"href":1509,"dataGaName":1501,"dataGaLocation":1674},{"text":1512,"config":1868},{"href":1514,"dataGaName":1515,"dataGaLocation":1674},{"text":1520,"config":1870},{"href":1522,"dataGaName":1523,"dataGaLocation":1674},{"text":1525,"config":1872},{"href":1527,"dataGaName":1528,"dataGaLocation":1674},{"text":1530,"config":1874},{"href":1532,"dataGaName":1533,"dataGaLocation":1674},{"text":1876,"config":1877},"Nachhaltigkeit",{"href":1878,"dataGaName":1879,"dataGaLocation":1674},"/sustainability/","Sustainability",{"text":1881,"config":1882},"Vielfalt, Inklusion und Zugehörigkeit",{"href":1883,"dataGaName":1884,"dataGaLocation":1674},"/de-de/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1535,"config":1886},{"href":1537,"dataGaName":1538,"dataGaLocation":1674},{"text":1545,"config":1888},{"href":1547,"dataGaName":1548,"dataGaLocation":1674},{"text":1550,"config":1890},{"href":1552,"dataGaName":1553,"dataGaLocation":1674},{"text":1892,"config":1893},"Transparenzerklärung zu moderner Sklaverei",{"href":1894,"dataGaName":1895,"dataGaLocation":1674},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1897},[1898,1901,1904],{"text":1899,"config":1900},"Terms",{"href":1724,"dataGaName":1725,"dataGaLocation":1674},{"text":1902,"config":1903},"Cookies",{"dataGaName":1734,"dataGaLocation":1674,"id":1735,"isOneTrustButton":118},{"text":1905,"config":1906},"Datenschutz",{"href":1729,"dataGaName":1730,"dataGaLocation":1674},[1908,1922,1934],{"id":1909,"title":7,"body":1216,"config":1910,"content":1912,"description":1216,"extension":1916,"meta":1917,"navigation":118,"path":1918,"seo":1919,"stem":1920,"__hash__":1921},"blogAuthors/en-us/blog/authors/james-wormwell.yml",{"template":1911},"BlogAuthor",{"name":7,"config":1913},{"headshot":1914,"ctfId":1915},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659474/Blog/Author%20Headshots/james_wormwell_headshot.png","CPPijHb0Op5C5aVcvsOEf","yml",{},"/en-us/blog/authors/james-wormwell",{},"en-us/blog/authors/james-wormwell","n6G4XENUWxgqOdCgfG0ECu0Uqj7qOS9zr3Rl8ouF49M",{"id":1923,"title":8,"body":1216,"config":1924,"content":1926,"description":1216,"extension":1916,"meta":1929,"navigation":118,"path":1930,"seo":1931,"stem":1932,"__hash__":1933},"blogAuthors/en-us/blog/authors/paul-meresanu.yml",{"template":1911,"gitlabHandle":1925},"pmeresanu",{"name":8,"role":107,"config":1927},{"headshot":1928},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1750267141/qpw5ayteg0sewyh7s8xi.png",{},"/en-us/blog/authors/paul-meresanu",{},"en-us/blog/authors/paul-meresanu","S41feQ9U81y4EVDx5pEECPqpIEiKTCDLBOmNwjLyE1E",{"id":1935,"title":9,"body":1216,"config":1936,"content":1937,"description":1216,"extension":1916,"meta":1941,"navigation":118,"path":1942,"seo":1943,"stem":1944,"__hash__":1945},"blogAuthors/en-us/blog/authors/kees-valkhof.yml",{"template":1911},{"name":9,"role":1938,"config":1939},"Configuration manager at Lely",{"headshot":1940},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1750331281/xojwtvpk5pif84wlahx1.jpg",{},"/en-us/blog/authors/kees-valkhof",{},"en-us/blog/authors/kees-valkhof","CUxOh-7QjB6WokGlmdFbfR45LKv0C3d1tHGfi-KIveg",[1947,1955,1963],{"title":1948,"description":1949,"heroImage":1950,"category":1212,"date":1951,"authors":1952,"slug":1954,"externalUrl":1216},"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",[1953],"Julian Thome","improved-scope-offset-fingerprinting",{"title":1956,"description":1957,"heroImage":1950,"category":1212,"date":1958,"authors":1959,"slug":1962,"externalUrl":1216},"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",[1960,1961],"Erick Bajao","Joe Randazzo","gitlab-secrets-manager-add-eso-terraform-api-support",{"title":1964,"description":1965,"heroImage":1966,"category":1212,"date":1967,"authors":1968,"slug":1970,"externalUrl":1216},"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",[1969],"Alisa Ho","claude-security-and-gitlab",{"promotions":1972},[1973,1987,1999,2010],{"id":1974,"categories":1975,"header":1977,"text":1978,"button":1979,"image":1984},"ai-modernization",[1976],"ai","Hält KI, was uns versprochen wurde?","Das Quiz dauert maximal 5 Minuten.",{"text":1980,"config":1981},"Ermittle deinen KI-Reifegrad",{"href":1982,"dataGaName":1983,"dataGaLocation":1439},"/de-de/assessments/ai-modernization-assessment/","modernization assessment",{"config":1985},{"src":1986},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1988,"categories":1989,"header":1991,"text":1978,"button":1992,"image":1996},"devops-modernization",[1990,1773],"product","Verwaltest du Tool-Chaos oder stellst du Innovationen bereit?",{"text":1993,"config":1994},"Ermittle deinen DevOps-Reifegrad",{"href":1995,"dataGaName":1983,"dataGaLocation":1439},"/de-de/assessments/devops-modernization-assessment/",{"config":1997},{"src":1998},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":2000,"categories":2001,"header":2002,"text":1978,"button":2003,"image":2007},"security-modernization",[1212],"Tauschst du Schnelligkeit gegen Sicherheit ein?",{"text":2004,"config":2005},"Ermittle deinen Sicherheitsreifegrad",{"href":2006,"dataGaName":1983,"dataGaLocation":1439},"/de-de/assessments/security-modernization-assessment/",{"config":2008},{"src":2009},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":2011,"paths":2012,"header":2015,"text":2016,"button":2017,"image":2022},"github-azure-migration",[2013,2014],"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":2018,"config":2019},"Erfahre, wie GitLab im Vergleich zu GitHub abschneidet",{"href":2020,"dataGaName":2021,"dataGaLocation":1439},"/de-de/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":2023},{"src":1998},{"header":2025,"blurb":2026,"button":2027,"secondaryButton":2032},"Beginne noch heute, schneller zu entwickeln","Entdecke, was dein Team mit der intelligenten Orchestrierungsplattform für DevSecOps erreichen kann.\n",{"text":2028,"config":2029},"Kostenlosen Test starten",{"href":2030,"dataGaName":1237,"dataGaLocation":2031},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/de-de/","feature",{"text":1562,"config":2033},{"href":1564,"dataGaName":1242,"dataGaLocation":2031},1786803738417]