워크로드 아이덴티티 클러스터 인증

이 문서에서는 Google Distributed Cloud Connected의 워크로드 아이덴티티 클러스터 인증을 설정하고 사용하는 방법을 설명합니다. 워크로드 아이덴티티 클러스터 인증은 서비스 계정 키 대신 단기 토큰과 워크로드 아이덴티티 제휴를 사용하여 워크로드가 Google Cloud 리소스에 안전하게 액세스하도록 지원합니다. 단기 사용자 인증 정보는 OAuth 2.0 액세스 토큰입니다. 기본적으로 액세스 토큰은 1시간 후에 만료됩니다.

워크로드 아이덴티티 클러스터 인증을 사용하면 워크로드에서 자체 Kubernetes ID를 사용하여 Google Cloud 리소스에 직접 액세스하거나 Google 서비스 계정을 가장할 수 있습니다.

워크로드 아이덴티티 클러스터 인증은 서비스 계정 키를 사용하는 것보다 다음과 같은 두 가지 주요 이점이 있습니다.

  • 보안 개선: 서비스 계정 키를 올바르게 관리하지 않으면 보안 위험이 발생할 수 있습니다. OAuth 2.0 토큰과 워크로드 아이덴티티 제휴는 서비스 계정 키의 권장 대안으로 간주됩니다. 서비스 계정 토큰에 관한 자세한 내용은 단기 서비스 계정 사용자 인증 정보를 참고하세요. 워크로드 아이덴티티 제휴에 관한 자세한 내용은 워크로드 아이덴티티 제휴를 참조하세요.

  • 유지보수 감소: 서비스 계정 키는 더 많은 유지보수가 필요합니다. 이러한 키를 정기적으로 순환하고 보호하는 것은 관리 부담이 될 수 있습니다.

이 페이지는 기본 기술 인프라의 수명 주기를 설정, 모니터링, 관리하는 관리자, 설계자, 운영자를 위해 작성되었습니다.Google Cloud 콘텐츠에서 참조하는 일반적인 역할 및 예시 태스크에 대해 자세히 알아보려면 일반 GKE 사용자 역할 및 태스크를 참조하세요.

클러스터 관리

이 가이드에서는 애플리케이션의 워크로드 아이덴티티 제휴를 다룹니다. 분산 클라우드 연결 클러스터의 경우 클러스터 수준 워크로드 아이덴티티 제휴가 자동으로 관리됩니다.

Distributed Cloud 연결된 클러스터는 Distributed Cloud Edge Container API를 통해 Google에서 생성하고 관리합니다. gcloud edge-cloud container clusters create 명령어를 사용하거나 Google Cloud 콘솔에서 관리할 수 있습니다.

Distributed Cloud 연결된 클러스터는 생성된 프로젝트의 Fleet에 자동으로 등록됩니다. 수동으로 Fleet을 등록할 필요가 없습니다. 워크로드 아이덴티티 제휴 풀은 자동으로 제공되며 PROJECT_ID.svc.id.goog 형식을 따릅니다.

시작하기 전에

  • 워크로드 아이덴티티 제휴를 설정하기 전에 Google Cloud 프로젝트에서 다음 API가 사용 설정되어 있는지 확인합니다. API 사용 설정에 관한 자세한 내용은 서비스 사용 설정을 참고하세요.

    • iam.googleapis.com
    • sts.googleapis.com
    • iamcredentials.googleapis.com
    • gkehub.googleapis.com
  • 다음 명령줄 도구가 설치되었는지 확인합니다.

    • Google Cloud와 상호작용하는 명령줄 도구인 gcloud가 포함된 최신 버전의 Google Cloud CLI
    • kubectl

    Google Cloud와의 상호작용을 위해 Cloud Shell을 셸 환경으로 사용하는 경우 이러한 도구가 자동으로 설치됩니다.

  • 프로젝트에 사용할 수 있도록 gcloud CLI를 초기화했는지 확인합니다.

  • 프로젝트에 다음 IAM 역할이 있는지 확인합니다. 설정을 수행하려면 다음 역할이 필요합니다.

    • 소유자 (roles/owner) 또는
    • IAM 보안 관리자 (roles/iam.securityAdmin) 및 서비스 계정 관리자 (roles/iam.serviceAccountAdmin)

다음 섹션에서는 워크로드 아이덴티티 클러스터 인증에 필요한 서비스 계정을 만들고 역할을 부여합니다.

권장: 워크로드 아이덴티티 제휴 직접 리소스 액세스

