安全地检索 GitLab 管道的 Azure 租户 ID、客户端 ID 和客户端机密



我正在设置一个GitLab管道来运行一些Terraform配置,以便在我们的Azure AD和HashiCorp Vault实例之间启用OIDC身份验证。此解决方案的概念验证已成功实施。

为了保护使用的某些敏感数据,需要安全地存储以下 Azure 凭据,并在运行时加密并注入到 GitLab 管道中:

  1. 租户标识
  2. 客户端标识
  3. 客户端密钥

因此,我们希望确定并实施一个理想的解决方案来实现这一目标,并将随时考虑使用AWS,Azure或HashiCorp Vault的安全存储选项,这些都是我们技术堆栈的一部分。有什么意见或建议吗?

租户 ID和客户端 ID 不是特别敏感的信息,因此我认为您不必安全地存储/访问它们。

若要保护客户端密码,可以使用组变量。

可以将机密保存到 Azure 密钥保管库等服务,但需要应用程序注册(另一个客户端 ID 和机密)才能再次检索它。

这就是秘密的事情:你必须从某个地方开始。这个问题通常被称为"安全引入"。让我们沿着这条路走。

它首先在 Azure-AD 中注册保管库,并返回你关注的值。如果在管道的 Azure-AD 中注册保管库,最好保留这些值并立即重用它们来配置保管库的 OIDC 身份验证后端。

但根据您的要求,您无法将它们存储在 Terraform 状态中。还存在定期更改客户端密码的问题,例如每年左右。

在 Azure-AD 中注册保管库时,请使用受限策略将凭据写入版本 2 KV 存储中。即使只有客户端机密是机密,我们也会将凭据存储在如下所示的文档中:

{
"client_id": "..........",
"client_secret": "...........",
"tenant_id": "............"
}

然后,我们从 Vault 读取这些值,并使用它们来配置 OIDC 身份验证后端。当客户端密码发生更改时,将作为机密的新版本放置,并由下次运行的配置管道选取。

OIDC 不需要在 GitLab 中存储或访问客户端密钥。这是使用 OIDC 的主要好处:您不必在 GitLab 中存储/访问任何机密。您只需使用$CI_JOB_JWT_V2令牌。

这不是对有关安全访问凭据的问题的直接回答,其他答案已对此进行了解答。但是我将向您展示如何设置 OIDC,这样您甚至不必首先存储客户端密钥。


首先,需要在 Azure 中注册应用程序。可以按照以下说明注册应用程序并创建服务主体来执行此操作。

执行此操作后,记下"应用程序(客户端)ID"和">目录(租户)ID">(位于应用程序">概述"窗格中)的值。步骤 3 将需要这些值。

其次,需要将联合凭据添加到应用程序的服务主体。在 Azure 门户中,转到已注册的应用->你的应用程序。在边栏中,选择"证书和机密"。在"联合凭据"选项卡下,单击"添加凭据"按钮

使用以下参数进行凭据配置:

Federated credential sceanrioOther issuer>Issuer: Your gitlab URL,例如https://gitlab.example.com
主题标识符:要匹配的sub声明的值。例如,若要允许contoso/myproject项目的main分支上的作业使用此服务主体,请使用project_path:contoso/myproject:ref_type:branch:ref:main
Name:联合新月的任何描述性名称(例如contoso-myproject-main)
描述:可选,联合凭据的描述.
受众:您的 GitLab URL,例如https://gitlab.example.com

最后,你现在可以使用 OIDC 从 gitlab 登录到 Azure:

azure-cli:
image: mcr.microsoft.com/azure-cli
variables:
AZURE_CLIENT_ID: "YOUR Application Client ID"
AZURE_TENANT_ID: "YOUR TENANT ID"
script:
- az login --tenant $AZURE_TENANT_ID --service-principal -u $AZURE_CLIENT_ID --federation-token $CI_JOB_JWT_V2
# now you are logged into Azure and can take other actions using the CLI
# - az resource list # example

请注意,客户端 ID 和租户 ID 不是敏感信息,因此可以合理地将它们直接添加到 YAML。

最新更新