#Backend

AI가 방금 짠 코드, 저희 서버에서 돌아갑니다

AI가 방금 짠 코드, 저희 서버에서 돌아갑니다
01

Summary

AI가 작성한 미검증 코드, 서버 폭발 없이 안전하게 실행하는 법

채널톡이 신뢰할 수 없는 사용자 코드를 완벽히 격리하기 위해 설계한 'Kernel' 아키텍처의 비밀

이 아티클은 채널톡 엔지니어링 팀이 사용자와 AI의 동적 파이썬 코드를 안전하게 실행하기 위해 직면했던 보안 고민과 그 해결 과정을 다룹니다. 기존 컨테이너 격리의 한계를 극복하고, 제어 영역(Kernel)과 격리 영역(Sandbox)을 완벽히 분리하여 자격 증명 유출을 원천 방지한 아키텍처 설계를 소개합니다.

  • 01호스트 커널을 공유하는 기존 컨테이너 환경의 격리 한계 지적
  • 02실행 제어, 세션 수명 관리, 인증을 전담하는 Kernel 레이어 도입
  • 03샌드박스 내부에 DB 접속 정보를 전달하지 않고 데이터 연결 서비스로 대리 쿼리 수행
  • 04AWS Lambda 모델의 한계를 극복하기 위해 세션 상태를 외부로 추출하여 연속성 보장
  • 05사용자 경험을 해치지 않으면서도 독립적인 다중 런타임을 확장성 있게 지원

RECOMMENDATION

AI 에이전트 서비스나 사용자 정의 스크립트 실행 기능을 설계하는 백엔드 및 데브옵스 엔지니어들에게 격리 아키텍처 수립의 훌륭한 길잡이가 될 것입니다.

The Problem

사용자와 AI가 실시간으로 생성한 신뢰할 수 없는 코드를 서버에서 안전하게 실행해야 했으나, 기존의 컨테이너 격리 방식은 호스트 커널을 공유하므로 단일 시스템 콜 취약점만으로도 전체 호스트가 침해될 위험이 있었습니다.

The Solution

제어 영역을 담당하는 'Kernel' 서비스를 신설하여 실행 환경과 제어 영역을 분리하고, 실제 데이터베이스 접속 정보를 샌드박스 외부의 데이터 연결 서비스로 격리하며, 상태 값을 프로세스 외부에 저장하는 구조를 도입했습니다.

The Result

사용자 코드가 실행되는 환경이 침해되더라도 데이터베이스 자격 증명 유출이나 타 서비스로의 침투 경로를 차단했으며, 세션 연속성을 보존하면서도 유휴 실행 환경을 탄력적으로 회수할 수 있게 되었습니다.

Trade-off

프로세스 분리 및 대리 쿼리 수행 등으로 인해 전체 시스템 구성 요소가 증가하였으며, 상태를 외부 저장소에 백업하고 매번 다시 복구하는 과정에서 추가적인 개발 복잡성과 잠재적인 성능 지연이 존재할 수 있습니다.

03

Key Concepts

Concept · 01

Jupyter Kernel

사용자가 입력한 코드를 실제로 실행하고 그 결과를 반환하는 연산 엔진 및 실행 모델입니다.

  • 채널톡의 노트북 서비스에서 연속적인 코드 실행 흐름을 설계하기 위한 기본 모델로서 참고 및 분석되었습니다.
Concept · 02

Linux Namespace

리눅스 커널이 프로세스 그룹별로 시스템 자원(네트워크, 프로세스 ID, 파일 시스템 등)을 독립적으로 격리하여 제공하는 기능입니다.

  • 기존 쿠버네티스 컨테이너 환경에서 기본적인 프로세스 격리를 수행하는 핵심 기술로 언급되었습니다.
Concept · 03

gVisor

구글이 오픈소스로 공개한 애플리케이션 커널로, 사용자 공간에서 가상 커널을 동작시켜 호스트 커널과의 직접적인 시스템 콜을 차단하고 샌드박스를 구축합니다.

  • 호스트 커널 노출을 최소화하고 보안 공격 표면을 극도로 줄이기 위한 실행 환경 기술 후보군으로 제시되었습니다.