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:
Login ke gcloud CLI menggunakan kredensial Anda. Tindakan ini membuka browser web untuk menyelesaikan proses autentikasi ke Google Cloud:
gcloud auth login
Ambil kredensial Kubernetes untuk cluster khusus:
gcloud container clusters get-credentials CLUSTER_NAME \ --zone=COMPUTE_ZONE
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.
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.
Gunakan RBAC Kubernetes untuk memberikan izin yang diperlukan aplikasi Anda kepada akun layanan Kubernetes.
Contoh berikut memberikan izin
view
ke resource di namespaceprod
ke akun layanan bernamacicd
di namespacecicd-ns
:kubectl create rolebinding cicd-secret-viewer \ --namespace=prod \ --clusterrole=view \ --serviceaccount=cicd-ns:cicd
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.
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.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
.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.
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
Beri akun layanan IAM akses ke cluster Anda.
Perintah berikut memberikan peran IAM
roles/container.developer
ke akun layanan IAMci-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
.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
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
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:
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
Beri akun layanan IAM akses ke cluster Anda.
Perintah berikut memberikan peran IAM
roles/container.developer
ke akun layanan IAMci-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.
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
Dapatkan nilai
endpoint
danclusterCaCertificate
untuk cluster Andagcloud container clusters describe CLUSTER_NAME \ --zone=COMPUTE_ZONE \ --format="value(endpoint)" gcloud container clusters describe CLUSTER_NAME \ --zone=COMPUTE_ZONE \ --format="value(masterAuth.clusterCaCertificate)"
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 untukendpoint
dari langkah sebelumnya.masterAuth.clusterCaCertificate
: nilai yang Anda peroleh untukclusterCaCertificate
dari langkah sebelumnya (Anda tidak perlu mendekode sertifikat yang dienkode base64).
Deploy
kubeconfig.yaml
dangsa-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
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
- Pelajari Autentikasi Google Cloud.
- Pelajari Kontrol Akses di GKE.
- Pelajari akun layanan Google.
- Pelajari Workload Identity Federation for GKE.
- Pelajari cara Memperkuat keamanan cluster