Skip to content
This repository was archived by the owner on Jun 28, 2024. It is now read-only.

Commit e2438d8

Browse files
Alex-Carter01Alex Carter
authored andcommitted
CC: Add image signature tests for SEV
Inserts resource information to kbs for signing adds example cosign and policy files to be used along with signing tests Add currently one test for: signed imagage with no required measurement Fixes: #5412
1 parent 69baf08 commit e2438d8

5 files changed

Lines changed: 158 additions & 3 deletions

File tree

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
-----BEGIN PUBLIC KEY-----
2+
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE1gHGbfk1AqOweLEM8HfT0bmfQE3b
3+
9fcp/LU75FMfxVZXmNVtUprsHM1thuuiBKOofv8KV7TrFl4p8NJCiXUkhA==
4+
-----END PUBLIC KEY-----
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
-----BEGIN PUBLIC KEY-----
2+
MFkwEwkHKoZIzj0CAQYIKoZIzj0DAkcDQgAE1gHGbfk1AqOweoEM8HfT0bmf2E3b
3+
9fcp/LU75FMfxVZXmNVtUprsHM1thuuiBKOofv8KV7TrFl4p8NJCiXUkhA==
4+
-----END PUBLIC KEY-----
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
{
2+
"default": [
3+
{
4+
"type": "insecureAcceptAnything"
5+
}
6+
],
7+
"transports": {
8+
"docker": {
9+
"quay.io/kata-containers/confidential-containers": [
10+
{
11+
"type": "signedBy",
12+
"keyType": "GPGKeys",
13+
"keyPath": "/run/image-security/simple_signing/pubkey.gpg"
14+
}
15+
],
16+
"quay.io/kata-containers/confidential-containers:cosign-signed": [
17+
{
18+
"type": "sigstoreSigned",
19+
"keyPath": "/run/image-security/cosign/cosign.pub"
20+
}
21+
],
22+
"quay.io/kata-containers/confidential-containers:cosign-signed-key2": [
23+
{
24+
"type": "sigstoreSigned",
25+
"keyPath": "/run/image-security/cosign/cosign.pub"
26+
}
27+
]
28+
}
29+
}
30+
}

integration/kubernetes/confidential/sev.bats

Lines changed: 119 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,18 +150,22 @@ delete_pods() {
150150
local encrypted_pod_name=$(esudo kubectl get pod -o wide | grep encrypted-image-tests | awk '{print $1;}' || true)
151151
local unencrypted_pod_name=$(esudo kubectl get pod -o wide | grep unencrypted-image-tests | awk '{print $1;}' || true)
152152
local encrypted_pod_name_es=$(esudo kubectl get pod -o wide | grep encrypted-image-tests-es | awk '{print $1;}' || true)
153+
local signed_pod_name=$(esudo kubectl get pod -o wide | grep signed-image-tests | awk '{print $1;}' || true)
153154

154-
# Delete both encrypted and unencrypted pods
155+
# Delete encrypted, unencrypted, and signed pods
155156
esudo kubectl delete -f \
156157
"${TEST_DIR}/unencrypted-image-tests.yaml" 2>/dev/null || true
157158
esudo kubectl delete -f \
158159
"${TEST_DIR}/encrypted-image-tests.yaml" 2>/dev/null || true
159160
esudo kubectl delete -f \
160161
"${TEST_DIR}/encrypted-image-tests-es.yaml" 2>/dev/null || true
161-
162+
esudo kubectl delete -f \
163+
"${TEST_DIR}/signed-image-tests.yaml" 2>/dev/null || true
164+
162165
[ -z "${encrypted_pod_name}" ] || (kubernetes_wait_for_pod_delete_state "${encrypted_pod_name}" || true)
163166
[ -z "${unencrypted_pod_name}" ] || (kubernetes_wait_for_pod_delete_state "${unencrypted_pod_name}" || true)
164167
[ -z "${encrypted_pod_name_es}" ] || (kubernetes_wait_for_pod_delete_state "${encrypted_pod_name_es}" || true)
168+
[ -z "${signed_pod_name}" ] || (kubernetes_wait_for_pod_delete_state "${signed_pod_name}" || true)
165169
}
166170

