보안 비밀

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

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

보안 비밀

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

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

보안 비밀 만들기

kubectl create secret을 사용하여 보안 비밀을 만듭니다.

    kubectl create secret type name data
    

각 항목의 의미는 다음과 같습니다.

  • type은 다음 중 하나입니다.

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

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

  • name은 만들고 있는 보안 비밀의 이름입니다.

  • data는 다음 중 하나입니다.

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

kubectl create에 대한 자세한 정보는 참조 문서를 확인하세요.

또는 YAML 매니페스트 파일에 보안 비밀 객체를 정의하고 다음 명령어를 사용해서 객체를 배포하여 보안 비밀을 만들 수 있습니다.

    kubectl create -f file-name.yaml
    

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

파일에서

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

--from-file

--from-file을 사용하여 보안 비밀을 만들면 보안 비밀의 값이 파일의 전체 내용이 됩니다. Secret 값에 여러 키-값 쌍이 포함되어 있으면 대신 --from-env-file를 사용하십시오.

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

    kubectl create secret type name --from-file /path/to/file --from-file /path/to/file2
    

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

    kubectl create secret type name --from-file /path/to/directory
    

예를 들어 다음 명령어를 실행하면 username.txtpassword.txt라는 2개의 파일에서 credentials라는 보안 비밀을 만들고 각각 키를 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
    

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

    kubectl create secret type name --from-file=key=/path/to/directory
    

다음 예시는 username.txt 및 password.txt라는 2개의 파일에서 사용자 인증 정보라는 보안 비밀을 만들고 파일 이름을 사용하는 대신 키를 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라는 보안 비밀이 생성됩니다.

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

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

    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이라는 일반적인 보안 비밀을 만듭니다.

    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 인코딩은 보안을 제공하지 않습니다.

보안 비밀 사용

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

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

다음 단계