TrendPilot 2025. 3. 10. 11:03

1. Kubernetes Secret 개요

Kubernetes Secret은 중요한 정보를 안전하게 저장하고 관리하는 리소스입니다. API 키, 비밀번호, 인증서와 같은 민감한 데이터를 ConfigMap이 아닌 Secret에 저장함으로써 보안을 강화할 수 있습니다.

ConfigMap과 Secret의 차이점

용도 환경 변수, 설정값 민감한 데이터
데이터 저장 방식 평문 Base64 인코딩
보안 수준 낮음 높음

2. Secret 생성 방법

2.1 Kubectl을 사용한 Secret 생성

kubectl create secret generic my-secret --from-literal=username=admin --from-literal=password=pass123

이렇게 하면 my-secret 이라는 이름의 Secret이 생성되며, username과 password 키를 포함합니다.

 

secret 을 생성할 때, docker-registry / generic / tls 3 가지 타입이 있습니다.

  • docker-registry

Docker Private Registry 에 인증 정보 저장할 때 사용.

    Docker server / ID / PW 등의 정보를 가지고 secret 을 생성합니다.

kubectl create secret docker-registry my-registry-secret \
  --docker-server=192.168.60.162:5000 \
  --docker-username=myuser \
  --docker-password=mypassword \
  --docker-email=myemail@example.com
  
  ---
  yaml 예제
  
apiVersion: v1
kind: Secret
metadata:
  name: my-registry-secret
type: kubernetes.io/dockerconfigjson
data:
  .dockerconfigjson: <Base64 인코딩된 JSON 데이터>
  • generic

k8s 에서 가장 기본적인 Key-Value 형식의 secret 타입.

    API 키, ID, 비밀번호, 설정 정보 등 일반적인 데이터로 생성

kubectl create secret generic my-secret \
  --from-literal=username=admin \
  --from-literal=password=pass123
  
---
yaml 예제
apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
data:
  username: YWRtaW4=  # 'admin'의 Base64 값
  password: cGFzczEyMw==  # 'pass123'의 Base64 값
  • tls

TLS 인증서를 저장할 때 사용.

    Ingress 또는 내부 서비스에서 TLS 통신할 때 사용함

kubectl create secret tls my-tls-secret \
  --cert=cert.pem --key=key.pem

---
yaml 예제
apiVersion: v1
kind: Secret
metadata:
  name: my-tls-secret
type: kubernetes.io/tls
data:
  tls.crt: <Base64 인코딩된 인증서>
  tls.key: <Base64 인코딩된 개인 키>

2.2 YAML을 통한 Secret 생성

apiVersion: v1
kind: Secret
metadata:
  name: my-secret
  namespace: default
type: Opaque
data:
  username: YWRtaW4=
  password: cGFzczEyMw==

여기서 username과 password 값은 Base64로 인코딩된 값입니다. 디코딩하려면 다음 명령어를 사용할 수 있습니다.

echo "YWRtaW4=" | base64 --decode

3. Secret 사용 방법

3.1 환경 변수로 마운트

apiVersion: v1
kind: Pod
metadata:
  name: secret-env-pod
spec:
  containers:
    - name: my-container
      image: nginx
      env:
        - name: USERNAME
          valueFrom:
            secretKeyRef:
              name: my-secret
              key: username
        - name: PASSWORD
          valueFrom:
            secretKeyRef:
              name: my-secret
              key: password

이렇게 하면 username과 password  환경 변수에 Secret 값이 주입됩니다.

3.2 Volume으로 마운트

apiVersion: v1
kind: Pod
metadata:
  name: secret-volume-pod
spec:
  volumes:
    - name: secret-volume
      secret:
        secretName: my-secret
  containers:
    - name: my-container
      image: nginx
      volumeMounts:
        - name: secret-volume
          mountPath: "/etc/secret"
          readOnly: true

이 경우, Secret 값이 /etc/secret/username, /etc/secret/password 파일로 저장됩니다.

4. Secret 관리 및 보안

4.1 Base64 인코딩 vs 암호화

Kubernetes의 Secret은 단순한 Base64 인코딩이며, 강력한 보안이 적용된 것은 아닙니다. 따라서 추가적인 암호화 솔루션을 고려해야 합니다.

4.2 RBAC를 활용한 접근 제어

Secret에 접근할 수 있는 사용자와 서비스 계정을 제한하는 것이 중요합니다.

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: secret-reader
  namespace: default
rules:
  - apiGroups: [""]
    resources: ["secrets"]
    verbs: ["get", "list"]

4.3 SealedSecret을 활용한 보안 강화

SealedSecret은 Secret을 암호화하여 Git 저장소에 안전하게 저장할 수 있도록 도와줍니다.

kubectl create secret generic my-secret --from-literal=password=pass123 --dry-run=client -o yaml | kubeseal --format yaml > sealedsecret.yaml

이렇게 하면 암호화된 SealedSecret이 생성됩니다.

5. 결론

Kubernetes Secret은 민감한 데이터를 관리하는 데 중요한 역할을 합니다. 하지만 기본적으로 Base64 인코딩만 제공하므로, RBAC 설정과 추가적인 암호화 기법을 활용하여 보안을 강화하는 것이 중요합니다.

 

감사합니다.

 


secret 공식 문서

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

 

Secrets

A Secret is an object that contains a small amount of sensitive data such as a password, a token, or a key. Such information might otherwise be put in a Pod specification or in a container image. Using a Secret means that you don't need to include confiden

kubernetes.io