Vertrouwelijke containers implementeren in een ARO-cluster (Azure Red Hat OpenShift) (preview)
In dit artikel worden de stappen beschreven die nodig zijn voor het implementeren van vertrouwelijke containers voor een ARO-cluster. Dit proces omvat twee hoofdonderdelen en meerdere stappen:
Implementeer eerst OpenShift Sandboxed Containers, met inbegrip van de volgende stappen:
Installeer de operator OpenShift Sandboxed Containers.
Maak het geheim van de peerpods.
Maak de configuratietoewijzing voor peer-pods.
Maak het Azure-geheim.
Nadat u OpenShift Sandboxed Containers hebt geïmplementeerd, implementeert u Vertrouwelijke containers. Dit omvat de volgende stappen:
Installeer de beheerder.
Maak de route voor de beheerder.
Schakel de functiepoort Vertrouwelijke containers in.
Werk de configuratietoewijzing voor peer-pods bij.
Maak de aangepaste KataConfig-resource.
Maak het verificatiegeheim van de beheerder.
Maak de toewijzing van de beheerdersconfiguratie.
Configureer de beheerder.
Maak de aangepaste KbsConfig-resource.
Controleer het attestation-proces.
Voordat u begint
Voordat u begint met het implementatieproces, moet u ervoor zorgen dat aan de volgende vereisten wordt voldaan:
Een bestaand ARO-cluster (versie 4.15 of hoger) met ten minste één werkknooppunt
Toegang tot het cluster met de
cluster-admin
rol
Belangrijk
Voor elke pod in een toepassing is er een een-op-een-toewijzing met een bijbehorende CVM (Confidential Virtual Machine). Dit betekent dat elke nieuwe pod een afzonderlijke CVM vereist, waardoor isolatie tussen pods wordt gegarandeerd.
Deel 1: OpenShift-sandbox-containers implementeren
De Operator voor OpenShift-sandbox-containers installeren
De operator voor sandbox-containers van OpenShift kan worden geïnstalleerd via de CLI of de OpenShift-webconsole.
Maak een
osc-namespace.yaml
manifestbestand:apiVersion: v1 kind: Namespace metadata: name: openshift-sandboxed-containers-operator
Maak de naamruimte door de volgende opdracht uit te voeren:
$ oc apply -f osc-namespace.yaml
Maak een
osc-operatorgroup.yaml
manifestbestand:apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: sandboxed-containers-operator-group namespace: openshift-sandboxed-containers-operator spec: targetNamespaces: - openshift-sandboxed-containers-operator
Maak de operatorgroep door de volgende opdracht uit te voeren
$ oc apply -f osc-operatorgroup.yaml
Maak een
osc-subscription.yaml
manifestbestand: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
Maak het abonnement door de volgende opdracht uit te voeren:
$ oc apply -f osc-subscription.yaml
Controleer of de operator juist is geïnstalleerd door de volgende opdracht uit te voeren:
$ oc get csv -n openshift-sandboxed-containers-operator
Notitie
Het uitvoeren van deze opdracht kan enkele minuten in beslag nemen.
Bekijk het proces door de volgende opdracht uit te voeren:
$ watch oc get csv -n openshift-sandboxed-containers-operator
Voorbeelduitvoer
NAME DISPLAY VERSION REPLACES PHASE openshift-sandboxed-containers openshift-sandboxed-containers-operator 1.7.0 1.6.0 Succeeded
Het geheim van peerpods maken
U moet het peer-podsgeheim maken voor OpenShift-containers in de sandbox. Het geheim slaat referenties op voor het maken van de vm-installatiekopieën (pod) van de pod en peerpod-exemplaren van de pod.
Standaard maakt de openShift-containeroperator het geheim op basis van de referenties die worden gebruikt om het cluster te maken. U kunt echter handmatig een geheim maken dat gebruikmaakt van verschillende referenties.
Haal de Azure-abonnements-id op door de volgende opdracht uit te voeren:
$ AZURE_SUBSCRIPTION_ID=$(az account list --query "[?isDefault].id" \ -o tsv) && echo "AZURE_SUBSCRIPTION_ID: \"$AZURE_SUBSCRIPTION_ID\""
Genereer de RBAC-inhoud (op rollen gebaseerd toegangsbeheer) door de volgende opdracht uit te voeren:
$ az ad sp create-for-rbac --role Contributor --scopes /subscriptions/$AZURE_SUBSCRIPTION_ID \ --query "{ client_id: appId, client_secret: password, tenant_id: tenant }"
Voorbeelduitvoer
{ "client_id": `AZURE_CLIENT_ID`, "client_secret": `AZURE_CLIENT_SECRET`, "tenant_id": `AZURE_TENANT_ID` }
Noteer de RBAC-uitvoer die moet worden gebruikt in het geheime object.
Maak een peer-pods-secret.yaml-manifestbestand volgens het volgende voorbeeld:
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>"
- Geef de
AZURE_CLIENT_ID value
op. - Geef de
AZURE_CLIENT_SECRET value
op. - Geef de
AZURE_TENANT_ID value
op. - Geef de
AZURE_SUBSCRIPTION_ID value
op.
- Geef de
Maak het geheim door de volgende opdracht uit te voeren:
$ oc apply -f peer-pods-secret.yaml
De configuratietoewijzing voor peer-pods maken
Haal de volgende waarden op uit Azure:
Haal de Azure-resourcegroep op en noteer deze:
$ AZURE_RESOURCE_GROUP=$(oc get infrastructure/cluster -o jsonpath='{.status.platformStatus.azure.resourceGroupName}') && echo "AZURE_RESOURCE_GROUP: \"$AZURE_RESOURCE_GROUP\""
Haal de Azure VNet-naam op en noteer deze:
$ AZURE_VNET_NAME=$(az network vnet list --resource-group ${AZURE_RESOURCE_GROUP} --query "[].{Name:name}" --output tsv)
Deze waarde wordt gebruikt om de Azure-subnet-id op te halen.
Haal de Azure-subnet-id op en noteer deze:
$ 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\""
Haal de id (NSG) van de Azure-netwerkbeveiligingsgroep (NSG) op en noteer deze:
$ AZURE_NSG_ID=$(az network nsg list --resource-group ${AZURE_RESOURCE_GROUP} --query "[].{Id:id}" --output tsv) && echo "AZURE_NSG_ID: \"$AZURE_NSG_ID\""
Haal de Azure-regio op en noteer deze:
$ AZURE_REGION=$(az group show --resource-group ${AZURE_RESOURCE_GROUP} --query "{Location:location}" --output tsv) && echo "AZURE_REGION: \"$AZURE_REGION\""
Maak een peer-pods-cm.yaml-manifestbestand volgens het volgende voorbeeld:
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
is de standaardinstelling als er geen instantiegrootte is gedefinieerd in de workload. -
AZURE_INSTANCE_SIZES
bevat alle instantiegrootten die u kunt opgeven bij het maken van de pod. Hiermee kunt u kleinere instantiegrootten definiëren voor workloads die minder geheugen nodig hebben en minder CPU's of grotere instantiegrootten voor grotere workloads. - Geef de
AZURE_SUBNET_ID
waarde op die u hebt opgehaald. - Geef de
AZURE_NSG_ID
waarde op die u hebt opgehaald. -
AZURE_IMAGE_ID
is optioneel. Deze waarde wordt standaard ingevuld wanneer u de aangepaste KataConfig-resource uitvoert met behulp van een Azure-installatiekopieën-id op basis van uw clusterreferenties. Als u uw eigen Azure-installatiekopieën maakt, geeft u de juiste installatiekopieën-id op. - Geef de
AZURE_REGION
waarde op die u hebt opgehaald. - Geef de
AZURE_RESOURCE_GROUP
waarde op die u hebt opgehaald.
-
Maak de configuratietoewijzing door de volgende opdracht uit te voeren:
$ oc apply -f peer-pods-cm.yaml
Het Azure-geheim maken
U moet een SSH-sleutelgeheim maken dat azure gebruikt om virtuele machines te maken.
Genereer een SSH-sleutelpaar door de volgende opdracht uit te voeren:
$ ssh-keygen -f ./id_rsa -N ""
Maak het geheime object door de volgende opdracht uit te voeren:
$ oc create secret generic ssh-key-secret \ -n openshift-sandboxed-containers-operator \ --from-file=id_rsa.pub=./id_rsa.pub
Verwijder de SSH-sleutels die u hebt gemaakt:
$ shred --remove id_rsa.pub id_rsa
Deel 2: Vertrouwelijke containers implementeren
De beheerder installeren
Maak een trustee-namespace.yaml-manifestbestand:
apiVersion: v1 kind: Namespace metadata: name: trustee-operator-system
Maak de naamruimte trustee-operator-system door de volgende opdracht uit te voeren:
$ oc apply -f trustee-namespace.yaml
Maak een trustee-operatorgroup.yaml-manifestbestand:
apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: trustee-operator-group namespace: trustee-operator-system spec: targetNamespaces: - trustee-operator-system
Maak de operatorgroep door de volgende opdracht uit te voeren:
$ oc apply -f trustee-operatorgroup.yaml
Maak een trustee-subscription.yaml-manifestbestand:
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
Maak het abonnement door de volgende opdracht uit te voeren:
$ oc apply -f trustee-subscription.yaml
Controleer of de operator juist is geïnstalleerd door de volgende opdracht uit te voeren:
$ oc get csv -n trustee-operator-system
Het uitvoeren van deze opdracht kan enkele minuten in beslag nemen.
Bekijk het proces door de volgende opdracht uit te voeren:
$ watch oc get csv -n trustee-operator-system
Voorbeelduitvoer
NAME DISPLAY PHASE trustee-operator.v0.1.0 Trustee Operator 0.1.0 Succeeded
De route voor de beheerder maken
Maak een beveiligde route met edge TLS-beëindiging voor de beheerder. Extern inkomend verkeer bereikt de routerpods als HTTPS en geeft deze door aan de curatorpods als HTTP.
Maak een edge-route door de volgende opdracht uit te voeren:
$ oc create route edge --service=kbs-service --port kbs-port \ -n trustee-operator-system
Notitie
Op dit moment wordt alleen een route met een geldig ca-ondertekend certificaat ondersteund. U kunt geen route gebruiken met een zelfondertekend certificaat.
Stel de TRUSTEE_HOST variabele in door de volgende opdracht uit te voeren:
$ TRUSTEE_HOST=$(oc get route -n trustee-operator-system kbs-service \ -o jsonpath={.spec.host})
Controleer de route door de volgende opdracht uit te voeren:
$ echo $TRUSTEE_HOST
Voorbeelduitvoer
kbs-service-trustee-operator-system.apps.memvjias.eastus.aroapp.io
Noteer deze waarde voor de configuratietoewijzing van peerpods.
De functiepoort Vertrouwelijke containers inschakelen
Maak een
cc-feature-gate.yaml
manifestbestand:apiVersion: v1 kind: ConfigMap metadata: name: osc-feature-gates namespace: openshift-sandboxed-containers-operator data: confidential: "true"
Maak de configuratietoewijzing door de volgende opdracht uit te voeren:
$ oc apply -f cc-feature-gate.yaml
De configuratietoewijzing voor peer-pods bijwerken
Haal de volgende waarden op uit uw Azure-exemplaar:
i. Haal de Azure-resourcegroep op en noteer deze:
$ AZURE_RESOURCE_GROUP=$(oc get infrastructure/cluster -o jsonpath='{.status.platformStatus.azure.resourceGroupName}') && echo "AZURE_RESOURCE_GROUP: \"$AZURE_RESOURCE_GROUP\""
ii. Haal de Azure VNet-naam op en noteer deze:
$ AZURE_VNET_NAME=$(az network vnet list --resource-group ${AZURE_RESOURCE_GROUP} --query "[].{Name:name}" --output tsv)
Deze waarde wordt gebruikt om de Azure-subnet-id op te halen.
iii. Haal de Azure-subnet-id op en noteer deze:
$ 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\""
iv. Haal de id (NSG) van de Azure-netwerkbeveiligingsgroep (NSG) op en noteer deze:
$ 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. Haal de Azure-regio op en noteer deze:
$ AZURE_REGION=$(az group show --resource-group ${AZURE_RESOURCE_GROUP} --query "{Location:location}" --output tsv) && echo "AZURE_REGION: \"$AZURE_REGION\""
Maak een
peer-pods-cm.yaml
manifestbestand volgens het volgende voorbeeld: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
is de standaardinstelling als er geen instantiegrootte is gedefinieerd in de workload. Geef voor TDX 'Standard_EC4eds_v5' op. -
AZURE_INSTANCE_SIZES
bevat alle instantiegrootten die u kunt opgeven bij het maken van de pod. Hiermee kunt u kleinere instantiegrootten definiëren voor workloads die minder geheugen nodig hebben en minder CPU's of grotere instantiegrootten voor grotere workloads. Geef voor TDX 'Standard_EC4eds_v5, Standard_EC8eds_v5, Standard_EC16eds_v5' op. - Geef de
AZURE_SUBNET_ID
waarde op die u hebt opgehaald. - Geef de
AZURE_NSG_ID
waarde op die u hebt opgehaald. -
AZURE_IMAGE_ID
(Optioneel): Deze waarde wordt standaard ingevuld wanneer u de aangepaste KataConfig-resource uitvoert met behulp van een Azure-installatiekopieën-id op basis van uw clusterreferenties. Als u uw eigen Azure-installatiekopieën maakt, geeft u de juiste installatiekopieën-id op. - Geef de
AZURE_REGION
waarde op die u hebt opgehaald. - Geef de
AZURE_RESOURCE_GROUP
waarde op die u hebt opgehaald. -
AA_KBC_PARAMS
hiermee geeft u de hostnaam van de route van de beheerder.
-
Maak de configuratietoewijzing door de volgende opdracht uit te voeren:
$ oc apply -f peer-pods-cm.yaml
Start de
peerpodconfig-ctrl-caa-daemon
daemon opnieuw op door de volgende opdracht uit te voeren:$ oc set env ds/peerpodconfig-ctrl-caa-daemon \ -n openshift-sandboxed-containers-operator REBOOT="$(date)"
De aangepaste KataConfig-resource maken
Maak een
example-kataconfig.yaml
manifestbestand volgens het volgende voorbeeld:apiVersion: kataconfiguration.openshift.io/v1 kind: KataConfig metadata: name: example-kataconfig spec: enablePeerPods: true logLevel: info # kataConfigPoolSelector: # matchLabels: # <label_key>: '<label_value>'
Optioneel: Als u knooppuntlabels hebt toegepast om kata-remote te installeren op specifieke knooppunten, geeft u de sleutel en waarde op, bijvoorbeeld CC: 'true'.
Maak de aangepaste KataConfig-resource door de volgende opdracht uit te voeren:
$ oc apply -f example-kataconfig.yaml
De nieuwe aangepaste KataConfig-resource wordt gemaakt en installeert kata-remote als runtimeklasse op de werkknooppunten.
Notitie
Wacht tot de kata-externe installatie is voltooid en de werkknooppunten opnieuw moeten worden opgestart voordat u de installatie controleert.
Controleer de voortgang van de installatie door de volgende opdracht uit te voeren:
$ watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"
Wanneer de status van alle werkrollen onder kataNodes is geïnstalleerd en de voorwaarde InProgress Onwaar is zonder een reden op te geven, wordt de kata-remote op het cluster geïnstalleerd.
Controleer de daemon die is ingesteld door de volgende opdracht uit te voeren:
$ oc get -n openshift-sandboxed-containers-operator ds/peerpodconfig-ctrl-caa-daemon
Controleer de runtimeklassen door de volgende opdracht uit te voeren:
$ oc get runtimeclass
Voorbeelduitvoer
NAME HANDLER AGE kata-remote kata-remote 152m
Het verificatiegeheim van de beheerder maken
Maak een persoonlijke sleutel door de volgende opdracht uit te voeren:
$ openssl genpkey -algorithm ed25519 > privateKey
Maak een openbare sleutel door de volgende opdracht uit te voeren:
$ openssl pkey -in privateKey -pubout -out publicKey
Maak een geheim door de volgende opdracht uit te voeren:
$ oc create secret generic kbs-auth-public-key --from-file=publicKey -n trustee-operator-system
Controleer het geheim door de volgende opdracht uit te voeren:
$ oc get secret -n trustee-operator-system
De toewijzing van de beheerdersconfiguratie maken
Maak een
kbs-config-cm.yaml
manifestbestand: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" } }
Maak de configuratietoewijzing door de volgende opdracht uit te voeren:
$ oc apply -f kbs-config-cm.yaml
Beheerder configureren
Configureer de volgende instellingen voor beheerders:
Referentiewaarden configureren
U kunt referentiewaarden voor de RvPS (Reference Value Provider Service) configureren door de vertrouwde samenvattingen van uw hardwareplatform op te geven.
De client verzamelt metingen van de actieve software, de TEE-hardware (Trusted Execution Environment) en firmware en verzendt een offerte met de claims naar de Attestation-server. Deze metingen moeten overeenkomen met de vertrouwde samenvattingen die zijn geregistreerd bij de trustbeheerder. Dit proces zorgt ervoor dat de vertrouwelijke VM (CVM) de verwachte softwarestack uitvoert en niet is gemanipuleerd.
Maak een
rvps-configmap.yaml
manifestbestand:apiVersion: v1 kind: ConfigMap metadata: name: rvps-reference-values namespace: trustee-operator-system data: reference-values.json: | [ ]
Geef
reference-values.json
indien nodig de vertrouwde samenvattingen voor uw hardwareplatform op. Anders laat u het leeg.Maak de RVPS-configuratietoewijzing door de volgende opdracht uit te voeren:
$ oc apply -f rvps-configmap.yaml
Uw eigen attestation-beleid maken
U kunt het standaardverklaringsbeleid overschrijven door uw eigen attestation-beleid te maken.
Maak een attestation-policy.yaml-manifestbestand volgens het volgende voorbeeld:
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] }
Voor het
package policy
attestation-beleid volgt u de specificatie van de Open Policy Agent. In dit voorbeeld vergelijkt het attestation-beleid de claims in het attestation-rapport met de referentiewaarden die zijn geregistreerd in de RVPS-database. Het attestation-proces is alleen geslaagd als alle waarden overeenkomen.Maak de configuratietoewijzing voor attestation-beleid door de volgende opdracht uit te voeren:
$ oc apply -f attestation-policy.yaml
Cacheservice voor certificaat inrichten voor TDX
Als uw TEE Intel Trust Domain Extensions (TDX) is, moet u de Provisioning Certificate Caching Service (PCCS) configureren. PcCS haalt PCK-certificaten (Provisioning Certification Key) op en slaat deze in een lokale database in de cache op.
Maak een tdx-config.yaml-manifestbestand:
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>" }
Geef
pccs_url
bijvoorbeeld de PCCS-URL op https://localhost:8081/sgx/certification/v4/.Maak de TDX-configuratietoewijzing door de volgende opdracht uit te voeren:
$ oc apply -f tdx-config.yaml
Een geheim maken voor verificatie van containerinstallatiekopiehandtekening
Als u verificatie van de handtekening voor containerinstallatiekopieën gebruikt, moet u een geheim maken dat de ondertekeningssleutel voor de openbare containerinstallatiekopie bevat. De beheerder gebruikt het geheim om de handtekening te controleren, zodat alleen vertrouwde en geverifieerde containerinstallatiekopieën in uw omgeving worden geïmplementeerd.
Maak een geheim voor verificatie van de handtekening voor containerinstallatiekopieën door de volgende opdracht uit te voeren:
$ oc apply secret generic <type> \ --from-file=<tag>=./<public_key_file> \ -n trustee-operator-system
- Geef bijvoorbeeld het type KBS-geheim
img-sig
op. - Geef de geheime tag op, bijvoorbeeld
pub-key
, en de ondertekeningssleutel voor de openbare containerinstallatiekopieën.
- Geef bijvoorbeeld het type KBS-geheim
Noteer de
<type>
waarde. U moet deze waarde toevoegen aan de sleutel spec.kbsSecretResources wanneer u de aangepaste KbsConfig-resource maakt.
Het verificatiebeleid voor containerinstallatiekopieën voor handtekeningen maken
U moet het verificatiebeleid voor de handtekening van de containerinstallatiekopie maken omdat handtekeningverificatie altijd is ingeschakeld.
Belangrijk
Als dit beleid ontbreekt, worden de pods niet gestart. Als u geen verificatie van de handtekening voor containerinstallatiekopieën gebruikt, maakt u het beleid zonder handtekeningverificatie.
Maak een security-policy-config.json-bestand volgens de volgende voorbeelden:
Zonder handtekeningverificatie:
{ "default": [ { "type": "insecureAcceptAnything" }], "transports": {} }
Met handtekeningverificatie:
{ "default": [ { "type": "insecureAcceptAnything" ], "transports": { "<transport>": { "<registry>/<image>": [ { "type": "sigstoreSigned", "keyPath": "kbs:///default/<type>/<tag>" } ] } } }
- Geef de opslagplaats voor installatiekopieën op voor transport, bijvoorbeeld Docker.
- Geef het containerregister en de installatiekopieën op, bijvoorbeeld 'quay.io/my-image'.
- Geef het type en de tag op van het verificatiegeheim voor de handtekening van de containerinstallatiekopie dat u hebt gemaakt, bijvoorbeeld 'img-sig/pub-key'.
Maak het beveiligingsbeleid door de volgende opdracht uit te voeren:
$ oc apply secret generic security-policy \ --from-file=osc=./<security-policy-config.json> \ -n trustee-operator-system
Wijzig het geheime type, het beveiligingsbeleid of de sleutel, osc niet.
Het beveiligingsbeleidsgeheim wordt opgegeven in de
spec.kbsSecretResources
sleutel van de aangepaste KbsConfig-resource.
De aangepaste KbsConfig-resource maken
U moet de aangepaste KbsConfig-resource maken om de beheerder te starten.
Maak een
kbsconfig-cr.yaml
manifestbestand: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>
- Optioneel: Geef de
type
waarde op van het verificatiegeheim voor de handtekening van de containerinstallatiekopie als u bijvoorbeeldimg-sig
het geheim hebt gemaakt. Als u het geheim niet hebt gemaakt, stelt u dekbsSecretResources
waarde in op["kbsres1", "security-policy"]
. - Verwijder opmerkingen
tdxConfigSpec.kbsTdxConfigMapName: tdx-config
voor Intel Trust Domain Extensions. - Verwijder opmerkingen
kbsAttestationPolicyConfigMapName: attestation-policy
als u een aangepast attestation-beleid maakt. - Verwijder opmerkingen
kbsServiceType: <service_type>
als u een ander servicetype dan de standaardClusterIP-service maakt om toepassingen beschikbaar te maken binnen het externe clusterverkeer. U kunt opgevenNodePort
,LoadBalancer
ofExternalName
.
- Optioneel: Geef de
Maak de aangepaste KbsConfig-resource door de volgende opdracht uit te voeren:
$ oc apply -f kbsconfig-cr.yaml
De configuratie van de beheerder controleren
Controleer de configuratie van de beheerder door de pods en logboeken van de beheerder te controleren.
Stel het standaardproject in door de volgende opdracht uit te voeren:
$ oc project trustee-operator-system
Controleer de pods door de volgende opdracht uit te voeren:
$ oc get pods -n trustee-operator-system
Voorbeelduitvoer
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
Stel de omgevingsvariabele POD_NAME in door de volgende opdracht uit te voeren:
$ POD_NAME=$(oc get pods -l app=kbs -o jsonpath='{.items[0].metadata.name}' -n trustee-operator-system)
Controleer de podlogboeken door de volgende opdracht uit te voeren:
$ oc logs -n trustee-operator-system $POD_NAME
Voorbeelduitvoer
[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
Het attestation-proces controleren
U kunt het attestation-proces controleren door een testpod te maken en het geheim op te halen.
Belangrijk: Deze procedure is een voorbeeld om te controleren of attestation werkt. Schrijf geen gevoelige gegevens naar standaard-I/O omdat de gegevens kunnen worden vastgelegd met behulp van een geheugendump. Alleen gegevens die naar het geheugen worden geschreven, worden versleuteld.
Standaard schakelt een beleid aan de agentzijde dat is ingesloten in de installatiekopieën van de pod-VM de exec- en logboek-API's voor een Pod Confidential Containers uit. Dit beleid zorgt ervoor dat gevoelige gegevens niet naar standaard-I/O worden geschreven.
In een testscenario kunt u de beperking tijdens runtime overschrijven door een beleidsaantekening toe te voegen aan de pod. Voor Technology Preview worden beleidsaantekeningen voor runtime niet geverifieerd door externe attestation.
Maak een verification-pod.yaml-manifestbestand:
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
De podmetada
annotations
overschrijft het beleid dat voorkomt dat gevoelige gegevens naar standaard-I/O worden geschreven.Maak de pod door de volgende opdracht uit te voeren:
$ oc create -f verification-pod.yaml
Maak verbinding met de Bash-shell van de ocp-cc-pod pod door de volgende opdracht uit te voeren:
$ oc exec -it ocp-cc-pod -- bash
Haal het podgeheim op door de volgende opdracht uit te voeren:
$ curl http://127.0.0.1:8006/cdh/resource/default/kbsres1/key1
Voorbeelduitvoer
res1val1
De beheerderserver retourneert het geheim alleen als de attestation is geslaagd.