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

Commit

Permalink
CC: Add image signature tests for SEV
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Alex-Carter01 authored and Alex Carter committed Mar 31, 2023
1 parent 69baf08 commit 3b714a6
Show file tree
Hide file tree
Showing 5 changed files with 159 additions and 3 deletions.
4 changes: 4 additions & 0 deletions integration/kubernetes/confidential/fixtures/cosign.pub
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE1gHGbfk1AqOweLEM8HfT0bmfQE3b
9fcp/LU75FMfxVZXmNVtUprsHM1thuuiBKOofv8KV7TrFl4p8NJCiXUkhA==
-----END PUBLIC KEY-----
4 changes: 4 additions & 0 deletions integration/kubernetes/confidential/fixtures/cosignWrong.pub
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
-----BEGIN PUBLIC KEY-----
MFkwEwkHKoZIzj0CAQYIKoZIzj0DAkcDQgAE1gHGbfk1AqOweoEM8HfT0bmf2E3b
9fcp/LU75FMfxVZXmNVtUprsHM1thuuiBKOofv8KV7TrFl4p8NJCiXUkhA==
-----END PUBLIC KEY-----
30 changes: 30 additions & 0 deletions integration/kubernetes/confidential/fixtures/policy.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"default": [
{
"type": "insecureAcceptAnything"
}
],
"transports": {
"docker": {
"quay.io/kata-containers/confidential-containers": [
{
"type": "signedBy",
"keyType": "GPGKeys",
"keyPath": "/run/image-security/simple_signing/pubkey.gpg"
}
],
"quay.io/kata-containers/confidential-containers:cosign-signed": [
{
"type": "sigstoreSigned",
"keyPath": "/run/image-security/cosign/cosign.pub"
}
],
"quay.io/kata-containers/confidential-containers:cosign-signed-key2": [
{
"type": "sigstoreSigned",
"keyPath": "/run/image-security/cosign/cosign.pub"
}
]
}
}
}
122 changes: 120 additions & 2 deletions integration/kubernetes/confidential/sev.bats
Original file line number Diff line number Diff line change
Expand Up @@ -150,18 +150,22 @@ delete_pods() {
local encrypted_pod_name=$(esudo kubectl get pod -o wide | grep encrypted-image-tests | awk '{print $1;}' || true)
local unencrypted_pod_name=$(esudo kubectl get pod -o wide | grep unencrypted-image-tests | awk '{print $1;}' || true)
local encrypted_pod_name_es=$(esudo kubectl get pod -o wide | grep encrypted-image-tests-es | awk '{print $1;}' || true)
local signed_pod_name=$(esudo kubectl get pod -o wide | grep signed-image-tests | awk '{print $1;}' || true)

# Delete both encrypted and unencrypted pods
# Delete encrypted, unencrypted, and signed pods
esudo kubectl delete -f \
"${TEST_DIR}/unencrypted-image-tests.yaml" 2>/dev/null || true
esudo kubectl delete -f \
"${TEST_DIR}/encrypted-image-tests.yaml" 2>/dev/null || true
esudo kubectl delete -f \
"${TEST_DIR}/encrypted-image-tests-es.yaml" 2>/dev/null || true

esudo kubectl delete -f \
"${TEST_DIR}/signed-image-tests.yaml" 2>/dev/null || true

[ -z "${encrypted_pod_name}" ] || (kubernetes_wait_for_pod_delete_state "${encrypted_pod_name}" || true)
[ -z "${unencrypted_pod_name}" ] || (kubernetes_wait_for_pod_delete_state "${unencrypted_pod_name}" || true)
[ -z "${encrypted_pod_name_es}" ] || (kubernetes_wait_for_pod_delete_state "${encrypted_pod_name_es}" || true)
[ -z "${signed_pod_name}" ] || (kubernetes_wait_for_pod_delete_state "${signed_pod_name}" || true)
}

