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:
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:
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ę:¶
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:
Weryfikujemy proces kube-apiserver
2.5. Utworzenie Secret zaszyfrowanego¶
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/