티스토리 뷰

o'reilly Container Security

 

한빛미디어에서 발간된 컨테이너 보안(Container Security)이라는 책을 리뷰어로 받아보게 됐다. 시중에 도커, 컨테이너, 오케스트레이션 등으로 다양한 책이 있지만 이 책은 그중에도 특별하다. 컨테이너란 무엇인지 살펴보고 그 안에 내용을 심도 있게 다뤄나간다. 그 과정에서 보안에 취약한 부분들을 깨우칠 수 있게 돕는다. 단순히 책의 제목에 있는 "보안"이라는 키워드만 생각하고 접근하지 않아도 된다. 컨테이너를 심도 있게 파헤치고 싶다면 추천한다. 

우선 이 책의 대상 독자는 다음과 같다. 

  • IT 분야의 어느 부분에 종사하던 사물의 작동 방식을 자세히 파헤치길 좋아하고 리눅스 터미널에 익숙한 사람
  • 컨테이너에 어느 정도 익숙하고 토커나 쿠버네티스를 사용해 본 적이 있는 사람
    • 예를 들어 "레지스트리에서 컨테이너 이미지를 가져온다", "컨테이너를 실행한다"가 무슨 뜻인지 아는 사람
    • 컨테이너의 세부적인 작동 방식은 몰라도 상관 없음 (이 책에서 설명하고 있기 때문)

책의 저자는 대상 독자를 이 정도로 정의한다. 책을 다 읽고 나서 내 개인적인 견해를 덧붙이자면 아래 내용에 무지하면 책을 읽는데 어려움이 있을 수 있다. 

  • 리눅스 명령어가 친숙하지 않다
    • sudo, ls, cat, ps, proc filesystem, chown, chmod, grep 명령어를 얕게라도 알고 있어야 한다
  • 리눅스 파일 시스템의 구조를 전혀 모른다
  • 네트워크 지식이 없다

물론 하나씩 찾아가면서 공부하는 재미로 읽어도 되지만 더디게 나가는 진도에 지치지 않을까 하는 우려가 앞선다. 컨테이너 보안을 다루는 책에서 위와 같은 것들이 언급되는 것은 당연하다. *NIX 기반으로 도커가 다뤄지고 컨테이너의 원리를 지면의 많은 부분을 할애해서 설명한다. 책의 내용을 따라가다 보면 어느 순간 컨테이너의 원리를 파악하고 그 과정에서 보안을 계속 생각해보게 된다.

이런 내용은 4장의 요약에 잘 드러나있다. "호스트 자원들에 대한 프로세스의 접근을 제한하는데 쓰이는 필수 리눅스 커널 메커니즘 세 가지"는 다음과 같다.

  • 이름공간은 컨테이너가 볼 수 있는 대상들을 제한한다. 예를 들어 프로세스 ID 이름 공간을 적용하면 컨테이너는 호스트와는 격리된 프로세스 ID들만 보게 된다. (namespace)
  • 루트 디렉터리 변경은 컨테이너가 볼 수 있는 디렉터리들과 파일들을 제한한다. (chroot)
  • 제어 그룹은 컨테이너가 접근할 수 있는 자원들을 제어한다. (cgroups: control group)

 

보안은 권한과 제어(격리)로 볼 수 있는데 이 두가지가 컨테이너 보안의 핵심이다. 리눅스 커널 메커니즘 세 가지는 결국 권한과 제어에 대한 이야기로 컨테이너를 이루는 바탕이 되는 핵심 기술이 되겠다. 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 방식보다 나은 부분으로 아래와 같은 항목을 꼽는다.

  • 시동(부팅) 속도가 컨테이너가 훨씬 빠르다
    • 이는, auto-scaling에 민첩하냐 아니냐의 문제로 연결된다
    • 새로운 버전 발행도 시동 시간은 중요하다
  • 배포 과정이 컨테이너가 훨씬 효율적이다
    • VM의 경우 이미지를 다른 곳에서 실행하기 위한 과정이 너무 느리고 번거롭다
    • VM의 용량은 또 어떠한가
  • 클라우드 환경에서 VM 하나를 임대하려면 CPU와 메모리를 지정해야 하고 사용량과 상관없이 자원 사용 비용을 지불해야 한다
    • 컨테이너의 경우도 호스트OS가 VM이라면 결국 비용 지불에는 차이가 없겠지만 여러 개의 컨테이너를 하나의 VM에서 올릴 수도 있고 요즘은 클라우드에서 서버리스 개념으로 컨테이너 매니지드 서비스를 제공한다. AWS에서 fargate 혹은 GCP에서 Cloud Rund을 생각해보면 된다.