run_kbs() {
Expand All @@ -177,6 +181,12 @@ run_kbs() {

pushd simple-kbs
git checkout -b "branch_${simple_kbs_tag}" "${simple_kbs_tag}"

#copy resources
cp ${TESTS_REPO_DIR}/integration/kubernetes/confidential/fixtures/policy.json resources/
cp ${TESTS_REPO_DIR}/integration/kubernetes/confidential/fixtures/cosign.pub resources/
cp ${TESTS_REPO_DIR}/integration/kubernetes/confidential/fixtures/cosignWrong.pub resources/

esudo docker-compose build

esudo docker-compose up -d
Expand Down Expand Up @@ -315,6 +325,7 @@ setup_file() {

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

# SEV-ES policy is 7:
# - NODBG (1): Debugging of the guest is disallowed when set
Expand All @@ -336,13 +347,30 @@ setup() {
DELETE FROM secrets WHERE id = 10;
DELETE FROM keysets WHERE id = 10;
DELETE FROM policy WHERE id = 10;
DELETE FROM resources WHERE id = 10;
EOF
}

setup_cosign_signatures_files() {
local key_file="${1:cosign.pub}"

mysql -u${KBS_DB_USER} -p${KBS_DB_PW} -h ${KBS_DB_HOST} -D ${KBS_DB} <<EOF
INSERT INTO secrets VALUES (10, 'key_id1', '${ENCRYPTION_KEY}', 10);
INSERT INTO keysets VALUES (10, 'KEYSET-1', '["key_id1"]', 10);
# see https://github.com/confidential-containers/simple-kbs/blob/8507253e9060fb081fd1eac7bf2841ebf02c0847/db/db-mysql.sql#L140
# INSERT INTO resources VALUES (10, 0, resource_type, resource_path, 10);
INSERT INTO resources SET resource_type="Policy", resource_path="policy.json";
INSERT INTO resources SET resource_type="Cosign Key", resource_path="${key_file}";
EOF
}

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

# Turn off signature verification
esudo sed -i 's/agent.enable_signature_verification=true/agent.enable_signature_verification=false/g' ${SEV_CONFIG}

# Start the service/deployment/pod
esudo kubectl apply -f "${TEST_DIR}/unencrypted-image-tests.yaml"

Expand Down Expand Up @@ -514,7 +542,97 @@ EOF
fi
}

@test "$test_tag Test signed image with no required measurement" {
# Add resource files to
setup_cosign_signatures_files

#change kernel command line for signature validation
esudo sed -i 's/agent.enable_signature_verification=false/agent.enable_signature_verification=true/g' ${SEV_CONFIG}

# Start the service/deployment/pod
esudo kubectl apply -f "${TEST_DIR}/signed-image-tests.yaml"

# Retrieve pod name, wait for it to come up, retrieve pod ip
pod_name=$(esudo kubectl get pod -o wide | grep signed-image-tests | awk '{print $1;}')
kubernetes_wait_for_pod_ready_state "$pod_name" 20
pod_ip=$(esudo kubectl get pod -o wide | grep signed-image-tests | awk '{print $6;}')

print_service_info
}

@test "$test_tag Test signed image with no required measurement, but wrong key (failure)" {
# Add resource files to
setup_cosign_signatures_files "cosignWrong.pub"

#change kernel command line for signature validation
esudo sed -i 's/agent.enable_signature_verification=false/agent.enable_signature_verification=true/g' ${SEV_CONFIG}

# Start the service/deployment/pod
esudo kubectl apply -f "${TEST_DIR}/signed-image-tests.yaml"

# Retrieve pod name, wait for it to come up, retrieve pod ip
pod_name=$(esudo kubectl get pod -o wide | grep signed-image-tests | awk '{print $1;}')
kubernetes_wait_for_pod_ready_state "$pod_name" 20
pod_ip=$(esudo kubectl get pod -o wide | grep signed-image-tests | awk '{print $6;}')

print_service_info
}

@test "$test_tag Test signed image with required measurement" {
# Generate firmware measurement
local append=$(cat ${TEST_DIR}/guest-kernel-append)
echo "Kernel Append: ${append}"
measurement=$(generate_firmware_measurement_with_append "${append}")
echo "Firmware Measurement: ${measurement}"

# Add resource files to
setup_cosign_signatures_files

# Add key to KBS with policy measurement
add_key_to_kbs_db ${measurement}

#change kernel command line for signature validation
esudo sed -i 's/agent.enable_signature_verification=false/agent.enable_signature_verification=true/g' ${SEV_CONFIG}

# Start the service/deployment/pod
esudo kubectl apply -f "${TEST_DIR}/signed-image-tests.yaml"

# Retrieve pod name, wait for it to come up, retrieve pod ip
pod_name=$(esudo kubectl get pod -o wide | grep signed-image-tests | awk '{print $1;}')
kubernetes_wait_for_pod_ready_state "$pod_name" 20
pod_ip=$(esudo kubectl get pod -o wide | grep signed-image-tests | awk '{print $6;}')

print_service_info
}

@test "$test_tag Test signed image with INVALID measurement" {
# Generate firmware measurement
local append="INVALID-INPUT"
measurement=$(generate_firmware_measurement_with_append ${append})
echo "Firmware Measurement: ${measurement}"

# Add resource files to
setup_cosign_signatures_files

# Add key to KBS with policy measurement
add_key_to_kbs_db ${measurement}

#change kernel command line for signature validation
esudo sed -i 's/agent.enable_signature_verification=false/agent.enable_signature_verification=true/g' ${SEV_CONFIG}

# Make sure pre-attestation is enabled.
esudo sed -i 's/guest_pre_attestation = false/guest_pre_attestation = true/g' ${SEV_CONFIG}

# Start the service/deployment/pod
esudo kubectl apply -f "${TEST_DIR}/signed-image-tests.yaml"

# Retrieve pod name, wait for it to come up, retrieve pod ip
pod_name=$(esudo kubectl get pod -o wide | grep signed-image-tests | awk '{print $1;}')
kubernetes_wait_for_pod_ready_state "$pod_name" 20
pod_ip=$(esudo kubectl get pod -o wide | grep signed-image-tests | awk '{print $6;}')

print_service_info
}

teardown_file() {
echo "###############################################################################"
Expand Down
2 changes: 1 addition & 1 deletion versions.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ externals:
simple-kbs:
description: "Simple KBS that hosts key storage with release policies"
url: "https://github.com/confidential-containers/simple-kbs.git"
tag: "0.1.1"
tag: "v0.1.2"

sonobuoy:
description: "Tool to run kubernetes e2e conformance tests"
Expand Down

0 comments on commit 3b714a6

Please sign in to comment.