167171
run_kbs() {
@@ -177,6 +181,12 @@ run_kbs() {
177181

178182
pushd simple-kbs
179183
git checkout -b "branch_${simple_kbs_tag}" "${simple_kbs_tag}"
184+
185+
#copy resources
186+
cp ${TESTS_REPO_DIR}/integration/kubernetes/confidential/fixtures/policy.json resources/
187+
cp ${TESTS_REPO_DIR}/integration/kubernetes/confidential/fixtures/cosign.pub resources/
188+
cp ${TESTS_REPO_DIR}/integration/kubernetes/confidential/fixtures/cosignWrong.pub resources/
189+
180190
esudo docker-compose build
181191

182192
esudo docker-compose up -d
@@ -315,6 +325,7 @@ setup_file() {
315325

316326
generate_service_yaml "unencrypted-image-tests" "${IMAGE_REPO}:unencrypted"
317327
generate_service_yaml "encrypted-image-tests" "${IMAGE_REPO}:encrypted"
328+
generate_service_yaml "signed-image-tests" "quay.io/kata-containers/confidential-containers:cosign-signed"
318329

319330
# SEV-ES policy is 7:
320331
# - NODBG (1): Debugging of the guest is disallowed when set
@@ -339,10 +350,26 @@ setup() {
339350
EOF
340351
}
341352

353+
setup_cosign_signatures_files() {
354+
local key_file="${1:cosign.pub}"
355+
356+
mysql -u${KBS_DB_USER} -p${KBS_DB_PW} -h ${KBS_DB_HOST} -D ${KBS_DB} <<EOF
357+
INSERT INTO secrets VALUES (10, 'key_id1', '${ENCRYPTION_KEY}', 10);
358+
INSERT INTO keysets VALUES (10, 'KEYSET-1', '["key_id1"]', 10);
359+
# see https://github.com/confidential-containers/simple-kbs/blob/8507253e9060fb081fd1eac7bf2841ebf02c0847/db/db-mysql.sql#L140
360+
# INSERT INTO resources VALUES (10, 0, resource_type, resource_path, 10);
361+
INSERT INTO resources SET resource_type="Policy", resource_path="policy.json";
362+
INSERT INTO resources SET resource_type="Cosign Key", resource_path="${key_file}";
363+
EOF
364+
}
365+
342366
@test "$test_tag Test SEV unencrypted container launch success" {
343367
# Turn off pre-attestation. It is not necessary for an unencrypted image.
344368
esudo sed -i 's/guest_pre_attestation = true/guest_pre_attestation = false/g' ${SEV_CONFIG}
345369

370+
# Turn off signature verification
371+
esudo sed -i 's/agent.enable_signature_verification=true/agent.enable_signature_verification=false/g' ${SEV_CONFIG}
372+
346373
# Start the service/deployment/pod
347374
esudo kubectl apply -f "${TEST_DIR}/unencrypted-image-tests.yaml"
348375

@@ -514,7 +541,97 @@ EOF
514541
fi
515542
}
516543

544+
@test "$test_tag Test signed image with no required measurement" {
545+
# Add resource files to
546+
setup_cosign_signatures_files
547+
548+
#change kernel command line for signature validation
549+
esudo sed -i 's/agent.enable_signature_verification=false/agent.enable_signature_verification=true/g' ${SEV_CONFIG}
550+
551+
# Start the service/deployment/pod
552+
esudo kubectl apply -f "${TEST_DIR}/signed-image-tests.yaml"
553+
554+
# Retrieve pod name, wait for it to come up, retrieve pod ip
555+
pod_name=$(esudo kubectl get pod -o wide | grep signed-image-tests | awk '{print $1;}')
556+
kubernetes_wait_for_pod_ready_state "$pod_name" 20
557+
pod_ip=$(esudo kubectl get pod -o wide | grep signed-image-tests | awk '{print $6;}')
558+
559+
print_service_info
560+
}
561+
562+
@test "$test_tag Test signed image with no required measurement, but wrong key (failure)" {
563+
# Add resource files to
564+
setup_cosign_signatures_files "cosignWrong.pub"
565+
566+
#change kernel command line for signature validation
567+
esudo sed -i 's/agent.enable_signature_verification=false/agent.enable_signature_verification=true/g' ${SEV_CONFIG}
568+
569+
# Start the service/deployment/pod
570+
esudo kubectl apply -f "${TEST_DIR}/signed-image-tests.yaml"
571+
572+
# Retrieve pod name, wait for it to come up, retrieve pod ip
573+
pod_name=$(esudo kubectl get pod -o wide | grep signed-image-tests | awk '{print $1;}')
574+
kubernetes_wait_for_pod_ready_state "$pod_name" 20
575+
pod_ip=$(esudo kubectl get pod -o wide | grep signed-image-tests | awk '{print $6;}')
576+
577+
print_service_info
578+
}
579+
580+
@test "$test_tag Test signed image with required measurement" {
581+
# Generate firmware measurement
582+
local append=$(cat ${TEST_DIR}/guest-kernel-append)
583+
echo "Kernel Append: ${append}"
584+
measurement=$(generate_firmware_measurement_with_append "${append}")
585+
echo "Firmware Measurement: ${measurement}"
586+
587+
# Add resource files to
588+
setup_cosign_signatures_files
589+
590+
# Add key to KBS with policy measurement
591+
add_key_to_kbs_db ${measurement}
592+
593+
#change kernel command line for signature validation
594+
esudo sed -i 's/agent.enable_signature_verification=false/agent.enable_signature_verification=true/g' ${SEV_CONFIG}
595+
596+
# Start the service/deployment/pod
597+
esudo kubectl apply -f "${TEST_DIR}/signed-image-tests.yaml"
598+
599+
# Retrieve pod name, wait for it to come up, retrieve pod ip
600+
pod_name=$(esudo kubectl get pod -o wide | grep signed-image-tests | awk '{print $1;}')
601+
kubernetes_wait_for_pod_ready_state "$pod_name" 20
602+
pod_ip=$(esudo kubectl get pod -o wide | grep signed-image-tests | awk '{print $6;}')
603+
604+
print_service_info
605+
}
606+
607+
@test "$test_tag Test signed image with INVALID measurement" {
608+
# Generate firmware measurement
609+
local append="INVALID-INPUT"
610+
measurement=$(generate_firmware_measurement_with_append ${append})
611+
echo "Firmware Measurement: ${measurement}"
612+
613+
# Add resource files to
614+
setup_cosign_signatures_files
517615

616+
# Add key to KBS with policy measurement
617+
add_key_to_kbs_db ${measurement}
618+
619+
#change kernel command line for signature validation
620+
esudo sed -i 's/agent.enable_signature_verification=false/agent.enable_signature_verification=true/g' ${SEV_CONFIG}
621+
622+
# Make sure pre-attestation is enabled.
623+
esudo sed -i 's/guest_pre_attestation = false/guest_pre_attestation = true/g' ${SEV_CONFIG}
624+
625+
# Start the service/deployment/pod
626+
esudo kubectl apply -f "${TEST_DIR}/signed-image-tests.yaml"
627+
628+
# Retrieve pod name, wait for it to come up, retrieve pod ip
629+
pod_name=$(esudo kubectl get pod -o wide | grep signed-image-tests | awk '{print $1;}')
630+
kubernetes_wait_for_pod_ready_state "$pod_name" 20
631+
pod_ip=$(esudo kubectl get pod -o wide | grep signed-image-tests | awk '{print $6;}')
632+
633+
print_service_info
634+
}
518635

519636
teardown_file() {
520637
echo "###############################################################################"

versions.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ externals:
7272
simple-kbs:
7373
description: "Simple KBS that hosts key storage with release policies"
7474
url: "https://github.com/confidential-containers/simple-kbs.git"
75-
tag: "0.1.1"
75+
tag: "v0.1.2"
7676

7777
sonobuoy:
7878
description: "Tool to run kubernetes e2e conformance tests"

0 commit comments

Comments
 (0)