From: Stefan Berger <stef...@us.ibm.com> We are adding a script for loading the kernel master key, which is a symmetric key that is used to decrypt other keys in the system. The kernel master key can either be a trusted or a user key.
A config file /etc/default/masterkey allows to configure the type of key and its location. By default it is expected to be found under /etc/keys/kmk-trusted.blob. Signed-off-by: Stefan Berger <stef...@linux.vnet.ibm.com> --- hooks/masterkey | 19 ++++++++ scripts/init-top/masterkey | 105 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+) create mode 100755 hooks/masterkey create mode 100755 scripts/init-top/masterkey diff --git a/hooks/masterkey b/hooks/masterkey new file mode 100755 index 0000000..b32a936 --- /dev/null +++ b/hooks/masterkey @@ -0,0 +1,19 @@ +#!/bin/sh + +PREREQ="" + +prereqs() +{ + echo "$PREREQ" +} + +case $1 in +prereqs) + prereqs + exit 0 + ;; +esac + +. /usr/share/initramfs-tools/hook-functions +copy_exec /bin/keyctl +copy_exec /bin/uname diff --git a/scripts/init-top/masterkey b/scripts/init-top/masterkey new file mode 100755 index 0000000..62f4cdf --- /dev/null +++ b/scripts/init-top/masterkey @@ -0,0 +1,105 @@ +#!/bin/sh + +# Licensed under the GPLv2 +# +# Copyright (C) 2011 Politecnico di Torino, Italy +# TORSEC group -- http://security.polito.it +# Roberto Sassu <roberto.sa...@polito.it> +# +# (c) Copyright IBM Corporation 2016,2017 +# +# Stefan Berger <stef...@linux.vnet.ibm.com> +# +# This file has been derived from Dracut's 97masterkey/masterkey.sh +# +PREREQ="" + +prereqs() +{ + echo "$PREREQ" +} + +case $1 in +# get pre-requisites +prereqs) + prereqs + exit 0 + ;; +esac + +. /scripts/functions + +NEWROOT="${rootmnt}" +MASTERKEYSCONFIG="${NEWROOT}/etc/default/masterkey" +MULTIKERNELMODE="NO" +PCRLOCKNUM=11 + +getarg() +{ + att=$1 + + sed -n 's/.*'${att}'\([^ ]\+\).*/\1/p' /proc/cmdline +} + +load_masterkey() +{ + # read the configuration from the config file + [ -f "${MASTERKEYSCONFIG}" ] && \ + . ${MASTERKEYSCONFIG} + + # override the kernel master key path name from the 'masterkey=' parameter + # in the kernel command line + MASTERKEYARG=$(getarg masterkey=) + [ -n "${MASTERKEYARG}" ] && \ + MASTERKEY=${MASTERKEYARG} + + # override the kernel master key type from the 'masterkeytype=' parameter + # in the kernel command line + MASTERKEYTYPEARG=$(getarg masterkeytype=) + [ -n "${MASTERKEYTYPEARG}" ] && \ + MASTERKEYTYPE=${MASTERKEYTYPEARG} + + # set default values + [ -z "${MASTERKEYTYPE}" ] && \ + MASTERKEYTYPE="trusted" + + if [ -z "${MASTERKEY}" ]; then + # append the kernel version to the default masterkey path name + # if MULTIKERNELMODE is set to YES + if [ "${MULTIKERNELMODE}" = "YES" ]; then + MASTERKEY="/etc/keys/kmk-${MASTERKEYTYPE}-$(uname -r).blob" + else + MASTERKEY="/etc/keys/kmk-${MASTERKEYTYPE}.blob" + fi + fi + + # set the kernel master key path name + MASTERKEYPATH="${NEWROOT}${MASTERKEY}" + + # check for kernel master key's existence + if [ ! -f "${MASTERKEYPATH}" ]; then + [ "$quiet" != "y" ] && _log_msg "masterkey: kernel master key file not found: ${MASTERKEYPATH}\n" + return 1 + fi + + # read the kernel master key blob + KEYBLOB=$(cat ${MASTERKEYPATH}) + + # add the 'load' prefix if the key type is 'trusted' + [ "${MASTERKEYTYPE}" = "trusted" ] && \ + KEYBLOB="load ${KEYBLOB} pcrlock=${PCRLOCKNUM}" + + # load the kernel master key + _log_msg "masterkey: Loading the kernel master key\n" + keyctl add "${MASTERKEYTYPE}" "kmk-${MASTERKEYTYPE}" "${KEYBLOB}" @u >/dev/null + if [ $? -ne 0 ]; then + _log_msg "masterkey: failed to load the kernel master key: kmk-${MASTERKEYTYPE}\n" + return 1 + fi + + _log_msg "masterkey: Loaded masterkey ${MASTERKEYPATH}\n" + + return 0 +} + +load_masterkey -- 2.8.3