# 安全考虑 **本文引用的文件** - [docker/Dockerfile](file://docker/Dockerfile) - [scripts/setup-network-isolation.sh](file://scripts/setup-network-isolation.sh) - [docker/docker-compose.yml](file://docker/docker-compose.yml) - [config.yml](file://config.yml) - [crates/rcoder/src/main.rs](file://crates/rcoder/src/main.rs) - [crates/agent_runner/src/main.rs](file://crates/agent_runner/src/main.rs) - [crates/rcoder/src/config.rs](file://crates/rcoder/src/config.rs) - [crates/agent_runner/src/config.rs](file://crates/agent_runner/src/config.rs) - [crates/rcoder/src/router.rs](file://crates/rcoder/src/router.rs) - [crates/agent_runner/src/router.rs](file://crates/agent_runner/src/router.rs) - [crates/rcoder/src/handler/chat_handler.rs](file://crates/rcoder/src/handler/chat_handler.rs) - [crates/agent_runner/src/handler/chat_handler.rs](file://crates/agent_runner/src/handler/chat_handler.rs) - [crates/rcoder/src/middleware/tracing_middleware.rs](file://crates/rcoder/src/middleware/tracing_middleware.rs) - [crates/agent_runner/src/middleware/tracing_middleware.rs](file://crates/agent_runner/src/middleware/tracing_middleware.rs) - [crates/docker_manager/src/manager.rs](file://crates/docker_manager/src/manager.rs) - [crates/shared_types/src/multi_image_config.rs](file://crates/shared_types/src/multi_image_config.rs) - [crates/shared_types/src/service_config.rs](file://crates/shared_types/src/service_config.rs) - [crates/pingora-proxy/src/service.rs](file://crates/pingora-proxy/src/service.rs) - [crates/agent_runner/src/utils/system_prompt.rs](file://crates/agent_runner/src/utils/system_prompt.rs) ## 目录 1. [简介](#简介) 2. [项目结构与安全边界](#项目结构与安全边界) 3. [核心安全组件](#核心安全组件) 4. [架构总览](#架构总览) 5. [详细组件安全分析](#详细组件安全分析) 6. [依赖关系与耦合分析](#依赖关系与耦合分析) 7. [性能与安全权衡](#性能与安全权衡) 8. [故障排查与安全审计](#故障排查与安全审计) 9. [结论](#结论) ## 简介 本章节系统阐述 RCoder 在部署与运行中的安全实践,围绕容器隔离、挂载权限控制、镜像来源验证、API 访问控制、输入验证与防滥用、敏感信息管理、网络隔离脚本、日志与审计、漏洞扫描与最小权限原则等方面展开。文档旨在帮助运维与开发人员在保障功能完备的同时,提升系统的安全性与可审计性。 ## 项目结构与安全边界 - 容器运行时:通过 Docker Compose 启动主服务与代理服务,主服务暴露端口并可选启用反向代理;Agent Runner 作为容器内服务参与聊天处理。 - 网络隔离:提供宿主机侧网络隔离脚本,基于 iptables 限制容器对内网地址段的访问。 - 配置管理:支持命令行参数、环境变量与配置文件的多级覆盖;敏感信息建议通过环境变量注入,避免明文写入配置文件。 - 日志与可观测性:内置 OpenTelemetry 与结构化日志,支持按天滚动与 trace_id 传播,便于审计与定位问题。 ```mermaid graph TB subgraph "宿主机" DC["Docker Compose
rcoder 服务"] NI["网络隔离脚本
iptables 规则"] LOG["日志目录
logs/"] end subgraph "容器内" RC["rcoder 主服务"] AR["agent_runner 服务"] PM["Pingora 反向代理"] DM["Docker 管理器"] end DC --> RC RC --> PM RC --> DM RC --> AR NI -.-> DC LOG -.-> RC ``` 图表来源 - [docker/docker-compose.yml](file://docker/docker-compose.yml#L1-L37) - [crates/rcoder/src/main.rs](file://crates/rcoder/src/main.rs#L210-L272) - [crates/agent_runner/src/main.rs](file://crates/agent_runner/src/main.rs#L120-L178) - [crates/pingora-proxy/src/service.rs](file://crates/pingora-proxy/src/service.rs#L556-L596) 章节来源 - [docker/docker-compose.yml](file://docker/docker-compose.yml#L1-L37) - [crates/rcoder/src/main.rs](file://crates/rcoder/src/main.rs#L210-L272) - [crates/agent_runner/src/main.rs](file://crates/agent_runner/src/main.rs#L120-L178) ## 核心安全组件 - 容器隔离与能力控制:容器启动时丢弃网络相关能力,禁用特权模式,降低逃逸风险。 - 网络隔离脚本:在宿主机 iptables 上为 rcoder- 前缀网络添加规则,阻止访问常见内网地址段。 - 配置与环境变量:支持环境变量覆盖端口、工作目录、网络模式、自动清理、容器 TTL 等,敏感信息建议通过环境变量注入。 - 日志与追踪:结构化 JSON 日志按天滚动,trace_id 传播,便于审计与关联分析。 - 反向代理与健康检查:Pingora 代理提供后端健康检查与统计接口,便于监控与故障定位。 章节来源 - [crates/docker_manager/src/manager.rs](file://crates/docker_manager/src/manager.rs#L147-L165) - [scripts/setup-network-isolation.sh](file://scripts/setup-network-isolation.sh#L1-L112) - [crates/rcoder/src/config.rs](file://crates/rcoder/src/config.rs#L212-L239) - [crates/agent_runner/src/config.rs](file://crates/agent_runner/src/config.rs#L134-L171) - [crates/rcoder/src/main.rs](file://crates/rcoder/src/main.rs#L274-L321) - [crates/agent_runner/src/main.rs](file://crates/agent_runner/src/main.rs#L181-L232) - [crates/pingora-proxy/src/service.rs](file://crates/pingora-proxy/src/service.rs#L556-L596) ## 架构总览 下图展示 RCoder 主服务、Agent Runner、Pingora 代理与 Docker 管理器之间的交互,以及网络隔离脚本对宿主机网络的影响。 ```mermaid sequenceDiagram participant Client as "客户端" participant RC as "rcoder 主服务" participant PM as "Pingora 代理" participant AR as "agent_runner 服务" participant DM as "Docker 管理器" participant NI as "网络隔离脚本" Client->>RC : "POST /chat" RC->>DM : "获取/创建容器" DM-->>RC : "返回容器信息" RC->>AR : "转发请求到容器内 /chat" AR-->>RC : "返回处理结果" RC-->>Client : "返回响应" Note over NI,PM : "宿主机 iptables 限制容器访问内网" ``` 图表来源 - [crates/rcoder/src/handler/chat_handler.rs](file://crates/rcoder/src/handler/chat_handler.rs#L323-L431) - [crates/agent_runner/src/handler/chat_handler.rs](file://crates/agent_runner/src/handler/chat_handler.rs#L174-L321) - [crates/docker_manager/src/manager.rs](file://crates/docker_manager/src/manager.rs#L105-L165) - [scripts/setup-network-isolation.sh](file://scripts/setup-network-isolation.sh#L70-L95) 章节来源 - [crates/rcoder/src/router.rs](file://crates/rcoder/src/router.rs#L52-L84) - [crates/agent_runner/src/router.rs](file://crates/agent_runner/src/router.rs#L40-L70) ## 详细组件安全分析 ### 容器隔离与挂载权限控制 - 能力与特权控制 - 容器启动时丢弃网络原始与管理能力,禁用特权模式,降低容器逃逸与网络嗅探风险。 - 挂载策略 - 默认挂载类型为 bind,部分服务挂载路径允许只读或额外绑定,需谨慎评估挂载路径与权限。 - 网络隔离脚本 - 通过查找 rcoder- 前缀网络,为每个网络子网添加 DROP 规则,阻止访问常见内网地址段;规则在系统重启后会丢失,需持久化或开机重载。 ```mermaid flowchart TD Start(["容器启动"]) --> DropCaps["丢弃网络相关能力
禁用特权模式"] DropCaps --> Mounts["绑定挂载配置
只读/额外挂载"] Mounts --> NetIsolate["宿主机 iptables 规则
阻止访问内网地址段"] NetIsolate --> Run(["容器运行"]) ``` 图表来源 - [crates/docker_manager/src/manager.rs](file://crates/docker_manager/src/manager.rs#L147-L165) - [scripts/setup-network-isolation.sh](file://scripts/setup-network-isolation.sh#L70-L95) 章节来源 - [crates/docker_manager/src/manager.rs](file://crates/docker_manager/src/manager.rs#L105-L165) - [scripts/setup-network-isolation.sh](file://scripts/setup-network-isolation.sh#L1-L112) ### 镜像来源验证与多镜像配置 - 多镜像配置 - 支持按服务类型选择镜像,包含全局默认与架构特定镜像,策略为仅使用服务特定配置。 - 缓存与选择 - 提供镜像缓存配置,支持 TTL 与最大条目数;镜像选择策略为 ServiceOnly。 - 建议 - 通过 registry 前缀与服务特定镜像保证来源可控;结合镜像签名与拉取策略,进一步强化来源可信度。 ```mermaid classDiagram class MultiImageConfig { +services +global_defaults +selection_strategy +cache_config +validate() +hash_key() } class ServiceConfig { +service_type +image/arm64/amd64 +mounts +environment +resource_limits +get_image_for_platform(platform) +validate() } MultiImageConfig --> ServiceConfig : "包含" ``` 图表来源 - [crates/shared_types/src/multi_image_config.rs](file://crates/shared_types/src/multi_image_config.rs#L43-L110) - [crates/shared_types/src/multi_image_config.rs](file://crates/shared_types/src/multi_image_config.rs#L361-L406) - [crates/shared_types/src/service_config.rs](file://crates/shared_types/src/service_config.rs#L153-L188) 章节来源 - [crates/shared_types/src/multi_image_config.rs](file://crates/shared_types/src/multi_image_config.rs#L43-L110) - [crates/shared_types/src/multi_image_config.rs](file://crates/shared_types/src/multi_image_config.rs#L361-L406) - [crates/shared_types/src/service_config.rs](file://crates/shared_types/src/service_config.rs#L153-L188) ### API 端点访问控制、输入验证与防滥用 - 访问控制 - 当前未实现显式的鉴权/授权中间件;建议在反向代理层或网关处增加认证与授权策略。 - 输入验证 - 主服务与 Agent Runner 均对请求进行基本校验(如 prompt 非空),并在业务层进行并发控制与会话清理。 - 防滥用 - 通过并发请求限制与会话缓存清理,避免同一项目下的并发冲突;建议引入速率限制中间件或上游限流策略。 ```mermaid sequenceDiagram participant Client as "客户端" participant RC as "rcoder 主服务" participant AR as "agent_runner 服务" Client->>RC : "POST /chat" RC->>RC : "校验请求参数" RC->>AR : "转发请求" AR->>AR : "并发检查/会话清理" AR-->>RC : "返回结果" RC-->>Client : "返回响应" ``` 图表来源 - [crates/rcoder/src/handler/chat_handler.rs](file://crates/rcoder/src/handler/chat_handler.rs#L108-L170) - [crates/agent_runner/src/handler/chat_handler.rs](file://crates/agent_runner/src/handler/chat_handler.rs#L174-L238) 章节来源 - [crates/rcoder/src/handler/chat_handler.rs](file://crates/rcoder/src/handler/chat_handler.rs#L108-L170) - [crates/agent_runner/src/handler/chat_handler.rs](file://crates/agent_runner/src/handler/chat_handler.rs#L174-L238) ### 配置文件与敏感信息管理 - 配置优先级 - 命令行参数 > 环境变量 > 配置文件 > 默认配置;Docker 配置支持环境变量覆盖。 - 敏感信息建议 - 将密钥、令牌等敏感信息通过环境变量注入,避免写入 config.yml;必要时使用密钥管理服务或容器编排平台的机密存储。 - 配置文件生成 - 首次启动会生成默认配置文件,建议在部署时以只读方式挂载或通过环境变量覆盖。 章节来源 - [crates/rcoder/src/config.rs](file://crates/rcoder/src/config.rs#L253-L332) - [crates/agent_runner/src/config.rs](file://crates/agent_runner/src/config.rs#L110-L191) - [config.yml](file://config.yml#L1-L161) ### 网络隔离脚本实施与影响 - 规则生效范围 - 为 rcoder- 前缀网络添加 DROP 规则,阻止访问常见内网地址段;规则在系统重启后会丢失,需持久化。 - 实施建议 - 将脚本加入系统启动项或 systemd 服务;定期检查规则有效性;结合防火墙策略与网络命名空间进一步加固。 章节来源 - [scripts/setup-network-isolation.sh](file://scripts/setup-network-isolation.sh#L1-L112) ### 日志与追踪、健康检查与可观测性 - 日志 - 结构化 JSON 日志按天滚动,支持 trace_id 传播,便于审计与跨服务关联。 - 追踪 - 中间件生成并传播 trace_id,便于端到端链路追踪。 - 健康检查 - Pingora 代理提供健康检查循环与统计接口,便于监控后端健康状态。 ```mermaid sequenceDiagram participant RC as "rcoder 主服务" participant PM as "Pingora 代理" participant HC as "健康检查循环" RC->>PM : "启动代理服务" PM->>HC : "启动健康检查循环" HC->>HC : "周期性检查后端连通性" PM-->>RC : "健康状态快照/统计" ``` 图表来源 - [crates/rcoder/src/main.rs](file://crates/rcoder/src/main.rs#L168-L209) - [crates/agent_runner/src/main.rs](file://crates/agent_runner/src/main.rs#L80-L121) - [crates/pingora-proxy/src/service.rs](file://crates/pingora-proxy/src/service.rs#L556-L596) 章节来源 - [crates/rcoder/src/main.rs](file://crates/rcoder/src/main.rs#L274-L321) - [crates/agent_runner/src/main.rs](file://crates/agent_runner/src/main.rs#L181-L232) - [crates/pingora-proxy/src/service.rs](file://crates/pingora-proxy/src/service.rs#L556-L596) ### 最小权限原则与系统提示词约束 - 最小权限 - 容器禁用特权模式并丢弃网络相关能力,减少潜在攻击面。 - 系统提示词约束 - Agent Runner 的系统提示词包含多项安全禁令,禁止内网探测、反向 Shell、框架转换等行为,有助于降低风险。 章节来源 - [crates/docker_manager/src/manager.rs](file://crates/docker_manager/src/manager.rs#L147-L165) - [crates/agent_runner/src/utils/system_prompt.rs](file://crates/agent_runner/src/utils/system_prompt.rs#L96-L115) ## 依赖关系与耦合分析 - 组件耦合 - rcoder 主服务依赖 Docker 管理器进行容器生命周期管理;与 Pingora 代理耦合用于后端发现与健康检查;与 Agent Runner 通过容器内通信协作。 - 外部依赖 - Docker API、iptables、Pingora 代理、OpenTelemetry/Tracing。 - 潜在风险 - Docker socket 挂载与权限配置不当可能导致容器逃逸;网络隔离规则缺失可能使容器访问内网。 ```mermaid graph LR RC["rcoder 主服务"] --> DM["Docker 管理器"] RC --> PM["Pingora 代理"] RC --> AR["agent_runner 服务"] NI["网络隔离脚本"] -.-> RC ``` 图表来源 - [crates/rcoder/src/main.rs](file://crates/rcoder/src/main.rs#L111-L158) - [crates/agent_runner/src/main.rs](file://crates/agent_runner/src/main.rs#L120-L178) - [scripts/setup-network-isolation.sh](file://scripts/setup-network-isolation.sh#L52-L95) 章节来源 - [crates/rcoder/src/main.rs](file://crates/rcoder/src/main.rs#L111-L158) - [crates/agent_runner/src/main.rs](file://crates/agent_runner/src/main.rs#L120-L178) ## 性能与安全权衡 - 性能 - 容器能力限制与网络隔离会带来一定开销,但显著降低逃逸与横向移动风险。 - 安全 - 建议在生产环境启用严格的镜像来源验证、最小权限与网络隔离;结合速率限制与上游防护,平衡吞吐与安全。 [本节为通用指导,无需引用具体文件] ## 故障排查与安全审计 - 日志审计 - 检查 logs 目录下的 JSON 日志,结合 trace_id 进行关联分析;关注健康检查失败与代理统计异常。 - 网络隔离验证 - 使用脚本列出当前规则,确认 rcoder- 网络的 DROP 规则已生效;必要时重新加载规则。 - 配置核验 - 确认环境变量覆盖生效,敏感信息未出现在配置文件中;检查 Docker 配置与挂载路径。 - 漏洞扫描 - 建议对镜像进行静态扫描,识别高危漏洞;对运行时容器进行定期扫描与基线核查。 章节来源 - [crates/rcoder/src/main.rs](file://crates/rcoder/src/main.rs#L274-L321) - [scripts/setup-network-isolation.sh](file://scripts/setup-network-isolation.sh#L97-L112) - [crates/rcoder/src/config.rs](file://crates/rcoder/src/config.rs#L253-L332) ## 结论 RCoder 在容器隔离、网络隔离、日志与追踪方面具备良好基础。建议在生产环境中补充鉴权/授权、速率限制、镜像来源验证与漏洞扫描机制,严格使用环境变量管理敏感信息,并完善网络隔离规则的持久化与监控,以实现更全面的安全保障与可审计性。