보안 비밀

이 페이지에서는 Kubernetes의 보안 비밀 객체와 Google Kubernetes Engine(GKE)에서 이를 사용하는 방법을 설명합니다.

보안 비밀이란 무엇인가요?

보안 비밀은 비밀번호, OAuth 토큰, SSH 키와 같은 민감한 데이터를 클러스터에 저장하는 보안 객체입니다. 민감한 데이터를 보안 비밀에 저장하는 것은 일반 텍스트로 된 ConfigMaps 또는 pod 사양에 저장하는 것보다 안전합니다. 보안 비밀을 사용하면 사용되는 데이터의 민감성을 제어하고 승인되지 않은 사용자에게 데이터가 노출될 위험을 줄일 수 있습니다.

Cloud KMS에서 관리하는 키를 사용하여 애플리케이션 레이어에서 보안 비밀을 암호화할 수도 있습니다. 자세한 내용은 애플리케이션 레이어 보안 비밀 암호화를 참조하세요.

보안 비밀 만들기

명령줄 또는 YAML 파일을 사용하여 보안 비밀을 만들 수 있습니다.

kubectl

보안 비밀을 만들려면 다음 명령어를 실행합니다.

kubectl create secret SECRET_TYPE SECRET_NAME DATA

다음을 바꿉니다.

  • SECRET_TYPE: 보안 비밀 유형이며 다음 중 하나입니다.

    • generic: 로컬 파일, 디렉터리 또는 리터럴 값에서 보안 비밀을 만듭니다.
    • docker-registry: Docker 레지스트리에 사용하기 위한 dockercfg 보안 비밀을 만듭니다. Docker 레지스트리로 인증을 수행하기 위해 사용됩니다.
    • tls: 지정된 공개 키/비공개 키 쌍에서 TLS 보안 비밀을 만듭니다. 공개 키/비공개 키 쌍이 이미 존재해야 합니다. 공개 키 인증서는 PEM으로 인코딩되고 지정된 비공개 키와 일치해야 합니다.

    대부분의 보안 비밀은 generic 유형을 사용합니다.

  • SECRET_NAME: 만들려는 보안 비밀의 이름입니다.

  • DATA: 보안 비밀에 추가할 데이터이며 다음 중 하나일 수 있습니다.

    • --from-file 또는 --from-env-file 플래그를 사용하여 표시된 하나 이상의 구성 파일을 포함하는 디렉터리의 경로
    • 각각 --from-literal 플래그를 통해 지정되는 키-값 쌍

kubectl create에 대한 자세한 내용은 참조 문서를 확인하세요.

YAML 파일

YAML 파일을 사용하여 보안 비밀을 만들려면 파일에서 보안 비밀 객체를 정의하고 다음 명령어를 사용하여 객체를 배포합니다.

kubectl create -f FILE_NAME.yaml

예시를 보려면 보안 비밀을 사용하여 사용자 인증 정보를 안전하게 배포를 참조하세요.

파일에서 보안 비밀 만들기

하나 이상의 파일에서 보안 비밀을 만들려면 --from-file 또는 --from-env-file을 사용합니다. 파일은 일반 텍스트여야 하지만 파일의 확장명은 상관없습니다.

--from-file을 사용하여 보안 비밀 만들기

--from-file을 사용하여 보안 비밀을 만들 때 보안 비밀의 값은 파일의 콘텐츠입니다. 보안 비밀 값에 여러 키-값 쌍이 포함되어 있으면 --from-env-file을 대신 사용하세요.

파일을 한 개 또는 여러 개 전달할 수 있습니다.

kubectl create secret SECRET_TYPE SECRET_NAME \
  --from-file PATH_TO_FILE1 \
  --from-file PATH_TO_FILE2

다음을 바꿉니다.

  • SECRET_TYPE: 보안 비밀 유형이며 다음 중 하나입니다.

    • generic: 로컬 파일, 디렉터리 또는 리터럴 값에서 보안 비밀을 만듭니다.
    • docker-registry: Docker 레지스트리에 사용하기 위한 dockercfg 보안 비밀을 만듭니다. Docker 레지스트리로 인증을 수행하기 위해 사용됩니다.
    • tls: 지정된 공개 키/비공개 키 쌍에서 TLS 보안 비밀을 만듭니다. 공개 키/비공개 키 쌍이 이미 존재해야 합니다. 공개 키 인증서는 PEM으로 인코딩되고 지정된 비공개 키와 일치해야 합니다.

      대부분의 보안 비밀은 generic 유형을 사용합니다.

  • SECRET_NAME: 만들려는 보안 비밀의 이름입니다.

  • PATH_TO_FILE: 파일의 경로입니다.

또한 여러 파일이 포함된 디렉터리를 전달할 수도 있습니다.

kubectl create secret SECRET_TYPE SECRET_NAME \
  --from-file PATH_TO_DIRECTORY

PATH_TO_DIRECTORY를 디렉터리 경로로 바꿉니다.

