외부 ID 공급업체를 사용하여 GKE에 인증


이 문서에서는 Google Kubernetes Engine(GKE) 클러스터에 인증을 수행하도록 외부 ID 공급업체를 구성하는 방법을 설명합니다.

개요

GKE용 ID 서비스는 GKE 클러스터에 인증을 수행하도록 기존 ID 솔루션을 확장합니다. OpenID Connect(OIDC) 지원을 통해 조직에서 사용자 계정 만들기, 사용 설정, 중지를 위한 표준 절차를 사용해서 Kubernetes 클러스터에 대해 액세스를 관리할 수 있습니다. GKE용 ID 서비스는 OIDC ID 공급업체로 제한됩니다.

시작하기 전에

  • 이 문서를 읽기 전에 다음 인증 및 OpenID 개념을 숙지해야 합니다.

  • 헤드리스 시스템은 지원되지 않습니다. 브라우저 기반 인증 흐름은 사용자 동의를 구하고 사용자 계정을 승인하는 데 사용됩니다.

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우 gcloud components update를 실행하여 최신 버전을 가져옵니다.

GKE용 ID 서비스 사용자

이 문서의 태스크는 사용자가 다음 중 하나에 해당할 때 적용됩니다.

  • 클러스터 관리자: 클러스터를 한 개 이상 만들고 클러스터를 사용하는 개발자의 인증 구성 파일을 만드는 경우

  • 개발자: 하나 이상의 클러스터에서 워크로드를 실행하고 OIDC를 사용하여 인증하는 경우

작동 방식

클러스터 관리자는 GKE 클러스터에서 GKE용 ID 서비스를 설정하고 사용하기 위해 다음을 수행합니다.

  1. 클러스터에서 GKE용 ID 서비스를 사용 설정합니다.
  2. GKE용 ID 서비스를 구성합니다.
  3. 클러스터의 RBAC 정책을 만듭니다.

클러스터 관리자가 GKE용 ID 서비스를 구성한 후에는 개발자로그인하고 클러스터에 인증을 수행할 수 있습니다.

클러스터에서 GKE용 ID 서비스 사용 설정

이 섹션은 클러스터 관리자를 대상으로 작성되었습니다.

기본적으로 Identity and Access Management(IAM)는 클러스터 인증을 위한 ID 공급업체로 구성됩니다. 타사 ID 공급업체로 OIDC를 사용하려면 Google Cloud CLI를 사용하여 신규 또는 기존 클러스터에서 GKE용 ID 서비스를 사용 설정하면 됩니다.

새 클러스터에서 GKE용 ID 서비스 사용 설정

GKE용 ID 서비스가 사용 설정된 클러스터를 만들려면 다음 명령어를 실행하세요.

gcloud container clusters create CLUSTER_NAME \
    --enable-identity-service

CLUSTER_NAME을 새 클러스터 이름으로 바꿉니다.

기존 클러스터에서 GKE용 ID 서비스 사용 설정

기존 클러스터에서 GKE용 ID 서비스를 사용 설정하려면 다음 명령어를 실행하세요.

gcloud container clusters update CLUSTER_NAME \
    --enable-identity-service

CLUSTER_NAME을 클러스터 이름으로 바꿉니다.

GKE용 ID 서비스에서 생성된 Kubernetes 객체

다음 표에서는 클러스터에서 GKE용 ID 서비스를 사용 설정할 때 생성된 Kubernetes 객체에 대해 설명합니다.

