서버 운영 환경에서 가장 중요한 보안 요소 중 하나는 민감한 정보를 안전하게 관리하는 것입니다.
Application을 운영하다 보면 다양한 Secret 정보가 필요합니다.
예:
- Database Password
- API Key
- JWT Secret
- SSL 인증서
- Cloud Access Key
- 관리자 계정 정보
잘못된 관리 방식:
docker-compose.yml
↓
Password 저장
↓
Git 업로드
↓
정보 노출 위험
Production 환경에서는 Secret을 별도로 관리해야 합니다.
안전한 구조:
Secret Storage
↓
Docker Compose
↓
Container
↓
Application
이번 글에서는 Docker Compose Secrets 개념부터 환경 변수와 차이점, Secret 파일 관리, Docker Swarm Secret, Production 서버 보안 전략까지 알아보겠습니다.
Docker Compose Secrets란 무엇인가?
Secret은 민감한 데이터를 안전하게 Container에 전달하기 위한 기능입니다.
일반적인 환경 변수:
환경 변수
↓
Container 전달
Secret 방식:
Secret 저장
↓
필요한 Container만 접근
관리 대상:
- Password
- Token
- Private Key
- 인증 정보
Docker Compose Secret이 필요한 이유
가장 흔한 보안 문제:
environment:
DB_PASSWORD: mypassword
문제:
- Git 저장소 노출
- 팀원 공유 시 위험
- Backup 파일에 포함 가능
예:
GitHub 업로드
↓
비밀번호 공개
↓
Database 접근 위험
Secret 사용:
Secret 파일
↓
Container 전달
↓
외부 노출 감소
Docker Compose Environment와 Secret 차이
| 구분 | Environment | Secret |
|---|---|---|
| 저장 방식 | 환경 변수 | 별도 파일 |
| 보안 수준 | 일반적 | 높음 |
| 관리 방식 | 쉬움 | 안전 |
| Password | 가능 | 권장 |
| Token | 가능 | 권장 |
개발 환경:
Environment 사용 가능
Production:
Secret 관리 권장
Docker Compose Secret 기본 구조
Secret 파일 생성:
echo "password123" > db_password.txt
구조:
project
├── docker-compose.yml
└── db_password.txt
docker-compose.yml:
services:
mysql:
image: mysql:8
secrets:
- db_password
secrets:
db_password:
file: ./db_password.txt
동작:
db_password.txt
↓
Docker Secret
↓
MySQL Container
Docker Compose Secret 파일 확인
Container 내부에서는 Secret이 파일 형태로 전달됩니다.
위치:
/run/secrets/
확인:
ls /run/secrets
결과:
db_password
내용 확인:
cat /run/secrets/db_password
Docker Compose MySQL Secret 적용 예제
기존 방식:
environment:
MYSQL_ROOT_PASSWORD: password
Secret 방식:
services:
mysql:
image: mysql:8
secrets:
- mysql_root_password
secrets:
mysql_root_password:
file: ./mysql_password.txt
장점:
- Compose 파일에 Password 없음
- Git 업로드 안전
- 관리 편리
Docker Compose Application Secret 사용
Application에서도 Secret을 사용할 수 있습니다.
예:
API_KEY
JWT_SECRET
DATABASE_PASSWORD
구조:
Secret File
↓
Application Container
↓
환경 설정
Docker Compose SSL 인증서 Secret 관리
HTTPS 환경에서는 인증서 관리가 중요합니다.
관리 대상:
- private key
- certificate
- CA 파일
구조:
SSL Secret
↓
Nginx Container
↓
HTTPS 서비스
예:
services:
nginx:
image: nginx
secrets:
- ssl_key
Docker Compose Secret 권한 관리
Secret 파일은 접근 권한을 제한해야 합니다.
설정:
chmod 600 db_password.txt
의미:
소유자만 읽기 가능
확인:
ls -l db_password.txt
Docker Compose Git 보안 관리
Secret 파일은 Git에 포함하면 안 됩니다.
.gitignore:
db_password.txt
.env
구조:
Git Repository
↓
소스 코드만 저장
↓
Secret 제외
Docker Compose Docker Swarm Secret
Docker Swarm에서는 공식 Secret 기능을 제공합니다.
생성:
docker secret create db_password password.txt
확인:
docker secret ls
특징:
- 암호화 저장
- Container 접근 제한
- 운영 환경 적합
Docker Compose Secret 운영 전략
Production 권장 구조:
Developer
↓
Secret Manager
↓
Docker Compose
↓
Container
관리:
- Secret 파일 분리
- 접근 권한 제한
- 정기 변경
- 노출 기록 확인
Docker Compose Secret Rotation
보안을 위해 Secret 변경이 필요합니다.
예:
기존 Password
↓
새 Password 생성
↓
Container 업데이트
과정:
Secret 변경
↓
Service 재배포
↓
접속 확인
Docker Compose Secret 장애 대응
Container가 Secret을 읽지 못하는 경우
확인:
ls /run/secrets
확인:
- Secret 이름
- 파일 경로
- 권한
Permission 오류
확인:
ls -l secret-file
해결:
chmod 600
Database 연결 실패
확인:
Password 변경 여부
↓
Application 설정 확인
Docker Compose Secret Best Practice
운영 환경 추천:
- Password 파일 분리
- Git 저장 금지
- 접근 권한 제한
- Secret Rotation
- Backup 암호화
- 최소 접근 권한
최종 구조:
Secret Manager
↓
Docker Compose
↓
Application Container
↓
Database
↓
Encrypted Storage
자주 묻는 질문
.env 파일도 Secret인가요?
아닙니다.
.env는 환경 설정 관리 방식이고 Secret은 민감 정보 보호 목적입니다.
Password를 Compose 파일에 작성하면 안 되나요?
개발 환경에서는 가능하지만 Production에서는 권장하지 않습니다.
Secret 파일도 Backup 해야 하나요?
필요합니다.
다만 암호화하여 안전하게 보관해야 합니다.
Docker Compose에서 Secret을 사용할 수 있나요?
가능합니다.
특히 운영 환경에서는 Secret 관리 방식 사용을 권장합니다.
마무리
Docker Compose Secrets 관리는 안전한 Container 운영 환경을 만들기 위한 핵심 과정입니다.
민감한 정보는 코드와 분리하고 필요한 Container만 접근하도록 설계해야 합니다.
Production 보안 구조:
Secret 관리
↓
Container 전달
↓
권한 제한
↓
안전한 서비스 운영
이 구조를 적용하면 Database Password, API Key, 인증서 같은 중요 정보를 더욱 안전하게 관리할 수 있습니다.
다음 글에서는 개발 환경과 운영 환경을 분리하는 Docker Compose 환경 분리 구성 방법을 알아보겠습니다.