AWS에서 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를 사용하세요.

이 튜토리얼에서는 비밀을 저장할 필요 없이 JSON 웹 토큰(JWT)과 함께 GitLab CI/CD 작업을 사용하여 AWS에서 임시 자격 증명을 검색하는 방법을 보여줍니다.
이를 위해 GitLab과 AWS 간의 ID 연합을 위한 OpenID Connect(OIDC)를 구성해야 합니다. OIDC를 사용하여 GitLab을 통합하기 위한 배경 및 요구 사항은 클라우드 서비스에 연결하기를 참조하세요.

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

  1. 아이덴티티 공급자 추가
  2. 역할 및 신뢰 구성
  3. 임시 자격 증명 검색

아이덴티티 공급자 추가

다음 지침에 따라 GitLab을 AWS의 IAM OIDC 공급자로 만듭니다.

다음 정보를 포함하세요:

  • Provider URL: https://gitlab.com 또는 http://gitlab.example.com과 같은 GitLab 인스턴스의 주소입니다. 이 주소는 공개적으로 접근 가능해야 합니다.
  • Audience: https://gitlab.com 또는 http://gitlab.example.com과 같은 GitLab 인스턴스의 주소입니다.
    • 주소는 https://를 포함해야 합니다.
    • 후행 슬래시는 포함하지 마세요.

역할 및 신뢰 구성

아이덴티티 공급자를 생성한 후, GitLab 리소스에 대한 접근을 제한하는 조건을 가진 웹 아이덴티티 역할을 구성합니다. 임시 자격 증명은 AWS 보안 토큰 서비스를 사용하여 얻으므로 Actionsts:AssumeRoleWithWebIdentity로 설정합니다.

특정 그룹, 프로젝트, 브랜치 또는 태그에 대한 인가를 제한하는 커스텀 신뢰 정책을 생성할 수 있습니다.
지원되는 필터링 유형의 전체 목록은 클라우드 서비스에 연결하기를 참조하세요.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::AWS_ACCOUNT:oidc-provider/gitlab.example.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "gitlab.example.com:sub": "project_path:mygroup/myproject:ref_type:branch:ref:main"
        }
      }
    }
  ]
}

역할을 생성한 후에는 AWS 서비스(S3, EC2, Secrets Manager)에 대한 권한을 정의하는 정책을 연결합니다.

임시 자격 증명 검색

OIDC와 역할을 구성한 후, GitLab CI/CD 작업은 AWS Security Token Service (STS)에서 임시 자격 증명을 검색할 수 있습니다.

assume role:
  id_tokens:
    GITLAB_OIDC_TOKEN:
      aud: https://gitlab.example.com
  script:
    - >
      export $(printf "AWS_ACCESS_KEY_ID=%s AWS_SECRET_ACCESS_KEY=%s AWS_SESSION_TOKEN=%s"
      $(aws sts assume-role-with-web-identity
      --role-arn ${ROLE_ARN}
      --role-session-name "GitLabRunner-${CI_PROJECT_ID}-${CI_PIPELINE_ID}"
      --web-identity-token ${GITLAB_OIDC_TOKEN}
      --duration-seconds 3600
      --query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]'
      --output text))
    - aws sts get-caller-identity
  • ROLE_ARN: 이 단계에서 정의된 역할 ARN입니다.
  • GITLAB_OIDC_TOKEN: OIDC ID 토큰입니다.

작업 예시

문제 해결

오류: Not authorized to perform sts:AssumeRoleWithWebIdentity

다음 오류가 표시되는 경우:

An error occurred (AccessDenied) when calling the AssumeRoleWithWebIdentity operation:
Not authorized to perform sts:AssumeRoleWithWebIdentity

다음과 같은 여러 가지 이유로 발생할 수 있습니다:

  • 클라우드 관리자가 GitLab과 OIDC를 사용하도록 프로젝트를 구성하지 않았습니다.
  • 역할이 브랜치 또는 태그에서 실행되는 것이 제한되어 있습니다. 조건부 역할 구성을 참조하세요.
  • 와일드카드 조건을 사용할 때 StringLike 대신 StringEquals가 사용되었습니다. 관련 문제를 참조하세요.

Could not connect to openid configuration of provider 오류

AWS IAM에 ID 공급자를 추가한 후, 다음과 같은 오류가 발생할 수 있습니다:

Your request has a problem. Please see the following details.
  - Could not connect to openid configuration of provider: `https://gitlab.example.com`

이 오류는 OIDC ID 공급자의 발급자가 순서가 맞지 않거나 중복 또는 추가 인증서가 포함된 인증서 체인을 제시할 때 발생합니다.

GitLab 인스턴스의 인증서 체인을 확인하십시오. 체인은 도메인 또는 발급자 URL로 시작한 다음, 중간 인증서, 마지막으로 루트 인증서로 끝나야 합니다. 다음 명령어를 사용하여 인증서 체인을 검토하십시오. gitlab.example.com을 GitLab 호스트 이름으로 바꾸십시오:

echo | /opt/gitlab/embedded/bin/openssl s_client -connect gitlab.example.com:443

신원 공급자로부터 검증 키를 검색할 수 없습니다 오류

다음과 유사한 오류가 발생할 수 있습니다:

  • AssumeRoleWithWebIdentity 작업을 호출할 때 오류가 발생했습니다(InvalidIdentityToken): 신원 공급자로부터 검증 키를 검색할 수 없습니다. 요구 사항에 대한 참고는 AssumeRoleWithWebIdentity 문서를 참조하십시오.

이 오류는 다음과 같은 이유 때문일 수 있습니다:

  • 신원 공급자(IdP)의 .well_known URL과 jwks_uri에 공용 인터넷에서 접근할 수 없습니다.
  • 사용자 정의 방화벽이 요청을 차단하고 있습니다.
  • API 요청에서 IdP가 AWS STS 엔드포인트에 도달하는 데 5초 이상의 지연이 발생하고 있습니다.
  • STS가 여러분의 .well_known URL 또는 IdP의 jwks_uri에 대해 너무 많은 요청을 하고 있습니다.

이 오류에 대한 AWS 지식 센터 기사에 문서화된 바와 같이,

여러분의 GitLab 인스턴스는 .well_known URL과 jwks_uri가 해결될 수 있도록 공용으로 접근할 수 있어야 합니다.

만약 여러분의 GitLab 인스턴스가 오프라인 환경에 있는 경우와 같은 불가능한 상황이라면,

문제 #391928를 참고하여

우회 방법과 보다 영구적인 솔루션이 조사되고 있습니다.