Mengautentikasi ke server Kubernetes API


Halaman ini menjelaskan metode autentikasi yang didukung saat terhubung ke server Kubernetes API di cluster Google Kubernetes Engine (GKE).

Untuk mengetahui informasi tentang cara mengautentikasi workload Kubernetes ke Google Cloud API, lihat Workload Identity Federation untuk GKE.

Ringkasan

Ada beberapa metode untuk mengautentikasi ke server Kubernetes API. Di GKE, autentikasi OAuth direkomendasikan untuk autentikasi cluster dan dikonfigurasi secara otomatis untuk Anda.

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.

Mengautentikasi pengguna

GKE mengelola autentikasi pengguna akhir untuk Anda melalui Google Cloud CLI. Gcloud CLI mengautentikasi pengguna ke Google Cloud, menyiapkan konfigurasi Kubernetes, mendapatkan token akses OAuth untuk cluster, dan terus memperbarui token akses.

Semua cluster GKE dikonfigurasi untuk menerima identitas pengguna dan akun layanan Google Cloud, dengan memastikan kredensial yang diberikan oleh kubectl dan mengambil alamat email yang terkait dengan identitas pengguna atau akun layanan. Oleh karena itu, kredensial untuk akun tersebut harus menyertakan cakupan OAuth userinfo.email agar berhasil mengautentikasi.

Saat Anda menggunakan gcloud guna menyiapkan kubeconfig lingkungan untuk cluster baru atau yang sudah ada, gcloud memberi kubectl kredensial yang sama dengan yang digunakan oleh gcloud sendiri. Misalnya, jika Anda menggunakan gcloud auth login, kredensial pribadi Anda diberikan ke kubectl, termasuk cakupan userinfo.email. Langkah ini memungkinkan cluster GKE untuk mengautentikasi klien kubectl.

Atau, Anda dapat memilih mengonfigurasi kubectl untuk menggunakan kredensial akun layanan Google Cloud, saat berjalan di instance Compute Engine. Namun, secara default, cakupan userinfo.email tidak disertakan dalam kredensial yang dibuat oleh instance Compute Engine. Oleh karena itu, Anda harus menambahkan cakupan ini secara eksplisit, seperti dengan menggunakan flag --scopes saat instance Compute Engine dibuat.

Anda dapat mengizinkan tindakan di cluster menggunakan Identity and Access Management (IAM) atau Kontrol Akses Berbasis Peran (RBAC) Kubernetes.

Mengautentikasi menggunakan OAuth

Untuk mengautentikasi ke cluster menggunakan metode OAuth, lakukan hal berikut:

  1. Login ke gcloud CLI menggunakan kredensial Anda. Tindakan ini membuka browser web untuk menyelesaikan proses autentikasi ke Google Cloud:

    gcloud auth login
    
  2. Ambil kredensial Kubernetes untuk cluster khusus:

    gcloud container clusters get-credentials CLUSTER_NAME \
        --zone=COMPUTE_ZONE
    
  3. Pastikan bahwa Anda telah diautentikasi:

    kubectl cluster-info
    

Setelah pengguna atau akun layanan Google Cloud diautentikasi, keduanya harus diizinkan untuk melakukan tindakan apa pun di cluster GKE. Untuk mengetahui informasi selengkapnya cara mengonfigurasi otorisasi, lihat kontrol akses berbasis peran.

Mengautentikasi aplikasi

Anda juga dapat mengautentikasi ke server API dari aplikasi di Pod tanpa interaksi pengguna, misalnya dari skrip di pipeline CI/CD. Cara melakukannya tergantung pada lingkungan tempat aplikasi Anda berjalan.

Aplikasi di cluster yang sama

Jika aplikasi Anda berjalan di cluster GKE yang sama, gunakan akun layanan Kubernetes untuk mengautentikasi.

  1. Buat akun layanan Kubernetes dan tambahkan ke Pod Anda. Jika Pod sudah memiliki akun layanan Kubernetes, atau jika Anda ingin menggunakan akun layanan default namespace, lewati langkah ini.

  2. Gunakan RBAC Kubernetes untuk memberikan izin yang diperlukan aplikasi Anda kepada akun layanan Kubernetes.

    Contoh berikut memberikan izin view ke resource di namespace prod ke akun layanan bernama cicd di namespace cicd-ns:

    kubectl create rolebinding cicd-secret-viewer \
        --namespace=prod \
        --clusterrole=view \
        --serviceaccount=cicd-ns:cicd
    
  3. Saat runtime, ketika aplikasi Anda mengirimkan permintaan Kubernetes API, server API mengautentikasi kredensial akun layanan.

Aplikasi dalam Google Cloud

