InfoGrab Docs

GCP Workload Identity Federation으로 OpenID Connect 구성

요약

CI_JOB_JWT_V2는 GitLab 15.9에서 더 이상 사용되지 않음으로 표시되었으며 GitLab 17.0에서 제거될 예정입니다. 이 튜토리얼은 JSON Web Token(JWT) 토큰과 Workload Identity Federation을 사용하여 GitLab CI/CD 잡에서 Google Cloud로 인증하는 방법을 보여줍니다.

Warning

CI_JOB_JWT_V2GitLab 15.9에서 더 이상 사용되지 않음으로 표시되었으며 GitLab 17.0에서 제거될 예정입니다. 대신 ID 토큰을 사용하세요.

이 튜토리얼은 JSON Web Token(JWT) 토큰과 Workload Identity Federation을 사용하여 GitLab CI/CD 잡에서 Google Cloud로 인증하는 방법을 보여줍니다. 이 구성은 시크릿을 저장할 필요 없이 온디맨드 단기 자격 증명을 생성합니다.

시작하려면 GitLab과 Google Cloud 간의 ID 페더레이션을 위해 OpenID Connect(OIDC)를 구성하세요. GitLab과 함께 OIDC를 사용하는 방법에 대한 자세한 내용은 클라우드 서비스에 연결을 참조하세요.

이 튜토리얼에서는 Google Cloud 계정과 Google Cloud 프로젝트가 있다고 가정합니다. 귀하의 계정은 Google Cloud 프로젝트에서 최소한 워크로드 ID 풀 관리자 권한이 있어야 합니다.

Note

이 튜토리얼 대신 Terraform 모듈과 CI/CD 템플릿을 사용하는 것을 선호한다면, OIDC로 Google Cloud와 GitLab CI/CD 파이프라인의 인증을 단순화하는 방법을 참조하세요.

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

  1. Google Cloud 워크로드 ID 풀 만들기.
  2. 워크로드 ID 공급자 만들기.
  3. 서비스 계정 가장 권한 부여.
  4. 임시 자격 증명 가져오기.

Google Cloud 워크로드 ID 풀 만들기#

다음 옵션을 사용하여 새 Google Cloud 워크로드 ID 풀 만들기:

  • 이름: 워크로드 ID 풀의 사람이 읽기 쉬운 이름(예: GitLab).
  • 풀 ID: 워크로드 ID 풀의 Google Cloud 프로젝트 내 고유 ID(예: gitlab). 이 값은 풀을 참조하는 데 사용되며 URL에 표시됩니다.
  • 설명: 선택 사항. 풀의 설명.
  • 활성화된 풀: 이 옵션이 true인지 확인하세요.

Google Cloud 프로젝트당 GitLab 설치당 하나의 풀을 만드는 것을 권장합니다. 동일한 GitLab 인스턴스에 여러 GitLab 리포지터리와 CI/CD 잡이 있는 경우 동일한 풀에 대해 서로 다른 공급자를 사용하여 인증할 수 있습니다.

워크로드 ID 공급자 만들기#

