워크로드 아이덴티티


워크로드 아이덴티티는 Google Kubernetes Engine(GKE)에서 실행되는 워크로드가 안전하고 관리 가능한 방식으로 Google Cloud 서비스에 액세스하는 데 권장되는 방식입니다.

GKE에서 워크로드 아이덴티티를 사용 설정하고 사용하는 방법에 대한 자세한 내용은 워크로드 아이덴티티 사용을 참조하세요.

Fleet 워크로드 아이덴티티를 사용하여 Anthos 클러스터를 포함하여 Fleet에 등록된 클러스터에 워크로드 아이덴티티 제휴 지원을 제공할 수 있습니다.

용어

이 문서는 Kubernetes 서비스 계정Identity and Access Management(IAM) 서비스 계정을 구분합니다.

Kubernetes 서비스 계정
GKE 포드에서 실행되는 프로세스의 ID를 제공하는 Kubernetes 리소스입니다.
IAM 서비스 계정
애플리케이션에서 Google Cloud API에 승인된 호출을 수행할 수 있게 해주는 Google Cloud 리소스입니다.

워크로드 아이덴티티란 무엇인가요?

GKE에서 실행되는 애플리케이션은 Compute Engine API, BigQuery Storage API, Machine Learning API와 같은 Google Cloud API에 액세스해야 할 수 있습니다.

워크로드 아이덴티티를 사용하면 GKE 클러스터의 Kubernetes 서비스 계정이 IAM 서비스 계정 역할을 수행할 수 있습니다. 구성된 Kubernetes 서비스 계정을 사용하는 포드는 Google Cloud API에 액세스할 때 자동으로 IAM 서비스 계정으로 인증됩니다. 워크로드 아이덴티티를 사용하면 클러스터의 각 애플리케이션에 대해 세분화된 ID 및 승인을 할당할 수 있습니다.

워크로드 아이덴티티의 작동 방식

클러스터에서 워크로드 아이덴티티를 사용 설정하면 GKE는 클러스터의 Google Cloud 프로젝트에 고정된 워크로드 아이덴티티 풀을 자동으로 만듭니다. 워크로드 아이덴티티 풀을 사용하면 IAM이 Kubernetes 서비스 계정 사용자 인증 정보를 이해하고 신뢰할 수 있습니다. 워크로드 아이덴티티 풀의 형식은 다음과 같습니다.

PROJECT_ID.svc.id.goog

GKE는 워크로드 아이덴티티를 사용하는 프로젝트의 모든 클러스터에 이 풀을 사용합니다.

워크로드 아이덴티티를 사용하도록 네임스페이스에서 Kubernetes 서비스 계정을 구성할 때 IAM은 다음 구성원 이름을 사용하여 사용자 인증 정보를 인증합니다.

serviceAccount:PROJECT_ID.svc.id.goog[KUBERNETES_NAMESPACE/KUBERNETES_SERVICE_ACCOUNT]

이 구성원 이름에서 각 항목의 의미는 다음과 같습니다.

  • PROJECT_ID: Google Cloud 프로젝트 ID입니다.
  • KUBERNETES_NAMESPACE: Kubernetes 서비스 계정의 네임스페이스입니다.
  • KUBERNETES_SERVICE_ACCOUNT: 요청을 수행하는 Kubernetes 서비스 계정의 이름입니다.

워크로드 아이덴티티를 구성하는 프로세스에는 IAM 정책 바인딩을 사용하여 워크로드에 필요한 권한이 있는 IAM 서비스 계정에 Kubernetes 서비스 계정 구성원 이름을 바인딩하는 작업이 포함됩니다. 이 Kubernetes 서비스 계정을 사용하는 워크로드의 모든 Google Cloud API 호출은 바인딩된 IAM 서비스 계정으로 인증됩니다.

ID 동일성

IAM이 워크로드 아이덴티티로 Kubernetes 서비스 계정을 확인하는 데 사용하는 구성원 이름은 다음 변수를 사용합니다.

  • Kubernetes 서비스 계정 이름입니다.
  • Kubernetes 서비스 계정의 네임스페이스입니다.
  • Google Cloud 프로젝트 ID입니다.

프로젝트에 Kubernetes 서비스 계정의 이름과 네임스페이스가 동일한 클러스터가 여러 개 있으면 모든 계정이 동일한 구성원 이름으로 확인됩니다. 이 일반 ID를 사용하면 개별 클러스터 대신 워크로드 아이덴티티 풀에 Google Cloud 리소스에 대한 액세스 권한을 부여할 수 있습니다.

예를 들어 다음 다이어그램을 살펴보세요. 클러스터 A, B, C는 동일한 Google Cloud 프로젝트에 속하므로 동일한 워크로드 아이덴티티 풀에 속합니다. 클러스터 A와 클러스터 B의 backend 네임스페이스에서 애플리케이션은 Google Cloud 리소스에 액세스할 때 back IAM 서비스 계정으로 인증할 수 있습니다. IAM은 호출하는 클러스터를 구별하지 않습니다.

워크로드 아이덴티티 풀 내에서 ID 동일성을 보여주는 다이어그램
워크로드 아이덴티티로 Google Cloud API에 액세스하는 ID 동일성

