[k8s] Encryting Secret Data at Rest

GisangLee·2024년 1월 6일
0

k8d

목록 보기
17/29

공식문서

1. Secret 생성

kubectl create secret generic my-secret -n default --from-literal=mykey=mydata

2. Install ETCD Client

설치 링크


3. Check pod

kubectl get po -n kube-system

etcd-controlplane이 있는지 확인


4. Etcd 커맨드 사용

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-secret

16진수로 보기

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-secret | hexdump -C

실제로 16진수로 확인해보면 우리가 만든 secret의 데이터가 암호화되지 않은채로 ETCD에 저장되어있다.

  • 이것은 큰 문제인데 왜냐면, ETCD에 접속할 수 있는 모든 사람은 데이터를 볼 수 있기 때문이다. 그래서 암호화를 하도록 하겠다.

5. 환경 설정과 암호화가 활성화 되어있는지 확인

kube-apiserver 프로세스는 --encryption-provider-config
라는 argument를 지원하고 있고,
해당 argument는 API 데이터가 etcd에 암호화가 되는 과정을 제어한다.

프로세스 실행 확인

ps -aux | grep kube-api
ps -aux | grep kube-api | grep "encryption-provider-config"

만약 ps -aux | grep kube-api | grep "encryption-provider-config" 명령어의 결과가 반환되지 않으면, 옵션이 구성되지 않았다는 말이다.

  • 즉, 아래와 같이 옵션을 구성하면 된다.

6. 암호화 키 생성

head -c 32 /dev/urandom | base64

7. enc.yaml 파일 생성

6번 과정에서 생성한 암호화 키를 secret에 붙여넣는다.

---
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
  - resources:
      - secrets
      - configmaps
      - pandas.awesome.bears.example
    providers:
      - aescbc:
          keys:
            - name: key1
              secret: <위에서 생성한 암호화 키 복붙>
      - identity: {}

8. 폴더 생성 및 암호화 yaml 파일 이동

mkdir /etc/kubernetes/enc
mv enc.yaml /etc/kubernetes/enc/

9. k8x manifest kube-apiserver 파일 수정

vi /etc/kubernetes/manifests/kube-apiserver.yaml
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
  ...

파일을 수정 하고 나면 apiserver가 재구동된다.
기다리면 다시 다 재가동 될 것이다.


10. 데이터 암호화 테스트

시크릿 하나 만들기

kubectl create secret generic my-secret2 -n default --from-literal=mykey=mydata

etcd 데이터 확인

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

이제 암호화가 된 모습을 확인할 수 있다.

하지만 기존에 이미 만든 secret에 대해서는

자동으로 암호화를 반영하지 않는다.

그래서 이전에 만든 secret에 대해서도 반영해주기 위해

아래의 단계를 마지막으로 실행한다.

kubectl get secrets --all-namespaces -o json | kubectl replace -f -
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-secret | hexdump -C

이제 이전에 만든 secret에 대해서
etcd 데이터를 확인해보면 암호화가 되어있음을 볼 수 있다.

profile
포폴 및 이력서 : https://gisanglee.github.io/web-porfolio/

0개의 댓글