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

Commit 3b714a6

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 3b714a6

5 files changed

Lines changed: 159 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: 120 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
@@ -336,13 +347,30 @@ setup() {
336347
DELETE FROM secrets WHERE id = 10;
337348
DELETE FROM keysets WHERE id = 10;
338349
DELETE FROM policy WHERE id = 10;
350+
DELETE FROM resources WHERE id = 10;
351+
EOF
352+
}
353+
354+
setup_cosign_signatures_files() {
355+
local key_file="${1:cosign.pub}"
356+
357+
mysql -u${KBS_DB_USER} -p${KBS_DB_PW} -h ${KBS_DB_HOST} -D ${KBS_DB} <<EOF
358+
INSERT INTO secrets VALUES (10, 'key_id1', '${ENCRYPTION_KEY}', 10);
359+
INSERT INTO keysets VALUES (10, 'KEYSET-1', '["key_id1"]', 10);
360+
# see https://github.com/confidential-containers/simple-kbs/blob/8507253e9060fb081fd1eac7bf2841ebf02c0847/db/db-mysql.sql#L140
361+
# INSERT INTO resources VALUES (10, 0, resource_type, resource_path, 10);
362+
INSERT INTO resources SET resource_type="Policy", resource_path="policy.json";
363+
INSERT INTO resources SET resource_type="Cosign Key", resource_path="${key_file}";
339364
EOF
340365
}
341366

342367
@test "$test_tag Test SEV unencrypted container launch success" {
343368
# Turn off pre-attestation. It is not necessary for an unencrypted image.
344369
esudo sed -i 's/guest_pre_attestation = true/guest_pre_attestation = false/g' ${SEV_CONFIG}
345370

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

@@ -514,7 +542,97 @@ EOF
514542
fi
515543
}
516544

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

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

519637
teardown_file() {
520638
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)