OpenID Connect 페더레이션용 역할 생성

OpenID Connect 페더레이션용 역할 생성 (콘솔)

AWS 계정에 AWS Identity and Access Management 사용자를 만드는 대신 OpenID Connect(OIDC) 페더레이션 ID 공급자를 사용할 수 있어요. ID 공급자(IdP)를 사용하면 AWS 외부에서 사용자 자격 증명을 관리하고, 이 외부 사용자 자격 증명에 계정의 AWS 리소스에 접근할 권한을 부여할 수 있어요. 페더레이션과 IdP에 대한 자세한 내용은 ID 공급자와 AWS로의 페더레이션 문서를 참고하세요.

출처: 문서

본문

OIDC용 역할 생성 사전 조건

OIDC 페더레이션용 역할을 만들기 전에 먼저 다음 사전 조건 단계를 완료해야 합니다.

OIDC 페더레이션용 역할 생성을 위한 준비

  1. 페더레이션 OIDC 자격 증명을 제공하는 하나 이상의 서비스에 가입합니다. AWS 리소스에 접근해야 하는 앱을 만드는 경우 앱을 공급자 정보로 구성합니다. 그렇게 하면 공급자가 앱에 고유한 애플리케이션 또는 오디언스(audience) ID를 제공합니다. (공급자마다 이 과정에 다른 용어를 사용합니다. 이 가이드는 공급자에게 앱을 식별하는 과정을 *구성(configure)*이라고 부릅니다.) 각 공급자에 여러 앱을 구성하거나, 단일 앱에 여러 공급자를 구성할 수 있어요. ID 공급자 사용에 대한 정보를 확인해 보세요.
  2. IdP에서 필요한 정보를 받은 후 IAM에 IdP를 만듭니다. 자세한 내용은 IAM에서 OpenID Connect(OIDC) ID 공급자 생성 문서를 참고하세요.

    중요 Google, Facebook, Amazon Cognito의 OIDC IdP를 사용한다면 AWS Management Console에 별도의 IAM IdP를 만들지 마세요. 이러한 OIDC ID 공급자는 AWS에 이미 내장되어 있으며 사용할 수 있습니다. 이 단계를 건너뛰고 다음 단계에서 IdP로 새 역할을 만드세요.

  3. IdP 인증 사용자가 수임할 역할의 정책을 준비합니다. 다른 역할과 마찬가지로 모바일 앱용 역할에는 두 개의 정책이 포함됩니다. 하나는 누가 역할을 수임할 수 있는지 지정하는 신뢰 정책이고, 다른 하나는 모바일 앱이 접근할 수 있거나 접근할 수 없는 AWS 작업과 리소스를 지정하는 권한 정책입니다. 웹 IdP의 경우 Amazon Cognito로 자격 증명을 관리할 것을 권장합니다. 이 경우 이 예제와 비슷한 신뢰 정책을 사용하세요.
{
    "Version":"2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Principal": {"Federated": "cognito-identity.amazonaws.com"},
        "Action": "sts:AssumeRoleWithWebIdentity",
        "Condition": {
            "StringEquals": {"cognito-identity.amazonaws.com:aud": "us-east-2:12345678-abcd-abcd-abcd-123456"},
            "ForAnyValue:StringLike": {"cognito-identity.amazonaws.com:amr": "unauthenticated"}
        }
    }
}

