Tutorial ini menunjukkan cara menyimpan data sensitif yang digunakan oleh cluster Google Kubernetes Engine (GKE) di Secret Manager. Anda akan mempelajari cara mengakses data dengan lebih aman dari Pod menggunakan Workload Identity Federation for GKE danGoogle Cloud library klien.
Menyimpan data sensitif di luar penyimpanan cluster akan mengurangi risiko akses tidak sah ke data jika terjadi serangan. Dengan menggunakan Workload Identity Federation untuk GKE guna mengakses data, Anda dapat menghindari risiko yang terkait dengan pengelolaan kunci akun layanan yang aktif untuk jangka waktu lama, dan memungkinkan Anda mengontrol akses ke secret Anda menggunakan Identity and Access Management (IAM), bukan aturan RBAC dalam cluster. Anda dapat menggunakan penyedia penyimpanan secret eksternal apa pun, seperti Secret Manager atau HashiCorp Vault.
Halaman ini ditujukan bagi spesialis Keamanan yang ingin memindahkan data sensitif dari penyimpanan dalam cluster. Untuk mempelajari lebih lanjut peran umum dan contoh tugas yang kami referensikan dalam konten Google Cloud , lihat Peran dan tugas pengguna GKE umum.
Tutorial ini menggunakan cluster GKE Autopilot. Untuk melakukan langkah-langkah menggunakan GKE Standard, Anda harus mengaktifkan Workload Identity Federation untuk GKE secara manual.
Anda dapat menggunakan Workload Identity Federation untuk GKE guna mengakses API Google Cloud apa pun dari workload GKE tanpa harus menggunakan pendekatan yang kurang aman seperti file kunci akun layanan statis. Tutorial ini menggunakan Secret Manager sebagai contoh, tetapi Anda dapat menggunakan langkah-langkah yang sama untuk mengakses API Google Cloud lainnya. Untuk mempelajari lebih lanjut, lihat Workload Identity Federation for GKE.
Tujuan
- Buat secret di Google Cloud Secret Manager.
- Membuat cluster GKE Autopilot, namespace Kubernetes, dan akun layanan Kubernetes.
- Buat kebijakan izin IAM untuk memberikan akses ke akun layanan Kubernetes Anda pada secret.
- Menggunakan aplikasi pengujian untuk memverifikasi akses akun layanan.
- Menjalankan aplikasi contoh yang mengakses secret menggunakan Secret Manager API.
Biaya
Di dokumen ini, Anda akan menggunakan komponen Google Cloudyang dapat ditagih berikut:
Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga.
Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, baca bagian Pembersihan.
Sebelum memulai
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
Install the Google Cloud CLI.
-
Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.
-
Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:
gcloud init -
Create or select a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_IDwith a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_IDwith your Google Cloud project name.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Kubernetes Engine and Secret Manager APIs:
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.gcloud services enable container.googleapis.com
secretmanager.googleapis.com -
Install the Google Cloud CLI.
-
Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.
-
Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:
gcloud init -
Create or select a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_IDwith a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_IDwith your Google Cloud project name.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Kubernetes Engine and Secret Manager APIs:
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.gcloud services enable container.googleapis.com
secretmanager.googleapis.com -
Grant roles to your user account. Run the following command once for each of the following IAM roles:
roles/secretmanager.admin, roles/container.clusterAdmingcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
Replace the following:
PROJECT_ID: Your project ID.USER_IDENTIFIER: The identifier for your user account. For example,myemail@example.com.ROLE: The IAM role that you grant to your user account.
Contoh berikut menampilkan data yang akan Anda gunakan untuk membuat secret:
Buat secret untuk menyimpan data sampel:
gcloud secrets create bq-readonly-key \ --data-file=manifests/bq-readonly-key \ --ttl=3600sPerintah ini akan melakukan hal berikut:
- Membuat secret Secret Manager baru dengan kunci contoh di region
us-central1Google Cloud . - Menetapkan masa berlaku secret agar berakhir satu jam setelah Anda menjalankan perintah.
- Membuat secret Secret Manager baru dengan kunci contoh di region
Buat cluster GKE Autopilot:
gcloud container clusters create-auto secret-cluster \ --location=us-central1Mungkin perlu waktu sekitar lima menit untuk men-deploy cluster. Cluster Autopilot selalu mengaktifkan Workload Identity Federation for GKE. Jika ingin menggunakan cluster GKE Standard, Anda harus mengaktifkan Workload Identity Federation for GKE secara manual sebelum melanjutkan.
Buat namespace
readonly-nsdan namespaceadmin-ns:kubectl create namespace readonly-ns kubectl create namespace admin-nsBuat akun layanan Kubernetes
readonly-sadan akun layanan Kubernetesadmin-sa:kubectl create serviceaccount readonly-sa --namespace=readonly-ns kubectl create serviceaccount admin-sa --namespace=admin-nsBeri akun layanan
readonly-saakses hanya baca ke secret:gcloud secrets add-iam-policy-binding bq-readonly-key \ --member=principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/readonly-ns/sa/readonly-sa \ --role='roles/secretmanager.secretAccessor' \ --condition=NoneGanti kode berikut:
PROJECT_NUMBER: nomor project Google Cloud numerik Anda.PROJECT_ID: Google Cloud Project ID Anda.
Beri akun layanan
admin-saakses baca-tulis ke secret:gcloud secrets add-iam-policy-binding bq-readonly-key \ --member=principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/admin-ns/sa/admin-sa \ --role='roles/secretmanager.secretAccessor' \ --condition=None gcloud secrets add-iam-policy-binding bq-readonly-key \ --member=principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/admin-ns/sa/admin-sa \ --role='roles/secretmanager.secretVersionAdder' \ --condition=NoneTinjau manifes Pod hanya baca:
Pod ini menggunakan akun layanan
readonly-sadi namespacereadonly-ns.Tinjau manifes Pod baca-tulis:
Pod ini menggunakan akun layanan
admin-sadi namespaceadmin-ns.Deploy Pod pengujian:
kubectl apply -f manifests/admin-pod.yaml kubectl apply -f manifests/readonly-pod.yamlMungkin perlu waktu beberapa menit untuk Pod mulai berjalan. Untuk memantau progres, jalankan perintah berikut:
watch kubectl get pods -n readonly-nsSaat status Pod berubah menjadi
RUNNING, tekanCtrl+Cuntuk kembali ke command line.Buka shell di Pod
readonly-test:kubectl exec -it readonly-test --namespace=readonly-ns -- /bin/bashCoba baca secret-nya:
gcloud secrets versions access 1 --secret=bq-readonly-keyOutputnya adalah
key=my-api-key.Coba tulis data baru ke secret:
printf "my-second-api-key" | gcloud secrets versions add bq-readonly-key --data-file=-Outputnya mirip dengan yang berikut ini:
ERROR: (gcloud.secrets.versions.add) PERMISSION_DENIED: Permission 'secretmanager.versions.add' denied for resource 'projects/PROJECT_ID/secrets/bq-readonly-key' (or it may not exist).Pod yang menggunakan akun layanan hanya baca hanya dapat membaca secret, dan tidak dapat menulis data baru.
Keluar dari Pod:
exitBuka shell di Pod
admin-test:kubectl exec -it admin-test --namespace=admin-ns -- /bin/bashCoba baca secret-nya:
gcloud secrets versions access 1 --secret=bq-readonly-keyOutputnya adalah
key=my-api-key.Coba tulis data baru ke secret:
printf "my-second-api-key" | gcloud secrets versions add bq-readonly-key --data-file=-Outputnya mirip dengan yang berikut ini:
Created version [2] of the secret [bq-readonly-key].Baca versi secret baru:
gcloud secrets versions access 2 --secret=bq-readonly-keyOutputnya adalah
my-second-api-key.Keluar dari Pod:
exitMen-deploy aplikasi contoh yang membaca secret Anda di Secret Manager menggunakan library klien.
Memastikan aplikasi dapat mengakses secret Anda.
Meninjau kode sumber aplikasi contoh:
Aplikasi ini memanggil Secret Manager API untuk mencoba dan membaca secret tersebut.
Tinjau manifes Pod aplikasi contoh:
Manifes ini melakukan hal berikut:
- Membuat Pod di namespace
readonly-nsyang menggunakan akun layananreadonly-sa. - Mengambil aplikasi contoh dari registry image Google. Aplikasi ini memanggil Secret Manager API menggunakan library klienGoogle Cloud . Anda dapat melihat kode aplikasi di
/main.gopada repositori. - Menetapkan variabel lingkungan untuk digunakan oleh aplikasi contoh.
- Membuat Pod di namespace
Ganti variabel lingkungan dalam aplikasi contoh:
sed -i "s/YOUR_PROJECT_ID/PROJECT_ID/g" "manifests/secret-app.yaml"Deploy aplikasi contoh:
kubectl apply -f manifests/secret-app.yamlMungkin perlu waktu beberapa menit untuk Pod mulai bekerja. Jika Pod memerlukan node baru di cluster, Anda mungkin melihat peristiwa jenis
CrashLoopBackOffsaat GKE menyediakan node. Error akan berhenti saat node berhasil disediakan.Verifikasi akses secret:
kubectl logs readonly-secret-test -n readonly-nsOutputnya adalah
my-second-api-key. Jika output kosong, Pod mungkin belum berjalan. Tunggu beberapa menit dan coba lagi.- Volume yang terpasang rentan terhadap serangan traversal direktori.
- Variabel lingkungan dapat disusupi karena kesalahan konfigurasi seperti membuka endpoint debug.
Hapus cluster:
gcloud container clusters delete secret-cluster \ --location=us-central1Opsional: Hapus secret di Secret Manager:
gcloud secrets delete bq-readonly-keyJika Anda tidak melakukan langkah ini, secret akan otomatis berakhir karena Anda menetapkan flag
--ttlselama pembuatan.- Pelajari lebih lanjut cara kerja Workload Identity Federation for GKE.
- Pelajari arsitektur referensi, diagram, dan praktik terbaik tentang Google Cloud. Lihat Cloud Architecture Center kami.
Menyiapkan lingkungan
Clone repositori GitHub yang berisi file contoh untuk tutorial ini:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
cd ~/kubernetes-engine-samples/security/wi-secrets
Membuat secret di Secret Manager
Membuat resource cluster dan Kubernetes
Buat cluster GKE, namespace Kubernetes, dan akun layanan Kubernetes. Anda membuat dua namespace, satu untuk akses hanya baca dan satu untuk akses baca-tulis ke secret. Anda juga membuat akun layanan Kubernetes di setiap namespace untuk digunakan dengan Workload Identity Federation for GKE.
Membuat kebijakan izin IAM
Memverifikasi akses secret
Deploy Pod pengujian di setiap namespace untuk memverifikasi akses hanya baca dan baca-tulis.
Menguji akses hanya baca
Menguji akses baca-tulis
Pod hanya mendapatkan tingkat akses yang Anda berikan ke akun layanan Kubernetes yang digunakan dalam manifes Pod. Setiap Pod yang menggunakan akun Kubernetes admin-sa di namespace admin-ns dapat menulis versi baru secret, tetapi semua Pod dalam namespace readonly-ns yang menggunakan akun layanan Kubernetes readonly-sa hanya dapat membaca secret.
Mengakses secret dari kode Anda
Di bagian ini, Anda akan melakukan hal berikut:
Anda harus mengakses secret Secret Manager dari kode aplikasi jika memungkinkan, menggunakan Secret Manager API.
Pendekatan alternatif
Jika Anda perlu memasang data sensitif ke Pod, gunakan add-on Secret Manager untuk GKE. Add-on ini men-deploy dan mengelola penyedia Secret Manager untuk driver CSI Kubernetes Secret Store di cluster GKE Anda. Google Cloud Untuk mendapatkan petunjuk, lihat Menggunakan add-on Secret Manager dengan GKE.
Menyediakan secret sebagai volume yang terpasang memiliki risiko berikut:
Jika memungkinkan, sebaiknya Anda mengakses secret secara terprogram melalui Secret Manager API. Untuk mendapatkan petunjuk, gunakan aplikasi contoh dalam tutorial ini atau lihat library klien Secret Manager.
Pembersihan
Agar tidak perlu membayar biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.
Menghapus resource satu per satu
Menghapus project
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID