AndrewDryga/emisar
GitHub: AndrewDryga/emisar
emisar 是一个基础设施操作授权与执行控制平面,让 AI 工具通过预声明且受控的动作集合安全地操作生产环境,而非获取原始 shell 访问权限。
Stars: 1 | Forks: 0
# emisar
**为 AI 工具批准的基础设施操作,在主机上强制执行。**
emisar 是一个控制平面、仅出站运行器和 MCP 桥接器,用于让 AI 工具请求一组有限且预先声明的操作,而无需接收原始的 shell 或 SSH 访问权限。
状态:**公测版。** 这个 monorepo 包含了完整的运行器、Phoenix 控制平面、公共网站和 MCP stdio 桥接器。
托管控制平面是目前支持的产品边界;自托管和气隙部署目前尚未正式可用。
## 它的功能
- 在每个运行器上加载带版本控制且内容寻址的 **action pack**。
- 通过 TLS websocket **向外**拨号连接到控制平面 —— 没有入站监听器。
- 当运行器播报新的、自定义的或更改的 pack 内容时阻止调度,直到管理员信任该哈希。
- 通过 OAuth 连接远程 MCP 客户端,并通过 `emisar-mcp` stdio 桥接器连接本地客户端。
- 应用基于用户的运行器作用域、风险等级策略、操作覆盖、人工批准以及可撤销的长期授权。
- 对于来自云端的每个 `run_action` 消息:
1. 根据操作声明的 schema 重新验证参数。
2. 重新计算并验证受信任的 pack 哈希。
3. 将云端提供的 opts 限制在操作的 `*_min`/`*_max` 边界内。
4. 通过 `os/exec` 执行,使用 **argv 数组,绝不使用 shell 字符串**。
5. 通过 websocket 流式传输经过行缓冲和脱敏的输出。
6. 将每次尝试的 hash 链 JSONL 事件写入本地安全日志。
- 将运行状态镜像到可搜索的审计日志中,并提供只读的 SIEM 导出。
## 它刻意避免做的事
- 不是沙盒或进程隔离器。
- 不是任意远程 shell 或通用的 `execute(command)` 工具。
- 不能替代 OS 级别的最小权限、进程隔离或客户变更管理控制。
- 不是 OSI 批准的开源软件。该仓库在 [`LICENSE.md`](LICENSE.md) 下提供源码可见许可。
请参阅 [`docs/security-model.md`](docs/security-model.md)。
## 安装(生产环境)
从门户创建运行器,以接收具有作用域的 bootstrap 密钥和生成的安装命令。适用于 Linux(systemd)和 macOS(launchd)的底层托管安装程序为:
```
curl -sSL https://raw.githubusercontent.com/andrewdryga/emisar/main/install.sh | sudo bash
```
这将下载最新标记的发布版本,验证 SHA256,创建专用的服务用户(Linux),安装 `/usr/local/bin/emisar`,在 `/etc/emisar/` 下方放置配置骨架,并安装带有 `Restart=on-failure` 监督和 `StartLimitBurst` 上限的 systemd unit 或 launchd plist。
安装后,如果门户生成的命令没有填充配置文件,请编辑 `/etc/emisar/config.yaml` 和 `/etc/emisar/runner.env`,然后启动服务。有关升级、卸载、气隙安装和完整操作命令,请参阅 [`docs/install.md`](docs/install.md)。
## 快速开始(开发 / 本地)
命令从仓库根目录运行。运行器是位于 `runner/` 下的独立 Go 模块(请参阅下方的[仓库布局](#repository-layout));构建它会将二进制文件放在 `bin/emisar`:
```
# 1. 构建 runner + MCP bridge
(cd runner && go build -o ../bin/emisar .)
(cd mcp && go build -o ../bin/emisar-mcp .)
# 2. 验证捆绑的 example packs
./bin/emisar pack validate ./packs/linux-core
./bin/emisar pack validate ./packs/cassandra
./bin/emisar pack validate ./packs/showcase
# 3. 查看 runner 将向 cloud 宣告的内容
./bin/emisar --config ./runner/examples/config.yaml state | jq
# 4. 在本地运行 action 进行调试(绕过 cloud)
./bin/emisar --config ./runner/examples/config.yaml \
action run linux.uptime --reason "smoke test"
# 5. 流式传输长时间运行的 action 的输出
./bin/emisar --config ./runner/examples/config.yaml \
action run linux.journalctl --arg unit=docker --stream
# 6. 检查 JSONL 日志
./bin/emisar --config ./runner/examples/config.yaml events tail --lines 20
```
以 daemon 模式运行(等待云命令):
```
EMISAR_AUTH_KEY=emkey-auth-... \
./bin/emisar --config ./runner/examples/config.yaml connect
```
## 文档
| 文档 | 主题 |
| --------------------------------------------------- | ---------------------------------------------------- |
| [docs/architecture.md](docs/architecture.md) | 包布局,runtime pipeline,启动序列。 |
| [docs/install.md](docs/install.md) | 生产环境安装,托管操作,升级。 |
| [docs/security-model.md](docs/security-model.md) | 考虑及明确不考虑的威胁。 |
| [docs/signed-dispatch.md](docs/signed-dispatch.md) | 仅运行人工签名的操作(客户端证明的调度)。 |
| [docs/action-packs.md](docs/action-packs.md) | 如何编写 pack。 |
| [docs/cloud-boundary.md](docs/cloud-boundary.md) | 控制平面和运行器各自强制执行的内容。 |
| [docs/wire-protocol.md](docs/wire-protocol.md) | JSON 消息类型,连接生命周期,opts。 |
## 仓库布局
采用 monorepo 架构,每个可部署组件对应一个文件夹,采用基于语言命名的布局。每个 Go 文件夹都是其独立的模块;Elixir 控制平面是一个 umbrella 项目。`go.work` 将两个 Go 模块连接在一起,以便于编辑器和 CLI 使用。
```
portal/ Elixir/Phoenix control plane (umbrella)
apps/emisar/ domain contexts: accounts, runs, policies, audit, billing
apps/emisar_web/ LiveView dashboard + marketing site + MCP HTTP API
runner/ Go module — on-host runner binary
main.go, connect.go, … CLI (cobra)
internal/cloud wire protocol + outbound websocket client
internal/engine action runtime (validate → clamp → execute → redact → journal)
internal/packs pack loader + in-memory registry
internal/executor exec/script process runner (line-buffered streaming)
internal/validation arg schema enforcement
internal/expressions tiny argv-substitution template engine
internal/redact output redaction
internal/audit hash-chained JSONL event log
internal/config config loader
pkg/actionspec action spec types (YAML schema)
pkg/packspec pack manifest types
examples/config.yaml example runner config
mcp/ Go module — stdio MCP bridge for Claude Code / Cursor / etc.
packs/ action pack catalog (YAML) — linux-core, cassandra, docker, + 70 more; consumed by the runner + portal
docs/ architecture, security, signed-dispatch, action-packs, cloud-boundary, wire-protocol
docker-compose.yml Full local stack: Postgres, portal, seeder, and runners
install.sh supervised install (systemd / launchd) — run against tarball
```
## 许可证
本仓库是**源码可见**的,而非 OSI 批准的开源软件。
提供代码的目的是让用户能够检查它、评估它、运行允许的内部用途、了解其工作原理以及贡献改进。它不可用于克隆产品、运营竞争服务、商业再分发、AI 训练、模型微调、embedding 语料库、净室复制或构建替代产品。
请参阅:
- [`LICENSE.md`](./LICENSE.md)
- [`AI-USE-POLICY.md`](.github/AI-USE-POLICY.md)
- [`CONTRIBUTING.md`](.github/CONTRIBUTING.md)
- [`CLA.md`](.github/CLA.md)
- [`NOTICE.md`](.github/NOTICE.md)
- [`SECURITY.md`](.github/SECURITY.md)
如需商业许可、托管使用、AI 权限或其他权利,请联系 `licensing@emisar.dev`。
标签:AI辅助运维, MCP, Streamlit, 命令执行控制, 日志审计, 测试用例, 访问控制, 运维工具