blob: 7c53a3116f9a74d34a18c4da095395e9788beff4 [file] [log] [blame]
#!/bin/sh /etc/rc.common
# IMA and EVM setup
START=99
start() {
echo "Load in the EVM and IMA keys"
ima_appraise=`cat /proc/cmdline | grep ima_appraise_tcb`
fix=`cat /proc/cmdline | grep ima_appraise=fix`
off=`cat /proc/cmdline | grep ima_appraise=off`
evm=`cat /proc/cmdline | grep evm=fix`
if [ ! -z "$ima_appraise" ]; then
SECFS=/sys/kernel/security
grep -q $SECFS /proc/mounts || mount -n -t securityfs securityfs $SECFS
# search for IMA trusted keyring, then for untrusted
ima_id="`awk '/\.ima/ { printf "%d", "0x"$1; }' /proc/keys`"
if [ -z "$ima_id" ]; then
ima_id=`keyctl search @u keyring _ima 2>/dev/null`
if [ -z "$ima_id" ]; then
ima_id=`keyctl newring _ima @u`
fi
fi
# import IMA X509 certificate
evmctl import /etc/keys/x509_ima.der $ima_id
fi
if [ ! -z "$evm" ] && [ ! -z "$ima_appraise" ];then
# If evm enabled, generate _evm keyring
# search for EVM keyring
evm_id=`keyctl search @u keyring _evm 2>/dev/null`
if [ -z "$evm_id" ]; then
evm_id=`keyctl newring _evm @u`
fi
# import EVM X509 certificate
evmctl import /etc/keys/x509_evm.der $evm_id
blob0="/etc/keys/kmk"
blob1="/etc/keys/evm-key"
if [ -f "$blob0" ] && [ -f "$blob1" ];then
if [ -z "$off" ]; then
# a) import EVM encrypted key
cat /etc/keys/kmk | keyctl padd user kmk @u
keyctl add encrypted evm-key "load `cat /etc/keys/evm-key`" @u
fi
elif [ ! -z "$fix" ];then
# The first time bootup in fix mode, save generated evm-key to a local file
# create and save the key kernel master key (user type)
# LMK is used to encrypt encrypted keys
keyctl add user kmk "`dd if=/dev/urandom bs=1 count=32 2>/dev/null`" @u
keyctl pipe `keyctl search @u user kmk` > /etc/keys/kmk
# create the EVM encrypted key
keyctl add encrypted evm-key "new user:kmk 64" @u
keyctl pipe `keyctl search @u encrypted evm-key` >/etc/keys/evm-key
sync
# for calculate ima hash alone:
# evmctl ima_hash $file
# for sign ima alone:
# evmctl ima_sign --key /etc/keys/privkey_ima.pem $file --uuid --generation 0
# for calculate ima hash and sign extended attr to evm:
# evmctl sign --imahash --key /etc/keys/privkey_evm.pem $file --uuid --generation 0
fi
if [ -z "$off" ];then
# enforce mode: enable evm
echo 1 > /sys/kernel/security/evm
fi
fi
}