us-east-2:12345678-abcd-abcd-abcd-123456를 Amazon Cognito가 할당한 자격 증명 풀 ID로 교체하세요. OIDC IdP를 수동으로 구성하는 경우 신뢰 정책을 만들 때 당신의 앱만 역할을 수임할 수 있도록 보장하는 세 가지 값을 사용해야 합니다:

  • Action 요소에는 sts:AssumeRoleWithWebIdentity 작업을 사용합니다.
  • Principal 요소에는 문자열 {"Federated": providerUrl/providerArn}을 사용합니다.
  • 일반적인 일부 OIDC IdP의 경우 providerUrl은 URL입니다. 다음 예제는 일부 일반적인 IdP에 대한 주체를 지정하는 방법을 보여줍니다:
    • "Principal":{"Federated":"cognito-identity.amazonaws.com"}
    • "Principal":{"Federated":"www.amazon.com"}
    • "Principal":{"Federated":"graph.facebook.com"}
    • "Principal":{"Federated":"accounts.google.com"}
  • 다른 OIDC 공급자의 경우 2단계에서 만든 OIDC IdP의 Amazon Resource Name(ARN)을 사용합니다. 예:
    • "Principal":{"Federated":"arn:aws:iam::123456789012:oidc-provider/server.example.com"}
  • Condition 요소에는 권한을 제한하는 StringEquals 조건을 사용합니다. Amazon Cognito의 자격 증명 풀 ID(또는 다른 공급자의 앱 ID)를 테스트합니다. 자격 증명 풀 ID는 IdP로 앱을 구성할 때 받은 앱 ID와 일치해야 합니다. 이 ID 간의 일치는 요청이 당신의 앱에서 온 것임을 보장합니다.

참고 Amazon Cognito 자격 증명 풀용 IAM 역할은 서비스 주체 cognito-identity.amazonaws.com이 역할을 수임하도록 신뢰합니다. 이런 유형의 역할은 역할을 수임할 수 있는 주체를 제한하는 조건 키를 하나 이상 포함해야 합니다. 교차 계정 IAM 역할을 수임하는 Amazon Cognito 자격 증명 풀에는 추가 고려사항이 적용됩니다. 이러한 역할의 신뢰 정책은 cognito-identity.amazonaws.com 서비스 주체를 수락해야 하며, 역할 수임을 의도한 자격 증명 풀의 사용자만으로 제한하려면 aud 조건 키를 포함해야 합니다. 이 조건 없이 Amazon Cognito 자격 증명 풀을 신뢰하는 정책은 의도하지 않은 자격 증명 풀의 사용자가 역할을 수임할 수 있는 위험을 만듭니다. 자세한 내용은 Amazon Cognito 개발자 가이드의 Basic(Classic) 인증에서 IAM 역할의 신뢰 정책을 참고하세요.

사용 중인 IdP에 따라 다음 예제 중 하나와 유사한 조건 요소를 만드세요:

  • "Condition": {"StringEquals": {"cognito-identity.amazonaws.com:aud": "us-east:12345678-ffff-ffff-ffff-123456"}}
  • "Condition": {"StringEquals": {"www.amazon.com:app_id": "amzn1.application-oa2-123456"}}
  • "Condition": {"StringEquals": {"graph.facebook.com:app_id": "111222333444555"}}
  • "Condition": {"StringEquals": {"accounts.google.com:aud": "66677788899900pro0"}} OIDC 공급자의 경우 aud 컨텍스트 키와 함께 OIDC IdP의 정규화된 URL을 사용합니다. 예:
  • "Condition": {"StringEquals": {"server.example.com:aud": "appid_from_oidc_idp"}}

참고 역할의 신뢰 정책에 있는 주체 값은 특정 IdP에만 해당합니다. OIDC용 역할은 주체를 하나만 지정할 수 있습니다. 따라서 모바일 앱이 둘 이상의 IdP에서 사용자가 로그인하도록 허용한다면, 지원하려는 각 IdP에 대해 별도의 역할을 만드세요. 각 IdP에 대해 별도의 신뢰 정책을 만드세요.

사용자가 Login with Amazon으로 모바일 앱에 로그인하면 다음 예제 신뢰 정책이 적용됩니다. 예제에서 amzn1.application-oa2-123456은 Login with Amazon으로 앱을 구성할 때 Amazon이 할당한 앱 ID를 나타냅니다.

