Skip to content

Kubernetes에서 Rest 상태의 시크릿 데이터 암호화하기 ​

시크릿 객체 생성하기 ​

먼저, 일반 시크릿 객체를 생성합니다.

sh
kubectl create secret generic my-secret --from-literal=key1=supersecret

이 명령어는 key1이라는 키와 supersecret이라는 값을 가진 시크릿 객체 my-secret을 생성합니다.

시크릿 데이터의 기본 인코딩 확인하기 ​

생성된 시크릿 데이터는 Base64로 인코딩되어 저장됩니다. 이는 쉽게 디코딩될 수 있기 때문에, 본질적으로 안전하지 않습니다.

sh
kubectl get secret my-secret -o yaml

이 명령어를 통해 시크릿 데이터의 인코딩된 형태를 확인할 수 있습니다.

etcd 서버에서의 데이터 저장 방식 ​

Kubernetes는 시크릿 데이터를 etcd 서버에 저장합니다. 기본적으로, 이 데이터는 암호화되지 않은 상태로 저장됩니다. 이는 etcd에 접근할 수 있는 사람이라면 누구나 시크릿 데이터를 볼 수 있음을 의미합니다.

etcd에서 시크릿 데이터 암호화 활성화하기 ​

Kubernetes에서는 etcd에 저장되는 데이터를 암호화하기 위한 옵션을 제공합니다. 이를 활성화하기 위해, 다음 단계를 따릅니다:

  1. 암호화를 위한 설정 파일 생성하기:
yaml
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
  - resources:
      - secrets
    providers:
      - aescbc:
          keys:
            - name: key1
              secret: <base64-encoded-secret>
      - identity: {}

head -c 32 /dev/urandom | base64로 랜덤키 생성합니다.
이 YAML 파일은 시크릿 데이터를 AES CBC 알고리즘을 사용하여 암호화하도록 Kubernetes에 지시합니다.

  1. API 서버에 암호화 설정 적용하기:

API 서버 설정 파일에 암호화 설정 파일의 경로를 추가합니다.

yaml
# /etc/kubernetes/manifests/kube-apiserver.yaml
---
#
# This is a fragment of a manifest for a static Pod.
# Check whether this is correct for your cluster and for your API server.
#
apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubeadm.kubernetes.io/kube-apiserver.advertise-address.endpoint: 10.20.30.40:443
  creationTimestamp: null
  labels:
    app.kubernetes.io/component: kube-apiserver
    tier: control-plane
  name: kube-apiserver
  namespace: kube-system
spec:
  containers:
  - command:
    - kube-apiserver
    ...
    - --encryption-provider-config=/etc/kubernetes/enc/enc.yaml  # add this line
    volumeMounts:
    ...
    - name: enc                           # add this line
      mountPath: /etc/kubernetes/enc      # add this line
      readOnly: true                      # add this line
    ...
  volumes:
  ...
  - name: enc                             # add this line
    hostPath:                             # add this line
      path: /etc/kubernetes/enc           # add this line
      type: DirectoryOrCreate             # add this line
  ...

--encryption-provider-config=/etc/kubernetes/pki/etcd/encryption-config.yaml

이 변경을 적용한 후, Kubernetes API 서버를 재시작해야 합니다.

암호화된 시크릿 데이터 확인하기 ​

암호화 설정을 적용한 후, 새로운 시크릿 데이터를 생성하면 etcd에 암호화되어 저장됩니다. 이전에 생성된 시크릿 데이터는 업데이트하거나 재생성해야 암호화됩니다.

sh
kubectl create secret generic my-new-secret --from-literal=key2=topsecret

이제 새로 생성된 시크릿 my-new-secret은 etcd에 암호화되어 저장됩니다.

결론 ​

Kubernetes에서 시크릿 데이터의 안전성을 높이기 위해, etcd에서의 데이터 암호화를 활성화하는 것이 중요합니다. 이는 etcd 서버에 대한 접근이 제한되어 있더라도 추가적인 보안 계층을 제공합니다.

k8s referrence ​

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