whycr***
2021-02-07

컨테이너 환경에 특화된 보안 문제를 다루는 실무 지침서. 컨테이너의 작동 및 통신 원리를 파헤친 뒤 컨테이너를 격리하는 다양한 방법을 안내하고, 리눅스가 제공하는 기능을 활용하여 컨테이너별로 보안을 강화하는 방법을 익힌다.
한빛미디어에서 발간된 컨테이너 보안(Container Security)이라는 책을 리뷰어로 받아보게 됐다. 시중에 도커, 컨테이너, 오케스트레이션 등으로 다양한 책이 있지만 이 책은 그중에도 특별하다. 컨테이너란 무엇인지 살펴보고 그 안에 내용을 심도 있게 다뤄나간다. 그 과정에서 보안에 취약한 부분들을 깨우칠 수 있게 돕는다. 단순히 책의 제목에 있는 "보안"이라는 키워드만 생각하고 접근하지 않아도 된다. 컨테이너를 심도 있게 파헤치고 싶다면 추천한다.
우선 이 책의 대상 독자는 다음과 같다.
책의 저자는 대상 독자를 이 정도로 정의한다. 책을 다 읽고 나서 내 개인적인 견해를 덧붙이자면 아래 내용에 무지하면 책을 읽는데 어려움이 있을 수 있다.
물론 하나씩 찾아가면서 공부하는 재미로 읽어도 되지만 더디게 나가는 진도에 지치지 않을까 하는 우려가 앞선다. 컨테이너 보안을 다루는 책에서 위와 같은 것들이 언급되는 것은 당연하다. *NIX 기반으로 도커가 다뤄지고 컨테이너의 원리를 지면의 많은 부분을 할애해서 설명한다. 책의 내용을 따라가다 보면 어느 순간 컨테이너의 원리를 파악하고 그 과정에서 보안을 계속 생각해보게 된다.
이런 내용은 4장의 요약에 잘 드러나있다. "호스트 자원들에 대한 프로세스의 접근을 제한하는데 쓰이는 필수 리눅스 커널 메커니즘 세 가지"는 다음과 같다.
보안은 권한과 제어(격리)로 볼 수 있는데 이 두가지가 컨테이너 보안의 핵심이다. 리눅스 커널 메커니즘 세 가지는 결국 권한과 제어에 대한 이야기로 컨테이너를 이루는 바탕이 되는 핵심 기술이 되겠다. 5장에서는 이를 "컨테이너는 그냥 시야가 제한된 리눅스 프로세스"라고 표현한다. 위에 내용을 이해하고 나면 컨테이너를 생성할 때 완벽한 보안을 위해 no-new-privileges(컨테이너에서 새로운 권한을 얻는 것을 제한하는) 옵션을 사용하는 이유가 납득이 된다.
컨테이너와 비교되는 것이 VM 개념인데 제5장을 통해 가상 머신의 개념을 훑어준다. 컴퓨터의 부팅 과정을 알아보고 VMM(virtual machine monitor 또는 virtual machine manager)의 두 종류를 살펴본다. 제1형 VMM은 하이퍼바이저(hypervisor)라고 불리는데 Hyper-V, Xen, ESX/ESXi가 하이퍼바이저의 예이다. 호스트 운영체제가 없는 빈 하드웨어(소위 '베어 메탈 bare metal')에서 직접 실행되는데 퍼블릭 클라우드의 인스턴스를 생각하면 된다. 제2형 VMM은 VirtualBox처럼 호스트 OS가 있고 그 위에 가상 머신을 올리는 방식을 이야기한다. 이런 방식들과 프로세스 격리를 통한 방식은 보안적인 측면으로 장단점을 구분할 수도 있지만 보통 컨테이너 방식이 VMM 방식보다 나은 부분으로 아래와 같은 항목을 꼽는다.
컨테이너 이미지는 OCI(Open Container Initiative, https://opencontainers.org) 준수 config.json 이 사용된다. 앞에서 리눅스 커널 매커니즘으로 컨테이너와 동일한 환경을 구축(namespace, chroot, cgroups)해보는데 책의 중반부에서는 도커 이미지 파일을 풀어서 내용을 확인해보는 과정이 있다. umoci라는 도구를 사용해서 이미지를 unpack해보면 config.json 파일을 확인해볼 수 있다. 이 안에서 우리는 namespaces가 어떻게 할당되는지를 다시 한번 확인할 수 있다.
이미지를 구축할 때 사용하는 Dockerfile에는 다양한 명령들이 있는데 모범 관행을 따라서 보안을 신경 써야 한다.
이외에도 non-root USER 지정, 민감한 자료를 포함시키면 안되고, 불필요한 코드 주의 등 보안에 신경 써야 하는 것은 많다. Dockerfile의 best practice를 따르는 것은 매우 중요하다.
이미지 스캔을 통해 취약점을 찾아내는 것도 매우 중요하다. 스캐닝 도구는 Trivy, Clair, Anchore 등이 있다. 스캐너에 따라 다른 결과를 내기는 하지만 우리 이미지의 취약성을 찾는데 많은 도움을 줄 것이다. AWS의 CodeBuild의 경우 Dockerfile로 이미지를 구축한 후 이미지를 스캔한다. 스캔한 결과로 바로 확인할 수 있고 취약점이 발견되면 이미지 구축이 실패하게 된다.
책의 후반부에는 이미지를 생성할 때 사용하는 옵션을 살펴보면서 그 위험성도 함께 언지한다. 또한 네트워크 보안 부분으로 넘어가서는 커널의 netfilter를 이용해서 패킷을 처리할 때 iptables를 사용하는 방식을 살펴본다. 이 부분을 통해 컨테이너 오케스트레이션 도구인 쿠버네티스에서 어떻게 트래픽이 로드 밸런싱 되는지 배우게 된다. iptables 규칙을 세우는 것까지 다루고 있지만 너무 딥-다이브다. 사실 컨테이너나 쿠버네티스를 다루면서 iptables를 직접 건드릴 일은 제로 퍼센트에 가깝다. 개인적인 호기심이 아니라면 훌훌 넘겨도 된다.
마무리
서두에 언급했듯이 이 책은 단순히 컨테이너의 보안만을 다루지는 않는다. 그 근간이 되는 기술을 설명하면서 차근차근 깊이 있게 나아간다. 아마 모든 내용을 한번에 이해할 수 있다면 이미 배경지식 상당한 수준이었을 거다. 잘 이해가 안돼도 걱정하지 마시라. 부록: 보안 점검 목록을 통해 현재 본인이 다루고 있는 컨테이너를 점검해볼 수 있을 것이다. 또한 부록에 명시된 키워드가 이 책의 핵심이기 때문에 필요하면 그것들 위주로 찾아보면 된다. 컨테이너가 무엇인지 감을 잡고 싶다고? 이 책의 일독을 권한다.