{
      "Version":"2012-10-17",
      "Statement": [{
          "Sid": "RoleForLoginWithAmazon",
          "Effect": "Allow",
          "Principal": {"Federated": "www.amazon.com"},
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {"StringEquals": {"www.amazon.com:app_id": "amzn1.application-oa2-123456"}}
      }]
  }

사용자가 Facebook으로 모바일 앱에 로그인하면 다음 예제 신뢰 정책이 적용됩니다. 이 예제에서 111222333444555는 Facebook이 할당한 앱 ID를 나타냅니다.

{
      "Version":"2012-10-17",
      "Statement": [{
          "Sid": "RoleForFacebook",
          "Effect": "Allow",
          "Principal": {"Federated": "graph.facebook.com"},
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {"StringEquals": {"graph.facebook.com:app_id": "111222333444555"}}
      }]
  }

사용자가 Google로 모바일 앱에 로그인하면 다음 예제 신뢰 정책이 적용됩니다. 이 예제에서 666777888999000은 Google이 할당한 앱 ID를 나타냅니다.

{
      "Version":"2012-10-17",
      "Statement": [{
          "Sid": "RoleForGoogle",
          "Effect": "Allow",
          "Principal": {"Federated": "accounts.google.com"},
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {"StringEquals": {"accounts.google.com:aud": "666777888999000"}}
      }]
  }

사용자가 Amazon Cognito로 모바일 앱에 로그인하면 다음 예제 신뢰 정책이 적용됩니다. 이 예제에서 us-east:12345678-ffff-ffff-ffff-123456은 Amazon Cognito가 할당한 자격 증명 풀 ID를 나타냅니다.

{
      "Version":"2012-10-17",
      "Statement": [{
          "Sid": "RoleForCognito",
          "Effect": "Allow",
          "Principal": {"Federated": "cognito-identity.amazonaws.com"},
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {"StringEquals": {"cognito-identity.amazonaws.com:aud": "us-east:12345678-ffff-ffff-ffff-123456"}}
      }]
  }

OIDC용 역할 생성

사전 조건을 완료한 후 IAM에서 역할을 만들 수 있어요. 인식되는 공유 OpenID Connect(OIDC) ID 공급자(IdP)의 경우 IAM은 *ID 공급자 통제(identity-provider controls)*라고 하는 JSON Web Token(JWT)의 특정 클레임을 명시적으로 평가하도록 요구합니다. 어떤 OIDC IdP에 ID 공급자 통제가 있는지에 대한 자세한 내용은 공유 OIDC 공급자용 ID 공급자 통제 문서를 참고하세요.

다음 절차는 AWS Management Console에서 OIDC 페더레이션용 역할을 만드는 방법을 설명합니다. AWS CLI 또는 AWS API로 역할을 만들려면 써드파티 ID 공급자용 역할 생성 문서의 절차를 참고하세요.

중요 Amazon Cognito를 사용한다면 Amazon Cognito 콘솔을 사용해 역할을 설정하세요. 그렇지 않으면 IAM 콘솔을 사용해 OIDC 페더레이션용 역할을 만드세요.