이전 단계에서 만든 워크로드 ID 풀 내에서 다음 옵션을 사용하여 새 Google Cloud 워크로드 ID 공급자 만들기:

  • 공급자 유형: OpenID Connect(OIDC).

  • 공급자 이름: 워크로드 ID 공급자의 사람이 읽기 쉬운 이름(예: gitlab/gitlab).

  • 공급자 ID: 워크로드 ID 공급자의 풀 내 고유 ID(예: gitlab-gitlab). 이 값은 공급자를 참조하는 데 사용되며 URL에 표시됩니다.

  • 발급자(URL): GitLab 인스턴스의 주소(예: https://gitlab.com/ 또는 https://gitlab.example.com/).

    • 주소는 https:// 프로토콜을 사용해야 합니다.
    • 주소는 후행 슬래시로 끝나야 합니다.
  • 대상: https://gitlab.com 또는 https://gitlab.example.com과 같이 GitLab 인스턴스의 주소로 허용된 대상 목록을 수동으로 설정합니다.

    • 주소는 https:// 프로토콜을 사용해야 합니다.
    • 주소는 후행 슬래시로 끝나서는 안 됩니다.
  • 공급자 속성 매핑: attribute.X는 Google 토큰의 클레임으로 포함될 속성의 이름이고, assertion.XGitLab 클레임에서 추출할 값인 다음 매핑을 만듭니다:

    속성(Google) 어설션(GitLab)
    google.subject assertion.sub
    attribute.X assertion.X

    Common Expression Language(CEL)을 사용하여 복잡한 속성을 만들 수도 있습니다.

    권한 부여에 사용하려는 모든 속성을 매핑해야 합니다. 예를 들어 다음 단계에서 사용자 이메일 주소를 기반으로 권한을 매핑하려면 attribute.user_emailassertion.user_email에 매핑해야 합니다.

Warning

GitLab.com에서 호스팅되는 프로젝트의 경우 GCP는 GitLab 그룹에서 발급한 토큰으로만 액세스를 제한하도록 요구합니다.

서비스 계정 가장 권한 부여#

워크로드 ID 풀과 워크로드 ID 공급자를 만들면 Google Cloud로의 인증이 정의됩니다. 이 시점에서 GitLab CI/CD 잡에서 Google Cloud로 인증할 수 있습니다. 그러나 Google Cloud에 대한 권한이 없습니다(인가).

Google Cloud에 대한 GitLab CI/CD 잡 권한을 부여하려면:

  1. Google Cloud 서비스 계정 만들기. 원하는 이름과 ID를 사용할 수 있습니다.
  2. Google Cloud 리소스에서 서비스 계정에 IAM 권한 부여. 이러한 권한은 사용 사례에 따라 크게 다릅니다. 일반적으로 GitLab CI/CD 잡에서 사용하려는 Google Cloud 프로젝트 및 리소스에 대한 권한을 서비스 계정에 부여합니다. 예를 들어 GitLab CI/CD 잡에서 Google Cloud Storage 버킷에 파일을 업로드해야 한다면 Cloud Storage 버킷에 대한 roles/storage.objectCreator 역할을 서비스 계정에 부여합니다.
  3. 해당 서비스 계정을 가장할 수 있는 외부 ID 권한 부여. 이 단계를 통해 GitLab CI/CD 잡이 서비스 계정 가장을 통해 Google Cloud에 인증할 수 있습니다. 이 단계는 서비스 계정 자체에 IAM 권한을 부여하여 외부 ID가 해당 서비스 계정으로 작동할 수 있는 권한을 부여합니다. 외부 ID는 principalSet:// 프로토콜을 사용하여 표현됩니다.

이전 단계와 마찬가지로 이 단계도 원하는 구성에 따라 크게 달라집니다. 예를 들어 GitLab 사용자 이름이 chris인 GitLab 사용자가 GitLab CI/CD 잡을 시작한 경우 my-service-account라는 서비스 계정을 GitLab CI/CD 잡이 가장할 수 있도록 허용하려면 my-service-account에 대한 외부 ID에 roles/iam.workloadIdentityUser IAM 역할을 부여합니다. 외부 ID는 다음 형식을 취합니다:

principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.user_login/chris

여기서 PROJECT_NUMBER는 Google Cloud 프로젝트 번호이고, POOL_ID는 첫 번째 섹션에서 만든 워크로드 ID 풀의 ID(이름이 아님)입니다.

이 구성은 또한 이전 섹션의 어설션에서 매핑된 속성으로 user_login을 추가했다고 가정합니다.

임시 자격 증명 가져오기#

OIDC 및 역할을 구성한 후 GitLab CI/CD 잡은 Google Cloud Security Token Service(STS)에서 임시 자격 증명을 가져올 수 있습니다.

CI/CD 잡에 id_tokens를 추가합니다:

job:
  id_tokens:
    GITLAB_OIDC_TOKEN:
      aud: https://gitlab.example.com

ID 토큰을 사용하여 임시 자격 증명을 가져옵니다:

PAYLOAD="$(cat <
FEDERATED_TOKEN="$(curl --fail "https://sts.googleapis.com/v1/token" \
  --header "Accept: application/json" \
  --header "Content-Type: application/json" \
  --data "${PAYLOAD}" \
  | jq -r '.access_token'
)"

