Menggunakan penyedia identitas eksternal untuk melakukan autentikasi ke GKE


Halaman ini menunjukkan cara mengonfigurasi autentikasi ke cluster Google Kubernetes Engine (GKE) dari penyedia identitas eksternal (IdP).

Halaman ini ditujukan untuk admin dan operator Platform serta admin Identitas dan akun yang menggunakan IdP eksternal yang mendukung OpenID Connect (OIDC) atau Security Assertion Markup Language (SAML) 2.0.

Sebelum membaca halaman ini, pastikan Anda sudah memahami konsep autentikasi dan OpenID berikut:

Metode autentikasi IdP eksternal di GKE

Direkomendasikan — Workforce Identity Federation

Workforce Identity Federation adalah fitur IAM yang memungkinkan Anda melakukan autentikasi ke Google Cloud dari IdP eksternal apa pun yang mendukung OIDC atau SAML 2.0. Workforce Identity Federation tidak memerlukan penginstalan dalam cluster, berfungsi dengan cluster Autopilot dan cluster Standard, serta di-build ke dalam Google Cloud. Untuk mengetahui detailnya, lihat dokumentasi IAM tentang Workforce Identity Federation.

Tidak direkomendasikan — Identity Service untuk GKE

Khusus di cluster GKE Standard, GKE juga mendukung Identity Service untuk GKE. Identity Service untuk GKE terbatas pada IdP OIDC dan menginstal komponen tambahan di cluster Anda. GKE sangat merekomendasikan penggunaan Workforce Identity Federation, bukan Identity Service untuk GKE.

Sebelum memulai

Sebelum memulai, pastikan Anda telah menjalankan tugas berikut:

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

Pertimbangan

Sistem headless tidak didukung dengan Workforce Identity Federation dan Identity Service untuk GKE. Alur autentikasi berbasis browser meminta Anda untuk memberikan izin dan memberikan otorisasi ke akun pengguna Anda.

Menggunakan Workforce Identity Federation di GKE

Untuk menggunakan Workforce Identity Federation di cluster GKE, lakukan hal berikut:

  1. Siapkan Workforce Identity Federation untuk organisasi dan IdP eksternal Anda. Untuk mengetahui petunjuknya, lihat Mengonfigurasi Workforce Identity Federation.
  2. Siapkan akses dari IdP eksternal ke Google Cloud konsol Workforce Identity Federation. Untuk mengetahui detailnya, lihat Menyiapkan akses pengguna ke konsol (gabungan).
  3. Konfigurasikan akses pengguna menggunakan salah satu mekanisme otorisasi berikut:

Mengonfigurasi akses pengguna ke cluster menggunakan RBAC

Google Cloud menggunakan ID akun utama untuk mengidentifikasi pengguna di workforce identity pool Anda. Anda dapat merujuk ke ID utama ini dalam kebijakan RBAC Kubernetes atau dalam kebijakan IAM. Anda dapat memberikan izin kepada individu atau grup pengguna, seperti dalam contoh berikut:

Identitas ID utama
Satu pengguna
principal://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_IDENTITY_POOL/subject/SUBJECT_ATTRIBUTE_VALUE

Ganti kode berikut:

  • WORKFORCE_IDENTITY_POOL: nama kumpulan identitas tenaga kerja.
  • SUBJECT_ATTRIBUTE_VALUE: nilai atribut dalam pernyataan subjek token identitas. Misalnya, ini mungkin nilai kolom NameID dalam pernyataan SAML 2.0.

Contoh:

principal://iam.googleapis.com/locations/global/workforcePools/full-time-employees/subject/amal@example.com
Semua pengguna dalam grup
principalSet://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_IDENTITY_POOL/group/GROUP_NAME

Ganti kode berikut:

  • WORKFORCE_IDENTITY_POOL: nama kumpulan identitas tenaga kerja.
  • GROUP_NAME: nama grup tempat pengguna yang melakukan autentikasi menjadi anggota. Pernyataan dalam token IdP Anda harus memiliki pemetaan atribut ke atribut Google Cloud google.groups.

Contoh:

principalSet://iam.googleapis.com/locations/global/workforcePools/full-time-employees/group/sre

