
# 安全

## 唯一的公开入口

实例只暴露一个网关，其余一切保持私有。

| 公开（经由网关） | 私有 |
|---|---|
| Web 应用（`/ui`，会话 cookie） | Forgejo 自身的网页界面和 `/api/v1` |
| MCP（`/mcp`，OAuth 或个人访问令牌） | Woodpecker 的界面和 `/ci` |
| REST 和 CLI（`/acahti/v1`） | 供执行节点使用的 Woodpecker gRPC 端口 |
| 基于 HTTPS 的 Git（`/<org>/<repo>.git`） | PostgreSQL |
| 制品仓库源（`/api/packages`） | |

内核的路径经由网关访问时返回 404。产品内容（文档、skill）完全不由实例提供，而是放在本站。

## 凭据

| 凭据 | 适用于 | 说明 |
|---|---|---|
| 访问令牌 | MCP、REST、CLI、Git、制品 | 在头像菜单 →「访问令牌」中创建。代表该成员。删除即吊销 |
| OAuth 访问令牌 | MCP、REST、Git、制品 | 成员授权 MCP 客户端后签发给该客户端；有效期 90 天，用刷新令牌续期 |
| 账号密码 | 网页登录、Git、制品、通过 HTTP Basic 访问 REST | CLI 从不发送。MCP 不接受。只有当邀请密码由 Acahti 生成时，管理员才能看到它；替换成员自己设置的密码需要显式确认的重置操作 |
| 会话 cookie | Web 应用、REST | 仅限浏览器 |

在 Acahti 中，SSH 密钥在任何地方都不是凭据。令牌拥有该成员的全部权限；本版本不支持按任务委派权限。Agent 会被告知绝不要把令牌粘贴到聊天中。

## 密钥

- 流水线密钥保存在控制面。值从不被列出或返回；没有读取 API。
- 只有组织管理员（组织范围）和仓库管理员（仓库范围）可以列出名称或写入值。
- 流水线步骤只有在其 YAML 中点名某个密钥时才会收到它。
- 外部系统（仓库源、集群）的凭据以具名密钥保存，从不放进 git 或 `with:`。

## 执行

- 控制面和「执行节点」是不同的主机。不受信任的流水线代码绝不会在控制面的数据旁边运行。
- 网关在任务开始前展开官方 pipe；执行节点按收到的内容和注入的环境变量执行。
- 执行节点通过你的局域网访问网关。切勿把 gRPC 端口暴露到互联网。

## 合并门禁

- 只有 head SHA 上最新的流水线为绿色时，`pr_merge` 才会成功。
- 分支保护、仓库权限和团队成员关系仍由人明确制定策略。

## 局限

- 流水线为绿色只代表配置的检查已通过，不代表软件没有缺陷。
- 受门禁控制的部署（`deploy_approve`）和成员管理仍需人来审批和处理。

## 报告漏洞

请在仓库上使用[私密漏洞报告](https://github.com/acahti-ai/acahti/security/advisories/new)，并附上受影响的版本和最小化的合成复现。不要在公开 issue 中写入凭据或利用细节。