여기서:

  • PROJECT_NUMBER는 Google Cloud 프로젝트 번호(이름이 아님)입니다.
  • POOL_ID는 첫 번째 섹션에서 만든 워크로드 ID 풀의 ID입니다.
  • PROVIDER_ID는 두 번째 섹션에서 만든 워크로드 ID 공급자의 ID입니다.
  • GITLAB_OIDC_TOKEN은 OIDC ID 토큰입니다.

그런 다음 결과 페더레이션 토큰을 사용하여 이전 섹션에서 만든 서비스 계정을 가장할 수 있습니다:

ACCESS_TOKEN="$(curl --fail "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT_EMAIL:generateAccessToken" \
  --header "Accept: application/json" \
  --header "Content-Type: application/json" \
  --header "Authorization: Bearer FEDERATED_TOKEN" \
  --data '{"scope": ["https://www.googleapis.com/auth/cloud-platform"]}' \
  | jq -r '.accessToken'
)"

여기서:

  • SERVICE_ACCOUNT_EMAIL은 이전 섹션에서 만든 가장할 서비스 계정의 전체 이메일 주소입니다.
  • FEDERATED_TOKEN은 이전 단계에서 가져온 페더레이션 토큰입니다.

결과는 Google Cloud OAuth 2.0 액세스 토큰으로, 이를 Bearer 토큰으로 사용할 때 대부분의 Google Cloud API 및 서비스에 인증하는 데 사용할 수 있습니다. 환경 변수 CLOUDSDK_AUTH_ACCESS_TOKEN을 설정하여 gcloud CLI에 이 값을 전달할 수도 있습니다.

작동 예시#

Terraform을 사용하여 GCP에서 OIDC를 프로비저닝하고 임시 자격 증명을 가져오는 샘플 스크립트에 대한 이 참조 프로젝트를 검토하세요.

트러블슈팅#

  • curl 응답을 디버깅할 때 curl의 최신 버전을 설치하세요. -f 대신 --fail-with-body를 사용하세요. 이 명령은 유용한 오류 메시지를 포함할 수 있는 전체 본문을 출력합니다.

  • 자세한 내용은 Workload Identity Federation 트러블슈팅을 참조하세요.

GCP Workload Identity Federation으로 OpenID Connect 구성

Tier: Free, Premium, Ultimate
Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
원문 보기
요약

CI_JOB_JWT_V2는 GitLab 15.9에서 더 이상 사용되지 않음으로 표시되었으며 GitLab 17.0에서 제거될 예정입니다. 이 튜토리얼은 JSON Web Token(JWT) 토큰과 Workload Identity Federation을 사용하여 GitLab CI/CD 잡에서 Google Cloud로 인증하는 방법을 보여줍니다.

Warning

CI_JOB_JWT_V2GitLab 15.9에서 더 이상 사용되지 않음으로 표시되었으며 GitLab 17.0에서 제거될 예정입니다. 대신 ID 토큰을 사용하세요.

이 튜토리얼은 JSON Web Token(JWT) 토큰과 Workload Identity Federation을 사용하여 GitLab CI/CD 잡에서 Google Cloud로 인증하는 방법을 보여줍니다. 이 구성은 시크릿을 저장할 필요 없이 온디맨드 단기 자격 증명을 생성합니다.

시작하려면 GitLab과 Google Cloud 간의 ID 페더레이션을 위해 OpenID Connect(OIDC)를 구성하세요. GitLab과 함께 OIDC를 사용하는 방법에 대한 자세한 내용은 클라우드 서비스에 연결을 참조하세요.

이 튜토리얼에서는 Google Cloud 계정과 Google Cloud 프로젝트가 있다고 가정합니다. 귀하의 계정은 Google Cloud 프로젝트에서 최소한 워크로드 ID 풀 관리자 권한이 있어야 합니다.

Note

이 튜토리얼 대신 Terraform 모듈과 CI/CD 템플릿을 사용하는 것을 선호한다면, OIDC로 Google Cloud와 GitLab CI/CD 파이프라인의 인증을 단순화하는 방법을 참조하세요.

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

  1. Google Cloud 워크로드 ID 풀 만들기.
  2. 워크로드 ID 공급자 만들기.
  3. 서비스 계정 가장 권한 부여.
  4. 임시 자격 증명 가져오기.

Google Cloud 워크로드 ID 풀 만들기#

