[Ovirt-devel] [PATCH] RFC: Encrypted swap support

Ricardo Marin Matinata matinata at br.ibm.com
Wed Jul 21 22:11:08 UTC 2010


(depends on Advance Storage Configuration patch)
This patch adds the option of requesting, at install time, that swap LVs be encrypted. The modifications include:

* Introduction of the ovirt_swap_encrypt install parameter
* Inclusion of all required packages
* Inclusion of required kernel modules
* Introduction of /etc/ovirt-crypttab to hold encrypted swap configuration (Couldn't use /etc/crypttab since it happens in rc.sysinit, before persistence is available
* Modification of ovirt-early so it automatically brings up encrypted swap, if available

It works as follows:
   ovirt_swap_encrypt={Swap|Swap2},cypher1[:cypher2...][;{Swap|Swap2},...]
   the default cypher is set to aes-cbc-essiv:sha256

Signed-off-by: Ricardo Marin Matinata <matinata at br.ibm.com>
---
 recipe/common-blacklist.ks   |    4 +-
 recipe/common-pkgs.ks        |    1 +
 recipe/common-post.ks        |   12 +++++++++++
 scripts/ovirt-config-storage |   19 ++++++++++++++---
 scripts/ovirt-early          |   37 ++++++++++++++++++++++++++++++++++-
 scripts/ovirt-functions      |   44 ++++++++++++++++++++++++++++++++++++++++++
 6 files changed, 110 insertions(+), 7 deletions(-)

diff --git a/recipe/common-blacklist.ks b/recipe/common-blacklist.ks
index 7c08c39..4fb980e 100644
--- a/recipe/common-blacklist.ks
+++ b/recipe/common-blacklist.ks
@@ -15,7 +15,7 @@ RPMS="$RPMS mkinitrd isomd5sum dmraid checkpolicy"
 # Remove additional RPMs forcefully
 RPMS="$RPMS gamin pm-utils kbd usermode vbetool ConsoleKit hdparm \
     efibootmgr linux-atm-libs fedora-release-notes \
-    cryptsetup-luks pciutils mtools syslinux \
+    pciutils mtools syslinux \
     wireless-tools radeontool libicu gnupg2 \
     fedora-logos"
 
@@ -57,7 +57,7 @@ driver_mods="drivers/auxdisplay drivers/net/appletalk \
        drivers/net/hamradio drivers/net/pcmcia drivers/net/tokenring \
        drivers/net/wireless drivers/net/irda drivers/atm drivers/usb/atm \
        drivers/acpi drivers/char/drm drivers/char/mwave \
-       drivers/char/ipmp drivers/char/pcmcia drivers/crypto \
+       drivers/char/ipmp drivers/char/pcmcia \
        drivers/firmware drivers/memstick drivers/mmc drivers/mfs \
        drivers/parport drivers/video drivers/watchdog drivers/net/ppp* \
        drivers/usb/serial drivers/usb/misc drivers/usb/class \
diff --git a/recipe/common-pkgs.ks b/recipe/common-pkgs.ks
index 7578335..126e26f 100644
--- a/recipe/common-pkgs.ks
+++ b/recipe/common-pkgs.ks
@@ -78,3 +78,4 @@ device-mapper-multipath
 kpartx
 dracut-network
 patch
+cryptsetup-luks
diff --git a/recipe/common-post.ks b/recipe/common-post.ks
index c79e186..4fae515 100644
--- a/recipe/common-post.ks
+++ b/recipe/common-post.ks
@@ -221,3 +221,15 @@ mkdir -p /data2
 mkdir -p /liveos
 echo "/dev/HostVG/Config /config ext3 defaults,noauto,noatime 0 0" >> /etc/fstab
 
+# load modules required by crypto swap
+cat > /etc/sysconfig/modules/swap-crypt.modules <<EOF
+#!/bin/sh
+
+modprobe aes >/dev/null 2>&1
+modprobe dm_mod >/dev/null 2>&1
+modprobe dm_crypt >/dev/null 2>&1
+modprobe cryptoloop >/dev/null 2>&1
+modprobe cbc >/dev/null 2>&1
+modprobe sha256 >/dev/null 2>&1
+
+EOF
diff --git a/scripts/ovirt-config-storage b/scripts/ovirt-config-storage
index e3bb57b..c984265 100755
--- a/scripts/ovirt-config-storage
+++ b/scripts/ovirt-config-storage
@@ -677,8 +677,12 @@ create_hostvg()
     if [ "$SWAP_SIZE" -gt 0 ]; then
         log "Creating swap partition"
         lvcreate --name Swap --size ${SWAP_SIZE}M /dev/HostVG
-        mkswap -L "SWAP" /dev/HostVG/Swap
-        echo "/dev/HostVG/Swap swap swap defaults 0 0" >> /etc/fstab
+        if [ -n ${OVIRT_CRYPT_SWAP} ]; then
+            echo "SWAP /dev/HostVG/Swap /dev/mapper/ovirt-crypt-swap ${OVIRT_CRYPT_SWAP}" >> /etc/ovirt-crypttab
+        else
+            mkswap -L "SWAP" /dev/HostVG/Swap
+            echo "/dev/HostVG/Swap swap swap defaults 0 0" >> /etc/fstab
+        fi
     fi
     if [ "$CONFIG_SIZE" -gt 0 ]; then
         log "Creating config partition"
@@ -769,8 +773,12 @@ create_appvg()
     if [ "$SWAP2_SIZE" -gt 0 ]; then
         log "Creating swap2 partition"
         lvcreate --name Swap2 --size ${SWAP2_SIZE}M /dev/AppVG
-        mkswap -L "SWAP2" /dev/AppVG/Swap2
-        echo "/dev/AppVG/Swap2 swap swap defaults 0 0" >> /etc/fstab
+        if [ -n ${OVIRT_CRYPT_SWAP2} ]; then
+            echo "SWAP2 /dev/AppVG/Swap2 /dev/mapper/ovirt-crypt-swap2 ${OVIRT_CRYPT_SWAP2}" >> /etc/ovirt-crypttab
+        else
+            mkswap -L "SWAP2" /dev/AppVG/Swap2
+            echo "/dev/AppVG/Swap2 swap swap defaults 0 0" >> /etc/fstab
+        fi
     fi
 
     local use_data=1
@@ -885,6 +893,9 @@ perform_partitioning()
     done
     create_hostvg
     [ -n ${APPVGDRIVE} ] && create_appvg
+    if [ -n ${OVIRT_CRYPT_SWAP2} -o -n ${OVIRT_CRYPT_SWAP} ]; then
+        ovirt_store_config /etc/ovirt-crypttab
+    fi
     stop_log
 }
 
