Execution-Layer Security (ELS) 面向AI代理——策略强制型shell,带审计功能。
macOS 注意: 通过 ESF(端点安全框架)+ NE(网络扩展)实现的原生 macOS 强制执行功能目前处于 Alpha 阶段。它可以端到端工作——文件、进程和网络事件通过系统扩展流向 Go 策略引擎——但预期会存在粗糙的边缘以及版本间的破坏性变更。对于当前的生产环境使用,我们推荐使用 Linux。
Windows 注意: 我们正在努力完成微筛选器驱动程序的签名。在此之前,仅完全支持 Windows WSL2 模式用于生产环境。
面向 AI 代理的安全、策略强制的执行网关。
agentsh 位于你的代理/工具链之下——拦截文件、网络、进程和信号活动(包括子进程树),强制执行你定义的策略,并发出结构化审计事件。
平台说明: Linux 提供完全强制(100% 安全评分)。macOS ESF+NE(90% 评分)处于 Alpha 阶段——功能可用但尚未达到生产就绪。Windows WSL2 提供等效于 Linux 的完全强制(100% 评分);原生 Windows 通过微筛选器驱动 + AppContainer(85% 评分)有待驱动签名。详见平台对比矩阵。
allow(允许)、deny(拒绝)、approve(需人工确认)、soft_delete(软删除)或 redirect(重定向)。db_services 实现的 Postgres 系列数据库流量代理工作流最终会执行任意代码(pip install、make test、python script.py)。传统的“执行命令前请求批准”控制止步于工具边界,无法看到该命令内部发生的情况。
agentsh 在运行时强制执行策略,因此子进程执行的隐藏工作仍然受到管控、记录,并在需要时获得批准。
大多数系统只能拒绝一个操作。agentsh 还可以重定向它。
这意味着当代理尝试错误的方法(或暴力破解的变通方案)时,策略可以将其引导至正确的路径——通过交换命令并返回指导——使代理保持在预设轨道上,减少无效重试。
示例:将 curl 重定向到经过审计的包装器```yaml command_rules:
**示例:将写入工作区外的操作重定向回内部**```yaml
file_rules:
- name: redirect-outside-writes
paths: ["/home/**", "/tmp/**"]
operations: [write, create]
decision: redirect
redirect_to: "/workspace/.scratch"
message: "Writes outside workspace redirected to /workspace/.scratch"
代理看到的是成功操作(而非错误),但你实际控制数据最终落地的位置。
容器隔离了主机面,而 agentsh 提供了容器内部的运行时可见性与策略。
macOS(Homebrew)```bash brew tap canyonroad/tap brew install --cask agentsh
这会安装包含 ESF+NE 系统扩展的 AgentSH 应用包。安装后,你将需要在**系统设置 > 通用 > 登录项与扩展**中批准该系统扩展。
**Linux(从 GitHub 发布版)**
从[发布页面](https://github.com/erans/agentsh/releases)下载适用于你平台的 `.deb`、`.rpm` 或 `.apk`。```bash
# Example for Debian/Ubuntu
sudo dpkg -i agentsh_<VERSION>_linux_amd64.deb
来自源码(Linux)```bash make build sudo install -m 0755 bin/agentsh bin/agentsh-shell-shim /usr/local/bin
**从源代码 (macOS)**```bash
# ESF+NE mode (full enforcement — Alpha, requires Xcode 15+)
make build-macos-enterprise
参见 macOS Build Guide 获取详细的 macOS 构建说明。
./bin/agentsh server --config configs/server-config.yaml
SID=$(./bin/agentsh session create --workspace . --json | jq -r .id) ./bin/agentsh exec "$SID" -- ls -la
./bin/agentsh exec --output json --events summary "$SID" -- curl https://example.com
---
### 检查实际强制的内容
`agentsh detect` 探测主机并报告哪些强制原语实际可用 —— seccomp、Landlock、FUSE、eBPF、ptrace、cgroups —— 按每个域的保护评分分组,再加上所选的安全模式。在受限主机(Daytona、E2B、Firecracker 类)上,如果 seccomp user-notify listener 无法安装,它会报告 *实际* 强制执行的模式,而不仅仅是内核所支持的模式。```bash
agentsh detect # human-readable protection report
agentsh detect config # emit a config tuned for this host
请参阅安全模式了解模式矩阵和调节参数。
agentsh exec $SID -- <your-command-here>agentsh exec --output json --events summary $SID -- <your-command-here>SID=$(agentsh session create --workspace . --json | jq -r .id)---
### 自动启动(无需手动守护进程步骤)
你**不需要**自己启动 `agentsh server`。
* 首次执行 `agentsh exec`(或任何被拦截的 `/bin/sh`/`/bin/bash`)将自动使用 `configs/server-config.yaml`(或 `AGENTSH_CONFIG` 如果已设置)启动一个本地服务器。
* 该服务器在会话生命周期内保持 FUSE 层和策略引擎运行;后续命令会复用该服务器。
* 如果你希望手动管理服务器生命周期,请设置 `AGENTSH_NO_AUTO=1`。
---
## 在 Docker 中使用(带 Shell 拦截)
参见 `Dockerfile.example`,获取基于 Debian 的最小镜像示例。
在镜像内部,安装发布包(或复制你的构建产物),然后激活拦截:```bash
agentsh shim install-shell \
--root / \
--shim /usr/bin/agentsh-shell-shim \
--bash \
--i-understand-this-modifies-the-host
将垫片指向您的服务器(边车或主机):```dockerfile ENV AGENTSH_SERVER=http://127.0.0.1:18080
现在容器中的任何 `/bin/sh -c ...` 或 `/bin/bash -lc ...` 都会通过 agentsh 路由。
### 非交互式执行
默认情况下,当标准输入不是 TTY 时,shim 会绕过策略(以保留管道命令的二进制数据)。在命令始终是非交互式但仍需执行策略的平台上(例如 exe.dev、sandbox API),请添加 `--force`:```bash
agentsh shim install-shell \
--root / \
--shim /usr/bin/agentsh-shell-shim \
--bash \
--force \
--i-understand-this-modifies-the-host
这将写入 /etc/agentsh/shim.conf 并设置 force=true,shim 在启动时会读取该配置。无论 shell 是如何生成的(与环境变量或 profile 脚本不同),该配置文件始终有效。在进程环境中设置 AGENTSH_SHIM_FORCE=1 可达到相同的逐进程效果。
推荐模式: 在同一个 Pod/Service 中以 sidecar(或 PID 1)方式运行 agentsh,并共享一个工作区卷;shim 确保每一次 shell 跳转都保持在策略管控之下。
allowdenyapprove(人工批准)redirect(替换命令)audit(允许 + 记录)soft_delete(隔离删除并支持恢复)规则位于命名的策略中;会话选择某个策略。
默认值:
configs/server-config.yamlconfigs/policies/default.yamlAGENTSH_POLICY_NAME 设置为允许的策略名称(无后缀)。如果未设置/无效/不允许,则使用默认策略。policies.env_policy(allow/deny、max_bytes、max_keys、block_iteration)和每个命令的 env_* 覆盖。空允许列表默认为最小的 PATH/LANG/TERM/HOME 并包含内置的拒绝列表;设置 block_iteration 以隐藏环境变量迭代(需要环境 shim)。config.yml 中配置 policies.allowed;空值表示仅允许默认策略。policies.manifest_path 为 SHA256 清单,以便在加载策略文件时进行验证。env_allow,agentsh 会构建一个最小的环境(PATH/LANG/TERM/HOME)并移除内置的密钥。env_allow/env_deny 以及 env_max_keys/env_max_bytes 在执行时限制并过滤子进程环境。env_block_iteration: true(全局或每条规则)隐藏环境枚举;设置 policies.env_shim_path 为 libenvshim.so,以便 agentsh 注入 LD_PRELOAD + AGENTSH_ENV_BLOCK_ITERATION=1。BASH_ENV 用于禁用绕过 seccomp 的 shell 内建命令。在 sandbox.env_inject(全局)或策略级别的 env_inject(覆盖全局)中配置。config.yml 和 configs/ 下的策略样本。version: 1 name: default
file_rules:
name: allow-workspace paths: ["/workspace", "/workspace/**"] operations: [read, open, stat, list, write, create, mkdir, chmod, rename] decision: allow
name: approve-workspace-delete paths: ["/workspace", "/workspace/**"] operations: [delete, rmdir] decision: approve message: "Delete {{.Path}}?" timeout: 5m
name: deny-ssh-keys paths: ["/home//.ssh/", "/root/.ssh/**"] operations: ["*"] decision: deny
network_rules:
command_rules:
---
### 使用策略```bash
# Start the server with your policy
./bin/agentsh server --config configs/server-config.yaml
# Create a session pinned to a policy
SID=$(./bin/agentsh session create --workspace /workspace --policy default --json | jq -r .id)
# Exec commands; responses include decision + guidance when blocked/approved
./bin/agentsh exec "$SID" -- rm -rf /workspace/tmp
agentsh 支持多种认证方法: