如何使用 gitlab-ci 中的托管标识进行身份验证,将 docker 容器从 gitlab 注册表推送到 Azure Web 服务?

akn*_*ott 3 azure gitlab docker gitlab-ci azure-managed-identity

我研究了将 docker 映像从 gitlab 容器注册表推送到 azure 资源的方法:将 Docker 映像从 gitlab-ci 推送到 Azure 容器注册表

\n

我还在Azure 文档中找到了创建托管身份(系统分配的用户分配的)的文档

\n

我缺少连接如何az login \xe2\x80\x94-identitygitlab-ci.yml文件中使用 \n 来访问azure 应用程序服务的点。目的是从gitlab 容器注册表推送docker镜像。

\n
    \n
  • 我怎样才能做到这一点?
  • \n
  • 我需要如何配置azure应用程序服务(身份/访问控制)?
  • \n
  • 是否存在任何安全问题?如果是,有az login \xe2\x80\x94-service-principal更安全的方法吗?或者还有其他认证程序吗?ssh
  • \n
\n

提前谢谢你的帮助!

\n

syt*_*ech 9

您可以使用 GitLab CI 作业 JWT 令牌从 CI/CD 管道内登录到 Azure,而无需在 GitLab 项目中存储机密。为此,您还需要配置 OpenID Connect (OIDC),以实现 GitLab 和 Azure 服务主体之间的 ID 联合。除其他用例外,Microsoft 建议使用此方法从 CI/CD 服务向 Azure 进行身份验证。

注意:仅当您使用 gitlab.com 或可公开访问的 GitLab 实例时,按如下所述使用 OIDC 才有效。这是因为 Azure 需要连接到密钥颁发者以验证令牌。如果您是自托管 GitLab 并且您的实例不可公开访问,您可以为步骤 2 选择不同的凭证类型。

1. 创建注册应用程序

首先,您需要在 Azure 中注册一个应用程序。您可以按照这些说明注册应用程序并创建服务主体来完成此操作。

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

2. 添加联合凭据

注册应用程序后,您可以将联合凭据添加到应用程序的服务主体。在 Azure 门户中,转到已注册的应用程序->您的应用程序。在侧边栏中,选择证书和机密。在“联合凭据”选项卡下,单击“添加凭据”按钮

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

联合凭证 sceanrio其他颁发者
颁发者:您的 gitlab URL 例如https://gitlab.example.com
主题标识符sub:要匹配的声明的值。例如,要允许项目main分支上的作业contoso/myproject使用此服务主体,请使用project_path:contoso/myproject:ref_type:branch:ref:main
Name:联合凭据的任何描述性名称(例如contoso-myproject-main
Description:可选,联合凭据的描述。
受众:您的 GitLab URL 例如https://gitlab.example.com

3. 在您的作业中向 Azure 进行身份验证

创建联合凭据后,您可以利用CI_JOB_JWT_V2作业中的令牌通过 Azure 进行身份验证。在此示例中,我们将使用 Azure CLI ( az login)。

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 --federated-token $CI_JOB_JWT_V2
    # now you are logged into Azure and can take other actions using the CLI
    # - az resource list # example
Run Code Online (Sandbox Code Playgroud)
  • CI_JOB_JWT_V2:预定义变量
  • AZURE_CLIENT_ID:已注册应用程序的应用程序(客户端)ID。
  • AZURE_TENANT_ID:要登录的Azure租户的ID(可以在应用程序概述中找到)

另外,不要忘记为您注册的应用程序授予Azure容器注册表的适当权限

  • @aknott 啊,我没有提到这一点。您只能使用在 Azure 中运行的 Azure 服务中的托管标识。除非您的 GitLab 运行程序在 Azure VM、AKS 或类似的 Azure 服务上运行,否则您无法使用 GitLab CI 中的托管标识。具有联合身份凭证的 OIDC 是最接近它的东西,这就是我建议作为您所问问题的替代方案:-) (3认同)