OIDC 페더레이션용 IAM 역할 생성

  1. AWS Management Console에 로그인하고 https://console.aws.amazon.com/iam/에서 IAM 콘솔을 엽니다.
  2. 탐색 창에서 역할(Roles) 을 선택한 다음 역할 생성(Create role) 을 선택합니다.
  3. 신뢰할 개체 유형으로 웹 자격 증명(Web identity) 을 선택하고 다음(Next) 을 선택합니다.
  4. ID 공급자(Identity provider) 에서 역할의 IdP를 선택합니다:
    • 개별 웹 IdP용 역할을 만들려면 Login with Amazon, Facebook, Google 중 하나를 선택합니다.

    참고 지원하려는 각 IdP에 대해 별도의 역할을 만들어야 합니다.

    • Amazon Cognito용 고급 시나리오 역할을 만들려면 Amazon Cognito 를 선택합니다.

    참고 Amazon Cognito와 함께 사용할 역할은 고급 시나리오에서 작업할 때만 수동으로 만들어야 합니다. 그 외에는 Amazon Cognito가 역할을 만들어줍니다. Amazon Cognito에 대한 자세한 내용은 Amazon Cognito 개발자 가이드의 자격 증명 풀(페더레이션 자격 증명) 외부 ID 공급자를 참고하세요.

    • GitHub Actions용 역할을 만들려면 먼저 GitHub OIDC 공급자를 IAM에 추가해야 합니다. GitHub OIDC 공급자를 IAM에 추가한 후 token.actions.githubusercontent.com 을 선택합니다.

    참고 GitHub의 OIDC 공급자를 페더레이션 자격 증명으로 신뢰하도록 AWS를 구성하는 방법은 GitHub Docs - Amazon Web Services에서 OpenID Connect 구성을 참고하세요. GitHub용 IAM IdP와 연결된 역할의 접근 제한 모범 사례는 이 페이지의 "GitHub OIDC ID 공급자용 역할 구성"을 참고하세요.

    • HashiCorp Cloud Platform(HCP) Terraform용 역할을 만들려면 먼저 Terraform OIDC 공급자를 IAM에 추가해야 합니다. Terraform OIDC 공급자를 IAM에 추가한 후 app.terraform.io 를 선택합니다.

    중요 HashiCorp Cloud Platform(HCP) Terraform OIDC 공급자용 IAM 역할은 역할 신뢰 정책에서 IAM 조건 키 app.terraform.io:sub를 평가해야 합니다. 이 조건 키는 어떤 HCP Terraform 조직, 프로젝트, 워크스페이스 또는 실행 단계가 역할을 수임할 수 있는지 제한합니다. 이 조건 키가 없으면 신뢰 정책은 조직 외부의 자격 증명이 역할과 AWS 리소스에 접근하도록 부여하며, 이는 최소 권한 원칙과 맞지 않습니다. AWS 계정에서 HCP Terraform OIDC 공급자와 연결된 역할에 대한 신뢰 정책을 설정하거나 수정할 때 IAM 조건 키 app.terraform.io:sub를 평가하지 않으면 오류가 발생합니다. 또한 역할 신뢰 정책이 이 조건 키를 평가하지 않으면 AWS STS는 인가 요청을 거부합니다.

  5. 요청되는 정보는 선택한 OIDC 공급자에 따라 다릅니다.
    • 애플리케이션의 식별자를 입력합니다. 식별자 레이블은 선택한 공급자에 따라 다릅니다:
      • Login with Amazon용 역할을 만들려면 애플리케이션 ID(Application ID) 상자에 앱 ID를 입력합니다.
      • Facebook용 역할을 만들려면 애플리케이션 ID(Application ID) 상자에 앱 ID를 입력합니다.
      • Google용 역할을 만들려면 오디언스(Audience) 상자에 오디언스 이름을 입력합니다.
      • Amazon Cognito용 역할을 만들려면 자격 증명 풀 ID(Identity Pool ID) 상자에 Amazon Cognito 애플리케이션용으로 만든 자격 증명 풀의 ID를 입력합니다.
      • GitHub Actions용 역할을 만들려면 다음 세부 정보를 입력합니다:
        • 오디언스(Audience) 에서 sts.amazonaws.com 을 선택합니다.
        • GitHub 조직(GitHub organization) 에 GitHub 조직 이름을 입력합니다. GitHub 조직 이름은 필수이며, 대시(-)를 포함한 영숫자여야 합니다. GitHub 조직 이름에는 와일드카드 문자(* 및 ?)를 사용할 수 없습니다.
        • (선택) GitHub 저장소(GitHub repository) 에 GitHub 저장소 이름을 입력합니다. 값을 지정하지 않으면 와일드카드(*)로 기본 설정됩니다.
        • (선택) GitHub 브랜치(GitHub branch) 에 GitHub 브랜치 이름을 입력합니다. 값을 지정하지 않으면 와일드카드(*)로 기본 설정됩니다.
      • HashiCorp Cloud Platform(HCP) Terraform용 역할을 만들려면 다음 세부 정보를 입력합니다:
        • 오디언스(Audience) 에서 aws.workload.identity 를 선택합니다.
        • 조직(Organization) 에 조직 이름을 입력합니다. 모든 조직에 와일드카드 문자(*)를 지정할 수 있습니다.
        • 프로젝트(Project) 에 프로젝트 이름을 입력합니다. 모든 프로젝트에 와일드카드 문자(*)를 지정할 수 있습니다.
        • 워크스페이스(Workspace) 에 워크스페이스 이름을 입력합니다. 모든 워크스페이스에 와일드카드 문자(*)를 지정할 수 있습니다.
        • 실행 단계(Run Phase) 에 실행 단계 이름을 입력합니다. 모든 실행 단계에 와일드카드 문자(*)를 지정할 수 있습니다.
  6. (선택) 조건 (선택)(Condition (optional)) 에서 조건 추가(Add Condition) 를 선택해 애플리케이션 사용자가 역할이 부여한 권한을 사용할 수 있기 전에 충족해야 하는 추가 조건을 만듭니다. 예를 들어 특정 IAM 사용자 ID에만 AWS 리소스에 대한 접근을 부여하는 조건을 추가할 수 있어요. 역할이 생성된 후에도 신뢰 정책에 조건을 추가할 수 있습니다. 자세한 내용은 역할 신뢰 정책 업데이트 문서를 참고하세요.
  7. OIDC 정보를 검토한 다음 다음(Next) 을 선택합니다.
  8. IAM이 계정의 AWS 관리형 및 고객 관리형 정책 목록을 표시합니다. 권한 정책에 사용할 정책을 선택하거나 정책 생성(Create policy) 을 선택해 새 브라우저 탭을 열고 처음부터 새 정책을 만듭니다. 자세한 내용은 IAM 정책 생성 문서를 참고하세요. 정책을 만든 후 그 탭을 닫고 원래 탭으로 돌아갑니다. OIDC 사용자가 갖기를 원하는 권한 정책 옆의 확인란을 선택합니다. 원하면 지금은 정책을 선택하지 않고 나중에 역할에 정책을 연결할 수도 있어요. 기본적으로 역할에는 권한이 없습니다.
  9. (선택) 권한 경계(permissions boundary)를 설정합니다. 이는 고급 기능입니다. 권한 경계(Permissions boundary) 섹션을 열고 권한 경계로 최대 역할 권한 통제(Use a permissions boundary to control the maximum role permissions) 를 선택합니다. 권한 경계에 사용할 정책을 선택합니다.
  10. 다음(Next) 을 선택합니다.
  11. 역할 이름(Role name) 에 역할 이름을 입력합니다. 역할 이름은 AWS 계정 내에서 고유해야 합니다. 대소문자를 구분하지 않습니다. 예를 들어 PRODROLE과 prodrole이라는 이름의 역할을 둘 다 만들 수 없습니다. 다른 AWS 리소스가 역할을 참조할 수 있으므로 역할을 만든 후에는 이름을 편집할 수 없습니다.
  12. (선택) 설명(Description) 에 새 역할에 대한 설명을 입력합니다.
  13. 역할의 사용 사례와 권한을 편집하려면 1단계: 신뢰할 개체 선택(Step 1: Select trusted entities) 또는 2단계: 권한 추가(Step 2: Add permissions) 섹션에서 편집(Edit) 을 선택합니다.
  14. (선택) 역할에 메타데이터를 추가하려면 키-값 쌍으로 태그를 연결합니다. IAM에서 태그 사용에 대한 자세한 내용은 AWS Identity and Access Management 리소스 태그 문서를 참고하세요.
  15. 역할을 검토한 다음 역할 생성(Create role) 을 선택합니다.

