Mendistribusikan Kredensial dengan Aman Menggunakan Secret

Laman ini menjelaskan bagaimana cara menginjeksi data sensitif, seperti kata sandi (password) dan kunci enkripsi, ke dalam Pod.

Sebelum kamu memulai

Kamu harus memiliki klaster Kubernetes, dan perangkat baris perintah kubectl juga harus dikonfigurasikan untuk berkomunikasi dengan klastermu. Jika kamu belum memiliki klaster, kamu dapat membuatnya dengan menggunakan minikube, atau kamu juga dapat menggunakan salah satu dari tempat mencoba Kubernetes berikut ini:

Mengubah data rahasia kamu ke dalam representasi Base64

Misalnya kamu mempunyai dua buah data rahasia: sebuah nama pengguna my-app dan kata sandi 39528$vdg7Jb. Pertama, gunakan alat penyandian Base64 untuk mengubah nama pengguna kamu dan kata sandi ke dalam representasi Base64. Berikut ini contoh menggunakan program Base64 yang umum digunakan:

echo -n 'my-app' | base64
echo -n '39528$vdg7Jb' | base64

Hasil keluaran menampilkan representasi Base64 dari nama pengguna kamu yaitu bXktYXBw, dan representasi Base64 dari kata sandi kamu yaitu Mzk1MjgkdmRnN0pi.

Perhatian: Gunakan alat yang telah dipercayai oleh OS kamu untuk menghindari risiko dari penggunaan alat eksternal.

Membuat Secret

Berikut ini adalah berkas konfigurasi yang dapat kamu gunakan untuk membuat Secret yang akan menampung nama pengguna dan kata sandi kamu:

apiVersion: v1
kind: Secret
metadata:
  name: test-secret
data:
  username: bXktYXBw
  password: Mzk1MjgkdmRnN0pi
  1. Membuat Secret

    kubectl apply -f https://k8s.io/examples/pods/inject/secret.yaml
    
  2. Melihat informasi dari Secret:

    kubectl get secret test-secret
    

    Hasil keluaran:

    NAME          TYPE      DATA      AGE
    test-secret   Opaque    2         1m
    
  3. Melihat informasi detil dari Secret:

    kubectl describe secret test-secret
    

    Hasil keluaran:

    Name:       test-secret
    Namespace:  default
    Labels:     <none>
    Annotations:    <none>
    
    Type:   Opaque
    
    Data
    ====
    password:   13 bytes
    username:   7 bytes
    

Membuat Secret langsung dengan kubectl

Jika kamu ingin melompati langkah penyandian dengan Base64, kamu dapat langsung membuat Secret yang sama dengan menggunakan perintah kubectl create secret. Contohnya:

kubectl create secret generic test-secret --from-literal='username=my-app' --from-literal='password=39528$vdg7Jb'

Tentu saja ini lebih mudah. Pendekatan yang mendetil setiap langkah di atas bertujuan untuk mendemonstrasikan apa yang sebenarnya terjadi pada setiap langkah.

Membuat Pod yang memiliki akses ke data Secret melalui Volume

Berikut ini adalah berkas konfigurasi yang dapat kamu gunakan untuk membuat Pod:

apiVersion: v1
kind: Pod
metadata:
  name: secret-test-pod
spec:
  containers:
    - name: test-container
      image: nginx
      volumeMounts:
        # nama harus sesuai dengan nama Volume di bawah ini
        - name: secret-volume
          mountPath: /etc/secret-volume
  # Data Secret diekspos ke Container di dalam Pod melalui Volume
  volumes:
    - name: secret-volume
      secret:
        secretName: test-secret
  1. Membuat Pod:

    kubectl apply -f https://k8s.io/examples/pods/inject/secret-pod.yaml
    
  2. Verifikasikan apakah Pod kamu sudah berjalan:

    kubectl get pod secret-test-pod
    

    Hasil keluaran:

    NAME              READY     STATUS    RESTARTS   AGE
    secret-test-pod   1/1       Running   0          42m
    
  3. Gunakan shell untuk masuk ke dalam Container yang berjalan di dalam Pod kamu:

    kubectl exec -i -t secret-test-pod -- /bin/bash
    
  4. Data Secret terekspos ke Container melalui Volume yang dipasang (mount) pada /etc/secret-volume.

    Di dalam shell kamu, tampilkan berkas yang ada di dalam direktori /etc/secret-volume:

    # Jalankan ini di dalam shell dalam Container
    ls /etc/secret-volume
    

    Hasil keluaran menampilkan dua buah berkas, masing-masing untuk setiap data Secret:

    password username
    
  5. Di dalam shell kamu, tampilkan konten dari berkas username dan password:

    # Jalankan ini di dalam shell dalam Container
    echo "$( cat /etc/secret-volume/username )"
    echo "$( cat /etc/secret-volume/password )"
    

    Hasil keluarannya adalah nama pengguna dan kata sandi kamu:

    my-app
    39528$vdg7Jb
    

