채널톡이 신뢰할 수 없는 사용자 코드를 완벽히 격리하기 위해 설계한 'Kernel' 아키텍처의 비밀
이 아티클은 채널톡 엔지니어링 팀이 사용자와 AI의 동적 파이썬 코드를 안전하게 실행하기 위해 직면했던 보안 고민과 그 해결 과정을 다룹니다. 기존 컨테이너 격리의 한계를 극복하고, 제어 영역(Kernel)과 격리 영역(Sandbox)을 완벽히 분리하여 자격 증명 유출을 원천 방지한 아키텍처 설계를 소개합니다.
AI 에이전트 서비스나 사용자 정의 스크립트 실행 기능을 설계하는 백엔드 및 데브옵스 엔지니어들에게 격리 아키텍처 수립의 훌륭한 길잡이가 될 것입니다.
사용자와 AI가 실시간으로 생성한 신뢰할 수 없는 코드를 서버에서 안전하게 실행해야 했으나, 기존의 컨테이너 격리 방식은 호스트 커널을 공유하므로 단일 시스템 콜 취약점만으로도 전체 호스트가 침해될 위험이 있었습니다.
제어 영역을 담당하는 'Kernel' 서비스를 신설하여 실행 환경과 제어 영역을 분리하고, 실제 데이터베이스 접속 정보를 샌드박스 외부의 데이터 연결 서비스로 격리하며, 상태 값을 프로세스 외부에 저장하는 구조를 도입했습니다.
사용자 코드가 실행되는 환경이 침해되더라도 데이터베이스 자격 증명 유출이나 타 서비스로의 침투 경로를 차단했으며, 세션 연속성을 보존하면서도 유휴 실행 환경을 탄력적으로 회수할 수 있게 되었습니다.
Trade-off
프로세스 분리 및 대리 쿼리 수행 등으로 인해 전체 시스템 구성 요소가 증가하였으며, 상태를 외부 저장소에 백업하고 매번 다시 복구하는 과정에서 추가적인 개발 복잡성과 잠재적인 성능 지연이 존재할 수 있습니다.
사용자가 입력한 코드를 실제로 실행하고 그 결과를 반환하는 연산 엔진 및 실행 모델입니다.
리눅스 커널이 프로세스 그룹별로 시스템 자원(네트워크, 프로세스 ID, 파일 시스템 등)을 독립적으로 격리하여 제공하는 기능입니다.
구글이 오픈소스로 공개한 애플리케이션 커널로, 사용자 공간에서 가상 커널을 동작시켜 호스트 커널과의 직접적인 시스템 콜을 차단하고 샌드박스를 구축합니다.