Pendahuluan
Sebagian besar aplikasi yang di-deploy melalui Kubernetes memerlukan akses ke database, layanan, dan sumber daya lain yang terletak di luar. Cara termudah untuk mengelola informasi login yang diperlukan untuk mengakses sumber daya tersebut adalah menggunakan rahasia Kubernetes. Rahasia membantu mengatur dan mendistribusikan informasi sensitif di seluruh cluster.
Dalam tutorial ini, Anda akan mempelajari apa itu rahasia Kubernetes dan cara membuat serta menggunakannya di cluster Anda.
Prasyarat
- Cluster Kubernetes (untuk tujuan pengujian, Anda dapat membuatnya dengan minikube)
- Alat baris perintah Kubernetes kubectl
Apa Rahasia Kubernetes?
Rahasia Kubernetes adalah objek yang menyimpan bagian data sensitif seperti nama pengguna, kata sandi, token, dan kunci. Rahasia dibuat oleh sistem selama penginstalan aplikasi atau oleh pengguna kapan pun mereka perlu menyimpan informasi sensitif dan membuatnya tersedia untuk pod.
Jika kata sandi, token, atau kunci hanyalah bagian dari definisi pod atau gambar kontainer, kata sandi tersebut dapat terekspos secara tidak sengaja selama operasi Kubernetes. Oleh karena itu, fungsi rahasia yang paling penting adalah untuk mencegah pemaparan informasi yang tersimpan di dalamnya secara tidak sengaja sekaligus membuatnya tersedia di mana pun pengguna membutuhkannya.
Jenis Rahasia Kubernetes
Kubernetes menampilkan dua kategori rahasia:
- Akun layanan sistem secara otomatis membuat rahasia bawaan dan kaitkan dengan container bersama dengan kredensial API.
- Anda juga dapat membuat rahasia khusus untuk kredensial, Anda perlu menyediakannya untuk pod.
Rahasia bawaan datang dalam beberapa jenis, sesuai dengan skenario penggunaan populer:
Jenis Bawaan | Deskripsi |
---|---|
Opaque | Ini adalah jenis rahasia default. Rahasia yang file konfigurasinya tidak berisi pernyataan tipe semuanya dianggap bertipe ini. Rahasia buram dirancang untuk menyimpan data pengguna yang berubah-ubah. |
kubernetes.io/service-account-token | Rahasia token akun layanan menyimpan token yang mengidentifikasi akun layanan. Setelah membuat pod, Kubernetes secara otomatis membuat rahasia ini dan mengaitkannya dengan pod, memungkinkan akses aman ke API. Perilaku ini dapat dinonaktifkan. |
kubernetes.io/dockercfg | Mengakses registri Docker untuk gambar memerlukan kredensial Docker yang valid. Jenis rahasia ini digunakan untuk menyimpan serial ~/.dockercfg format lama untuk konfigurasi baris perintah Docker. Ini berisi .dockercfg yang disandikan base64 kunci. |
kubernetes.io/dockerconfigjson | Jenis rahasia ini menampilkan .dockerconfigjson key, yang merupakan versi encode base64 dari ~/.docker/config.json file, versi baru dari .dockercfg . yang sudah tidak digunakan lagi . |
kubernetes.io/basic-auth | Rahasia untuk menyimpan data otentikasi dasar. Itu harus berisi dua kunci – username dan password . |
kubernetes.io/ssh-auth | Untuk menyimpan data yang diperlukan untuk membuat koneksi SSH, gunakan ssh-auth Tipe. Bidang data jenis ini harus berisi ssh-privatekey pasangan nilai kunci. |
kubernetes.io/tls | Jenis ini digunakan untuk menyimpan sertifikat dan kunci TLS. Skenario penggunaan yang paling umum adalah penghentian sumber daya Ingress, tetapi tls type terkadang juga digunakan dengan resource lain. |
bootstrap.kubernetes.io/token | Token yang digunakan selama proses bootstrap node disimpan menggunakan tipe token secret. Tipe ini biasanya dibuat di kube-system ruang nama. |
Untuk menentukan jenis rahasia yang disesuaikan, tetapkan string yang tidak kosong sebagai nilai dalam type
bidang file rahasia. Membiarkan bidang kosong memberi tahu Kubernetes untuk mengasumsikan Opaque
Tipe. Jenis yang disesuaikan membebaskan rahasia kendala yang ditimbulkan oleh jenis bawaan.
Menggunakan Rahasia Kubernetes
Saat Anda membuat rahasia, itu perlu direferensikan oleh pod yang akan menggunakannya. Untuk membuat rahasia tersedia untuk pod:
1. Pasang rahasia sebagai file dalam volume yang tersedia untuk sejumlah kontainer dalam sebuah pod.
2. Impor rahasia sebagai variabel lingkungan ke wadah.
3. Gunakan kubelet, dan imagePullSecrets
lapangan.
Bagian berikut menjelaskan cara membuat rahasia Kubernetes, serta cara mendekode dan mengaksesnya.
Buat Rahasia Kubernetes
Untuk membuat rahasia Kubernetes, terapkan salah satu metode berikut:
- Gunakan
kubectl
untuk pendekatan berbasis baris perintah. - Buat file konfigurasi untuk rahasia tersebut.
- Gunakan generator, seperti Kustomize untuk menghasilkan rahasia.
Membuat Rahasia Menggunakan kubectl
1. Untuk mulai membuat rahasia dengan kubectl
, pertama buat file untuk menyimpan informasi sensitif:
echo -n '[username]' > [file1]
echo -n '[password]' > [file2]
-n
opsi memberitahu echo
untuk tidak menambahkan baris baru di akhir string. Baris baru juga diperlakukan sebagai karakter, sehingga akan dikodekan bersama dengan karakter lainnya, menghasilkan nilai pengkodean yang berbeda.
2. Sekarang, gunakan kubectl
untuk membuat rahasia menggunakan file dari langkah sebelumnya. Gunakan subperintah umum untuk membuat Opaque
rahasia. Juga, tambahkan --from-file
opsi untuk setiap file yang ingin Anda sertakan:
kubectl create secret generic [secret-name] \
--from-file=[file1] \
--from-file=[file2]
Output mengkonfirmasi pembuatan rahasia:
3. Untuk menyediakan kunci untuk nilai yang disimpan dalam rahasia, gunakan sintaks berikut:
kubectl create secret generic [secret-name] \
--from-file=[key1]=[file1] \
--from-file=[key2]=[file2]
4. Periksa apakah rahasia telah berhasil dibuat dengan mengetik:
kubectl get secrets
Perintah menunjukkan daftar rahasia yang tersedia – nama, jenis, jumlah nilai data yang dikandungnya, dan usianya:
Buat Rahasia di File Konfigurasi
1. Untuk membuat rahasia dengan menentukan informasi yang diperlukan dalam file konfigurasi, mulailah dengan menyandikan nilai yang ingin Anda simpan:
echo -n '[value1]' | base64
echo -n '[value2]' | base64
2. Sekarang buat file yaml menggunakan editor teks. Filenya akan terlihat seperti ini:
apiVersion: v1
kind: Secret
metadata:
name: newsecret
type: Opaque
data:
username: dXNlcg==
password: NTRmNDFkMTJlOGZh
3. Simpan file dan gunakan kubectl apply
perintah untuk membuat rahasia:
kubectl apply -f [file]
Buat Rahasia Kubernetes dengan Generator
Generator seperti Kustomize membantu menghasilkan rahasia dengan cepat.
1. Untuk membuat rahasia dengan Kustomize, buat file bernama kustomization.yaml
dan format sebagai berikut:
secretGenerator:
- name: db-credentials
files:
- username.txt
- password.txt
Contoh di atas menyatakan db-credentials
sebagai nama rahasia dan menggunakan dua file yang dibuat sebelumnya, username.txt
, dan password.txt
, sebagai nilai data.
2. Sebagai alternatif, untuk memberikan versi literal nilai data yang tidak terenkripsi, sertakan literals
bagian dengan pasangan nilai kunci yang ingin Anda simpan:
secretGenerator:
- name: db-credentials
literals:
- username=user
- password=54f41d12e8fa
3. Simpan file dan gunakan perintah berikut di folder tempat kustomization.yaml
terletak:
kubectl apply -k .
Output mengkonfirmasi pembuatan rahasia:
Gunakan kubectl mendeskripsikan untuk Melihat Rahasia yang Dibuat
kubectl describe
perintah menunjukkan informasi dasar tentang objek Kubernetes. Gunakan untuk melihat deskripsi rahasia.
kubectl describe secrets/[secret]
Contoh pertama menunjukkan rahasia yang dibuat dengan menyediakan file sebagai nilai data:
Contoh kedua menjelaskan rahasia yang dibuat menggunakan literal string. Perhatikan perubahan pada Data
bagian, yang sekarang menampilkan nama kunci alih-alih nama file:
Menguraikan Kode Rahasia
1. Untuk memecahkan kode nilai dalam sebuah rahasia, akseslah dengan mengetikkan perintah berikut:
kubectl get secret [secret] -o jsonpath='{.data}'
Keluaran menunjukkan pasangan nilai kunci yang disandikan yang disimpan di bagian data:
2. Gunakan perintah echo untuk mengetik string yang disandikan dan menyalurkan output ke base64
perintah:
echo '[encoded-value]' | base64 --decode
String yang didekodekan muncul sebagai output:
Rahasia Akses Dimuat dalam Volume
1. Untuk mengakses rahasia yang dipasang ke pod dalam volume terpisah, ubah definisi pod untuk menyertakan volume baru. Pilih nama volume yang Anda inginkan, tetapi pastikan itu sama dengan nama objek rahasia.
2. Pastikan untuk menentukan readOnly
sebagai benar. Misalnya, definisi pod mungkin terlihat seperti ini:
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: test-pod
image: redis
volumeMounts:
- name: newsecret
mountPath: “/etc/newsecret”
readOnly: true
volumes:
- name: newsecret
secret:
secretName: newsecret
2. Buka instance terminal lain dan gunakan kubectl exec
perintah untuk mengakses bash shell pod:
kubectl exec -it [pod] -- /bin/bash
3. cd
ke /etc/newsecret
, dan temukan file yang terdapat dalam rahasia:
cd /etc/newsecret
Rahasia Proyek ke dalam Wadah Menggunakan Variabel Lingkungan
1. Cara lain untuk mengakses rahasia dalam pod Kubernetes adalah dengan mengimpornya sebagai variabel lingkungan dengan memodifikasi definisi pod untuk menyertakan referensi ke dalamnya. Misalnya:
apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
containers:
- name: secret-env-pod
image: redis
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: newsecret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: newsecret
key: password
restartPolicy: Never
2. Gunakan kubectl exec
lagi untuk melakukan bash ke dalam pod.
3. Uji variabel lingkungan menggunakan echo
perintah:
echo $[VARIABLE]
Output perintah menunjukkan nilai yang dipetakan ke variabel:
Gunakan Rahasia untuk Menarik Gambar Docker dari Registri Docker Pribadi
1. Untuk menggunakan registri Docker pribadi, pertama-tama, Anda harus masuk ke Docker:
docker login
2. Saat diminta, berikan kredensial login Anda:
3. Jika login berhasil, Docker memperbarui config.json
file dengan data Anda. Gunakan perintah cat untuk melihat file:
cat ~/.docker/config.json
auths
bagian berisi auth
key, yang merupakan versi enkode dari kredensial Docker.
4. Gunakan kubectl
untuk membuat rahasia, memberikan lokasi config.json
file dan jenis rahasianya:
kubectl create secret generic [secret] \
--from-file=.dockerconfigjson=./.docker/config.json \
--type=kubernetes.io/dockerconfigjson
Atau, lakukan semua langkah di atas, termasuk masuk ke Docker, di baris yang sama:
kubectl create secret docker-registry [secret] --docker-server:[address] --docker-username=[username] --docker-password=[password] --docker-email=[email]
5. Untuk membuat pod yang memiliki akses ke rahasia ini, buat yaml
file yang mendefinisikannya. Filenya akan terlihat seperti ini:
apiVersion: v1
kind: Pod
metadata:
name: private-reg
spec:
containers:
- name: private-reg-container
image:
imagePullSecrets:
- name: regcred
6. Selesaikan pembuatan pod dengan mengaktifkannya dengan kubectl apply
:
kubectl apply -f [file]
Pertimbangan Rahasia Kubernetes
Rahasia Kubernetes adalah cara aman untuk menyimpan informasi sensitif. Namun, sebelum Anda memutuskan metode terbaik untuk skenario penggunaan Anda, Anda harus mempertimbangkan poin-poin berikut:
- Nama pengguna dan sandi di Rahasia dikodekan dengan basis-64. Teknik pengkodean teks ini mengaburkan data dan mencegah paparan yang tidak disengaja, tetapi tidak aman dari serangan cyber berbahaya.
- Rahasia hanya tersedia di cluster tempat mereka berada.
- Rahasia biasanya bergantung pada kunci utama yang digunakan untuk membuka semuanya. Meskipun ada metode untuk mengamankan kunci master, menggunakannya hanya akan membuat skenario kunci master lainnya.
Untuk mengurangi masalah ini, terapkan beberapa solusi di bawah ini:
- Mengintegrasikan alat manajemen rahasia yang menggunakan akun Layanan Kubernetes untuk mengautentikasi pengguna yang membutuhkan akses ke brankas rahasia.
- Mengintegrasikan alat IAM (Identity and Access Management) untuk memungkinkan sistem menggunakan token dari Layanan Token Aman.
- Mengintegrasikan pengelola rahasia pihak ketiga ke dalam pod.