다음 옵션을 사용하여 새 Google Cloud 워크로드 ID 풀 만들기:

  • 이름: 워크로드 ID 풀의 사람이 읽기 쉬운 이름(예: GitLab).
  • 풀 ID: 워크로드 ID 풀의 Google Cloud 프로젝트 내 고유 ID(예: gitlab). 이 값은 풀을 참조하는 데 사용되며 URL에 표시됩니다.
  • 설명: 선택 사항. 풀의 설명.
  • 활성화된 풀: 이 옵션이 true인지 확인하세요.

Google Cloud 프로젝트당 GitLab 설치당 하나의 풀을 만드는 것을 권장합니다. 동일한 GitLab 인스턴스에 여러 GitLab 리포지터리와 CI/CD 잡이 있는 경우 동일한 풀에 대해 서로 다른 공급자를 사용하여 인증할 수 있습니다.

워크로드 ID 공급자 만들기#

이전 단계에서 만든 워크로드 ID 풀 내에서 다음 옵션을 사용하여 새 Google Cloud 워크로드 ID 공급자 만들기:

  • 공급자 유형: OpenID Connect(OIDC).

  • 공급자 이름: 워크로드 ID 공급자의 사람이 읽기 쉬운 이름(예: gitlab/gitlab).

  • 공급자 ID: 워크로드 ID 공급자의 풀 내 고유 ID(예: gitlab-gitlab). 이 값은 공급자를 참조하는 데 사용되며 URL에 표시됩니다.

  • 발급자(URL): GitLab 인스턴스의 주소(예: https://gitlab.com/ 또는 https://gitlab.example.com/).

    • 주소는 https:// 프로토콜을 사용해야 합니다.
    • 주소는 후행 슬래시로 끝나야 합니다.
  • 대상: https://gitlab.com 또는 https://gitlab.example.com과 같이 GitLab 인스턴스의 주소로 허용된 대상 목록을 수동으로 설정합니다.

    • 주소는 https:// 프로토콜을 사용해야 합니다.
    • 주소는 후행 슬래시로 끝나서는 안 됩니다.
  • 공급자 속성 매핑: attribute.X는 Google 토큰의 클레임으로 포함될 속성의 이름이고, assertion.XGitLab 클레임에서 추출할 값인 다음 매핑을 만듭니다:

    속성(Google) 어설션(GitLab)
    google.subject assertion.sub
    attribute.X assertion.X

    Common Expression Language(CEL)을 사용하여 복잡한 속성을 만들 수도 있습니다.

    권한 부여에 사용하려는 모든 속성을 매핑해야 합니다. 예를 들어 다음 단계에서 사용자 이메일 주소를 기반으로 권한을 매핑하려면 attribute.user_emailassertion.user_email에 매핑해야 합니다.

Warning

GitLab.com에서 호스팅되는 프로젝트의 경우 GCP는 GitLab 그룹에서 발급한 토큰으로만 액세스를 제한하도록 요구합니다.

서비스 계정 가장 권한 부여#

워크로드 ID 풀과 워크로드 ID 공급자를 만들면 Google Cloud로의 인증이 정의됩니다. 이 시점에서 GitLab CI/CD 잡에서 Google Cloud로 인증할 수 있습니다. 그러나 Google Cloud에 대한 권한이 없습니다(인가).

Google Cloud에 대한 GitLab CI/CD 잡 권한을 부여하려면:

  1. Google Cloud 서비스 계정 만들기. 원하는 이름과 ID를 사용할 수 있습니다.
  2. Google Cloud 리소스에서 서비스 계정에 IAM 권한 부여. 이러한 권한은 사용 사례에 따라 크게 다릅니다. 일반적으로 GitLab CI/CD 잡에서 사용하려는 Google Cloud 프로젝트 및 리소스에 대한 권한을 서비스 계정에 부여합니다. 예를 들어 GitLab CI/CD 잡에서 Google Cloud Storage 버킷에 파일을 업로드해야 한다면 Cloud Storage 버킷에 대한 roles/storage.objectCreator 역할을 서비스 계정에 부여합니다.
  3. 해당 서비스 계정을 가장할 수 있는 외부 ID 권한 부여. 이 단계를 통해 GitLab CI/CD 잡이 서비스 계정 가장을 통해 Google Cloud에 인증할 수 있습니다. 이 단계는 서비스 계정 자체에 IAM 권한을 부여하여 외부 ID가 해당 서비스 계정으로 작동할 수 있는 권한을 부여합니다. 외부 ID는 principalSet:// 프로토콜을 사용하여 표현됩니다.

이전 단계와 마찬가지로 이 단계도 원하는 구성에 따라 크게 달라집니다. 예를 들어 GitLab 사용자 이름이 chris인 GitLab 사용자가 GitLab CI/CD 잡을 시작한 경우 my-service-account라는 서비스 계정을 GitLab CI/CD 잡이 가장할 수 있도록 허용하려면 my-service-account에 대한 외부 ID에 roles/iam.workloadIdentityUser IAM 역할을 부여합니다. 외부 ID는 다음 형식을 취합니다:

principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.user_login/chris

여기서 PROJECT_NUMBER는 Google Cloud 프로젝트 번호이고, POOL_ID는 첫 번째 섹션에서 만든 워크로드 ID 풀의 ID(이름이 아님)입니다.

이 구성은 또한 이전 섹션의 어설션에서 매핑된 속성으로 user_login을 추가했다고 가정합니다.

임시 자격 증명 가져오기#

OIDC 및 역할을 구성한 후 GitLab CI/CD 잡은 Google Cloud Security Token Service(STS)에서 임시 자격 증명을 가져올 수 있습니다.

CI/CD 잡에 id_tokens를 추가합니다:

job:
  id_tokens:
    GITLAB_OIDC_TOKEN:
      aud: https://gitlab.example.com

ID 토큰을 사용하여 임시 자격 증명을 가져옵니다:

PAYLOAD="$(cat <
FEDERATED_TOKEN="$(curl --fail "https://sts.googleapis.com/v1/token" \
  --header "Accept: application/json" \
  --header "Content-Type: application/json" \
  --data "${PAYLOAD}" \
  | jq -r '.access_token'
)"

