Privasys/enclave-os-virtual
GitHub: Privasys/enclave-os-virtual
在 Intel TDX 或 AMD SEV-SNP 机密虚拟机中运行 OCI 容器,将完整工作负载堆栈的度量值嵌入 RA-TLS 证书扩展,实现客户端单次 TLS 握手即可完成端到端远程证明。
Stars: 0 | Forks: 0
# Enclave OS (虚拟)
**在机密虚拟机(Confidential VM)内运行容器工作负载,并提供端到端的远程证明。**
Enclave OS Virtual 在 [Intel TDX](https://www.intel.com/content/www/us/en/developer/tools/trust-domain-extensions/overview.html)(或 AMD SEV-SNP)机密虚拟机中运行 OCI 容器。每个容器镜像摘要、环境变量、卷挂载和平台配置都会被度量到一个确定性的 Merkle 树中,并通过 [RA-TLS](https://github.com/Privasys/ra-tls-caddy) 嵌入到 X.509 证书扩展中。客户端可以在单次 TLS 握手中验证完整的工作负载堆栈——无需带外证明协议。
作为 [Privasys](https://privasys.org) 机密计算平台的一部分,与 [Enclave OS Mini](https://github.com/Privasys/enclave-os-mini) (SGX/WASM) 并行。
## 架构
```
┌─────────────────────────────────────────────────────────┐
│ Intel TDX / AMD SEV-SNP Confidential VM │
│ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ Enclave OS Virtual │ │
│ │ │ │
│ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │
│ │ │ ra-tls- │ │ Workload │ │ Management │ │ │
│ │ │ caddy │ │ Launcher │ │ Agent │ │ │
│ │ │ (TLS + │ │ (containerd│ │ (mTLS API) │ │ │
│ │ │ reverse │ │ lifecycle)│ │ │ │ │
│ │ │ proxy) │ │ │ │ │ │ │
│ │ └─────┬──────┘ └─────┬──────┘ └────────────┘ │ │
│ │ │ │ │ │
│ │ │ ┌──────────┴──────────┐ │ │
│ │ │ │ containerd │ │ │
│ │ │ └──────────┬──────────┘ │ │
│ │ │ ┌──────────┴──────────┐ │ │
│ │ └────┤ OCI Containers │ │ │
│ │ │ ┌─────┐ ┌──────┐ │ │ │
│ │ │ │App │ │ DB │ │ │ │
│ │ │ │ │ │ │ │ │ │
│ │ │ └─────┘ └──────┘ │ │ │
│ │ └─────────────────────┘ │ │
│ └──────────────────────────────────────────────────┘ │
│ │
│ dm-verity root │ UKI Secure Boot │ measured /etc/ │
└─────────────────────────────────────────────────────────┘
```
## 工作原理
1. **启动** — 虚拟机从一个受 dm-verity 保护、使用 [tdx-image-base](https://github.com/Privasys/tdx-image-base) 构建的 UKI 安全启动镜像启动。
2. **动态加载** — 管理器启动时不包含任何容器。操作员调用 `POST /api/v1/containers`(通过运维 JWT 或 OIDC 认证)在运行时加载容器。每个请求指定一个摘要锚定的 OCI 镜像引用、环境变量、卷和端口。
3. **拉取与验证** — OCI 镜像通过 containerd 拉取。每个镜像摘要都会根据加载请求中锚定的 `@sha256:...` 引用进行验证。
4. **Merkle 树** — 平台 Merkle 树和每容器 Merkle 树会在每次从 CA 证书、镜像摘要和容器配置加载/卸载后重新计算。
5. **RA-TLS 证书** — Merkle 根和容器元数据作为 X.509 扩展嵌入到 RA-TLS 证书中,同时包含 TDX/SEV-SNP 远程证明引用。
6. **TLS 握手** — 通过 TLS 连接的客户端会收到一个证书链,证明:正在运行哪个 TEE、启动了什么 OS 镜像、部署了哪些容器(通过摘要)以及它们的配置方式。
7. **健康与指标** — 管理代理通过 mTLS 保护的通道暴露 `/healthz`、`/readyz`、`/api/v1/status` 和 Prometheus `/metrics`。
## OID 扩展
所有 Privasys OID 都位于弧 `1.3.6.1.4.1.65230` 下:
| OID | 名称 | 描述 |
|-----|------|-------------|
| `1.2.840.113741.1.5.5.1.6` | TDX Quote | Intel TDX 远程证明引用 |
| `1.2.840.113741.1.13.1.0` | SGX Quote | Intel SGX 远程证明引用 |
| `1.3.6.1.4.1.65230.1.1` | Platform Config Merkle Root | 平台配置树的 SHA-256 根 |
| `1.3.6.1.4.1.65230.2.4` | containerd Version Hash | containerd 版本字符串的 SHA-256 |
| `1.3.6.1.4.1.65230.2.5` | Combined Images Hash | 覆盖所有容器镜像摘要的 SHA-256 |
| `1.3.6.1.4.1.65230.2.6` | Data Encryption Key Origin | `"external"` (BYOK) 或 `"enclave-generated"` — 证明静态数据加密和密钥来源 |
| `1.3.6.1.4.1.65230.3.1` | Container Config Merkle Root | 每容器配置树的 SHA-256 根 |
| `1.3.6.1.4.1.65230.3.2` | Container Image Digest | OCI 镜像的原始 SHA-256 摘要 |
| `1.3.6.1.4.1.65230.3.3` | Container Image Ref | 完整的 OCI 镜像引用字符串 |
## 工作负载清单
```
version: "1"
platform:
hostname: enclave.example.com
ca_cert: /etc/enclave-os/tls/ca.pem
ca_key: /etc/enclave-os/tls/ca-key.pem
attestation_backend: tdx
containers:
- name: postgres
image: "docker.io/library/postgres@sha256:..."
port: 5432
internal: true
env:
POSTGRES_DB: mydb
health_check:
tcp: "127.0.0.1:5432"
- name: myapp
image: "ghcr.io/example/myapp@sha256:..."
hostname: app.example.com
port: 8080
health_check:
http: "http://127.0.0.1:8080/healthz"
```
有关完整的 Web 应用 + PostgreSQL 示例,请参阅 [dist/examples/manifest-example.yaml](dist/examples/manifest-example.yaml)。
## 静态数据加密
数据分区(`/data`)始终使用 **LUKS2 加密**。加密密钥可以是:
| 模式 | 来源 | 方式 |
|------|--------|-----|
| **BYOK** | 操作员提供的密码 | 通过云实例元数据或配置传递 |
| **自动生成** | 随机 256 位密钥 | 在首次启动且未提供外部密钥时生成 |
启动时,`luks-data.service` 在 `data.mount` 之前运行:
1. 从实例元数据读取密码(BYOK)或生成一个
2. 在首次启动时使用 LUKS2 格式化分区,或打开现有卷
3. 将密钥来源(`"external"` 或 `"enclave-generated"`)写入 `/run/luks/dek-origin`
4. 管理器读取该来源,并在每个 RA-TLS 证书中将其发布为 **OID 2.6**
客户端可以在 TLS 握手中验证静态数据加密状态和密钥来源。
## 构建
```
# 需要 Go 1.25+ (支持 RA-TLS challenge-response 的 Privasys fork)
go build -o manager ./cmd/manager/
```
## 运行
```
# 启动 workload launcher 和 management API
manager serve \
--operations-cert /etc/enclave-os/operations.crt \
--attestation-backend tdx \
--agent-addr :9443 \
--agent-tls-cert /run/manager/tls/server.pem \
--agent-tls-key /run/manager/tls/server-key.pem \
--oidc-issuer https://auth.privasys.org
```
有关所有标志和配置选项,请参阅 [docs/setup.md](docs/setup.md)。
## 发布版本
每个带标签的发布版本都会发布:
| 制品 | 描述 |
|----------|-------------|
| **dm-verity root hash** | 只读根文件系统上每个字节的 SHA-256 —— 主要的代码身份度量 |
| **Disk image** | 可启动的 TDX 机密虚拟机镜像(CI 生成的特定云格式) |
| **Disk tarball** | `enclave-os-virtual-VERSION.tar.gz`(GitHub Release 资产) |
dm-verity 根哈希嵌入在内核命令行(`roothash=...`)中,并在启动时扩展到 **RTMR[1]**。客户端可以通过 RA-TLS 检查服务器证书中的 TDX 引用来验证它。
有关完整的度量列表,请参阅 [GitHub Releases](https://github.com/Privasys/enclave-os-virtual/releases)。
## 产品系列
| 产品 | TEE | 工作负载模型 | 仓库 |
|---------|-----|----------------|------|
| **Enclave OS Mini** | Intel SGX | WASM 模块 | [enclave-os-mini](https://github.com/Privasys/enclave-os-mini) |
| **Enclave OS Virtual** | Intel TDX / AMD SEV-SNP | OCI 容器 | 本仓库 |
两者共享相同的 RA-TLS 远程证明模型、OID 弧和 Merkle 树设计。
## 安全
有关漏洞报告,请参阅 [SECURITY.md](SECURITY.md)。
## 许可证
[GNU Affero General Public License v3.0](LICENSE)
标签:AMD SEV-SNP, CISA项目, DevSecOps, EVTX分析, EVTX分析, Intel TDX, JSONLines, Merkle 树, OCI 容器, RA-TLS, TLS 握手, Web截图, X.509 证书, 上游代理, 内核隔离, 可信执行环境, 完整性度量, 容器安全, 容器运行时, 日志审计, 机密虚拟机, 机密计算, 硬件安全, 网络安全, 自定义请求头, 远程证明, 隐私保护, 零信任