Skip to content

Szyfrowanie Secret w Kubernetes

Aby zaszyfrować Secrety należy zastosować szyfrowanie Encrypt at Rest. Polega to na tym, że uruchamiamy szyfrowanie w kube-apiserver a dane są szyfrowane na poziomie klastra etcd.

Aby działało szyfrowanie Encrypt at Rest konieczne jest uruchomienie funkcjonalności w Kube Api Serverze.

Uruchamianie Encrypt at Rest w kube-apiserver

1. Sprawdzanie, czy funkcjonalność jest uruchomiona

Żeby sprawdzić, czy na obecnym klastrze działa funkcjonalność należy sprawdzić, czy opcja --encryption-provider-config jest uruchomiona na kube-apiserver procesie lub podzie.

Robimy to sprawdzeniem z poziomu control-plane:

ps -aux | grep kube-apiserver | grep encryption

Możemy też sprawdzić w definicji Poda kube-apiserver, sprawdzamy plik /etc/kubernetes/manifests/kube-apiserver.yaml.

2. Uruchamianie funkcjonalności Encrypt at Rest

2.1. Tworzenie klucza do szyfrowania (encryption key)

Wygenerowany zostanie 32 bajtowy klucz z random znakami, a następnie zakodowany w Base64:

head -c 32 /dev/urandom | base64

2.2. Stworzenie konfiguracji szyfrowania

Będzie to konfiguracja potrzebna później przy uruchamianiu API Servera. Musi być ona w formacie .yaml. Dodajemy tutaj wygenerowany klucz w Base64, w sekcji resources.providers....secret. Zaszyfrowane zostaną Secrety oraz Configmapy.

---
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
  - resources:
      - secrets
      - configmaps
    providers:
      - aescbc:
          keys:
            - name: key1
              secret: <BASE 64 ENCODED SECRET>
      - identity: {} # this fallback allows reading unencrypted secrets;
                     # for example, during initial migration

Wrzucamy ją do katalogu /etc/kubernetes/enc z nazwą enc.yaml.

2.3. Dodajemy do konfiguracji API Servera sekcję szyfrowania

Konfiguracji dokonujemy w /etc/kubernetes/manifests/kube-apiserver.yaml.

Dodajemy linię:

- --encryption-provider-config=/etc/kubernetes/enc/enc.yaml  # add this line

do sekcji spec.containers.command przy kontenerze kube-apiserver.

Dodajemy volume mount

Robimy to w sekcji spec.containers.volumeMounts.

    - name: enc                           # add this line
      mountPath: /etc/kubernetes/enc      # add this line
      readOnly: true                      # add this line

Dodajemy wolumin

Robimy to w sekcji spec.containers.volumes

  - name: enc                             # add this line
    hostPath:                             # add this line
      path: /etc/kubernetes/enc           # add this line
      type: DirectoryOrCreate             # add this line

Oznacza to, że /etc/kubernetes/enc z Hosta będzie montowane w Podzie w /etc/kubernetes/enc. Wiązanie następuje po nazwie woluminu.

2.4. Sprawdzamy czy konfiguracja została zastosowana

Sprawdzamy Pody działające i ich status:

crictl pods

Weryfikujemy proces kube-apiserver

ps -aux | grep kube-apiserver | grep encryption

2.5. Utworzenie Secret zaszyfrowanego

kubectl create secret generic my-secret2 --from-literal=key2=topsecretencrypted

2.6. Sprawdzenie statusu zaszyfrowania

ETCDCTL_API=3 etcdctl \
   --cacert=/etc/kubernetes/pki/etcd/ca.crt   \
   --cert=/etc/kubernetes/pki/etcd/server.crt \
   --key=/etc/kubernetes/pki/etcd/server.key  \
   get /registry/secrets/default/my-secret2 | hexdump -C

Dane powinny być zaszyfrowane.

Warning

Dane zaszyfrowane zostaną jedynie po uruchomieniu szyfrowania! Secrety przed uruchomieniem szyfrowania nie będą zaszyfrowane.

Źródło

https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/