aws-samples/sample-nitro-enclaves-k8s-app

GitHub: aws-samples/sample-nitro-enclaves-k8s-app

展示如何在 Amazon EKS 集群上部署运行于 AWS Nitro Enclave 隔离计算环境中的应用,提供从集群搭建到安全应用部署的完整端到端示例。

Stars: 0 | Forks: 0

# AWS Nitro Enclaves 与 Kubernetes - Hello World 示例 在 Amazon EKS (Elastic Kubernetes Service) 上的 AWS Nitro Enclave 内部署“Hello World”应用程序。 ## 概述 AWS Nitro Enclaves 使客户能够创建隔离的计算环境,以进一步保护并安全地处理高度敏感的数据,例如个人身份信息 (PII)、医疗保健、财务和知识产权数据等,这些处理均在他们的 Amazon EC2 实例中进行。Nitro Enclaves 使用与为 EC2 实例提供 CPU 和内存隔离相同的 Nitro Hypervisor 技术。 Nitro Enclaves 帮助客户减少其最敏感数据处理应用程序的攻击面。Enclaves 提供了一个隔离、强化且高度受限的环境,用于托管安全关键型应用程序。Nitro Enclaves 包含针对您软件的加密证明,因此您可以确保只有经过授权的代码在运行;同时它还集成了 AWS Key Management Service,因此只有您的 enclave 才能访问敏感材料。 使用 AWS Nitro Enclaves 除了使用 Amazon EC2 实例以及与 Nitro Enclaves 一起使用的任何其他 AWS 服务所产生的费用外,没有额外的费用。 本示例涵盖: 1. 创建带有启用 Nitro Enclave 节点的 EKS 集群 2. 部署 Nitro Enclaves Kubernetes Device Plugin 3. 构建并部署一个运行 Nitro Enclave 的容器化应用程序 ## 架构 ``` ┌─────────────────────────────────────────────────────────────┐ │ EKS Cluster │ │ ┌───────────────────────────────────────────────────────┐ │ │ │ Nitro Enclave-Enabled Node │ │ │ │ ┌──────────────────┐ ┌───────────────────────────┐ │ │ │ │ │ Device Plugin │ │ Application Pod │ │ │ │ │ │ (DaemonSet) │ │ ┌─────────────────────┐ │ │ │ │ │ │ │ │ │ Container │ │ │ │ │ │ │ Exposes: │ │ │ (run.sh launches │ │ │ │ │ │ │ aws.ec2.nitro/ │ │ │ enclave) │ │ │ │ │ │ │ nitro_enclaves │ │ └─────────────────────┘ │ │ │ │ │ └──────────────────┘ └───────────────────────────┘ │ │ │ └────────────────────────────┬──────────────────────────┘ │ └───────────────────────────────┼─────────────────────────────┘ │ vsock (virtio socket) │ ┌───────────────▼───────────────┐ │ Nitro Enclave │ │ (hello.eif) │ │ │ │ • Isolated VM on host CPU │ │ • No network access │ │ • No persistent storage │ │ • Separate from K8s/Node │ └───────────────────────────────┘ ``` ## 前置条件 ### 所需工具 安装以下工具: - **AWS CLI** (v2.x) - [安装指南](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) - **kubectl** - [安装指南](https://kubernetes.io/docs/tasks/tools/) - **eksctl** - [安装指南](https://eksctl.io/installation/) - **Docker** - [安装指南](https://docs.docker.com/get-docker/) - **jq** - JSON 处理器(`sudo yum install jq` 或 `brew install jq`) - **nitro-cli** - 构建 EIF 文件所需。通过 `aws-nitro-enclaves-cli` 和 `aws-nitro-enclaves-cli-devel` 包安装([安装指南](https://docs.aws.amazon.com/enclaves/latest/user/nitro-enclave-cli-install.html)) ### AWS 要求 - 具有创建以下资源权限的 AWS 账户: - EKS 集群 - EC2 实例和启动模板 - ECR 存储库 - IAM 角色和策略 - 已配置 AWS 凭证(`aws configure`) - 带有子网的 VPC(eksctl 将在需要时创建一个) ### 实例要求 - **用于构建 EIF 文件**:需要安装 `aws-nitro-enclaves-cli` 和 `aws-nitro-enclaves-cli-devel` 包(不需要支持 Nitro Enclave 的实例) - **用于运行 enclave**:EKS 工作节点必须是支持 Nitro Enclave 的实例类型 ## 项目结构 ``` . ├── config.sh # Configuration file ├── README.md # This file ├── container/ │ ├── Dockerfile # Container image for K8s deployment │ └── run.sh # Script to launch enclave in container ├── enclave/ │ ├── Dockerfile.enclave # Dockerfile for EIF build │ └── hello.py # Hello World application ├── manifests/ │ ├── device-plugin-daemonset.yaml # Nitro Enclaves device plugin │ └── hello-enclave-deployment.yaml # Application deployment └── scripts/ ├── common.sh # Common utilities ├── 01_create_launch_template.sh # Create EC2 launch template ├── 02_create_eks_cluster.sh # Create EKS cluster ├── 03_deploy_device_plugin.sh # Deploy device plugin ├── 04_build_enclave_image.sh # Build EIF file ├── 05_build_container.sh # Build container image ├── 06_push_to_ecr.sh # Push to ECR ├── 07_deploy_application.sh # Deploy to K8s └── 99_cleanup.sh # Cleanup resources ``` ## 快速开始 ### 步骤 1:配置设置 编辑 `config.sh` 以自定义您的部署: ``` # 编辑配置 vi config.sh ``` 需要检查的关键设置: - `AWS_REGION` - 用于部署的 AWS 区域 - `CLUSTER_NAME` - 您的 EKS 集群的名称 - `NODE_INSTANCE_TYPE` - EC2 实例类型(必须支持 Nitro Enclaves) - `ENCLAVE_CPU_COUNT` - 为 enclave 预留的 CPU 数量 - `ENCLAVE_MEMORY_MIB` - 为 enclave 预留的内存 ### 步骤 2:使脚本可执行 ``` chmod +x scripts/*.sh ``` ### 步骤 3:创建启动模板 创建一个启用了 Nitro Enclaves 的 EC2 启动模板: ``` ./scripts/01_create_launch_template.sh ``` 这将创建一个启动模板,它会: - 在实例上启用 Nitro Enclaves - 安装并配置 Nitro Enclaves 分配器 - 为 enclave 使用预留 CPU 和内存 ### 步骤 4:创建 EKS 集群 创建带有托管节点组的 EKS 集群: ``` ./scripts/02_create_eks_cluster.sh ``` ⏱️ **注意**:此步骤大约需要 15-20 分钟。 ### 步骤 5:部署 Device Plugin 部署 Nitro Enclaves Kubernetes Device Plugin: ``` ./scripts/03_deploy_device_plugin.sh ``` 这将部署一个 DaemonSet,它会: - 将 Nitro Enclave 设备暴露给 Kubernetes - 允许 Pod 请求 `aws.ec2.nitro/nitro_enclaves` 资源 ### 步骤 6:构建 Enclave 镜像 (EIF) 构建 Enclave 镜像文件: ``` ./scripts/04_build_enclave_image.sh ``` ⚠️ **重要提示**:需要通过 `aws-nitro-enclaves-cli` 和 `aws-nitro-enclaves-cli-devel` 包安装 `nitro-cli`。构建 EIF 文件不需要支持 Nitro Enclave 的实例。 ### 步骤 7:构建容器镜像 构建将在 Kubernetes 中运行的容器: ``` ./scripts/05_build_container.sh ``` ### 步骤 8:推送到 ECR 将容器镜像推送到 Amazon ECR: ``` ./scripts/06_push_to_ecr.sh ``` ### 步骤 9:部署应用程序 部署 Hello World enclave 应用程序: ``` ./scripts/07_deploy_application.sh ``` ### 步骤 10:验证部署 检查部署状态: ``` # 查看 pod 状态 kubectl get pods -n nitro-enclaves # 查看 pod 日志 (enclave 输出) kubectl logs -n nitro-enclaves -l app=hello-enclave -f # Describe pod 以了解详细信息 kubectl describe pod -n nitro-enclaves -l app=hello-enclave ``` 预期输出: ``` ============================================================ Hello from AWS Nitro Enclave! ============================================================ This application is running inside a secure Nitro Enclave. Nitro Enclaves provide isolated compute environments to protect and securely process highly sensitive data. Enclave Information: - Hostname: - PID: 1 The enclave is isolated from the parent instance and has no external network connectivity, no persistent storage, and no interactive access. ------------------------------------------------------------ [Enclave Heartbeat #1] Still running securely... [Enclave Heartbeat #2] Still running securely... ``` ## 清理 要删除此演示创建的所有资源: ``` ./scripts/99_cleanup.sh ``` 或者选择性清理: ``` # 仅删除应用程序 ./scripts/99_cleanup.sh --app # 仅删除 EKS 集群 ./scripts/99_cleanup.sh --cluster # 查看所有选项 ./scripts/99_cleanup.sh --help ``` ## 配置参考 ### config.sh 变量 | 变量 | 默认值 | 描述 | |----------|---------|-------------| | `AWS_REGION` | `us-east-1` | 用于部署的 AWS 区域 | | `CLUSTER_NAME` | `nitro-enclaves-demo` | EKS 集群名称 | | `K8S_VERSION` | `1.29` | Kubernetes 版本 | | `NODE_INSTANCE_TYPE` | `m5.xlarge` | EC2 实例类型 | | `NODE_DESIRED_CAPACITY` | `1` | 工作节点数量 | | `ENCLAVE_CPU_COUNT` | `2` | 为 enclave 预留的 CPU 数量 | | `ENCLAVE_MEMORY_MIB` | `512` | 为 enclave 预留的内存 (MiB) | | `ECR_REPOSITORY_NAME` | `hello-enclave` | ECR 存储库名称 | ### 支持的实例类型 请参阅此[文档](https://docs.aws.amazon.com/enclaves/latest/user/nitro-enclave.html#nitro-enclave-reqs)以获取所有支持的实例类型 ## 故障排除 ### Pod 卡在 Pending 状态 检查 Device Plugin 是否正在运行: ``` kubectl get pods -n kube-system -l name=aws-nitro-enclaves-k8s-dp ``` 验证节点是否具有 enclave 资源: ``` kubectl get nodes -o json | jq '.items[].status.allocatable["aws.ec2.nitro/nitro_enclaves"]' ``` ### Enclave 启动失败 检查 Pod 日志: ``` kubectl logs -n nitro-enclaves -l app=hello-enclave ``` 验证节点上的 enclave 分配器是否正在运行: ``` # SSH 到节点并运行: systemctl status nitro-enclaves-allocator ``` ### 删除 Daemonset 并重新部署应用程序 ``` ###################################### # 步骤 1:删除当前的 hello-enclave deployment kubectl delete deployment hello-enclave-deployment -n nitro-enclaves # 步骤 2:更新 device plugin daemonset kubectl apply -f manifests/device-plugin-daemonset.yaml # 步骤 3:重启 device plugin pod 以应用新配置 kubectl delete pod -n kube-system -l name=aws-nitro-enclaves-k8s-dp # 步骤 4:等待 device plugin 重启并验证 CPU 资源已被发布 kubectl get pods -n kube-system -l name=aws-nitro-enclaves-k8s-dp -w # 一旦 Running 按下 Ctrl+C # 步骤 5:验证节点现在显示了 enclave CPU 资源 kubectl get nodes -o json | jq '.items[].status.allocatable | {"enclaves": .["aws.ec2.nitro/nitro_enclaves"], "cpus": .["aws.ec2.nitro/nitro_enclaves_cpus"], "hugepages-1Gi": .["hugepages-1Gi"]}' # 步骤 6:重新部署 hello-enclave 应用程序 ./scripts/07_deploy_application.sh # 步骤 7:检查 pod 状态 kubectl get pods -n nitro-enclaves -w ``` ### 重新部署应用程序版本 ``` ###################################### # 删除当前的 deployment kubectl delete deployment hello-enclave-deployment -n nitro-enclaves # 使用更新的设置重新部署 ./scripts/07_deploy_application.sh # Watch pod 状态 kubectl get pods -n nitro-enclaves -w # 一旦 Running,查看 enclave 日志 kubectl logs -n nitro-enclaves -l app=hello-enclave -f ``` ### 从主机节点看不到 Enclave 当您通过 SSH 连接到 EKS 节点并运行 `sudo nitro-cli describe-enclaves` 时,即使 enclave 正在运行,它也可能不会出现。这是预期的行为。 **发生这种情况的原因:** - `nitro-cli` 使用位于 `/run/nitro_enclaves/` 的 socket 来跟踪 enclave - Kubernetes Pod 拥有自己的 `/run` 挂载(容器命名空间隔离) - enclave 是从容器的上下文启动的,因此只在那里可见 **从 Pod 内部检查 enclave 状态:** ``` # 获取 pod 名称 POD=$(kubectl get pod -n nitro-enclaves -l app=hello-enclave -o jsonpath='{.items[0].metadata.name}') # 检查 enclave 状态 kubectl exec -n nitro-enclaves $POD -- nitro-cli describe-enclaves ``` 预期输出: ``` { "EnclaveName": "hello", "EnclaveID": "i-xxxxx-encxxxxx", "State": "RUNNING", "NumberOfCPUs": 2, "MemoryMiB": 1024 } ``` 这种 socket 命名空间隔离是有意为之的——它允许每个 Kubernetes Pod 独立管理自己的 enclave。 ### 找不到 nitro-cli 安装 nitro-cli: ``` sudo dnf install aws-nitro-enclaves-cli aws-nitro-enclaves-cli-devel -y ``` ## 安全注意事项 - **Enclave 隔离**:Nitro Enclave 与父实例进行了加密隔离 - **无持久存储**:Enclave 无法访问持久存储 - **无网络访问**:默认情况下,Enclave 没有外部网络连接 - **证明**:使用来自 `nitro-cli describe-eif` 的 PCR 值进行证明 ## 参考 - [AWS Nitro Enclaves 文档](https://docs.aws.amazon.com/enclaves/latest/user/) - [AWS Nitro Enclaves 与 Kubernetes](https://github.com/aws/aws-nitro-enclaves-with-k8s) - [Nitro Enclaves K8s Device Plugin](https://github.com/aws/aws-nitro-enclaves-k8s-device-plugin) - [Amazon EKS 文档](https://docs.aws.amazon.com/eks/latest/userguide/) ## 许可证 本项目基于 MIT-0 许可证授权。有关详细信息,请参阅 LICENSE 文件。
标签:Amazon EKS, AWS, AWS KMS, Cutter, DevSecOps, DPI, EC2, IaC, JSONLines, K8s部署, Nitro Enclaves, PII保护, ProjectDiscovery, TEE, Web截图, 上游代理, 个人信息保护, 加密证明, 医疗数据安全, 可信执行环境, 子域名突变, 安全隔离, 容器安全, 敏感数据处理, 数据保护, 机密计算, 系统架构, 网络安全, 虚拟化, 设备插件, 请求拦截, 逆向工具, 金融数据安全, 防篡改, 隐私保护, 零信任