Mendefinisikan variabel lingkungan Container menggunakan data Secret

Mendefinisikan variabel lingkungan Container menggunakan data dari Secret tunggal

  • Definisikan variabel lingkungan sebagai pasangan key-value pada Secret:

    kubectl create secret generic backend-user --from-literal=backend-username='backend-admin'
    
  • Tentukan nilai backend-username yang didefinisikan di Secret ke variabel lingkungan SECRET_USERNAME di dalam spesifikasi Pod.

    apiVersion: v1
    kind: Pod
    metadata:
      name: env-single-secret
    spec:
      containers:
      - name: envars-test-container
        image: nginx
        env:
        - name: SECRET_USERNAME
          valueFrom:
            secretKeyRef:
              name: backend-user
              key: backend-username
    
  • Membuat Pod:

    kubectl create -f https://k8s.io/examples/pods/inject/pod-single-secret-env-variable.yaml
    
  • Di dalam shell kamu, tampilkan konten dari variabel lingkungan SECRET_USERNAME dari Container

    kubectl exec -i -t env-single-secret -- /bin/sh -c 'echo $SECRET_USERNAME'
    

    Hasil keluarannya

    backend-admin
    

Mendefinisikan variabel lingkungan Container dengan data dari multipel Secret

  • Seperti contoh sebelumnya, buat Secret terlebih dahulu.

    kubectl create secret generic backend-user --from-literal=backend-username='backend-admin'
    kubectl create secret generic db-user --from-literal=db-username='db-admin'
    
  • Definisikan variabel lingkungan di dalam spesifikasi Pod.

    apiVersion: v1
    kind: Pod
    metadata:
      name: envvars-multiple-secrets
    spec:
      containers:
      - name: envars-test-container
        image: nginx
        env:
        - name: BACKEND_USERNAME
          valueFrom:
            secretKeyRef:
              name: backend-user
              key: backend-username
        - name: DB_USERNAME
          valueFrom:
            secretKeyRef:
              name: db-user
              key: db-username
    
  • Membuat Pod:

    kubectl create -f https://k8s.io/examples/pods/inject/pod-multiple-secret-env-variable.yaml
    
  • Di dalam shell kamu, tampilkan konten dari variabel lingkungan Container

    kubectl exec -i -t envvars-multiple-secrets -- /bin/sh -c 'env | grep _USERNAME'
    

    Hasil keluarannya

    DB_USERNAME=db-admin
    BACKEND_USERNAME=backend-admin
    

Mengonfigurasi semua pasangan key-value di dalam Secret sebagai variabel lingkungan Container

Catatan: Fitur ini tersedia mulai dari Kubernetes v1.6 dan yang lebih baru.
  • Membuat Secret yang berisi banyak pasangan key-value

    kubectl create secret generic test-secret --from-literal=username='my-app' --from-literal=password='39528$vdg7Jb'
    
  • Gunakan envFrom untuk mendefinisikan semua data Secret sebagai variabel lingkungan Container. Key dari Secret akan mennjadi nama variabel lingkungan di dalam Pod.

    apiVersion: v1
    kind: Pod
    metadata:
      name: envfrom-secret
    spec:
      containers:
      - name: envars-test-container
        image: nginx
        envFrom:
        - secretRef:
            name: test-secret
    
  • Membuat Pod:

    kubectl create -f https://k8s.io/examples/pods/inject/pod-secret-envFrom.yaml
    
  • Di dalam shell kamu, tampilkan variabel lingkungan Container username dan password

    kubectl exec -i -t envfrom-secret -- /bin/sh -c 'echo "username: $username\npassword: $password\n"'
    

    Hasil keluarannya

    username: my-app
    password: 39528$vdg7Jb
    

Referensi

Selanjutnya

  • Pelajari lebih lanjut Secret.
  • Pelajari lebih lanjut Volume.
Last modified August 04, 2020 at 5:50 AM PST : Fix ID localization distribute-credentias-secure (589279aa1)