你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在 Azure Red Hat OpenShift (ARO) 群集中部署机密容器(预览版)

本文介绍了为 ARO 群集部署机密容器所需的步骤。 此过程涉及两个主要部分和多个步骤:

首先,部署 OpenShift Sandboxed Containers,包括以下步骤:

  1. 安装 OpenShift Sandboxed Containers Operator。

  2. 创建对等 Pod 机密。

  3. 创建对等 Pod 配置映射。

  4. 创建 Azure 机密。

部署 OpenShift Sandboxed Containers 后,部署机密容器。 这包括以下步骤:

  1. 安装 Trustee Operator。

  2. 为 Trustee 创建路由。

  3. 启用机密容器功能门。

  4. 更新对等 Pod 配置映射。

  5. 创建 KataConfig 自定义资源。

  6. 创建 Trustee 身份验证机密。

  7. 创建 Trustee 配置映射。

  8. 配置受托人。

  9. 创建 KbsConfig 自定义资源。

  10. 验证证明过程。

在您开始之前

在开始部署过程之前,请确保满足以下先决条件:

  • 具有至少一个工作器节点的现有 ARO 群集(版本 4.15 或更高版本)

  • 通过 cluster-admin 角色对群集的访问权限

  • 已安装 OpenShift CLI

重要

对于应用程序中的每个 Pod,都有一个一对一映射,其中包含相应的机密虚拟机 (CVM)。 这意味着每个新 Pod 都需要单独的 CVM,以确保 Pod 之间的隔离。

第 1 部分:部署 OpenShift Sandboxed Containers

安装 OpenShift Sandboxed Containers Operator。

可以通过 CLI 或 OpenShift Web 控制台安装 OpenShift Sandboxed Containers Operator。

  1. 创建 osc-namespace.yaml 清单文件:

    apiVersion: v1
    kind: Namespace
    metadata:
        name: openshift-sandboxed-containers-operator
    
  2. 通过运行以下命令创建命名空间:

    $ oc apply -f osc-namespace.yaml

  3. 创建 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
    
  4. 通过运行以下命令创建操作员组

    $ oc apply -f osc-operatorgroup.yaml

  5. 创建 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
    
  6. 通过运行以下命令来创建订阅:

    $ oc apply -f osc-subscription.yaml

  7. 通过运行以下命令来验证是否已正确安装 Operator:

    $ oc get csv -n openshift-sandboxed-containers-operator

    注释

    此命令可能需要几分钟才能完成。

  8. 通过运行以下命令来观察过程:

    $ 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
    
  1. 在 Web 控制台中,导航到 Operators → OperatorHub

  2. 在“按关键字筛选”字段中,键入“OpenShift Sandboxed Containers Operator”。

  3. 选择“OpenShift Sandboxed Containers Operator”磁贴,然后选择“安装”。

  4. 在“安装 Operator”页上,从可用的“更新通道”选项列表中选择“稳定”。

  5. 验证对于“已安装的命名空间”选择了“Operator 建议的命名空间”。 这会在必需的 openshift-sandboxed-containers-operator 命名空间中安装 Operator。 如果此命名空间尚不存在,则会自动创建它。

    注释

    尝试在 openshift-sandboxed-containers-operator 以外的命名空间中安装 OpenShift Sandboxed Containers Operator 会导致安装失败。

  6. 验证对于“审批策略”选择了“自动”。 “自动”是默认值,并在新的 z 流版本可用时启用对 OpenShift Sandboxed Containers 的自动更新。

  7. 选择“安装”。

  8. 导航到“Operator”→“已安装的 Operator”来验证是否已安装该 Operator。

创建对等 Pod 机密

必须为 OpenShift Sandboxed Containers 创建对等 Pod 机密。 该机密存储用于创建 Pod 虚拟机 (VM) 映像和对等 Pod 实例的凭据。