이러한 ID 동일성은 특정 워크로드 아이덴티티 풀의 모든 클러스터를 신뢰할 수 있어야 한다는 것을 의미합니다. 예를 들어 이전 예시의 클러스터 C가 신뢰할 수 없는 팀의 소유인 경우 backend 네임스페이스를 만들고 back IAM 서비스 계정을 사용하여 클러스터 A 및 클러스터 B처럼 Google Cloud APIs에 액세스할 수 있습니다.

신뢰할 수 없는 액세스를 방지하려면 클러스터를 서로 다른 프로젝트에 배치하여 서로 다른 워크로드 아이덴티티 풀을 확보하거나 네임스페이스 이름을 서로 다르게 하여 일반적인 구성원 이름을 사용하지 않도록 합니다.

GKE 메타데이터 서버 이해

워크로드 아이덴티티가 사용 설정된 GKE의 모든 노드는 GKE 메타데이터 서버에 메타데이터를 저장합니다. GKE 메타데이터 서버는 Kubernetes 워크로드에 필요한 Compute Engine 메타데이터 서버 엔드포인트의 하위 집합입니다.

GKE 메타데이터 서버는 모든 Linux 노드에서 하나의 포드 또는 클러스터의 모든 Windows 노드에서 기본 Windows 서비스를 사용하여 DaemonSet로 실행됩니다. 메타데이터 서버가 HTTP 요청을 http://metadata.google.internal(169.254.169.254:80)로 가로챕니다. 예를 들어 GET /computeMetadata/v1/instance/service-accounts/default/token 요청은 포드가 가장하도록 구성된 IAM 서비스 계정의 토큰을 검색합니다. GKE 메타데이터 서버에 대한 트래픽은 포드를 호스팅하는 VM 인스턴스를 벗어나지 않습니다.

다음 표에서는 GKE 메타데이터 서버에서 사용할 수 있는 Compute Engine 메타데이터 서버 엔드포인트의 하위 집합을 설명합니다. Compute Engine 메타데이터 서버에서 사용할 수 있는 엔드포인트의 전체 목록은 기본 VM 메타데이터 값을 참조하세요.

인스턴스 메타데이터

인스턴스 메타데이터는 다음 디렉터리 아래에 저장됩니다. Compute Engine 인스턴스 메타데이터 항목의 전체 목록은 VM 인스턴스 메타데이터를 참조하세요.

http://metadata.google.internal/computeMetadata/v1/instance/

항목 설명
hostname

노드의 호스트 이름입니다.

id

노드의 고유 ID입니다.

service-accounts/

노드와 연결된 서비스 계정의 디렉터리입니다. 각 서비스 계정에 대한 다음 정보가 제공됩니다.

  • aliases
  • email: 서비스 계정 이메일 주소입니다.
  • identity: 노드에 고유한 JSON 웹 토큰(JWT)입니다. 요청에 audience 매개변수를 포함해야 합니다. 예를 들면 ?audience=http://www.example.com입니다.
  • scopes: 서비스 계정에 할당된 액세스 범위입니다.
  • token: 워크로드를 인증하는 OAuth 2.0 액세스 토큰입니다.

인스턴스 속성

인스턴스 메타데이터는 다음 디렉터리 아래에 저장됩니다. Compute Engine 인스턴스 속성 항목의 전체 목록은 인스턴스 속성을 참조하세요.

http://metadata.google.internal/computeMetadata/v1/instance/attributes/

항목 설명
cluster-location

클러스터의 Compute Engine 영역 또는 리전입니다.

cluster-name

GKE 클러스터의 이름입니다.

cluster-uid

GKE 클러스터의 UID입니다.

프로젝트 메타데이터

클러스터 프로젝트 메타데이터는 다음 디렉터리에 저장됩니다. Compute Engine 프로젝트 메타데이터 항목의 전체 목록은 프로젝트 메타데이터를 참조하세요.

http://metadata.google.internal/computeMetadata/v1/project/

항목 설명
project-id

Google Cloud 프로젝트 ID

numeric-project-id

Google Cloud 프로젝트 번호입니다.

워크로드 아이덴티티의 대안

워크로드 아이덴티티의 다음 대안 중 하나를 사용하여 GKE에서 Google Cloud API에 액세스할 수 있습니다.

  • 서비스 계정 키를 내보내 Kubernetes 보안 비밀로 저장합니다. Google 서비스 계정 키는 만료되지 않으며 수동으로 순환해야 합니다. 서비스 계정 키를 내보내면 보안 침해가 감지되지 않을 경우 보안 침해 범위가 확대될 가능성이 있습니다. 내보낸 키를 도난당한 경우 공격자는 사용자가 인지하여 수동으로 키를 취소할 때까지 이 키를 사용하여 해당 서비스 계정으로 인증할 수 있습니다.

  • 노드의 Compute Engine 기본 서비스 계정을 사용합니다. 프로젝트에서 IAM 서비스 계정으로 노드 풀을 실행할 수 있습니다. 노드 풀을 만드는 동안 서비스 계정을 지정하지 않으면 GKE는 프로젝트에 Compute Engine 기본 서비스 계정을 사용합니다. Compute Engine 서비스 계정은 해당 노드에 배포된 모든 워크로드에서 공유됩니다. 이로 인해 권한이 과도하게 프로비저닝될 수 있으며, 이는 최소 권한의 원칙에 위배되며 멀티 테넌트 클러스터에 적합하지 않습니다.

다음 단계