Docker는 “내 컴퓨터에서만 동작한다”는 문제를 해결하며 애플리케이션과 마이크로서비스의 개발 및 배포를 용이하게 만들었습니다. 그러나 이식성과 효율성과 같은 이점을 제공하는 동시에, 컨테이너는 고유한 보안 과제를 야기할 수 있습니다. 따라서 컨테이너 보안에 대한 지식은 매우 중요합니다. 이는 컨테이너를 취약점과 악의적인 공격으로부터 보호하여 컨테이너화된 애플리케이션의 무결성, 기밀성, 가용성을 보장하는 데 도움이 됩니다.
이 게시물에서는 Docker 컨테이너 보안이 무엇인지 설명하고, 컨테이너를 안전하게 보호하기 위한 팁을 제공합니다.
Docker 컨테이너 보안이란?
Docker 컨테이너 보안은 Docker 컨테이너와 애플리케이션 실행을 위한 격리된 환경을 취약점, 위협, 악의적 공격으로부터 보호하기 위한 권장 방법과 기술을 따릅니다. 이는 컨테이너의 공유 커널 아키텍처를 악용하거나 컨테이너 설정의 잘못된 구성으로 인한 잠재적 보안 침해에 대해 강력한 방어를 구축하는 것을 목표로 합니다. 컨테이너 자체뿐만 아니라 컨테이너가 실행되는 호스트 시스템, 통신하는 네트워크, 관리 및 오케스트레이션에 사용되는 프로세스까지 모두 보호하는 것을 포함합니다.
Docker 컨테이너 보안이 중요한 이유
컨테이너가 중요한 애플리케이션과 서비스를 배포하는 데 점점 더 많이 사용됨에 따라, 이러한 환경의 보안은 매우 중요한 요소가 되고 있습니다. 컨테이너 보안을 올바르게 적용하면 위협으로부터 보호할 뿐만 아니라 다양한 컴플라이언스 요구사항을 준수할 수 있으며, 데이터 유출이나 서비스 중단의 가능성을 낮출 수 있습니다.
일반적인 Docker 컨테이너 보안 과제/위험
다음은 일반적인 Docker 컨테이너 보안 과제입니다.
1. 취약한 이미지
컨테이너는 소프트웨어를 이미지로 패키징하지만, 각 이미지는 일반적으로 다른 소프트웨어 패키지를 포함하고 있으며, 이들 각각이 위험을 초래할 수 있습니다. 여기에는 구식 시스템 라이브러리부터 취약점이 있는 애플리케이션 수준의 종속성까지 포함될 수 있습니다. 오래되었거나 신뢰할 수 없는 Docker 이미지를 사용할 경우 취약점이 유입되어 시스템이 공격에 노출될 수 있습니다.
2. 컨테이너 탈출
컨테이너 탈출은 공격자가 컨테이너를 벗어나 호스트 시스템이나 다른 컨테이너로 이동할 수 있는 보안 상황입니다. 이는 컨테이너의 공유 물리적 커널, 커널 버그, 컨테이너 내 권한 설정 오류, 컨테이너 런타임의 문제 등으로 인해 발생할 수 있습니다.
3. 잘못 구성된 네트워크 설정
네트워크에서 컨테이너를 다룰 때 일부 잘못된 구성은 서비스 노출, 수평 이동 기회, 컨테이너 경계 초월 및 다른 컨테이너에 대한 무단 접근 등으로 이어질 수 있습니다. 잘못된 네트워크 구성은 컨테이너가 무단 접근이나 공격에 노출될 수 있습니다.
4. 보안에 취약한 데몬 설정
보안에 취약한 데몬 설정은 무단 접근, 권한 상승, 심지어 시스템 전체의 손상으로 이어질 수 있습니다. Docker 데몬을 보호하려면 권한 설정, API 엔드포인트의 TLS 암호화, 강력한 인증 메커니즘 구현, 구성의 정기적 감사 등 여러 측면을 고려해야 합니다.
5. 노출된 시크릿 및 환경 변수
컨테이너화된 환경이 증가함에 따라 시크릿 및 민감한 구성 데이터 관리 문제가 커지고 있습니다. 이러한 시크릿이 Dockerfile에 하드코딩되거나 환경 변수로 전달될 경우, Docker 이미지의 레이어, 로그, 실행 중인 컨테이너의 검사 등을 통해 의도적이거나 우발적으로 노출될 수 있습니다.
6. 커널 취약점
컨테이너는 동일한 커널을 사용하므로, 커널 수준의 문제는 항상 모든 컨테이너에 적용됩니다. 이 문제를 해결하려면 커널에 대한 즉각적인 보안 업데이트 적용, 커널 파라미터 조정, 커널 하드닝 기능 등 예방 조치가 필요합니다.
7. 컨테이너 간 무제한 통신
컨테이너는 다른 컨테이너와 자유롭게 통신할 수 있습니다. 이는 많은 사용 사례에서 편리하지만, 동시에 심각한 보안 위험을 초래할 수 있습니다. 하나의 컨테이너가 손상되면 공격자가 동일 네트워크 내의 다른 컨테이너를 표적으로 삼을 수 있습니다.
Docker 컨테이너 보안 모범 사례
Docker 컨테이너를 안전하게 보호하기 위한 모범 사례는 다음과 같습니다.
#1. Docker 사용 전
Docker 컨테이너는 호스트 시스템과 커널을 공유하므로, 호스트의 취약점이 컨테이너에 영향을 줄 수 있습니다. 따라서 보안이 강화된 운영체제를 사용하면 공격 표면이 줄어듭니다. Docker 컨테이너는 컨테이너 워크로드 전용의 전용 호스트에서 실행하고, 다른 애플리케이션이나 서비스와 공유하지 않는 것이 좋습니다. 이는 Docker 환경과 호스트의 다른 워크로드 간 간섭이나 보안 침해 가능성을 최소화합니다. 호스트 시스템의 커널을 정기적으로 업데이트하고 보안 패치를 신속하게 적용하십시오. 장기 지원(LTS) 커널 버전 사용을 고려하십시오.
#2. Docker 이미지 보안 강화
이미지는 컨테이너의 기반이 되므로, 보안이 강화된 이미지를 사용하면 취약점과 위협 노출을 최소화할 수 있습니다. 항상 Docker Hub의 Verified Publisher 또는 프라이빗 레지스트리 등 신뢰할 수 있는 소스의 공식 또는 검증된 Docker 이미지를 사용하십시오. 신뢰할 수 있는 조직은 공식 이미지를 유지 관리하고, 정기적으로 업데이트하며, 보안 검사를 수행하므로 취약점 위험이 줄어듭니다. 최소한의 베이스 이미지를 사용하고 필수 종속성과 도구만 포함하십시오. 구성 요소가 적을수록 취약점과 보안 결함의 가능성이 줄어듭니다.
#3. 이미지 및 컨테이너 스캔
전용 스캐닝 도구를 사용하여 Docker 이미지와 컨테이너의 알려진 취약점을 검사하십시오. 스캐닝을 컨테이너 라이프사이클의 일상적인 부분으로 만드십시오. 소프트웨어 라이브러리와 종속성에서 새로운 취약점이 지속적으로 발견되고 있습니다. 정기적인 스캔을 통해 조직은 이러한 문제를 프로덕션 환경에서 악용되기 전에 식별하고 해결할 수 있습니다. Trivy 또는 Docker Scout와 같은 도구를 사용할 수 있습니다.
#4. Docker 컨테이너 내 시크릿 관리
시크릿이 이미지의 일부가 되면, 해당 이미지에 접근할 수 있는 누구나 시크릿을 획득할 수 있습니다. 시크릿을 하드코딩하지 말고, 이미지 외부에서 환경 변수, Docker Secrets, 외부 시크릿 관리 도구를 통해 관리하십시오. Docker Swarm 모드에서는 Docker Secrets를 사용하여 민감한 정보를 안전하게 관리할 수 있습니다. 시크릿을 암호화하고, 필요한 컨테이너에만 노출하여 환경 변수나 파일보다 더 안전하게 보호하십시오. 환경 변수는 런타임에만 안전하게 전달하고, 버전 관리 시스템에 커밋하지 마십시오.
#5. 모니터링 및 로깅
Docker 리소스에 대한 접근을 정기적으로 모니터링 및 감사하여 무단 접근 시도를 탐지하고 보안 정책 준수를 보장하십시오. 모니터링과 감사는 의심스러운 활동을 식별하고 Docker 환경 내에서 수행된 작업에 대한 책임성을 유지하는 데 도움이 됩니다. Docker의 내장 로깅 기능을 활성화하여 Docker API 및 사용자 작업에 대한 접근을 추적하십시오. 침입 탐지 시스템(IDS)을 배포하여 Docker 환경 내 네트워크 트래픽과 시스템 호출을 모니터링하고, 의심스러운 활동을 탐지하십시오. IDS는 잠재적 침해나 악의적 활동을 식별하고, 경고를 제공하며, 신속한 대응을 가능하게 합니다.
#6. 네트워킹 모범 사례
컨테이너를 격리하고, 방화벽을 사용하며, 컨테이너 간 트래픽을 보호함으로써 애플리케이션을 위한 견고한 네트워크 환경을 구축할 수 있습니다. Docker 컨테이너와 호스트에 대한 인바운드 및 아웃바운드 트래픽을 제어하기 위해 방화벽을 구현하십시오. 방화벽은 무단 접근을 방지하고, 필요한 포트와 서비스만 노출하도록 제한합니다. iptables와 같은 호스트 기반 방화벽이나 Docker 호스트의 방화벽을 사용하여 허용할 트래픽을 정의하는 규칙을 만드십시오. 컨테이너 간 트래픽은 공격 벡터가 될 수 있으므로, 이 트래픽을 보호하면 데이터 가로채기 및 무단 접근을 방지할 수 있습니다. 서비스 간 안전한 통신을 위해 TLS(전송 계층 보안)를 구현하십시오.
#7. 접근 제어 및 인증
접근 제어와 인증은 Docker 환경을 보호하는 데 중요한 요소입니다. 이를 통해 오직 인가된 사용자와 시스템만 Docker 리소스에 접근할 수 있도록 보장합니다. Docker Content Trust(DCT)를 활성화하여 배포 시 서명된 이미지만 사용하도록 하십시오. Docker Content Trust는 이미지 서명 및 검증을 강제하여 검증되지 않은 이미지 사용을 방지합니다. 역할 기반 접근 제어(RBAC)를 사용하여 사용자와 팀이 특정 리소스에 접근할 수 있는 권한과 수행할 수 있는 작업을 관리하십시오. 역할을 생성할 때 최소 권한 원칙에 따라 권한을 할당하십시오. 또한 Docker API 접근을 제한하고, 인증 및 암호화를 구현하여 보안을 강화할 수 있습니다.
#8. 정기적인 유지보수 및 업데이트
정기적인 유지보수와 업데이트는 Docker 환경의 보안, 성능, 신뢰성을 유지하는 데 필수적입니다. Docker 및 종속성을 최신 상태로 유지하고, 정기적으로 보안 감사를 수행함으로써 취약점을 완화할 수 있습니다. 또한 Docker 환경에 대한 보안 감사를 정기적으로 수행하여 잠재적 취약점과 잘못된 구성을 식별하고 해결하십시오. 보안 감사는 Docker 컨테이너, 이미지, 구성의 보안 상태를 평가하고, 보안 정책 및 모범 사례 준수를 보장합니다.
#9. 사고 대응 및 완화
Docker 환경에서 보안 사고를 탐지, 대응, 복구하는 절차를 명확히 정의한 사고 대응 계획(IRP)을 수립하십시오. 잘 정의된 계획은 팀이 사고에 효과적으로 대응할 수 있도록 하여, 대응 시간을 최소화하고 침해의 영향을 줄입니다.
보안 침해 발생 시, 먼저 영향을 받은 컨테이너와 시스템을 격리하여 침해 확산을 방지하십시오. 그 다음, 임시 조치나 우회 방법을 적용하여 서비스가 계속 운영되도록 하면서 침해를 조사하고 해결합니다. 침해가 통제되면, 침해의 근본 원인을 식별하고, 손상된 이미지를 제거하거나 잘못된 구성을 수정하여 악성 아티팩트나 취약점을 제거합니다. 마지막으로, 클린 이미지로 컨테이너를 재구축하고, 백업 데이터를 복원하며, 재발 방지를 위해 필요한 업데이트를 적용하십시오.
Docker 컨테이너 보안을 위한 SentinelOne
SentinelOne은 컨테이너화된 환경을 대부분의 사이버 위협과 공격으로부터 보호합니다. Docker 컨테이너에 대한 실시간 보호, 가시성, 제어를 제공합니다. 다음은 Docker 컨테이너 보안을 위한 SentinelOne의 주요 기능과 이점입니다.
- 실시간 보호: SentinelOne은 컨테이너 런타임 보호 기능을 제공합니다. 따라서 공격, 악성코드, 무단 활동에 대한 실시간 탐지가 가능합니다.
- 컨테이너 가시성: 플랫폼은 컨테이너의 생성부터 네트워크 통신, 파일 시스템 내 변경 사항까지 컨테이너 동작에 대한 광범위한 가시성을 제공합니다.
- 자동화된 위협 탐지: SentinelOne의 AI 엔진은 잠재적 위협을 자동으로 탐지 및 차단하여 수동 분석의 필요성을 줄입니다.
- 컨테이너 오케스트레이션 통합: Docker, Kubernetes 등 다양한 컨테이너 오케스트레이션 도구를 지원하여 프로세스 및 관리가 용이합니다.
- 컴플라이언스 및 거버넌스: SentinelOne은 에이전트리스 취약점 관리 및 클라우드 감사 등 컴플라이언스 및 거버넌스 기능을 포함합니다.
- 네트워크 트래픽 제어: 기업은 Docker 컨테이너 및 네트워크 트래픽 정책을 정의하고, 컨테이너 수준에서 이를 적용할 수 있습니다.
- 파일 무결성 모니터링: SentinelOne은 컨테이너 파일 시스템에 대한 무단 접근을 모니터링하여, 컨테이너 내 애플리케이션의 무결성을 유지합니다.
- 엔드포인트 탐지 및 대응(EDR): SentinelOne은 컨테이너화된 애플리케이션에 연결된 모든 엔드포인트를 보호하여, 조직이 사고에 대응하고 복구할 수 있도록 지원합니다.
SentinelOne은 컨테이너를 활용해 구축된 클라우드 네이티브 애플리케이션을 보호하여, 마이크로서비스 기반 아키텍처의 무결성과 보안을 보장합니다. DevOps/CI/CD 파이프라인에 직접 통합되며, Docker 보안 보증을 제공하고, 컨테이너화된 애플리케이션에 대한 컴플라이언스 검사를 수행합니다. 또한, 컨테이너화된 데이터베이스의 비인가 접근을 방지하고, 권한 상승 시도를 차단합니다.
서버, VM, 컨테이너를 위한 AI 기반 클라우드 워크로드 보호(CWPP)로, 런타임 위협을 실시간으로 탐지하고 차단합니다.
자주 묻는 질문
신뢰할 수 있고 정기적으로 업데이트되는 베이스 이미지를 사용하고, 최소 권한 원칙을 따르며, 컨테이너를 비루트 사용자로 실행하고, 가능하다면 읽기 전용 파일 시스템을 사용하십시오.
Docker의 격리는 공격 표면을 줄일 수 있지만, 보안은 주로 올바른 구성, 정기적인 업데이트, 모범 사례 준수에 달려 있습니다.
Docker 컨테이너를 안전하게 중지하려면 docker stop 명령을 사용하십시오. 이 명령은 메인 프로세스에 SIGTERM 신호를 보내 정상적으로 종료할 수 있도록 합니다. 컨테이너가 10초 제한 시간 내에 중지되지 않으면 Docker는 SIGKILL 신호를 보내 강제로 종료합니다.


