AWS와 워크로드 아이덴티티 페더레이션

AWS와 워크로드 아이덴티티 페더레이션 (Federate workload identity with AWS)

HCP가 EC2 또는 Lambda에서 실행되는 워크로드 같은 외부 워크로드를 인증하도록 AWS와 워크로드 아이덴티티 페더레이션을 설정하는 방법을 설명해 드릴게요. 인증된 워크로드는 HCP 서비스 주체 키를 전혀 저장하지 않고 HCP 서비스와 상호작용할 수 있어요.

출처: 문서

본문

사전 요구 사항

AWS용 워크로드 아이덴티티 제공자를 구성하기 전에 다음 단계를 완료해야 해요.

  • HCP 프로젝트에 대한 Admin 역할이 있어야 해요.
  • 원하는 프로젝트에 서비스 주체를 만들고 워크로드가 필요로 하는 HCP 리소스에 대한 접근 권한을 부여해요.
  • HCP로의 접근을 페더레이션할 AWS 계정에 대한 접근 권한이 있어야 해요.
  • 원하는 구성 워크플로에 따라 HCP CLI를 설치하거나 HCP Terraform Provider를 사용해요.

AWS용 워크로드 아이덴티티 제공자 구성

AWS용 HCP 워크로드 아이덴티티 제공자를 만들려면 다음 구성 값을 제공해야 해요.

  • AWS Account ID
  • 조건부 접근 문.

AWS Account ID를 모르면 AWS 문서에서 안내를 참고하세요.

조건부 접근 문 (Conditional access statement)

워크로드 아이덴티티를 페더레이션할 때 요구 사항 중 하나가 조건부 접근 문이에요. 이 문은 아이덴티티 클레임에 접근할 수 있고 어떤 외부 아이덴티티가 허용되는지 제한하는 불리언 표현식이에요.

AWS를 사용할 때 AWS GetCallerIdentity 응답에 해당하는 다음 선택자에 접근할 수 있어요.

  • aws.arn: 호출 엔티티와 연결된 AWS ARN
  • aws.account_id: 호출 엔티티를 소유하거나 포함하는 계정의 AWS 계정 ID 번호
  • aws.user_id: 호출 엔티티의 고유 식별자

이 필드의 값을 확인하려면 구성하려는 워크로드 인스턴스에서 aws sts get-caller-identity 명령을 실행해요.

이 값을 사용해 조건부 접근 문을 구성해요. 가장 유용한 속성은 aws.arn인데, 다음 구문에 따라 형식화해요.

`arn:aws:sts::<AWS_ACCOUNT_ID>:assumed-role/<AWS_IAM_ROLE>/<EC2_INSTANCE_ID>`

다음 예시에서 123456789012는 AWS Account ID이고, my-app-role은 EC2 인스턴스에 연결된 AWS IAM 역할이며, i-00000000000000000은 EC2 Instance ID예요.

`arn:aws:sts::123456789012:assumed-role/my-app-role/i-00000000000000000`

다음 조건부 접근 문은 my-app-role IAM 역할이 연결된 인스턴스에 대해서만 HCP 서비스 접근을 제한해요.

`aws.arn matches “^arn:aws:sts::123456789012:assumed-role/my-app-role/”`

워크로드 아이덴티티 제공자 만들기

필요한 정보를 정리한 뒤 AWS용 워크로드 아이덴티티 제공자를 만들어요.

HCP CLI / Terraform

hcp iam workload-identity-providers create-aws 명령을 사용해요.

$ hcp iam workload-identity-providers create-aws <PROVIDER_NAME> \
  --account-id=<AWS_ACCOUNT_ID> \
  --conditional-access=<CONDITION> \
  --service-principal=<SP_RESOURCE_NAME> \
  --description=<DESCRIPTION>

이 명령에는 AWS와 HCP 계정에 특정한 다음 정보가 필요해요.

  • <PROVIDER_NAME>: 만들 워크로드 아이덴티티 제공자의 이름.
  • <AWS_ACCOUNT_ID>: 페더레이션을 허용하려는 AWS Account ID.
  • <CONDITION>: 지정된 AWS 워크로드에 대한 접근을 제한하는 조건부 접근 문.
  • <SP_RESOURCE_NAME>: iam/project/<PROJECT_ID>/service-principal/<NAME> 형식의 서비스 주체 리소스 이름.
  • <DESCRIPTION>: 프로바이더에 대한 선택적인 설명.

다음 예시는 aws-example이라는 워크로드 아이덴티티 제공자를 만들어요. 이 제공자는 my-app-role AWS IAM 역할이 연결된 워크로드만 요구해 외부 워크로드 접근을 제한하도록 HCP를 구성해요. HCP 서비스에 대한 접근 권한을 부여받은 워크로드는 my-app-runtime 서비스 주체를 사용해요.

