← 목록으로
📅 2026.05.14
Docker 보안: AppArmor 및 환경변수(envset) 암호화 최적화
TechStudyContainerSecurityAppArmorEnv

가상머신(VM)과 달리 컨테이너는 호스트의 운영체제 커널을 공유하기 때문에 격리성 측면에서 보안 취약점이 존재할 수 있습니다. 이를 방어하기 위한 강력한 수단들을 적용해야 합니다.


1. AppArmor를 통한 Root 권한 공격 억제

AppArmor(Application Armor)는 프로그램이나 컨테이너가 접근할 수 있는 파일, 네트워크, 권한을 강제로 제한하는 리눅스 커널 보안 모듈입니다.

  • 배경: 컨테이너 내부에서 root 권한을 탈취당할 경우, 컨테이너 탈옥(Container Breakout)을 통해 호스트 시스템 전체가 장악될 위험이 있습니다.
  • Docker 기본 보안: Docker는 실행 시 기본적으로 docker-default라는 자체 AppArmor 프로파일을 적용하여, 컨테이너 내부에서 커널 수정이나 디바이스 노드 마운트와 같은 치명적인 행위를 차단합니다.
  • 커스텀 보안 프로파일 적용 (docker.io 공식 튜토리얼 기준): 더 엄격한 제어가 필요한 경우, 커스텀 프로파일을 작성하여 먼저 호스트 시스템에 로드한 뒤 컨테이너에 적용해야 합니다.
    # 1. 호스트 커널에 AppArmor 프로파일 로드
    sudo apparmor_parser -r -W my-custom-profile
     
    # 2. 해당 프로파일을 지정하여 컨테이너 실행
    docker run --rm -it --security-opt apparmor=my-custom-profile hello-world

2. 안전한 환경변수(Env) 및 Secret 관리 기법

DB 접속 비밀번호나 API 키 같은 민감한 정보(Credentials)를 하드코딩하거나 런타임 명령어에 직접 노출하는 것은 해킹의 주된 표적이 됩니다.

[위험한 방식]
명령어 이력(History)에 평문으로 남기 때문에 절대 사용해서는 안 됩니다.

docker run -e DB_PASSWORD=mySecret123 my_app

[안전한 방식]

  1. 환경변수 파일 분리 (--env-file) 보안이 유지되는 공간에 .env 파일을 작성하고 주입합니다.
    docker run --env-file ./secure_envset.env my_app
  2. Docker Secrets 활용 (Swarm 모드 공식 가이드 기준) 클러스터 환경에서는 해싱 및 암호화되어 분산 저장되는 자체 Secret 관리 기능을 사용하여, 컨테이너가 구동될 때 인메모리 파일시스템(/run/secrets/)에만 주입되도록 구성합니다.
    # 1. 평문 노출 없이 안전하게 시크릿 생성
    echo "mySecret123" | docker secret create db_password -
     
    # 2. 서비스를 띄우며 시크릿 주입
    docker service create --name my_db --secret db_password mysql:latest
  3. 외부 KMS(Key Management Service) 연동 최고 수준의 보안 환경에서는 AWS KMS, HashiCorp Vault와 같은 도구를 활용하여, 애플리케이션 코드가 기동될 때 실시간으로 암호화된 토큰을 받아 인증하는 방식을 취합니다.