dracut: added new module integrity
This module initializes the EVM software and permits to load a custom IMA policy. Signed-off-by: Roberto Sassu <roberto.sassu@polito.it> Acked-by: Gianluca Ramunno <ramunno@polito.it>master
parent
e1ed2a207b
commit
0c71fb672f
|
|
@ -718,6 +718,12 @@ rd.znet=ctc,0.0.0600,0.0.0601,0.0.0602,protocol=bar</programlisting></para>
|
|||
<para>Set the type of the kernel master key. e.g.: <programlisting>masterkeytype=trusted</programlisting></para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><envar>evmkey=</envar><replaceable><EVM key path name></replaceable></term>
|
||||
<listitem>
|
||||
<para>Set the path name of the EVM key. e.g.: <programlisting>evmkey=/etc/keys/evm-trusted.blob</programlisting></para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
</refsect2>
|
||||
<refsect2>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,40 @@
|
|||
# Directions for creating the encrypted key that will be used to initialize
|
||||
# the EVM software.
|
||||
|
||||
# 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 `keyctl search @u encrypted evm_key` > /etc/keys/evm-trusted.blob'
|
||||
|
||||
# The EVM key path name can be set in one of the following ways (specified in
|
||||
# the order in which the variable is overwritten):
|
||||
|
||||
1) use the default value:
|
||||
--------------------------------------------------------------------------
|
||||
EVMKEY="/etc/keys/evm-trusted.blob"
|
||||
--------------------------------------------------------------------------
|
||||
|
||||
2) create the configuration file '/etc/sysconfig/evm' and set the EVMKEY variable;
|
||||
|
||||
3) specify the EVM key path name in the 'evmkey=' parameter of the kernel command
|
||||
line.
|
||||
|
||||
|
||||
# Directions for loading a custom IMA policy.
|
||||
|
||||
# Write the policy following the instructions provided in the file
|
||||
# 'Documentation/ABI/testing/ima_policy' of the kernel documentation.
|
||||
|
||||
# Save the policy in a file.
|
||||
|
||||
# Create the configuration file '/etc/sysconfig/ima' to override the path name of
|
||||
# the IMA custom policy.
|
||||
------------- '/etc/sysconfig/ima' (with the default value) -------------
|
||||
IMAPOLICY="/etc/sysconfig/ima-policy"
|
||||
-------------------------------------------------------------------------
|
||||
|
|
@ -0,0 +1,91 @@
|
|||
#!/bin/sh
|
||||
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
# ex: ts=8 sw=4 sts=4 et filetype=sh
|
||||
|
||||
# Licensed under the GPLv2
|
||||
#
|
||||
# Copyright (C) 2011 Politecnico di Torino, Italy
|
||||
# TORSEC group -- http://security.polito.it
|
||||
# Roberto Sassu <roberto.sassu@polito.it>
|
||||
|
||||
EVMSECFILE="${SECURITYFSDIR}/evm"
|
||||
EVMCONFIG="${NEWROOT}/etc/sysconfig/evm"
|
||||
EVMKEYDESC="evm-key"
|
||||
EVMKEYTYPE="encrypted"
|
||||
EVMKEYID=""
|
||||
|
||||
load_evm_key()
|
||||
{
|
||||
# read the configuration from the config file
|
||||
[ -f "${EVMCONFIG}" ] && \
|
||||
. ${EVMCONFIG}
|
||||
|
||||
# override the EVM key path name from the 'evmkey=' parameter in the kernel
|
||||
# command line
|
||||
EVMKEYARG=$(getarg evmkey=)
|
||||
[ $? -eq 0 ] && \
|
||||
EVMKEY=${EVMKEYARG}
|
||||
|
||||
# set the default value
|
||||
[ -z "${EVMKEY}" ] && \
|
||||
EVMKEY="/etc/keys/evm-trusted.blob";
|
||||
|
||||
# set the EVM key path name
|
||||
EVMKEYPATH="${NEWROOT}${EVMKEY}"
|
||||
|
||||
# check for EVM encrypted key's existence
|
||||
if [ ! -f "${EVMKEYPATH}" ]; then
|
||||
if [ "${RD_DEBUG}" = "yes" ]; then
|
||||
info "integrity: EVM encrypted key file not found: ${EVMKEYPATH}"
|
||||
fi
|
||||
return 1
|
||||
fi
|
||||
|
||||
# read the EVM encrypted key blob
|
||||
KEYBLOB=$(cat ${EVMKEYPATH})
|
||||
|
||||
# load the EVM encrypted key
|
||||
EVMKEYID=$(keyctl add ${EVMKEYTYPE} ${EVMKEYDESC} "load ${KEYBLOB}" @u)
|
||||
[ $? -eq 0 ] || {
|
||||
info "integrity: failed to load the EVM encrypted key: ${EVMKEYDESC}";
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
unload_evm_key()
|
||||
{
|
||||
# unlink the EVM encrypted key
|
||||
keyctl unlink ${EVMKEYID} @u || {
|
||||
info "integrity: failed to unlink the EVM encrypted key: ${EVMKEYDESC}";
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
enable_evm()
|
||||
{
|
||||
# check kernel support for EVM
|
||||
if [ ! -e "${EVMSECFILE}" ]; then
|
||||
if [ "${RD_DEBUG}" = "yes" ]; then
|
||||
info "integrity: EVM kernel support is disabled"
|
||||
fi
|
||||
return 0
|
||||
fi
|
||||
|
||||
# load the EVM encrypted key
|
||||
load_evm_key || return 1
|
||||
|
||||
# initialize EVM
|
||||
info "Enabling EVM"
|
||||
echo 1 > ${EVMSECFILE}
|
||||
|
||||
# unload the EVM encrypted key
|
||||
unload_evm_key || return 1
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
enable_evm
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
#!/bin/sh
|
||||
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
# ex: ts=8 sw=4 sts=4 et filetype=sh
|
||||
|
||||
# Licensed under the GPLv2
|
||||
#
|
||||
# Copyright (C) 2011 Politecnico di Torino, Italy
|
||||
# TORSEC group -- http://security.polito.it
|
||||
# Roberto Sassu <roberto.sassu@polito.it>
|
||||
|
||||
IMASECDIR="${SECURITYFSDIR}/ima"
|
||||
IMACONFIG="${NEWROOT}/etc/sysconfig/ima"
|
||||
IMAPOLICY="/etc/sysconfig/ima-policy"
|
||||
|
||||
load_ima_policy()
|
||||
{
|
||||
# check kernel support for IMA
|
||||
if [ ! -e "${IMASECDIR}" ]; then
|
||||
if [ "${RD_DEBUG}" = "yes" ]; then
|
||||
info "integrity: IMA kernel support is disabled"
|
||||
fi
|
||||
return 0
|
||||
fi
|
||||
|
||||
# override the default configuration
|
||||
[ -f "${IMACONFIG}" ] && \
|
||||
. ${IMACONFIG}
|
||||
|
||||
# set the IMA policy path name
|
||||
IMAPOLICYPATH="${NEWROOT}${IMAPOLICY}"
|
||||
|
||||
# check the existence of the IMA policy file
|
||||
[ -f "${IMAPOLICYPATH}" ] && {
|
||||
info "Loading the provided IMA custom policy";
|
||||
cat ${IMAPOLICYPATH} > ${IMASECDIR}/policy;
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
load_ima_policy
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
#!/bin/bash
|
||||
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
# ex: ts=8 sw=4 sts=4 et filetype=sh
|
||||
|
||||
check() {
|
||||
return 0
|
||||
}
|
||||
|
||||
depends() {
|
||||
echo masterkey
|
||||
return 0
|
||||
}
|
||||
|
||||
install() {
|
||||
inst_hook pre-pivot 61 "$moddir/evm-enable.sh"
|
||||
inst_hook pre-pivot 62 "$moddir/ima-policy-load.sh"
|
||||
}
|
||||
Loading…
Reference in New Issue