$ hcp iam workload-identity-providers create-aws aws-example \
  --account-id=123456789012 \
  --conditional-access='aws.arn matches "^arn:aws:iam::123456789012:role/my-app-role/"' \
  --service-principal=iam/project/dcffbc8c-0873-4acc-bf96-4c79a4c3fd1a/service-principal/my-app-runtime \
  --description="Allow my-app-role on AWS to act as my-app-runtime service principal"

hcp_iam_workload_identity_provider 리소스를 사용해요.

# Replace with an existing service principal if created ahead of time.
resource "hcp_service_principal" "workload_sp" {
    name = "my-app-runtime"
    }

resource "hcp_iam_workload_identity_provider" "example" {
    name              = "aws-example"
    service_principal = hcp_service_principal.workload_sp.resource_name
    description       = "Allow my-app on AWS to act as my-app-runtime service principal"

    aws {
        # Only allow workloads from this AWS Account to exchange identity
        account_id = "<AWS_ACCOUNT_ID>"
    }

    conditional_access = "<CONDITION>"
}

이 구성에는 AWS와 HCP 계정에 특정한 다음 정보가 필요해요.

  • <AWS_ACCOUNT_ID>: 페더레이션을 허용하려는 AWS Account ID.
  • <CONDITION>: 지정된 AWS 워크로드에 대한 접근을 제한하는 조건부 접근 문.

다음 예시는 aws-example이라는 워크로드 아이덴티티 제공자를 만들어요. 이 제공자는 my-app-role AWS IAM 역할이 연결된 워크로드만 요구해 외부 워크로드 접근을 제한하도록 HCP를 구성해요. HCP 서비스에 대한 접근 권한을 부여받은 워크로드는 my-app-runtime 서비스 주체를 사용해요.

# Replace with an existing service principal if created ahead of time.
resource "hcp_service_principal" "workload_sp" {
    name = "my-app-runtime"
    }

resource "hcp_iam_workload_identity_provider" "example" {
    name              = "aws-example"
    service_principal = hcp_service_principal.workload_sp.resource_name
    description       = "Allow my-app-role on AWS to act as my-app-runtime service principal"

    aws {
        # Only allow workloads from this AWS Account to exchange identity
        account_id = "123456789012"
    }

    # Restrict access to workloads running with "my-app-role".
    conditional_access = "aws.arn matches `^arn:aws:sts::123456789012:assumed-role/my-app-role/`"
}

워크로드의 자격 증명 인증

HCP CLI, HCP Terraform Provider, HCP Go SDK를 사용해 외부 자격 증명을 자동으로 가져와 HCP 액세스 토큰으로 교환할 수 있어요. 이 과정은 외부 자격 증명을 얻는 데 필요한 정보와 교환할 워크로드 아이덴티티 제공자를 포함하는 자격 증명 파일을 사용해요.

자세한 내용은 credential files 문서를 참고하세요.

AWS용 자격 증명 파일 만들기

hcp iam workload-identity-providers create-cred-file 명령을 사용해요.

$ hcp iam workload-identity-providers create-cred-file <PROVIDER_NAME> \
  --aws \
  --output-file=credentials.json

이 명령에는 HCP 계정에 특정한 다음 정보가 필요해요.

  • <PROVIDER_NAME>: iam/project/<PROJECT_ID>/service-principal/<SP_NAME>/workload-identity-provider/<PROVIDER_NAME> 형식으로 자격 증명을 교환할 Workload Identity Provider의 이름.

다음 예시는 my-app-runtime 서비스 주체와 연결된 aws-example 제공자를 사용해 credentials.json 파일을 만들어요.

$ hcp iam workload-identity-providers create-cred-file \
  iam/project/dcffbc8c-0873-4acc-bf96-4c79a4c3fd1a/service-principal/my-app-runtime/workload-identity-provider/aws-example \
  --aws \
  --output-file=credentials.json

IMDSv1을 사용한다면 create-cred-file을 실행할 때 --imdsv1 플래그를 설정해 주세요.

자격 증명 파일이 런타임 환경에 존재하는지 확인해 주세요. 자격 증명 파일에는 시크릿 값이 없으므로 AMI, Lambda 배포 패키지, 또는 컨테이너에 저장할 수 있어요. 또는 런타임에 생성할 수도 있어요.

자격 증명 파일로 인증하려면 HCP CLI, HCP Terraform Provider, 또는 HCP Go SDK를 사용할 수 있어요. 자세한 내용은 자격 증명 파일로 인증하기 문서를 참고하세요.

더 알아보기 (Learn more)