Docker&K8s

CH_03_04_컨테이너의 보안 정보 관리

dding-shark 2025. 7. 24. 15:16
728x90

3.4 컨테이너의 보안 정보 관리

컨테이너 운영 시 API 키, 데이터베이스 암호와 같은 민감한 정보는 제3자에게 유출되지 않도록 안전하게 다루는 것이 매우 중요합니다. 커맨드라인 인수나 환경 변수는 편리하지만, 보안 정보를 직접 노출할 수 있다는 단점이 있습니다. 이번 섹션에서는 이러한 보안 정보를 안전하게 컨테이너에 주입하고 관리하는 구체적인 방법을 알아보겠습니다.

 

 

 


 

 

3.4.1 보안 정보가 필요한 컨테이너 예시: MySQL

 

보안 정보 관리를 설명하기 좋은 대표적인 예시는 mysql 컨테이너입니다. MySQL 컨테이너는 실행 시 관리자(root) 계정의 비밀번호를 필수로 요구하며, 보통 MYSQL_ROOT_PASSWORD 환경 변수를 통해 설정합니다.

# 커맨드 라인에서 환경 변수로 비밀번호 설정하여 실행하기
docker container run -d --rm --name mysql \
  -e "MYSQL_ROOT_PASSWORD=my_secret_password" \
  -e "MYSQL_DATABASE=test" \
  mysql:8.0.33

docker-compose.yml 파일을 사용하면 다음과 같이 정의할 수 있습니다.

# docker-compose.yml
# !!주의: 이 방식은 비밀번호가 파일에 직접 노출되어 보안에 취약합니다.
version: "3.9"
services:
  mysql:
    container_name: mysql
    image: mysql:8.0.33
    environment:
      MYSQL_ROOT_PASSWORD: my_secret_password # 비밀번호가 그대로 노출됨
      MYSQL_DATABASE: test

 

 

3.4.2 버전 관리 시스템과 보안 정보

팀 프로젝트에서는 docker-compose.yml과 같은 구성 파일을 Git과 같은 버전 관리 시스템(VCS)으로 공유하여 개발 환경을 쉽게 통일합니다. 하지만 위 예시처럼 보안 정보를 파일에 직접 작성하고 VCS에 커밋하는 것은 심각한 보안 위험을 초래합니다.

  • 저장소 권한 문제: Private 저장소라도 사람이 실수로 Public으로 전환할 수 있습니다.
  • 정보 유출: 악성 코드나 내부자에 의해 저장소 정보가 유출될 수 있습니다.
  • 서드파티 도구: 저장소 접근 권한을 가진 외부 서비스(CI/CD 툴 등)를 통해 정보가 유출될 수 있습니다.

따라서 어떤 경우에도 보안 정보는 VCS에 저장하지 않는 것을 원칙으로 삼아야 합니다.

 

 


 

 

3.4.3 Docker Secrets를 사용한 안전한 정보 관리

VCS에 민감한 정보를 저장하지 않고 컨테이너에 안전하게 전달하기 위해 Docker Compose는 secrets 라는 기능을 제공합니다. secrets는 민감한 데이터를 파일로 분리하여 관리하고, 실행 시점에 컨테이너 내부에 안전하게 마운트하는 방식입니다.

다행히 mysql:8.0.33 이미지는 MYSQL_ROOT_PASSWORD 환경변수 외에도, 비밀번호가 기록된 파일을 지정하는 MYSQL_ROOT_PASSWORD_FILE 환경변수를 지원합니다. 이를 secrets 기능과 함께 활용하면 보안을 크게 향상할 수 있습니다.

secrets 활용 방법

 

 

1. 비밀번호 파일 생성
먼저, 프로젝트 내에 비밀번호를 담을 파일을 생성합니다. 이 파일은 .gitignore에 추가하여 Git이 추적하지 않도록 반드시 설정해야 합니다.

# 1. 비밀번호를 파일에 저장합니다. (파일명은 자유롭게 지정 가능)
echo "my_super_secret_password" > mysql_root_password.txt

# 2. .gitignore 파일에 해당 파일명을 추가하여 커밋을 방지합니다.
echo "mysql_root_password.txt" >> .gitignore

 

 

2. docker-compose.yml 수정
이제 docker-compose.yml 파일을 다음과 같이 수정합니다.

# docker-compose.yml (secrets 적용)
version: "3.9"

services:
  mysql:
    container_name: mysql
    image: mysql:8.0.33
    environment:
      # 비밀번호 파일이 마운트될 컨테이너 내부 경로를 지정합니다.
      MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
      MYSQL_DATABASE: test
    secrets:
      # 이 서비스에서 사용할 시크릿의 이름을 지정합니다.
      - db_root_password

# 최상위 레벨에서 사용할 시크릿을 정의합니다.
secrets:
  db_root_password:
    # 호스트(로컬)에 있는 실제 비밀번호 파일의 경로를 지정합니다.
    file: ./mysql_root_password.txt

 

secrets 동작 원리

  1. 시크릿 정의 (Top-level secrets): docker-compose.yml 최상단 레벨의 secrets 블록은 Docker가 사용할 시크릿의 이름(db_root_password)과 해당 시크릿의 소스( file: ./mysql_root_password.txt)를 정의합니다.
  2. 서비스에 시크릿 할당 (Service-level secrets): mysql 서비스 내의 secrets 블록은 위에서 정의한 db_root_password라는 시크릿을 이 서비스에서 사용하겠다고 선언합니다.
  3. 컨테이너 내 마운트: docker compose up으로 컨테이너가 실행되면, Docker는 mysql_root_password.txt 파일의 내용을 읽어와 컨테이너 내부의 /run/secrets/db_root_password 경로에 파일로 생성(마운트)합니다. 파일 이름은 시크릿 이름(db_root_password)으로 결정됩니다.
  4. 환경 변수 참조: mysql 컨테이너는 MYSQL_ROOT_PASSWORD_FILE 환경 변수에 지정된 경로(/run/secrets/db_root_password)에서 비밀번호 파일을 읽어와 루트 비밀번호로 사용합니다.

이 방식을 통해 비밀번호와 같은 민감한 정보는 Git 저장소에서 안전하게 분리하면서, 컨테이너에는 문제없이 전달할 수 있습니다.

 

 


 

 

 

 

3.4.4 완벽한 대책은 없다: 다층적 보안

secrets는 매우 효과적인 방법이지만, 이것만으로 모든 보안 문제가 해결되지는 않습니다. 안전한 시스템을 구축하려면 다음과 같은 다층적 보안 전략을 함께 고려해야 합니다.

  • 감시 및 탐지: 보안 정보의 비정상적인 사용을 감지하기 위한 로그 모니터링 및 이상 탐지 시스템을 구축합니다.
  • 신속한 대응: 자격 증명이 유출되었을 경우, 이를 신속하게 무효화하고 교체(rotation)할 수 있는 절차를 마련합니다.
  • 임시 자격 증명: 가능하다면 만료 시간이 짧은 임시 자격 증명을 사용하여 유출 시 피해를 최소화합니다.

이처럼 여러 보안 기법을 조합하여 컨테이너 환경의 보안 수준을 지속적으로 높여나가는 것이 중요합니다.

728x90