Menggunakan penyedia identitas eksternal untuk melakukan autentikasi ke GKE


Halaman ini menjelaskan cara mengonfigurasi penyedia identitas eksternal untuk melakukan autentikasi ke cluster Google Kubernetes Engine (GKE).

Ringkasan

Identity Service untuk GKE dapat membantu memperluas solusi identitas Anda yang sudah ada untuk autentikasi ke dalam cluster GKE. Dengan dukungan untuk OpenID Connect (OIDC), Anda dapat mengelola akses ke cluster Kubernetes menggunakan prosedur standar di organisasi Anda untuk membuat, mengaktifkan, dan menonaktifkan akun pengguna. Identity Service untuk GKE terbatas bagi penyedia identitas OIDC.

Sebelum memulai

  • Topik ini mengasumsikan bahwa Anda sudah memahami konsep autentikasi dan OpenID berikut:

  • Sistem headless tidak didukung. Alur autentikasi berbasis browser digunakan untuk meminta persetujuan dan memberikan otorisasi ke akun pengguna Anda.

Sebelum memulai, pastikan Anda telah melakukan tugas berikut:

  • Aktifkan Google Kubernetes Engine API.
  • Aktifkan Google Kubernetes Engine API
  • Jika ingin menggunakan Google Cloud CLI untuk tugas ini, instal lalu initialize gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan gcloud components update.

Pengguna Identity Service untuk GKE

Tugas dalam dokumen ini berlaku untuk Anda jika Anda adalah salah satu dari peran berikut:

  • Administrator cluster: Membuat satu atau beberapa cluster pengguna dan membuat file konfigurasi autentikasi untuk developer yang menggunakan cluster tersebut.

  • Developer: Menjalankan workload di satu atau beberapa cluster dan menggunakan OIDC untuk melakukan autentikasi.

Cara kerja

Agar dapat menyiapkan dan menggunakan Identity Service untuk GKE di cluster GKE Anda, administrator cluster harus melakukan hal berikut:

  1. Aktifkan Identity Service untuk GKE di cluster.
  2. Mengonfigurasi Identity Service untuk GKE.
  3. Buat kebijakan RBAC untuk cluster Anda.

Setelah administrator cluster mengonfigurasi Identity Service untuk GKE, developer dapat login dan melakukan autentikasi ke cluster.

Mengaktifkan Identity Service untuk GKE di cluster

Bagian ini ditujukan bagi administrator cluster.

Secara default, Identity and Access Management (IAM) dikonfigurasi sebagai penyedia identitas untuk autentikasi cluster. Jika ingin menggunakan OIDC dengan penyedia identitas pihak ketiga, Anda dapat mengaktifkan Identity Service untuk GKE pada cluster baru atau yang sudah ada menggunakan Google Cloud CLI.

Mengaktifkan Identity Service untuk GKE di cluster baru

Untuk membuat cluster dengan Identity Service untuk GKE yang diaktifkan, jalankan perintah berikut:

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

Ganti CLUSTER_NAME dengan nama cluster baru Anda.

Mengaktifkan Identity Service untuk GKE di cluster yang sudah ada

Guna mengaktifkan Identity Service untuk GKE pada cluster yang sudah ada, jalankan perintah berikut

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

Ganti CLUSTER_NAME dengan nama cluster Anda.

Objek Kubernetes yang dibuat oleh Identity Service untuk GKE

Tabel berikut menjelaskan objek Kubernetes yang dibuat saat Anda mengaktifkan Identity Service untuk GKE di cluster:

Objek Kubernetes
anthos-identity-service Namespace
Digunakan untuk deployment Identity Service untuk GKE.
kube-public Namespace
Digunakan untuk file konfigurasi klien default.
gke-oidc-envoy LoadBalancer
Endpoint untuk permintaan OIDC. Eksternal secara default. Jika dibuat di cluster pribadi, atau cluster dengan kebijakan jaringan yang ketat, endpoint akan bersifat internal untuk Virtual Private Cloud cluster.
Dibuat di namespace anthos-identity-service.
gke-oidc-service ClusterIP
Memfasilitasi komunikasi antara Deployment gke-oidc-envoy dan Deployment gke-oidc-service.
Dibuat di namespace anthos-identity-service.
gke-oidc-envoy Deployment
Menjalankan proxy yang diekspos ke gke-oidc-envoy LoadBalancer. Berkomunikasi dengan gke-oidc-service untuk memvalidasi token identitas. Bertindak sebagai proxy untuk server Kubernetes API, dan meniru identitas pengguna saat meneruskan permintaan ke server API.
Dibuat di namespace anthos-identity-service.
gke-oidc-service Deployment
Memvalidasi token identitas, dan menyediakan validasi webhook penerimaan untuk resource ClientConfig.
Dibuat di namespace anthos-identity-service.
gke-oidc-operator Deployment
Merekonsiliasi konfigurasi klien dan gke-oidc-envoy LoadBalancer.
Dibuat di namespace anthos-identity-service.
gke-oidc-certs Secret
Berisi certificate authority (CA) cluster dan sertifikat TLS untuk LoadBalancer.
Dibuat di namespace anthos-identity-service
default ClientConfig CRD
Berisi parameter OIDC seperti metode autentikasi pilihan, konfigurasi penyedia identitas, serta pemetaan klaim pengguna dan grup. Digunakan untuk validasi token identitas. Digunakan oleh administrator cluster untuk mengonfigurasi setelan OIDC sebelum mendistribusikannya kepada developer.
Dibuat di namespace kube-public