diff --git a/scripts/ovirt-early b/scripts/ovirt-early
index 23198b1..5c8793d 100755
--- a/scripts/ovirt-early
+++ b/scripts/ovirt-early
@@ -239,6 +239,12 @@ start_ovirt_early () {
     vol_swap2_size=
     vol_data2_size=
 
+    #   ovirt_swap_encrypt={Swap|Swap2},cypher1[:cypher2...][;{Swap|Swap2}...]
+    # request swap encryption
+    # the default cypher is set to aes-cbc-essiv:sha256
+    crypt_swap=
+    crypt_swap2=
+
     #   ovirt_upgrade
     # install/update oVirt Node image on the local installation target disk
     upgrade=
@@ -572,6 +578,32 @@ start_ovirt_early () {
             BOOT_IMAGE=* | initrd=* | check | linux | liveimg | \
             root=* | rootfstype=* | rootflags=* | ro)
             ;;
+            ovirt_swap_encrypt=*)
+            i=${i#ovirt_swap_encrypt=}
+            eval $(printf $i|awk -F\; '{ print "swap1="$1; print "swap2="$2; }')
+            for p in 1 2; do
+                var=swap$p
+                swapdev=
+                swapcyph=
+                local default_cypher="aes-cbc-essiv:sha256"
+		if [ -n ${!var} ]; then
+                    eval $(printf ${!var} |awk -F, '{ print "swapdev="$1; print "swapcyph="$2; }')
+                    if [ "${swapdev}" = "Swap" ]; then
+                        if [ -n ${swapcyph} ]; then
+                            crypt_swap=${swapcyph}
+                        else
+                            crypt_swap=${default_cypher}
+                        fi
+                    elif [ "${swapdev}" = "Swap2" ]; then
+                        if [ -n ${swapcyph} ]; then
+                            crypt_swap2=${swapcyph}
+                        else
+                            crypt_swap2=${default_cypher}
+                        fi
+                    fi
+                fi
+            done
+            ;;
             *)
             bootparams="$bootparams $i"
             ;;
