[{"data":1,"prerenderedAt":2363},["ShallowReactive",2],{"/de-de/blog/gitlab-secrets-manager-add-eso-terraform-api-support":3,"navigation-de-de":1571,"banner-de-de":2002,"footer-de-de":2010,"blog-post-authors-de-de-Erick Bajao|Joe Randazzo":2251,"blog-related-posts-de-de-gitlab-secrets-manager-add-eso-terraform-api-support":2277,"blog-promotions-de-de":2301,"next-steps-de-de":2353},{"id":4,"title":5,"authors":6,"body":9,"category":1551,"date":1552,"description":1553,"extension":1554,"externalUrl":1555,"faq":1555,"featured":558,"heroImage":1556,"meta":1557,"navigation":558,"path":1558,"seo":1559,"slug":1564,"stem":1565,"tags":1566,"template":1569,"updatedDate":1555,"__hash__":1570},"blogPosts/de-de/blog/gitlab-secrets-manager-add-eso-terraform-api-support.md","GitLab Secrets Manager unterstützt ESO, Terraform und API",[7,8],"Erick Bajao","Joe Randazzo",{"type":10,"value":11,"toc":1544},"minimark",[12,16,32,56,61,64,71,80,304,312,315,466,475,479,489,906,915,919,922,1046,1050,1063,1506,1510,1518,1527,1540],[13,14,15],"p",{},"Heutzutage laufen oftmals Secret-Stores für CI/CD, Kubernetes und Terraform unabhängig nebeneinander. Das bedeutet allerdings: mehr Werkzeuge verwalten, Zugriffsmodelle synchron halten und im Fehlerfall Audit-Trails aus verschiedenen Quellen zusammenführen.",[13,17,18,19,25,26,31],{},"GitLab Secrets Manager unterstützt jetzt den External Secrets Operator (ESO) und Terraform und erweitert damit ",[20,21,24],"a",{"href":22,"rel":23},"https://docs.gitlab.com/ci/secrets/secrets_manager/non_cicd_access/",[],"den sicheren Abruf von Secrets über CI/CD-Pipelines hinaus",". Auf Basis von OpenBao bietet GitLab Secrets Manager ",[20,27,30],{"href":28,"rel":29},"https://about.gitlab.com/de-de/the-source/security/how-to-implement-secret-management-best-practices-with-gitlab/",[],"eine einzige verlässliche Quelle für Secrets"," entlang der gesamten Software-Delivery-Kette. Derselbe Secret-Store bedient jetzt:",[33,34,35,39,42,45,48],"ul",{},[36,37,38],"li",{},"Kubernetes-Workloads über ESO",[36,40,41],{},"Terraform- oder OpenTofu-Runs",[36,43,44],{},"OpenBao- oder Vault-CLI",[36,46,47],{},"CI/CD-Jobs in GitLab (ab Version 19.0)",[36,49,50,51],{},"jede externe Automatisierung über die ",[20,52,55],{"href":53,"rel":54},"https://docs.gitlab.com/api/secrets_manager/",[],"Secrets Manager API",[57,58,60],"h3",{"id":59},"kubernetes-external-secrets-operator","Kubernetes: External Secrets Operator",[13,62,63],{},"ESO synchronisiert Secrets aus GitLab Secrets Manager über den Vault-Provider. Ein Workload im Cluster hält ein kurzlebiges JSON Web Token (JWT). Damit authentifiziert sich ESO bei OpenBao und schreibt das Secret in ein Kubernetes Secret.",[13,65,66],{},[67,68],"img",{"alt":69,"src":70},"External Secrets Operator","https://res.cloudinary.com/about-gitlab-com/image/upload/v1785953823/ojlr4rv1r34oflo4fynv.png",[13,72,73,74,79],{},"Ein ",[20,75,78],{"href":76,"rel":77},"https://external-secrets.io/latest/api/secretstore/",[],"SecretStore"," legt fest, woher ESO Secrets bezieht und wie authentifiziert wird. GitLab Secrets Manager stellt eine Vault-kompatible KV-v2-API bereit, die sich über den Vault-Provider konfigurieren lässt. Das Feld namespace bildet die GitLab-Hierarchie ab (Organisation, Gruppe, Projekt) und grenzt ein, welche Secrets dieser Store erreichen kann. Die Authentifizierung nutzt ein von GitLab ausgestelltes JWT, das in einem Kubernetes Secret liegt und über secretRef referenziert wird.",[81,82,87],"pre",{"className":83,"code":84,"language":85,"meta":86,"style":86},"language-yaml shiki shiki-themes github-light","apiVersion: external-secrets.io/v1\nkind: SecretStore\nmetadata:\n  name: gitlab-secrets-manager\n  namespace: my-app\nspec:\n  provider:\n    vault:\n      server: https://secrets.gitlab.com      # provider.vault.server\n      path: secrets/kv                        # provider.vault.path\n      version: v2\n      namespace: org_5/group_42/project_99    # provider.vault.namespace\n      auth:\n        jwt:\n          path: api_jwt/cel                   # provider.vault.auth.jwt.path\n          role: all_api                       # provider.vault.auth.jwt.role\n          secretRef:\n            name: gitlab-access-token         # Kubernetes secret holding the minted token\n            key: token\n","yaml","",[88,89,90,107,118,127,138,149,157,165,173,188,202,213,227,235,243,257,271,279,293],"code",{"__ignoreMap":86},[91,92,95,99,103],"span",{"class":93,"line":94},"line",1,[91,96,98],{"class":97},"shJU0","apiVersion",[91,100,102],{"class":101},"sgsFI",": ",[91,104,106],{"class":105},"sYBdl","external-secrets.io/v1\n",[91,108,110,113,115],{"class":93,"line":109},2,[91,111,112],{"class":97},"kind",[91,114,102],{"class":101},[91,116,117],{"class":105},"SecretStore\n",[91,119,121,124],{"class":93,"line":120},3,[91,122,123],{"class":97},"metadata",[91,125,126],{"class":101},":\n",[91,128,130,133,135],{"class":93,"line":129},4,[91,131,132],{"class":97},"  name",[91,134,102],{"class":101},[91,136,137],{"class":105},"gitlab-secrets-manager\n",[91,139,141,144,146],{"class":93,"line":140},5,[91,142,143],{"class":97},"  namespace",[91,145,102],{"class":101},[91,147,148],{"class":105},"my-app\n",[91,150,152,155],{"class":93,"line":151},6,[91,153,154],{"class":97},"spec",[91,156,126],{"class":101},[91,158,160,163],{"class":93,"line":159},7,[91,161,162],{"class":97},"  provider",[91,164,126],{"class":101},[91,166,168,171],{"class":93,"line":167},8,[91,169,170],{"class":97},"    vault",[91,172,126],{"class":101},[91,174,176,179,181,184],{"class":93,"line":175},9,[91,177,178],{"class":97},"      server",[91,180,102],{"class":101},[91,182,183],{"class":105},"https://secrets.gitlab.com",[91,185,187],{"class":186},"sAwPA","      # provider.vault.server\n",[91,189,191,194,196,199],{"class":93,"line":190},10,[91,192,193],{"class":97},"      path",[91,195,102],{"class":101},[91,197,198],{"class":105},"secrets/kv",[91,200,201],{"class":186},"                        # provider.vault.path\n",[91,203,205,208,210],{"class":93,"line":204},11,[91,206,207],{"class":97},"      version",[91,209,102],{"class":101},[91,211,212],{"class":105},"v2\n",[91,214,216,219,221,224],{"class":93,"line":215},12,[91,217,218],{"class":97},"      namespace",[91,220,102],{"class":101},[91,222,223],{"class":105},"org_5/group_42/project_99",[91,225,226],{"class":186},"    # provider.vault.namespace\n",[91,228,230,233],{"class":93,"line":229},13,[91,231,232],{"class":97},"      auth",[91,234,126],{"class":101},[91,236,238,241],{"class":93,"line":237},14,[91,239,240],{"class":97},"        jwt",[91,242,126],{"class":101},[91,244,246,249,251,254],{"class":93,"line":245},15,[91,247,248],{"class":97},"          path",[91,250,102],{"class":101},[91,252,253],{"class":105},"api_jwt/cel",[91,255,256],{"class":186},"                   # provider.vault.auth.jwt.path\n",[91,258,260,263,265,268],{"class":93,"line":259},16,[91,261,262],{"class":97},"          role",[91,264,102],{"class":101},[91,266,267],{"class":105},"all_api",[91,269,270],{"class":186},"                       # provider.vault.auth.jwt.role\n",[91,272,274,277],{"class":93,"line":273},17,[91,275,276],{"class":97},"          secretRef",[91,278,126],{"class":101},[91,280,282,285,287,290],{"class":93,"line":281},18,[91,283,284],{"class":97},"            name",[91,286,102],{"class":101},[91,288,289],{"class":105},"gitlab-access-token",[91,291,292],{"class":186},"         # Kubernetes secret holding the minted token\n",[91,294,296,299,301],{"class":93,"line":295},19,[91,297,298],{"class":97},"            key",[91,300,102],{"class":101},[91,302,303],{"class":105},"token\n",[13,305,73,306,311],{},[20,307,310],{"href":308,"rel":309},"https://external-secrets.io/latest/api/externalsecret/",[],"ExternalSecret"," definiert, welche Secrets geholt werden und wohin sie gehören. Es referenziert den zuvor angelegten SecretStore und bildet Remote-Secrets auf ein Kubernetes Secret ab, das Workloads einhängen oder als Umgebungsvariablen referenzieren können.",[13,313,314],{},"ESO erstellt und besitzt das Ziel-Secret (synced-secret) und holt es bei jedem refreshInterval erneut von GitLab, sodass rotierte Werte ohne erneutes Deployment ankommen. Jeder Eintrag unter data bildet ein Remote-Secret auf einen Schlüssel im Ziel ab: remoteRef.key ist der Pfad im GitLab Secrets Manager, property wählt ein Feld innerhalb dieses Secrets aus, und secretKey ist der Schlüssel, unter dem es in Kubernetes landet.",[81,316,318],{"className":83,"code":317,"language":85,"meta":86,"style":86},"apiVersion: external-secrets.io/v1\nkind: ExternalSecret\nmetadata:\n  name: my-secret\n  namespace: my-app\nspec:\n  refreshInterval: 45m\n  secretStoreRef:\n    name: gitlab-secrets-manager\n    kind: SecretStore\n  target:\n    name: synced-secret\n  data:\n    - secretKey: value\n      remoteRef:\n        key: explicit/\u003Csecret_name>           # \u003Csecrets_path>/\u003Csecret_name>\n        property: value\n",[88,319,320,328,337,343,352,360,366,376,383,392,401,408,417,424,437,444,457],{"__ignoreMap":86},[91,321,322,324,326],{"class":93,"line":94},[91,323,98],{"class":97},[91,325,102],{"class":101},[91,327,106],{"class":105},[91,329,330,332,334],{"class":93,"line":109},[91,331,112],{"class":97},[91,333,102],{"class":101},[91,335,336],{"class":105},"ExternalSecret\n",[91,338,339,341],{"class":93,"line":120},[91,340,123],{"class":97},[91,342,126],{"class":101},[91,344,345,347,349],{"class":93,"line":129},[91,346,132],{"class":97},[91,348,102],{"class":101},[91,350,351],{"class":105},"my-secret\n",[91,353,354,356,358],{"class":93,"line":140},[91,355,143],{"class":97},[91,357,102],{"class":101},[91,359,148],{"class":105},[91,361,362,364],{"class":93,"line":151},[91,363,154],{"class":97},[91,365,126],{"class":101},[91,367,368,371,373],{"class":93,"line":159},[91,369,370],{"class":97},"  refreshInterval",[91,372,102],{"class":101},[91,374,375],{"class":105},"45m\n",[91,377,378,381],{"class":93,"line":167},[91,379,380],{"class":97},"  secretStoreRef",[91,382,126],{"class":101},[91,384,385,388,390],{"class":93,"line":175},[91,386,387],{"class":97},"    name",[91,389,102],{"class":101},[91,391,137],{"class":105},[91,393,394,397,399],{"class":93,"line":190},[91,395,396],{"class":97},"    kind",[91,398,102],{"class":101},[91,400,117],{"class":105},[91,402,403,406],{"class":93,"line":204},[91,404,405],{"class":97},"  target",[91,407,126],{"class":101},[91,409,410,412,414],{"class":93,"line":215},[91,411,387],{"class":97},[91,413,102],{"class":101},[91,415,416],{"class":105},"synced-secret\n",[91,418,419,422],{"class":93,"line":229},[91,420,421],{"class":97},"  data",[91,423,126],{"class":101},[91,425,426,429,432,434],{"class":93,"line":237},[91,427,428],{"class":101},"    - ",[91,430,431],{"class":97},"secretKey",[91,433,102],{"class":101},[91,435,436],{"class":105},"value\n",[91,438,439,442],{"class":93,"line":245},[91,440,441],{"class":97},"      remoteRef",[91,443,126],{"class":101},[91,445,446,449,451,454],{"class":93,"line":259},[91,447,448],{"class":97},"        key",[91,450,102],{"class":101},[91,452,453],{"class":105},"explicit/\u003Csecret_name>",[91,455,456],{"class":186},"           # \u003Csecrets_path>/\u003Csecret_name>\n",[91,458,459,462,464],{"class":93,"line":273},[91,460,461],{"class":97},"        property",[91,463,102],{"class":101},[91,465,436],{"class":105},[13,467,468,469,474],{},"Das ",[20,470,473],{"href":471,"rel":472},"https://gitlab.com/guided-explorations/secrets-management/gitlab-secrets-manager-with-eso-and-k3s",[],"Tutorial"," zeigt GitLab Secrets Manager zusammen mit ESO.",[57,476,478],{"id":477},"infrastructure-as-code-terraform-und-opentofu","Infrastructure as Code: Terraform und OpenTofu",[13,480,481,482,485,486,488],{},"Terraform-State und ",[88,483,484],{},".tfvars","-Dateien sind eine häufige Quelle geleakter Zugangsdaten, weil Secrets versehentlich auf der Festplatte landen oder in die Versionskontrolle eingecheckt werden. Terraform kann das vermeiden, indem es ein GitLab-Secret als Data Source liest und sich zum Zeitpunkt von plan oder apply mit einem ausgestellten JWT authentifiziert. Zugangsdaten lassen sich damit direkt in Terraform referenzieren, ohne dass etwas in ",[88,487,484],{},"-Dateien oder CI/CD-Variablen gespeichert wird.",[81,490,494],{"className":491,"code":492,"language":493,"meta":86,"style":86},"language-terraform shiki shiki-themes github-light","data \"external\" \"gitlab_secrets_token\" {\n  program = [\"bash\", \"${path.module}/scripts/mint_token.sh\"]\n\n  query = {\n    project_id = var.gitlab_project_id\n  }\n}\n\nprovider \"vault\" {\n  address   = data.external.gitlab_secrets_token.result.server\n  namespace = data.external.gitlab_secrets_token.result.namespace\n\n  auth_login_jwt {\n    mount = data.external.gitlab_secrets_token.result.auth_path\n    role  = data.external.gitlab_secrets_token.result.role\n    jwt   = data.external.gitlab_secrets_token.result.jwt\n  }\n}\n\ndata \"vault_kv_secret_v2\" \"my_secret\" {\n  mount = data.external.gitlab_secrets_token.result.mount\n  name  = \"${data.external.gitlab_secrets_token.result.secrets_path}/\u003Csecret_name>\"\n}\n\noutput \"secret_value\" {\n  value     = data.vault_kv_secret_v2.my_secret.data[\"value\"]\n  sensitive = true\n}\n","terraform",[88,495,496,512,554,560,569,580,585,590,594,604,635,660,664,671,697,724,750,754,758,762,775,802,838,843,848,859,890,901],{"__ignoreMap":86},[91,497,498,502,506,509],{"class":93,"line":94},[91,499,501],{"class":500},"s7eDp","data",[91,503,505],{"class":504},"sYu0t"," \"external\"",[91,507,508],{"class":504}," \"gitlab_secrets_token\"",[91,510,511],{"class":101}," {\n",[91,513,514,517,521,524,527,530,533,536,539,542,545,548,551],{"class":93,"line":109},[91,515,516],{"class":101},"  program",[91,518,520],{"class":519},"sD7c4"," =",[91,522,523],{"class":101}," [",[91,525,526],{"class":105},"\"bash\"",[91,528,529],{"class":101},", ",[91,531,532],{"class":105},"\"",[91,534,535],{"class":519},"${",[91,537,538],{"class":101},"path",[91,540,541],{"class":519},".",[91,543,544],{"class":101},"module",[91,546,547],{"class":519},"}",[91,549,550],{"class":105},"/scripts/mint_token.sh\"",[91,552,553],{"class":101},"]\n",[91,555,556],{"class":93,"line":120},[91,557,559],{"emptyLinePlaceholder":558},true,"\n",[91,561,562,565,567],{"class":93,"line":129},[91,563,564],{"class":101},"  query",[91,566,520],{"class":519},[91,568,511],{"class":101},[91,570,571,574,577],{"class":93,"line":140},[91,572,573],{"class":101},"    project_id ",[91,575,576],{"class":519},"=",[91,578,579],{"class":101}," var.gitlab_project_id\n",[91,581,582],{"class":93,"line":151},[91,583,584],{"class":101},"  }\n",[91,586,587],{"class":93,"line":159},[91,588,589],{"class":101},"}\n",[91,591,592],{"class":93,"line":167},[91,593,559],{"emptyLinePlaceholder":558},[91,595,596,599,602],{"class":93,"line":175},[91,597,598],{"class":500},"provider",[91,600,601],{"class":504}," \"vault\"",[91,603,511],{"class":101},[91,605,606,609,612,615,617,620,622,625,627,630,632],{"class":93,"line":190},[91,607,608],{"class":101},"  address",[91,610,611],{"class":519},"   =",[91,613,614],{"class":101}," data",[91,616,541],{"class":519},[91,618,619],{"class":101},"external",[91,621,541],{"class":519},[91,623,624],{"class":101},"gitlab_secrets_token",[91,626,541],{"class":519},[91,628,629],{"class":101},"result",[91,631,541],{"class":519},[91,633,634],{"class":101},"server\n",[91,636,637,639,641,643,645,647,649,651,653,655,657],{"class":93,"line":204},[91,638,143],{"class":101},[91,640,520],{"class":519},[91,642,614],{"class":101},[91,644,541],{"class":519},[91,646,619],{"class":101},[91,648,541],{"class":519},[91,650,624],{"class":101},[91,652,541],{"class":519},[91,654,629],{"class":101},[91,656,541],{"class":519},[91,658,659],{"class":101},"namespace\n",[91,661,662],{"class":93,"line":215},[91,663,559],{"emptyLinePlaceholder":558},[91,665,666,669],{"class":93,"line":229},[91,667,668],{"class":500},"  auth_login_jwt",[91,670,511],{"class":101},[91,672,673,676,678,680,682,684,686,688,690,692,694],{"class":93,"line":237},[91,674,675],{"class":101},"    mount",[91,677,520],{"class":519},[91,679,614],{"class":101},[91,681,541],{"class":519},[91,683,619],{"class":101},[91,685,541],{"class":519},[91,687,624],{"class":101},[91,689,541],{"class":519},[91,691,629],{"class":101},[91,693,541],{"class":519},[91,695,696],{"class":101},"auth_path\n",[91,698,699,702,705,707,709,711,713,715,717,719,721],{"class":93,"line":245},[91,700,701],{"class":101},"    role",[91,703,704],{"class":519},"  =",[91,706,614],{"class":101},[91,708,541],{"class":519},[91,710,619],{"class":101},[91,712,541],{"class":519},[91,714,624],{"class":101},[91,716,541],{"class":519},[91,718,629],{"class":101},[91,720,541],{"class":519},[91,722,723],{"class":101},"role\n",[91,725,726,729,731,733,735,737,739,741,743,745,747],{"class":93,"line":259},[91,727,728],{"class":101},"    jwt",[91,730,611],{"class":519},[91,732,614],{"class":101},[91,734,541],{"class":519},[91,736,619],{"class":101},[91,738,541],{"class":519},[91,740,624],{"class":101},[91,742,541],{"class":519},[91,744,629],{"class":101},[91,746,541],{"class":519},[91,748,749],{"class":101},"jwt\n",[91,751,752],{"class":93,"line":273},[91,753,584],{"class":101},[91,755,756],{"class":93,"line":281},[91,757,589],{"class":101},[91,759,760],{"class":93,"line":295},[91,761,559],{"emptyLinePlaceholder":558},[91,763,765,767,770,773],{"class":93,"line":764},20,[91,766,501],{"class":500},[91,768,769],{"class":504}," \"vault_kv_secret_v2\"",[91,771,772],{"class":504}," \"my_secret\"",[91,774,511],{"class":101},[91,776,778,781,783,785,787,789,791,793,795,797,799],{"class":93,"line":777},21,[91,779,780],{"class":101},"  mount",[91,782,520],{"class":519},[91,784,614],{"class":101},[91,786,541],{"class":519},[91,788,619],{"class":101},[91,790,541],{"class":519},[91,792,624],{"class":101},[91,794,541],{"class":519},[91,796,629],{"class":101},[91,798,541],{"class":519},[91,800,801],{"class":101},"mount\n",[91,803,805,807,809,812,814,816,818,820,822,824,826,828,830,833,835],{"class":93,"line":804},22,[91,806,132],{"class":101},[91,808,704],{"class":519},[91,810,811],{"class":105}," \"",[91,813,535],{"class":519},[91,815,501],{"class":101},[91,817,541],{"class":519},[91,819,619],{"class":101},[91,821,541],{"class":519},[91,823,624],{"class":101},[91,825,541],{"class":519},[91,827,629],{"class":101},[91,829,541],{"class":519},[91,831,832],{"class":101},"secrets_path",[91,834,547],{"class":519},[91,836,837],{"class":105},"/\u003Csecret_name>\"\n",[91,839,841],{"class":93,"line":840},23,[91,842,589],{"class":101},[91,844,846],{"class":93,"line":845},24,[91,847,559],{"emptyLinePlaceholder":558},[91,849,851,854,857],{"class":93,"line":850},25,[91,852,853],{"class":500},"output",[91,855,856],{"class":504}," \"secret_value\"",[91,858,511],{"class":101},[91,860,862,865,868,870,872,875,877,880,882,885,888],{"class":93,"line":861},26,[91,863,864],{"class":101},"  value",[91,866,867],{"class":519},"     =",[91,869,614],{"class":101},[91,871,541],{"class":519},[91,873,874],{"class":101},"vault_kv_secret_v2",[91,876,541],{"class":519},[91,878,879],{"class":101},"my_secret",[91,881,541],{"class":519},[91,883,884],{"class":101},"data[",[91,886,887],{"class":105},"\"value\"",[91,889,553],{"class":101},[91,891,893,896,898],{"class":93,"line":892},27,[91,894,895],{"class":101},"  sensitive",[91,897,520],{"class":519},[91,899,900],{"class":504}," true\n",[91,902,904],{"class":93,"line":903},28,[91,905,589],{"class":101},[13,907,908,909,914],{},"Wie sich ",[20,910,913],{"href":911,"rel":912},"https://docs.gitlab.com/ci/secrets/secrets_manager/non_cicd_access/#use-with-terraform",[],"Secrets in Terraform lesen lassen",", zeigt die Dokumentation.",[57,916,918],{"id":917},"kommandozeile-openbao-oder-vault-cli","Kommandozeile: OpenBao- oder Vault-CLI",[13,920,921],{},"Nicht jeder Workflow läuft direkt über die API. Wer ohnehin schon Skripte gegen Vault-kompatible Werkzeuge schreibt, liest mit der OpenBao- oder Vault-CLI Secrets aus GitLab Secrets Manager genauso wie aus Vault.",[81,923,927],{"className":924,"code":925,"language":926,"meta":86,"style":86},"language-shell shiki shiki-themes github-light","export VAULT_ADDR=\"\u003Cserver>\"\nexport VAULT_NAMESPACE=\"\u003Cnamespace>\"\n\n# Exchange the minted JWT for an OpenBao token, then export it.\nvault write \"auth/\u003Cauth_jwt_path>/login\" role=\u003Crole> jwt=\u003Ctoken>\nexport VAULT_TOKEN=\"\u003Cclient_token>\"\n\n# Read the secret value.\nvault kv get -mount=\u003Cpath> \"\u003Csecrets_path>/\u003Csecret_name>\"\n","shell",[88,928,929,942,954,958,963,1003,1015,1019,1024],{"__ignoreMap":86},[91,930,931,934,937,939],{"class":93,"line":94},[91,932,933],{"class":519},"export",[91,935,936],{"class":101}," VAULT_ADDR",[91,938,576],{"class":519},[91,940,941],{"class":105},"\"\u003Cserver>\"\n",[91,943,944,946,949,951],{"class":93,"line":109},[91,945,933],{"class":519},[91,947,948],{"class":101}," VAULT_NAMESPACE",[91,950,576],{"class":519},[91,952,953],{"class":105},"\"\u003Cnamespace>\"\n",[91,955,956],{"class":93,"line":120},[91,957,559],{"emptyLinePlaceholder":558},[91,959,960],{"class":93,"line":129},[91,961,962],{"class":186},"# Exchange the minted JWT for an OpenBao token, then export it.\n",[91,964,965,968,971,974,977,980,983,986,989,992,994,997,1000],{"class":93,"line":140},[91,966,967],{"class":500},"vault",[91,969,970],{"class":105}," write",[91,972,973],{"class":105}," \"auth/\u003Cauth_jwt_path>/login\"",[91,975,976],{"class":105}," role=",[91,978,979],{"class":519},"\u003C",[91,981,982],{"class":105},"rol",[91,984,985],{"class":101},"e",[91,987,988],{"class":519},">",[91,990,991],{"class":105}," jwt=",[91,993,979],{"class":519},[91,995,996],{"class":105},"toke",[91,998,999],{"class":101},"n",[91,1001,1002],{"class":519},">\n",[91,1004,1005,1007,1010,1012],{"class":93,"line":151},[91,1006,933],{"class":519},[91,1008,1009],{"class":101}," VAULT_TOKEN",[91,1011,576],{"class":519},[91,1013,1014],{"class":105},"\"\u003Cclient_token>\"\n",[91,1016,1017],{"class":93,"line":159},[91,1018,559],{"emptyLinePlaceholder":558},[91,1020,1021],{"class":93,"line":167},[91,1022,1023],{"class":186},"# Read the secret value.\n",[91,1025,1026,1028,1031,1034,1037,1039,1041,1043],{"class":93,"line":175},[91,1027,967],{"class":500},[91,1029,1030],{"class":105}," kv",[91,1032,1033],{"class":105}," get",[91,1035,1036],{"class":504}," -mount=",[91,1038,979],{"class":519},[91,1040,538],{"class":504},[91,1042,988],{"class":519},[91,1044,1045],{"class":105}," \"\u003Csecrets_path>/\u003Csecret_name>\"\n",[57,1047,1049],{"id":1048},"wann-die-secrets-manager-api-sinnvoll-ist","Wann die Secrets Manager API sinnvoll ist",[13,1051,1052,1053,1056,1057,1062],{},"Für Automatisierung, die weder zu GitLab CI/CD noch zu Kubernetes oder Terraform passt, ermöglicht die ",[20,1054,55],{"href":53,"rel":1055},[]," beliebigen externen Systemen, Secrets aus dem Secrets Manager abzurufen, statt Zugangsdaten fest zu hinterlegen oder ",[20,1058,1061],{"href":1059,"rel":1060},"https://about.gitlab.com/de-de/blog/migrate-from-pipeline-variables-to-pipeline-inputs-for-better-security/",[],"getrennte Variablendateien"," zu pflegen.",[81,1064,1066],{"className":924,"code":1065,"language":926,"meta":86,"style":86},"# Request JWT token using Service Account\nRESPONSE=$(curl --silent --request POST \\\n  --header \"PRIVATE-TOKEN: \u003Cyour_access_token>\" \\\n  --url \"https://gitlab.example.com/api/v4/projects/\u003Cproject_id>/secrets_manager/access_token\")\n\nSERVER=$(echo \"$RESPONSE\" | jq --raw-output .provider.vault.server)\nNAMESPACE=$(echo \"$RESPONSE\" | jq --raw-output .provider.vault.namespace)\nMOUNT=$(echo \"$RESPONSE\" | jq --raw-output .provider.vault.path)\nSECRETS_PATH=$(echo \"$RESPONSE\" | jq --raw-output .provider.vault.secrets_path)\nAUTH_PATH=$(echo \"$RESPONSE\" | jq --raw-output .provider.vault.auth.jwt.path)\nROLE=$(echo \"$RESPONSE\" | jq --raw-output .provider.vault.auth.jwt.role)\nJWT=$(echo \"$RESPONSE\" | jq --raw-output .provider.vault.auth.jwt.token)\n\n# Exchange the JWT for a short-lived OpenBao token.\nVAULT_TOKEN=$(curl --silent --request POST \\\n  --header \"X-Vault-Namespace: $NAMESPACE\" \\\n  --data \"{\\\"role\\\":\\\"$ROLE\\\",\\\"jwt\\\":\\\"$JWT\\\"}\" \\\n  \"$SERVER/v1/auth/$AUTH_PATH/login\" | jq --raw-output .auth.client_token)\n\n# Read the secret value.\ncurl --silent \\\n  --header \"X-Vault-Token: $VAULT_TOKEN\" \\\n  --header \"X-Vault-Namespace: $NAMESPACE\" \\\n  \"$SERVER/v1/$MOUNT/data/$SECRETS_PATH/\u003Csecret_name>\"\n",[88,1067,1068,1073,1098,1108,1119,1123,1156,1184,1212,1240,1268,1296,1324,1328,1333,1352,1366,1416,1444,1448,1452,1460,1474,1486],{"__ignoreMap":86},[91,1069,1070],{"class":93,"line":94},[91,1071,1072],{"class":186},"# Request JWT token using Service Account\n",[91,1074,1075,1078,1080,1083,1086,1089,1092,1095],{"class":93,"line":109},[91,1076,1077],{"class":101},"RESPONSE",[91,1079,576],{"class":519},[91,1081,1082],{"class":101},"$(",[91,1084,1085],{"class":500},"curl",[91,1087,1088],{"class":504}," --silent",[91,1090,1091],{"class":504}," --request",[91,1093,1094],{"class":105}," POST",[91,1096,1097],{"class":504}," \\\n",[91,1099,1100,1103,1106],{"class":93,"line":120},[91,1101,1102],{"class":504},"  --header",[91,1104,1105],{"class":105}," \"PRIVATE-TOKEN: \u003Cyour_access_token>\"",[91,1107,1097],{"class":504},[91,1109,1110,1113,1116],{"class":93,"line":129},[91,1111,1112],{"class":504},"  --url",[91,1114,1115],{"class":105}," \"https://gitlab.example.com/api/v4/projects/\u003Cproject_id>/secrets_manager/access_token\"",[91,1117,1118],{"class":101},")\n",[91,1120,1121],{"class":93,"line":140},[91,1122,559],{"emptyLinePlaceholder":558},[91,1124,1125,1128,1130,1132,1135,1137,1140,1142,1145,1148,1151,1154],{"class":93,"line":151},[91,1126,1127],{"class":101},"SERVER",[91,1129,576],{"class":519},[91,1131,1082],{"class":101},[91,1133,1134],{"class":504},"echo",[91,1136,811],{"class":105},[91,1138,1139],{"class":101},"$RESPONSE",[91,1141,532],{"class":105},[91,1143,1144],{"class":519}," |",[91,1146,1147],{"class":500}," jq",[91,1149,1150],{"class":504}," --raw-output",[91,1152,1153],{"class":105}," .provider.vault.server",[91,1155,1118],{"class":101},[91,1157,1158,1161,1163,1165,1167,1169,1171,1173,1175,1177,1179,1182],{"class":93,"line":159},[91,1159,1160],{"class":101},"NAMESPACE",[91,1162,576],{"class":519},[91,1164,1082],{"class":101},[91,1166,1134],{"class":504},[91,1168,811],{"class":105},[91,1170,1139],{"class":101},[91,1172,532],{"class":105},[91,1174,1144],{"class":519},[91,1176,1147],{"class":500},[91,1178,1150],{"class":504},[91,1180,1181],{"class":105}," .provider.vault.namespace",[91,1183,1118],{"class":101},[91,1185,1186,1189,1191,1193,1195,1197,1199,1201,1203,1205,1207,1210],{"class":93,"line":167},[91,1187,1188],{"class":101},"MOUNT",[91,1190,576],{"class":519},[91,1192,1082],{"class":101},[91,1194,1134],{"class":504},[91,1196,811],{"class":105},[91,1198,1139],{"class":101},[91,1200,532],{"class":105},[91,1202,1144],{"class":519},[91,1204,1147],{"class":500},[91,1206,1150],{"class":504},[91,1208,1209],{"class":105}," .provider.vault.path",[91,1211,1118],{"class":101},[91,1213,1214,1217,1219,1221,1223,1225,1227,1229,1231,1233,1235,1238],{"class":93,"line":175},[91,1215,1216],{"class":101},"SECRETS_PATH",[91,1218,576],{"class":519},[91,1220,1082],{"class":101},[91,1222,1134],{"class":504},[91,1224,811],{"class":105},[91,1226,1139],{"class":101},[91,1228,532],{"class":105},[91,1230,1144],{"class":519},[91,1232,1147],{"class":500},[91,1234,1150],{"class":504},[91,1236,1237],{"class":105}," .provider.vault.secrets_path",[91,1239,1118],{"class":101},[91,1241,1242,1245,1247,1249,1251,1253,1255,1257,1259,1261,1263,1266],{"class":93,"line":190},[91,1243,1244],{"class":101},"AUTH_PATH",[91,1246,576],{"class":519},[91,1248,1082],{"class":101},[91,1250,1134],{"class":504},[91,1252,811],{"class":105},[91,1254,1139],{"class":101},[91,1256,532],{"class":105},[91,1258,1144],{"class":519},[91,1260,1147],{"class":500},[91,1262,1150],{"class":504},[91,1264,1265],{"class":105}," .provider.vault.auth.jwt.path",[91,1267,1118],{"class":101},[91,1269,1270,1273,1275,1277,1279,1281,1283,1285,1287,1289,1291,1294],{"class":93,"line":204},[91,1271,1272],{"class":101},"ROLE",[91,1274,576],{"class":519},[91,1276,1082],{"class":101},[91,1278,1134],{"class":504},[91,1280,811],{"class":105},[91,1282,1139],{"class":101},[91,1284,532],{"class":105},[91,1286,1144],{"class":519},[91,1288,1147],{"class":500},[91,1290,1150],{"class":504},[91,1292,1293],{"class":105}," .provider.vault.auth.jwt.role",[91,1295,1118],{"class":101},[91,1297,1298,1301,1303,1305,1307,1309,1311,1313,1315,1317,1319,1322],{"class":93,"line":215},[91,1299,1300],{"class":101},"JWT",[91,1302,576],{"class":519},[91,1304,1082],{"class":101},[91,1306,1134],{"class":504},[91,1308,811],{"class":105},[91,1310,1139],{"class":101},[91,1312,532],{"class":105},[91,1314,1144],{"class":519},[91,1316,1147],{"class":500},[91,1318,1150],{"class":504},[91,1320,1321],{"class":105}," .provider.vault.auth.jwt.token",[91,1323,1118],{"class":101},[91,1325,1326],{"class":93,"line":229},[91,1327,559],{"emptyLinePlaceholder":558},[91,1329,1330],{"class":93,"line":237},[91,1331,1332],{"class":186},"# Exchange the JWT for a short-lived OpenBao token.\n",[91,1334,1335,1338,1340,1342,1344,1346,1348,1350],{"class":93,"line":245},[91,1336,1337],{"class":101},"VAULT_TOKEN",[91,1339,576],{"class":519},[91,1341,1082],{"class":101},[91,1343,1085],{"class":500},[91,1345,1088],{"class":504},[91,1347,1091],{"class":504},[91,1349,1094],{"class":105},[91,1351,1097],{"class":504},[91,1353,1354,1356,1359,1362,1364],{"class":93,"line":259},[91,1355,1102],{"class":504},[91,1357,1358],{"class":105}," \"X-Vault-Namespace: ",[91,1360,1361],{"class":101},"$NAMESPACE",[91,1363,532],{"class":105},[91,1365,1097],{"class":504},[91,1367,1368,1371,1374,1377,1380,1382,1385,1387,1390,1392,1395,1397,1400,1402,1404,1406,1409,1411,1414],{"class":93,"line":273},[91,1369,1370],{"class":504},"  --data",[91,1372,1373],{"class":105}," \"{",[91,1375,1376],{"class":504},"\\\"",[91,1378,1379],{"class":105},"role",[91,1381,1376],{"class":504},[91,1383,1384],{"class":105},":",[91,1386,1376],{"class":504},[91,1388,1389],{"class":101},"$ROLE",[91,1391,1376],{"class":504},[91,1393,1394],{"class":105},",",[91,1396,1376],{"class":504},[91,1398,1399],{"class":105},"jwt",[91,1401,1376],{"class":504},[91,1403,1384],{"class":105},[91,1405,1376],{"class":504},[91,1407,1408],{"class":101},"$JWT",[91,1410,1376],{"class":504},[91,1412,1413],{"class":105},"}\"",[91,1415,1097],{"class":504},[91,1417,1418,1421,1424,1427,1430,1433,1435,1437,1439,1442],{"class":93,"line":281},[91,1419,1420],{"class":105},"  \"",[91,1422,1423],{"class":101},"$SERVER",[91,1425,1426],{"class":105},"/v1/auth/",[91,1428,1429],{"class":101},"$AUTH_PATH",[91,1431,1432],{"class":105},"/login\"",[91,1434,1144],{"class":519},[91,1436,1147],{"class":500},[91,1438,1150],{"class":504},[91,1440,1441],{"class":105}," .auth.client_token",[91,1443,1118],{"class":101},[91,1445,1446],{"class":93,"line":295},[91,1447,559],{"emptyLinePlaceholder":558},[91,1449,1450],{"class":93,"line":764},[91,1451,1023],{"class":186},[91,1453,1454,1456,1458],{"class":93,"line":777},[91,1455,1085],{"class":500},[91,1457,1088],{"class":504},[91,1459,1097],{"class":504},[91,1461,1462,1464,1467,1470,1472],{"class":93,"line":804},[91,1463,1102],{"class":504},[91,1465,1466],{"class":105}," \"X-Vault-Token: ",[91,1468,1469],{"class":101},"$VAULT_TOKEN",[91,1471,532],{"class":105},[91,1473,1097],{"class":504},[91,1475,1476,1478,1480,1482,1484],{"class":93,"line":840},[91,1477,1102],{"class":504},[91,1479,1358],{"class":105},[91,1481,1361],{"class":101},[91,1483,532],{"class":105},[91,1485,1097],{"class":504},[91,1487,1488,1490,1492,1495,1498,1501,1504],{"class":93,"line":845},[91,1489,1420],{"class":105},[91,1491,1423],{"class":101},[91,1493,1494],{"class":105},"/v1/",[91,1496,1497],{"class":101},"$MOUNT",[91,1499,1500],{"class":105},"/data/",[91,1502,1503],{"class":101},"$SECRETS_PATH",[91,1505,837],{"class":105},[57,1507,1509],{"id":1508},"erste-schritte","Erste Schritte",[13,1511,1512,1517],{},[20,1513,1516],{"href":1514,"rel":1515},"https://about.gitlab.com/de-de/blog/secrets-manager-in-public-beta/",[],"GitLab Secrets Manager ist in der Public Beta"," für Premium und Ultimate. Der Secret-Zugriff über ESO, Terraform oder die API steht derzeit auf GitLab.com und GitLab Self-Managed zur Verfügung, GitLab Dedicated folgt.",[13,1519,1520,1521,1526],{},"Während der Beta-Phase ist Secrets Manager kostenlos. Mit der allgemeinen Verfügbarkeit wird daraus eine kostenpflichtige Funktion, die über ",[20,1522,1525],{"href":1523,"rel":1524},"https://docs.gitlab.com/subscriptions/gitlab_credits/",[],"GitLab Credits"," abgerechnet wird. Vor einer Abrechnung ist eine ausdrückliche Zustimmung nötig, und wir kündigen das rechtzeitig an.",[13,1528,1529,1533,1534,1539],{},[20,1530,1532],{"href":22,"rel":1531},[],"Die Dokumentation"," hilft beim Einstieg. Wer eine Lücke findet oder einen Wunsch hat, ",[20,1535,1538],{"href":1536,"rel":1537},"https://gitlab.com/gitlab-org/gitlab/-/work_items/598100",[],"kommentiert in diesem Issue",". Wir sammeln Feedback vor der allgemeinen Verfügbarkeit.",[1541,1542,1543],"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 pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}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 .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}",{"title":86,"searchDepth":109,"depth":109,"links":1545},[1546,1547,1548,1549,1550],{"id":59,"depth":120,"text":60},{"id":477,"depth":120,"text":478},{"id":917,"depth":120,"text":918},{"id":1048,"depth":120,"text":1049},{"id":1508,"depth":120,"text":1509},"security","2026-08-06","GitLab Secrets Manager liefert Secrets sicher an Kubernetes, Terraform und externe Workflows, aus einer einzigen Quelle für die gesamte Toolchain.","md",null,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1759320418/xjmqcozxzt4frx0hori3.png",{},"/de-de/blog/gitlab-secrets-manager-add-eso-terraform-api-support",{"config":1560,"title":1562,"description":1563},{"noIndex":1561},false,"GitLab Secrets Manager unterstützt ESO und Terraform","GitLab Secrets Manager unterstützt jetzt External Secrets Operator, Terraform und eine API. Secrets sicher abrufen, ohne getrennte Secret-Stores.","gitlab-secrets-manager-add-eso-terraform-api-support","de-de/blog/gitlab-secrets-manager-add-eso-terraform-api-support",[1551,1567,1568],"features","product","BlogPost","Mn7Ralr4Vt4bH7-PeFJXi7cfd7akM0GPlzWj85wGvPM",{"logo":1572,"freeTrial":1577,"sales":1582,"login":1587,"items":1592,"search":1920,"minimal":1954,"duo":1972,"switchNav":1981,"pricingDeployment":1992},{"config":1573},{"href":1574,"dataGaName":1575,"dataGaLocation":1576},"/de-de/","gitlab logo","header",{"text":1578,"config":1579},"Kostenlose Testversion anfordern",{"href":1580,"dataGaName":1581,"dataGaLocation":1576},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de&glm_content=default-saas-trial/","free trial",{"text":1583,"config":1584},"Demo anfordern",{"href":1585,"dataGaName":1586,"dataGaLocation":1576},"/de-de/sales/?contact-topic=request-demo","sales",{"text":1588,"config":1589},"Anmelden",{"href":1590,"dataGaName":1591,"dataGaLocation":1576},"https://gitlab.com/users/sign_in/","sign in",[1593,1622,1724,1729,1842,1898],{"text":1594,"config":1595,"menu":1597},"Plattform",{"dataNavLevelOne":1596},"platform",{"type":1598,"columns":1599},"cards",[1600,1606,1614],{"title":1594,"description":1601,"link":1602},"Die intelligente Orchestrierungsplattform für DevSecOps",{"text":1603,"config":1604},"Die Plattform erkunden",{"href":1605,"dataGaName":1596,"dataGaLocation":1576},"/de-de/platform/",{"title":1607,"description":1608,"link":1609},"GitLab Duo Agent Platform","Agentische KI für den gesamten Software-Lebenszyklus",{"text":1610,"config":1611},"Lerne GitLab Duo kennen",{"href":1612,"dataGaName":1613,"dataGaLocation":1576},"/de-de/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1615,"description":1616,"link":1617},"Warum GitLab?","Erfahre, warum sich Unternehmen für GitLab entscheiden",{"text":1618,"config":1619},"Mehr erfahren",{"href":1620,"dataGaName":1621,"dataGaLocation":1576},"/de-de/why-gitlab/","why gitlab",{"text":1623,"left":558,"config":1624,"menu":1626},"Produkt",{"dataNavLevelOne":1625},"solutions",{"type":1627,"link":1628,"columns":1632,"feature":1703},"lists",{"text":1629,"config":1630},"Alle Lösungen anzeigen",{"href":1631,"dataGaName":1625,"dataGaLocation":1576},"/de-de/solutions/",[1633,1658,1681],{"title":1634,"description":1635,"link":1636,"items":1641},"Automatisierung","CI/CD und Automatisierung zur Beschleunigung der Bereitstellung",{"config":1637},{"icon":1638,"href":1639,"dataGaName":1640,"dataGaLocation":1576},"AutomatedCodeAlt","/de-de/solutions/delivery-automation/","automated software delivery",[1642,1646,1649,1654],{"text":1643,"config":1644},"CI/CD",{"href":1645,"dataGaLocation":1576,"dataGaName":1643},"/de-de/solutions/continuous-integration/",{"text":1607,"config":1647},{"href":1612,"dataGaLocation":1576,"dataGaName":1648},"gitlab duo agent platform - product menu",{"text":1650,"config":1651},"Quellcodeverwaltung",{"href":1652,"dataGaLocation":1576,"dataGaName":1653},"/de-de/solutions/source-code-management/","Source Code Management",{"text":1655,"config":1656},"Automatische Softwarebereitstellung",{"href":1639,"dataGaLocation":1576,"dataGaName":1657},"Automated software delivery",{"title":1659,"description":1660,"link":1661,"items":1666},"Sicherheit","Entwickle Code schneller ohne Abstriche bei der Sicherheit",{"config":1662},{"href":1663,"dataGaName":1664,"dataGaLocation":1576,"icon":1665},"/de-de/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1667,1671,1676],{"text":1668,"config":1669},"Anwendungssicherheitstests",{"href":1663,"dataGaName":1670,"dataGaLocation":1576},"Application security testing",{"text":1672,"config":1673},"Schutz der Software-Lieferkette",{"href":1674,"dataGaLocation":1576,"dataGaName":1675},"/de-de/solutions/supply-chain/","Software supply chain security",{"text":1677,"config":1678},"Software-Compliance",{"href":1679,"dataGaName":1680,"dataGaLocation":1576},"/de-de/solutions/software-compliance/","software compliance",{"title":1682,"link":1683,"items":1688},"Messung",{"config":1684},{"icon":1685,"href":1686,"dataGaName":1687,"dataGaLocation":1576},"DigitalTransformation","/de-de/solutions/visibility-measurement/","visibility and measurement",[1689,1693,1698],{"text":1690,"config":1691},"Sichtbarkeit und Messung",{"href":1686,"dataGaLocation":1576,"dataGaName":1692},"Visibility and Measurement",{"text":1694,"config":1695},"Wertstrommanagement",{"href":1696,"dataGaLocation":1576,"dataGaName":1697},"/de-de/solutions/value-stream-management/","Value Stream Management",{"text":1699,"config":1700},"Analysen und Einblicke",{"href":1701,"dataGaLocation":1576,"dataGaName":1702},"/de-de/solutions/analytics-and-insights/","Analytics and insights",{"title":1704,"type":1627,"items":1705},"GitLab für",[1706,1712,1718],{"text":1707,"config":1708},"Enterprise",{"icon":1709,"href":1710,"dataGaLocation":1576,"dataGaName":1711},"Building","/de-de/enterprise/","enterprise",{"text":1713,"config":1714},"Kleinunternehmen",{"icon":1715,"href":1716,"dataGaLocation":1576,"dataGaName":1717},"Work","/de-de/small-business/","small business",{"text":1719,"config":1720},"Öffentlicher Sektor",{"icon":1721,"href":1722,"dataGaLocation":1576,"dataGaName":1723},"Organization","/de-de/solutions/public-sector/","public sector",{"text":1725,"config":1726},"Preise",{"href":1727,"dataGaName":1728,"dataGaLocation":1576,"dataNavLevelOne":1728},"/de-de/pricing/","pricing",{"text":1730,"config":1731,"menu":1733},"Ressourcen",{"dataNavLevelOne":1732},"resources",{"type":1627,"link":1734,"columns":1738,"feature":1831},{"text":1735,"config":1736},"Alle Ressourcen anzeigen",{"href":1737,"dataGaName":1732,"dataGaLocation":1576},"/de-de/resources/",[1739,1771,1798],{"title":1509,"items":1740},[1741,1746,1751,1756,1761,1766],{"text":1742,"config":1743},"Installieren",{"href":1744,"dataGaName":1745,"dataGaLocation":1576},"/de-de/install/","install",{"text":1747,"config":1748},"Kurzanleitungen",{"href":1749,"dataGaName":1750,"dataGaLocation":1576},"/de-de/get-started/","quick setup checklists",{"text":1752,"config":1753},"Lernen",{"href":1754,"dataGaLocation":1576,"dataGaName":1755},"https://university.gitlab.com/","learn",{"text":1757,"config":1758},"Produktdokumentation",{"href":1759,"dataGaName":1760,"dataGaLocation":1576},"https://docs.gitlab.com/","product documentation",{"text":1762,"config":1763},"Best-Practice-Videos",{"href":1764,"dataGaName":1765,"dataGaLocation":1576},"/de-de/getting-started-videos/","best practice videos",{"text":1767,"config":1768},"Integrationen",{"href":1769,"dataGaName":1770,"dataGaLocation":1576},"/de-de/integrations/","integrations",{"title":1772,"items":1773},"Entdecken",[1774,1779,1784,1789,1793],{"text":1775,"config":1776},"Kundenerfolge",{"href":1777,"dataGaName":1778,"dataGaLocation":1576},"/de-de/customers/","customer success stories",{"text":1780,"config":1781},"Blog",{"href":1782,"dataGaName":1783,"dataGaLocation":1576},"/de-de/blog/","blog",{"text":1785,"config":1786},"Demo-Hub",{"href":1787,"dataGaName":1788,"dataGaLocation":1576},"/de-de/demo-hub/","demo hub",{"text":1790,"config":1791},"The Source",{"href":1792,"dataGaName":1783,"dataGaLocation":1576},"/de-de/the-source/",{"text":1794,"config":1795},"Remote",{"href":1796,"dataGaName":1797,"dataGaLocation":1576},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1799,"items":1800},"Vernetzen",[1801,1806,1811,1816,1821,1826],{"text":1802,"config":1803},"GitLab-Services",{"href":1804,"dataGaName":1805,"dataGaLocation":1576},"/de-de/services/","services",{"text":1807,"config":1808},"Beitragen",{"href":1809,"dataGaName":1810,"dataGaLocation":1576},"https://contributors.gitlab.com","contribute",{"text":1812,"config":1813},"Community",{"href":1814,"dataGaName":1815,"dataGaLocation":1576},"/community/","community",{"text":1817,"config":1818},"Forum",{"href":1819,"dataGaName":1820,"dataGaLocation":1576},"https://forum.gitlab.com/","forum",{"text":1822,"config":1823},"Veranstaltungen",{"href":1824,"dataGaName":1825,"dataGaLocation":1576},"/events/","events",{"text":1827,"config":1828},"Partner",{"href":1829,"dataGaName":1830,"dataGaLocation":1576},"/de-de/partners/","partners",{"config":1832,"title":1835,"text":1836,"link":1837},{"background":1833,"textColor":1834},"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":1838,"config":1839},"Aktuelle Nachrichten",{"href":1840,"dataGaName":1841,"dataGaLocation":1576},"/de-de/whats-new/","whats new",{"text":1843,"config":1844,"menu":1846},"Unternehmen",{"dataNavLevelOne":1845},"company",{"type":1627,"columns":1847},[1848],{"items":1849},[1850,1855,1861,1863,1868,1873,1878,1883,1888,1893],{"text":1851,"config":1852},"Über",{"href":1853,"dataGaName":1854,"dataGaLocation":1576},"/de-de/company/","about",{"text":1856,"config":1857,"footerGa":1860},"Karriere",{"href":1858,"dataGaName":1859,"dataGaLocation":1576},"/jobs/","jobs",{"dataGaName":1859},{"text":1822,"config":1862},{"href":1824,"dataGaName":1825,"dataGaLocation":1576},{"text":1864,"config":1865},"Geschäftsführung",{"href":1866,"dataGaName":1867,"dataGaLocation":1576},"/company/team/e-group/","leadership",{"text":1869,"config":1870},"Handbuch",{"href":1871,"dataGaName":1872,"dataGaLocation":1576},"https://handbook.gitlab.com/","handbook",{"text":1874,"config":1875},"Investor Relations",{"href":1876,"dataGaName":1877,"dataGaLocation":1576},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1879,"config":1880},"Trust Center",{"href":1881,"dataGaName":1882,"dataGaLocation":1576},"/de-de/security/","trust center",{"text":1884,"config":1885},"AI Transparency Center",{"href":1886,"dataGaName":1887,"dataGaLocation":1576},"/de-de/ai-transparency-center/","ai transparency center",{"text":1889,"config":1890},"Newsletter",{"href":1891,"dataGaName":1892,"dataGaLocation":1576},"/company/contact/#contact-forms","newsletter",{"text":1894,"config":1895},"Presse",{"href":1896,"dataGaName":1897,"dataGaLocation":1576},"/press/","press",{"text":1899,"config":1900,"menu":1901},"Kontakt",{"dataNavLevelOne":1845},{"type":1627,"columns":1902},[1903],{"items":1904},[1905,1910,1915],{"text":1906,"config":1907},"Vertrieb kontaktieren",{"href":1908,"dataGaName":1909,"dataGaLocation":1576},"/de-de/sales/","talk to sales",{"text":1911,"config":1912},"Support-Portal",{"href":1913,"dataGaName":1914,"dataGaLocation":1576},"https://support.gitlab.com/hc/en-us","support portal",{"text":1916,"config":1917},"Kundenportal",{"href":1918,"dataGaName":1919,"dataGaLocation":1576},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1921,"login":1922,"suggestions":1929},"Schließen",{"text":1923,"link":1924},"Um Repositorys und Projekte zu durchsuchen, melde dich an bei",{"text":1925,"config":1926},"gitlab.com",{"href":1590,"dataGaName":1927,"dataGaLocation":1928},"search login","search",{"text":1930,"default":1931},"Vorschläge",[1932,1934,1939,1941,1946,1951],{"text":1607,"config":1933},{"href":1612,"dataGaName":1607,"dataGaLocation":1928},{"text":1935,"config":1936},"Codevorschläge (KI)",{"href":1937,"dataGaName":1938,"dataGaLocation":1928},"/de-de/solutions/code-suggestions/","Code Suggestions (AI)",{"text":1643,"config":1940},{"href":1645,"dataGaName":1643,"dataGaLocation":1928},{"text":1942,"config":1943},"GitLab auf AWS",{"href":1944,"dataGaName":1945,"dataGaLocation":1928},"/de-de/partners/technology-partners/aws/","GitLab on AWS",{"text":1947,"config":1948},"GitLab auf Google Cloud",{"href":1949,"dataGaName":1950,"dataGaLocation":1928},"/de-de/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":1615,"config":1952},{"href":1620,"dataGaName":1953,"dataGaLocation":1928},"Why GitLab?",{"freeTrial":1955,"mobileIcon":1960,"desktopIcon":1965,"secondaryButton":1968},{"text":1956,"config":1957},"Kostenlos testen",{"href":1958,"dataGaName":1581,"dataGaLocation":1959},"https://gitlab.com/-/trials/new/","nav",{"altText":1961,"config":1962},"GitLab-Symbol",{"src":1963,"dataGaName":1964,"dataGaLocation":1959},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1961,"config":1966},{"src":1967,"dataGaName":1964,"dataGaLocation":1959},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1509,"config":1969},{"href":1970,"dataGaName":1971,"dataGaLocation":1959},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de/get-started/","get started",{"freeTrial":1973,"mobileIcon":1977,"desktopIcon":1979},{"text":1974,"config":1975},"Mehr über GitLab Duo erfahren",{"href":1612,"dataGaName":1976,"dataGaLocation":1959},"gitlab duo",{"altText":1961,"config":1978},{"src":1963,"dataGaName":1964,"dataGaLocation":1959},{"altText":1961,"config":1980},{"src":1967,"dataGaName":1964,"dataGaLocation":1959},{"button":1982,"mobileIcon":1987,"desktopIcon":1989},{"text":1983,"config":1984},"/Option",{"href":1985,"dataGaName":1986,"dataGaLocation":1959},"#contact","switch",{"altText":1961,"config":1988},{"src":1963,"dataGaName":1964,"dataGaLocation":1959},{"altText":1961,"config":1990},{"src":1991,"dataGaName":1964,"dataGaLocation":1959},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1993,"mobileIcon":1998,"desktopIcon":2000},{"text":1994,"config":1995},"Zurück zur Preisübersicht",{"href":1727,"dataGaName":1996,"dataGaLocation":1959,"icon":1997},"back to pricing","GoBack",{"altText":1961,"config":1999},{"src":1963,"dataGaName":1964,"dataGaLocation":1959},{"altText":1961,"config":2001},{"src":1967,"dataGaName":1964,"dataGaLocation":1959},{"title":2003,"button":2004,"config":2008},"GitLab Orbit ist da: die Kontextebene für KI-Agenten",{"text":1618,"config":2005},{"href":2006,"dataGaName":2007,"dataGaLocation":1576},"/de-de/gitlab-orbit/","orbit",{"layout":2009,"disabled":1561},"release",{"data":2011},{"text":2012,"source":2013,"edit":2019,"contribute":2024,"config":2029,"items":2034,"minimal":2240},"Git ist eine Marke von Software Freedom Conservancy und unsere Verwendung von „GitLab“ erfolgt unter Lizenz.",{"text":2014,"config":2015},"Quelltext der Seite anzeigen",{"href":2016,"dataGaName":2017,"dataGaLocation":2018},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":2020,"config":2021},"Diese Seite bearbeiten",{"href":2022,"dataGaName":2023,"dataGaLocation":2018},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":2025,"config":2026},"Beteilige dich",{"href":2027,"dataGaName":2028,"dataGaLocation":2018},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":2030,"facebook":2031,"youtube":2032,"linkedin":2033},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[2035,2080,2133,2175,2207],{"title":1725,"links":2036,"subMenu":2051},[2037,2041,2046],{"text":2038,"config":2039},"Tarife anzeigen",{"href":1727,"dataGaName":2040,"dataGaLocation":2018},"view plans",{"text":2042,"config":2043},"Vorteile von Premium",{"href":2044,"dataGaName":2045,"dataGaLocation":2018},"/de-de/pricing/premium/","why premium",{"text":2047,"config":2048},"Vorteile von Ultimate",{"href":2049,"dataGaName":2050,"dataGaLocation":2018},"/de-de/pricing/ultimate/","why ultimate",[2052],{"title":1899,"links":2053},[2054,2056,2058,2060,2065,2070,2075],{"text":1906,"config":2055},{"href":1908,"dataGaName":1586,"dataGaLocation":2018},{"text":1911,"config":2057},{"href":1913,"dataGaName":1914,"dataGaLocation":2018},{"text":1916,"config":2059},{"href":1918,"dataGaName":1919,"dataGaLocation":2018},{"text":2061,"config":2062},"Status",{"href":2063,"dataGaName":2064,"dataGaLocation":2018},"https://status.gitlab.com/","status",{"text":2066,"config":2067},"Nutzungsbedingungen",{"href":2068,"dataGaName":2069,"dataGaLocation":2018},"/terms/","terms of use",{"text":2071,"config":2072},"Datenschutzerklärung",{"href":2073,"dataGaName":2074,"dataGaLocation":2018},"/de-de/privacy/","privacy statement",{"text":2076,"config":2077},"Cookie-Einstellungen",{"dataGaName":2078,"dataGaLocation":2018,"id":2079,"isOneTrustButton":558},"cookie preferences","ot-sdk-btn",{"title":1623,"links":2081,"subMenu":2090},[2082,2086],{"text":2083,"config":2084},"DevSecOps-Plattform",{"href":1605,"dataGaName":2085,"dataGaLocation":2018},"devsecops platform",{"text":2087,"config":2088},"KI-unterstützte Entwicklung",{"href":1612,"dataGaName":2089,"dataGaLocation":2018},"ai-assisted development",[2091],{"title":2092,"links":2093},"Themen",[2094,2098,2103,2108,2113,2118,2123,2128],{"text":1643,"config":2095},{"href":2096,"dataGaName":2097,"dataGaLocation":2018},"/de-de/topics/ci-cd/","cicd",{"text":2099,"config":2100},"GitOps",{"href":2101,"dataGaName":2102,"dataGaLocation":2018},"/de-de/topics/gitops/","gitops",{"text":2104,"config":2105},"DevOps",{"href":2106,"dataGaName":2107,"dataGaLocation":2018},"/de-de/topics/devops/","devops",{"text":2109,"config":2110},"Versionskontrolle",{"href":2111,"dataGaName":2112,"dataGaLocation":2018},"/de-de/topics/version-control/","version control",{"text":2114,"config":2115},"DevSecOps",{"href":2116,"dataGaName":2117,"dataGaLocation":2018},"/de-de/topics/devsecops/","devsecops",{"text":2119,"config":2120},"Cloud-nativ",{"href":2121,"dataGaName":2122,"dataGaLocation":2018},"/de-de/topics/cloud-native/","cloud native",{"text":2124,"config":2125},"KI für das Programmieren",{"href":2126,"dataGaName":2127,"dataGaLocation":2018},"/de-de/topics/devops/ai-for-coding/","ai for coding",{"text":2129,"config":2130},"Agentische KI",{"href":2131,"dataGaName":2132,"dataGaLocation":2018},"/de-de/topics/agentic-ai/","agentic ai",{"title":2134,"links":2135},"Lösungen",[2136,2139,2141,2146,2150,2153,2156,2159,2161,2163,2165,2170],{"text":1668,"config":2137},{"href":1663,"dataGaName":2138,"dataGaLocation":2018},"Application Security Testing",{"text":1655,"config":2140},{"href":1639,"dataGaName":1640,"dataGaLocation":2018},{"text":2142,"config":2143},"Agile Entwicklung",{"href":2144,"dataGaName":2145,"dataGaLocation":2018},"/de-de/solutions/agile-delivery/","agile delivery",{"text":2147,"config":2148},"SCM",{"href":1652,"dataGaName":2149,"dataGaLocation":2018},"source code management",{"text":1643,"config":2151},{"href":1645,"dataGaName":2152,"dataGaLocation":2018},"continuous integration & delivery",{"text":1694,"config":2154},{"href":1696,"dataGaName":2155,"dataGaLocation":2018},"value stream management",{"text":2099,"config":2157},{"href":2158,"dataGaName":2102,"dataGaLocation":2018},"/de-de/solutions/gitops/",{"text":1707,"config":2160},{"href":1710,"dataGaName":1711,"dataGaLocation":2018},{"text":1713,"config":2162},{"href":1716,"dataGaName":1717,"dataGaLocation":2018},{"text":1719,"config":2164},{"href":1722,"dataGaName":1723,"dataGaLocation":2018},{"text":2166,"config":2167},"Bildungswesen",{"href":2168,"dataGaName":2169,"dataGaLocation":2018},"/de-de/solutions/education/","education",{"text":2171,"config":2172},"Finanzdienstleistungen",{"href":2173,"dataGaName":2174,"dataGaLocation":2018},"/de-de/solutions/finance/","financial services",{"title":1730,"links":2176},[2177,2179,2181,2183,2186,2188,2191,2193,2195,2197,2199,2201,2203,2205],{"text":1742,"config":2178},{"href":1744,"dataGaName":1745,"dataGaLocation":2018},{"text":1747,"config":2180},{"href":1749,"dataGaName":1750,"dataGaLocation":2018},{"text":1752,"config":2182},{"href":1754,"dataGaName":1755,"dataGaLocation":2018},{"text":1757,"config":2184},{"href":1759,"dataGaName":2185,"dataGaLocation":2018},"docs",{"text":1780,"config":2187},{"href":1782,"dataGaName":1783,"dataGaLocation":2018},{"text":2189,"config":2190},"Neuerungen",{"href":1840,"dataGaName":1841,"dataGaLocation":2018},{"text":1775,"config":2192},{"href":1777,"dataGaName":1778,"dataGaLocation":2018},{"text":1794,"config":2194},{"href":1796,"dataGaName":1797,"dataGaLocation":2018},{"text":1802,"config":2196},{"href":1804,"dataGaName":1805,"dataGaLocation":2018},{"text":1807,"config":2198},{"href":1809,"dataGaName":1810,"dataGaLocation":2018},{"text":1812,"config":2200},{"href":1814,"dataGaName":1815,"dataGaLocation":2018},{"text":1817,"config":2202},{"href":1819,"dataGaName":1820,"dataGaLocation":2018},{"text":1822,"config":2204},{"href":1824,"dataGaName":1825,"dataGaLocation":2018},{"text":1827,"config":2206},{"href":1829,"dataGaName":1830,"dataGaLocation":2018},{"title":1843,"links":2208},[2209,2211,2213,2215,2217,2219,2224,2229,2231,2233,2235],{"text":1851,"config":2210},{"href":1853,"dataGaName":1845,"dataGaLocation":2018},{"text":1856,"config":2212},{"href":1858,"dataGaName":1859,"dataGaLocation":2018},{"text":1864,"config":2214},{"href":1866,"dataGaName":1867,"dataGaLocation":2018},{"text":1869,"config":2216},{"href":1871,"dataGaName":1872,"dataGaLocation":2018},{"text":1874,"config":2218},{"href":1876,"dataGaName":1877,"dataGaLocation":2018},{"text":2220,"config":2221},"Nachhaltigkeit",{"href":2222,"dataGaName":2223,"dataGaLocation":2018},"/sustainability/","Sustainability",{"text":2225,"config":2226},"Vielfalt, Inklusion und Zugehörigkeit",{"href":2227,"dataGaName":2228,"dataGaLocation":2018},"/de-de/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1879,"config":2230},{"href":1881,"dataGaName":1882,"dataGaLocation":2018},{"text":1889,"config":2232},{"href":1891,"dataGaName":1892,"dataGaLocation":2018},{"text":1894,"config":2234},{"href":1896,"dataGaName":1897,"dataGaLocation":2018},{"text":2236,"config":2237},"Transparenzerklärung zu moderner Sklaverei",{"href":2238,"dataGaName":2239,"dataGaLocation":2018},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":2241},[2242,2245,2248],{"text":2243,"config":2244},"Terms",{"href":2068,"dataGaName":2069,"dataGaLocation":2018},{"text":2246,"config":2247},"Cookies",{"dataGaName":2078,"dataGaLocation":2018,"id":2079,"isOneTrustButton":558},{"text":2249,"config":2250},"Datenschutz",{"href":2073,"dataGaName":2074,"dataGaLocation":2018},[2252,2265],{"id":2253,"title":7,"body":1555,"config":2254,"content":2256,"description":1555,"extension":2259,"meta":2260,"navigation":558,"path":2261,"seo":2262,"stem":2263,"__hash__":2264},"blogAuthors/en-us/blog/authors/erick-bajao.yml",{"template":2255},"BlogAuthor",{"name":7,"config":2257},{"headshot":2258},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1785949710/hopuhfq9uc0g2e4vfnsz.png","yml",{},"/en-us/blog/authors/erick-bajao",{},"en-us/blog/authors/erick-bajao","Fn6zEYOUr3cr397JsUCaPhmDvXhsxhKZCy3Dqzpx-SM",{"id":2266,"title":8,"body":1555,"config":2267,"content":2268,"description":1555,"extension":2259,"meta":2272,"navigation":558,"path":2273,"seo":2274,"stem":2275,"__hash__":2276},"blogAuthors/en-us/blog/authors/joe-randazzo.yml",{"template":2255},{"name":8,"config":2269},{"headshot":2270,"ctfId":2271},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749664711/Blog/Author%20Headshots/randazzo.jpg","5DxpEbIVcwN2ukwiEMsHlH",{},"/en-us/blog/authors/joe-randazzo",{},"en-us/blog/authors/joe-randazzo","Kg6ZOiBKQgjjlIpsfIAWHsug3iGMaAK1trTdXg4BaFI",[2278,2285,2293],{"title":2279,"description":2280,"heroImage":1556,"category":1551,"date":2281,"authors":2282,"slug":2284,"externalUrl":1555},"Wie GitLab Schwachstellen über Refactorings hinweg verfolgt","Das verbesserte Scope+Offset-Fingerprinting hält das Tracking stabil, wenn Kommentare, Leerzeilen oder Reformatierungen dazukommen.","2026-08-12",[2283],"Julian Thome","improved-scope-offset-fingerprinting",{"title":2286,"description":2287,"heroImage":2288,"category":1551,"date":2289,"authors":2290,"slug":2292,"externalUrl":1555},"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",[2291],"Alisa Ho","claude-security-and-gitlab",{"title":2294,"description":2295,"heroImage":2296,"category":1551,"date":2297,"authors":2298,"slug":2300,"externalUrl":1555},"GitLab Duo Security Review erkennt Logikfehler, die Scanner übersehen","KI-gestützte Security-Reasoning erkennt Autorisierungslücken, Business-Logic-Fehler und Race Conditions, während Code noch im Review ist.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1783980535/t3gez0gpayfndrhncunf.png","2026-07-16",[2299],"Mark Settle","gitlab-duo-security-review-flow",{"promotions":2302},[2303,2317,2328,2339],{"id":2304,"categories":2305,"header":2307,"text":2308,"button":2309,"image":2314},"ai-modernization",[2306],"ai","Hält KI, was uns versprochen wurde?","Das Quiz dauert maximal 5 Minuten.",{"text":2310,"config":2311},"Ermittle deinen KI-Reifegrad",{"href":2312,"dataGaName":2313,"dataGaLocation":1783},"/de-de/assessments/ai-modernization-assessment/","modernization assessment",{"config":2315},{"src":2316},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":2318,"categories":2319,"header":2320,"text":2308,"button":2321,"image":2325},"devops-modernization",[1568,2117],"Verwaltest du Tool-Chaos oder stellst du Innovationen bereit?",{"text":2322,"config":2323},"Ermittle deinen DevOps-Reifegrad",{"href":2324,"dataGaName":2313,"dataGaLocation":1783},"/de-de/assessments/devops-modernization-assessment/",{"config":2326},{"src":2327},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":2329,"categories":2330,"header":2331,"text":2308,"button":2332,"image":2336},"security-modernization",[1551],"Tauschst du Schnelligkeit gegen Sicherheit ein?",{"text":2333,"config":2334},"Ermittle deinen Sicherheitsreifegrad",{"href":2335,"dataGaName":2313,"dataGaLocation":1783},"/de-de/assessments/security-modernization-assessment/",{"config":2337},{"src":2338},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":2340,"paths":2341,"header":2344,"text":2345,"button":2346,"image":2351},"github-azure-migration",[2342,2343],"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":2347,"config":2348},"Erfahre, wie GitLab im Vergleich zu GitHub abschneidet",{"href":2349,"dataGaName":2350,"dataGaLocation":1783},"/de-de/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":2352},{"src":2327},{"header":2354,"blurb":2355,"button":2356,"secondaryButton":2361},"Beginne noch heute, schneller zu entwickeln","Entdecke, was dein Team mit der intelligenten Orchestrierungsplattform für DevSecOps erreichen kann.\n",{"text":2357,"config":2358},"Kostenlosen Test starten",{"href":2359,"dataGaName":1581,"dataGaLocation":2360},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/de-de/","feature",{"text":1906,"config":2362},{"href":1908,"dataGaName":1586,"dataGaLocation":2360},1786803758277]