Azure와 워크로드 아이덴티티 페더레이션
Azure와 워크로드 아이덴티티 페더레이션 (Federate workload identity with Azure)
관리 아이덴티티(managed identity)를 사용해 Azure VM 워크로드에서 인증하도록 워크로드 아이덴티티 페더레이션을 설정하는 방법을 설명해 드릴게요. 인증된 워크로드는 HCP 서비스 주체 키를 전혀 저장하지 않고 HCP 서비스와 상호작용할 수 있어요.
출처: 문서
본문
사전 요구 사항
Azure용 워크로드 아이덴티티 제공자를 구성하기 전에 다음 단계를 완료해야 해요.
- HCP 프로젝트에 대한 Admin 역할이 있어야 해요.
- 원하는 프로젝트에 서비스 주체를 만들고 워크로드가 필요로 하는 HCP 리소스에 대한 접근 권한을 부여해요.
- HCP로의 접근을 페더레이션할 Azure 계정에 대한 접근 권한이 있어야 해요.
- 원하는 구성 워크플로에 따라 HCP CLI를 설치하거나 HCP Terraform Provider를 사용해요.
Azure 구성 사전 요구 사항
Azure와 워크로드 아이덴티티 페더레이션하려면 Azure AD 테넌트에 새 Azure AD 애플리케이션을 만들고 구성해야 해요. 워크로드 아이덴티티 제공자가 애플리케이션을 신뢰하도록 구성하면 Azure 워크로드는 이 애플리케이션의 액세스 토큰을 가져와 HCP 액세스 토큰으로 교환할 수 있어요.
워크로드 아이덴티티 페더레이션을 위해 Azure 환경을 준비하려면 다음 단계를 완료해요.
- Microsoft Entra 앱 등록 및 서비스 주체 생성. 기본 Application (client) ID를 사용하거나 커스텀 URI를 지정할 수 있지만, Application ID URI를 기록해 두세요. 워크로드 아이덴티티 제공자를 구성할 때 이 값이 필요해요.
- 관리 아이덴티티 생성. 해당 Object ID를 기록해 두세요. 조건부 접근 문을 구성할 때 이 값을 사용할 수 있어요.
- 관리 아이덴티티 할당. 애플리케이션이 실행되는 가상 머신이나 다른 리소스에 할당할 수 있어요.
Azure용 외부 워크로드 아이덴티티 제공자 구성
Azure용 HCP 워크로드 아이덴티티 제공자를 만들려면 다음 구성 값을 제공해야 해요.
- Azure AD Tenant ID (GUID).
- Azure AD에 등록한 애플리케이션의 Application ID URI.
- 조건부 접근 문.
조건부 접근 문 (Conditional access statement)
워크로드 아이덴티티를 페더레이션할 때 요구 사항 중 하나가 조건부 접근 문이에요. 이 문은 아이덴티티 클레임에 접근할 수 있고 어떤 외부 아이덴티티가 허용되는지 제한하는 불리언 표현식이에요.
Azure 토큰을 HCP 접근 권한으로 교환할 때, 조건부 접근 문은 jwt_claims. 접두어로 토큰의 모든 클레임에 접근할 수 있어요. 대부분의 시나리오에서는 워크로드에 연결된 관리 아이덴티티의 Object ID와 일치하는 sub 클레임을 사용하는 것을 권장해요. 자세한 내용은 Azure 문서의 access token 클레임 레퍼런스를 참고하세요.
다음 예시 조건부 접근 문은 Object ID가 d4766c62-e179-49f9-b3a8-3a8c6720aa96인 관리 역할이 할당된 Azure 워크로드에 대해서만 HCP 서비스 접근을 제한해요.
`jwt_claims.sub == "d4766c62-e179-49f9-b3a8-3a8c6720aa96"`
참조할 수 있는 클레임 전체 목록을 보려면 다음 단계를 완료해요.
- 관리 아이덴티티가 할당된 VM 생성.
- VM에 SSH 접속.
- IMDS 엔드포인트를 사용해 액세스 토큰 획득. Azure 구성 사전 요구 사항에서 설명한 Azure AD 애플리케이션의 Application ID 또는 커스텀 URI로
APP_ID를 바꿔 주세요.
curl "http://169.254.169.254/metadata/identity/oauth2/token?resource=APP_ID&api-version=2018-02-01" \
-H "Metadata: true" | jq -r .access_token
클레임을 보려면 액세스 토큰을 복사해 브라우저 기반 토큰 디코더에 붙여 넣으세요. 나열된 클레임은 조건부 접근 문을 만들 때 사용할 수 있는 값이에요.
워크로드 아이덴티티 제공자 만들기
필요한 정보를 정리한 뒤 Azure용 워크로드 아이덴티티 제공자를 만들어요.
HCP CLI / Terraform
hcp iam workload-identity-providers create-oidc 명령을 사용해요.
$ hcp iam workload-identity-providers create-oidc <PROVIDER_NAME> \
--service-principal=<SP_RESOURCE_NAME> \
--issuer=https://sts.windows.net/<TENANT_ID>/ \
--allowed-audience=<APP_ID> \
--conditional-access=<CONDITION> \
--description=<DESCRIPTION>
이 명령에는 HCP와 Azure 계정에 특정한 다음 정보가 필요해요.
<PROVIDER_NAME>: 만들 워크로드 아이덴티티 제공자의 이름.<SP_RESOURCE_NAME>:iam/project/<PROJECT_ID>/service-principal/<NAME>형식의 서비스 주체 리소스 이름.<TENANT_ID>: 페더레이션을 허용하려는 Azure AD Tenant ID (GUID). 때로는https://sts.windows.net/<TENANT_ID>/형식으로 지정되기도 해요.<APP_ID>: Azure AD 애플리케이션의 Application ID 또는 사용한 커스텀 URI.<CONDITION>: 지정된 Azure 워크로드에 대한 접근을 제한하는 조건부 접근 문.<DESCRIPTION>: 프로바이더에 대한 선택적인 설명.
다음 예시는 azure-example이라는 워크로드 아이덴티티 제공자를 만들어요. 이 제공자는 JWT 토큰이 d4766c62-e179-49f9-b3a8-3a8c6720aa96을 sub 클레임으로 갖도록 요구해 외부 워크로드 접근을 제한하도록 HCP를 구성해요. HCP 서비스에 대한 접근 권한을 부여받은 워크로드는 my-app-runtime 서비스 주체를 사용해요.
$ hcp iam workload-identity-providers create-oidc azure-example \
--service-principal=iam/project/dcffbc8c-0873-4acc-bf96-4c79a4c3fd1a/service-principal/my-app-runtime \
--issuer=https://sts.windows.net/60a0d497-45cd-413d-95ca-e154bbb9129b/ \
--allowed-audience=d821efa3-8cd7-4977-bdf7-bd6e44b1dc46 \
--conditional-access='jwt_claims.sub == "d4766c62-e179-49f9-b3a8-3a8c6720aa96"' \
--description="Allow my-app-role on Azure 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 = "azure-example"
service_principal = hcp_service_principal.workload_sp.resource_name
description = "Allow my-app on Azure to act as my-app-runtime service principal"
oidc {
# The issuer URI should be as follows where the ID in the path is replaced
# with your Azure Tenant ID
issuer_uri = "https://sts.windows.net/<TENANT_ID>"
# The allowed audience should be set to the Application ID from the Azure AD
# Application or the custom URI used.
allowed_audiences = ["<APP_ID>"]
}
conditional_access = "<CONDITION>"
}
이 구성에는 Azure 계정에 특정한 다음 정보가 필요해요.
<TENANT_ID>: 페더레이션을 허용하려는 Azure AD Tenant ID (GUID). 때로는https://sts.windows.net/<TENANT_ID>/형식으로 지정되기도 해요.<APP_ID>: Azure AD 애플리케이션의 Application ID 또는 사용한 커스텀 URI.<CONDITION>: 지정된 Azure 워크로드에 대한 접근을 제한하는 조건부 접근 문.
다음 예시는 azure-example이라는 워크로드 아이덴티티 제공자를 만들어요. 이 제공자는 JWT 토큰이 d4766c62-e179-49f9-b3a8-3a8c6720aa96을 sub 클레임으로 갖도록 요구해 외부 워크로드 접근을 제한하도록 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 = "azure-example"
service_principal = hcp_service_principal.workload_sp.resource_name
description = "Allow my-app-role on Azure to act as my-app-runtime service principal"
oidc {
# The issuer URI should be as follows where the ID in the path is replaced
# with your Azure Tenant ID.
issuer_uri = "https://sts.windows.net/60a0d497-45cd-413d-95ca-e154bbb9129b"
# The allowed audience should be set to the Application ID from the Azure AD
# Application or the custom URI used.
allowed_audiences = ["d821efa3-8cd7-4977-bdf7-bd6e44b1dc46"]
}
# Only allow workload's that are assigned the expected managed identity.
# The access_token given to Azure workload's will have the sub claim set to
# that of the managed identity.
conditional_access = "jwt_claims.sub == `d4766c62-e179-49f9-b3a8-3a8c6720aa96`"
}
워크로드의 자격 증명 인증
HCP CLI, HCP Terraform Provider, HCP Go SDK를 사용해 외부 자격 증명을 자동으로 가져와 HCP 액세스 토큰으로 교환할 수 있어요. 이 과정은 외부 자격 증명을 얻는 데 필요한 정보와 교환할 워크로드 아이덴티티 제공자를 포함하는 자격 증명 파일을 사용해요.
자세한 내용은 credential files 문서를 참고하세요.
Azure용 자격 증명 파일 만들기
hcp iam workload-identity-providers create-cred-file 명령을 사용해요.
$ hcp iam workload-identity-providers create-cred-file <PROVIDER_NAME> \
--azure \
--azure-resource=<APP_ID> \
--output-file=credentials.json
이 명령에는 HCP와 Azure 계정에 특정한 다음 정보가 필요해요.
<PROVIDER_NAME>:iam/project/<PROJECT_ID>/service-principal/<SP_NAME>/workload-identity-provider/<PROVIDER_NAME>형식으로 자격 증명을 교환할 Workload Identity Provider의 이름.<APP_ID>: Azure AD 애플리케이션의 Application ID 또는 사용한 커스텀 URI.
다음 예시는 my-app-runtime 서비스 주체와 연결된 azure-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/azure-example \
--azure \
--azure-resource=d821efa3-8cd7-4977-bdf7-bd6e44b1dc46 \
--output-file=credentials.json
자격 증명 파일이 런타임 환경에 존재하는지 확인해 주세요. 자격 증명 파일에는 시크릿 값이 없으므로 VM 이미지에 저장할 수 있어요. 또는 런타임에 생성할 수도 있어요.
자격 증명 파일로 인증하려면 HCP CLI, HCP Terraform Provider, 또는 HCP Go SDK를 사용할 수 있어요. 자세한 내용은 자격 증명 파일로 인증하기 문서를 참고하세요.
더 알아보기 (Learn more)
- 워크로드 아이덴티티 페더레이션 — 워크로드 아이덴티티 페더레이션의 개요와 동작 방식을 확인해 보세요.
- 조건부 접근 문 — 조건부 접근 문을 작성하고 형식화하는 방법을 알아보세요.
- GCP 제공자 구성 — GCP 워크로드를 연결하는 방법을 확인해 보세요.
- AWS 제공자 구성 — AWS 워크로드를 연결하는 방법을 알아보세요.