4.4. 在 Azure 上部署机密容器
在部署 OpenShift 沙盒容器后,您可以在 Microsoft Azure Cloud Computing Services 上部署机密容器。
Azure 上的机密容器只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
集群要求
- 您已在安装 Confidential compute attestation Operator 的集群上安装了 Red Hat OpenShift Container Platform 4.15 或更高版本。
您可以执行以下步骤来部署机密容器:
- 安装 Confidential compute attestation Operator。
- 为 Trustee 创建路由。
- 启用机密容器功能门。
- 更新对等 pod 配置映射。
-
删除
KataConfig自定义资源(CR)。 -
重新创建
KataConfigCR。 - 创建 Trustee 身份验证 secret。
- 创建 Trustee 配置映射。
配置 attestation 策略:
- 创建参考值。
- 为 attested 客户端创建 secret。
- 创建资源访问策略。
- 可选:创建一个 attestation 策略来覆盖默认策略。
- 如果您的 TEE 是 Intel Trust Domain Extensions,请配置置备证书缓存服务。
-
创建
KbsConfigCR。 - 验证 attestation 进程。
4.4.1. 安装 Confidential compute attestation Operator 复制链接链接已复制到粘贴板!
您可以使用 CLI 在 Azure 上安装 Confidential compute attestation Operator。
先决条件
-
已安装 OpenShift CLI(
oc)。 -
您可以使用具有
cluster-admin角色的用户访问集群。
流程
创建
trustee-namespace.yaml清单文件:apiVersion: v1 kind: Namespace metadata: name: trustee-operator-system
apiVersion: v1 kind: Namespace metadata: name: trustee-operator-systemCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建
trustee-operator-system命名空间:oc apply -f trustee-namespace.yaml
$ oc apply -f trustee-namespace.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建
trustee-operatorgroup.yaml清单文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建 operator 组:
oc apply -f trustee-operatorgroup.yaml
$ oc apply -f trustee-operatorgroup.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建
trustee-subscription.yaml清单文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建订阅:
oc apply -f trustee-subscription.yaml
$ oc apply -f trustee-subscription.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令验证 Operator 是否已正确安装:
oc get csv -n trustee-operator-system
$ oc get csv -n trustee-operator-systemCopy to Clipboard Copied! Toggle word wrap Toggle overflow 此命令可能需要几分钟来完成。
运行以下命令监控进程:
watch oc get csv -n trustee-operator-system
$ watch oc get csv -n trustee-operator-systemCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME DISPLAY PHASE trustee-operator.v0.1.0 Trustee Operator 0.1.0 Succeeded
NAME DISPLAY PHASE trustee-operator.v0.1.0 Trustee Operator 0.1.0 SucceededCopy to Clipboard Copied! Toggle word wrap Toggle overflow
4.4.2. 为 Trustee 创建路由 复制链接链接已复制到粘贴板!
您可以为 Trustee 使用边缘 TLS 终止创建安全路由。外部入口流量以 HTTPS 的形式到达路由器 pod,并以 HTTP 的形式传递给 Trustee pod。
先决条件
- 您已启用了 Confidential Containers 功能门。
- 已安装 Confidential compute attestation Operator。
流程
运行以下命令来创建边缘路由:
oc create route edge --service=kbs-service --port kbs-port \ -n trustee-operator-system
$ oc create route edge --service=kbs-service --port kbs-port \ -n trustee-operator-systemCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意注: 目前,只支持带有有效 CA 签名证书的路由。您不能使用带有自签名证书的路由。
运行以下命令设置
TRUSTEE_HOST变量:TRUSTEE_HOST=$(oc get route -n trustee-operator-system kbs-service \ -o jsonpath={.spec.host})$ TRUSTEE_HOST=$(oc get route -n trustee-operator-system kbs-service \ -o jsonpath={.spec.host})Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令验证路由:
echo $TRUSTEE_HOST
$ echo $TRUSTEE_HOSTCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
kbs-service-trustee-operator-system.apps.memvjias.eastus.aroapp.io
kbs-service-trustee-operator-system.apps.memvjias.eastus.aroapp.ioCopy to Clipboard Copied! Toggle word wrap Toggle overflow 为对等 pod 配置映射记录这个值。
4.4.3. 启用机密容器功能门 复制链接链接已复制到粘贴板!
您必须启用 Confidential Containers 功能门。
流程
创建
cc-feature-gate.yaml清单文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建配置映射:
oc apply -f cc-feature-gate.yaml
$ oc apply -f cc-feature-gate.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
4.4.4. 更新对等 pod 配置映射 复制链接链接已复制到粘贴板!
您必须为机密容器更新对等 pod 配置映射。
将安全引导设置为 true 以默认启用。默认值为 false,这代表存在安全风险。
流程
从 Azure 实例获取以下值:
检索并记录 Azure 资源组:
AZURE_RESOURCE_GROUP=$(oc get infrastructure/cluster -o jsonpath='{.status.platformStatus.azure.resourceGroupName}') && echo "AZURE_RESOURCE_GROUP: \"$AZURE_RESOURCE_GROUP\""$ AZURE_RESOURCE_GROUP=$(oc get infrastructure/cluster -o jsonpath='{.status.platformStatus.azure.resourceGroupName}') && echo "AZURE_RESOURCE_GROUP: \"$AZURE_RESOURCE_GROUP\""Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检索并记录 Azure VNet 名称:
AZURE_VNET_NAME=$(az network vnet list --resource-group ${AZURE_RESOURCE_GROUP} --query "[].{Name:name}" --output tsv)$ AZURE_VNET_NAME=$(az network vnet list --resource-group ${AZURE_RESOURCE_GROUP} --query "[].{Name:name}" --output tsv)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这个值用于检索 Azure 子网 ID。
检索并记录 Azure 子网 ID:
AZURE_SUBNET_ID=$(az network vnet subnet list --resource-group ${AZURE_RESOURCE_GROUP} --vnet-name $AZURE_VNET_NAME --query "[].{Id:id} | [? contains(Id, 'worker')]" --output tsv) && echo "AZURE_SUBNET_ID: \"$AZURE_SUBNET_ID\""$ AZURE_SUBNET_ID=$(az network vnet subnet list --resource-group ${AZURE_RESOURCE_GROUP} --vnet-name $AZURE_VNET_NAME --query "[].{Id:id} | [? contains(Id, 'worker')]" --output tsv) && echo "AZURE_SUBNET_ID: \"$AZURE_SUBNET_ID\""Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检索并记录 Azure 网络安全组(NSG) ID:
AZURE_NSG_ID=$(az network nsg list --resource-group ${AZURE_RESOURCE_GROUP} --query "[].{Id:id}" --output tsv) && echo "AZURE_NSG_ID: \"$AZURE_NSG_ID\""$ AZURE_NSG_ID=$(az network nsg list --resource-group ${AZURE_RESOURCE_GROUP} --query "[].{Id:id}" --output tsv) && echo "AZURE_NSG_ID: \"$AZURE_NSG_ID\""Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检索并记录 Azure 区域:
AZURE_REGION=$(az group show --resource-group ${AZURE_RESOURCE_GROUP} --query "{Location:location}" --output tsv) && echo "AZURE_REGION: \"$AZURE_REGION\""$ AZURE_REGION=$(az group show --resource-group ${AZURE_RESOURCE_GROUP} --query "{Location:location}" --output tsv) && echo "AZURE_REGION: \"$AZURE_REGION\""Copy to Clipboard Copied! Toggle word wrap Toggle overflow
根据以下示例创建
peer-pods-cm.yaml清单文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 如果工作负载中没有定义实例大小,
"Standard_DC2as_v5"值是默认值。确保实例类型支持可信环境。默认的"Standard_DC2as_v5"值用于 AMD SEV-SNP。如果您的 TEE 是 Intel TDX,请指定Standard_EC4eds_v5。 - 2
- 列出创建 pod 时可以指定的所有实例大小。这可让您为大型工作负载需要较少的内存和更小的实例大小的工作负载定义较小的实例大小。对于 Intel TDX,指定
"Standard_EC4eds_v5、Standard_EC8eds_v5、Standard_EC16eds_v5"。 - 3
- 指定您检索的
AZURE_SUBNET_ID值。 - 4
- 指定您检索的
AZURE_NSG_ID值。 - 5
- 可选:默认情况下,这个值会在运行
KataConfigCR 时填充,使用基于集群凭证的 Azure 镜像 ID。如果创建自己的 Azure 镜像,请指定正确的镜像 ID。 - 6
- 指定您检索到的
AZURE_REGION值。 - 7
- 指定您检索的
AZURE_RESOURCE_GROUP值。 - 8
- 指定 Trustee 路由的主机名。
- 9
- 指定
true以启用安全引导。
运行以下命令来创建配置映射:
oc apply -f peer-pods-cm.yaml
$ oc apply -f peer-pods-cm.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令重启
peerpodconfig-ctrl-caa-daemon守护进程集:oc set env ds/peerpodconfig-ctrl-caa-daemon \ -n openshift-sandboxed-containers-operator REBOOT="$(date)"
$ oc set env ds/peerpodconfig-ctrl-caa-daemon \ -n openshift-sandboxed-containers-operator REBOOT="$(date)"Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.4.5. 删除 KataConfig 自定义资源 复制链接链接已复制到粘贴板!
您可以使用命令行删除 KataConfig 自定义资源(CR)。
删除 KataConfig CR 会从集群中移除运行时及其相关资源。
删除 KataConfig CR 会自动重启 worker 节点。重启可能需要 10 到 60 分钟。妨碍重启时间的因素如下:
- 带有更多 worker 节点的大型 OpenShift Container Platform 部署。
- 激活 BIOS 和 Diagnostics 实用程序。
- 在硬盘而不是 SSD 上部署。
- 在物理节点上部署,如裸机,而不是在虚拟节点上部署。
- CPU 和网络较慢。
先决条件
-
已安装 OpenShift CLI(
oc)。 -
您可以使用具有
cluster-admin角色的用户访问集群。
流程
运行以下命令来删除
KataConfigCR:oc delete kataconfig example-kataconfig
$ oc delete kataconfig example-kataconfigCopy to Clipboard Copied! Toggle word wrap Toggle overflow OpenShift 沙盒容器 Operator 会删除最初为在集群中启用运行时创建的所有资源。
重要当您删除
KataConfigCR 时,CLI 会停止响应,直到所有 worker 节点重启为止。在执行验证前,您必须等待删除过程完成。运行以下命令验证自定义资源是否已删除:
oc get kataconfig example-kataconfig
$ oc get kataconfig example-kataconfigCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
No example-kataconfig instances exist
No example-kataconfig instances existCopy to Clipboard Copied! Toggle word wrap Toggle overflow
卸载使用云供应商部署的 OpenShift 沙盒容器时,您必须删除所有 pod。任何剩余的 pod 资源都可能会导致云供应商出现意外几率。
4.4.6. 重新创建 KataConfig 自定义资源 复制链接链接已复制到粘贴板!
您必须为机密容器重新创建 KataConfig 自定义资源(CR)。
创建 KataConfig CR 会自动重启 worker 节点。重启可能需要 10 到 60 分钟。妨碍重启时间的因素如下:
- 带有更多 worker 节点的大型 OpenShift Container Platform 部署。
- 激活 BIOS 和 Diagnostics 实用程序。
- 在硬盘而不是 SSD 上部署。
- 在物理节点上部署,如裸机,而不是在虚拟节点上部署。
- CPU 和网络较慢。
先决条件
-
您可以使用具有
cluster-admin角色的用户访问集群。
流程
根据以下示例创建
example-kataconfig.yaml清单文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 可选:如果您应用了节点标签在特定节点上安装
kata-remote,请指定键和值,例如cc: 'true'。
运行以下命令来创建
KataConfigCR:oc apply -f example-kataconfig.yaml
$ oc apply -f example-kataconfig.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 新的
KataConfigCR 被创建,并在 worker 节点上作为运行时类安装kata-remote。在验证安装前,等待
kata-remote安装完成,以及 worker 节点重新引导。运行以下命令监控安装进度:
watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"
$ watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 安装kataNodes下所有 worker 的状态并且条件InProgress为False时,而不指定原因,则会在集群中安装kata-remote。运行以下命令验证守护进程集:
oc get -n openshift-sandboxed-containers-operator ds/peerpodconfig-ctrl-caa-daemon
$ oc get -n openshift-sandboxed-containers-operator ds/peerpodconfig-ctrl-caa-daemonCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令验证运行时类:
oc get runtimeclass
$ oc get runtimeclassCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME HANDLER AGE kata kata 152m kata-remote kata-remote 152m
NAME HANDLER AGE kata kata 152m kata-remote kata-remote 152mCopy to Clipboard Copied! Toggle word wrap Toggle overflow
4.4.7. 创建信任身份验证 secret 复制链接链接已复制到粘贴板!
您必须为 Trustee 创建身份验证 secret。
先决条件
-
已安装 OpenShift CLI(
oc)。 -
您可以使用具有
cluster-admin角色的用户访问集群。
流程
运行以下命令来创建私钥:
openssl genpkey -algorithm ed25519 > privateKey
$ openssl genpkey -algorithm ed25519 > privateKeyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建公钥:
openssl pkey -in privateKey -pubout -out publicKey
$ openssl pkey -in privateKey -pubout -out publicKeyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建 secret:
oc create secret generic kbs-auth-public-key --from-file=publicKey -n trustee-operator-system
$ oc create secret generic kbs-auth-public-key --from-file=publicKey -n trustee-operator-systemCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令验证 secret:
oc get secret -n trustee-operator-system
$ oc get secret -n trustee-operator-systemCopy to Clipboard Copied! Toggle word wrap Toggle overflow
4.4.8. 创建信任配置映射 复制链接链接已复制到粘贴板!
您必须创建配置映射来配置 Trustee 服务器。
先决条件
- 您已为 Trustee 创建了路由。
流程
创建
kbs-config-cm.yaml清单文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建配置映射:
oc apply -f kbs-config-cm.yaml
$ oc apply -f kbs-config-cm.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
4.4.9. 配置 attestation 策略 复制链接链接已复制到粘贴板!
您可以配置以下 attestation 策略设置:
- 参考值
您可以通过指定硬件平台的可信摘要来配置参考值。
客户端从正在运行的软件、受信任的执行环境(TEE)硬件和固件中收集测量,并将声明中的引用提交到 Attestation Server。这些测量必须与注册到 Trustee 的可信摘要匹配。此过程可确保机密虚拟机(CVM)正在运行预期的软件堆栈,并且未被篡改。
- 客户端的 secret
- 您必须创建一个或多个 secret 与 attested 客户端共享。
- 资源访问策略
您必须为 Trustee 策略引擎配置策略,以确定要访问哪些资源。
不要将 Trustee 策略引擎与 Attestation Service 策略引擎混淆,这决定了 TEE 证据的有效性。
- attestation 策略
- 可选:您可以通过创建自己的 attestation 策略来覆盖默认的 attestation 策略。
- 为 TDX 置备证书缓存服务
如果您的 TEE 是 Intel Trust Domain Extensions (TDX),您必须配置置备证书缓存服务(PCCS)。PCCS 检索置备认证密钥(PCK)证书,并将其缓存在本地数据库中。
重要不要使用公共 Intel PCCS 服务。在内部或公共云中使用本地缓存服务。
流程
创建
rvps-configmap.yaml清单文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 如果需要,为您的硬件平台指定可信摘要。否则,将它留空。
运行以下命令来创建 RVPS 配置映射:
oc apply -f rvps-configmap.yaml
$ oc apply -f rvps-configmap.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 根据以下示例,创建一个或多个 secret 与 attested 客户端共享:
oc create secret generic kbsres1 --from-literal key1=<res1val1> \ --from-literal key2=<res1val2> -n trustee-operator-system
$ oc create secret generic kbsres1 --from-literal key1=<res1val1> \ --from-literal key2=<res1val2> -n trustee-operator-systemCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在本例中,
kbsres1机密有两个条目(key1、key2),信任ee 客户端会检索。您可以根据要求添加更多 secret。创建
resourcepolicy-configmap.yaml清单文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 资源策略
policy.rego的名称必须与 Trustee 配置映射中定义的资源策略匹配。 - 2
- 资源策略遵循 Open Policy Agent 规格。当 TEE 不是 tester 的示例时,此示例允许检索所有资源。
运行以下命令来创建资源策略配置映射:
oc apply -f resourcepolicy-configmap.yaml
$ oc apply -f resourcepolicy-configmap.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:根据以下示例创建一个
attestation-policy.yaml清单文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- attestation 策略遵循 Open Policy Agent 规格。在本例中,attestation 策略将 attestation 报告中提供的声明与 RVPS 数据库中注册的引用值进行比较。只有所有值都匹配时才会成功 attestation 进程。
运行以下命令来创建 attestation 策略配置映射:
oc apply -f attestation-policy.yaml
$ oc apply -f attestation-policy.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您的 TEE 是 Intel TDX,请创建一个
tdx-config.yaml清单文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定 PCCS URL,例如
https://localhost:8081/sgx/certification/v4/。
运行以下命令来创建 TDX 配置映射:
oc apply -f tdx-config.yaml
$ oc apply -f tdx-config.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
4.4.10. 创建 KbsConfig 自定义资源 复制链接链接已复制到粘贴板!
您必须创建 KbsConfig 自定义资源(CR)来启动 Trustee。
然后,您可以检查 Trustee pod 和 pod 日志以验证配置。
流程
创建
kbsconfig-cr.yaml清单文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建
KbsConfigCR:oc apply -f kbsconfig-cr.yaml
$ oc apply -f kbsconfig-cr.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
运行以下命令来设置默认项目:
oc project trustee-operator-system
$ oc project trustee-operator-systemCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令检查 pod:
oc get pods -n trustee-operator-system
$ oc get pods -n trustee-operator-systemCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY STATUS RESTARTS AGE trustee-deployment-8585f98449-9bbgl 1/1 Running 0 22m trustee-operator-controller-manager-5fbd44cd97-55dlh 2/2 Running 0 59m
NAME READY STATUS RESTARTS AGE trustee-deployment-8585f98449-9bbgl 1/1 Running 0 22m trustee-operator-controller-manager-5fbd44cd97-55dlh 2/2 Running 0 59mCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令设置
POD_NAME环境变量:POD_NAME=$(oc get pods -l app=kbs -o jsonpath='{.items[0].metadata.name}' -n trustee-operator-system)$ POD_NAME=$(oc get pods -l app=kbs -o jsonpath='{.items[0].metadata.name}' -n trustee-operator-system)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令检查 pod 日志:
oc logs -n trustee-operator-system $POD_NAME
$ oc logs -n trustee-operator-system $POD_NAMECopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.4.11. 验证测试过程 复制链接链接已复制到粘贴板!
您可以通过创建测试 pod 并检索其机密来验证 attestation 过程。
此流程是验证 attestation 是否正常工作的示例。不要将敏感数据写入标准 I/O,因为可使用内存转储捕获数据。只有写入内存的数据才会被加密。
默认情况下,嵌入在 pod VM 镜像中的代理侧策略禁用 Confidential Containers pod 的 exec 和日志 API。此策略可确保敏感数据不会写入标准 I/O。
在测试场景中,您可以通过向 pod 添加策略注解来覆盖运行时的限制。对于技术预览,远程测试不会验证运行时策略注解。
先决条件
- 如果 Trustee 服务器和测试 pod 没有在同一集群中运行,则已创建了路由。
流程
创建
verification-pod.yaml清单文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 此 pod 注解会覆盖阻止敏感数据写入标准 I/O 的策略。
运行以下命令来创建 pod:
oc create -f verification-pod.yaml
$ oc create -f verification-pod.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,连接到
ocp-cc-pod的 Bash shell:oc exec -it ocp-cc-pod -- bash
$ oc exec -it ocp-cc-pod -- bashCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来获取 pod secret:
curl http://127.0.0.1:8006/cdh/resource/default/kbsres1/key1
$ curl http://127.0.0.1:8006/cdh/resource/default/kbsres1/key1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
res1val1
res1val1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 只有当 attestation 成功时才会返回 secret。