Kubernetes 객체
anthos-identity-service Namespace
GKE용 ID 서비스 배포에 사용됩니다.
kube-public Namespace
default 클라이언트 구성 파일에 사용됩니다.
gke-oidc-envoy LoadBalancer
OIDC 요청의 엔드포인트입니다. 기본적으로 외부입니다. 비공개 클러스터 또는 네트워크 정책이 엄격한 클러스터에 생성된 경우에는 엔드포인트가 클러스터 Virtual Private Cloud 내부에 있습니다.
anthos-identity-service 네임스페이스에 생성됩니다.
gke-oidc-service ClusterIP
gke-oidc-envoy 배포와 gke-oidc-service 배포 사이의 통신을 지원합니다.
anthos-identity-service 네임스페이스에 생성됩니다.
gke-oidc-envoy Deployment
gke-oidc-envoy LoadBalancer에 노출된 프록시를 실행합니다. gke-oidc-service와 통신하여 ID 토큰을 검증합니다. Kubernetes API 서버의 프록시 역할을 하며 API 서버에 요청을 전달할 때 사용자를 가장합니다.
anthos-identity-service 네임스페이스에 생성됩니다.
gke-oidc-service Deployment
ID 토큰의 유효성을 검사하고 ClientConfig 리소스에 대한 허용 웹훅 검증을 제공합니다.
anthos-identity-service 네임스페이스에 생성됩니다.
gke-oidc-operator Deployment
클라이언트 구성 및 gke-oidc-envoy LoadBalancer를 조정합니다.
anthos-identity-service 네임스페이스에 생성됩니다.
gke-oidc-certs Secret
LoadBalancer에 대한 클러스터 인증 기관(CA) 및 TLS 인증서를 포함합니다.
anthos-identity-service 네임스페이스에 생성됩니다.
default ClientConfig CRD
선호 인증 방법, ID 공급업체 구성, 사용자 및 그룹 클레임 매핑과 같은 OIDC 매개변수를 포함합니다. ID 토큰 검증에 사용됩니다. 개발자들에게 배포하기 전 클러스터 관리자가 OIDC 설정을 구성하는 데 사용됩니다.
kube-public 네임스페이스에 생성됩니다.

GKE용 ID 서비스 구성

이 섹션은 클러스터 관리자를 대상으로 작성되었습니다.

