Skip to main content

OpenID Connect

OpenID Connect를 사용하면 워크플로가 클라우드 공급자에서 직접 단기 토큰을 교환할 수 있습니다.

OpenID Connect (OIDC) 개요

GitHub Actions 워크플로는 소프트웨어를 배포하거나 클라우드 서비스를 이용할 때 AWS, Azure, GCP, HashiCorp Vault 같은 클라우드 공급자에 접근하도록 설계되는 경우가 많습니다. 워크플로가 이러한 리소스에 액세스하기 전에 클라우드 공급자에게 암호 또는 토큰과 같은 자격 증명을 제공합니다. 이러한 자격 증명은 일반적으로 GitHub에 비밀로 저장되며 워크플로는 실행될 때마다 클라우드 공급자에게 이 비밀을 제공합니다.

그러나 하드 코딩된 비밀을 사용하려면 클라우드 공급자에서 자격 증명을 만든 다음, GitHub에서 비밀로 복제해야 합니다.

클라우드 공급자와 OIDC 기반 신뢰 관계를 구축하면, 워크플로에서 해당 공급자에게 직접 단기 액세스 토큰을 요청하도록 설정할 수 있습니다.

OIDC 사용의 이점

OIDC 토큰을 사용하도록 워크플로를 업데이트하면 다음과 같은 적절한 보안 사례를 채택할 수 있습니다.

  •           **클라우드 비밀 없음:** 수명이 긴 GitHub 비밀을 사용하여 클라우드 자격 증명을 복제할 필요가 없습니다. 대신 클라우드 공급자에서 OIDC 트러스트를 구성한 다음, 워크플로를 업데이트하여 OIDC를 통해 클라우드 공급자로부터 단기 액세스 토큰을 요청할 수 있습니다.
    
  •           **인증 및 권한 부여 관리**: 워크플로가 자격 증명을 활용하는 방식과 클라우드 공급자의 인증 및 권한 부여 도구를 통해 클라우드 리소스 접근을 관리하는 과정을 더욱 정밀하게 통제할 수 있습니다.
    
  •           **자격 증명 순환**: OIDC를 활용하면 클라우드 제공업체가 특정 작업에 한해 유효한 단기 액세스 토큰을 발급하며, 해당 토큰은 작업 완료 후 자동으로 만료됩니다.
    

OIDC가 GitHub Actions와 통합되는 방법

아래 다이어그램은 GitHub OIDC 공급자가 클라우드 공급자 및 워크플로와 통합되는 전체적인 구조를 보여줍니다.

클라우드 서비스 제공업체가 액세스 토큰과 JSON 웹 토큰(JWT) 기반의 클라우드 역할 ID를 활용하여 GitHub Actions와 연동되는 과정을 설명하는 다이어그램입니다.

  1. 클라우드 공급자에서 OIDC 신뢰 관계를 구성하면, 특정 GitHub 워크플로가 지정된 클라우드 역할을 사용해 클라우드 액세스 토큰을 요청할 수 있습니다.
  2. GitHub의 OIDC 공급자는 작업이 실행될 때마다 자동으로 OIDC 토큰을 생성하여 제공합니다. 이 토큰에는 인증하려는 특정 워크플로에 대해 보안이 강화되고 확인 가능한 ID를 설정하는 여러 클레임이 포함되어 있습니다.
  3. 워크플로 작업의 각 단계나 작업은 GitHub의 OIDC 공급자에게 토큰을 요청할 수 있으며, 이를 통해 워크플로의 신원을 증명하는 자격 증명으로 클라우드 공급자에 제시할 수 있습니다.
  4. 클라우드 공급자가 토큰에 제공된 클레임의 유효성을 성공적으로 검사하면 작업 기간 동안에만 사용할 수 있는 수명이 짧은 클라우드 액세스 토큰을 제공합니다.

OIDC 토큰 이해

각 작업은 GitHub의 OIDC 공급자로부터 OIDC 토큰을 요청합니다. 이 공급자는 생성된 각 워크플로 작업에 대해 고유한 자동으로 생성된 JWT(JSON Web Token)로 응답합니다. 작업이 실행되면 클라우드 공급자에게 OIDC 토큰이 표시됩니다. 토큰의 유효성을 검사하기 위해 클라우드 공급자는 OIDC 토큰의 주체 및 기타 클레임이 클라우드 역할의 OIDC 트러스트 정의에 미리 구성된 조건과 일치하는지 확인합니다.