Jika aplikasi Anda berjalan di dalam Google Cloud namun di luar cluster target (misalnya, VM Compute Engine atau cluster GKE lainnya), Anda harus mengautentikasi ke server API menggunakan kredensial akun layanan IAM yang tersedia di lingkungan Anda.

  1. Tetapkan akun layanan IAM ke lingkungan Anda. Jika aplikasi Anda berjalan di dalam VM Compute Engine, tetapkan akun layanan IAM ke instance tersebut. Jika aplikasi Anda berjalan di cluster GKE yang berbeda, gunakan Workload Identity Federation for GKE untuk mengonfigurasi Pod agar berjalan sebagai akun layanan IAM.

    Contoh berikut menggunakan ci-cd-pipeline@PROJECT_ID.iam.gserviceaccount.com sebagai akun layanan IAM.

  2. Memberi akun layanan IAM akses ke cluster.

    Contoh berikut memberikan peran IAM roles/container.developer, yang menyediakan akses ke objek Kubernetes API di dalam cluster:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:ci-cd-pipeline@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/container.developer
    

    Atau, Anda dapat menggunakan RBAC untuk memberikan akses ke cluster kepada akun layanan IAM. Jalankan perintah kubectl create rolebinding dari Aplikasi di cluster yang sama dan gunakan --user=ci-cd-pipeline@PROJECT_ID.iam.gserviceaccount.com, bukan flag --service-account.

  3. Ambil kredensial cluster:

    gcloud container clusters get-credentials CLUSTER_NAME \
        --zone=COMPUTE_ZONE
    

    Aplikasi Anda secara otomatis diautentikasi menggunakan akun layanan IAM yang ditetapkan di lingkungan.

Aplikasi di lingkungan lain

Jika aplikasi Anda mengautentikasi dari lingkungan di luar Google Cloud, aplikasi tersebut tidak dapat mengakses kredensial akun layanan IAM yang terkelola. Untuk mengambil kredensial cluster, Anda dapat membuat akun layanan IAM, mendownload kuncinya, dan menggunakan kunci tersebut saat runtime dari layanan Anda untuk mengambil kredensial cluster dengan gcloud CLI.

  1. Buat akun layanan IAM untuk aplikasi Anda. Jika Anda sudah memiliki akun layanan IAM, lewati langkah ini.

    Perintah berikut membuat akun layanan IAM bernama ci-cd-pipeline:

    gcloud iam service-accounts create ci-cd-pipeline
    
  2. Beri akun layanan IAM akses ke cluster Anda.

    Perintah berikut memberikan peran IAM roles/container.developer ke akun layanan IAM ci-cd-pipeline@PROJECT_ID.iam.gserviceaccount.com:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:ci-cd-pipeline@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/container.developer
    

    Anda juga dapat menggunakan RBAC untuk memberikan akses ke cluster kepada akun layanan IAM. Jalankan perintah kubectl create rolebinding dari Aplikasi di cluster yang sama dan gunakan --user=ci-cd-pipeline@PROJECT_ID.iam.gserviceaccount.com, bukan flag --service-account.

  3. Buat dan download kunci untuk akun layanan IAM Anda. Sediakan untuk aplikasi Anda saat runtime:

    gcloud iam service-accounts keys create gsa-key.json \
        --iam-account=ci-cd-pipeline@PROJECT_ID.iam.gserviceaccount.com
    
  4. Saat runtime, di lingkungan yang menjalankan aplikasi Anda, autentikasi ke gcloud CLI menggunakan kunci akun layanan IAM Anda:

    gcloud auth activate-service-account ci-cd-pipeline@PROJECT_ID.iam.gserviceaccount.com \
        --key-file=gsa-key.json
    
  5. Gunakan gcloud CLI untuk mengambil kredensial cluster:

    gcloud config set project PROJECT_ID
    gcloud container clusters get-credentials CLUSTER_NAME \
        --zone=COMPUTE_ZONE
    

Lingkungan tanpa gcloud

