워크로드 아이덴티티


워크로드 아이덴티티는 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 정책 binding을 사용해서 Kubernetes 서비스 계정 구성원 이름을 워크로드에 필요한 권한이 있는 IAM 서비스 계정에 바인딩합니다. 이 Kubernetes 서비스 계정을 사용하는 워크로드의 Google Cloud API 호출은 바인딩된 IAM 서비스 계정으로 인증됩니다.

ID 동일성

워크로드 아이덴티티로 Kubernetes 서비스 계정을 확인하기 위해 IAM에 사용되는 구성원 이름에는 다음 변수가 사용됩니다.

  • 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 네임스페이스를 만들고 클러스터 A 및 클러스터 B와 마찬가지로 back IAM 서비스 계정을 사용해서 Google Cloud API에 액세스할 수 있습니다.

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

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 메타데이터 값을 참조하세요.

인스턴스 메타데이터

인스턴스 메타데이터는 다음 디렉터리에 저장됩니다.

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 액세스 토큰입니다.

인스턴스 속성

인스턴스 속성은 다음 디렉터리에 저장됩니다.

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

항목 설명
cluster-location

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

cluster-name

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

cluster-uid

GKE 클러스터의 UID입니다.

프로젝트 메타데이터

클러스터 프로젝트 메타데이터는 다음 디렉터리에 저장됩니다.

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 서비스 계정은 해당 노드에 배포된 모든 워크로드에서 공유됩니다. 따라서 권한이 초과 프로비저닝되어 최소 권한의 원칙에 위배되고 멀티 테넌트 클러스터에 적합하지 않게 됩니다.

다음 단계