GitHub OIDC ID 공급자용 역할 구성

GitHub을 OpenID Connect(OIDC) ID 공급자(IdP)로 사용한다면 IAM IdP와 연결된 역할을 수임할 수 있는 개체를 제한하는 것이 모범 사례입니다. 신뢰 정책에 조건 문을 포함하면 역할을 특정 GitHub 조직, 저장소, 또는 브랜치로 제한할 수 있어요. 문자열 조건 연산자와 함께 조건 키 token.actions.githubusercontent.com:sub를 사용해 접근을 제한할 수 있습니다. GitHub 조직 내의 특정 저장소나 브랜치 세트로 조건을 제한할 것을 권장합니다. GitHub의 OIDC를 페더레이션 자격 증명으로 신뢰하도록 AWS를 구성하는 방법은 GitHub Docs - Amazon Web Services에서 OpenID Connect 구성을 참고하세요.

액션 워크플로나 OIDC 정책에서 GitHub 환경을 사용한다면 추가 보안을 위해 환경에 보호 규칙을 추가할 것을 강력히 권장합니다. 배포 브랜치와 태그를 사용해 환경에 배포할 수 있는 브랜치와 태그를 제한하세요. 보호 규칙으로 환경을 구성하는 방법은 GitHub의 배포를 위한 환경 사용 문서의 배포 브랜치와 태그를 참고하세요.