예를 들어 다음 명령어는 username.txtpassword.txt라는 두 파일에서 credentials라는 generic 유형의 보안 비밀을 만들고 키를 username.txtpassword.txt로 각각 설정합니다.

kubectl create secret generic credentials \
  --from-file ./username.txt \
  --from-file ./password.txt

보안 비밀 값은 Kubernetes에서 base-64로 인코딩됩니다.

kubectl get secret credentials -o yaml을 실행하면 다음 출력이 반환됩니다.

apiVersion: v1
data:
  password.txt: MTIzNAo=
  username.txt: YWRtaW4K
kind: Secret
metadata:
  creationTimestamp: ...
  name: credentials
  namespace: default
  resourceVersion: "2011810"
  selfLink: /api/v1/namespaces/default/secrets/credentials
  uid: ...
type: Opaque

기본적으로 키는 파일 이름입니다. 이 예시에서 키는 password.txtusername.txt입니다. --from-file 플래그에 확장 구문을 사용하여 기본 키를 재정의할 수 있습니다.

kubectl create secret SECRET_TYPE SECRET_NAME \
  --from-file=KEY_NAME=PATH_TO_DIRECTORY

KEY_NAME을 키에 설정하려는 이름으로 바꿉니다.

다음 예시에서는 username.txtpassword.txt라는 파일 두 개에서 credentials라는 generic 유형의 보안 비밀을 만들고 키를 usernamepassword로 각각 설정합니다.

kubectl create secret generic credentials \
  --from-file=username=./username.txt \
  --from-file=password=./password.txt

--from-env-file을 사용하여 보안 비밀 만들기

여러 키-값 쌍을 단일 보안 비밀로 로드하려면 하나 이상의 일반 텍스트 파일에 키-값 쌍을 저장하고 --from-file 대신 --from-env-file을 사용하여 로드합니다. 플래그를 여러 번 지정하여 여러 파일을 로드할 수 있습니다. --from-file과 동일한 제한사항이 적용됩니다.

다음 예시에서는 여러 개의 키-값 쌍이 포함된 단일 파일인 credentials.txt에서 credentials라는 generic 유형의 보안 비밀을 만듭니다.

  1. credentials.txt 파일을 만듭니다.

    # Each of these key-value pairs is loaded into the Secret
    username=jane
    password=d7xnNss7EGCFZusG
    

    보안 비밀 값은 Kubernetes에서 base64로 인코딩됩니다.

  2. 보안 비밀을 만듭니다.

    kubectl create secret generic credentials \
      --from-env-file ./credentials.txt
    

kubectl get secret credentials -o yaml을 실행하면 다음 출력이 반환됩니다.

apiVersion: v1
data:
  password: ZDd4bk5zczdFR0NGWnVzRw==
  username: amFuZQ==
kind: Secret
metadata:
  creationTimestamp: 2019-06-04T15:39:27Z
  name: credentials
  namespace: default
  resourceVersion: "14507319"
  selfLink: /api/v1/namespaces/default/secrets/credentials
  uid: efce376b-86de-11e9-9742-42010a80022f
type: Opaque

제한사항

symlink, 장치, 파이프와 같은 비일반적인 파일은 kubectl에서 무시됩니다. 하위 디렉터리도 무시됩니다. kubectl create secret은 하위 디렉터리에서 재귀적으로 실행되지 않습니다.

리터럴 값에서

리터럴 값에서 보안 비밀을 만들려면 --from-literal을 사용합니다.

예를 들어 다음 명령어는 2개의 키-값 쌍이 있는 literal-token이라는 generic 유형의 보안 비밀을 만듭니다.

kubectl create secret generic literal-token \
  --from-literal user=admin \
  --from-literal password=1234

각 키-값 쌍에 --from-literal을 지정합니다. 값은 자동으로 base64로 인코딩됩니다.

kubectl get secret literal-token -o yaml을 실행하면 다음 출력이 반환됩니다.

apiVersion: v1
data:
  password: MTIzNA==
  user: YWRtaW4=
kind: Secret
metadata:
  creationTimestamp: ...
  name: literal-token
  namespace: default
  resourceVersion: "2012831"
  selfLink: /api/v1/namespaces/default/secrets/literal-token
  uid: ...
type: Opaque

이 출력에서 passworduser는 모두 base64로 인코딩됩니다. base64 인코딩은 특정 문자를 처리할 수 없는 앱 및 서비스에서 정보를 사용할 수 있도록 만듭니다. base64 인코딩은 보안을 제공하지 않습니다.

보안 비밀 사용

작업 부하에 보안 비밀을 사용하기 위해서는 보안 비밀의 값을 참조하거나 보안 비밀이 포함된 볼륨을 마운트하는 환경 변수를 지정할 수 있습니다.

보안 비밀 사용에 대해 자세히 알아보려면 보안 비밀 사용을 참조하세요.

다음 단계