워크로드 아이덴티티 제휴 직접 리소스 액세스를 사용하면 워크로드 아이덴티티 제휴를 사용하여 Kubernetes ServiceAccount에 IAM 역할을 부여하여 Google Cloud리소스에 직접 액세스할 수 있습니다.

ID 목적 역할
Kubernetes 서비스 계정 워크로드에서 사용하는 Kubernetes ID입니다. 이 ID에 필요한 Google Cloud 리소스에 액세스하는 데 필요한 역할을 부여합니다. 이 예시에서는 roles/storage.objectViewer 역할과 roles/logging.admin 역할을 부여합니다. roles/storage.objectViewer
roles/logging.admin

대안: IAM 서비스 계정 가장

또는 IAM 서비스 계정 가장을 사용하도록 Kubernetes ServiceAccount를 구성할 수 있습니다.

서비스 계정 목적 역할
Google 서비스 계정 클러스터 내 워크로드가 가장하는 Google 서비스 계정입니다. 이 서비스 계정에 필요한 리소스에 액세스하는 데 필요한 역할을 부여합니다. Google Cloud 액세스하는 리소스에 따라 다릅니다.
Kubernetes 서비스 계정 이 ID에 Google 서비스 계정을 가장할 수 있는 권한을 부여합니다. 이 부여는 roles/iam.workloadIdentityUser 역할을 사용합니다. roles/iam.workloadIdentityUser

서비스 계정 설정

다음 섹션에는 필요한 Kubernetes ServiceAccount를 만들고 워크로드 아이덴티티 제휴 직접 리소스 액세스 또는 Google 서비스 계정 가장을 사용하여 워크로드 아이덴티티 클러스터 인증에 필요한 역할을 부여하는 안내가 포함되어 있습니다.

Kubernetes ServiceAccount 만들기

클러스터에서 kubectl create 명령어를 사용하여 포드의 Kubernetes ServiceAccount를 만듭니다. 네임스페이스의 기본 ServiceAccount를 비롯한 기존 ServiceAccount를 사용할 수도 있습니다.

kubectl create serviceaccount KSA_NAME --namespace NAMESPACE

다음 값을 바꿉니다.

  • KSA_NAME: Kubernetes ServiceAccount의 이름

  • NAMESPACE: 클러스터의 네임스페이스

워크로드 아이덴티티 제휴를 사용하여 리소스에 대한 직접 액세스 권한 부여

Kubernetes ServiceAccount ID에 직접 Identity and Access Management 역할을 부여하려면 다음 단계를 따르세요.

  1. gcloud projects describe 명령어를 사용하여 숫자 프로젝트 번호를 찾습니다.

    gcloud projects describe PROJECT_ID --format="value(projectNumber)"
    

    PROJECT_ID를 프로젝트의 ID로 바꿉니다.

  2. gcloud projects add-iam-policy-binding 명령어를 사용하여 Kubernetes ID 주 구성원에게 필요한 역할을 부여합니다.

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="principal://iam.gserviceaccount.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \
        --role=roles/storage.objectViewer
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="principal://iam.gserviceaccount.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \
        --role=roles/logging.admin
    

    다음 값을 바꿉니다.

    • PROJECT_NUMBER: 숫자 프로젝트 번호
    • NAMESPACE: 클러스터의 네임스페이스
    • KSA_NAME: Kubernetes ServiceAccount의 이름

대안: IAM 서비스 계정 가장을 사용하여 액세스 권한 부여

워크로드가 Google 서비스 계정을 가장하도록 하려면 다음 단계를 따르세요.

  1. gcloud iam service-accounts create 명령어를 사용하여 Google 서비스 계정을 만듭니다.

    gcloud iam service-accounts create my-app-sa \
        --project=PROJECT_ID
    

    PROJECT_ID를 프로젝트의 ID로 바꿉니다.

  2. gcloud projects add-iam-policy-binding 명령어를 사용하여 Google 서비스 계정에 필요한 역할을 부여합니다.

    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=serviceAccount:my-app-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/storage.objectViewer
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=serviceAccount:my-app-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/logging.admin
    
  3. gcloud iam service-accounts add-iam-policy-binding 명령어를 사용하여 Kubernetes ServiceAccount에 Google 서비스 계정을 가장할 수 있는 권한을 부여합니다.

    gcloud iam service-accounts add-iam-policy-binding my-app-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/iam.workloadIdentityUser \
        --member="serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE/KSA_NAME]"
    

    다음 값을 바꿉니다.

    • NAMESPACE: 클러스터의 네임스페이스
    • KSA_NAME: Kubernetes ServiceAccount의 이름
  4. kubectl annotate 명령어를 사용하여 Kubernetes ServiceAccount에 주석을 추가하여 Google 서비스 계정에 연결합니다.

    kubectl annotate serviceaccount \
        --namespace NAMESPACE KSA_NAME \
        iam.gke.io/gcp-service-account=my-app-sa@PROJECT_ID.iam.gserviceaccount.com
    

