secret
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