EVM verifies file metadata integrity based on a keyed HMAC. The key should be loaded in the initramfs before pivoting root. This patch loads the trusted and encrypted EVM keys onto root's keyring before enabling EVM. --- /dev/null 2011-05-24 06:19:53.737797039 -0400 +++ modules.d/98evm/install 2011-05-23 08:47:39.859250064 -0400 @@ -0,0 +1,4 @@ +#!/bin/bash + +dracut_install keyctl +inst_hook pre-pivot 60 "$moddir/evm-enable.sh" --- /dev/null 2011-05-24 06:19:53.737797039 -0400 +++ modules.d/98evm/check 2011-05-23 07:49:31.839983246 -0400 @@ -0,0 +1,9 @@ +#!/bin/bash + +[[ $1 = '-h' ]] && { + [ -x "/bin/keyctl" ] || exit 1 + exit 0 +} + +exit 0 + --- /dev/null 2011-05-24 06:19:53.737797039 -0400 +++ modules.d/98evm/evm-enable.sh 2011-05-23 06:59:27.786421196 -0400 @@ -0,0 +1,65 @@ +#!/bin/sh + +security_evm_exists() +{ + RC=0 + + if [ ! -d "/security" ]; then + mkdir /security + fi + mount -t securityfs /security /security >/dev/null 2>&1 + if [ ! -e "/security/evm" ]; then + RC=1 + fi + umount /security + return $RC +} + +enable_evm() +{ + if [ ! -d "/security" ]; then + mkdir /security + fi + mount -t securityfs /security /security >/dev/null 2>&1 + if [ -e "/security/evm" ]; then + echo 1 > /security/evm + fi + umount /security +} + +load_keys() +{ + RC=0 + + MASTERKEY=$(getarg masterkey=) + if [ $? -ne 0 ]; then + MASTERKEY='kmk-trusted.blob' + fi + + EVMKEY=$(getarg evmkey=) + if [ $? -ne 0 ]; then + EVMKEY='evm-trusted.blob' + fi + + if [ ! -f "$NEWROOT/etc/keys/$MASTERKEY" ]; then + info "EVM: missing master key" + RC=1 + elif [ ! -f "$NEWROOT/etc/keys/$EVMKEY" ]; then + info "EVM: missing EVM key" + RC=1 + else + keyctl add trusted kmk-trusted "load `cat $NEWROOT/etc/keys/$MASTERKEY`" @u + keyctl add encrypted evm-key "load `cat $NEWROOT/etc/keys/$EVMKEY`" @u + fi + return $RC +} + +security_evm_exists +RC=$? +if [ $RC -eq 0 ]; then + load_keys + RC=$? +fi +if [ $RC -eq 0 ]; then + enable_evm +fi --- /dev/null 2011-05-24 06:19:53.737797039 -0400 +++ modules.d/98evm/README 2011-05-24 07:37:43.467948636 -0400 @@ -0,0 +1,47 @@ +# Directions for creating an EVM key, encrypted/decrypted using a trusted key. + +# Create the kernel master key (trusted key type) for encrypting/decrypting +# other keys, including the EVM key. + +# A trusted key is a TPM random number, which is only ever exposed to +# userspace as an encrypted datablob. A trusted key can be sealed to a +# set of PCR values. For more details on trusted keys, refer to the +# kernel keys-trusted-encrypted.txt documentation. +$ keyctl add trusted kmk-trusted "new 32" @u +801713097 + +# Save the kernel master key +$ su -c 'keyctl pipe 801713097 > /etc/keys/kmk-trusted.blob' + +# Create the EVM key (encrypted key type) +# +# The encrypted key is a random number encrypted/decrypted using the +# kernel master key. The encrypted key is only exposed to userspace +# as an encrypted datablob. +$ keyctl add encrypted evm-key "new trusted:kmk-trusted 32" @u +782117972 + +# Save the encrypted key +$ su -c 'keyctl pipe 782117972 > /etc/keys/evm-trusted.blob' + +------------------------------------------------------------------ +# Directions for creating an EVM key, encrypted/decrypted using a user key. +# (Dracut support for encrypting/decrypting the EVM key using a user key is +# not provided.) + +# For those systems which don't have a TPM, create a user key of 32 +# random bytes. Unlike trusted/encrypted keys, user type key data is +# visible to userspace. +$ keyctl add user kmk-user "`dd if=/dev/urandom bs=1 count=32 2>/dev/null`" @u +144468621 + +# Save the user key +$ su -c 'keyctl pipe 144468621 > /etc/keys/kmk-user.blob' + +# Create the EVM key (encrypted key type), using the user key to +# encrypt/decrypt it. +$ keyctl add encrypted evm-key "new user:kmk-user 32" @u +432095285 + +# Save the encrypted key +$ su -c 'keyctl pipe 432095285 > /etc/keys/evm-user.blob' -- To unsubscribe from this list: send the line "unsubscribe initramfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html