GKE용 ID 서비스로 인증


이 페이지에서는 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 사용 설정
  • Cloud SDK가 설치되었는지 확인합니다.
  • 다음 방법 중 하나를 사용하여 프로젝트의 기본 gcloud 명령줄 도구 설정을 지정합니다.
    • 프로젝트 기본값 설정 방법을 알아보려면 gcloud init를 사용합니다.
    • 프로젝트 ID, 영역, 리전을 개별적으로 설정하려면 gcloud config를 사용합니다.

    gcloud init

    1. gcloud init를 실행하고 다음 안내를 따르세요.

      gcloud init

      원격 서버에서 SSH를 사용하는 경우 --console-only 플래그를 사용하여 다음 명령어로 브라우저를 실행하지 못하게 할 수 있습니다.

      gcloud init --console-only
    2. 안내를 따라 gcloud 도구에서 Google Cloud 계정을 사용하도록 승인합니다.
    3. 새 구성을 만들거나 기존 구성을 선택합니다.
    4. Google Cloud 프로젝트를 선택합니다.
    5. 기본 Compute Engine 영역을 선택합니다.
    6. 기본 Compute Engine 리전을 선택합니다.

    gcloud config

    1. 기본 프로젝트 ID를 설정합니다.
      gcloud config set project PROJECT_ID
    2. 기본 Compute Engine 리전(예: us-central1)을 설정합니다.
      gcloud config set compute/region COMPUTE_REGION
    3. 기본 Compute Engine 영역(예: us-central1-c)을 설정합니다.
      gcloud config set compute/zone COMPUTE_ZONE
    4. gcloud를 최신 버전으로 업데이트합니다.
      gcloud components update

    기본 위치를 설정하면 gcloud 도구에서 One of [--zone, --region] must be supplied: Please specify location과 같은 오류를 방지할 수 있습니다.

캐릭터

이 주제에서는 두 가지 캐릭터를 기준으로 설정합니다.

  • 클러스터 관리자: 이 사람은 사용자 클러스터를 하나 이상 만들고 클러스터를 사용하는 개발자를 위한 인증 구성 파일을 만듭니다.

  • 개발자: 이 사람은 한 개 이상의 클러스터에서 워크로드를 실행하고 OIDC를 사용하여 인증합니다.

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

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

기본적으로 Identity and Access Management는 클러스터 인증을 위한 ID 공급업체로 구성됩니다. 타사 ID 공급업체에서 OIDC를 사용하려면 gcloud 명령줄 도구를 사용하여 클러스터를 만드는 동안 GKE용 ID 서비스를 사용 설정할 수 있습니다.

gcloud 도구를 사용하여 GKE용 ID 서비스가 사용 설정된 상태로 클러스터를 만들려면 다음 명령어를 실행합니다.

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

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

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

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

gcloud 명령줄 도구를 사용하여 기존 클러스터에서 GKE용 ID 서비스를 사용 설정할 수 있습니다.

클러스터를 업데이트할 때 --enable-identity-service 옵션을 지정하세요.

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

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

클러스터에서 GKE용 ID 서비스 구성

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

GKE ID 공급업체 구성은 ID 공급업체 구성, 선호 인증 방법, 사용자 및 그룹 클레임 매핑 등의 정보가 포함된 Kubernetes CRD(커스텀 리소스 정의)를 통해 처리됩니다.