여기서:

  • PROJECT_NUMBER는 Google Cloud 프로젝트 번호(이름이 아님)입니다.
  • POOL_ID는 첫 번째 섹션에서 만든 워크로드 ID 풀의 ID입니다.
  • PROVIDER_ID는 두 번째 섹션에서 만든 워크로드 ID 공급자의 ID입니다.
  • GITLAB_OIDC_TOKEN은 OIDC ID 토큰입니다.

그런 다음 결과 페더레이션 토큰을 사용하여 이전 섹션에서 만든 서비스 계정을 가장할 수 있습니다:

ACCESS_TOKEN="$(curl --fail "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT_EMAIL:generateAccessToken" \
  --header "Accept: application/json" \
  --header "Content-Type: application/json" \
  --header "Authorization: Bearer FEDERATED_TOKEN" \
  --data '{"scope": ["https://www.googleapis.com/auth/cloud-platform"]}' \
  | jq -r '.accessToken'
)"

여기서:

  • SERVICE_ACCOUNT_EMAIL은 이전 섹션에서 만든 가장할 서비스 계정의 전체 이메일 주소입니다.
  • FEDERATED_TOKEN은 이전 단계에서 가져온 페더레이션 토큰입니다.

결과는 Google Cloud OAuth 2.0 액세스 토큰으로, 이를 Bearer 토큰으로 사용할 때 대부분의 Google Cloud API 및 서비스에 인증하는 데 사용할 수 있습니다. 환경 변수 CLOUDSDK_AUTH_ACCESS_TOKEN을 설정하여 gcloud CLI에 이 값을 전달할 수도 있습니다.

작동 예시#

Terraform을 사용하여 GCP에서 OIDC를 프로비저닝하고 임시 자격 증명을 가져오는 샘플 스크립트에 대한 이 참조 프로젝트를 검토하세요.

트러블슈팅#

  • curl 응답을 디버깅할 때 curl의 최신 버전을 설치하세요. -f 대신 --fail-with-body를 사용하세요. 이 명령은 유용한 오류 메시지를 포함할 수 있는 전체 본문을 출력합니다.

  • 자세한 내용은 Workload Identity Federation 트러블슈팅을 참조하세요.