第 18 讲:安全机制 — 密钥管理与沙箱隔离

OpenHands 源码解析 · 第 18 讲

OpenHands 源码解析系列 第 18 讲:安全机制 — 密钥管理与沙箱隔离 基于 OpenHands 源码 · 2026-08-14 一、安全架构全景 OpenHands 的安全体系围绕三个核心问题构建: 🔹 密钥如何存储与传输 — SecretStr + JWE 加密 + SecretsStore 抽象 🔹 用户身份如何验证 — UserAuth 抽象 + JWT + Cookie/Bearer 双模式 🔹 沙箱如何隔离 — Session API Key + 状态门控 + 多运行时后端 本讲深入 openhands/app_server/secrets/ 、 openhands/app_server/user_auth/ 、 openhands/app_server/sandbox/ 和 openhands/app_server/services/jwt_service.py 等模块,看 OpenHands 如何保护用户密钥与运行环境。 二、密钥管理系统 (Secrets Store) OpenHands 将密钥分为两类: Provider Token (GitHub/GitLab/Bitbucket 等代码仓库的访问令牌)和 Custom Secret (用户自定义的环境变量级密钥)。两类密钥统一由 SecretsStore 抽象管理。 2.1 SecretsStore 抽象层 SecretsStore 是一个抽象基类,定义了密钥存储的三个核心方法: 📄 openhands/app_server/secrets/secrets_store.py (第 1-37 行) class SecretsStore(ABC): """Abstract base class for storing user secrets. This is an extension point in OpenHands that allows applications to customize how user secrets are stored. Applications can substitute their own implementation by: 1. Creating a class that inherits from SecretsStore 2. Implementing all required methods 3. Setting server_config.secret_store_class to the fully qualified name of the class The class is instantiated via get_impl() in openhands.app_server.shared.py. """ @abstractmethod async def load(self) -> Secrets | None: """Load secrets.""" @abstractmethod async def store(self, secrets: Secrets) -> None: """Store secrets.""" @classmethod @abstractmethod async def get_instance(cls, user_id: str | None) -> SecretsStore: """Get a store for the user represented by the token given.""" 设计要点: 🔹 load() / store() 是异步方法,支持数据库、文件、云存储等多种后端 🔹 get_instance() 是类方法工厂,通过 server_config.secret_store_class 配置切换实现 🔹 通过 get_impl() 动态加载,企业版可以替换为加密数据库存储 2.2 FileSecretsStore — 默认实现 OSS 模式下的默认实现将密钥序列化到 secrets.json 文件中: 📄 openhands/app_server/secrets/file_secrets_store.py (第 13-46 行) @da…

阅读全文:OpenHands 源码解析 第 18 讲