컨테이너는 애플리케이션을 격리하고 배포하는 강력한 도구로, 가상 머신보다 가벼운 오버헤드를 제공합니다. 그러나 컨테이너의 보안 문제는 중요한 고려 사항이며, 이를 개선하기 위해 샌드박싱 기법을 활용할 수 있습니다. 이 글에서는 샌드박싱의 개념과 가상 머신과의 비교를 통해 컨테이너의 격리를 강화하는 방법을 살펴보겠습니다.
먼저, 가상 머신 (VM)이 어떻게 작동한느지 간단히 알아보겠습니다. 모든 VM은 물리적 인프라 위에 배포됩니다. 이는 충분한 RAM, 스토리지, 여러 CPU 코어를 갖춘 물리 서버를 필요로 합니다. 이 하드웨어에 운영 체제가 설치된 후, 타입2 하이퍼바이저(예: Oracle VirtualBox)나 기타 가상화 소프트웨어가 운영체제에 설치됩니다. 이후, 필요에 따라 RAM과 CPU 코어를 할당하여 여러 VM을 생성할 수 있습니다. 각 VM은 각기 다른 운영체제를 실행할 수 있으며, 각각 독립된 커널을 갖고 있습니다.
클라우드 환경에서도 마찬가지입니다. AWS, Azure, GCP 등 클라우드 제공업체에서 생성하는 모든 VM은 전용 커널을 사용합니다. 이는 동일한 물리적 인프라에서 실행되는 VM 간의 강력한 격리를 가능하게 하며, 멀티테넌트 환경에서 다양한 고객의 여러 환경을 안전하게 호스팅할 수 있게 됩니다.
가상 머신과 컨테이너의 주요 차이점 중 하나는 서버에서 실행되는 모든 컨테이너가 동일한 기본 커널을 공유한다는 것입니다. 호스트의 관점에서 보면, 컨테이너는 단지 또 다른 프로세스일 뿐이며, 호스트와 다른 컨테이너로부터 격리되어 있습니다. 이 격리는 프로세스 ID 네임스페이스를 통해 이루어집니다. 예를 들어, 1,000초 동안 대기하는 BusyBox 컨테이너를 실행하면, 컨테이너 내부에서는 하나의 PID를 가지지만, 호스트에서는 또 다른 PID를 가집니다. 이를 통해 컨테이너가 서로의 프로세스를 격리할 수 있습니다.
컨테이너 격리는 기본적으로 잘 작동하지만, 동일한 커널을 공유하는 특성상 보안 취약점이 존재합니다. 예를 들어, Dirty COW와 같은 커널 취약점을 이용하면 컨테이너를 탈출하여 호스트에 접근할 수 있습니다. 이러한 취약점으로 인해 손상된 컨테이너가 호스트에 백도어를 만들어 다른 컨테이너를 모두 손상시킬 수 있습니다. 이는 엄청난 보안 위반이며, 호스트에 저장된 개인 정보가 유출될 위험을 초래합니다.
컨테이너의 추가적인 보호 조치를 위해 샌드박싱 기법을 사용할 수 있습니다. 샌드박싱은 시스템의 나머지 부분으로부터 무언가를 격리하는 모든 기술을 의미합니다. Docker는 기본 SECCOMP 프로필을 사용하여 컨테이너가 잠재적으로 위험한 시스템 호출을 할 수 없도록 하고, Kubernetes에서도 SECCOMP를 사용하여 애플리케이션이 실행하는 데 필요한 최소한의 권한만을 부여할 수 있습니다. 또한, AppArmor 프로필을 사용하여 컨테이너가 접근할 수 있는 리소스를 세밀하게 제어할 수 있습니다.
SECCOMP와 AppArmor는 화이트리스트와 블랙리스트 접근 방식을 통해 작동합니다. 화이트리스트는 기본적으로 모든 것을 차단하고 필요한 시스템 호출만 허용하는 방식입니다. 이는 보안 측면에서 가장 제한적이며, 응용 프로그램이 수행하는 작업을 정확히 알고 있을 때 유용합니다. 반면, 블랙리스트는 모든 것을 허용하고 특정 작업만 금지하는 방식입니다. 이는 규칙이 너무 제한적이어서 응용 프로그램이 작동을 멈추지 않도록 하거나, 여러 방식으로 동작하는 많은 응용 프로그램에 적용할 때 유용합니다.
컨테이너 보안은 다양한 도구와 기법을 사용하여 강화할 수 있습니다. 샌드박싱 기법을 통해 컨테이너의 격리를 개선하고, 보안 취약점을 줄일 수 있습니다. 그러나 모든 보안 조치는 장단점을 가지고 있으며, 모든 상황에 맞는 단 하나의 최상의 방법은 없습니다. 각 상황에 적합한 방법을 선택하여 사용하는 것이 중요합니다.