Kubernetes Secret 환경 변수 전달 방식 점검

비밀정보의 출력·디버깅 노출을 줄이고 교체 시 소비자 갱신을 계획하세요.

설명

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 아래 파일로 마운트합니다. 이 예시는 모든 키를 마운트하므로 필요한 키만 선택하고, 파일 방식도 권한이 있는 프로세스나 사용자에게 값이 보인다는 점을 고려하세요.

참조