반응형

 

 

시크릿(Secret)

시크릿은 암호, 토큰 또는 키와 같은 소량의 중요한 데이터를 포함하는 오브젝트이다. 이를 사용하지 않으면 중요한 정보가 파드 명세나 컨테이너 이미지에 포함될 수 있다. 시크릿을 사용한다는 것은 사용자의 기밀 데이터를 애플리케이션 코드에 넣을 필요가 없음을 뜻한다.

 

시크릿은 시크릿을 사용하는 파드와 독립적으로 생성될 수 있기 때문에, 파드를 생성하고, 확인하고, 수정하는 워크플로우 동안 시크릿(그리고 데이터)이 노출되는 것에 대한 위험을 경감시킬 수 있다. 쿠버네티스 및 클러스터에서 실행되는 애플리케이션은 비밀 데이터를 비휘발성 저장소에 쓰는 것을 피하는 것과 같이, 시크릿에 대해 추가 예방 조치를 취할 수도 있다.

 

시크릿은 컨피그맵과 유사하지만 특별히 기밀 데이터를 보관하기 위한 것이다.

주의

쿠버네티스 시크릿은 기본적으로 API 서버의 기본 데이터 저장소(etcd)에 암호화되지 않은 상태로 저장된다. API 접근(access) 권한이 있는 모든 사용자 또는 etcd에 접근할 수 있는 모든 사용자는 시크릿을 조회하거나 수정할 수 있다. 또한 네임스페이스에서 파드를 생성할 권한이 있는 사람은 누구나 해당 접근을 사용하여 해당 네임스페이스의 모든 시크릿을 읽을 수 있다. 여기에는 디플로이먼트 생성 기능과 같은 간접 접근이 포함된다.

1. 시크릿을 안전하게 사용하려면 최소한 다음의 단계를 따르는 것이 좋다.

2. 시크릿에 대해 저장된 데이터 암호화(Encryption at Rest)를 활성화한다.시크릿 읽기 및 쓰기를 제한하는 RBAC 규칙을 활성화 또는 구성한다.

3. 파드 생성 권한을 가진 사람은 암묵적으로 시크릿에 접근할 수 있음에 주의한다.적절한 경우, RBAC과 같은 메커니즘을 사용하여 새로운 시크릿을 생성하거나 기존 시크릿을 대체할 수 있는 주체(principal)들을 제한한다.

 

시크릿의 사용

파드가 시크릿을 사용하는 주요한 방법으로 다음의 세 가지가 있다.

  • 하나 이상의 컨테이너에 마운트된 볼륨 내의 파일로써 사용.
  • 컨테이너 환경 변수로써 사용.
  • 파드의 이미지를 가져올 때 kubelet에 의해 사용.

쿠버네티스 컨트롤 플레인 또한 시크릿을 사용한다. 예를 들어, 부트스트랩 토큰 시크릿은 노드 등록을 자동화하는 데 도움을 주는 메커니즘이다

 

 

 

 

Secret 사용

 

# secret 배포 YAML 파일 생성 (암호화 base64 지원) jinsu@jinsu:~$ cat secret.yaml apiVersion: v1 kind: Secret metadata: ​​name: mysecret type: Opaque data: ​​username: YWRtaW4= ​​password: MWYyZDFlMmU2N2Rm jinsu@jinsu:~$ # secret 생성 및 확인 jinsu@jinsu:~$ kubectl apply -f secret.yaml secret/mysecret created jinsu@jinsu:~$ jinsu@jinsu:~$ kubectl get secret NAME TYPE DATA AGE default-token-vm2hl kubernetes.io/service-account-token 3 8h mysecret Opaque 2 5s jinsu@jinsu:~$ # secret 상세정보 jinsu@jinsu:~$ kubectl get secret mysecret -oyaml apiVersion: v1 data: ​​password: MWYyZDFlMmU2N2Rm ​​username: YWRtaW4= kind: Secret metadata: ​​annotations: ​​​​kubectl.kubernetes.io/last-applied-configuration: | ​​​​​​{"apiVersion":"v1","data":{"password":"MWYyZDFlMmU2N2Rm","username":"YWRtaW4="},"kind":"Secret","metadata":{"annotations":{},"name":"mysecret","namespace":"default"},"type":"Opaque"} ​​creationTimestamp: "2022-08-14T09:37:57Z" ​​name: mysecret ​​namespace: default ​​resourceVersion: "19863" ​​selfLink: /api/v1/namespaces/default/secrets/mysecret ​​uid: 221983f8-81b7-4e62-bd7d-736b88dcdba8 type: Opaque jinsu@jinsu:~$ # 같은 secret2를 생성 (암호화하지 않음) jinsu@jinsu:~$ cat secret2.yaml apiVersion: v1 kind: Secret metadata: ​​name: mysecret2 type: Opaque stringData: ​​username: admin ​​password: password jinsu@jinsu:~$ # secret2 생성 및 확인 jinsu@jinsu:~$ kubectl apply -f secret2.yaml secret/mysecret2 created jinsu@jinsu:~$ kubectl get secret NAME TYPE DATA AGE default-token-vm2hl kubernetes.io/service-account-token 3 8h mysecret Opaque 2 6m39s mysecret2 Opaque 2 4s jinsu@jinsu:~$ # secret2 상세정보를 보면 계정과 패스워드가 자동 암호화되는것을 볼 수 있다. jinsu@jinsu:~$ kubectl get secret mysecret2 -oyaml apiVersion: v1 data: ​​password: cGFzc3dvcmQ= ​​username: YWRtaW4= kind: Secret metadata: ​​annotations: ​​​​kubectl.kubernetes.io/last-applied-configuration: | ​​​​​​{"apiVersion":"v1","kind":"Secret","metadata":{"annotations":{},"name":"mysecret2","namespace":"default"},"stringData":{"password":"password","username":"admin"},"type":"Opaque"} ​​creationTimestamp: "2022-08-14T09:44:32Z" ​​name: mysecret2 ​​namespace: default ​​resourceVersion: "20151" ​​selfLink: /api/v1/namespaces/default/secrets/mysecret2 ​​uid: dec64c7d-f910-4e3d-8da3-0317118a5fa1 type: Opaque jinsu@jinsu:~$

 

환경변수로 secret 설정

# secret 환경변수 YAML파일 생성 jinsu@jinsu:~$ cat cat-env.yaml apiVersion: v1 kind: Pod metadata: ​​name: cat-env spec: ​​containers: ​​​​- name: cat-env ​​​​​​image: k8s.gcr.io/busybox ​​​​​​command: [ "printenv" ] ​​​​​​args: [ "USER" ] ​​​​​​env: ​​​​​​- name: USER ​​​​​​​​valueFrom: ​​​​​​​​​​secretKeyRef: ​​​​​​​​​​​​name: mysecret ​​​​​​​​​​​​key: username ​​restartPolicy: OnFailure jinsu@jinsu:~$ jinsu@jinsu:~$ kubectl apply -f cat-env.yaml pod/cat-env created jinsu@jinsu:~$ jinsu@jinsu:~$ kubectl logs cat-env admin jinsu@jinsu:~$

 

 

 

 

 

참고자료

https://kubernetes.io/ko/docs/concepts/configuration/secret/

 

 

 

 

 

 

 

반응형

+ Recent posts