설명
Secret 값을 환경 변수로 전달하면 애플리케이션 로그, 디버깅 출력이나 프로세스 덤프에 노출될 수 있습니다. 지원되는 전달 방식이지만 그 자체로 유출을 뜻하지는 않으며, 실제 출력과 접근 권한을 점검해야 합니다. 실행 중인 컨테이너의 환경 변수는 원본 Secret을 바꿔도 자동 갱신되지 않습니다.
잠재적 영향
- 유출된 비밀정보가 다른 시스템 접근에 악용될 수 있습니다.
- 오래된 값을 계속 사용하는 애플리케이션은 비밀정보 교체 후 인증에 실패할 수 있습니다.
해결 방법
- 애플리케이션이 파일을 읽을 수 있다면 필요한 Secret 키만 읽기 전용 볼륨으로 전달하는 방식을 검토하세요. 파일 접근 권한과 애플리케이션의 변경 감지·재로드도 확인하세요.
- 환경 변수를 사용하면 값의 출력과 디버깅을 제한하고 비밀정보 교체 시 재시작을 계획하세요. Secret 조회, Pod 실행·디버깅 권한을 최소화하고 더 이상 쓰지 않는 자격 증명은 폐기하세요.
예시
같은 네임스페이스에 mysecret이 있어야 합니다. Redis 이미지가 이 변수나 파일을 자동으로 인증에 사용하는 예시는 아니며, 애플리케이션의 읽기 처리는 따로 구현해야 합니다. Pod 이름이 달라 별도 리소스로 생성됩니다.
변경 전
yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
containers:
- name: mycontainer
image: redis
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
mysecret의 username 값을 SECRET_USERNAME 환경 변수로 전달합니다.
변경 후
yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-file-pod
spec:
containers:
- name: mycontainer
image: redis
volumeMounts:
- name: app-secret
mountPath: /var/run/secrets/app
readOnly: true
volumes:
- name: app-secret
secret:
secretName: mysecret
Secret 키를 /var/run/secrets/app 아래 파일로 마운트합니다. 이 예시는 모든 키를 마운트하므로 필요한 키만 선택하고, 파일 방식도 권한이 있는 프로세스나 사용자에게 값이 보인다는 점을 고려하세요.