111. 컨테이너 런타임 샌드박싱 (gVisor, Kata Containers)
⚠️ 이 문서는 한 대의 노드(서버) 위에서 수십 개의 도커(Docker) 컨테이너들이 얇은 종이판자 벽을 사이에 두고 부대끼며 살다가, 어떤 미친 해커가 컨테이너 1번 방을 장악한 뒤 그 판자 벽을 발로 걷어차고 나와 노드 서버의 심장(리눅스 커널)을 통째로 마비시켜버리는 끔찍한 '컨테이너 탈출(Container Breakout)' 대참사를 원천 봉쇄하기 위해, 컨테이너마다 가짜 심장(Proxy Kernel)을 쥐여주거나 아예 초경량 강철 금고(MicroVM) 안에 가둬버려 해커가 발악해도 절대 본진 서버를 건드리지 못하게 만드는 극강의 이중 방어막, '컨테이너 런타임 샌드박싱' 기술을 다룹니다.
핵심 인사이트 (3줄 요약)
- 본질: 기존 도커(runc)가 서버의 진짜 심장(Host Kernel)을 컨테이너 100개가 다 같이 핥아먹으며 공유하던 '공산주의' 구조의 취약점을 박살 낸다. 컨테이너와 진짜 심장 사이에 절대 뚫리지 않는 '방탄유리(격리 계층)' 하나를 무조건 삽입하는 보안 설계다.
- 가치: 고객이 올린 신뢰할 수 없는 쓰레기 코드(서버리스 람다, 퍼블릭 CaaS)를 내 비싼 클라우드 서버에 띄워줄 때 필수적이다. 해커가 샌드박스 안에서 무슨 미친 짓(루트 권한 탈취 등)을 하더라도, 방탄유리에 막혀 진짜 노드 서버는 1%의 상처도 입지 않는 생존력을 보장한다.
- 기술 체계: 구글이 만든 "가짜 OS 심장(User-space Kernel)" 대행자 **
gVisor**와, 아예 컨테이너 1개마다 진짜 하드웨어급 초경량 가상머신(VM)을 씌워버리는 무식하고도 튼튼한 인텔/하이퍼HQ 연합군의 **Kata Containers**가 샌드박싱 시장의 양대 산맥을 이룬다.
Ⅰ. 도커(runc)의 치명적 맹점: 커널 공유의 공포
우리는 방을 나눴다고 생각했지만, 숨 쉬는 허파(Kernel)는 하나였다.
- 컨테이너는 진짜 기계(VM)가 아니다:
- 가상머신(VMware, KVM)은 윈도우 OS 위에 리눅스 OS를 1개 더 깐다. 진짜 기계를 칼로 쪼갠 철벽이다. 해커가 리눅스를 부숴도 바닥에 있는 윈도우(Host)는 멀쩡하다.
- 도커(Container)는 다르다. 컨테이너 100개는 바닥에 깔린 리눅스 서버(Host Node)의 심장인 '커널(Kernel)' 딱 하나를 100명이 다 같이 핥아먹는다.
- 도커가 쳐놓은
Namespace나cgroups라는 벽은 콘크리트가 아니라 얇은 셀로판지 비닐막에 불과하다.
- 컨테이너 탈출 (Container Breakout):
- 해커가 1번 컨테이너에 웹 취약점을 뚫고 들어왔다. 여기서
root권한(가짜)을 딴다. - 그리고 리눅스 커널의 취약점(예: Dirty COW)을 찌르는 마법의 명령어를 갈긴다.
- 셀로판지가 찢어진다. 해커는 1번 컨테이너를 탈출해 바닥에 있는 진짜 서버(Node)의 Root 권한을 거머쥔다. 이제 해커는 옆방 2번, 3번 컨테이너를 털고, K8s 마스터 노드까지 불태워버리는 클러스터 대재앙을 일으킨다.
- 해커가 1번 컨테이너에 웹 취약점을 뚫고 들어왔다. 여기서
📢 섹션 요약 비유: 도커 컨테이너는 대형 목욕탕의 '샤워 칸막이'입니다. 시야는 가려져서 프라이버시가 지켜지는 것 같지만, 바닥의 하수구 물(커널)은 하나로 쫙 연결되어 있습니다. 1번 칸 손님(해커)이 하수구에 독극물(커널 익스플로잇)을 풀면, 하수구를 타고 2번, 3번 칸 손님들까지 단체로 몰살당하는 끔찍한 공용 하부 구조의 모순입니다.
Ⅱ. 구글의 해법: gVisor (가짜 심장 대리인)
진짜 심장(Host Kernel)을 만지고 싶어? 나한테 서류 제출하고 넌 빠져있어.
- gVisor (runsc)의 메커니즘:
- 구글은 자사 클라우드(GCP)에서 이 문제를 막으려 머리를 굴렸다. "컨테이너가 진짜 심장(Host Kernel)에 직접 말 걸게 놔두면 털린다. 중간에 '가짜 심장(Sentry)'을 하나 끼워 넣자!"
- 컨테이너가 켜진다. 얘가 하드디스크를 지우겠다고 시스템 콜(System Call)을 외친다.
- 옛날 도커는 이 소리를 진짜 서버 커널이 100% 생얼로 받아주었다. 하지만 gVisor 환경에서는, 컨테이너 뱃속에 숨어있는
Sentry라는 유저 모드(User-space) 가짜 커널이 이 소리를 낚아챈다.
- 방탄유리를 통한 대리 결재:
Sentry가 낚아챈 명령어를 깐깐하게 검사(필터링)한다. "야, 너 이상한 해킹 명령어 섞여 있네? 기각!"- 정상적인 명령어만
Sentry가 깨끗하게 씻은 뒤, 자기가 대신 진짜 서버 커널(Host)에게 "사장님, 1번 방 손님이 디스크 쓰겠답니다. 제가 확인했으니 허락해 주십쇼"라고 대리(Proxy)로 요청한다. - 해커가 아무리 미친 시스템 콜을 갈겨도, 중간에 낀 깐깐한 대리인(
Sentry)의 방탄유리를 깨지 못해 진짜 커널은 절대 안전하게 보존된다.
📢 섹션 요약 비유: gVisor는 면회실의 '유리벽과 인터폰'입니다. 옛날 도커는 죄수(컨테이너)와 면회객(진짜 커널)이 직접 손을 잡고 악수하며 바이러스를 옮길 수 있었습니다. gVisor는 중간에 두꺼운 방탄유리를 치고 인터폰으로만 말하게 합니다. 죄수가 주머니에서 칼(시스템 콜 공격)을 꺼내 찔러봤자 방탄유리(Sentry 대리인)에 기스만 날 뿐, 건너편에 있는 면회객(진짜 커널)은 1%의 상처도 입지 않는 완벽한 격리 소통 방식입니다.
Ⅲ. 하드웨어의 부활: Kata Containers (마이크로VM)
소프트웨어 방어막도 못 믿겠어! 그냥 아예 진짜 무거운 강철 금고로 한 번 더 싸버려라.
- Kata Containers의 깡패 짓 (VM의 귀환):
- gVisor가 훌륭하긴 한데, 결국 소프트웨어(가짜 커널)로 막는 거라 천재 해커가 그 가짜 커널의 버그를 찾아내어 뚫어버리면 답이 없다. 게다가 대리인이 껴있어서 통신 속도도 느려진다.
- 하드웨어 깡패들(Intel)과 클라우드 진영이 뭉쳤다. "컨테이너 1개 띄울 때마다, 묻지도 따지지도 말고 그 컨테이너 주변을 진짜 하드웨어 가상머신(MicroVM) 철판으로 1바퀴 꽁꽁 싸매버리자!"
- 이중 캡슐화 (MicroVM + Container):
- 어제 배운 파이어크래커(Firecracker)처럼, 부팅이 0.1초 만에 되는 초미니 가상머신을 하나 띄운다. 그리고 그 가상머신 뱃속에 도커 컨테이너를 쏙 밀어 넣는다.
- 즉, 컨테이너에게 자기 혼자만 쓸 수 있는 **'진짜 리눅스 커널(VM Guest Kernel)'**을 하나 통째로 하사하는 것이다.
- 해커가 컨테이너를 뚫고 커널을 박살 냈다! 하지만 그게 끝이다. 박살 난 건 해커 혼자 갇혀있던 가상머신(VM)의 커널일 뿐, 밑바닥에 있는 진짜 호스트(Node) 서버의 커널은 강철판 너머에서 비웃으며 살아남아 있다.
- Kata Containers의 승리와 클라우드의 표준:
- AWS Fargate 인프라나, 퍼블릭 클라우드에서 남의 코드를 돌릴 때 보안팀의 최애 픽(Pick)이 바로 이 Kata Containers다.
- 밖에서 보면 그냥 흔한 도커 컨테이너(K8s 호환 100%)처럼 보이지만, 뱃속을 까보면 무식하게 튼튼한 하드웨어 가상머신(VM)으로 둘러싸여 있는 '양의 탈을 쓴 강철 늑대'다. 보안과 호환성의 끝판왕 격리 기술이다.
📢 섹션 요약 비유: Kata Containers는 러시아 인형 '마트료시카'입니다. 가장 안쪽 인형이 도커 컨테이너(앱)입니다. 일반 K8s는 이 안쪽 인형들을 그냥 얇은 비닐봉지에 담아 서버에 뿌립니다. 비닐이 찢어지면 터지죠. Kata는 이 안쪽 인형을 '강철로 된 거대한 2번째 인형(MicroVM)'의 뱃속에 욱여넣고 뚜껑을 용접해 버립니다. 해커가 안쪽 인형에서 불을 지르고 난리를 쳐도, 바깥을 감싸고 있는 강철 인형(하드웨어 격리) 벽을 절대 녹이지 못해 바깥세상(진짜 호스트 노드)은 평온함을 유지하는 최강의 이중 밀봉술입니다.