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 토큰을 사용하세요.

이 튜토리얼은 Azure에서 보안을 유지하면서 GitLab CI/CD 작업에서 일시적인 자격 증명을 검색하기 위해 JSON 웹 토큰(JWT)을 사용하는 방법을 보여줍니다.

시작하려면 GitLab과 Azure 간의 ID 페더레이션을 위해 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. 일시적인 자격 증명 검색.

자세한 내용은 Azure의 Workload identity federation 설명서를 참조하세요.

Azure AD 애플리케이션 및 서비스 주체 생성

Azure AD 애플리케이션 및 서비스 주체를 생성하려면:

  1. Azure CLI에서 AD 애플리케이션을 생성하세요:

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

    appId(애플리케이션 클라이언트 ID) 출력을 저장해야 합니다. 이것은 GitLab CI/CD 파이프라인을 구성할 때 필요합니다.

  2. 해당 서비스 주체를 생성하세요:

    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. 검색란에 gitlab-oidc 표시 이름으로 알맞은 앱 등록을 선택하세요.
  2. 개요 페이지에서 응용 프로그램(클라이언트) ID, 오브젝트 ID, 테넌트 ID와 같은 세부 정보 확인할 수 있습니다.
  3. 인증서 및 비밀 아래에서 연합 자격 증명으로 이동하여 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 변수는 다음과 같습니다:

문제 해결

“일치하는 연합 ID 레코드를 찾을 수 없음”

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 애플리케이션 등록을 열고 디스플레이 이름 gitlab-oidc으로 검색하여 적절한 앱 등록을 선택합니다.
  2. 개요 페이지에서 Application (client) ID, Object ID, Tenant ID와 같은 세부 정보를 확인할 수 있습니다.
  3. Certificates & secrets에서 Federated credentials로 이동하여 Azure AD 연합 ID 자격 증명을 검토할 수 있습니다.

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

“외부 OIDC 엔드포인트 요청 실패” 메시지

ERROR: AADSTS501661: Request to External OIDC endpoint failed. 오류를 받으면 GitLab 인스턴스가 인터넷에서 접근 가능한지 확인해야 합니다.

Azure는 OIDC를 사용하여 인증하기 위해 다음 GitLab 엔드포인트에 액세스할 수 있어야 합니다:

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

방화벽을 업데이트한 후에도 이 오류를 받는 경우 Redis 캐시를 지우고 다시 시도합니다.

‘https://gitlab.com’을 위한 일치하는 연방 신원 레코드를 찾을 수 없습니다` 메시지

에러 ERROR: AADSTS700212: No matching federated identity record found for presented assertion audience 'https://gitlab.com'을 받았다면, CI/CD 작업이 올바른 aud 값으로 사용되고 있는지 확인해야 합니다.

aud 값은 연방 신원 자격 증명을 생성할 때 사용된 audience와 일치해아 합니다.