리눅스 bwrap 완벽 가이드: 나만의 샌드박스 격리 환경 만들기

개요

bwrap(Bubblewrap)은 권한 없는 일반 사용자도 안전하게 파일시스템, 네트워크, 프로세스를 격리할 수 있는 강력한 리눅스 샌드박스 도구입니다. 본 가이드에서는 Ubuntu 24.04 환경에서 bwrap을 직접 설치하고 주요 격리 옵션을 실습하며 컨테이너의 핵심 원리를 쉽게 이해해 봅니다.

1. Bubblewrap 설치 및 최소 격리 환경 실행

리눅스 환경에서 가볍고 안전한 샌드박스를 구축하기 위해 bubblewrap 패키지를 설치합니다.

sudo apt-get update -qq && sudo apt-get install -y bubblewrap

bwrap 명령어는 비특권 사용자 권한으로 네임스페이스 기반의 격리된 샌드박스 환경을 생성하고 내부에서 프로그램을 실행합니다.
호스트의 핵심 디렉터리만 읽기 전용으로 마운트하여 외부와 단절된 안전한 최소 격리 셸을 실행할 수 있습니다.
⚙️ [주요 옵션]

--ro-bind : 호스트의 파일이나 디렉터리를 샌드박스 내부에 읽기 전용(Read-Only)으로 마운트합니다.
--bind : 호스트의 파일이나 디렉터리를 읽기 및 쓰기 가능한 상태로 마운트합니다.
--dev : 격리된 환경 내에 필수 가상 디바이스(/dev) 파일 시스템을 마운트합니다.
--proc : 새로운 프로세스 네임스페이스를 생성하고 가상 프로세스 정보 디렉터리(/proc)를 마운트합니다.
--tmpfs : 샌드박스 내부에서만 유지되는 임시 인메모리 파일 시스템을 마운트합니다.
--unshare-all : 사용자, IPC, PID, 네트워크, UTS, Cgroup 등 모든 네임스페이스를 호스트로부터 완전히 격리합니다.
--symlink : 샌드박스 내부에 지정한 경로를 가리키는 심볼릭 링크를 생성합니다.

bwrap –ro-bind /usr /usr –symlink usr/lib /lib –symlink usr/lib64 /lib64 –proc /proc –dev /dev sh -c “echo ‘Hello from isolated bwrap sandbox!’”

2. 읽기 전용 바인드 마운트로 파일시스템 격리 및 보호

읽기 전용 격리 실습을 진행하기 위해 /tmp/bwrap-test 디렉터리를 생성하고 테스트용 텍스트 파일을 작성합니다.

mkdir -p /tmp/bwrap-test && echo ‘Original Content’ > /tmp/bwrap-test/data.txt

bwrap의 --ro-bind 옵션을 사용하여 호스트의 /tmp/bwrap-test 디렉터리를 샌드박스 내부의 /test 경로에 읽기 전용으로 마운트하고 파일 내용을 조회합니다.
실행 결과 기존 파일 내용인 Original Content가 정상적으로 출력되어 샌드박스 내부에서 읽기 접근이 올바르게 동작함을 확인합니다.

bwrap –ro-bind /usr /usr –symlink usr/lib /lib –symlink usr/lib64 /lib64 –ro-bind /tmp/bwrap-test /test sh -c “cat /test/data.txt”

동일하게 구성된 읽기 전용 샌드박스 환경 내부에서 /test/data.txt 파일에 데이터를 덮어쓰는 작업을 시도합니다.
--ro-bind로 마운트된 디렉터리는 파일 수정 및 쓰기 권한이 완전히 차단되어 오류가 발생하며, 호스트 파일시스템이 안전하게 보호되어 Write protected successfully 결과가 반환됨을 확인합니다.

bwrap –ro-bind /usr /usr –symlink usr/lib /lib –symlink usr/lib64 /lib64 –ro-bind /tmp/bwrap-test /test sh -c “echo ‘Hacked’ > /test/data.txt 2>&1 || echo ‘Write protected successfully’”

3. 프로세스 및 네트워크 네임스페이스 격리

bwrap의 --unshare-pid 옵션과 --proc /proc 옵션을 조합하여 호스트와 완전히 분리된 독립 PID 네임스페이스를 생성하고 프로세스 목록을 확인합니다.
실행 결과 호스트 시스템의 수많은 프로세스는 모두 은폐되며, 샌드박스 내부에서 실행된 bwrap, sh, ps 프로세스만 PID 1번부터 순차적으로 할당되어 격리된 상태를 보여줍니다.

bwrap –ro-bind /usr /usr –symlink usr/lib /lib –symlink usr/lib64 /lib64 –proc /proc –unshare-pid sh -c “ps -ef”

--unshare-net 옵션을 추가하여 호스트의 네트워크 스택으로부터 완벽히 단절된 독립 네트워크 네임스페이스를 생성하고 활성화된 인터페이스 목록을 조회합니다.
호스트의 물리 및 가상 네트워크 인터페이스가 전혀 공유되지 않아 루프백(lo) 인터페이스조차 활성화되지 않은 빈 결과가 반환되며, 외부 네트워크 통신이 원천 차단됨을 확인합니다.

bwrap –ro-bind /usr /usr –symlink usr/lib /lib –symlink usr/lib64 /lib64 –proc /proc –unshare-net sh -c “ip link show”

4. 임시 파일시스템(tmpfs)을 이용한 휘발성 작업 공간 구축

bwrap의 --tmpfs /tmp 옵션을 지정하여 메모리 기반의 임시 파일시스템을 마운트하고, 샌드박스 내부의 /tmp/sandbox.log 경로에 로그 파일을 생성하여 확인합니다.
실행 결과 격리된 환경 내부에서는 임시 파일이 정상적으로 생성되어 쓰기 및 조회가 가능함을 확인합니다.

bwrap –ro-bind /usr /usr –symlink usr/lib /lib –symlink usr/lib64 /lib64 –proc /proc –tmpfs /tmp sh -c “echo ‘Ephemeral data’ > /tmp/sandbox.log && ls -l /tmp/sandbox.log”

샌드박스 프로세스가 완전히 종료된 후 호스트 시스템의 /tmp/sandbox.log 파일 존재 여부를 확인합니다.
--tmpfs 공간에 기록된 데이터는 호스트에 저장되지 않고 프로세스 종료와 함께 메모리에서 즉시 소멸하여 호스트 파일시스템이 깨끗하게 유지됨을 확인합니다.

ls -l /tmp/sandbox.log 2>&1 || echo ‘Host filesystem remained completely untouched’

지금까지 bwrap을 활용해 나만의 샌드박스 격리 환경을 구축하고 제어하는 방법을 살펴보았습니다.
필요에 맞춰 파일시스템과 네트워크 권한을 세밀하게 분리하여 안전하고 독립된 실행 환경을 완성해 보세요.