Mengonfigurasi Identity Service untuk GKE

Bagian ini ditujukan bagi administrator cluster.

Anda dapat mengonfigurasi Identity Service untuk parameter GKE dengan mendownload dan mengubah ClientConfig default.

  1. Download ClientConfig default:

    kubectl get clientconfig default -n kube-public -o yaml > client-config.yaml
    
  2. Perbarui bagian spec.authentication dengan setelan yang Anda pilih:

    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
    

    Ganti kode berikut:

    • CLIENT_ID: ID aplikasi klien yang membuat permintaan autentikasi ke penyedia OIDC.
    • OIDC_PROVIDER_CERTIFICATE: (Opsional) sertifikat PEM untuk penyedia OIDC. Kolom ini mungkin berguna jika penyedia OIDC Anda menggunakan sertifikat yang ditandatangani sendiri. Identity Service untuk GKE menyertakan sekumpulan root publik secara default.
    • EXTRA_PARAMS: parameter nilai kunci tambahan yang akan dikirim kepada penyedia OIDC.
      • Untuk memberikan otorisasi ke grup, gunakan resource=token-groups-claim.
      • Untuk mengautentikasi Microsoft Azure dan Okta, gunakan prompt=consent.
      • Untuk Cloud Identity, gunakan prompt=consent,access_type=offline.
    • ISSUER_URI: URL untuk mengirim permintaan otorisasi OIDC, seperti https://example.com/adfs. Server Kubernetes API menggunakan URL ini untuk menemukan kunci publik agar dapat memverifikasi token. URI harus menggunakan HTTPS. Untuk Cloud Identity, gunakan https://accounts.google.com.
    • KUBECTL_REDIRECT_URL: URL alihan yang digunakan kubectl oidc login untuk otorisasi. URL ini biasanya menggunakan format http://localhost:PORT/callback, dengan PORT adalah port apa pun di atas 1024 yang akan tersedia di workstation developer, misalnya http://localhost:10000/callback. Anda harus mendaftarkan URL ini ke penyedia OIDC sebagai URL alihan yang diotorisasi untuk aplikasi klien. Jika Anda menggunakan Google Identity sebagai penyedia OIDC, baca Menetapkan URI pengalihan untuk mendapatkan petunjuk.
    • SCOPES: cakupan tambahan yang akan dikirim kepada penyedia OIDC.
      • Microsoft Azure dan Okta memerlukan cakupan offline_access.
      • Untuk Cloud Identity, gunakan openid, email untuk mendapatkan token ID yang berisi alamat email dalam klaim email.
    • USER: klaim pengguna dari token identitas.
    • GROUPS: klaim grup dari token identitas.
    • USER_PREFIX: awalan yang ditambahkan ke klaim pengguna untuk mencegah konflik dengan nama yang sudah ada. Secara default, awalan penerbit ditambahkan ke userID yang diberikan ke server Kubernetes API (kecuali jika klaim pengguna adalah email). ID pengguna yang dihasilkan adalah ISSUER_URI#USER. Sebaiknya gunakan awalan, tetapi Anda dapat menonaktifkan awalan tersebut dengan menetapkan USER_PREFIX ke -.
    • GROUP_PREFIX: awalan ditambahkan ke klaim grup untuk mencegah konflik dengan nama yang sudah ada. Misalnya, jika Anda memiliki dua grup bernama foobar, tambahkan awalan gid-. Grup yang dihasilkan adalah gid-foobar.
  3. Terapkan konfigurasi yang telah diperbarui:

    kubectl apply -f client-config.yaml
    

    Setelah konfigurasi ini diterapkan, Identity Service untuk GKE akan berjalan di dalam cluster Anda dan menyalurkan permintaan di balik load balancer gke-oidc-envoy. Alamat IP di kolom spec.server harus merupakan alamat IP load balancer. Jika Anda mengubah kolom spec.server, perintah kubectl mungkin akan gagal.

  4. Buat salinan file konfigurasi client-config.yaml:

    cp client-config.yaml login-config.yaml
    
  5. Perbarui file konfigurasi login-config.yaml dengan setelan clientSecret di bagian spec.authentication.oidc.

    clientSecret: CLIENT_SECRET
    

    Ganti CLIENT_SECRET dengan rahasia bersama antara aplikasi klien OIDC dan penyedia OIDC.

  6. Distribusikan file login-config.yaml yang telah diperbarui kepada developer Anda.

