---
title: "Mô hình bảo mật của Cosigner"
description: "Mô hình bảo mật của Cosigner: ranh giới tin cậy, xác thực, mã hóa khi lưu trữ, gia cố, kiểm toán và xác minh chuỗi cung ứng."
url: https://docs.fystack.io/vi/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.

# Mô hình bảo mật của Cosigner

Không một bên nào có thể tự mình chuyển tiền: không phải Fystack, không phải host của bạn, cũng không phải bất kỳ thành phần nào ở giữa.

## Ai kiểm soát những gì

| Bạn | Fystack |
| --- | --- |
| Host chạy cosigner, lưu trữ, mạng | Apex: ghép nối, định danh, thu hồi |
| Khóa lưu trữ: mật khẩu hoặc chính sách KMS | Orchestrator: các phiên |
| Máy chủ callback, chính sách và khóa | Gateway: xác thực luồng và chuyển tiếp |
| Sao lưu, xuất khóa, nâng cấp | Các node MPCium và chính sách workspace |

## Các lớp kiểm soát khi ký

Mọi chữ ký đều phải vượt qua tất cả các lớp sau:

1. **Chính sách workspace** và [nhóm phê duyệt](https://docs.fystack.io/product/approval-group.md) trong Apex.
2. **Chữ ký initiator**: orchestrator chỉ chấp nhận các yêu cầu do Apex ký.
3. **Ghim ủy ban**: các thành viên và ngưỡng phải khớp với lúc tạo khóa.
4. **Chữ ký orchestrator**: cosigner xác minh chữ ký này bằng khóa đã ghim khi ghép nối.
5. **Chữ ký approver**: bắt buộc đối với các ví có approver.
6. **Callback của bạn**: phải trả về một `approve` có chữ ký.
7. **Ngưỡng**: bắt buộc phải có phần khóa từ cosigner của bạn.

Nếu Fystack bị xâm phạm hoàn toàn, các lớp từ 1 đến 5 có thể thất bại. Bước 6 vẫn giữ vững: nó chạy trên hạ tầng của bạn, với các khóa mà Fystack không bao giờ thấy, và kiểm tra trên chính dữ liệu byte thô đang được ký.

## Xác thực

**Định danh cosigner**: khóa Ed25519. Được lưu tại `state/cosigner.key` (`0600`). Được đăng ký với Apex một lần thông qua pairing token. Khóa này ký JWT gửi đến Gateway, mọi sự kiện phiên và thông điệp peer, cùng các mục nhật ký kiểm toán.

**Cosigner → Fystack**: JWT EdDSA cho mỗi luồng.

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

Gateway chỉ chấp nhận `EdDSA`, kiểm tra audience và thời hạn (cho phép lệch 30 giây) và từ chối `jti` dùng lại trong vòng 2 phút. Việc thu hồi sẽ ngắt ngay các luồng đang hoạt động.

**Fystack → cosigner**: Khóa và fingerprint của orchestrator được ghim khi ghép nối. Mọi thông điệp điều khiển phải được ký bằng khóa này kèm số thứ tự tăng dần. Chữ ký kết quả dùng một tiền tố riêng nên không thể bị phát lại dưới dạng thông điệp điều khiển.

**Thành viên ↔ thành viên**: Khóa của các peer được gửi kèm trong `session_start` có chữ ký. Trao đổi X25519 có chữ ký, khóa HKDF theo từng chiều, ChaCha20-Poly1305. Gateway và orchestrator chỉ thấy bản mã.

## Mã hóa khi lưu trữ

_Diagram: Mật khẩu hoặc AWS KMS mở khóa KEK lưu trữ, HKDF dẫn xuất bốn khóa theo phạm vi, mỗi hàng dữ liệu được mã hóa AES-256-GCM_

- **Khóa lưu trữ**: 32 byte, được mở khi khởi động từ mật khẩu (Argon2id `t=3`, 64 MiB) hoặc AWS KMS. Chỉ nằm trong bộ nhớ và được xóa trắng sau khi dùng.
- **Khóa theo phạm vi**: HKDF-SHA256 dẫn xuất các khóa riêng cho `shares`, `preparams`, `checkpoints`, `metadata`.
- **Hàng dữ liệu**: AES-256-GCM, nonce ngẫu nhiên 12 byte, gắn với phạm vi và khóa của hàng. Các hàng bị di chuyển sẽ không giải mã được.
- **Không có phần khóa dạng rõ nào rời khỏi cosigner**: bị loại khỏi các sự kiện. Bản xuất được niêm phong bằng RSA-OAEP + AES-GCM hoặc bằng passphrase.

**Mở khóa bằng mật khẩu**: `cosigner-cli` không bao giờ đặt mật khẩu vào biến môi trường hay tham số dòng lệnh. Nó mở một socket cục bộ dùng một lần; container chứng minh một token 32 byte qua HMAC và nhận mật khẩu đã được mã hóa AES-GCM.

## Gia cố môi trường chạy

- Image distroless, không chạy bằng root, được ghim theo digest.
- Hệ thống tệp gốc chỉ đọc; `tmpfs` cho `/tmp` và `/run/cosigner`.
- Loại bỏ mọi capability, `no-new-privileges`.
- Cấu hình và secret được mount ở chế độ chỉ đọc.
- Giới hạn: thông điệp điều khiển 128 KiB, 20 lần bắt đầu và 10 lần hủy mỗi phút, 5 phiên đồng thời.

## Nhật ký kiểm toán

JSONL chỉ ghi thêm. Mỗi mục đều được ký và chứa mã băm của mục trước đó, nên mọi chỉnh sửa và xóa đều có thể bị phát hiện. Hãy chuyển nhật ký ra ngoài host.

## Xác minh chuỗi cung ứng

Binary, trình cài đặt và image được build bởi các workflow phát hành trên GitHub Actions và được ký bằng Sigstore. Chứng chỉ ghi rõ chính xác workflow và tag. Pipeline runtime cũng chạy `go mod verify`, kiểm thử race, kiểm tra khả năng tái lập, `govulncheck` và `gosec`, đồng thời đính kèm SBOM và thông tin nguồn gốc (provenance).

`cosigner-cli` xác minh ở mỗi lần `up`, `update` và `doctor`. Để kiểm tra thủ công:

**Xác minh artifact phát hành**

```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
```

Digest và checksum: [cosigner.fystack.io](https://cosigner.fystack.io/#verify). Báo cáo các trường hợp không khớp đến security@fystack.io.

## Rủi ro còn lại

- **Chế độ thông thường = host nắm quyền lưu ký.** Quyền root hoặc Docker trên host có thể đọc bộ nhớ. Hỗ trợ [Nitro Enclave](https://docs.fystack.io/cosigner/nitro-enclave.md) (sắp ra mắt) sẽ loại bỏ rủi ro này.
- **Chất lượng callback.** Một callback phê duyệt mà không giải mã giao dịch thì không mang lại giá trị gì. Hãy mặc định từ chối.
- **Tính sẵn sàng.** Một host độc hại có thể chặn lưu lượng hoặc xóa và khôi phục lại các hàng dữ liệu cũ. Mã hóa phát hiện được chỉnh sửa, không phát hiện được việc xóa. Hãy duy trì bản sao lưu.
- **Trùng lặp.** Không bao giờ chạy cùng một cosigner trên hai host.
- **Dữ liệu khôi phục.** Mật khẩu sao lưu và passphrase xuất khóa có thể mở khóa phần khóa của bạn. Hãy lưu trữ chúng riêng biệt.

Trước khi dùng tiền thật: hãy kiểm thử khôi phục, khởi động lại, tình huống lỗi và thu hồi IAM, đồng thời nhờ một bên độc lập đánh giá.