@@ -592,7 +624,7 @@ start_ovirt_early () {
         ip_gateway=$gateway
     fi
     # save boot parameters as defaults for ovirt-config-*
-    params="bootif init initapp vol_boot_size vol_swap_size vol_root_size vol_config_size vol_logging_size vol_data_size vol_swap2_size vol_data2_size upgrade standalone overcommit ip_address ip_netmask ip_gateway ipv6 dns ntp vlan ssh_pwauth syslog_server syslog_port collectd_server collectd_port bootparams hostname firstboot runtime_mode"
+    params="bootif init initapp vol_boot_size vol_swap_size vol_root_size vol_config_size vol_logging_size vol_data_size vol_swap2_size vol_data2_size crypt_swap crypt_swap2 upgrade standalone overcommit ip_address ip_netmask ip_gateway ipv6 dns ntp vlan ssh_pwauth syslog_server syslog_port collectd_server collectd_port bootparams hostname firstboot runtime_mode"
     # mount /config unless firstboot is forced
     if [ "$firstboot" != "1" ]; then
         mount_config
@@ -610,6 +642,9 @@ start_ovirt_early () {
     done
     augtool $tmpaug
     . $OVIRT_DEFAULTS
+    if [ "$firstboot" != "1" -a -f /etc/ovirt-crypttab ]; then
+        mount_crypt_swap
+    fi
     if [ -f /etc/sysconfig/network ]; then
         . /etc/sysconfig/network
         if [ -n "$HOSTNAME" ]; then
diff --git a/scripts/ovirt-functions b/scripts/ovirt-functions
index 5c574f7..06611b6 100644
--- a/scripts/ovirt-functions
+++ b/scripts/ovirt-functions
@@ -447,6 +447,50 @@ mount_data2() {
     fi
 }
 
+mount_crypt_swap() {
+    crypttab="/etc/ovirt-crypttab"
+    rc=1
+    { [ -z "${crypttab}" ] || [ ! -f "${crypttab}" ] || [ ! $(cat "${crypttab}") ]; } 
+&& return ${rc}
+    rc=0
+
+    while read label dev mapp cyph; do
+        if [ -n ${label} -a -n ${dev} -a -n ${mapp} -a -n ${cyph} ]; then
+            if grep -q "${dev}" /proc/swaps; then
+                swapoff ${dev} >/dev/null 2>&1
+                rc=$?
+                [ ${rc} -ne 0 ] && {
+                    log "swapoff failed for Un-encrypted ${dev}";
+                    continue;
+                }
+            fi
+            if [ ! -b ${mapp} ]; then
+                /sbin/cryptsetup -d /dev/urandom -c ${cyph} create ${mapp} ${dev} > /dev/null 2>&1
+                rc=$?
+                [ ${rc} -ne 0 ] && {
+                    log "Creation of encrypted swap for ${dev} failed";
+                    continue;
+                }
+            fi
+            mkswap -L ${label} ${mapp} >/dev/null 2>&1
+            rc=$?
+            [ ${rc} -ne 0 ] && {
+                log "Creation of swap for ${mapp} failed";
+                continue;
+            }
+            swapon ${mapp} > /dev/null 2>&1
+            [ ${rc} -ne 0 ] && {
+                log "Activation of swap for ${mapp} failed";
+                continue;
+            }
+        else
+            continue
+        fi
+    done < ${cypttab}
+
+    return ${rc}
+}
+
 # augtool wrapper
 #   workaround for bind-mounted files
 #   see https://fedorahosted.org/augeas/ticket/32
-- 
1.6.6.1




More information about the ovirt-devel mailing list