Azure에서 임시 자격 증명을 가져오도록 Azure의 OpenID Connect 구성

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-Managed, GitLab Dedicated
caution
CI_JOB_JWT_V2GitLab 15.9에서 사용 중단되었으며, GitLab 17.0에서 삭제 예정입니다. 대신 ID tokens을 사용하십시오.

이 튜토리얼은 GitLab CI/CD 작업에서 Azure에서 임시 자격 증명을 가져오기 위해 JSON 웹 토큰(JWT)을 사용하는 방법을 보여줍니다. 비밀을 저장할 필요 없이 Azure에서 임시 자격 증명을 가져오는 방법을 설명합니다.

시작하려면 GitLab과 Azure 사이의 Identity Federation을 위해 OpenID Connect (OIDC)를 구성합니다. GitLab에서 OIDC를 사용하는 자세한 내용은 클라우드 서비스에 연결을 참조하십시오.

Azure는 조건부 역할 주체의 주제에 와일드카드 매칭을 지원하지 않습니다. Azure에 액세스 해야 하는 각 브랜치에 대해 별도의 자격 증명 구성을 만들어야 합니다.

전제 조건:

  • 소유자 액세스 수준을 갖는 기존 Azure 구독에 대한 액세스 권한
  • Application Developer 액세스 수준을 갖는 해당 Azure Active Directory 테넌트에 대한 액세스 권한
  • Azure CLI의 로컬 설치. 또는 Azure Cloud Shell에서 아래 단계를 모두 따를 수 있습니다.
  • Azure는 GitLab OIDC 엔드포인트에 연결해야 하므로 GitLab 인스턴스가 인터넷을 통해 공개적으로 접근 가능해야 합니다.
  • GitLab 프로젝트

이 튜토리얼을 완료하려면:

  1. Azure AD 애플리케이션 및 서비스 주체 만들기
  2. Azure AD 연합 ID 자격 증명 만들기
  3. 서비스 주체에 대한 권한 부여
  4. 임시 자격 증명 검색

자세한 내용은 Workload identity federation의 Azure 문서를 참조하십시오.

Azure AD 애플리케이션 및 서비스 주체 만들기

Azure AD 애플리케이션 및 서비스 주체를 만들려면:

  1. Azure CLI에서 AD 애플리케이션을 만듭니다:

    appId=$(az ad app create --display-name gitlab-oidc --query appId -otsv)
    

    나중에 GitLab CI/CD 파이프라인을 구성하는 데 필요한 appId (애플리케이션 클라이언트 ID) 출력을 저장하십시오.

  2. 해당 Service Principal을 만듭니다:

    az ad sp create --id $appId --query appId -otsv
    

Azure CLI 대신 Azure Portal을 사용하여 이러한 리소스를 만들 수 있습니다.

Azure AD 연합 ID 자격 증명 만들기

위의 Azure AD 애플리케이션에 대한 연합 ID 자격 증명을 만들려면:

objectId=$(az ad app show --id $appId --query id -otsv)

cat <<EOF > body.json
{
  "name": "gitlab-federated-identity",
  "issuer": "https://gitlab.example.com",
  "subject": "project_path:<mygroup>/<myproject>:ref_type:branch:ref:<branch>",
  "description": "GitLab service account federated identity",
  "audiences": [
    "https://gitlab.example.com"
  ]
}
EOF

az rest --method POST --uri "https://graph.microsoft.com/beta/applications/$objectId/federatedIdentityCredentials" --body @body.json

issuer, subject, 또는 audiences의 값과 관련된 문제의 경우 문제 해결 세부 정보를 참조하십시오.

선택 사항으로 Azure AD 애플리케이션 및 Azure AD 연합 ID 자격 증명을 Azure Portal에서 검증할 수 있습니다:

  1. Azure Active Directory 앱 등록 보기에서 gitlab-oidc 표시 이름을 검색하여 해당 앱 등록을 선택합니다.
  2. 개요 페이지에서 Application (client) ID, Object ID, 및 Tenant ID와 같은 세부 정보를 확인할 수 있습니다.
  3. Certificates & secrets에서 Federated credentials로 이동하여 Azure AD 연합 ID 자격 증명을 검토할 수 있습니다.

서비스 주체에 대한 권한 부여

