|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- # RAGFlow Sandbox
-
- A secure, pluggable code execution backend for RAGFlow and beyond.
-
- ## 🔧 Features
-
- - ✅ **Seamless RAGFlow Integration** — Out-of-the-box compatibility with the `code` component.
- - 🔐 **High Security** — Leverages [gVisor](https://gvisor.dev/) for syscall-level sandboxing.
- - 🔧 **Customizable Sandboxing** — Easily modify `seccomp` settings as needed.
- - 🧩 **Pluggable Runtime Support** — Easily extend to support any programming language.
- - ⚙️ **Developer Friendly** — Get started with a single command using `Makefile`.
-
- ## 🏗 Architecture
-
- <p align="center">
- <img src="asserts/code_executor_manager.svg" width="520" alt="Architecture Diagram">
- </p>
-
- ## 🚀 Quick Start
-
- ### 📋 Prerequisites
-
- #### Required
-
- - Linux distro compatible with gVisor
- - [gVisor](https://gvisor.dev/docs/user_guide/install/)
- - Docker >= `24.0.0`
- - Docker Compose >= `v2.26.1` like [RAGFlow](https://github.com/infiniflow/ragflow)
- - [uv](https://docs.astral.sh/uv/) as package and project manager
-
- #### Optional (Recommended)
-
- - [GNU Make](https://www.gnu.org/software/make/) for simplified CLI management
-
- ---
-
- ### 🐳 Build Docker Base Images
-
- We use isolated base images for secure containerized execution:
-
- ```bash
- # Build base images manually
- docker build -t sandbox-base-python:latest ./sandbox_base_image/python
- docker build -t sandbox-base-nodejs:latest ./sandbox_base_image/nodejs
-
- # OR use Makefile
- make build
- ```
-
- Then, build the executor manager image:
-
- ```bash
- docker build -t sandbox-executor-manager:latest ./executor_manager
- ```
-
- ---
-
- ### 📦 Running with RAGFlow
-
- 1. Ensure gVisor is correctly installed.
- 2. Configure your `.env` in `docker/.env`:
-
- - Uncomment sandbox-related variables.
- - Enable sandbox profile at the bottom.
- 3. Add the following line to `/etc/hosts` as recommended:
-
- ```text
- 127.0.0.1 sandbox-executor-manager
- ```
-
- 4. Start RAGFlow service.
-
- ---
-
- ### 🧭 Running Standalone
-
- #### Manual Setup
-
- 1. Initialize environment:
-
- ```bash
- cp .env.example .env
- ```
-
- 2. Launch:
-
- ```bash
- docker compose -f docker-compose.yml up
- ```
-
- 3. Test:
-
- ```bash
- source .venv/bin/activate
- export PYTHONPATH=$(pwd)
- uv pip install -r executor_manager/requirements.txt
- uv run tests/sandbox_security_tests_full.py
- ```
-
- #### With Make
-
- ```bash
- make # setup + build + launch + test
- ```
-
- ---
-
- ### 📈 Monitoring
-
- ```bash
- docker logs -f sandbox-executor-manager # Manual
- make logs # With Make
- ```
-
- ---
-
- ### 🧰 Makefile Toolbox
-
- | Command | Description |
- | ----------------- | ------------------------------------------------ |
- | `make` | Setup, build, launch and test all at once |
- | `make setup` | Initialize environment and install uv |
- | `make ensure_env` | Auto-create `.env` if missing |
- | `make ensure_uv` | Install `uv` package manager if missing |
- | `make build` | Build all Docker base images |
- | `make start` | Start services with safe env loading and testing |
- | `make stop` | Gracefully stop all services |
- | `make restart` | Shortcut for `stop` + `start` |
- | `make test` | Run full test suite |
- | `make logs` | Stream container logs |
- | `make clean` | Stop and remove orphan containers and volumes |
-
- ---
-
- ## 🔐 Security
-
- The RAGFlow sandbox is designed to balance security and usability, offering solid protection without compromising developer experience.
-
- ### ✅ gVisor Isolation
-
- At its core, we use [gVisor](https://gvisor.dev/docs/architecture_guide/security/), a user-space kernel, to isolate code execution from the host system. gVisor intercepts and restricts syscalls, offering robust protection against container escapes and privilege escalations.
-
- ### 🔒 Optional seccomp Support (Advanced)
-
- For users who need **zero-trust-level syscall control**, we support an additional `seccomp` profile. This feature restricts containers to only a predefined set of system calls, as specified in `executor_manager/seccomp-profile-default.json`.
-
- > ⚠️ This feature is **disabled by default** to maintain compatibility and usability. Enabling it may cause compatibility issues with some dependencies.
-
- #### To enable seccomp
-
- 1. Edit your `.env` file:
-
- ```dotenv
- SANDBOX_ENABLE_SECCOMP=true
- ```
-
- 2. Customize allowed syscalls in:
-
- ```
- executor_manager/seccomp-profile-default.json
- ```
-
- This profile is passed to the container with:
-
- ```bash
- --security-opt seccomp=/app/seccomp-profile-default.json
- ```
-
- ### 🧠 Python Code AST Inspection
-
- In addition to sandboxing, Python code is **statically analyzed via AST (Abstract Syntax Tree)** before execution. Potentially malicious code (e.g. file operations, subprocess calls, etc.) is rejected early, providing an extra layer of protection.
-
- ---
-
- This security model strikes a balance between **robust isolation** and **developer usability**. While `seccomp` can be highly restrictive, our default setup aims to keep things usable for most developers — no obscure crashes or cryptic setup required.
-
- ## 📦 Add Extra Dependencies for Supported Languages
-
- Currently, the following languages are officially supported:
-
- | Language | Priority |
- | -------- | -------- |
- | Python | High |
- | Node.js | Medium |
-
- ### 🐍 Python
-
- To add Python dependencies, simply edit the following file:
-
- ```bash
- sandbox_base_image/python/requirements.txt
- ```
-
- Add any additional packages you need, one per line (just like a normal pip requirements file).
-
- ### 🟨 Node.js
-
- To add Node.js dependencies:
-
- 1. Navigate to the Node.js base image directory:
-
- ```bash
- cd sandbox_base_image/nodejs
- ```
-
- 2. Use `npm` to install the desired packages. For example:
-
- ```bash
- npm install lodash
- ```
-
- 3. The dependencies will be saved to `package.json` and `package-lock.json`, and included in the Docker image when rebuilt.
-
- ---
-
- ## 🤝 Contribution
-
- Contributions are welcome!
|