默认情况下,OpenShift Sandboxed Containers Operator 根据用于创建群集的凭据创建机密。 但是,你可以手动创建使用不同凭据的机密。

  1. 通过运行以下命令检索 Azure 订阅 ID:

    $ AZURE_SUBSCRIPTION_ID=$(az account list --query "[?isDefault].id" \
      -o tsv) && echo "AZURE_SUBSCRIPTION_ID: \"$AZURE_SUBSCRIPTION_ID\""
    
  2. 通过运行以下命令生成基于角色的访问控制 (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`
        }
    
  3. 记录 RBAC 输出以在机密对象中使用。

  4. 根据以下示例创建 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
  5. 通过运行以下命令来创建机密:

    $ oc apply -f peer-pods-secret.yaml

创建对等 Pod 配置映射

  1. 从 Azure 获取以下值:

    1. 检索并记录 Azure 资源组:

      $ AZURE_RESOURCE_GROUP=$(oc get infrastructure/cluster -o jsonpath='{.status.platformStatus.azure.resourceGroupName}') && echo "AZURE_RESOURCE_GROUP: \"$AZURE_RESOURCE_GROUP\""

    2. 检索并记录 Azure VNet 名称:

      $ AZURE_VNET_NAME=$(az network vnet list --resource-group ${AZURE_RESOURCE_GROUP} --query "[].{Name:name}" --output tsv)
      

      此值用于检索 Azure 子网 ID。

    3. 检索并记录 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\""
      
    4. 检索并记录 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\""
      
    5. 检索并记录 Azure 区域:

      $ AZURE_REGION=$(az group show --resource-group ${AZURE_RESOURCE_GROUP} --query "{Location:___location}" --output tsv) && echo "AZURE_REGION: \"$AZURE_REGION\""

  2. 根据以下示例创建 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 值。
  3. 通过运行以下命令创建配置映射:$ oc apply -f peer-pods-cm.yaml

创建 Azure 机密

你必须创建 SSH 密钥机密,Azure 使用该机密来创建虚拟机。

  1. 通过运行以下命令生成 SSH 密钥对:

    $ ssh-keygen -f ./id_rsa -N ""

  2. 通过运行以下命令来创建机密对象:

    $ oc create secret generic ssh-key-secret \
          -n openshift-sandboxed-containers-operator \
          --from-file=id_rsa.pub=./id_rsa.pub
    
  3. 删除你创建的 SSH 密钥:

    $ shred --remove id_rsa.pub id_rsa

第 2 部分:部署机密容器

安装 Trustee Operator。

  1. 创建 trustee-namespace.yaml 清单文件:

    apiVersion: v1
    kind: Namespace
    metadata:
    name: trustee-operator-system
    
  2. 通过运行以下命令创建 rustee-operator-system 命名空间:

    $ oc apply -f trustee-namespace.yaml

  3. 创建 trustee-operatorgroup.yaml 清单文件:

    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: trustee-operator-group
      namespace: trustee-operator-system
    spec:
      targetNamespaces:
      - trustee-operator-system
    
  4. 通过运行以下命令创建 Operator 组:

    $ oc apply -f trustee-operatorgroup.yaml

  5. 创建 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
    
  6. 通过运行以下命令来创建订阅:

    $ oc apply -f trustee-subscription.yaml

  7. 通过运行以下命令来验证是否已正确安装 Operator:

    $ oc get csv -n trustee-operator-system

    此命令可能需要几分钟才能完成。

  8. 通过运行以下命令来观察过程:

    $ 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。

  1. 通过运行以下命令创建边缘路由:

    $ oc create route edge --service=kbs-service --port kbs-port \
      -n trustee-operator-system
    

    注释

    目前,仅支持具有有效 CA 签名证书的路由。 不能使用具有自签名证书的路由。

  2. 通过运行以下命令设置 TRUSTEE_HOST 变量:

    $ TRUSTEE_HOST=$(oc get route -n trustee-operator-system kbs-service \
      -o jsonpath={.spec.host})
    
  3. 通过运行以下命令来验证路由:

    $ echo $TRUSTEE_HOST

    示例输出kbs-service-trustee-operator-system.apps.memvjias.eastus.aroapp.io

    记录此值以用于对等 Pod 配置映射。

启用机密容器功能门

  1. 创建 cc-feature-gate.yaml 清单文件:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: osc-feature-gates
      namespace: openshift-sandboxed-containers-operator
    data:
      confidential: "true"
    
  2. 通过运行以下命令创建配置映射:

    $ oc apply -f cc-feature-gate.yaml

更新对等 Pod 配置映射

  1. 从你的 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\""

  2. 根据以下示例创建 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 路由的主机名。
  3. 通过运行以下命令创建配置映射:

    $ oc apply -f peer-pods-cm.yaml

  4. 通过运行以下命令重启 peerpodconfig-ctrl-caa-daemon 守护程序:

    $ oc set env ds/peerpodconfig-ctrl-caa-daemon \
      -n openshift-sandboxed-containers-operator REBOOT="$(date)"
    

创建 KataConfig 自定义资源

  1. 根据以下示例创建 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'。

  2. 通过运行以下命令创建 KataConfig 自定义资源:

    $ oc apply -f example-kataconfig.yaml

    这将创建新的 KataConfig 自定义资源,并将 kata-remote 作为运行时类安装在工作器节点上。

    注释

    在验证安装之前,请等待 kata-remote 安装完成,并等待工作器节点重启。

  3. 通过运行以下命令来监视安装进度:

    $ watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"

    当 kataNodes 下所有工作器的状态都为已安装,并且 InProgress 条件为 False 且未指定原因时,kata-remote 将安装在群集上。

  4. 通过运行以下命令验证守护程序集:

    $ oc get -n openshift-sandboxed-containers-operator ds/peerpodconfig-ctrl-caa-daemon

  5. 通过运行以下命令验证运行时类:

    $ oc get runtimeclass

    示例输出

    NAME             HANDLER         AGE
    kata-remote      kata-remote     152m
    

创建 Trustee 身份验证机密

  1. 通过运行以下命令创建一个私钥:

    $ openssl genpkey -algorithm ed25519 > privateKey

  2. 通过运行以下命令创建一个公钥:

    $ openssl pkey -in privateKey -pubout -out publicKey

  3. 通过运行以下命令创建一个机密:

    $ oc create secret generic kbs-auth-public-key --from-file=publicKey -n trustee-operator-system

  4. 通过运行以下命令验证该机密:

    $ oc get secret -n trustee-operator-system

创建 Trustee 配置映射

  1. 创建 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"
          }
        }
    
  2. 通过运行以下命令创建配置映射:

    $ oc apply -f kbs-config-cm.yaml

配置受托人

配置以下受托人设置:

配置引用值

可以通过指定硬件平台的受信任摘要来为参考值提供程序服务 (RVPS) 配置参考值。

客户端从运行中的软件、受信任执行环境 (TEE) 硬件和固件收集度量值,并向认证服务器提交包含声明的报价。 这些度量必须与注册到 Trustee 的受信任摘要匹配。 此过程可确保机密 VM (CVM) 正在运行预期的软件堆栈,并且未被篡改。

  1. 创建 rvps-configmap.yaml 清单文件:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: rvps-reference-values
      namespace: trustee-operator-system
    data:
      reference-values.json: |
        [
        ]
    

    对于 reference-values.json,如果需要,请指定你的硬件平台的受信任摘要。 否则,请将其留空。

  2. 通过运行以下命令创建 RVPS 配置映射:

    $ oc apply -f rvps-configmap.yaml

创建自己的证明策略

你可以通过创建自己的证明策略来覆盖默认证明策略。

  1. 根据以下示例创建 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 数据库中注册的参考值进行比较。 仅当所有值匹配时,证明过程才会成功。

  2. 通过运行以下命令创建证明策略配置映射:

    $ oc apply -f attestation-policy.yaml

为 TDX 预配证书缓存服务

如果你的 TEE 是 Intel 信任域扩展 (TDX),则必须配置预配证书缓存服务 (PCCS)。 PCCS 会检索预配认证密钥 (PCK) 证书,并将其缓存在一个本地数据库中。

  1. 创建 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/.

  2. 通过运行以下命令创建 TDX 配置映射:

    $ oc apply -f tdx-config.yaml

创建用于进行容器映像签名验证的机密

如果使用容器映像签名验证,则必须创建包含公共容器映像签名密钥的机密。 受托人操作员将使用该机密来验证签名,确保仅在环境中部署受信任且经过身份验证的容器映像。

  1. 运行以下命令,创建用于进行容器映像签名验证的机密:

    $ oc apply secret generic <type> \
        --from-file=<tag>=./<public_key_file> \
        -n trustee-operator-system
    
    • 指定 KBS 机密类型,例如 img-sig
    • 指定机密标记(例如 pub-key)和公共容器映像签名密钥。
  2. 请记录 <type> 值。 创建 KbsConfig 自定义资源时,必须将此值添加到 spec.kbsSecretResources 密钥。

创建容器映像签名验证策略

你必须创建容器映像签名验证策略,因为签名验证始终处于启用状态。

重要

如果缺少此策略,Pod 将不会启动。 如果你不使用容器映像签名验证,则可以创建不带签名验证的策略。

  1. 根据以下示例创建 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”。
  2. 运行以下命令创建安全策略:

    $ 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。

  1. 创建 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>。 你可以指定 NodePortLoadBalancerExternalName
  2. 通过运行以下命令创建 KbsConfig 自定义资源:

    $ oc apply -f kbsconfig-cr.yaml

验证受托人配置

通过检查受托方 Pod 和日志来验证受托人配置。

  1. 运行以下命令创建默认项目:

    $ oc project trustee-operator-system

  2. 通过运行以下命令检查 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
    
  3. 通过运行以下命令,设置 POD_NAME 环境变量:

    $ POD_NAME=$(oc get pods -l app=kbs -o jsonpath='{.items[0].metadata.name}' -n trustee-operator-system)

  4. 通过运行以下命令检查 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 添加策略注释在运行时替代该限制。 对于技术预览版,远程证明不会验证运行时策略注释。

  1. 创建 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 的策略。

  2. 通过运行以下命令创建 Pod:

    $ oc create -f verification-pod.yaml

  3. 通过运行以下命令连接到 ocp-cc-pod Pod 的 Bash shell:

    $ oc exec -it ocp-cc-pod -- bash

  4. 通过运行以下命令获取 Pod 机密:

    $ curl http://127.0.0.1:8006/cdh/resource/default/kbsres1/key1

    示例输出res1val1

    仅当证明成功时,Trustee 服务器才会返回机密。