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 证书, 上游代理, 内核隔离, 可信执行环境, 完整性度量, 容器安全, 容器运行时, 日志审计, 机密虚拟机, 机密计算, 硬件安全, 网络安全, 自定义请求头, 远程证明, 隐私保护, 零信任