GitHub의 OIDC IdP가 역할의 신뢰할 주체(Principal)일 때 IAM은 역할 신뢰 정책 조건을 확인해 조건 키 token.actions.githubusercontent.com:sub가 존재하고 그 값이 단순히 와일드카드 문자(* 및 ?)나 null이 아닌지 검증합니다. IAM은 신뢰 정책이 생성되거나 업데이트될 때 이 검사를 수행합니다. 조건 키 token.actions.githubusercontent.com:sub가 없거나 키 값이 언급한 값 기준을 충족하지 않으면 요청이 실패하고 오류가 반환됩니다.

중요 조건 키 token.actions.githubusercontent.com:sub를 특정 조직이나 저장소로 제한하지 않으면, 당신이 통제하지 않는 조직이나 저장소의 GitHub Actions가 당신의 AWS 계정에서 GitHub IAM IdP와 연결된 역할을 수임할 수 있습니다.

다음 예제 신뢰 정책은 정의된 GitHub 조직, 저장소, 브랜치로 접근을 제한합니다. 다음 예제의 조건 키 token.actions.githubusercontent.com:sub 값은 GitHub가 문서화한 기본 subject 값 형식입니다.

{
  "Version":"2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::012345678910:oidc-provider/token.actions.githubusercontent.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "token.actions.githubusercontent.com:aud": "sts.amazonaws.com",
          "token.actions.githubusercontent.com:sub": "repo:GitHubOrg/GitHubRepo:ref:refs/heads/GitHubBranch"
        }
      }
    }
  ]
}

다음 예제 조건은 정의된 GitHub 조직과 저장소로 접근을 제한하지만 저장소 내의 모든 브랜치에 접근을 부여합니다.

"Condition": {
  "StringEquals": {
          "token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
  },
  "StringLike": {
    "token.actions.githubusercontent.com:sub": "repo:GitHubOrg/GitHubRepo:*"
  }
}

다음 예제 조건은 정의된 GitHub 조직 내의 모든 저장소나 브랜치로 접근을 제한합니다. 조건 키 token.actions.githubusercontent.com:sub를 GitHub 조직 내의 GitHub Actions로 접근을 제한하는 특정 값으로 제한할 것을 권장합니다.

"Condition": {
  "StringEquals": {
          "token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
  },
  "StringLike": {
    "token.actions.githubusercontent.com:sub": "repo:GitHubOrg/*"
  }
}

정책의 조건 확인에 사용할 수 있는 OIDC 페더레이션 키에 대한 자세한 내용은 AWS OIDC 페더레이션에 사용 가능한 키 문서를 참고하세요.

더 알아보기 (Learn more)