본문 바로가기

Kubernetes(k8s)/Secret

Secret

1.        Secret

 

         1.1.        정의

시크릿은 암호, 토큰 또는 키와 같은 소량의 중요한 데이터를 포함하는 

오브젝트이다. 이를 사용하지 않으면 중요한 정보가 파드 명세나 컨테이너

이미지에 포함될 수 있다. 시크릿을 사용한다는 것은 사용자의 기밀 데이터를

애플리케이션 코드에 넣을 필요가 없음을 뜻한다.

 

         1.2.        사용 목적

시크릿을 사용하는 파드와 독립적으로 생성될 수 있기 때문에, 파드를 생성하고,

확인하고, 수정하는 워크플로우 동안 시크릿(데이터)이 노출되는 것에 대한 위험을

경감시킬 수 있다. 쿠버네티스 및 클러스터에서 실행되는 애플리케이션은 비밀

데이터를 비휘발성 저장소에 쓰는 것을 피하는 것과 같이, 시크릿에 대해 추가 예방

조치를 취할 수도 있다.

 

 

         1.3.        종류

 

                        1.3.1.        Opaque(generic)

 

     일반적인 용도의 시크릿이다.

 

     ConfigMap과 동일한 목적으로 사용할 수 있다.

 

     민감한 데이터를 컨테이너에 전달하는 목적으로도 사용할 수 있다.

 

 

                        1.3.2.        dockerconfigjson

 

     도커 이미지 저장소 인증 정보이다.

 

     쿠버네티스는 컨테이너를 관리해야 하기 때문에, 이미지 저장소에 접근할 수 있어야한다.

 

     다만 도커 허브나 ECR같은 레지스트리 서비스에는 Public과 Private 이미지가 있어서, Private 이미지를 가져올 때는 추가적인 인증절차를 밟아야 한다.

 

     인증에 필요한 정보를 Secret에 생성을 해두고, Pod를 띄울 때마다 이미지 pull에 필요한 Secret을 사용할 수 있게 해야 한다. dockerconfigjson는 그런 Private 레지스트리에 접근할 때 사용하는 Secret인 것이다.

 

 

                        1.3.3.        tls

 

     TLS 인증서를 Secret으로 관리할 수 있게 도와준다.

 

     TLS 인증서 정보를 Secret에 올려두게 되면, Pod나 Service와 같은 오브젝트에서 TLS 인증서 정보를 가져다가 통신 암호화를 수행하거나 할 수 있다.

 

 

                        1.3.4.        service-account-token

 

     RBAC, 즉 사용 접근 제어를 해야할 때 사용하는 대표적인 쿠버네티스의 API 리소스인 ServiceAccount와 연관이 있다.

 

     ServiceAccount는 Pod에 연결이 되어, 해당 Pod의 권한을 설정해주는 역할을 한다. 그리고 ServiceAccount를 연결시켜주게 되면 ServiceAccount에 대한 인증 정보를 담은 토큰이 Secret으로 자동 생성 된다.

 

 

         1.4.        예시

 

# secret 명령어의 종류 확인
[asd@ubu22-01 ~ (kubernetes-admin@cluster.local:happy)]$ kubectl create secret --help
Create a secret using specified subcommand.
 
# 시크릿 생성의 3가지 방법
Available Commands:
  docker-registry   Create a secret for use with a Docker registry
  generic           Create a secret from a local file, directory, or literal value
  tls               Create a TLS secret
Usage:
  kubectl create secret [flags] [options]
 
Use "kubectl <command> --help" for more information about a given command.
Use "kubectl options" for a list of global command-line options (applies to all commands).
 
[asd@ubu22-01 ~ (kubernetes-admin@cluster.local:happy)]$ k create secret generic webpasswd --from-literal=passwd="dkagh1."
secret/webpasswd created

[asd@ubu22-01 ~ (kubernetes-admin@cluster.local:happy)]$
k describe configmaps env-test
Name:         env-test
Namespace:    happy
Labels:       <none>
Annotations:  <none>

Data
====
my_emotion:
----
happy

Binary Data
====

Events:  <none>


# secret으로 생성한 webpasswd의 상태를 확인
[asd@ubu22-01 ~ (kubernetes-admin@cluster.local:happy)]$
k describe secrets webpasswd
Name:         webpasswd
Namespace:    happy
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
passwd:  7 bytes
#(dkagh1.)

 

# webpasswd를 yaml 형식으로 확인
[asd@ubu22-01 ~ (kubernetes-admin@cluster.local:happy)]$ k get secret webpasswd -o yaml
apiVersion: v1
data:
  passwd:
ZGthZ2gxLg==  # 입력한 passwd 값이 base64로 인코딩 되어 보인다.
kind: Secret
metadata:
  creationTimestamp: "2023-08-14T06:07:16Z"
  name: webpasswd
  namespace: happy
  resourceVersion: "231223"
  uid: 3c4a91b9-f4fe-4681-8680-876fefb514f8
type: Opaque


# nginx 생성 yaml 파일
[asd@ubu22-01 ~ (kubernetes-admin@cluster.local:happy)]$
vi secnginx.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: nginx
  name: nginx
spec:
  containers:
    - image: docker.io/library/nginx
      name: nginx
      volumeMounts:
      - name: vol
        mountPath:
"/secrets"
  volumes:
  - name: vol
    secret:
      secretName: webpasswd


# 기존에 설치된 nginx 제거. 동일한 이름의 pod로는 생성 불가능.
[asd@ubu22-01 ~ (kubernetes-admin@cluster.local:happy)]$ k delete pod nginx
pod "nginx" deleted

 
# secnginx로 nginx 생성
[asd@ubu22-01 ~ (kubernetes-admin@cluster.local:happy)]$
k apply -f secnginx.yaml
pod/nginx created

 

 
# 컨테이너 내부로 진입
[asd@ubu22-01 ~ (kubernetes-admin@cluster.local:happy)]$ k exec -it nginx -- bash

root@nginx:/
# ls
bin   dev             docker-entrypoint.sh  home  lib32  libx32  mnt  proc  run   secrets      sys  usr
boot  docker-entrypoint.d  etc              lib   lib64  media   opt  root  sbin  srv   tmp  var


root@nginx:/# cd secrets/


root@nginx:/secrets# ls
passwd


# 컨테이너 내부에서 확인하면 암호화 되어있지 않다.
root@nginx:/secrets# cat passwd
dkagh1.root@nginx:/secrets
#