default ClientConfig를 다운로드하고 수정하여 GKE용 ID 서비스를 구성할 수 있습니다.

  1. default ClientConfig를 다운로드합니다.

    kubectl get clientconfig default -n kube-public -o yaml > client-config.yaml
    
  2. 원하는 설정으로 spec.authentication 섹션을 업데이트하세요.

    apiVersion: authentication.gke.io/v2alpha1
    kind: ClientConfig
    metadata:
      name: default
      namespace: kube-public
    spec:
      name: cluster-name
      server: https://192.168.0.1:6443
      authentication:
      - name: oidc
        oidc:
          clientID: CLIENT_ID
          certificateAuthorityData: OIDC_PROVIDER_CERTIFICATE
          extraParams: EXTRA_PARAMS
          issuerURI:  ISSUER_URI
          cloudConsoleRedirectURI: https://console.cloud.google.com/kubernetes/oidc
          kubectlRedirectURI: KUBECTL_REDIRECT_URL
          scopes: SCOPES
          userClaim: USER
          groupsClaim: GROUPS
          userPrefix: USER_PREFIX
          groupPrefix: GROUP_PREFIX
    

    다음을 바꿉니다.

    • CLIENT_ID: OIDC 공급업체에 대해 인증 요청을 수행하는 클라이언트 애플리케이션의 ID입니다.
    • OIDC_PROVIDER_CERTIFICATE: (선택사항) OIDC 공급업체에 대한 PEM 인증서입니다. 이 필드는 OIDC 공급업체가 자체 서명된 인증서를 사용하는 경우에 유용할 수 있습니다. GKE용 ID 서비스에는 기본적으로 공개 루트 집합이 포함됩니다.
    • EXTRA_PARAMS: OIDC 제공업체에 전송할 추가적인 키-값 매개변수입니다.
      • 그룹을 승인하려면 resource=token-groups-claim을 사용하세요.
      • Microsoft Azure 및 Okta를 인증하려면 prompt=consent를 사용합니다.
      • Cloud ID의 경우 prompt=consent,access_type=offline을 사용하세요.
    • ISSUER_URI: OIDC 승인 요청을 전송할 URL입니다(예시: https://example.com/adfs). Kubernetes API 서버는 이 URL을 사용하여 토큰을 확인할 수 있도록 공개 키를 검색합니다. URI는 HTTPS를 사용해야 합니다. Cloud ID의 경우 https://accounts.google.com을 사용하세요.
    • KUBECTL_REDIRECT_URL: 승인을 위해 kubectl oidc login에 사용되는 리디렉션 URL입니다. 일반적으로 http://localhost:PORT/callback 형식입니다. 여기서 PORT는 개발자 워크스테이션에서 사용 가능한 1024 이상의 포트입니다(예: http://localhost:10000/callback). 이 URL을 OIDC 제공업체에 클라이언트 애플리케이션의 승인된 리디렉션 URL로 등록해야 합니다. Google ID를 OIDC 공급업체로 사용하는 경우 리디렉션 URI 설정을 참조하세요.
    • SCOPES: OIDC 제공업체에 전송할 추가적인 범위입니다.
      • Microsoft Azure 및 Okta에는 offline_access 범위가 필요합니다.
      • Cloud ID의 경우 openid, email을 사용하여 email 클레임에 이메일 주소가 포함된 ID 토큰을 가져옵니다.
    • USER: ID 토큰의 사용자 클레임입니다.
    • GROUPS: ID 토큰의 그룹 클레임입니다.
    • USER_PREFIX: 기존 이름과 충돌을 방지하기 위해 사용자 클레임에 추가된 프리픽스입니다. 기본적으로 발급자 프리픽스가 Kubernetes API server에 제공된 userID 앞에 붙습니다(사용자 클레임이 email이 아닌 경우). 그 결과 사용자 식별자는 ISSUER_URI#USER가 됩니다. 프리픽스를 사용하는 것을 권장하지만, 사용자는 USER_PREFIX-로 설정하여 프리픽스를 사용 중지할 수 있습니다.
    • GROUP_PREFIX: 기존 이름과 충돌을 방지하기 위해 그룹 클레임에 추가되는 프리픽스입니다. 예를 들어 이름이 foobar인 그룹이 2개 있는 경우 gid- 프리픽스를 추가하세요. 결과 그룹은 gid-foobar입니다.
  3. 업데이트된 구성을 적용합니다.

    kubectl apply -f client-config.yaml
    

    이 구성을 적용하면 GKE용 ID 서비스가 클러스터 내에서 실행되고 gke-oidc-envoy 부하 분산기 뒤에서 요청을 처리합니다. spec.server 필드의 IP 주소는 부하 분산기의 IP 주소여야 합니다. spec.server 필드를 변경하면 kubectl 명령어가 실패할 수 있습니다.

  4. client-config.yaml 구성 파일의 사본을 만듭니다.

    cp client-config.yaml login-config.yaml
    
  5. spec.authentication.oidc 섹션의 clientSecret 설정을 사용하여 login-config.yaml 구성 파일을 업데이트합니다.

    clientSecret: CLIENT_SECRET
    

    CLIENT_SECRET를 OIDC 클라이언트 애플리케이션과 OIDC 제공업체 사이의 공유 보안 비밀로 바꿉니다.

  6. 업데이트된 login-config.yaml 파일을 개발자에게 배포합니다.

엄격한 정책으로 클러스터에서 GKE용 ID 서비스 구성

비공개 클러스터와 같이 네트워크 정책이 엄격한 클러스터에서 예상대로 작동하도록 GKE용 ID 서비스를 구성하려면 다음을 수행합니다.

  1. 제어 영역이 ClientConfig 검증 웹훅과 통신할 수 있도록 TCP 포트 15000에 대해 방화벽 규칙을 추가합니다.
  2. gke-oidc-envoy가 내부 부하 분산기로 생성되었으면 이를 VPC에 노출합니다.
  3. 클러스터 내에서 트래픽을 거부하는 정책이 있으면 gke-oidc-envoy 배포가 gke-oidc-service 배포와 통신할 수 있도록 TCP 포트 8443에 대해 방화벽 규칙을 추가합니다.

GKE용 ID 서비스 구성요소 버전 0.2.20 이상에서는 TCP 포트 15000을 사용하지 않습니다. 구성요소 버전이 0.2.20 이상인 경우 포트 15000에 대한 방화벽 규칙을 추가할 필요가 없습니다. 구성요소 버전을 확인하려면 다음 명령어를 실행합니다.

kubectl describe deployment gke-oidc-envoy -n anthos-identity-service \
    | grep "components.gke.io/component-name: gke-oidc" -A1

부하 분산기에 커스텀 속성 추가

GKE용 ID 서비스를 구성한 후 고정 IP 주소와 같은 커스텀 주석 및 속성을 gke-oidc-envoy 부하 분산기에 추가할 수 있습니다. gke-oidc-envoy 서비스를 삭제하려면 다음 명령어를 실행합니다.

kubectl edit service gke-oidc-envoy -n anthos-identity-service

GKE에 TCP/UDP 부하 분산 구성 방법에 대한 문서를 참조하세요.

클러스터의 RBAC 정책 만들기

이 섹션은 클러스터 관리자를 위해 작성되었습니다.

관리자가 Kubernetes 역할 기반 액세스 제어(RBAC)를 사용하여 인증된 클러스터 사용자에게 액세스 권한을 부여할 수 있습니다. 클러스터에 대해 RBAC를 구성하려면 사용자는 각 개발자에게 RBAC 역할을 부여해야 합니다. 특정 네임스페이스의 리소스에 대한 액세스 권한을 부여하려면 RoleRoleBinding을 만듭니다. 전체 클러스터에서 리소스에 대한 액세스 권한을 부여하려면 ClusterRoleClusterRoleBinding을 만듭니다.

예를 들어 사용자가 클러스터 간의 모든 보안 비밀 객체를 확인해야 한다고 가정해보세요. 다음 단계에서는 이 사용자에게 필요한 RBAC 역할을 부여합니다.

  1. 다음 ClusterRole 매니페스트를 secret-viewer-cluster-role.yaml로 저장하세요. 이 역할이 부여된 사람은 클러스터의 모든 보안 비밀을 가져오고, 보고, 나열할 수 있습니다.

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: secret-viewer
    rules:
    - apiGroups: [""]
      # The resource type for which access is granted
      resources: ["secrets"]
      # The permissions granted by the ClusterRole
      verbs: ["get", "watch", "list"]
    
  2. ClusterRole 매니페스트를 적용합니다.

    kubectl apply -f secret-viewer-cluster-role.yaml
    
  3. 다음 ClusterRoleBinding 매니페스트를 secret-viewer-cluster-role-binding.yaml로 저장합니다. binding은 클라이언트 구성 파일에 정의된 사용자 이름에 secret-viewer 역할을 부여합니다.

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name:  people-who-view-secrets
    subjects:
    - kind: User
      name: ISSUER_URI#USER
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: ClusterRole
      name: secret-viewer
      apiGroup: rbac.authorization.k8s.io
    

    다음을 바꿉니다.

    • ISSUER_URI: 클라이언트 구성 파일의 spec.authentication.oidc.issuerURI에서 가져온 발급기관 URI입니다.
    • USER: 클라이언트 구성 파일의 spec.authentication.oidc.userClaim에 구성된 클레임 이름 아래에 있는 토큰의 사용자 식별자
  4. ClusterRoleBinding 매니페스트를 적용합니다.

    kubectl apply -f secret-viewer-cluster-role-binding.yaml
    

클러스터에 로그인 및 인증

이 섹션은 개발자를 위해 작성되었습니다.

관리자로부터 OIDC 구성 파일을 받으면 클러스터에 인증을 수행할 수 있습니다.

  1. 관리자가 제공한 login-config.yaml 파일을 다운로드합니다.

  2. 별도의 OIDC 구성요소를 제공하는 Google Cloud CLI SDK를 설치하세요. 다음 명령어를 실행하여 이를 설치할 수 있습니다.

    gcloud components install kubectl-oidc
    
  3. 클러스터에 인증을 수행합니다.

    kubectl oidc login --cluster=CLUSTER_NAME --login-config=login-config.yaml
    

    인증 프로세스를 완료하도록 웹브라우저가 열립니다.

  4. 인증된 후에는 kubectl 명령어를 실행하여 다음을 수행할 수 있습니다.

    kubectl get pods
    

GKE용 ID 서비스 사용 중지

이 섹션은 클러스터 관리자를 대상으로 작성되었습니다.

gcloud CLI를 사용하여 GKE용 ID 서비스를 사용 중지할 수 있습니다. GKE용 ID 서비스를 사용 중지하려면 다음 명령어를 실행하세요.

gcloud container clusters update CLUSTER_NAME \
    --no-enable-identity-service

다음 단계