다음 예제 OIDC 토큰은 octo-org/octo-repo 리포지토리에 sub라는 작업 환경을 참조하는 주체(prod)를 사용합니다.

{
  "typ": "JWT",
  "alg": "RS256",
  "x5t": "example-thumbprint",
  "kid": "example-key-id"
}
{
  "jti": "example-id",
  "sub": "repo:octo-org/octo-repo:environment:prod",
  "environment": "prod",
  "aud": "https://HOSTNAME/octo-org",
  "ref": "refs/heads/main",
  "sha": "example-sha",
  "repository": "octo-org/octo-repo",
  "repository_owner": "octo-org",
  "actor_id": "12",
  "repository_visibility": "private",
  "repository_id": "74",
  "repository_owner_id": "65",
  "run_id": "example-run-id",
  "run_number": "10",
  "run_attempt": "2",
  "runner_environment": "github-hosted",
  "actor": "octocat",
  "workflow": "example-workflow",
  "head_ref": "",
  "base_ref": "",
  "event_name": "workflow_dispatch",
  "enterprise": "avocado-corp",
  "enterprise_id": "2",
  "ref_type": "branch",
  "job_workflow_ref": "octo-org/octo-automation/.github/workflows/oidc.yml@refs/heads/main",
  "iss": "https://HOSTNAME/_services/token",
  "nbf": 1632492967,
  "exp": 1632493867,
  "iat": 1632493567
}

OIDC를 활용하여 사용자 정의 작업에 대한 인증

OIDC를 통한 인증은 getIDToken() Actions 도구 키트 또는 curl 명령의 메서드를 활용하여 사용자 지정 작업에서 수행됩니다.

자세한 내용은 OpenID 연결 참조을(를) 참조하세요.

OIDC에 대한 워크플로 업데이트

GitHub Actions 워크플로에서는 비밀 정보 대신 OIDC 토큰을 활용하여 클라우드 공급자 인증을 처리할 수 있습니다. 주요 클라우드 공급자들은 워크플로에서 OIDC를 활용한 인증 프로세스를 간편하게 처리할 수 있도록 공식 로그인 작업을 제공합니다. 특정 클라우드 공급자를 통해 워크플로를 업데이트하는 방법에 대해 자세히 알아보려면 배포 보안 강화을 참고하시기 바랍니다.

Dependabot에 대한 OIDC 지원

Dependabot OIDC를 사용하여 개인 레지스트리로 인증할 수 있으므로 수명이 긴 자격 증명을 리포지토리 비밀로 저장할 필요가 없습니다. OIDC 기반 인증을 사용하면 Dependabot 업데이트 작업이 클라우드 ID 공급자로부터 수명이 짧은 자격 증명을 동적으로 가져올 수 있습니다.

Dependabot는 레지스트리가 AWS CodeArtifact, Azure DevOps Artifacts 또는 JFrog Artifactory에서 호스트되는 경우, usernamepassword 인증을 사용하는 모든 레지스트리 유형에 대해 OIDC 인증을 지원합니다.

Dependabot에서 OIDC 인증을 사용할 때의 이점은 다음과 같습니다.

  •         **향상된 보안:** 리포지토리에서 수명이 긴 정적 자격 증명을 제거합니다.
    
  •         **더 간단한 관리:** 프라이빗 레지스트리에 대한 보안 정책 규격 액세스를 사용하도록 설정합니다.
    
  •         **속도 제한 방지:** 동적 자격 증명을 사용하면 정적 토큰과 관련된 속도 제한에 도달하는 것을 방지할 수 있습니다.
    

자세한 내용은 Dependabot에 대한 개인 레지스트리 액세스 구성을(를) 참조하세요.

다음 단계

OIDC 설정에 관한 자세한 내용은 배포 보안 강화을 참고하시기 바랍니다.

OIDC에 대한 참조 정보는 OpenID 연결 참조을 참고하시기 바랍니다.