서버 운영에서 가장 중요한 보안 요소 중 하나는 민감 정보 관리입니다.
Application은 다양한 Secret 정보를 필요로 합니다.
예:
Database Password
API Key
SSL Certificate
Cloud Access Token
JWT Secret
하지만 많은 환경에서 이러한 정보를 환경 변수나 설정 파일에 직접 입력하는 문제가 발생합니다.
잘못된 방식:
environment:
DB_PASSWORD: password123
문제:
Git Push
↓
Secret 노출
↓
보안 사고 발생
Production 환경에서는 Secret을 별도로 관리하고 필요한 Container에만 안전하게 전달해야 합니다.
기본 구조:
Developer
↓
Secret Manager
↓
Docker Compose
↓
Container
이번 글에서는 Docker Compose Secrets 개념부터 Secret 저장 방식, Docker Secret 활용, External Secret Manager 연동, Production 보안 운영 방법까지 알아보겠습니다.
Docker Compose Secrets란?
Secrets는 민감한 정보를 안전하게 저장하고 Container에 전달하는 기능입니다.
일반 Configuration:
PORT=8080
MODE=production
Secret:
PASSWORD
TOKEN
PRIVATE KEY
차이:
Config
↓
일반 설정
Secret
↓
보호 대상 정보
환경 변수 방식의 문제점
많이 사용하는 방식:
services:
database:
environment:
MYSQL_PASSWORD: mypassword
문제:
Git 저장소 노출
docker-compose.yml
↓
GitHub
↓
Password 공개
Log 노출
환경 변수 출력 과정에서 노출 가능
접근 관리 어려움
누가 Secret을 확인했는지 추적 어려움
Docker Compose Secrets 기본 구조
안전한 구조:
Secret File
↓
Docker Compose
↓
Container Mount
↓
Application 사용
예:
/secrets/db_password
Container 내부:
/run/secrets/db_password
Docker Compose Secret 파일 생성
예:
echo "mypassword" > db_password.txt
확인:
cat db_password.txt
파일:
mypassword
Docker Compose Secrets 설정
docker-compose.yml:
services:
app:
image: my-app
secrets:
- db_password
secrets:
db_password:
file: ./db_password.txt
구조:
db_password.txt
↓
Docker Secret
↓
Container
Container 내부 Secret 확인
Container 내부:
cat /run/secrets/db_password
결과:
mypassword
Application은 환경 변수 대신 Secret File을 읽어 사용합니다.
Docker Compose Secret과 Environment 비교
Environment:
DB_PASSWORD=password
Secret:
/run/secrets/db_password
비교:
| 항목 | Environment | Secret |
|---|---|---|
| 보안 | 낮음 | 높음 |
| Git 노출 위험 | 있음 | 낮음 |
| 권한 관리 | 어려움 | 가능 |
| 운영 환경 | 비추천 | 권장 |
Docker Compose Database Secret 관리
Database는 대표적인 Secret 관리 대상입니다.
예:
MySQL Password
PostgreSQL Password
Redis Password
구조:
Secret Manager
↓
Database Container
↓
Application
장점:
- Password 보호
- 변경 관리
- 접근 제한
Docker Compose API Key 관리
외부 API 사용 시 Key가 필요합니다.
예:
Payment API Key
Cloud API Token
Email Service Key
잘못된 방식:
const key="123456"
권장:
Secret File
↓
Application
Docker Compose SSL Certificate 관리
HTTPS 운영에서는 Certificate 보호가 중요합니다.
관리 대상:
Private Key
Certificate
CA File
구조:
Secret Storage
↓
Nginx Container
↓
HTTPS Service
External Secret Manager 연동
기업 환경에서는 별도의 Secret Manager를 사용합니다.
대표:
- HashiCorp Vault
- AWS Secrets Manager
- Google Secret Manager
- Azure Key Vault
구조:
External Secret Manager
↓
Docker Compose
↓
Container
HashiCorp Vault 구조
Vault:
Secret 저장 시스템
구조:
Application
↓
Vault Authentication
↓
Secret 가져오기
↓
Application 실행
장점:
- 중앙 관리
- Audit Log
- Access Policy
Docker Compose Secret Rotation
Secret은 정기적으로 변경해야 합니다.
예:
기존 Password
↓
새 Password 생성
↓
Service 업데이트
Rotation 과정:
Secret 변경
↓
Container 재배포
↓
새 Secret 적용
Docker Compose Secret 접근 권한 관리
모든 Container가 Secret을 볼 필요는 없습니다.
좋은 구조:
Payment Service
↓
Payment API Key 사용
나쁜 구조:
모든 Container
↓
모든 Secret 접근
원칙:
최소 권한
Docker Compose CI/CD Secret 관리
CI/CD에서도 Secret 보호가 필요합니다.
구조:
GitHub Actions
↓
Encrypted Secret
↓
Docker Build
↓
Deploy
주의:
Docker Image Layer에 Secret 저장 금지
잘못된 Dockerfile:
COPY password.txt /
문제:
Image History에 남음
Docker Compose Secret 보안 Best Practice
추천:
Secret 파일 Git 제외
.gitignore
↓
secret 파일 제외
평문 저장 금지
Password 직접 입력 금지
최소 권한 적용
필요한 Service만 접근
Rotation 운영
주기적 변경
Audit 기록
Secret 접근 기록 관리
Docker Compose Production Secret 구조
기업 운영:
Developer
↓
CI/CD
↓
Secret Manager
↓
Docker Compose
↓
Container
↓
Application
보안 흐름:
Secret 생성
↓
암호화 저장
↓
필요 시 전달
↓
사용 후 보호
자주 묻는 질문
Docker Compose Secrets는 Kubernetes Secret과 같은 기능인가요?
개념은 비슷하지만 Kubernetes는 더 큰 Container Orchestration 환경을 위한 기능입니다.
환경 변수로 Secret을 관리하면 안 되나요?
개발 환경에서는 사용할 수 있지만 Production에서는 별도 Secret 관리가 권장됩니다.
Secret 파일도 해킹되면 위험한가요?
네.
파일 권한과 접근 제어가 중요합니다.
Secret Rotation은 꼭 필요한가요?
장기 운영 서버에서는 주기적인 변경이 보안을 강화합니다.
마무리
Docker Compose Secrets Manager 운영은 Database Password, API Key, Certificate 같은 민감 정보를 안전하게 보호하기 위한 핵심 보안 기술입니다.
최종 구조:
Secret Manager
↓
Docker Compose
↓
Container
↓
Application
Production 서버에서는 서비스 성능뿐 아니라 민감 정보가 어디에 저장되고 누가 접근하는지 관리하는 것이 중요합니다.
다음 글에서는 Container 간 통신을 안전하게 분리하는 Docker Compose Network Isolation 보안 구성 방법을 알아보겠습니다.