워크로드 구성

Kubernetes ServiceAccount를 사용하고 프로젝션된 토큰 볼륨을 마운트하도록 포드 사양을 업데이트합니다. Distributed Cloud 연결된 클러스터는Google Cloud외부에 있으므로 사용자 인증 정보 구성 파일을 제공하고 해당 파일을 가리키도록 GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정해야 합니다. 포드 내의Google Cloud 클라이언트 라이브러리는 이를 사용하여 Security 토큰 서비스 API를 통해 Kubernetes 토큰을 Google Cloud 액세스 토큰으로 교환합니다.

  1. credential-configuration.json 파일을 생성합니다. 워크로드 아이덴티티 제휴 직접 리소스 액세스를 사용하는지 아니면 IAM 서비스 계정 가장을 사용하는지에 따라 명령어를 선택합니다.

    워크로드 아이덴티티 제휴 직접 리소스 액세스

    gcloud iam workload-identity-pools create-cred-config 명령어를 사용합니다.

    gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/providers/attestor \
        --credential-source-file=/var/run/secrets/tokens/gcp-ksa/token \
        --credential-source-type=text \
        --output-file=credential-configuration.json
    

    IAM 서비스 계정 가장을 사용하여 액세스 권한 부여

    gcloud iam workload-identity-pools create-cred-config 명령어를 사용합니다.

    gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/providers/attestor \
        --service-account=my-app-sa@PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/secrets/tokens/gcp-ksa/token \
        --credential-source-type=text \
        --output-file=credential-configuration.json
    

    여기에서 PROJECT_NUMBER를 Google Cloud 프로젝트 번호로 바꿉니다. gcloud projects describe PROJECT_ID --format="value(projectNumber)"를 실행하여 프로젝트 번호를 찾을 수 있습니다.

  2. kubectl create configmap 명령어를 사용하여 구성 파일을 저장할 Kubernetes ConfigMap를 만듭니다.

    kubectl create configmap CREDENTIAL_CONFIG_MAP \
        --namespace NAMESPACE \
        --from-file=credential-configuration.json
    

    다음 값을 바꿉니다.

    • CREDENTIAL_CONFIG_MAP: 사용자 인증 정보 구성 파일이 포함된 ConfigMap의 이름

    • NAMESPACE: 클러스터의 네임스페이스

  3. 다음 YAML 콘텐츠로 포드 사양을 업데이트합니다.

    spec:
      serviceAccountName: KSA_NAME
      containers:
      - name: MY_CONTAINER
        image: MY_IMAGE
        env:
        - name: GOOGLE_APPLICATION_CREDENTIALS
          value: /var/run/secrets/tokens/gcp-creds/credential-configuration.json
        volumeMounts:
        - mountPath: /var/run/secrets/tokens/gcp-ksa
          name: gcp-ksa
        - mountPath: /var/run/secrets/tokens/gcp-creds
          name: gcp-creds
          readOnly: true
      volumes:
      - name: gcp-ksa
        projected:
          defaultMode: 0420
          sources:
          - serviceAccountToken:
              path: token
              audience: PROJECT_ID.svc.id.goog
              expirationSeconds: 3600
      - name: gcp-creds
        configMap:
          name: CREDENTIAL_CONFIG_MAP
    

    다음 값을 바꿉니다.

    • KSA_NAME: Kubernetes ServiceAccount의 이름

    • MY_CONTAINER: 컨테이너 이름

    • MY_IMAGE: 이미지의 이름

제한사항

Distributed Cloud Connected에 워크로드 아이덴티티 제휴를 사용하는 경우 다음 특징과 기능은 지원되지 않습니다.

  • 토큰 교환 프로세스에 프록시 서버 사용

VPC 서비스 제어와 함께 워크로드 아이덴티티 제휴를 사용하는 방법에 대한 자세한 내용은 VPC 서비스 제어 통합 구성을 참고하세요.

다음 단계