---
title: "Cosigner 安全模型"
description: "Cosigner 安全模型：信任边界、身份认证、静态数据加密、加固、审计和供应链验证。"
url: https://docs.fystack.io/zh/cosigner/security
last_updated: 2026-11-13
---

> ## Documentation index
> Fetch the complete documentation index at: https://docs.fystack.io/llms.txt
> Use it to discover all available pages before exploring further.

# Cosigner 安全模型

任何单一方都无法独自转移资金：Fystack 不行，你的宿主机不行，中间的任何环节也不行。

## 谁控制什么

| 你 | Fystack |
| --- | --- |
| Cosigner 宿主机、存储、网络 | Apex：配对、身份、吊销 |
| 存储密钥：密码或 KMS 策略 | Orchestrator：会话 |
| 回调服务器、策略和密钥 | Gateway：数据流认证和中继 |
| 备份、导出、升级 | MPCium 节点和工作区策略 |

## 签名控制

每个签名都必须通过以下所有检查：

1. Apex 中的 **工作区策略** 和[审批组](https://docs.fystack.io/product/approval-group.md)。
2. **发起方签名**：Orchestrator 只接受由 Apex 签名的请求。
3. **委员会锁定**：参与方和门限必须与密钥生成时一致。
4. **Orchestrator 签名**：Cosigner 使用配对时锁定的密钥对其进行验证。
5. **审批者签名**：设有审批者的钱包必须提供。
6. **你的回调**：必须返回已签名的 `approve`。
7. **门限**：必须有你的 Cosigner 的分片参与。

即使 Fystack 被完全攻破，第 1 到 5 项可能失效，但第 6 项依然有效：它运行在你的基础设施上，使用 Fystack 从未见过的密钥，并针对待签名的原始字节进行检查。

## 身份认证

**Cosigner 身份**：Ed25519 密钥。存储在 `state/cosigner.key`（`0600`）。通过配对令牌向 Apex 注册一次。它用于签署 Gateway JWT、每个会话事件和对等消息，以及审计条目。

**Cosigner → Fystack**：每个数据流使用一个 EdDSA JWT。

```json
{
  "iss": "<cosigner_id>",
  "sub": "<cosigner_id>",
  "aud": "cosigner-gateway",
  "ctx": "cosigner-gateway-auth-v1",
  "jti": "<random>",
  "iat": 1791794400,
  "exp": 1791794460
}
```

Gateway 只接受 `EdDSA`，会检查 audience 和过期时间（允许 30 秒偏差），并在 2 分钟内拒绝重复使用的 `jti`。吊销会立即断开正在运行的数据流。

**Fystack → Cosigner**：Orchestrator 密钥及其指纹在配对时锁定。每条控制消息都必须由该密钥签名，并带有递增的序列号。结果签名使用单独的前缀，因此无法被当作控制消息重放。

**参与方 ↔ 参与方**：对等方密钥通过已签名的 `session_start` 传递。使用已签名的 X25519 交换、按方向区分的 HKDF 密钥以及 ChaCha20-Poly1305。Gateway 和 Orchestrator 只能看到密文。

## 静态数据加密

_Diagram: 密码或 AWS KMS 解封存储 KEK，HKDF 派生出四个作用域密钥，每一行均采用 AES-256-GCM 加密_

- **存储密钥**：32 字节，启动时通过密码（Argon2id `t=3`，64 MiB）或 AWS KMS 解封。仅保存在内存中，使用后清零。
- **作用域密钥**：HKDF-SHA256 为 `shares`、`preparams`、`checkpoints`、`metadata` 分别派生独立的密钥。
- **数据行**：AES-256-GCM，随机 12 字节 nonce，与作用域和行键绑定。被移动的行将无法解密。
- **明文分片不会外泄**：会从事件中剥离。导出内容使用 RSA-OAEP + AES-GCM 或口令进行封装。

**密码解锁**：`cosigner-cli` 绝不会将密码放入环境变量或命令参数中。它会打开一个一次性的本地 socket；容器通过 HMAC 证明一个 32 字节令牌，然后接收经 AES-GCM 加密的密码。

## 运行时加固

- 基于 distroless、非 root 运行的镜像，并按摘要锁定。
- 只读根文件系统；`/tmp` 和 `/run/cosigner` 使用 `tmpfs`。
- 移除所有 capability，启用 `no-new-privileges`。
- 配置和密钥以只读方式挂载。
- 限制：控制消息 128 KiB，每分钟 20 次启动和 10 次中止，5 个并发会话。

## 审计日志

仅追加的 JSONL。每个条目都经过签名并包含前一条目的哈希，因此任何修改和删除都可被检测到。请将其传输到宿主机之外保存。

## 供应链验证

二进制文件、安装程序和镜像均由 GitHub Actions 发布工作流构建，并使用 Sigstore 签名。证书中注明了确切的工作流和标签。运行时流水线还会执行 `go mod verify`、竞态测试、可复现性检查、`govulncheck` 和 `gosec`，并附带 SBOM 和来源证明。

`cosigner-cli` 会在每次执行 `up`、`update` 和 `doctor` 时进行验证。如需手动检查：

**验证发布产物**

```bash
cosign verify ghcr.io/fystack/cosigner@sha256:<digest> \
  --certificate-identity https://github.com/fystack/cosigner/.github/workflows/release.yml@refs/tags/<version> \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com
```

```bash
curl -sSLO https://cosigner.fystack.io/<version>/install.sh
curl -sSLO https://cosigner.fystack.io/<version>/install.sh.sigstore.json
cosign verify-blob install.sh \
  --bundle install.sh.sigstore.json \
  --certificate-identity https://github.com/fystack/cosigner-cli/.github/workflows/release.yml@refs/tags/<version> \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com
```

摘要和校验和：[cosigner.fystack.io](https://cosigner.fystack.io/#verify)。如发现不匹配，请报告至 security@fystack.io。

## 剩余风险

- **常规模式即宿主机托管。** 拥有宿主机 root 或 Docker 权限的人可以读取内存。[Nitro Enclave](https://docs.fystack.io/cosigner/nitro-enclave.md) 支持（即将推出）将消除这一风险。
- **回调质量。** 不解码交易就批准的回调毫无意义。请默认拒绝。
- **可用性。** 恶意宿主机可以阻断流量，或删除、回滚数据行。加密能检测修改，但无法检测删除。请保留备份。
- **重复运行。** 切勿在两台宿主机上运行同一个 Cosigner。
- **恢复材料。** 备份密码和导出口令可以解锁你的分片。请将它们分开存放。

在投入真实资金之前：测试恢复、重启、故障和 IAM 吊销，并进行独立审查。