자격 증명을 만든 후, role assignment를 사용하여 해당 서비스 주체가 Azure 리소스에 액세스할 수 있도록 권한을 부여합니다:

az role assignment create --assignee $appId --role Reader --scope /subscriptions/<subscription-id>

구독 ID는 다음 위치에서 확인할 수 있습니다:

위의 명령은 전체 구독에 대한 읽기 전용 권한을 부여합니다. 조직의 최소 권한의 원칙을 적용하는 방법에 대한 자세한 내용은 Azure AD 역할의 모범 사례를 참조하십시오.

임시 자격 증명 검색

Azure AD 애플리케이션 및 연합 ID 자격 증명을 구성한 후, CI/CD 작업은 Azure CLI를 사용하여 임시 자격 증명을 검색할 수 있습니다:

default:
  image: mcr.microsoft.com/azure-cli:latest

variables:
  AZURE_CLIENT_ID: "<client-id>"
  AZURE_TENANT_ID: "<tenant-id>"

auth:
  id_tokens:
    GITLAB_OIDC_TOKEN:
      aud: https://gitlab.com
  script:
    - az login --service-principal -u $AZURE_CLIENT_ID -t $AZURE_TENANT_ID --federated-token $GITLAB_OIDC_TOKEN
    - az account show

CI/CD 변수는 다음과 같습니다:

문제 해결

“No matching federated identity record found”

ERROR: AADSTS70021: No matching federated identity record found for presented assertion. 오류가 발생하는 경우 다음을 확인해야 합니다:

  • Azure AD 연합 ID 자격 증명에서 정의된 Issuer, 예를 들어 https://gitlab.com 또는 본인의 GitLab URL.
  • Azure AD 연합 ID 자격 증명에서 정의된 Subject identifier, 예를 들어 project_path:<mygroup>/<myproject>:ref_type:branch:ref:<branch>.
    • gitlab-group/gitlab-project 프로젝트 및 main 브랜치의 경우, project_path:gitlab-group/gitlab-project:ref_type:branch:ref:main가 됩니다.
    • 올바른 mygroupmyproject 값은 GitLab 프로젝트에 액세스할 때 URL을 확인하거나 프로젝트 개요 페이지의 오른쪽 상단에서 Code를 선택하여 확인할 수 있습니다.
  • Azure AD 연합 ID 자격 증명에서 정의된 Audience, 예를 들어 https://gitlab.com 또는 본인의 GitLab URL.

Azure Portal에서 이러한 설정 및 AZURE_CLIENT_IDAZURE_TENANT_ID CI/CD 변수를 검토할 수 있습니다:

  1. Azure Active Directory App Registration 보기 열고 gitlab-oidc 표시 이름을 검색하여 해당 앱 등록을 선택합니다.
  2. 개요 페이지에서 Application (client) ID, Object ID, 및 Tenant ID와 같은 세부 정보를 확인할 수 있습니다.
  3. Certificates & secrets에서 Federated credentials로 이동하여 Azure AD 연합 ID 자격 증명을 검토할 수 있습니다.

자세한 내용은 클라우드 서비스에 연결를 참조하십시오.

‘외부 OIDC 엔드포인트로의 요청 실패’ 메시지

만약 ‘ERROR: AADSTS501661: 외부 OIDC 엔드포인트로의 요청 실패’ 오류를 받는다면, GitLab 인스턴스가 인터넷에서 공개적으로 접근 가능한지 확인해야 합니다.

Azure는 OIDC로 인증하기 위해 다음의 GitLab 엔드포인트에 접근할 수 있어야 합니다:

  • GET /.well-known/openid-configuration
  • GET /oauth/discovery/keys

만약 방화벽을 업데이트했음에도 이 오류를 계속 받는다면, Redis 캐시를 지워 보세요 그리고 다시 시도해 보세요.

‘제시된 주장 대상에 대한 일치하는 연합 신원 레코드를 찾을 수 없음’ 메시지

만약 ‘ERROR: AADSTS700212: 제시된 주장 대상에 대한 일치하는 연합 신원 레코드를 찾을 수 없음’ 오류를 받는다면, CI/CD 작업이 올바른 aud 값 사용하는지 확인해야 합니다.

aud 값은 연합 신원 자격 증명을 생성할 때 사용된 대상과 일치해야 합니다.