Mengonfigurasi Identity Service untuk GKE pada cluster dengan kebijakan yang ketat

Untuk mengonfigurasi Identity Service untuk GKE agar berfungsi seperti yang diharapkan pada cluster yang menerapkan kebijakan jaringan yang ketat, seperti cluster pribadi, lakukan hal berikut:

  1. Tambahkan aturan firewall untuk port TCP 15000 agar bidang kontrol Anda dapat berkomunikasi dengan webhook validasi ClientConfig.
  2. Jika gke-oidc-envoy dibuat sebagai load balancer internal, ekspos di VPC Anda.
  3. Jika Anda memiliki kebijakan yang menolak traffic dalam cluster, tambahkan aturan firewall untuk port TCP 8443 agar deployment gke-oidc-envoy dapat berkomunikasi dengan deployment gke-oidc-service.

Identity Service untuk komponen GKE versi 0.2.20 dan yang lebih baru tidak menggunakan port TCP 15000. Jika versi komponen Anda adalah 0.2.20 atau yang lebih baru, Anda tidak perlu menambahkan aturan firewall untuk port 15000. Untuk memeriksa versi komponen Anda, jalankan perintah berikut:

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

Menambahkan properti kustom ke load balancer

Setelah mengonfigurasi Identity Service untuk GKE, Anda dapat menambahkan properti dan anotasi kustom, seperti alamat IP statis, ke load balancer gke-oidc-envoy. Untuk mengedit layanan gke-oidc-envoy, jalankan perintah berikut:

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

Baca dokumentasi tentang cara mengonfigurasi load balancing TCP/UDP untuk GKE.

Membuat kebijakan RBAC untuk cluster Anda

Bagian ini ditujukan bagi administrator cluster.

Administrator dapat menggunakan kontrol akses berbasis peran (RBAC) Kubernetes untuk memberikan akses ke pengguna cluster terautentikasi. Agar dapat mengonfigurasi RBAC untuk cluster, Anda harus memberikan peran RBAC untuk setiap developer. Untuk memberikan akses ke resource di namespace tertentu, buat Role dan RoleBinding . Untuk memberikan akses ke resource di seluruh cluster, buat ClusterRole dan ClusterRoleBinding.

Misalnya, pertimbangkan pengguna yang perlu melihat semua objek Secret di seluruh cluster. Langkah-langkah berikut memberikan peran RBAC yang diperlukan kepada pengguna ini.

  1. Simpan manifes ClusterRole berikut sebagai secret-viewer-cluster-role.yaml. Seseorang yang diberi peran ini bisa mendapatkan, menonton, dan membuat daftar Secret apa pun di cluster.

    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. Terapkan manifes ClusterRole:

    kubectl apply -f secret-viewer-cluster-role.yaml
    
  3. Simpan manifes ClusterRoleBinding berikut sebagai secret-viewer-cluster-role-binding.yaml. Binding tersebut memberikan peran secret-viewer ke nama pengguna yang ditentukan dalam file konfigurasi klien.

    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
    

    Ganti kode berikut:

    • ISSUER_URI: URI penerbit dari spec.authentication.oidc.issuerURI di file konfigurasi klien.
    • USER: ID pengguna dalam token di bagian nama klaim yang dikonfigurasi di spec.authentication.oidc.userClaim dalam file konfigurasi klien.
  4. Terapkan manifes ClusterRoleBinding:

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

Login dan melakukan autentikasi ke cluster

Bagian ini ditujukan untuk developer.

Saat menerima file konfigurasi OIDC dari administrator, Anda dapat melakukan autentikasi ke cluster.

  1. Download file login-config.yaml yang disediakan oleh administrator Anda.

  2. Instal Google Cloud CLI SDK, yang menawarkan komponen OIDC terpisah. Anda dapat menginstal paket ini dengan menjalankan perintah berikut:

    gcloud components install kubectl-oidc
    
  3. Lakukan autentikasi ke cluster Anda:

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

    Browser web akan terbuka untuk menyelesaikan proses autentikasi.

  4. Setelah diautentikasi, Anda dapat menjalankan perintah kubectl, misalnya:

    kubectl get pods
    

Menonaktifkan Identity Service untuk GKE

Bagian ini ditujukan bagi administrator cluster.

Anda dapat menonaktifkan Identity Service untuk GKE dengan gcloud CLI. Untuk menonaktifkan Identity Service untuk GKE, jalankan perintah berikut:

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

Langkah selanjutnya