Untuk setiap ID akun utama yang didukung Workforce Identity Federation, lihat Merepresentasikan pengguna workforce identity pool dalam kebijakan IAM.

Contoh berikut menunjukkan cara memberikan akses hanya baca di seluruh cluster pada Secrets ke entitas apa pun di kumpulan tenaga kerja full-time-employees yang memiliki atribut access_level="sensitive" di token IdP-nya.

  1. Simpan manifes ClusterRole berikut sebagai secret-viewer-cluster-role.yaml:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: secret-viewer
    rules:
    - apiGroups: [""]
      resources: ["secrets"]
      verbs: ["get", "watch", "list"]
    

    Setiap akun utama yang Anda ikat dengan ClusterRole ini dapat melihat Secret.

  2. Simpan manifes ClusterRoleBinding berikut sebagai secret-viewer-cluster-role-binding.yaml:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name:  users-view-secrets
    subjects:
    - kind: Group
      name: principalSet://iam.googleapis.com/locations/global/workforcePools/full-time-employees/attribute.access_level/sensitive
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: ClusterRole
      name: secret-viewer
      apiGroup: rbac.authorization.k8s.io
    

    ClusterRoleBinding ini memberikan ClusterRole secret-viewer kepada pengguna mana pun yang memiliki atribut access_level="sensitive".

  3. Deploy ClusterRole dan ClusterRoleBinding:

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

Memigrasikan Identity Service untuk cluster GKE ke Workload Identity Federation

Jika Anda menggunakan Identity Service untuk GKE di cluster GKE yang ada, bermigrasilah ke Workforce Identity Federation. Metode ini menggunakan sintaksis yang berbeda untuk merujuk ke akun utama yang sama, seperti yang ditunjukkan dalam tabel berikut:

Sintaksis Identity Service untuk GKE Sintaksis Workforce Identity Federation
amal@example.com principal://iam.googleapis.com/locations/global/workforcePools/full-time-employees/subject/amal@example.com
sre-group principalSet://iam.googleapis.com/locations/global/workforcePools/full-time-employees/group/sre-group

Untuk memigrasikan cluster agar menggunakan Workforce Identity Federation, lakukan hal berikut:

  1. Siapkan Workforce Identity Federation untuk organisasi dan IdP eksternal Anda. Untuk mengetahui petunjuknya, lihat Mengonfigurasi Workforce Identity Federation.

  2. Perbarui manifes untuk RoleBindings dan ClusterRoleBindings di cluster Anda agar menggunakan sintaksis ID Federasi Identitas Tenaga Kerja. Gunakan salah satu opsi berikut:

    • Update terprogram: instal dan jalankan utilitas gke-identity-service-migrator. Untuk mengetahui petunjuknya, lihat README repositori GoogleCloudPlatform/gke-utilities.

      Utilitas ini menemukan binding RBAC yang ada yang menggunakan sintaksis Identity Service untuk GKE dan membuat manifes baru yang menggunakan ID akun utama Workforce Identity Federation yang sesuai.

    • Pembaruan manual: Untuk setiap binding yang mereferensikan pengguna atau grup yang diautentikasi, buat salinan terpisah file manifes objek yang menggunakan sintaksis ID Workforce Identity Federation.

  3. Terapkan manifes yang diperbarui untuk RoleBindings dan ClusterRoleBindings ke cluster Anda.

  4. Uji apakah pengguna dapat mengakses resource yang sama saat mereka mengautentikasi menggunakan Workforce Identity Federation.

  5. Hapus binding RBAC yang sudah tidak digunakan lagi dari cluster Anda.

  6. Nonaktifkan Identity Service untuk GKE.

Menggunakan Identity Service untuk GKE

Agar dapat menyiapkan dan menggunakan Identity Service untuk GKE di cluster mode Standar GKE, 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.

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 tanpa endpoint IP eksternal, 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

Mengaktifkan Identity Service untuk GKE di 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.

Mengonfigurasi Identity Service untuk GKE

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 yang lebih besar dari 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, 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

Lihat Parameter Layanan LoadBalancer untuk mengetahui informasi selengkapnya tentang cara mengonfigurasi load balancing TCP/UDP untuk GKE.

Membuat kebijakan RBAC untuk cluster Anda

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

Sebagai developer yang 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

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 berikutnya