default라는 ClientConfig 구성 파일은 kube-public 네임스페이스에서 클러스터에 대해 자동으로 생성됩니다.

  1. 다음 명령어를 실행하여 이 구성 파일을 다운로드합니다.

    kubectl get clientconfig default -n kube-public -o yaml > login-config.yaml
    
  2. Spec.authentication 섹션에서 OIDC 설정으로 다운로드한 ClientConfig 구성 파일을 업데이트합니다.

    apiVersion: authentication.gke.io/v2alpha1
    kind: ClientConfig
    metadata:
    annotations:
      controller-gen.kubebuilder.io/version: v0.2.4
    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: CLOUD_CONSOLE_REDIRECT_URI
         kubectlRedirectURI: KUBECTL_REDIRECT_URL
         Scopes: SCOPES
         userClaim: USER
         groupsClaim: GROUPS
         userPrefix: USER_PREFIX
         groupPrefix: GROUP_PREFIX
    

    다음을 바꿉니다.

    • CLIENT_ID: OpenID 제공업체에 인증을 요청하는 클라이언트 애플리케이션의 ID입니다.
    • OIDC_PROVIDER_CERTIFICATE: (선택사항) OIDC 공급업체에 대해 base64로 인코딩된 PEM 인코딩 인증서입니다. 이 필드는 OIDC 공급업체가 자체 서명된 인증서를 사용하는 경우에 유용할 수 있습니다. GKE용 ID 서비스는 기본적으로 공개 루트 집합을 포함합니다.
      • 문자열을 만들려면 헤더를 포함하여 인증서를 base64로 인코딩합니다.
      • certificateAuthorityData에 결과 문자열을 단일 줄로 포함합니다. 예를 들면 certificateAuthorityData: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tC...k1JSUN2RENDQWFT==입니다.
    • EXTRA_PARAMS: OpenID 제공업체에 전송할 추가적인 키-값 매개변수입니다. 그룹을 승인하는 경우 resource=token-groups-claim을 전달합니다. 승인 서버가 Microsoft Azure 및 Okta의 인증 동의를 요청하면 extraParamsprompt=consent로 설정합니다. Cloud ID의 경우 extraParamsprompt=consent,access_type=offline으로 설정합니다.
    • ISSUER_URI: 승인 요청이 OpenID로 전송되는 URL입니다(예: https://example.com/adfs). Kubernetes API 서버는 이 URL을 사용하여 토큰을 확인할 수 있도록 공개 키를 검색합니다. URI는 HTTPS를 사용해야 합니다.
    • CLOUD_CONSOLE_REDIRECT_URI: Cloud Console의 리디렉션 URL입니다(예: https://console.cloud.google.com/kubernetes/oidc).
    • KUBECTL_REDIRECT_URL: 승인을 위해 kubectl에 사용되는 리디렉션 URL입니다.
    • SCOPES: OpenID 제공업체에 전송할 추가적인 범위입니다. Microsoft Azure 및 Okta에는 offline_access 범위가 필요합니다.
    • USER_PREFIX: 기존 이름과 충돌을 방지하기 위해 사용자 클레임에 추가된 프리픽스입니다. 기본적으로 발급자 프리픽스는 Kubernetes API server에 제공된 userID에 연결됩니다(사용자 클레임이 email이 아닌 경우). 결과 사용자 식별자는 ISSUER_URI#USER입니다. 예를 들면 https://example.com/adfs#123123123입니다. 여기서 https://example.com/adfsISSUER_URI이고 123123123은 JWT의 사용자 클레임입니다. 프리픽스 사용이 권장되지만 프리픽스를 중지하려면 USER_PREFIX-로 설정할 수 있습니다.
    • GROUP_PREFIX: 기존 이름과 충돌을 방지하기 위해 그룹 클레임에 추가된 프리픽스입니다. 예를 들어 이름이 foobar인 그룹이 2개 있는 경우 gid- 프리픽스를 추가합니다. 결과 그룹은 gid-foobar입니다.
  3. 구성을 완료한 후 다음 명령어를 실행하여 구성을 적용합니다.

    kubectl apply -f login-config.yaml
    

    이 구성을 적용한 후에는 GKE용 ID 서비스가 클러스터 내에서 실행되고 Google Cloud 부하 분산기 뒤에서 요청을 처리합니다. 클러스터가 비공개 끝점으로 구성된 경우 부하 분산기가 내부입니다. 그렇지 않으면 부하 분산기가 외부이고 공개 인터넷에서 액세스될 수 있습니다.

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

    clientSecret: CLIENT_SECRET
    

    CLIENT_SECRET를 OIDC 클라이언트 애플리케이션과 OIDC 제공업체 사이의 공유 보안 비밀로 바꿉니다. 클라이언트 보안 비밀번호를 kube-apiserver에 업로드하지 않으려면 kubectl apply 명령어를 다시 실행하여 구성을 적용하지 마세요.

  5. 업데이트된 login-config.yaml 파일을 개발자들에게 배포하고 해당 플랫폼의 적정 위치에 구성 파일을 배치하도록 안내합니다.

클러스터의 RBAC 정책 만들기

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

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

예를 들어 사용자가 클러스터 간의 모든 보안 비밀 객체를 볼 수 있도록 한다고 가정해보세요.

다음은 secret-viewer라는 ClusterRole의 매니페스트입니다. 이 역할이 부여된 사람은 클러스터의 모든 보안 비밀을 가져오고, 보고, 나열할 수 있습니다.

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"]

다음은 people-who-view-secrets라는 ClusterRoleBinding의 매니페스트입니다. 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
  1. ISSUER_URI를 클라이언트 구성 파일에 있는 spec.authentication.oidc.issuerURI의 발급자 URI로 바꿉니다. USER를 클라이언트 구성 파일에서 spec.authentication.oidc.userClaim에 구성된 클레임 이름 아래의 토큰에 있는 사용자 ID로 바꿉니다. 예를 들면 https://example.com/adfs#123123123입니다. 여기서 https://example.com/adfsISSUER_URI이고 123123123은 사용자 ID입니다.

  2. ClusterRole을 만들려면 매니페스트를 secret-viewer-cluster-role.yaml이라는 파일에 저장하고 다음 명령어를 실행합니다.

    kubectl apply -f secret-viewer-cluster-role.yaml
    
  3. ClusterRoleBinding을 만들고 매니페스트를 secret-viewer-cluster-role-binding.yaml이라는 파일에 저장하고 다음 명령어를 실행합니다.

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

클러스터에 로그인 및 인증

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

이제 관리자로부터 인증 구성 파일이 준비되었으므로, 클러스터에 인증을 수행할 수 있습니다.

  1. 관리자가 제공한 login-config.yaml 파일을 다운로드하고 이를 플랫폼의 올바른 위치에 배치합니다.

  2. 개별 OIDC 구성요소를 제공하는 Cloud SDK 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 명령줄 도구를 사용하여 GKE용 ID 서비스를 중지할 수 있습니다. To disable GKE용 ID 서비스를 중지하려면 --no-enable-identity-service 옵션을 지정합니다.

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

다음 단계