Sebaiknya gunakan gcloud CLI untuk mengambil kredensial cluster karena metode ini tahan terhadap peristiwa cluster seperti rotasi IP atau rotasi kredensial bidang kontrol. Namun, jika tidak dapat menginstal gcloud CLI di lingkungan, Anda masih dapat membuat file kubeconfig statis untuk mengautentikasi ke cluster:

  1. Buat akun layanan IAM untuk aplikasi Anda. Jika Anda sudah memiliki akun layanan IAM, lewati langkah ini.

    Perintah berikut membuat akun layanan IAM bernama ci-cd-pipeline:

    gcloud iam service-accounts create ci-cd-pipeline
    
  2. Beri akun layanan IAM akses ke cluster Anda.

    Perintah berikut memberikan peran IAM roles/container.developer ke akun layanan IAM ci-cd-pipeline@PROJECT_ID.iam.gserviceaccount.com:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:ci-cd-pipeline@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/container.developer
    

    Anda juga dapat membuat peran IAM khusus untuk kontrol yang lebih mendetail atas izin yang Anda berikan.

  3. Buat dan download kunci untuk akun layanan IAM Anda.

    Dalam contoh berikut, file kunci diberi nama gsa-key.json:

    gcloud iam service-accounts keys create gsa-key.json \
        --iam-account=ci-cd-pipeline@PROJECT_ID.iam.gserviceaccount.com
    
  4. Dapatkan nilai endpoint dan clusterCaCertificate untuk cluster Anda

    gcloud container clusters describe CLUSTER_NAME \
        --zone=COMPUTE_ZONE \
         --format="value(endpoint)"
    
    gcloud container clusters describe CLUSTER_NAME \
        --zone=COMPUTE_ZONE \
        --format="value(masterAuth.clusterCaCertificate)"
    
  5. Buat file kubeconfig.yaml yang berisi hal berikut:

    apiVersion: v1
    kind: Config
    clusters:
    - name: CLUSTER_NAME
      cluster:
        server: https://endpoint
        certificate-authority-data: masterAuth.clusterCaCertificate
    users:
    - name: ci-cd-pipeline-gsa
      user:
        exec:
          apiVersion: client.authentication.k8s.io/v1beta1
          args:
          - --use_application_default_credentials
          command: gke-gcloud-auth-plugin
          installHint: Install gke-gcloud-auth-plugin for kubectl by following
            https://cloud.google.com/kubernetes-engine/docs/how-to/cluster-access-for-kubectl#install_plugin
          provideClusterInfo: true
    contexts:
    - context:
        cluster: CLUSTER_NAME
        user: ci-cd-pipeline-gsa
      name: CLUSTER_NAME-ci-cd
    current-context: CLUSTER_NAME-ci-cd
    

    Ganti kode berikut:

    • CLUSTER_NAME: nama cluster Anda.
    • endpoint: nilai yang Anda peroleh untuk endpoint dari langkah sebelumnya.
    • masterAuth.clusterCaCertificate: nilai yang Anda peroleh untuk clusterCaCertificate dari langkah sebelumnya (Anda tidak perlu mendekode sertifikat yang dienkode base64).
  6. Deploy kubeconfig.yaml dan gsa-key.json bersama aplikasi Anda di lingkungan. Saat runtime, di lingkungan yang menjalankan aplikasi Anda, tetapkan variabel lingkungan berikut:

    export KUBECONFIG=path/to/kubeconfig.yaml
    export GOOGLE_APPLICATION_CREDENTIALS=path/to/gsa-key.json
    
  7. Aplikasi Anda kini dapat mengirim permintaan ke Kubernetes API dan akan diautentikasi sebagai akun layanan IAM.

Metode autentikasi lama

Catatan: Sebelum integrasi OAuth dengan GKE, sertifikat X.509 atau sandi statis yang telah disediakan adalah satu-satunya metode autentikasi yang tersedia, tetapi tidak lagi direkomendasikan dan harus dinonaktifkan. Metode ini memberikan permukaan serangan yang lebih luas terhadap penyusupan cluster dan dinonaktifkan secara default di cluster yang menjalankan GKE versi 1.12 dan yang lebih baru. Jika menggunakan metode autentikasi lama, sebaiknya Anda nonaktifkan metode tersebut.

Jika diaktifkan, pengguna dengan izin container.clusters.getCredentials dapat mengambil sertifikat klien dan sandi statis. Semua peran roles/container.admin, roles/owner, dan roles/editor memiliki izin ini, jadi gunakan peran tersebut dengan bijak. Baca selengkapnya tentang peran IAM di GKE.

Menonaktifkan autentikasi dengan sandi statis

Sandi statis adalah kombinasi nama pengguna dan sandi yang divalidasi server API. Di GKE, metode autentikasi ini disebut sebagai autentikasi dasar.

Untuk memperbarui cluster yang sudah ada dan menghapus sandi statis:

gcloud container clusters update CLUSTER_NAME --no-enable-basic-auth

Menonaktifkan autentikasi dengan sertifikat klien

Dengan autentikasi sertifikat, klien memberikan sertifikat yang diverifikasi server API dengan certificate authority yang ditentukan. Di GKE, cluster root Certificate Authority (CA) menandatangani sertifikat klien.

Autentikasi sertifikat klien memiliki implikasi pada otorisasi ke server Kubernetes API. Jika otorisasi Kontrol Akses Berbasis Atribut (ABAC) lama diaktifkan di cluster, secara default, sertifikat klien dapat mengautentikasi dan melakukan tindakan apa pun di server API. Di sisi lain, dengan mengaktifkan Kontrol Akses Berbasis Peran (RBAC), sertifikat klien harus diberi izin khusus ke resource Kubernetes.

Untuk membuat cluster tanpa membuat sertifikat klien, gunakan flag --no-issue-client-certificate:

gcloud container clusters create CLUSTER_NAME \
    --no-issue-client-certificate

Saat ini, tidak memungkinkan untuk menghapus sertifikat klien dari cluster yang sudah ada. Untuk berhenti menggunakan autentikasi sertifikat klien di cluster yang ada, pastikan Anda telah mengaktifkan RBAC di cluster, dan sertifikat klien tidak memiliki izin di cluster tersebut.

Langkah berikutnya