이 페이지에서는 Fleet 전반에 공유 신뢰 모델이 있는 Fleet의 Compute Engine API 또는 AI Platform API와 같은Google Cloud API에 애플리케이션이 인증하도록 구성하는 방법을 보여줍니다. Fleet 전반에 혼합된 신뢰 모델이 있는 경우 혼합된 신뢰 Fleet 워크로드에서 Google Cloud API에 인증(프리뷰)을 참조하세요.
이 페이지는 플랫폼 관리자, 운영자, Fleet 워크로드에서 Google CloudAPI로 프로그래매틱 방식으로 인증하려는 보안 엔지니어를 대상으로 합니다. Google Cloud문서에서 참조하는 사용자 역할과 예시 태스크에 대한 자세한 내용은 일반 GKE Enterprise 사용자 역할 및 태스크를 참조하세요.
이 페이지를 읽기 전 다음 내용을 숙지해야 합니다.
공유 신뢰 환경을 위한 Fleet 워크로드 아이덴티티 제휴 정보
Fleet 워크로드 아이덴티티 제휴를 사용하면 기본 제공 Google Cloud 및 Kubernetes 인증 메커니즘을 사용하여 Fleet 워크로드에서Google Cloud API로 인증할 수 있습니다. Fleet 워크로드 아이덴티티 제휴를 사용하면 포드에 액세스 토큰 마운트 또는 장기 사용자 인증 정보 저장과 같은 보안 수준이 낮은 방법을 사용할 필요가 없습니다.
기본적으로 Fleet 호스트 프로젝트는 Google 관리 워크로드 아이덴티티 풀을 사용하여 Fleet 전체에 있는 항목의 ID를 프로비저닝합니다. Fleet 또는 Fleet 호스트 프로젝트에 있는 모든 항목 중 IAM 식별자가 같은 항목은 IAM에서 같은 항목으로 간주됩니다. 이 암시적 ID 동일성은 단일 테넌트 Fleet과 같은 공유 신뢰 환경에서 대규모로 액세스 권한을 부여할 때 유용합니다. 이 환경에서는 다른 항목이 의도치 않게 리소스에 대한 유사한 권한을 얻는 것이 중요하지 않습니다.
시작하기 전에
다음 명령줄 도구가 설치되었는지 확인합니다.
- Google Cloud와 상호작용하는 명령줄 도구인
gcloud
가 포함된 최신 버전의 Google Cloud CLI kubectl
Google Cloud와의 상호작용을 위해 Cloud Shell을 셸 환경으로 사용하는 경우에는 이러한 도구가 자동으로 설치됩니다.
- Google Cloud와 상호작용하는 명령줄 도구인
프로젝트에 사용할 수 있도록 gcloud CLI를 초기화했는지 확인합니다.
클러스터 준비
Fleet의 애플리케이션이 제휴된 아이덴티티를 수신하려면 먼저 실행되는 클러스터가 Fleet에 등록되어 있어야 하며 Fleet 워크로드 아이덴티티 제휴를 사용하도록 올바르게 구성되어야 합니다. 다음 섹션에서는 다양한 유형의 클러스터에 대해 Fleet 워크로드 아이덴티티 제휴를 설정하는 방법을 설명합니다.
GKE
GKE 클러스터의 경우 다음을 수행합니다.
- Google Kubernetes Engine 클러스터에서 아직 사용 설정되지 않았다면 GKE용 워크로드 아이덴티티 제휴를 사용 설정합니다.
- Fleet에 클러스터를 등록합니다.
클러스터 생성 및 Fleet 등록 프로세스 중에 GKE용 워크로드 아이덴티티 제휴를 사용 설정할 수도 있습니다.
Google Cloud외부 클러스터
다음 유형의 클러스터는 Fleet 워크로드 아이덴티티 제휴를 자동으로 사용 설정하며 클러스터를 만드는 동안 Fleet에 등록됩니다.
- VMware용 Google Distributed Cloud(소프트웨어 전용)
- 베어메탈용 Google Distributed Cloud(소프트웨어 전용)
- GKE on AWS
- Azure 기반 GKE
연결된 클러스터
GKE Multi-Cloud API를 사용하여 등록된 EKS 및 AKS 연결 클러스터는 기본적으로 Fleet 워크로드 아이덴티티 제휴를 사용하도록 설정된 상태로 등록됩니다. 연결된 다른 클러스터는 필요한 요구사항을 충족하는 경우에만 사용 설정된 Fleet 워크로드 아이덴티티 제휴로 등록됩니다. 클러스터 등록에서 해당 클러스터 유형에 대한 안내를 따르세요.
애플리케이션에서 Fleet 워크로드 아이덴티티 제휴 사용
다음 단계에서는 Fleet 워크로드 아이덴티티 제휴를 사용하도록 등록된 클러스터에서 워크로드를 구성하는 방법을 보여줍니다.
클러스터 워크로드 아이덴티티 풀 및 ID 공급업체의 이름을 찾습니다.
gcloud container fleet memberships describe MEMBERSHIP_ID \ --project=FLEET_PROJECT_ID \ --format="table(authority.identityProvider,authority.workloadIdentityPool,name)"
다음을 바꿉니다.
MEMBERSHIP_ID
: 클러스터 멤버십 이름. 클러스터 이름인 경우가 많습니다.FLEET_PROJECT_ID
: Fleet 호스트 프로젝트의 프로젝트 ID
출력은 다음과 비슷합니다.
IDENTITY_PROVIDER: IDENTITY_PROVIDER WORKLOAD_IDENTITY_POOL: WORKLOAD_IDENTITY_POOL NAME: projects/FLEET_PROJECT_ID/locations/MEMBERSHIP_LOCATION/memberships/MEMBERSHIP_ID
이 출력에는 다음 정보가 포함됩니다.
IDENTITY_PROVIDER
: 클러스터의 ID 공급업체MEMBERSHIP_LOCATION
: Fleet 멤버십의 위치. 일반적으로 클러스터 위치와 동일합니다.WORKLOAD_IDENTITY_POOL
: Fleet과 연결된 워크로드 아이덴티티 풀의 이름. 이 값의 구문은FLEET_PROJECT_ID.svc.id.goog
입니다.
Kubernetes 네임스페이스를 만듭니다.
default
네임스페이스를 비롯한 기존 네임스페이스를 사용할 수도 있습니다.kubectl create namespace NAMESPACE
NAMESPACE
를 네임스페이스 이름으로 바꿉니다.네임스페이스에 새 Kubernetes ServiceAccount를 만듭니다. 네임스페이스의
default
ServiceAccount를 비롯한 기존 ServiceAccount를 사용할 수도 있습니다.kubectl create serviceaccount KSA_NAME \ --namespace=NAMESPACE
KSA_NAME
을 서비스 계정의 이름으로 바꿉니다.다음 매니페스트를
adc-config-map.yaml
로 저장합니다. 이 ConfigMap에는 워크로드의 ADC 구성이 포함되어 있습니다.kind: ConfigMap apiVersion: v1 metadata: namespace: NAMESPACE name: my-cloudsdk-config data: config: | { "type": "external_account", "audience": "identitynamespace:WORKLOAD_IDENTITY_POOL:IDENTITY_PROVIDER", "subject_token_type": "urn:ietf:params:oauth:token-type:jwt", "token_url": "https://sts.googleapis.com/v1/token", "credential_source": { "file": "/var/run/secrets/tokens/gcp-ksa/token" } }
ConfigMap을 배포합니다.
kubectl create -f adc-config-map.yaml
다음 매니페스트를
workload-config.yaml
로 저장합니다.apiVersion: v1 kind: Pod metadata: name: my-pod namespace: NAMESPACE spec: serviceAccountName: KSA_NAME containers: - name: sample-container image: google/cloud-sdk:slim command: ["sleep","infinity"] env: - name: GOOGLE_APPLICATION_CREDENTIALS value: /var/run/secrets/tokens/gcp-ksa/google-application-credentials.json volumeMounts: - name: gcp-ksa mountPath: /var/run/secrets/tokens/gcp-ksa readOnly: true volumes: - name: gcp-ksa projected: defaultMode: 420 sources: - serviceAccountToken: path: token audience: WORKLOAD_IDENTITY_POOL expirationSeconds: 172800 - configMap: name: my-cloudsdk-config optional: false items: - key: "config" path: "google-application-credentials.json"
이 워크로드를 배포하면 포드의
gcp-ksa
볼륨에 다음 데이터가 포함됩니다.- 이름이
google-application-credentials.json
인 파일로 배포된 ConfigMap의 데이터. 이 파일은 ADC 사용자 인증 정보 구성 파일입니다. - Kubernetes ServiceAccount 토큰(
token
). Kubernetes는 ServiceAccount의 서명된 JWT를 프로젝션된 ServiceAccount 토큰 파일로 마운트합니다.
포드의 컨테이너는
gcp-ksa
볼륨을/var/run/secrets/tokens/gcp-ksa
경로에 마운트하고 해당 경로에서 사용자 인증 정보 구성 JSON 파일을 찾도록 ADC를 구성합니다.- 이름이
워크로드를 배포합니다.
kubectl apply -f workload-config.yaml
대안: IAM 서비스 계정 가장
또는 IAM 서비스 계정을 가장하여 IAM 서비스 계정이 수행할 수 있는 승인된 작업을 수행하도록 클러스터의 Kubernetes 서비스 계정을 구성할 수 있습니다. 이 방법을 사용하면 IAM과 Kubernetes 모두에서 서비스 계정 쌍을 관리해야 하므로 유지보수 오버헤드가 증가할 수 있습니다.
대부분의 경우 애플리케이션에서 Fleet 워크로드 아이덴티티 제휴 사용의 안내에 따라 IAM 허용 정책에서 Kubernetes 주 구성원을 직접 참조하여Google Cloud 리소스에 대한 액세스 권한을 부여하는 것이 좋습니다.
클러스터 워크로드 아이덴티티 풀 및 ID 공급업체의 이름을 찾습니다.
gcloud container fleet memberships describe MEMBERSHIP_ID \ --project=FLEET_PROJECT_ID \ --format="table(authority.identityProvider,authority.workloadIdentityPool,name)"
다음을 바꿉니다.
MEMBERSHIP_ID
: 클러스터 멤버십 이름. 클러스터 이름인 경우가 많습니다.FLEET_PROJECT_ID
: Fleet 호스트 프로젝트의 프로젝트 ID
출력은 다음과 비슷합니다.
IDENTITY_PROVIDER: IDENTITY_PROVIDER WORKLOAD_IDENTITY_POOL: WORKLOAD_IDENTITY_POOL NAME: projects/FLEET_PROJECT_ID/locations/MEMBERSHIP_LOCATION/memberships/MEMBERSHIP_ID
이 출력에는 다음 정보가 포함됩니다.
IDENTITY_PROVIDER
: 클러스터의 ID 공급업체MEMBERSHIP_LOCATION
: 멤버십의 위치. 일반적으로 클러스터 위치와 동일합니다.WORKLOAD_IDENTITY_POOL
: Fleet과 연결된 워크로드 아이덴티티 풀의 이름. 이 값의 구문은FLEET_PROJECT_ID.svc.id.goog
입니다.
애플리케이션에서 가장할 수 있는 IAM 서비스 계정을 만듭니다. 기존 IAM 서비스 계정을 사용할 수도 있습니다.
gcloud iam service-accounts create IAM_SA_NAME \ --project=IAM_SA_PROJECT_ID
다음을 바꿉니다.
IAM_SA_NAME
: IAM 서비스 계정의 이름IAM_SA_PROJECT_ID
: IAM 서비스 계정이 포함된 프로젝트의 프로젝트 ID. Fleet 호스트 프로젝트와 다를 수 있습니다.
필요한 IAM 허용 정책을 추가하여 Google Cloud API에 액세스하는 데 필요한 권한을 IAM 서비스 계정에 부여합니다.
gcloud iam service-accounts add-iam-policy-binding
또는 다른 메서드를 사용하면 됩니다. 각 서비스 문서에서 Google Cloud API를 사용하는 데 필요한 권한을 알아보고 역할 이해에서 필수 권한이 있는 사전 정의된 역할의 전체 목록을 확인할 수 있습니다.네임스페이스에 Kubernetes ServiceAccount를 만듭니다. 기존 Kubernetes ServiceAccount와
default
서비스 계정,default
네임스페이스를 포함한 모든 네임스페이스를 사용할 수도 있습니다.kubectl create serviceaccount KSA_NAME \ --namespace=NAMESPACE
다음을 바꿉니다.
KSA_NAME
: ServiceAccount의 이름NAMESPACE
: 네임스페이스의 이름
클러스터의 특정 네임스페이스에 있는 Kubernetes ServiceAccount가 IAM 서비스 계정을 가장할 수 있는 IAM 허용 정책을 만듭니다.
gcloud iam service-accounts add-iam-policy-binding IAM_SA_NAME@IAM_SA_PROJECT_ID.iam.gserviceaccount.com \ --project=IAM_SA_PROJECT_ID \ --role=roles/iam.workloadIdentityUser \ --member="serviceAccount:WORKLOAD_IDENTITY_POOL[NAMESPACE/KSA_NAME]"
WORKLOAD_IDENTITY_POOL
을 워크로드 아이덴티티 풀의 이름으로 바꿉니다.다음 매니페스트를
adc-config-map.yaml
로 저장합니다. 이 ConfigMap에는 워크로드의 ADC 구성이 포함되어 있습니다.kind: ConfigMap apiVersion: v1 metadata: namespace: K8S_NAMESPACE name: my-cloudsdk-config data: config: | { "type": "external_account", "audience": "identitynamespace:WORKLOAD_IDENTITY_POOL:IDENTITY_PROVIDER", "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/IAM_SA_NAME@GSA_PROJECT_ID.iam.gserviceaccount.com:generateAccessToken", "subject_token_type": "urn:ietf:params:oauth:token-type:jwt", "token_url": "https://sts.googleapis.com/v1/token", "credential_source": { "file": "/var/run/secrets/tokens/gcp-ksa/token" } }
다음을 바꿉니다.
IAM_SA_NAME
: 가장하려는 IAM 서비스 계정의 이름IAM_SA_PROJECT_ID
: IAM 서비스 계정의 프로젝트 ID
다음 매니페스트를
workload-config.yaml
로 저장합니다.apiVersion: v1 kind: Pod metadata: name: my-pod namespace: K8S_NAMESPACE spec: serviceAccountName: KSA_NAME containers: - name: my-container image: my-image command: ["sleep","infinity"] env: - name: GOOGLE_APPLICATION_CREDENTIALS value: /var/run/secrets/tokens/gcp-ksa/google-application-credentials.json volumeMounts: - name: gcp-ksa mountPath: /var/run/secrets/tokens/gcp-ksa readOnly: true volumes: - name: gcp-ksa projected: defaultMode: 420 sources: - serviceAccountToken: path: token audience: WORKLOAD_IDENTITY_POOL expirationSeconds: 172800 - configMap: name: my-cloudsdk-config optional: false items: - key: "config" path: "google-application-credentials.json"
이 워크로드를 배포하면 포드의
gcp-ksa
볼륨에 다음 데이터가 포함됩니다.- 이름이
google-application-credentials.json
인 파일로 배포된 ConfigMap의 데이터. 이 파일은 ADC 사용자 인증 정보 구성 파일입니다. - Kubernetes ServiceAccount 토큰(
token
). Kubernetes는 ServiceAccount의 서명된 JWT를 프로젝션된 ServiceAccount 토큰 파일로 마운트합니다.
포드의 컨테이너는
gcp-ksa
볼륨을/var/run/secrets/tokens/gcp-ksa
경로에 마운트하고 해당 경로에서 사용자 인증 정보 구성 JSON 파일을 찾도록 ADC를 구성합니다.- 이름이
워크로드를 배포합니다.
kubectl apply -f workload-config.yaml
Fleet 워크로드 아이덴티티 제휴 설정 확인
이 섹션에서는 Cloud Storage 버킷을 만들고 Fleet 워크로드 아이덴티티 제휴를 사용하는 포드에서 액세스합니다. 이 단계를 수행하기 전에 애플리케이션에서 Fleet 워크로드 아이덴티티 제휴 사용 섹션의 안내에 따라 워크로드 아이덴티티 제휴를 구성했는지 확인합니다.
이 섹션에서는 IAM 서비스 계정 가장 방식을 사용하여 워크로드 아이덴티티 제휴를 확인하는 방법을 보여주지 않습니다.
숫자 프로젝트 번호를 찾습니다.
gcloud projects describe FLEET_PROJECT_ID \ --format="value(projectNumber)"
출력은 다음과 비슷합니다.
1234567890
Cloud Storage 버킷을 만듭니다.
gcloud storage buckets create gs://FLEET_PROJECT_ID-test-bucket \ --location=LOCATION
LOCATION
을 Google Cloud위치로 바꿉니다.앞에서 만든 서비스 계정에 버킷에 대한 액세스 권한을 부여하는 IAM 허용 정책을 만듭니다.
gcloud storage buckets add-iam-policy-binding gs://FLEET_PROJECT_ID-test-bucket \ --condition=None \ --role=roles/storage.objectViewer \ --member=principal://iam.googleapis.com/projects/FLEET_PROJECT_NUMBER/locations/global/workloadIdentityPools/FLEET_PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME
다음을 바꿉니다.
FLEET_PROJECT_NUMBER
: 숫자 프로젝트 번호FLEET_PROJECT_ID
: 프로젝트 IDNAMESPACE
: 이전 섹션의 포드를 실행하는 Kubernetes 네임스페이스의 이름KSA_NAME
: 이전 섹션의 포드에서 사용하는 Kubernetes ServiceAccount의 이름
포드에서 셸 세션을 만듭니다.
kubectl exec -it pods/my-pod --namespace=NAMESPACE -- /bin/bash
버킷의 객체를 나열해 봅니다.
curl -X GET -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ "https://storage.googleapis.com/storage/v1/b/FLEET_PROJECT_ID-test-bucket/o"
출력은 다음과 같습니다.
{ "kind": "storage#objects" }
코드에서 인증
Cloud 클라이언트 라이브러리를 사용하면 인증 라이브러리는 자동으로 ADC를 사용하여 Google Cloud 서비스에 인증하기 위한 사용자 인증 정보를 찾습니다. 워크로드 아이덴티티 제휴를 지원하는 Cloud 클라이언트 라이브러리를 사용해야 합니다. 다음은 필요한 최소 Cloud 클라이언트 라이브러리 버전과 현재 버전을 확인하는 방법에 대한 안내입니다.
C++
대부분의 C++용Google Cloud 클라이언트 라이브러리는 grpc::GoogleDefaultCredentials()
를 호출하여 만든 ChannelCredentials
객체를 사용해 ID 제휴를 지원합니다. 이 사용자 인증 정보를 초기화하려면 gRPC 버전 1.36.0 이상을 사용하여 클라이언트 라이브러리를 빌드해야 합니다.
C++용 Cloud Storage 클라이언트 라이브러리는 gRPC가 아닌 REST API를 사용하므로 ID 제휴를 지원하지 않습니다.
Go
Go용 클라이언트 라이브러리에서 golang.org/x/oauth2
모듈 버전 v0.0.0-20210218202405-ba52d332ba99 이상을 사용하면 ID 제휴가 지원됩니다.
클라이언트 라이브러리에서 사용하는 이 모듈 버전을 확인하려면 다음 명령어를 실행합니다.
cd $GOPATH/src/cloud.google.com/go
go list -m golang.org/x/oauth2
Java
자바용 클라이언트 라이브러리에서 com.google.auth:google-auth-library-oauth2-http
아티팩트 버전 0.24.0 이상을 사용하면 ID 제휴가 지원됩니다.
클라이언트 라이브러리에서 사용하는 이 아티팩트의 버전을 확인하려면 애플리케이션 디렉터리에서 다음 Maven 명령어를 실행합니다.
mvn dependency:list -DincludeArtifactIds=google-auth-library-oauth2-http
Node.js
Node.js용 클라이언트 라이브러리에서 google-auth-library
패키지 버전 7.0.2 이상을 사용하면 ID 제휴가 지원됩니다.
클라이언트 라이브러리에서 사용하는 이 패키지의 버전을 확인하려면 애플리케이션 디렉터리에서 다음 명령어를 실행합니다.
npm list google-auth-library
GoogleAuth
객체를 만들 때 프로젝트 ID를 지정하거나 GoogleAuth
가 프로젝트 ID를 자동으로 찾도록 허용할 수 있습니다. 프로젝트 ID를 자동으로 찾으려면 구성 파일의 서비스 계정에 프로젝트에 대한 브라우저 역할(roles/browser
) 또는 동등한 권한이 있는 역할이 있어야 합니다. 자세한 내용은 google-auth-library
패키지용 README
를 참조하세요.
Python
Python용 클라이언트 라이브러리에서 google-auth
패키지 버전 1.27.0 이상을 사용하면 ID 제휴가 지원됩니다.
클라이언트 라이브러리에서 사용하는 이 패키지의 버전을 확인하려면 패키지가 설치된 환경에서 다음 명령어를 실행합니다.
pip show google-auth
인증 클라이언트의 프로젝트 ID를 지정하려면 GOOGLE_CLOUD_PROJECT
환경 변수를 설정하거나 클라이언트가 프로젝트 ID를 자동으로 찾도록 허용할 수 있습니다. 프로젝트 ID를 자동으로 찾으려면 구성 파일의 서비스 계정에 프로젝트에 대한 브라우저 역할(roles/browser
) 또는 동등한 권한이 있는 역할이 있어야 합니다. 자세한 내용은 google-auth
패키지 사용자 가이드를 참조하세요.
다음 단계
Fleet 워크로드 아이덴티티 제휴를 사용할 때 Fleet을 구성하기 위한 권장사항 알아보기