컨테이너 이미지는 OCI(Open Container Initiative, https://opencontainers.org) 준수 config.json 이 사용된다. 앞에서 리눅스 커널 매커니즘으로 컨테이너와 동일한 환경을 구축(namespace, chroot, cgroups)해보는데 책의 중반부에서는 도커 이미지 파일을 풀어서 내용을 확인해보는 과정이 있다. umoci라는 도구를 사용해서 이미지를 unpack해보면 config.json 파일을 확인해볼 수 있다. 이 안에서 우리는 namespaces가 어떻게 할당되는지를 다시 한번 확인할 수 있다.

이미지를 구축할 때 사용하는 Dockerfile에는 다양한 명령들이 있는데 모범 관행을 따라서 보안을 신경 써야 한다.

  • 기반 이미지
    • 신뢰된 레지스트리의 이미지를 지정
    • 승인된 기반 이미지만 사용하는 것이 좋다
    • 서드파티 기반 이미지에는 악성 코드가 포함되어 있을 수 있다
  • 다단계 구축
    • 최종 이미지에서 불필요한 내용 제거하는 방법이다
    • 예를 들면 Go 프로그램을 컨테이너에 포함시키는데 
    • 우선 Go 컴파일러를 통해 실행파일을 만들고
    • 실행파일만 컨테이너에 포함시킨다. 이미지에 컴파일로는 필요 없다
    • 이렇게 단계를 분리해서 불필요한 것들을 이미지에 포함시키지 않으면 공격 표면이 훨씬 작아진다
  • 볼륨 마운트
    • Dockerfile에 /etc, /bin 같은 민감한 디렉터를 마운트 하지 않는지 점검해야 한다
  • RUN 명령
    • Dockerfile이 챔해되면 RUN을 통해 원하는 임의의 코드를 실행할 수 있는데
    • 이건 보안적으로 매우 심각한 단계임으로 Dockerfile 편집할 권한은 신뢰할 수 있는 팀원에게만 주는 게 좋다
  • setuid 이진 파일 주의
    • setuid 비트가 설정된 실행 파일은 권한 확대로 이어질 수 있기 때문에 포함시키지 말아야 한다

이외에도 non-root USER 지정, 민감한 자료를 포함시키면 안되고, 불필요한 코드 주의 등 보안에 신경 써야 하는 것은 많다. Dockerfile의 best practice를 따르는 것은 매우 중요하다.

이미지 스캔을 통해 취약점을 찾아내는 것도 매우 중요하다. 스캐닝 도구는 Trivy, Clair, Anchore 등이 있다. 스캐너에 따라 다른 결과를 내기는 하지만 우리 이미지의 취약성을 찾는데 많은 도움을 줄 것이다. AWS의 CodeBuild의 경우 Dockerfile로 이미지를 구축한 후 이미지를 스캔한다. 스캔한 결과로 바로 확인할 수 있고 취약점이 발견되면 이미지 구축이 실패하게 된다.

책의 후반부에는 이미지를 생성할 때 사용하는 옵션을 살펴보면서 그 위험성도 함께 언지한다. 또한 네트워크 보안 부분으로 넘어가서는 커널의 netfilter를 이용해서 패킷을 처리할 때 iptables를 사용하는 방식을 살펴본다. 이 부분을 통해 컨테이너 오케스트레이션 도구인 쿠버네티스에서 어떻게 트래픽이 로드 밸런싱 되는지 배우게 된다. iptables 규칙을 세우는 것까지 다루고 있지만 너무 딥-다이브다. 사실 컨테이너나 쿠버네티스를 다루면서 iptables를 직접 건드릴 일은 제로 퍼센트에 가깝다. 개인적인 호기심이 아니라면 훌훌 넘겨도 된다. 

 

마무리

서두에 언급했듯이 이 책은 단순히 컨테이너의 보안만을 다루지는 않는다. 그 근간이 되는 기술을 설명하면서 차근차근 깊이 있게 나아간다. 아마 모든 내용을 한번에 이해할 수 있다면 이미 배경지식 상당한 수준이었을 거다. 잘 이해가 안돼도 걱정하지 마시라. 부록: 보안 점검 목록을 통해 현재 본인이 다루고 있는 컨테이너를 점검해볼 수 있을 것이다. 또한 부록에 명시된 키워드가 이 책의 핵심이기 때문에 필요하면 그것들 위주로 찾아보면 된다. 컨테이너가 무엇인지 감을 잡고 싶다고? 이 책의 일독을 권한다. 

댓글
최근에 올라온 글
최근에 달린 댓글
글 보관함
Total
Today
Yesterday