암호학에서의 Kerckhoff의 원칙을 간접적으로 해석하면, 암호 시스템은 키를 제외한 시스템의 모든 것이 공격자에게 알려져도 안전해야 한다는 의미입니다.
이 원칙은 현대 보안의 중요한 진실, 즉 은폐가 반드시 보호를 의미하지 않는다는 사실의 기반이 됩니다. 마찬가지로, 현대 소프트웨어 배포에서 강력한 도구인 컨테이너화는 올바르게 구현될 경우 네트워크 내에서의 수평 이동을 방지할 수 있지만, 컨테이너 내부의 애플리케이션이 침해되는 것을 막지는 못합니다.
컨테이너는 편의성을 제공하지만, 강력한 보안이 없다면 위험도 함께 내포합니다. 놀랍지 않게도, 운영 환경에서 실행 중인 컨테이너 이미지의 60%가 알려진 취약점으로 가득 차 있어 사이버 위협에 대한 열린 문을 제공합니다.
그렇다면 컨테이너를 잠재적 침해로부터 어떻게 보호할 수 있을까요? 그 해답은 모든 계층의 취약점을 다루는 포괄적인 컨테이너 보안 체크리스트에서 시작되며, 어떠한 취약점도 노출되지 않도록 보장합니다.
이 글에서는 컨테이너 보안 체크리스트와 컨테이너를 안전하게 보호하는 데 도움이 되는 몇 가지 모범 사례를 공유합니다.
컨테이너 보안이란?
컨테이너 보안은 컨테이너화된 애플리케이션과 이를 지원하는 인프라를 라이프사이클 전반에 걸쳐 취약점과 위협으로부터 보호하는 과정입니다.
여기에는 컨테이너 엔진, 호스트 운영 체제, 오케스트레이션 플랫폼(예: Kubernetes)에서 컨테이너 자체에 이르기까지 전체 스택의 보안이 포함됩니다.
컨테이너 보안의 핵심 요소는 베이스 이미지부터 컨테이너 내 애플리케이션 코드까지 지속적인 스캔입니다.
공격을 나타낼 수 있는 런타임 위험을 적극적으로 모니터링하고, 사용하는 컨테이너 이미지가 신뢰할 수 있는 소스에서 가져온 것이며 알려진 취약점이 없는지 확인해야 합니다.
또한 컨테이너의 격리를 완벽하게 실행해야 합니다. 권한 상승, 잘못 구성된 네트워크 등 약점이 없는지 이중으로 확인하십시오.
환경에서 위협을 적극적으로 제거하기 위해 취할 수 있는 여러 가지 추가 조치가 있습니다. 다양한 관행, 도구, 정책을 포함하는 강력한 컨테이너 보안 프로토콜 또는 체크리스트를 통해 개발, 배포, 런타임, 폐기에 이르는 전체 컨테이너 라이프사이클을 보호할 수 있습니다.
컨테이너 보안 체크리스트의 중요성
컨테이너 환경은 수많은 구성 요소가 얽혀 있는 미로와 같습니다. 이들의 보안을 관리하려면 체계적인 시스템이 필요합니다. 가이드라인이나 체크리스트를 준비해두면 완전히 보안이 적용된 Docker 또는 Kubernetes 컨테이너를 성공적으로 배포하는 데 걸리는 시간을 단축할 수 있습니다.
시간 절약 외에도 보안 체크리스트는 여러 가지 이점이 있습니다:
- 표준화: 컨테이너 라이프사이클의 모든 단계를 표준화하는 것은 일관성을 보장하고 치명적인 실수를 방지하는 데 핵심입니다. 여러 사람이 함께 작업할 때는 항상 인적 오류의 가능성이 있습니다. 작업에 대한 명확한 가이드라인을 마련하면 모두가 같은 방향으로 움직이고 원활하게 운영할 수 있습니다.
- 포괄적 커버리지: 컨테이너화된 환경에는 이미지, 레지스트리, 네트워크, 런타임 등 여러 구성 요소가 있습니다. 이러한 요소들이 시스템에 도입되기 전에 점검하는 것이 필수적입니다. 여기에는 이미지 스캔, 접근 제어, 네트워크 분리, 런타임 모니터링 등이 포함될 수 있습니다.
- 효율성과 일관성: 체크리스트는 보안이 적용된 컨테이너를 보장하는 또 다른 단계로, 운영의 효율성과 일관성을 높여줍니다. 또한 팀원들이 보안 모범 사례를 참고할 수 있어 누락되는 단계를 줄일 수 있습니다.
- 컴플라이언스: 사이버 위협과 데이터 유출이 증가함에 따라 정부 및 규제 기관은 엄격한 규제 요건을 마련하고 있습니다. 잘 정의된 컨테이너 보안 체크리스트는 역할 기반 접근 제어(RBAC), 이미지 스캔, Docker 및 Kubernetes의 CIS 벤치마크 준수와 같은 모범 사례를 강제 적용함으로써 컴플라이언스를 보장합니다. 또한 로그 및 모니터링을 통해 감사 요건을 충족하고 GDPR, HIPAA, PCI-DSS와 같은 프레임워크의 요구사항을 만족시킵니다.
- 사전적 위협 완화: 컨테이너 라이프사이클 전체를 두 번 점검하는 것은 항상 좋은 생각이며, 체크리스트가 이를 도와줍니다. 첫 번째 점검은 모든 보안 조치가 적용되었는지 확인하고, 두 번째 점검은 누락된 구성이나 새롭게 등장한 위협을 배포 전에 발견하는 검증 단계로 작동합니다.
10가지 주요 컨테이너 보안 체크리스트
컨테이너 보안 체크리스트의 중요성을 확인했으니, 이제 어떤 보안 점검을 반드시 구현해야 하는지 자세히 살펴보겠습니다.
다음은 Docker 및 Kubernetes 보안 체크리스트로, 보안 프로토콜에 반드시 포함해야 할 모든 단계를 간결하게 정리한 것입니다:
이미지 보안
- 공식 저장소에서 신뢰할 수 있고 검증된 베이스 이미지를 사용하십시오.
- 이미지를 레지스트리에 푸시/풀할 수 있는 대상을 제한하십시오.
- 컨테이너 이미지를 정기적으로 취약점 스캔하십시오.
- 취약한 이미지의 배포를 차단하거나 네트워크 접근을 제한하십시오.
- 이미지 푸시 전에 키나 토큰과 같은 민감한 데이터를 탐지하십시오.
- 이미지는 반드시 필요한 종속성만 포함하도록 최소화하십시오.
- 자동화된 이미지 패치 및 업데이트를 구현하십시오.
접근 및 권한
- 컨테이너를 루트 권한으로 실행하지 마십시오.
- 컨테이너가 과도한 권한을 획득하거나 불필요한 시스템 호출을 하지 못하도록 방지하십시오.
- 컨테이너와 사용자에 대해 최소 권한 원칙을 적용하십시오.
- 특정 파일이나 디렉터리를 수정할 수 있는 컨테이너를 제어하십시오.
- PodSecurity Admission을 사용하여 민감한 기능 및 리소스에 대한 접근을 제한하십시오.
- 역할 기반 접근 제어(RBAC)를 사용하여 중요한 API 엔드포인트 및 컨테이너 리소스 작업(`get`, `list`, `watch`, 또는 `secrets.`)에 대한 접근을 제한하십시오.
- 컨테이너 환경 접근 시 다중 인증(MFA)을 사용하십시오.
네트워크 보안
- 네트워크 분리(예: Docker 네트워크 정책)를 통해 컨테이너를 격리하십시오.
- 공개 서비스는 다양한 포트와 프로토콜에서 트래픽을 필터링하여 보호하십시오.
- 전송 중인 데이터는 암호화 통신(예: TLS)을 사용하십시오.
- 서비스 메시 및 딥 패킷 인스펙션을 통한 7계층 제어로 HTTP/HTTPS 정책을 적용하십시오.
- 3, 4계층 트래픽은 IP 기반 및 포트 기반 접근 제어로 제한하십시오.
- 선택한 Container Network Interface(CNI) 플러그인이 Kubernetes 네트워크 정책을 지원하는지 인증하십시오.
- 모든 워크로드에 인그레스 및 이그레스 네트워크 정책을 적용하고, 기본적으로 모든 트래픽을 거부하는 정책을 설정하십시오.
- 중요 구성 요소(Kubernetes API, Kubelet API 등)가 공개적으로 노출되지 않도록 하십시오.
- 트래픽을 암호화하고, 클러스터 내 워크로드 통신 인증을 위해 Mutual TLS(mTLS)를 사용하십시오.
런타임 보안
- 컨테이너 런타임 동작을 모니터링하여 의심스러운 활동을 탐지하십시오.
- Linux 보안 모듈을 사용하여 컨테이너의 호스트 리소스 접근을 제한하십시오.
- 서비스 거부(DoS) 공격을 방지하기 위해 리소스 제한(CPU, 메모리)을 적용하십시오.
- 실행 중인 컨테이너를 변조하지 못하도록 런타임 API 및 데몬 접근을 제한하십시오.
- 모든 컨테이너 활동을 실시간으로 로깅 및 감사하십시오.
취약점 및 패치 관리
- 컨테이너와 호스트 시스템을 정기적으로 취약점 스캔하십시오.
- 지속적 통합 파이프라인에서 구성 파일의 컴플라이언스를 스캔하고, 보안 오구성 자동 점검을 통합하십시오.
- 이미지 서명(Docker Content Trust)을 사용하여 컨테이너 이미지의 무결성을 검증하십시오.
- 정적 코드 분석을 수행하여 애플리케이션 코드 및 종속성의 취약점을 식별하십시오.
비밀 관리
- 민감한 데이터(API 키, 비밀번호 등)는 비밀 관리 도구에 저장하십시오.
- 컨테이너 이미지나 환경 변수에 비밀을 하드코딩하지 마십시오.
- 비밀 API 접근 권한을 주기적으로 감사 및 검토하고, 암호화 키를 주기적으로 교체하십시오.
- 추가 보호를 위해 Kubernetes API 서버를 구성하여 etcd 내 비밀 데이터를 암호화하여 저장하십시오.
- 토큰 만료 기간을 짧게 설정하여 토큰이 유출될 경우 영향을 최소화하십시오.
오케스트레이션 보안
- 강력한 접근 제어로 컨테이너 오케스트레이터(예: Docker)를 보호하십시오.
- 역할 기반 접근 제어(RBAC)를 활성화하고, 사용자 및 서비스 계정에 최소 권한을 보장하십시오.
- 오케스트레이터 서비스 정의 및 구성을 버전 관리(예: Git)로 관리하십시오.
- 오케스트레이터 제어 플레인에 대한 모든 API 요청에 대해 로깅을 활성화하십시오(예: Kubernetes 감사 로그).
안전한 구성
- 컨테이너에서 불필요한 서비스나 포트를 비활성화하십시오.
- 쓰기 접근이 필요 없는 컨테이너에는 읽기 전용 파일 시스템을 사용하십시오.
- 가능한 경우 컨테이너를 무상태(stateless) 및 불변(immutable)으로 유지하십시오.
백업 및 재해 복구
- 컨테이너 구성 및 애플리케이션 데이터를 정기적으로 백업하십시오.
- etcd 스냅샷 저장 명령을 활용하여 시점 백업을 수행함으로써 백업의 일관성을 보장하십시오.
- 클러스터 구성 요소를 의도적으로 실패시키는 재해 시뮬레이션을 수행하고, 복구 프로세스가 정상적으로 작동하는지 검증하십시오.
컴플라이언스 및 감사
- 업계 보안 표준(예: GDPR, PCI-DSS) 준수를 보장하십시오.
- 컨테이너 보안 정책, 로그, 접근 제어 구성을 정기적으로 감사하십시오.
- 컨테이너 환경에 대해 정기적으로 보안 침투 테스트를 수행하십시오.
컨테이너 보안 모범 사례
컨테이너 보안 체크리스트를 제공했지만, 컨테이너화된 환경을 강화하는 몇 가지 컨테이너 보안 모범 사례는 다음과 같습니다:
- 신뢰할 수 있는 베이스 이미지 사용: 컨테이너의 기반은 이미지입니다. 반드시 신뢰할 수 있는 소스에서 이미지를 확보하십시오. 또한 자동 이미지 스캔 및 정기 패치 도구를 선택하십시오. CI/CD 파이프라인에 직접 통합되는 도구를 사용하여 각 단계에서 베이스 이미지를 점검하십시오.
- 최소 권한 원칙 적용: 컨테이너 권한을 제한하십시오. 컨테이너를 루트로 실행하지 말고, 시스템 리소스 접근을 제한하여 잠재적 위협 벡터를 사전에 차단하십시오. CIS 벤치마크를 활용해 호스트 OS를 강화하고, SentinelOne과 같은 도구를 사용해 시스템 콜 수준에서 공격 표면을 줄이십시오. 이는 컨테이너가 호스트 커널을 공유하기 때문에 중요합니다.
- 코드형 인프라(IaC) 보안: 위험한 구성이 운영 환경에 도달하지 않도록, Kubernetes 매니페스트와 같은 IaC 템플릿을 사용해 정책 위반 및 오구성(과도하게 허용된 IAM 역할, 노출된 포트 등)을 배포 전에 스캔하십시오.
- 클라우드 구성 강화: VPC 및 프라이빗 네트워크를 통한 클라우드 리소스 격리, 최소 권한 접근 제어로 클라우드 서비스를 강화하십시오. 오픈된 S3 버킷, 노출된 관리 인터페이스 등 클라우드 오구성에 대한 지속적 모니터링을 구현하십시오.
- 외부 취약점 감소: 빌드 시 주로 발견되는 서드파티 종속성의 취약점은 애플리케이션의 약점이 될 수 있습니다. OS 및 애플리케이션 종속성 모두에 대해 알려진 CVE 자동 스캔을 적용하십시오. 라이브러리와 패키지를 정기적으로 업데이트하십시오.
- 오케스트레이터 및 런타임 벤치마크 제어: Kubernetes Admission Controller와 같은 오케스트레이터 보안 제어를 사용해 배포 전 보안 정책을 적용하십시오. Kubernetes CIS 벤치마크 등 런타임 벤치마크 점검을 통해 오케스트레이터와 실행 중인 컨테이너를 정기적으로 감사하십시오.
- 네트워크 분리: 컨테이너 트래픽을 제어하는 정책을 생성 및 적용하여 공격 표면을 축소하십시오. 컨테이너화된 워크로드의 마이크로 세분화는 침해 시 영향을 제한하고 네트워크 보안을 강화합니다.
- 리소스 제한: 각 컨테이너의 CPU, 메모리, 스토리지에 리소스 제한을 적용하여 시스템 리소스 고갈을 방지하십시오. 시스템 리소스가 소진되면 서비스 장애 및 기타 운영 문제로 이어질 수 있습니다.
- 활동 모니터링 및 로깅: 실시간으로 보안 위협에 대응해야 합니다. 컨테이너 동작에 대한 가시성을 제공하는 도구를 도입하여 위협을 신속하게 식별 및 완화하십시오.
- CI/CD 파이프라인 보안: 컨테이너 라이프사이클의 모든 단계(코드 커밋부터 배포까지)에서 보안 점검을 통합하여 CI/CD 파이프라인을 보호하십시오. 이를 통해 개발 과정에서 취약점이 유입되는 것을 방지할 수 있습니다.
- 보안 업데이트 자동화: 자동화 도구를 사용해 컨테이너 및 오케스트레이터에 보안 패치와 업데이트를 적용하면서 다운타임 없이 운영하십시오.
- 컴플라이언스 및 정책 적용: 조직 및 규제 정책 준수를 위해 컨테이너를 정기적으로 감사하십시오. 정책 적용 도구를 사용해 환경 전반에 보안 정책을 적용하고, 일관된 보안 표준과 컴플라이언스를 유지하십시오.
피해야 할 일반적인 컨테이너 보안 실수
2019년 2월, Docker 팀은 CVE-2019-5736 취약점을 공개적으로 발표했습니다. 이 취약점으로 인해 공격자는 호스트의 바이너리를 덮어쓰고, 호스트 시스템에 접근하여 컨테이너 내에서 루트 권한으로 명령을 실행할 수 있었습니다.
AWS, RedHat, Microsoft Azure 등 여러 조직도 이 취약점을 발견하고 자사 제품에 패치를 적용했습니다.
2021년에는 CVE-2021-3490 취약점이 Linux 커널의 eBPF(확장 버클리 패킷 필터) 관련 결함을 악용했습니다.
이 취약점으로 인해, Kubernetes의 기본 seccomp 프로파일을 통해 eBPF에 접근할 수 있는 침해된 컨테이너 내에서 공격자가 호스트에서 임의 코드를 실행할 수 있었습니다. 이러한 프로파일은 필요한 시스템 호출을 제한하지 않아 일부 환경이 노출되었습니다.
이러한 사례는 컨테이너 보안에서의 작은 실수가 애플리케이션의 무결성을 훼손하고 환경을 위험에 노출시킬 수 있음을 보여줍니다.
주의해야 할 기타 일반적인 컨테이너 보안 실수는 다음과 같습니다:
- 공개 이미지는 안전하다고 가정하면 배포가 침해될 수 있습니다. 경험 많은 개발자가 철저히 검토하지 않은 외부 이미지는 절대 신뢰하지 마십시오.
- 컨테이너를 너무 많은 오픈 채널에 노출하면 공격 표면이 증가합니다. 루트 권한으로 컨테이너를 노출하지 말고, 네트워크 상의 상호작용에서 약점을 점검하십시오.
- 컨테이너에 통합하기 전에 코드 라이브러리의 취약점 검증 및 스캔을 소홀히 함
- 정확한 로깅 기록을 유지하지 않으면 보안 문제를 신속하게 파악하기 어렵습니다.
- 빌드 및 배포 중 보안 점검을 생략하는 등 CI/CD 파이프라인 보안을 무시하면 개발 초기에 취약점이 유입될 수 있습니다.
SentinelOne 컨테이너용 클라우드 워크로드 보안
모든 컨테이너화된 환경을 효과적으로 보호하려면 모든 노드에 걸친 통합 전략이 필요합니다. Q2는 1,200개 이상의 은행, 조합, 금융 기관에 서비스를 제공하는 선도적인 금융 서비스 제공업체입니다. 2,200만 명 이상의 최종 사용자와 퍼블릭 클라우드에서 65,000개의 컨테이너를 운영하는 Q2는 SentinelOne의 컨테이너용 클라우드 워크로드 보안을 모든 환경에 배포했습니다. Q2와 마찬가지로, 귀하도 이 솔루션의 다양한 기능과 이점을 활용하여 이상 징후를 신속히 파악하고 강력한 보안 태세를 유지할 수 있습니다.
주요 기능 및 이점
- AWS, Azure, GCP, 온프레미스 데이터 센터 등 멀티 클라우드 환경 전반에 걸친 포괄적 하이브리드 클라우드 워크로드 보호
- 랜섬웨어, 제로데이 익스플로잇, 암호화폐 채굴, 파일리스 공격 차단
- eBPF 기반 에이전트 아키텍처로 운영 체제 프로세스 수준의 실시간 가시성 제공, 커널 모듈에 의존하지 않고 심층 텔레메트리 제공
- 5억 개 이상의 악성코드 시그니처 데이터셋을 활용한 파일 아키텍처 분석용 정적 AI 엔진
- 시간적 분석을 통해 정적 탐지를 우회할 수 있는 악성 행위를 탐지하는 행동 기반 AI 엔진
- 서버, VM, 컨테이너, Kubernetes 전반에서 머신 속도의 공격 실시간 탐지
- 자동 복구로 최대 워크로드 가용성 보장
- 조사 및 IR 가속화, 위협 헌팅 지원
- 워크로드 플라이트 데이터 레코더TM
- 운영에 지장을 주지 않는 런타임 보안으로 혁신 가속화
- 커널 종속성 없음. 낮은 CPU 및 메모리 오버헤드
- 안정성과 성능을 위한 eBPF 아키텍처
- Docker, 컨테이너, cri-o 런타임 지원
- 자동 확장 보호
- 실시간 CWPP
- 셀프 매니지드 및 매니지드 K8s 서비스 지원
- Amazon Linux 2023을 포함한 14개 주요 Linux 배포판 지원
- Snyk과의 통합(별도 구매)
또한 SentinelOne의 Cloud-Native Application Protection Platform(CNAPP)은 Kubernetes Security Posture Management(KSPM) 및 Cloud Security Posture Management(CSPM)와 같은 기능을 통해 컨테이너 보안을 강화하고, 클라우드 네이티브 애플리케이션의 컴플라이언스 및 보안을 보장합니다.
서버, VM, 컨테이너를 위한 AI 기반 클라우드 워크로드 보호(CWPP)로, 런타임 위협을 실시간으로 탐지하고 차단합니다.
자주 묻는 질문
컨테이너 보안을 보장하려면 여러 계층을 포괄하는 광범위한 접근 방식이 필요합니다. 다음과 같이 시작하십시오:
- 신뢰할 수 있는 베이스 이미지를 사용하고, 취약점을 자주 스캔하며, 이미지를 최소화하여 공격 표면을 줄이십시오.
- 최소 권한 원칙을 적용하여 컨테이너에 필요한 권한만 부여하고, 절대 root 권한으로 실행하지 마십시오.
- 컨테이너 활동을 실시간으로 지속적으로 모니터링하여 의심스러운 행동을 탐지하고, 빌드부터 런타임까지 모든 단계에서 취약점 스캔을 수행하십시오.
- 마지막으로, 호스트와 오케스트레이터에 보안 패치와 네트워크 정책을 적용하여 컨테이너 간 통신을 제한하고 잠재적 위협을 줄이도록 적절히 강화하십시오.
Container Security Initiative (CSI)는 일곱 가지 주요 요소로 구성됩니다. 여기에는 다음이 포함됩니다:
- 이미지 스캔
- 런타임 보호
- 접근 제어
- 네트워크 보호
- 컴플라이언스 관리
- 모니터링
- 사고 대응
SentinelOne Singularity Cloud Workload Security (CWS) 플랫폼은 컨테이너 보안에서 중요한 역할을 합니다. 이 플랫폼은 컨테이너화된 애플리케이션을 전체 수명 주기 동안 보호합니다. 런타임 보호를 자동화하고, 취약점을 관리하며, 컴플라이언스를 강제합니다. Kubernetes 및 기타 시스템과 연동하여 퍼블릭 및 프라이빗 클라우드 모두에서 컨테이너를 실시간으로 가시화하고 보호합니다.
컨테이너 보안 라이프사이클은 다섯 가지 주요 단계로 구성됩니다:
- 이미지 보안: 안전하게 검증된 이미지를 사용하고, 취약점을 찾기 위해 자주 점검합니다.
- 빌드 보안: 컨테이너 빌드 프로세스가 안전한 규칙과 방법을 준수하도록 합니다.
- 배포 보안: 컨테이너를 배포할 때 보안 규칙을 적용하고, 최소 권한을 부여하며, 안전한 네트워크를 구성합니다.
- 실행 보안: 컨테이너에서 이상 행동을 모니터링하고, 실행 시 보안 규칙을 적용하며, 네트워크를 분리합니다.
- 폐기: 모든 민감한 데이터를 완전히 삭제하여 컨테이너를 사용 중지합니다.

