你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
本文介绍了为 ARO 群集部署机密容器所需的步骤。 此过程涉及两个主要部分和多个步骤:
首先,部署 OpenShift Sandboxed Containers,包括以下步骤:
安装 OpenShift Sandboxed Containers Operator。
创建对等 Pod 机密。
创建对等 Pod 配置映射。
创建 Azure 机密。
部署 OpenShift Sandboxed Containers 后,部署机密容器。 这包括以下步骤:
安装 Trustee Operator。
为 Trustee 创建路由。
启用机密容器功能门。
更新对等 Pod 配置映射。
创建 KataConfig 自定义资源。
创建 Trustee 身份验证机密。
创建 Trustee 配置映射。
配置受托人。
创建 KbsConfig 自定义资源。
验证证明过程。
在您开始之前
在开始部署过程之前,请确保满足以下先决条件:
具有至少一个工作器节点的现有 ARO 群集(版本 4.15 或更高版本)
通过
cluster-admin
角色对群集的访问权限
重要
对于应用程序中的每个 Pod,都有一个一对一映射,其中包含相应的机密虚拟机 (CVM)。 这意味着每个新 Pod 都需要单独的 CVM,以确保 Pod 之间的隔离。
第 1 部分:部署 OpenShift Sandboxed Containers
安装 OpenShift Sandboxed Containers Operator。
可以通过 CLI 或 OpenShift Web 控制台安装 OpenShift Sandboxed Containers Operator。
创建
osc-namespace.yaml
清单文件:apiVersion: v1 kind: Namespace metadata: name: openshift-sandboxed-containers-operator
通过运行以下命令创建命名空间:
$ oc apply -f osc-namespace.yaml
创建
osc-operatorgroup.yaml
清单文件:apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: sandboxed-containers-operator-group namespace: openshift-sandboxed-containers-operator spec: targetNamespaces: - openshift-sandboxed-containers-operator
通过运行以下命令创建操作员组
$ oc apply -f osc-operatorgroup.yaml
创建
osc-subscription.yaml
清单文件:apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: sandboxed-containers-operator namespace: openshift-sandboxed-containers-operator spec: channel: stable installPlanApproval: Automatic name: sandboxed-containers-operator source: redhat-operators sourceNamespace: openshift-marketplace startingCSV: sandboxed-containers-operator.v1.7.0
通过运行以下命令来创建订阅:
$ oc apply -f osc-subscription.yaml
通过运行以下命令来验证是否已正确安装 Operator:
$ oc get csv -n openshift-sandboxed-containers-operator
注释
此命令可能需要几分钟才能完成。
通过运行以下命令来观察过程:
$ watch oc get csv -n openshift-sandboxed-containers-operator
示例输出
NAME DISPLAY VERSION REPLACES PHASE openshift-sandboxed-containers openshift-sandboxed-containers-operator 1.7.0 1.6.0 Succeeded
在 Web 控制台中,导航到 Operators → OperatorHub。
在“按关键字筛选”字段中,键入“OpenShift Sandboxed Containers Operator”。
选择“OpenShift Sandboxed Containers Operator”磁贴,然后选择“安装”。
在“安装 Operator”页上,从可用的“更新通道”选项列表中选择“稳定”。
验证对于“已安装的命名空间”选择了“Operator 建议的命名空间”。 这会在必需的
openshift-sandboxed-containers-operator
命名空间中安装 Operator。 如果此命名空间尚不存在,则会自动创建它。注释
尝试在 openshift-sandboxed-containers-operator 以外的命名空间中安装 OpenShift Sandboxed Containers Operator 会导致安装失败。
验证对于“审批策略”选择了“自动”。 “自动”是默认值,并在新的 z 流版本可用时启用对 OpenShift Sandboxed Containers 的自动更新。
选择“安装”。
导航到“Operator”→“已安装的 Operator”来验证是否已安装该 Operator。
创建对等 Pod 机密
必须为 OpenShift Sandboxed Containers 创建对等 Pod 机密。 该机密存储用于创建 Pod 虚拟机 (VM) 映像和对等 Pod 实例的凭据。
默认情况下,OpenShift Sandboxed Containers Operator 根据用于创建群集的凭据创建机密。 但是,你可以手动创建使用不同凭据的机密。
通过运行以下命令检索 Azure 订阅 ID:
$ AZURE_SUBSCRIPTION_ID=$(az account list --query "[?isDefault].id" \ -o tsv) && echo "AZURE_SUBSCRIPTION_ID: \"$AZURE_SUBSCRIPTION_ID\""
通过运行以下命令生成基于角色的访问控制 (RBAC) 内容:
$ az ad sp create-for-rbac --role Contributor --scopes /subscriptions/$AZURE_SUBSCRIPTION_ID \ --query "{ client_id: appId, client_secret: password, tenant_id: tenant }"
示例输出
{ "client_id": `AZURE_CLIENT_ID`, "client_secret": `AZURE_CLIENT_SECRET`, "tenant_id": `AZURE_TENANT_ID` }
记录 RBAC 输出以在机密对象中使用。
根据以下示例创建 peer-pods-secret.yaml 清单文件:
apiVersion: v1 kind: Secret metadata: name: peer-pods-secret namespace: openshift-sandboxed-containers-operator type: Opaque stringData: AZURE_CLIENT_ID: "<azure_client_id>" AZURE_CLIENT_SECRET: "<azure_client_secret>" AZURE_TENANT_ID: "<azure_tenant_id>" AZURE_SUBSCRIPTION_ID: "<azure_subscription_id>"
- 指定
AZURE_CLIENT_ID value
。 - 指定
AZURE_CLIENT_SECRET value
。 - 指定
AZURE_TENANT_ID value
。 - 指定
AZURE_SUBSCRIPTION_ID value
。
- 指定
通过运行以下命令来创建机密:
$ oc apply -f peer-pods-secret.yaml
创建对等 Pod 配置映射
从 Azure 获取以下值:
检索并记录 Azure 资源组:
$ AZURE_RESOURCE_GROUP=$(oc get infrastructure/cluster -o jsonpath='{.status.platformStatus.azure.resourceGroupName}') && echo "AZURE_RESOURCE_GROUP: \"$AZURE_RESOURCE_GROUP\""
检索并记录 Azure VNet 名称:
$ AZURE_VNET_NAME=$(az network vnet list --resource-group ${AZURE_RESOURCE_GROUP} --query "[].{Name:name}" --output tsv)
此值用于检索 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 网络安全组 (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 区域:
$ AZURE_REGION=$(az group show --resource-group ${AZURE_RESOURCE_GROUP} --query "{Location:___location}" --output tsv) && echo "AZURE_REGION: \"$AZURE_REGION\""
根据以下示例创建 peer-pods-cm.yaml 清单文件:
apiVersion: v1 kind: ConfigMap metadata: name: peer-pods-cm namespace: openshift-sandboxed-containers-operator data: CLOUD_PROVIDER: "azure" VXLAN_PORT: "9000" AZURE_INSTANCE_SIZE: "Standard_B2als_v2" AZURE_INSTANCE_SIZES: "Standard_B2als_v2,Standard_D2as_v5,Standard_D4as_v5,Standard_D2ads_v5" AZURE_SUBNET_ID: "<azure_subnet_id>" AZURE_NSG_ID: "<azure_nsg_id>" PROXY_TIMEOUT: "5m" AZURE_IMAGE_ID: "<azure_image_id>" AZURE_REGION: "<azure_region>" AZURE_RESOURCE_GROUP: "<azure_resource_group>" DISABLECVM: "true"
- 如果未在工作负载中定义实例大小,则
AZURE_INSTANCE_SIZE
为默认值。 -
AZURE_INSTANCE_SIZES
列出了在创建 Pod 时可以指定的所有实例大小。 这允许你为需要较少内存和较少 CPU 的工作负载定义较小的实例大小,或为较大的工作负载指定较大的实例大小。 - 指定你检索的
AZURE_SUBNET_ID
值。 - 指定你检索的
AZURE_NSG_ID
值。 -
AZURE_IMAGE_ID
是可选的。 默认情况下,当你运行 KataConfig 自定义资源时,会基于你的群集凭据使用 Azure 映像 ID 填充此值。 如果你创建自己的 Azure 映像,请指定正确的映像 ID。 - 指定你检索的
AZURE_REGION
值。 - 指定你检索的
AZURE_RESOURCE_GROUP
值。
- 如果未在工作负载中定义实例大小,则
通过运行以下命令创建配置映射:
$ oc apply -f peer-pods-cm.yaml
创建 Azure 机密
你必须创建 SSH 密钥机密,Azure 使用该机密来创建虚拟机。
通过运行以下命令生成 SSH 密钥对:
$ ssh-keygen -f ./id_rsa -N ""
通过运行以下命令来创建机密对象:
$ oc create secret generic ssh-key-secret \ -n openshift-sandboxed-containers-operator \ --from-file=id_rsa.pub=./id_rsa.pub
删除你创建的 SSH 密钥:
$ shred --remove id_rsa.pub id_rsa
第 2 部分:部署机密容器
安装 Trustee Operator。
创建 trustee-namespace.yaml 清单文件:
apiVersion: v1 kind: Namespace metadata: name: trustee-operator-system
通过运行以下命令创建 rustee-operator-system 命名空间:
$ oc apply -f trustee-namespace.yaml
创建 trustee-operatorgroup.yaml 清单文件:
apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: trustee-operator-group namespace: trustee-operator-system spec: targetNamespaces: - trustee-operator-system
通过运行以下命令创建 Operator 组:
$ oc apply -f trustee-operatorgroup.yaml
创建 trustee-subscription.yaml 清单文件:
apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: trustee-operator namespace: trustee-operator-system spec: channel: stable installPlanApproval: Automatic name: trustee-operator source: redhat-operators sourceNamespace: openshift-marketplace startingCSV: trustee-operator.v0.1.0
通过运行以下命令来创建订阅:
$ oc apply -f trustee-subscription.yaml
通过运行以下命令来验证是否已正确安装 Operator:
$ oc get csv -n trustee-operator-system
此命令可能需要几分钟才能完成。
通过运行以下命令来观察过程:
$ watch oc get csv -n trustee-operator-system
示例输出
NAME DISPLAY PHASE trustee-operator.v0.1.0 Trustee Operator 0.1.0 Succeeded
为 Trustee 创建路由
为 Trustee 创建具有边缘 TLS 终止的安全路由。 外部入口流量作为 HTTPS 到达路由器 Pod,并作为 HTTP 传递到 Trustee Pod。
通过运行以下命令创建边缘路由:
$ oc create route edge --service=kbs-service --port kbs-port \ -n trustee-operator-system
注释
目前,仅支持具有有效 CA 签名证书的路由。 不能使用具有自签名证书的路由。
通过运行以下命令设置 TRUSTEE_HOST 变量:
$ TRUSTEE_HOST=$(oc get route -n trustee-operator-system kbs-service \ -o jsonpath={.spec.host})
通过运行以下命令来验证路由:
$ echo $TRUSTEE_HOST
示例输出
kbs-service-trustee-operator-system.apps.memvjias.eastus.aroapp.io
记录此值以用于对等 Pod 配置映射。
启用机密容器功能门
创建
cc-feature-gate.yaml
清单文件:apiVersion: v1 kind: ConfigMap metadata: name: osc-feature-gates namespace: openshift-sandboxed-containers-operator data: confidential: "true"
通过运行以下命令创建配置映射:
$ oc apply -f cc-feature-gate.yaml
更新对等 Pod 配置映射
从你的 Azure 实例获取以下值:
一. 检索并记录 Azure 资源组:
$ AZURE_RESOURCE_GROUP=$(oc get infrastructure/cluster -o jsonpath='{.status.platformStatus.azure.resourceGroupName}') && echo "AZURE_RESOURCE_GROUP: \"$AZURE_RESOURCE_GROUP\""
二. 检索并记录 Azure VNet 名称:
$ AZURE_VNET_NAME=$(az network vnet list --resource-group ${AZURE_RESOURCE_GROUP} --query "[].{Name:name}" --output tsv)
此值用于检索 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 网络安全组 (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\""
v. 检索并记录 Azure 区域:
$ AZURE_REGION=$(az group show --resource-group ${AZURE_RESOURCE_GROUP} --query "{Location:___location}" --output tsv) && echo "AZURE_REGION: \"$AZURE_REGION\""
根据以下示例创建
peer-pods-cm.yaml
清单文件:apiVersion: v1 kind: ConfigMap metadata: name: peer-pods-cm namespace: openshift-sandboxed-containers-operator data: CLOUD_PROVIDER: "azure" VXLAN_PORT: "9000" AZURE_INSTANCE_SIZE: "Standard_DC2as_v5" AZURE_INSTANCE_SIZES: "Standard_DC2as_v5,Standard_DC4as_v5,Standard_DC8as_v5" AZURE_SUBNET_ID: "<azure_subnet_id>" AZURE_NSG_ID: "<azure_nsg_id>" PROXY_TIMEOUT: "5m" AZURE_IMAGE_ID: "<azure_image_id>" AZURE_REGION: "<azure_region>" AZURE_RESOURCE_GROUP: "<azure_resource_group>" DISABLECVM: "false" AA_KBC_PARAMS: "cc_kbc::https://${TRUSTEE_HOST}"
- 如果未在工作负载中定义实例大小,则
AZURE_INSTANCE_SIZE
为默认值。 对于 TDX,请指定“Standard_EC4eds_v5”。 -
AZURE_INSTANCE_SIZES
列出了在创建 Pod 时可以指定的所有实例大小。 这允许你为需要较少内存和较少 CPU 的工作负载定义较小的实例大小,或为较大的工作负载指定较大的实例大小。 对于 TDX,请指定“Standard_EC4eds_v5、Standard_EC8eds_v5、Standard_EC16eds_v5”。 - 指定你检索的
AZURE_SUBNET_ID
值。 - 指定你检索的
AZURE_NSG_ID
值。 -
AZURE_IMAGE_ID
(可选):默认情况下,当你运行 KataConfig 自定义资源时,会基于你的群集凭据使用 Azure 映像 ID 填充此值。 如果你创建自己的 Azure 映像,请指定正确的映像 ID。 - 指定你检索的
AZURE_REGION
值。 - 指定你检索的
AZURE_RESOURCE_GROUP
值。 -
AA_KBC_PARAMS
指定 Trustee 路由的主机名。
- 如果未在工作负载中定义实例大小,则
通过运行以下命令创建配置映射:
$ oc apply -f peer-pods-cm.yaml
通过运行以下命令重启
peerpodconfig-ctrl-caa-daemon
守护程序:$ oc set env ds/peerpodconfig-ctrl-caa-daemon \ -n openshift-sandboxed-containers-operator REBOOT="$(date)"
创建 KataConfig 自定义资源
根据以下示例创建
example-kataconfig.yaml
清单文件:apiVersion: kataconfiguration.openshift.io/v1 kind: KataConfig metadata: name: example-kataconfig spec: enablePeerPods: true logLevel: info # kataConfigPoolSelector: # matchLabels: # <label_key>: '<label_value>'
可选:如果你已应用节点标签以在特定节点上安装 kata-remote,请指定键和值,例如 cc: 'true'。
通过运行以下命令创建 KataConfig 自定义资源:
$ oc apply -f example-kataconfig.yaml
这将创建新的 KataConfig 自定义资源,并将 kata-remote 作为运行时类安装在工作器节点上。
注释
在验证安装之前,请等待 kata-remote 安装完成,并等待工作器节点重启。
通过运行以下命令来监视安装进度:
$ watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"
当 kataNodes 下所有工作器的状态都为已安装,并且 InProgress 条件为 False 且未指定原因时,kata-remote 将安装在群集上。
通过运行以下命令验证守护程序集:
$ oc get -n openshift-sandboxed-containers-operator ds/peerpodconfig-ctrl-caa-daemon
通过运行以下命令验证运行时类:
$ oc get runtimeclass
示例输出
NAME HANDLER AGE kata-remote kata-remote 152m
创建 Trustee 身份验证机密
通过运行以下命令创建一个私钥:
$ openssl genpkey -algorithm ed25519 > privateKey
通过运行以下命令创建一个公钥:
$ openssl pkey -in privateKey -pubout -out publicKey
通过运行以下命令创建一个机密:
$ oc create secret generic kbs-auth-public-key --from-file=publicKey -n trustee-operator-system
通过运行以下命令验证该机密:
$ oc get secret -n trustee-operator-system
创建 Trustee 配置映射
创建
kbs-config-cm.yaml
清单文件:apiVersion: v1 kind: ConfigMap metadata: name: kbs-config-cm namespace: trustee-operator-system data: kbs-config.json: | { "insecure_http" : true, "sockets": ["0.0.0.0:8080"], "auth_public_key": "/etc/auth-secret/publicKey", "attestation_token_config": { "attestation_token_type": "CoCo" }, "repository_config": { "type": "LocalFs", "dir_path": "/opt/confidential-containers/kbs/repository" }, "as_config": { "work_dir": "/opt/confidential-containers/attestation-service", "policy_engine": "opa", "attestation_token_broker": "Simple", "attestation_token_config": { "duration_min": 5 }, "rvps_config": { "store_type": "LocalJson", "store_config": { "file_path": "/opt/confidential-containers/rvps/reference-values/reference-values.json" } } }, "policy_engine_config": { "policy_path": "/opt/confidential-containers/opa/policy.rego" } }
通过运行以下命令创建配置映射:
$ oc apply -f kbs-config-cm.yaml
配置受托人
配置以下受托人设置:
配置引用值
可以通过指定硬件平台的受信任摘要来为参考值提供程序服务 (RVPS) 配置参考值。
客户端从运行中的软件、受信任执行环境 (TEE) 硬件和固件收集度量值,并向认证服务器提交包含声明的报价。 这些度量必须与注册到 Trustee 的受信任摘要匹配。 此过程可确保机密 VM (CVM) 正在运行预期的软件堆栈,并且未被篡改。
创建
rvps-configmap.yaml
清单文件:apiVersion: v1 kind: ConfigMap metadata: name: rvps-reference-values namespace: trustee-operator-system data: reference-values.json: | [ ]
对于
reference-values.json
,如果需要,请指定你的硬件平台的受信任摘要。 否则,请将其留空。通过运行以下命令创建 RVPS 配置映射:
$ oc apply -f rvps-configmap.yaml
创建自己的证明策略
你可以通过创建自己的证明策略来覆盖默认证明策略。
根据以下示例创建 attestation-policy.yaml 清单文件:
apiVersion: v1 kind: ConfigMap metadata: name: attestation-policy namespace: trustee-operator-system data: default.rego: | package policy import future.keywords.every default allow = false allow { every k, v in input { judge_field(k, v) } } judge_field(input_key, input_value) { has_key(data.reference, input_key) reference_value := data.reference[input_key] match_value(reference_value, input_value) } judge_field(input_key, input_value) { not has_key(data.reference, input_key) } match_value(reference_value, input_value) { not is_array(reference_value) input_value == reference_value } match_value(reference_value, input_value) { is_array(reference_value) array_include(reference_value, input_value) } array_include(reference_value_array, input_value) { reference_value_array == [] } array_include(reference_value_array, input_value) { reference_value_array != [] some i reference_value_array[i] == input_value } has_key(m, k) { _ = m[k] }
对于
package policy
,证明策略遵循 Open Policy Agent 规范。 在此示例中,证明策略将证明报告中提供的声明与在 RVPS 数据库中注册的参考值进行比较。 仅当所有值匹配时,证明过程才会成功。通过运行以下命令创建证明策略配置映射:
$ oc apply -f attestation-policy.yaml
为 TDX 预配证书缓存服务
如果你的 TEE 是 Intel 信任域扩展 (TDX),则必须配置预配证书缓存服务 (PCCS)。 PCCS 会检索预配认证密钥 (PCK) 证书,并将其缓存在一个本地数据库中。
创建 tdx-config.yaml 清单文件:
apiVersion: v1 kind: ConfigMap metadata: name: tdx-config namespace: trustee-operator-system data: sgx_default_qcnl.conf: | \ { "collateral_service": "https://api.trustedservices.intel.com/sgx/certification/v4/", "pccs_url": "<pccs_url>" }
对于
pccs_url
,请指定 PCCS URL,例如 https://localhost:8081/sgx/certification/v4/.通过运行以下命令创建 TDX 配置映射:
$ oc apply -f tdx-config.yaml
创建用于进行容器映像签名验证的机密
如果使用容器映像签名验证,则必须创建包含公共容器映像签名密钥的机密。 受托人操作员将使用该机密来验证签名,确保仅在环境中部署受信任且经过身份验证的容器映像。
运行以下命令,创建用于进行容器映像签名验证的机密:
$ oc apply secret generic <type> \ --from-file=<tag>=./<public_key_file> \ -n trustee-operator-system
- 指定 KBS 机密类型,例如
img-sig
。 - 指定机密标记(例如
pub-key
)和公共容器映像签名密钥。
- 指定 KBS 机密类型,例如
请记录
<type>
值。 创建 KbsConfig 自定义资源时,必须将此值添加到 spec.kbsSecretResources 密钥。
创建容器映像签名验证策略
你必须创建容器映像签名验证策略,因为签名验证始终处于启用状态。
重要
如果缺少此策略,Pod 将不会启动。 如果你不使用容器映像签名验证,则可以创建不带签名验证的策略。
根据以下示例创建 security-policy-config.json 文件:
不带签名验证:
{ "default": [ { "type": "insecureAcceptAnything" }], "transports": {} }
带签名验证:
{ "default": [ { "type": "insecureAcceptAnything" ], "transports": { "<transport>": { "<registry>/<image>": [ { "type": "sigstoreSigned", "keyPath": "kbs:///default/<type>/<tag>" } ] } } }
- 指定用于传输的映像存储库,例如“docker”。
- 指定容器注册表和映像,例如“quay.io/my-image”。
- 指定创建的容器映像签名验证机密的类型和标记,例如“img-sig/pub-key”。
运行以下命令创建安全策略:
$ oc apply secret generic security-policy \ --from-file=osc=./<security-policy-config.json> \ -n trustee-operator-system
请勿更改机密类型 (security-policy) 或密钥 (osc)。
security-policy 机密在 KbsConfig 自定义资源的
spec.kbsSecretResources
密钥中指定。
创建 KbsConfig 自定义资源
必须创建 KbsConfig 自定义资源才能启动 Trustee。
创建
kbsconfig-cr.yaml
清单文件:apiVersion: confidentialcontainers.org/v1alpha1 kind: KbsConfig metadata: labels: app.kubernetes.io/name: kbsconfig app.kubernetes.io/instance: kbsconfig app.kubernetes.io/part-of: trustee-operator app.kubernetes.io/managed-by: kustomize app.kubernetes.io/created-by: trustee-operator name: kbsconfig namespace: trustee-operator-system spec: kbsConfigMapName: kbs-config-cm kbsAuthSecretName: kbs-auth-public-key kbsDeploymentType: AllInOneDeployment kbsRvpsRefValuesConfigMapName: rvps-reference-values kbsSecretResources: ["kbsres1", "security-policy", "<type>"] kbsResourcePolicyConfigMapName: resource-policy # tdxConfigSpec: # kbsTdxConfigMapName: tdx-config # kbsAttestationPolicyConfigMapName: attestation-policy # kbsServiceType: <service_type>
- 可选:如果创建了机密,请指定容器映像签名验证机密的
type
值,例如img-sig
。 如果未创建机密,请将kbsSecretResources
值设置为["kbsres1", "security-policy"]
。 - 为 Intel 信任域扩展取消注释
tdxConfigSpec.kbsTdxConfigMapName: tdx-config
。 - 如果创建自定义证明策略,请取消注释
kbsAttestationPolicyConfigMapName: attestation-policy
。 - 如果创建服务类型(而不是默认 ClusterIP 服务)来公开群集外部流量中的应用程序,请取消注释
kbsServiceType: <service_type>
。 你可以指定NodePort
、LoadBalancer
或ExternalName
。
- 可选:如果创建了机密,请指定容器映像签名验证机密的
通过运行以下命令创建 KbsConfig 自定义资源:
$ oc apply -f kbsconfig-cr.yaml
验证受托人配置
通过检查受托方 Pod 和日志来验证受托人配置。
运行以下命令创建默认项目:
$ oc project trustee-operator-system
通过运行以下命令检查 Pod:
$ oc get pods -n trustee-operator-system
示例输出
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
通过运行以下命令,设置 POD_NAME 环境变量:
$ POD_NAME=$(oc get pods -l app=kbs -o jsonpath='{.items[0].metadata.name}' -n trustee-operator-system)
通过运行以下命令检查 Pod 日志:
$ oc logs -n trustee-operator-system $POD_NAME
示例输出
[2024-05-30T13:44:24Z INFO kbs] Using config file /etc/kbs-config/kbs-config.json [2024-05-30T13:44:24Z WARN attestation_service::rvps] No RVPS address provided and will launch a built-in rvps [2024-05-30T13:44:24Z INFO attestation_service::token::simple] No Token Signer key in config file, create an ephemeral key and without CA pubkey cert [2024-05-30T13:44:24Z INFO api_server] Starting HTTPS server at [0.0.0.0:8080] [2024-05-30T13:44:24Z INFO actix_server::builder] starting 12 workers [2024-05-30T13:44:24Z INFO actix_server::server] Tokio runtime found; starting in existing Tokio runtime
验证证明过程
可以通过创建一个测试 Pod 并检索其机密来验证证明过程。
重要说明:此过程是验证证明是否正常工作的示例。 不要将敏感数据写入标准 I/O,因为可以使用内存转储捕获该数据。 只有写入内存的数据是加密的。
默认情况下,嵌入在 Pod VM 映像中的代理端策略会禁用机密容器 Pod 的执行和日志 API。 此策略可确保敏感数据不会被写入标准 I/O。
在测试场景中,可以通过向 Pod 添加策略注释在运行时替代该限制。 对于技术预览版,远程证明不会验证运行时策略注释。
创建 verification-pod.yaml 清单文件:
apiVersion: v1 kind: Pod metadata: name: ocp-cc-pod labels: app: ocp-cc-pod annotations: io.katacontainers.config.agent.policy: cGFja2FnZSBhZ2VudF9wb2xpY3kKCmRlZmF1bHQgQWRkQVJQTmVpZ2hib3JzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IENsb3NlU3RkaW5SZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBDb3B5RmlsZVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IENyZWF0ZVNhbmRib3hSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBEZXN0cm95U2FuZGJveFJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IEV4ZWNQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgR2V0TWV0cmljc1JlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IEdldE9PTUV2ZW50UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgR3Vlc3REZXRhaWxzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgTGlzdEludGVyZmFjZXNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgTWVtSG90cGx1Z0J5UHJvYmVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBPbmxpbmVDUFVNZW1SZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBQYXVzZUNvbnRhaW5lclJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFB1bGxJbWFnZVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBSZW1vdmVDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBSZW1vdmVTdGFsZVZpcnRpb2ZzU2hhcmVNb3VudHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBSZXNlZWRSYW5kb21EZXZSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBSZXN1bWVDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU2V0UG9saWN5UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU2lnbmFsUHJvY2Vzc1JlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFN0YXJ0Q29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRUcmFjaW5nUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFR0eVdpblJlc2l6ZVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFVwZGF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFVwZGF0ZVJvdXRlc1JlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFdhaXRQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgV3JpdGVTdHJlYW1SZXF1ZXN0IDo9IHRydWUK spec: runtimeClassName: kata-remote containers: - name: skr-openshift image: registry.access.redhat.com/ubi9/ubi:9.3 command: - sleep - "36000" securityContext: privileged: false seccompProfile: type: RuntimeDefault
Pod 元数据
annotations
会替代阻止将敏感数据写入标准 I/O 的策略。通过运行以下命令创建 Pod:
$ oc create -f verification-pod.yaml
通过运行以下命令连接到 ocp-cc-pod Pod 的 Bash shell:
$ oc exec -it ocp-cc-pod -- bash
通过运行以下命令获取 Pod 机密:
$ curl http://127.0.0.1:8006/cdh/resource/default/kbsres1/key1
示例输出
res1val1
仅当证明成功时,Trustee 服务器才会返回机密。