import clevis-13-3.el8
This commit is contained in:
parent
f52f3d98ab
commit
b2e84aface
@ -1 +1 @@
|
||||
086374814a4d71db8625d27a1719e03244a7cff0 SOURCES/clevis-11.tar.xz
|
||||
83aebcbe5792b43bf281b442f379cea08d7c43b0 SOURCES/clevis-13.tar.xz
|
||||
|
2
.gitignore
vendored
2
.gitignore
vendored
@ -1 +1 @@
|
||||
SOURCES/clevis-11.tar.xz
|
||||
SOURCES/clevis-13.tar.xz
|
||||
|
@ -0,0 +1,84 @@
|
||||
From 27a27befed2257c2156ed8b94d679951b9b1a4d5 Mon Sep 17 00:00:00 2001
|
||||
From: Sergio Correia <scorreia@redhat.com>
|
||||
Date: Wed, 13 May 2020 23:51:04 -0300
|
||||
Subject: [PATCH 1/8] Adjust pin-tang test to account for newer tang without
|
||||
tangd-update
|
||||
|
||||
---
|
||||
src/luks/tests/unbind-unbound-slot-luks2 | 1 +
|
||||
src/pins/tang/meson.build | 8 +-------
|
||||
src/pins/tang/pin-tang | 11 ++++++++---
|
||||
3 files changed, 10 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/src/luks/tests/unbind-unbound-slot-luks2 b/src/luks/tests/unbind-unbound-slot-luks2
|
||||
index 6a2aca5..6d814ad 100755
|
||||
--- a/src/luks/tests/unbind-unbound-slot-luks2
|
||||
+++ b/src/luks/tests/unbind-unbound-slot-luks2
|
||||
@@ -36,6 +36,7 @@ TMP="$(mktemp -d)"
|
||||
|
||||
DEV="${TMP}/luks2-device"
|
||||
new_device "luks2" "${DEV}"
|
||||
+SLT=2
|
||||
if clevis luks unbind -d "${DEV}" -s "${SLT}"; then
|
||||
error "${TEST}: Unbind is expected to fail for device ${DEV} and slot ${SLT}" >&2
|
||||
fi
|
||||
diff --git a/src/pins/tang/meson.build b/src/pins/tang/meson.build
|
||||
index 74a3442..9b9a3db 100644
|
||||
--- a/src/pins/tang/meson.build
|
||||
+++ b/src/pins/tang/meson.build
|
||||
@@ -9,12 +9,6 @@ kgen = find_program(
|
||||
'/usr/lib/x86_64-linux-gnu/tangd-keygen',
|
||||
required: false
|
||||
)
|
||||
-updt = find_program(
|
||||
- join_paths(libexecdir, 'tangd-update'),
|
||||
- '/usr/libexec/tangd-update',
|
||||
- '/usr/lib/x86_64-linux-gnu/tangd-update',
|
||||
- required: false
|
||||
-)
|
||||
tang = find_program(
|
||||
join_paths(libexecdir, 'tangd'),
|
||||
'/usr/libexec/tangd',
|
||||
@@ -28,7 +22,7 @@ if curl.found()
|
||||
bins += join_paths(meson.current_source_dir(), 'clevis-encrypt-tang')
|
||||
mans += join_paths(meson.current_source_dir(), 'clevis-encrypt-tang.1')
|
||||
|
||||
- if actv.found() and kgen.found() and updt.found() and tang.found()
|
||||
+ if actv.found() and kgen.found() and tang.found()
|
||||
env = environment()
|
||||
env.set('SD_ACTIVATE', actv.path())
|
||||
env.append('PATH',
|
||||
diff --git a/src/pins/tang/pin-tang b/src/pins/tang/pin-tang
|
||||
index 1720d3d..8190f3d 100755
|
||||
--- a/src/pins/tang/pin-tang
|
||||
+++ b/src/pins/tang/pin-tang
|
||||
@@ -31,18 +31,23 @@ mkdir -p "$TMP"/db
|
||||
mkdir -p "$TMP"/cache
|
||||
|
||||
# Generate the server keys
|
||||
+KEYS="$TMP"/db
|
||||
tangd-keygen "$TMP"/db sig exc
|
||||
-tangd-update "$TMP"/db "$TMP"/cache
|
||||
+if which tangd-update; then
|
||||
+ tangd-update "$TMP"/db "$TMP"/cache
|
||||
+ KEYS=$TMP/cache
|
||||
+fi
|
||||
|
||||
# Start the server
|
||||
port="$(shuf -i 1024-65536 -n 1)"
|
||||
-$SD_ACTIVATE --inetd -l 127.0.0.1:$port -a tangd "$TMP"/cache &
|
||||
+$SD_ACTIVATE --inetd -l 127.0.0.1:$port -a tangd "$KEYS" &
|
||||
PID=$!
|
||||
sleep 0.25
|
||||
|
||||
thp="$(jose jwk thp -i "$TMP/db/sig.jwk")"
|
||||
-adv="$TMP/cache/default.jws"
|
||||
url="http://localhost:${port}"
|
||||
+adv="$TMP/adv"
|
||||
+curl "$url/adv" -o $adv
|
||||
|
||||
cfg="$(printf '{"url":"%s","adv":"%s"}' "$url" "$adv")"
|
||||
enc="$(echo -n "hi" | clevis encrypt tang "$cfg")"
|
||||
--
|
||||
2.18.4
|
||||
|
732
SOURCES/0002-Fix-clevis-luks-unlock-and-add-related-tests.patch
Normal file
732
SOURCES/0002-Fix-clevis-luks-unlock-and-add-related-tests.patch
Normal file
@ -0,0 +1,732 @@
|
||||
From e5f6d87d5c71f3faf0c0dbe38534fd3eab30f43e Mon Sep 17 00:00:00 2001
|
||||
From: Sergio Correia <scorreia@redhat.com>
|
||||
Date: Wed, 13 May 2020 23:51:04 -0300
|
||||
Subject: [PATCH 2/8] Fix clevis luks unlock and add related tests
|
||||
|
||||
---
|
||||
src/luks/clevis-luks-common-functions | 35 ++++++
|
||||
src/luks/clevis-luks-unlock | 68 ++++++++++++
|
||||
src/luks/clevis-luks-unlock.in | 130 ----------------------
|
||||
src/luks/meson.build | 10 +-
|
||||
src/luks/tests/meson.build | 40 +++++++
|
||||
src/luks/tests/tests-common-functions.in | 134 +++++++++++++++++++++--
|
||||
src/luks/tests/unlock-tang-luks1 | 83 ++++++++++++++
|
||||
src/luks/tests/unlock-tang-luks2 | 83 ++++++++++++++
|
||||
8 files changed, 439 insertions(+), 144 deletions(-)
|
||||
create mode 100755 src/luks/clevis-luks-unlock
|
||||
delete mode 100755 src/luks/clevis-luks-unlock.in
|
||||
create mode 100755 src/luks/tests/unlock-tang-luks1
|
||||
create mode 100755 src/luks/tests/unlock-tang-luks2
|
||||
|
||||
diff --git a/src/luks/clevis-luks-common-functions b/src/luks/clevis-luks-common-functions
|
||||
index e27c444..d04fdb5 100644
|
||||
--- a/src/luks/clevis-luks-common-functions
|
||||
+++ b/src/luks/clevis-luks-common-functions
|
||||
@@ -281,3 +281,38 @@ clevis_luks_read_pins_from_slot() {
|
||||
fi
|
||||
printf "%s: %s\n" "${SLOT}" "${cfg}"
|
||||
}
|
||||
+
|
||||
+# clevis_luks_unlock_device() does the unlock of the device passed as
|
||||
+# parameter and returns the decoded passphrase.
|
||||
+clevis_luks_unlock_device() {
|
||||
+ local DEV="${1}"
|
||||
+ [ -z "${DEV}" ] && return 1
|
||||
+
|
||||
+ local used_slots
|
||||
+ if ! used_slots=$(clevis_luks_used_slots "${DEV}") \
|
||||
+ || [ -z "${used_slots}" ]; then
|
||||
+ return 1
|
||||
+ fi
|
||||
+
|
||||
+ local slt jwe passphrase
|
||||
+ for slt in ${used_slots}; do
|
||||
+ if ! jwe="$(clevis_luks_read_slot "${DEV}" "${slt}" 2>/dev/null)" \
|
||||
+ || [ -z "${jwe}" ]; then
|
||||
+ continue
|
||||
+ fi
|
||||
+
|
||||
+ if ! passphrase="$(clevis decrypt < <(echo -n "${jwe}"))" \
|
||||
+ || [ -z "${passphrase}" ]; then
|
||||
+ continue
|
||||
+ fi
|
||||
+
|
||||
+ if ! cryptsetup luksOpen --test-passphrase "${DEV}" \
|
||||
+ --key-file <(echo -n "${passphrase}"); then
|
||||
+ continue
|
||||
+ fi
|
||||
+ echo -n "${passphrase}"
|
||||
+ return 0
|
||||
+ done
|
||||
+
|
||||
+ return 1
|
||||
+}
|
||||
diff --git a/src/luks/clevis-luks-unlock b/src/luks/clevis-luks-unlock
|
||||
new file mode 100755
|
||||
index 0000000..580fde8
|
||||
--- /dev/null
|
||||
+++ b/src/luks/clevis-luks-unlock
|
||||
@@ -0,0 +1,68 @@
|
||||
+#!/bin/bash -e
|
||||
+# vim: set tabstop=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80:
|
||||
+#
|
||||
+# Copyright (c) 2016 Red Hat, Inc.
|
||||
+# Author: Nathaniel McCallum <npmccallum@redhat.com>
|
||||
+#
|
||||
+# This program is free software: you can redistribute it and/or modify
|
||||
+# it under the terms of the GNU General Public License as published by
|
||||
+# the Free Software Foundation, either version 3 of the License, or
|
||||
+# (at your option) any later version.
|
||||
+#
|
||||
+# This program is distributed in the hope that it will be useful,
|
||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+# GNU General Public License for more details.
|
||||
+#
|
||||
+# You should have received a copy of the GNU General Public License
|
||||
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
+#
|
||||
+. clevis-luks-common-functions
|
||||
+
|
||||
+SUMMARY="Unlocks a LUKS volume"
|
||||
+
|
||||
+function usage() {
|
||||
+ exec >&2
|
||||
+ echo
|
||||
+ echo "Usage: clevis luks unlock -d DEV [-n NAME]"
|
||||
+ echo
|
||||
+ echo "$SUMMARY":
|
||||
+ echo
|
||||
+ echo " -d DEV The LUKS device on which to perform unlocking"
|
||||
+ echo
|
||||
+ echo " -n NAME The name of the unlocked device node"
|
||||
+ echo
|
||||
+ exit 2
|
||||
+}
|
||||
+
|
||||
+if [ $# -eq 1 ] && [ "$1" == "--summary" ]; then
|
||||
+ echo "$SUMMARY"
|
||||
+ exit 0
|
||||
+fi
|
||||
+
|
||||
+while getopts ":d:n:" o; do
|
||||
+ case "$o" in
|
||||
+ d) DEV="$OPTARG";;
|
||||
+ n) NAME="$OPTARG";;
|
||||
+ *) usage;;
|
||||
+ esac
|
||||
+done
|
||||
+
|
||||
+if [ -z "$DEV" ]; then
|
||||
+ echo "Did not specify a device!" >&2
|
||||
+ usage
|
||||
+fi
|
||||
+
|
||||
+if ! cryptsetup isLuks "$DEV"; then
|
||||
+ echo "$DEV is not a LUKS device!" >&2
|
||||
+ exit 1
|
||||
+fi
|
||||
+
|
||||
+NAME="${NAME:-luks-"$(cryptsetup luksUUID "$DEV")"}"
|
||||
+
|
||||
+if ! pt=$(clevis_luks_unlock_device "${DEV}"); then
|
||||
+ echo "${DEV} could not be opened." >&2
|
||||
+ exit 1
|
||||
+fi
|
||||
+
|
||||
+cryptsetup open -d- "${DEV}" "${NAME}" < <(echo -n "${pt}")
|
||||
diff --git a/src/luks/clevis-luks-unlock.in b/src/luks/clevis-luks-unlock.in
|
||||
deleted file mode 100755
|
||||
index aa3134b..0000000
|
||||
--- a/src/luks/clevis-luks-unlock.in
|
||||
+++ /dev/null
|
||||
@@ -1,130 +0,0 @@
|
||||
-#!/bin/bash -e
|
||||
-# vim: set tabstop=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80:
|
||||
-#
|
||||
-# Copyright (c) 2016 Red Hat, Inc.
|
||||
-# Author: Nathaniel McCallum <npmccallum@redhat.com>
|
||||
-#
|
||||
-# This program is free software: you can redistribute it and/or modify
|
||||
-# it under the terms of the GNU General Public License as published by
|
||||
-# the Free Software Foundation, either version 3 of the License, or
|
||||
-# (at your option) any later version.
|
||||
-#
|
||||
-# This program is distributed in the hope that it will be useful,
|
||||
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
-# GNU General Public License for more details.
|
||||
-#
|
||||
-# You should have received a copy of the GNU General Public License
|
||||
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
-#
|
||||
-
|
||||
-SUMMARY="Unlocks a LUKS volume"
|
||||
-UUID=cb6e8904-81ff-40da-a84a-07ab9ab5715e
|
||||
-
|
||||
-# We require cryptsetup >= 2.0.4 to fully support LUKSv2.
|
||||
-# Support is determined at build time.
|
||||
-function luks2_supported() {
|
||||
- return @OLD_CRYPTSETUP@
|
||||
-}
|
||||
-
|
||||
-function usage() {
|
||||
- exec >&2
|
||||
- echo
|
||||
- echo "Usage: clevis luks unlock -d DEV [-n NAME]"
|
||||
- echo
|
||||
- echo "$SUMMARY":
|
||||
- echo
|
||||
- echo " -d DEV The LUKS device on which to perform unlocking"
|
||||
- echo
|
||||
- echo " -n NAME The name of the unlocked device node"
|
||||
- echo
|
||||
- exit 2
|
||||
-}
|
||||
-
|
||||
-if [ $# -eq 1 ] && [ "$1" == "--summary" ]; then
|
||||
- echo "$SUMMARY"
|
||||
- exit 0
|
||||
-fi
|
||||
-
|
||||
-while getopts ":d:n:" o; do
|
||||
- case "$o" in
|
||||
- d) DEV="$OPTARG";;
|
||||
- n) NAME="$OPTARG";;
|
||||
- *) usage;;
|
||||
- esac
|
||||
-done
|
||||
-
|
||||
-if [ -z "$DEV" ]; then
|
||||
- echo "Did not specify a device!" >&2
|
||||
- usage
|
||||
-fi
|
||||
-
|
||||
-if ! cryptsetup isLuks "$DEV"; then
|
||||
- echo "$DEV is not a LUKS device!" >&2
|
||||
- exit 1
|
||||
-fi
|
||||
-
|
||||
-if luks2_supported; then
|
||||
- if cryptsetup isLuks --type luks1 "$DEV"; then
|
||||
- luks_type="luks1"
|
||||
- elif cryptsetup isLuks --type luks2 "$DEV";then
|
||||
- luks_type="luks2"
|
||||
- else
|
||||
- echo "$DEV is not a supported LUKS device!" >&2
|
||||
- exit 1
|
||||
- fi
|
||||
-else
|
||||
- luks_type="luks1"
|
||||
-fi
|
||||
-NAME="${NAME:-luks-"$(cryptsetup luksUUID "$DEV")"}"
|
||||
-
|
||||
-luks1_decrypt() {
|
||||
- luksmeta load "$@" \
|
||||
- | clevis decrypt
|
||||
-
|
||||
- local rc
|
||||
- for rc in "${PIPESTATUS[@]}"; do
|
||||
- [ $rc -eq 0 ] || return $rc
|
||||
- done
|
||||
- return 0
|
||||
-}
|
||||
-
|
||||
-luks2_decrypt() {
|
||||
- # jose jwe fmt -c outputs extra \n, so clean it up
|
||||
- cryptsetup token export "$@" \
|
||||
- | jose fmt -j- -Og jwe -o- \
|
||||
- | jose jwe fmt -i- -c \
|
||||
- | tr -d '\n' \
|
||||
- | clevis decrypt
|
||||
-
|
||||
- local rc
|
||||
- for rc in "${PIPESTATUS[@]}"; do
|
||||
- [ $rc -eq 0 ] || return $rc
|
||||
- done
|
||||
- return 0
|
||||
-}
|
||||
-
|
||||
-if [ "$luks_type" == "luks1" ]; then
|
||||
- while read -r slot state uuid; do
|
||||
- [ "$state" == "active" ] || continue
|
||||
- [ "$uuid" == "$UUID" ] || continue
|
||||
-
|
||||
- pt="$(luks1_decrypt -d $DEV -s $slot -u $UUID)" \
|
||||
- || continue
|
||||
- exec cryptsetup open -d- "$DEV" "$NAME" < <(
|
||||
- echo -n "$pt"
|
||||
- )
|
||||
- done < <(luksmeta show -d "$DEV")
|
||||
-
|
||||
-elif [ "$luks_type" == "luks2" ]; then
|
||||
- while read -r id; do
|
||||
- pt="$(luks2_decrypt --token-id "$id" "$DEV")" \
|
||||
- || continue
|
||||
- exec cryptsetup open -d- "$DEV" "$NAME" < <(
|
||||
- echo -n "$pt"
|
||||
- )
|
||||
- done < <(cryptsetup luksDump "$DEV" | sed -rn 's|^\s+([0-9]+): clevis|\1|p')
|
||||
-fi
|
||||
-
|
||||
-echo "$DEV could not be opened." >&2
|
||||
-exit 1
|
||||
diff --git a/src/luks/meson.build b/src/luks/meson.build
|
||||
index bbba63f..0d24f8d 100644
|
||||
--- a/src/luks/meson.build
|
||||
+++ b/src/luks/meson.build
|
||||
@@ -21,9 +21,7 @@ clevis_luks_bind = configure_file(input: 'clevis-luks-bind.in',
|
||||
clevis_luks_unbind = configure_file(input: 'clevis-luks-unbind.in',
|
||||
output: 'clevis-luks-unbind',
|
||||
configuration: luksmeta_data)
|
||||
-clevis_luks_unlock = configure_file(input: 'clevis-luks-unlock.in',
|
||||
- output: 'clevis-luks-unlock',
|
||||
- configuration: luksmeta_data)
|
||||
+
|
||||
if libcryptsetup.found() and luksmeta.found() and pwmake.found()
|
||||
subdir('systemd')
|
||||
subdir('udisks2')
|
||||
@@ -31,18 +29,18 @@ if libcryptsetup.found() and luksmeta.found() and pwmake.found()
|
||||
bins += clevis_luks_unbind
|
||||
mans += join_paths(meson.current_source_dir(), 'clevis-luks-unbind.1')
|
||||
|
||||
- bins += clevis_luks_unlock
|
||||
- mans += join_paths(meson.current_source_dir(), 'clevis-luks-unlock.1')
|
||||
-
|
||||
bins += clevis_luks_bind
|
||||
mans += join_paths(meson.current_source_dir(), 'clevis-luks-bind.1')
|
||||
|
||||
mans += join_paths(meson.current_source_dir(), 'clevis-luks-unlockers.7')
|
||||
|
||||
bins += join_paths(meson.current_source_dir(), 'clevis-luks-common-functions')
|
||||
+
|
||||
bins += join_paths(meson.current_source_dir(), 'clevis-luks-list')
|
||||
mans += join_paths(meson.current_source_dir(), 'clevis-luks-list.1')
|
||||
|
||||
+ bins += join_paths(meson.current_source_dir(), 'clevis-luks-unlock')
|
||||
+ mans += join_paths(meson.current_source_dir(), 'clevis-luks-unlock.1')
|
||||
else
|
||||
warning('Will not install LUKS support due to missing dependencies!')
|
||||
endif
|
||||
diff --git a/src/luks/tests/meson.build b/src/luks/tests/meson.build
|
||||
index 2e0fb92..9a16b42 100644
|
||||
--- a/src/luks/tests/meson.build
|
||||
+++ b/src/luks/tests/meson.build
|
||||
@@ -1,6 +1,30 @@
|
||||
# We use jq for comparing the pin config in the clevis luks list tests.
|
||||
jq = find_program('jq', required: false)
|
||||
|
||||
+# we use systemd-socket-activate for running test tang servers.
|
||||
+actv = find_program(
|
||||
+ 'systemd-socket-activate',
|
||||
+ 'systemd-activate',
|
||||
+ required: false
|
||||
+)
|
||||
+
|
||||
+kgen = find_program(
|
||||
+ join_paths(libexecdir, 'tangd-keygen'),
|
||||
+ join_paths(get_option('prefix'), get_option('libdir'), 'tangd-keygen'),
|
||||
+ join_paths(get_option('prefix'), get_option('libexecdir'), 'tangd-keygen'),
|
||||
+ join_paths('/', 'usr', get_option('libdir'), 'tangd-keygen'),
|
||||
+ join_paths('/', 'usr', get_option('libexecdir'), 'tangd-keygen'),
|
||||
+ required: false
|
||||
+)
|
||||
+tang = find_program(
|
||||
+ join_paths(libexecdir, 'tangd'),
|
||||
+ join_paths(get_option('prefix'), get_option('libdir'), 'tangd'),
|
||||
+ join_paths(get_option('prefix'), get_option('libexecdir'), 'tangd'),
|
||||
+ join_paths('/', 'usr', get_option('libdir'), 'tangd'),
|
||||
+ join_paths('/', 'usr', get_option('libexecdir'), 'tangd'),
|
||||
+ required: false
|
||||
+)
|
||||
+
|
||||
common_functions = configure_file(input: 'tests-common-functions.in',
|
||||
output: 'tests-common-functions',
|
||||
configuration: luksmeta_data,
|
||||
@@ -24,6 +48,14 @@ env.prepend('PATH',
|
||||
separator: ':'
|
||||
)
|
||||
|
||||
+has_tang = false
|
||||
+if actv.found() and kgen.found() and tang.found()
|
||||
+ has_tang = true
|
||||
+ env.set('SD_ACTIVATE', actv.path())
|
||||
+ env.set('TANGD_KEYGEN', kgen.path())
|
||||
+ env.set('TANGD', tang.path())
|
||||
+endif
|
||||
+
|
||||
test('bind-wrong-pass-luks1', find_program('bind-wrong-pass-luks1'), env: env)
|
||||
test('bind-luks1', find_program('bind-luks1'), env: env)
|
||||
test('unbind-unbound-slot-luks1', find_program('unbind-unbound-slot-luks1'), env: env)
|
||||
@@ -42,6 +74,10 @@ else
|
||||
warning('Will not run "clevis luks list" tests due to missing jq dependency')
|
||||
endif
|
||||
|
||||
+if has_tang
|
||||
+ test('unlock-tang-luks1', find_program('unlock-tang-luks1'), env: env, timeout: 90)
|
||||
+endif
|
||||
+
|
||||
# LUKS2 tests go here, and they get included if we get support for it, based
|
||||
# on the cryptsetup version.
|
||||
# Binding LUKS2 takes longer, so timeout is increased for a few tests.
|
||||
@@ -56,4 +92,8 @@ if luksmeta_data.get('OLD_CRYPTSETUP') == '0'
|
||||
test('list-tang-luks2', find_program('list-tang-luks2'), env: env, timeout: 60)
|
||||
test('list-sss-tang-luks2', find_program('list-sss-tang-luks2'), env: env, timeout: 60)
|
||||
endif
|
||||
+
|
||||
+ if has_tang
|
||||
+ test('unlock-tang-luks2', find_program('unlock-tang-luks2'), env: env, timeout: 120)
|
||||
+ endif
|
||||
endif
|
||||
diff --git a/src/luks/tests/tests-common-functions.in b/src/luks/tests/tests-common-functions.in
|
||||
index 90420d1..7b3fdad 100755
|
||||
--- a/src/luks/tests/tests-common-functions.in
|
||||
+++ b/src/luks/tests/tests-common-functions.in
|
||||
@@ -56,7 +56,7 @@ new_device() {
|
||||
|
||||
# Some builders fail if the cryptsetup steps are not ran as root, so let's
|
||||
# skip the test now if not running as root.
|
||||
- if [ $(id -u) != 0 ]; then
|
||||
+ if [ "$(id -u)" != 0 ]; then
|
||||
skip_test "WARNING: You must be root to run this test; test skipped."
|
||||
fi
|
||||
|
||||
@@ -74,9 +74,9 @@ new_device() {
|
||||
return 0
|
||||
fi
|
||||
|
||||
- fallocate -l16M "${DEV}"
|
||||
- local extra_options='--pbkdf pbkdf2 --pbkdf-force-iterations 1000'
|
||||
- cryptsetup luksFormat --type "${LUKS}" ${extra_options} --batch-mode \
|
||||
+ fallocate -l64M "${DEV}"
|
||||
+ cryptsetup luksFormat --type "${LUKS}" --pbkdf pbkdf2 \
|
||||
+ --pbkdf-force-iterations 1000 --batch-mode \
|
||||
--force-password "${DEV}" <<< "${PASS}"
|
||||
# Caching the just-formatted device for possible reuse.
|
||||
cp -f "${DEV}" "${DEV_CACHED}"
|
||||
@@ -90,7 +90,7 @@ new_device_keyfile() {
|
||||
|
||||
# Some builders fail if the cryptsetup steps are not ran as root, so let's
|
||||
# skip the test now if not running as root.
|
||||
- if [ $(id -u) != 0 ]; then
|
||||
+ if [ "$(id -u)" != 0 ]; then
|
||||
skip_test "WARNING: You must be root to run this test; test skipped."
|
||||
fi
|
||||
|
||||
@@ -98,9 +98,9 @@ new_device_keyfile() {
|
||||
error "Invalid keyfile (${KEYFILE})."
|
||||
fi
|
||||
|
||||
- fallocate -l16M "${DEV}"
|
||||
- local extra_options='--pbkdf pbkdf2 --pbkdf-force-iterations 1000'
|
||||
- cryptsetup luksFormat --type "${LUKS}" ${extra_options} --batch-mode \
|
||||
+ fallocate -l64M "${DEV}"
|
||||
+ cryptsetup luksFormat --type "${LUKS}" --pbkdf pbkdf2 \
|
||||
+ --pbkdf-force-iterations 1000 --batch-mode \
|
||||
"${DEV}" "${KEYFILE}"
|
||||
}
|
||||
|
||||
@@ -112,4 +112,122 @@ pin_cfg_equal() {
|
||||
<(jq -S . < <(echo -n "${cfg2}"))
|
||||
}
|
||||
|
||||
+# Get a random port to be used with a test tang server.
|
||||
+get_random_port() {
|
||||
+ shuf -i 1024-65535 -n 1
|
||||
+}
|
||||
+
|
||||
+# Removes tang rotated keys from the test server.
|
||||
+tang_remove_rotated_keys() {
|
||||
+ local basedir="${1}"
|
||||
+
|
||||
+ if [ -z "${basedir}" ]; then
|
||||
+ echo "Please pass a valid base directory for tang"
|
||||
+ return 1
|
||||
+ fi
|
||||
+
|
||||
+ local db="${basedir}/db"
|
||||
+ mkdir -p "${db}"
|
||||
+
|
||||
+ pushd "${db}"
|
||||
+ find . -name ".*.jwk" -exec rm -f {} \;
|
||||
+ popd
|
||||
+}
|
||||
+
|
||||
+# Creates new keys for the test tang server.
|
||||
+tang_new_keys() {
|
||||
+ local basedir="${1}"
|
||||
+ local rotate="${2}"
|
||||
+
|
||||
+ if [ -z "${basedir}" ]; then
|
||||
+ echo "Please pass a valid base directory for tang"
|
||||
+ return 1
|
||||
+ fi
|
||||
+
|
||||
+ [ -z "${TANGD_KEYGEN}" ] && skip_test "WARNING: TANGD_KEYGEN is not defined."
|
||||
+
|
||||
+ local db="${basedir}/db"
|
||||
+ mkdir -p "${db}"
|
||||
+
|
||||
+ if [ -n "${rotate}" ]; then
|
||||
+ pushd "${db}"
|
||||
+ local k
|
||||
+ k=$(find . -name "*.jwk" | wc -l)
|
||||
+ if [ "${k}" -gt 0 ]; then
|
||||
+ for k in *.jwk; do
|
||||
+ mv -f -- "${k}" ".${k}"
|
||||
+ done
|
||||
+ fi
|
||||
+ popd
|
||||
+ fi
|
||||
+
|
||||
+ "${TANGD_KEYGEN}" "${db}"
|
||||
+
|
||||
+ return 0
|
||||
+}
|
||||
+
|
||||
+# Start a test tang server.
|
||||
+tang_run() {
|
||||
+ local basedir="${1}"
|
||||
+ local port="${2}"
|
||||
+
|
||||
+ if [ -z "${basedir}" ]; then
|
||||
+ echo "Please pass a valid base directory for tang" >&2
|
||||
+ return 1
|
||||
+ fi
|
||||
+
|
||||
+ if [ -z "${port}" ]; then
|
||||
+ echo "Please pass a valid port for tang" >&2
|
||||
+ return 1
|
||||
+ fi
|
||||
+
|
||||
+ if ! tang_new_keys "${basedir}"; then
|
||||
+ echo "Error creating new keys for tang server" >&2
|
||||
+ return 1
|
||||
+ fi
|
||||
+
|
||||
+ local KEYS="${basedir}/db"
|
||||
+
|
||||
+ local inetd='--inetd'
|
||||
+ [ "${SD_ACTIVATE##*/}" = "systemd-activate" ] && inetd=
|
||||
+
|
||||
+ local pid pidfile
|
||||
+ pidfile="${basedir}/tang.pid"
|
||||
+
|
||||
+ "${SD_ACTIVATE}" ${inetd} -l "${TANG_HOST}":"${port}" \
|
||||
+ -a "${TANGD}" "${KEYS}" &
|
||||
+ pid=$!
|
||||
+ echo "${pid}" > "${pidfile}"
|
||||
+}
|
||||
+
|
||||
+# Stop tang server.
|
||||
+tang_stop() {
|
||||
+ local basedir="${1}"
|
||||
+ local pidfile="${basedir}/tang.pid"
|
||||
+ [ -f "${pidfile}" ] || return 0
|
||||
+
|
||||
+ local pid
|
||||
+ pid=$(<"${pidfile}")
|
||||
+ kill "${pid}"
|
||||
+}
|
||||
+
|
||||
+# Wait for the tang server to be operational.
|
||||
+tang_wait_until_ready() {
|
||||
+ local port="${1}"
|
||||
+ while ! curl --output /dev/null --silent --fail \
|
||||
+ http://"${TANG_HOST}":"${port}"/adv; do
|
||||
+ sleep 0.1
|
||||
+ echo -n . >&2
|
||||
+ done
|
||||
+}
|
||||
+
|
||||
+# Get tang advertisement.
|
||||
+tang_get_adv() {
|
||||
+ local port="${1}"
|
||||
+ local adv="${2}"
|
||||
+
|
||||
+ curl -o "${adv}" http://"${TANG_HOST}":"${port}"/adv
|
||||
+}
|
||||
+
|
||||
+export TANG_HOST=127.0.0.1
|
||||
export DEFAULT_PASS='just-some-test-password-here'
|
||||
diff --git a/src/luks/tests/unlock-tang-luks1 b/src/luks/tests/unlock-tang-luks1
|
||||
new file mode 100755
|
||||
index 0000000..841ba01
|
||||
--- /dev/null
|
||||
+++ b/src/luks/tests/unlock-tang-luks1
|
||||
@@ -0,0 +1,83 @@
|
||||
+#!/bin/bash -ex
|
||||
+# vim: set ts=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80:
|
||||
+#
|
||||
+# Copyright (c) 2020 Red Hat, Inc.
|
||||
+# Author: Sergio Correia <scorreia@redhat.com>
|
||||
+#
|
||||
+# This program is free software: you can redistribute it and/or modify
|
||||
+# it under the terms of the GNU General Public License as published by
|
||||
+# the Free Software Foundation, either version 3 of the License, or
|
||||
+# (at your option) any later version.
|
||||
+#
|
||||
+# This program is distributed in the hope that it will be useful,
|
||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+# GNU General Public License for more details.
|
||||
+#
|
||||
+# You should have received a copy of the GNU General Public License
|
||||
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
+
|
||||
+TEST=$(basename "${0}")
|
||||
+. tests-common-functions
|
||||
+
|
||||
+. clevis-luks-common-functions
|
||||
+
|
||||
+on_exit() {
|
||||
+ [ ! -d "${TMP}" ] && return 0
|
||||
+ tang_stop "${TMP}"
|
||||
+ rm -rf "${TMP}"
|
||||
+}
|
||||
+
|
||||
+trap 'on_exit' EXIT
|
||||
+trap 'on_exit' ERR
|
||||
+
|
||||
+TMP="$(mktemp -d)"
|
||||
+
|
||||
+port=$(get_random_port)
|
||||
+tang_run "${TMP}" "${port}" &
|
||||
+tang_wait_until_ready "${port}"
|
||||
+
|
||||
+url="http://${TANG_HOST}:${port}"
|
||||
+adv="${TMP}/adv"
|
||||
+tang_get_adv "${port}" "${adv}"
|
||||
+
|
||||
+cfg=$(printf '{"url":"%s","adv":"%s"}' "$url" "$adv")
|
||||
+
|
||||
+# LUKS1.
|
||||
+DEV="${TMP}/luks1-device"
|
||||
+new_device "luks1" "${DEV}"
|
||||
+
|
||||
+if ! clevis luks bind -f -d "${DEV}" tang "${cfg}" <<< "${DEFAULT_PASS}"; then
|
||||
+ error "${TEST}: Bind should have succeeded."
|
||||
+fi
|
||||
+
|
||||
+if ! clevis_luks_unlock_device "${DEV}"; then
|
||||
+ error "${TEST}: we were unable to unlock ${DEV}."
|
||||
+fi
|
||||
+
|
||||
+# Let's rotate the tang keys and add another binding with the new key.
|
||||
+tang_new_keys "${TMP}" "rotate-keys"
|
||||
+
|
||||
+# Unlock should still work now.
|
||||
+if ! clevis_luks_unlock_device "${DEV}"; then
|
||||
+ error "${TEST}: we should still be able to unlock ${DEV}"
|
||||
+fi
|
||||
+
|
||||
+# Now let's remove the rotated keys.
|
||||
+tang_remove_rotated_keys "${TMP}"
|
||||
+
|
||||
+# Unlock should not work anymore.
|
||||
+if clevis_luks_unlock_device "${DEV}"; then
|
||||
+ error "${TEST}: we should not be able to unlock ${DEV}"
|
||||
+fi
|
||||
+
|
||||
+# Now let's add another binding with the new keys.
|
||||
+tang_get_adv "${port}" "${adv}" # Updating the advertisement.
|
||||
+if ! clevis luks bind -f -d "${DEV}" tang "${cfg}" <<< "${DEFAULT_PASS}"; then
|
||||
+ error "${TEST}: Bind should have succeeded."
|
||||
+fi
|
||||
+
|
||||
+# Unlock should work again, using the new keys.
|
||||
+if ! clevis_luks_unlock_device "${DEV}"; then
|
||||
+ error "${TEST}: we should be able to unlock ${DEV} with the new keys"
|
||||
+fi
|
||||
diff --git a/src/luks/tests/unlock-tang-luks2 b/src/luks/tests/unlock-tang-luks2
|
||||
new file mode 100755
|
||||
index 0000000..81822fb
|
||||
--- /dev/null
|
||||
+++ b/src/luks/tests/unlock-tang-luks2
|
||||
@@ -0,0 +1,83 @@
|
||||
+#!/bin/bash -ex
|
||||
+# vim: set ts=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80:
|
||||
+#
|
||||
+# Copyright (c) 2020 Red Hat, Inc.
|
||||
+# Author: Sergio Correia <scorreia@redhat.com>
|
||||
+#
|
||||
+# This program is free software: you can redistribute it and/or modify
|
||||
+# it under the terms of the GNU General Public License as published by
|
||||
+# the Free Software Foundation, either version 3 of the License, or
|
||||
+# (at your option) any later version.
|
||||
+#
|
||||
+# This program is distributed in the hope that it will be useful,
|
||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+# GNU General Public License for more details.
|
||||
+#
|
||||
+# You should have received a copy of the GNU General Public License
|
||||
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
+
|
||||
+TEST=$(basename "${0}")
|
||||
+. tests-common-functions
|
||||
+
|
||||
+. clevis-luks-common-functions
|
||||
+
|
||||
+on_exit() {
|
||||
+ [ ! -d "${TMP}" ] && return 0
|
||||
+ tang_stop "${TMP}"
|
||||
+ rm -rf "${TMP}"
|
||||
+}
|
||||
+
|
||||
+trap 'on_exit' EXIT
|
||||
+trap 'on_exit' ERR
|
||||
+
|
||||
+TMP="$(mktemp -d)"
|
||||
+
|
||||
+port=$(get_random_port)
|
||||
+tang_run "${TMP}" "${port}" &
|
||||
+tang_wait_until_ready "${port}"
|
||||
+
|
||||
+url="http://${TANG_HOST}:${port}"
|
||||
+adv="${TMP}/adv"
|
||||
+tang_get_adv "${port}" "${adv}"
|
||||
+
|
||||
+cfg=$(printf '{"url":"%s","adv":"%s"}' "$url" "$adv")
|
||||
+
|
||||
+# LUKS2.
|
||||
+DEV="${TMP}/luks2-device"
|
||||
+new_device "luks2" "${DEV}"
|
||||
+
|
||||
+if ! clevis luks bind -f -d "${DEV}" tang "${cfg}" <<< "${DEFAULT_PASS}"; then
|
||||
+ error "${TEST}: Bind should have succeeded."
|
||||
+fi
|
||||
+
|
||||
+if ! clevis_luks_unlock_device "${DEV}"; then
|
||||
+ error "${TEST}: we were unable to unlock ${DEV}."
|
||||
+fi
|
||||
+
|
||||
+# Let's rotate the tang keys and add another binding with the new key.
|
||||
+tang_new_keys "${TMP}" "rotate-keys"
|
||||
+
|
||||
+# Unlock should still work now.
|
||||
+if ! clevis_luks_unlock_device "${DEV}"; then
|
||||
+ error "${TEST}: we should still be able to unlock ${DEV}"
|
||||
+fi
|
||||
+
|
||||
+# Now let's remove the rotated keys.
|
||||
+tang_remove_rotated_keys "${TMP}"
|
||||
+
|
||||
+# Unlock should not work anymore.
|
||||
+if clevis_luks_unlock_device "${DEV}"; then
|
||||
+ error "${TEST}: we should not be able to unlock ${DEV}"
|
||||
+fi
|
||||
+
|
||||
+# Now let's add another binding with the new keys.
|
||||
+tang_get_adv "${port}" "${adv}" # Updating the advertisement.
|
||||
+if ! clevis luks bind -f -d "${DEV}" tang "${cfg}" <<< "${DEFAULT_PASS}"; then
|
||||
+ error "${TEST}: Bind should have succeeded."
|
||||
+fi
|
||||
+
|
||||
+# Unlock should work again, using the new keys.
|
||||
+if ! clevis_luks_unlock_device "${DEV}"; then
|
||||
+ error "${TEST}: we should be able to unlock ${DEV} with the new keys"
|
||||
+fi
|
||||
--
|
||||
2.18.4
|
||||
|
@ -0,0 +1,57 @@
|
||||
From d393fbc256e22cc8019d18214e4d140d58f3302a Mon Sep 17 00:00:00 2001
|
||||
From: Sergio Correia <scorreia@redhat.com>
|
||||
Date: Wed, 13 May 2020 23:51:04 -0300
|
||||
Subject: [PATCH 3/8] Improve error message when bind is given an invalid PIN
|
||||
|
||||
---
|
||||
src/luks/clevis-luks-bind.in | 6 ++++++
|
||||
src/luks/clevis-luks-common-functions | 9 +++++++++
|
||||
2 files changed, 15 insertions(+)
|
||||
|
||||
diff --git a/src/luks/clevis-luks-bind.in b/src/luks/clevis-luks-bind.in
|
||||
index a5d3c5f..89a5e22 100755
|
||||
--- a/src/luks/clevis-luks-bind.in
|
||||
+++ b/src/luks/clevis-luks-bind.in
|
||||
@@ -19,6 +19,8 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
+. clevis-luks-common-functions
|
||||
+
|
||||
SUMMARY="Binds a LUKS device using the specified policy"
|
||||
UUID=cb6e8904-81ff-40da-a84a-07ab9ab5715e
|
||||
|
||||
@@ -76,6 +78,10 @@ fi
|
||||
if ! PIN="${@:$((OPTIND++)):1}" || [ -z "$PIN" ]; then
|
||||
echo "Did not specify a pin!" >&2
|
||||
usage
|
||||
+elif ! EXE=$(findexe clevis-encrypt-"${PIN}") \
|
||||
+ || [ -z "${EXE}" ]; then
|
||||
+ echo "'$PIN' is not a valid pin!" >&2
|
||||
+ usage
|
||||
fi
|
||||
|
||||
if ! CFG="${@:$((OPTIND++)):1}" || [ -z "$CFG" ]; then
|
||||
diff --git a/src/luks/clevis-luks-common-functions b/src/luks/clevis-luks-common-functions
|
||||
index d04fdb5..36f0bfd 100644
|
||||
--- a/src/luks/clevis-luks-common-functions
|
||||
+++ b/src/luks/clevis-luks-common-functions
|
||||
@@ -108,6 +108,15 @@ clevis_luks_read_slot() {
|
||||
echo "${DATA_CODED}"
|
||||
}
|
||||
|
||||
+# findexe() finds an executable.
|
||||
+findexe() {
|
||||
+ while read -r -d: path; do
|
||||
+ [ -f "${path}/${1}" ] && [ -x "${path}/${1}" ] && \
|
||||
+ echo "${path}/${1}" && return 0
|
||||
+ done <<< "${PATH}:"
|
||||
+ return 1
|
||||
+}
|
||||
+
|
||||
# clevis_luks_used_slots() will return the list of used slots for a given LUKS
|
||||
# device.
|
||||
clevis_luks_used_slots() {
|
||||
--
|
||||
2.18.4
|
||||
|
@ -0,0 +1,53 @@
|
||||
From fc0cc6f159857e463aacababdc0735b0972d103c Mon Sep 17 00:00:00 2001
|
||||
From: Sergio Correia <scorreia@redhat.com>
|
||||
Date: Wed, 13 May 2020 23:51:04 -0300
|
||||
Subject: [PATCH 4/8] Add rd.neednet=1 to cmdline only if there are devices
|
||||
bound to tang
|
||||
|
||||
---
|
||||
.../dracut/clevis-pin-tang/module-setup.sh.in | 21 +++++++++++++++++--
|
||||
1 file changed, 19 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/luks/systemd/dracut/clevis-pin-tang/module-setup.sh.in b/src/luks/systemd/dracut/clevis-pin-tang/module-setup.sh.in
|
||||
index 1bb2ead..a4984dc 100755
|
||||
--- a/src/luks/systemd/dracut/clevis-pin-tang/module-setup.sh.in
|
||||
+++ b/src/luks/systemd/dracut/clevis-pin-tang/module-setup.sh.in
|
||||
@@ -18,8 +18,23 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
+has_devices_bound_to_tang() {
|
||||
+ local dev
|
||||
+ for dev in $(lsblk -p -n -s -r \
|
||||
+ | awk '$6 == "crypt" { getline; print $1 }' | sort -u); do
|
||||
+ if clevis luks list -d "${dev}" 2>/dev/null | grep -q tang; then
|
||||
+ return 0
|
||||
+ fi
|
||||
+ done
|
||||
+ return 1
|
||||
+}
|
||||
+
|
||||
depends() {
|
||||
- echo clevis network
|
||||
+ local deps="clevis"
|
||||
+ if has_devices_bound_to_tang; then
|
||||
+ deps=$(printf "%s network" "${deps}")
|
||||
+ fi
|
||||
+ echo "${deps}"
|
||||
return 0
|
||||
}
|
||||
|
||||
@@ -28,7 +43,9 @@ cmdline() {
|
||||
}
|
||||
|
||||
install() {
|
||||
- cmdline > "${initdir}/etc/cmdline.d/99clevis-pin-tang.conf"
|
||||
+ if has_devices_bound_to_tang; then
|
||||
+ cmdline > "${initdir}/etc/cmdline.d/99clevis-pin-tang.conf"
|
||||
+ fi
|
||||
|
||||
inst_multiple \
|
||||
clevis-decrypt-tang \
|
||||
--
|
||||
2.18.4
|
||||
|
@ -1,7 +1,8 @@
|
||||
From 69556d143544a72f84e9daf25924e3ae5132ce1a Mon Sep 17 00:00:00 2001
|
||||
From e3641a7193adac1cea525c093f39679c2cfa22c9 Mon Sep 17 00:00:00 2001
|
||||
From: Sergio Correia <scorreia@redhat.com>
|
||||
Date: Sat, 30 Nov 2019 14:58:43 -0500
|
||||
Subject: [PATCH] Add the option to extract luks passphrase used for binding
|
||||
Date: Wed, 13 May 2020 23:53:38 -0300
|
||||
Subject: [PATCH 5/8] Add the option to extract luks passphrase used for
|
||||
binding
|
||||
|
||||
Usage:
|
||||
|
||||
@ -145,21 +146,21 @@ index 0000000..fa9526a
|
||||
+
|
||||
+link:clevis-luks-unlock.1.adoc[*clevis-luks-unlock*(1)],
|
||||
diff --git a/src/luks/meson.build b/src/luks/meson.build
|
||||
index 51d82fb..b2dd724 100644
|
||||
index 0d24f8d..fda2ca8 100644
|
||||
--- a/src/luks/meson.build
|
||||
+++ b/src/luks/meson.build
|
||||
@@ -23,6 +23,9 @@ if libcryptsetup.found() and luksmeta.found() and pwmake.found()
|
||||
bins += join_paths(meson.current_source_dir(), 'clevis-luks-list')
|
||||
mans += join_paths(meson.current_source_dir(), 'clevis-luks-list.1')
|
||||
@@ -41,6 +41,9 @@ if libcryptsetup.found() and luksmeta.found() and pwmake.found()
|
||||
|
||||
bins += join_paths(meson.current_source_dir(), 'clevis-luks-unlock')
|
||||
mans += join_paths(meson.current_source_dir(), 'clevis-luks-unlock.1')
|
||||
+
|
||||
+ bins += join_paths(meson.current_source_dir(), 'clevis-luks-pass')
|
||||
+ mans += join_paths(meson.current_source_dir(), 'clevis-luks-pass.1')
|
||||
+
|
||||
bins += join_paths(meson.current_source_dir(), 'clevis-luks-report')
|
||||
bins += join_paths(meson.current_source_dir(), 'clevis-luks-report-compare')
|
||||
bins += join_paths(meson.current_source_dir(), 'clevis-luks-report-decode')
|
||||
else
|
||||
warning('Will not install LUKS support due to missing dependencies!')
|
||||
endif
|
||||
diff --git a/src/luks/tests/meson.build b/src/luks/tests/meson.build
|
||||
index 6513eaa..248d2ea 100644
|
||||
index 9a16b42..4757c4b 100644
|
||||
--- a/src/luks/tests/meson.build
|
||||
+++ b/src/luks/tests/meson.build
|
||||
@@ -1,3 +1,9 @@
|
||||
@ -172,7 +173,7 @@ index 6513eaa..248d2ea 100644
|
||||
# We use jq for comparing the pin config in the clevis luks list tests.
|
||||
jq = find_program('jq', required: false)
|
||||
|
||||
@@ -15,8 +21,11 @@ env.prepend('PATH',
|
||||
@@ -45,8 +51,11 @@ env.prepend('PATH',
|
||||
join_paths(meson.build_root(), 'src', 'pins', 'sss'),
|
||||
join_paths(meson.build_root(), 'src', 'pins', 'tang'),
|
||||
join_paths(meson.build_root(), 'src', 'pins', 'tpm2'),
|
||||
@ -182,21 +183,22 @@ index 6513eaa..248d2ea 100644
|
||||
)
|
||||
+env.set('SD_ACTIVATE', actv.path())
|
||||
|
||||
if jq.found()
|
||||
test('list-recursive-luks1', find_program('list-recursive-luks1'), env: env)
|
||||
@@ -25,6 +34,7 @@ if jq.found()
|
||||
else
|
||||
warning('Will not run "clevis luks list" tests due to missing jq dependency')
|
||||
has_tang = false
|
||||
if actv.found() and kgen.found() and tang.found()
|
||||
@@ -77,6 +86,7 @@ endif
|
||||
if has_tang
|
||||
test('unlock-tang-luks1', find_program('unlock-tang-luks1'), env: env, timeout: 90)
|
||||
endif
|
||||
+test('pass-tang-luks1', find_program('pass-tang-luks1'), env: env)
|
||||
|
||||
# LUKS2 tests go here, and they get included if we get support for it, based
|
||||
# on the cryptsetup version.
|
||||
@@ -34,3 +44,4 @@ if jq.found()
|
||||
test('list-tang-luks2', find_program('list-tang-luks2'), env: env, timeout: 60)
|
||||
test('list-sss-tang-luks2', find_program('list-sss-tang-luks2'), env: env, timeout: 60)
|
||||
@@ -96,4 +106,5 @@ if luksmeta_data.get('OLD_CRYPTSETUP') == '0'
|
||||
if has_tang
|
||||
test('unlock-tang-luks2', find_program('unlock-tang-luks2'), env: env, timeout: 120)
|
||||
endif
|
||||
+ test('pass-tang-luks2', find_program('pass-tang-luks2'), env: env, timeout: 60)
|
||||
endif
|
||||
+test('pass-tang-luks2', find_program('pass-tang-luks2'), env: env, timeout: 60)
|
||||
diff --git a/src/luks/tests/pass-tang-luks1 b/src/luks/tests/pass-tang-luks1
|
||||
new file mode 100755
|
||||
index 0000000..05cdb3e
|
||||
@ -360,5 +362,5 @@ index 0000000..9123aa0
|
||||
+! wait "${PID}"
|
||||
+unset PID
|
||||
--
|
||||
2.18.1
|
||||
2.18.4
|
||||
|
@ -1,50 +1,83 @@
|
||||
From 5536f15b9235cb6ae1b79a5ad1d96a8ea97b3113 Mon Sep 17 00:00:00 2001
|
||||
From 158bdeda3ca961b0e615c8adfc58b61e1a1ba5c7 Mon Sep 17 00:00:00 2001
|
||||
From: Sergio Correia <scorreia@redhat.com>
|
||||
Date: Wed, 29 Jan 2020 06:29:32 -0500
|
||||
Subject: [PATCH] Improve clevis luks regen; no unbind in every case
|
||||
Date: Wed, 13 May 2020 23:55:41 -0300
|
||||
Subject: [PATCH 6/8] Add clevis luks regen command
|
||||
|
||||
When updating the metadata -- likely due to a tang key rotation --,
|
||||
clevis will not do unbind + bind in every case.
|
||||
The clevis luks regen command regenerates the LUKS binding for a given
|
||||
device/slot, using the same configuration of the existing binding.
|
||||
|
||||
Now we have 2 cases to be handled:
|
||||
1) we have the key for the slot being rotated; in this case, the
|
||||
rotation happens in-place
|
||||
Example:
|
||||
|
||||
2) we don't have the key for the slot being rotated; in this case,
|
||||
we have to re-add the keyslot with updated info.
|
||||
clevis luks list -d /dev/sda1
|
||||
1: tang '{"url":"http://tang.server"}'
|
||||
2: tpm2 '{"hash":"sha256","key":"ecc"}'
|
||||
|
||||
Added also mechanisms for backup + restore of the LUKS header/slots,
|
||||
so that we can revert back to the original state if clevis luks regen
|
||||
fails.
|
||||
To rotate the binding in slot 1, we can use the following:
|
||||
clevis luks regen -d /dev/sda1 -s 1
|
||||
|
||||
The new binding will use the existing configuration, namely:
|
||||
'{"url":"http://tang.server"}', with the `tang' pin.
|
||||
---
|
||||
src/luks/clevis-luks-common-functions | 202 ++++++++++++++++++++++
|
||||
src/luks/clevis-luks-pass | 5 +-
|
||||
src/luks/clevis-luks-regen | 223 ++++++++++++-------------
|
||||
src/luks/tests/backup-restore-luks1 | 114 +++++++++++++
|
||||
src/luks/tests/backup-restore-luks2 | 115 +++++++++++++
|
||||
src/luks/tests/meson.build | 7 +
|
||||
src/luks/tests/regen-inplace-luks1 | 98 +++++++++++
|
||||
src/luks/tests/regen-inplace-luks2 | 99 +++++++++++
|
||||
src/luks/tests/regen-not-inplace-luks1 | 95 +++++++++++
|
||||
src/luks/tests/regen-not-inplace-luks2 | 96 +++++++++++
|
||||
src/luks/tests/tests-common-functions | 27 ++-
|
||||
11 files changed, 966 insertions(+), 115 deletions(-)
|
||||
src/luks/clevis-luks-common-functions | 230 +++++++++++++++++++++++
|
||||
src/luks/clevis-luks-pass | 5 +-
|
||||
src/luks/clevis-luks-regen | 185 ++++++++++++++++++
|
||||
src/luks/clevis-luks-regen.1.adoc | 48 +++++
|
||||
src/luks/meson.build | 3 +
|
||||
src/luks/tests/backup-restore-luks1 | 114 +++++++++++
|
||||
src/luks/tests/backup-restore-luks2 | 115 ++++++++++++
|
||||
src/luks/tests/meson.build | 6 +
|
||||
src/luks/tests/meson.build.orig | 110 +++++++++++
|
||||
src/luks/tests/regen-inplace-luks1 | 98 ++++++++++
|
||||
src/luks/tests/regen-inplace-luks2 | 99 ++++++++++
|
||||
src/luks/tests/regen-not-inplace-luks1 | 95 ++++++++++
|
||||
src/luks/tests/regen-not-inplace-luks2 | 96 ++++++++++
|
||||
src/luks/tests/tests-common-functions.in | 26 +++
|
||||
14 files changed, 1228 insertions(+), 2 deletions(-)
|
||||
create mode 100755 src/luks/clevis-luks-regen
|
||||
create mode 100644 src/luks/clevis-luks-regen.1.adoc
|
||||
create mode 100755 src/luks/tests/backup-restore-luks1
|
||||
create mode 100755 src/luks/tests/backup-restore-luks2
|
||||
create mode 100644 src/luks/tests/meson.build.orig
|
||||
create mode 100755 src/luks/tests/regen-inplace-luks1
|
||||
create mode 100755 src/luks/tests/regen-inplace-luks2
|
||||
create mode 100755 src/luks/tests/regen-not-inplace-luks1
|
||||
create mode 100755 src/luks/tests/regen-not-inplace-luks2
|
||||
|
||||
diff --git a/src/luks/clevis-luks-common-functions b/src/luks/clevis-luks-common-functions
|
||||
index 9ba1812..2a1af26 100644
|
||||
index 36f0bfd..5b515ad 100644
|
||||
--- a/src/luks/clevis-luks-common-functions
|
||||
+++ b/src/luks/clevis-luks-common-functions
|
||||
@@ -314,3 +314,205 @@ clevis_luks_read_pins_from_slot() {
|
||||
fi
|
||||
printf "%s: %s\n" "${SLOT}" "${cfg}"
|
||||
@@ -325,3 +325,233 @@ clevis_luks_unlock_device() {
|
||||
|
||||
return 1
|
||||
}
|
||||
+
|
||||
+# Generate a key with the same entropy as the LUKS master key of a given
|
||||
+# device.
|
||||
+generate_key() {
|
||||
+ local DEV="${1}"
|
||||
+
|
||||
+ if [ -z "${DEV}" ]; then
|
||||
+ echo "Please, specify a device." >&2
|
||||
+ return 1
|
||||
+ fi
|
||||
+
|
||||
+ local dump
|
||||
+ local filter
|
||||
+ dump=$(cryptsetup luksDump "${DEV}")
|
||||
+ if cryptsetup isLuks --type luks1 "${DEV}"; then
|
||||
+ filter=$(sed -rn 's|MK bits:[ \t]*([0-9]+)|\1|p' <<< "${dump}")
|
||||
+ elif cryptsetup isLuks --type luks2 "${DEV}"; then
|
||||
+ filter=$(sed -rn 's|^\s+Key:\s+([0-9]+) bits\s*$|\1|p' <<< "${dump}")
|
||||
+ else
|
||||
+ echo "${DEV} is not a supported LUKS device!" >&2
|
||||
+ return 1
|
||||
+ fi
|
||||
+ local bits
|
||||
+ bits=$(sort -n <<< "${filter}" | tail -n 1)
|
||||
+ pwmake "${bits}"
|
||||
+}
|
||||
+
|
||||
+# clevis_luks1_save_slot() works with LUKS1 devices and it saves a given JWE
|
||||
+# to a specific device and slot. The last parameter indicates whether we
|
||||
+# should overwrite existing metadata.
|
||||
@ -197,7 +230,8 @@ index 9ba1812..2a1af26 100644
|
||||
+ [ -z "${DEV}" ] && return 1
|
||||
+ [ -z "${TMP}" ] && return 1
|
||||
+
|
||||
+ local HDR="${TMP}/$(basename "${DEV}").header"
|
||||
+ local HDR
|
||||
+ HDR="${TMP}/$(basename "${DEV}").header"
|
||||
+ if ! cryptsetup luksHeaderBackup "${DEV}" --batch-mode \
|
||||
+ --header-backup-file "${HDR}"; then
|
||||
+ echo "Error backing up LUKS header from ${DEV}" >&2
|
||||
@ -224,7 +258,8 @@ index 9ba1812..2a1af26 100644
|
||||
+ [ -z "${DEV}" ] && return 1
|
||||
+ [ -z "${TMP}" ] && return 1
|
||||
+
|
||||
+ local HDR="${TMP}/$(basename "${DEV}").header"
|
||||
+ local HDR
|
||||
+ HDR="${TMP}/$(basename "${DEV}").header"
|
||||
+ if [ ! -e "${HDR}" ]; then
|
||||
+ echo "LUKS header backup does not exist" >&2
|
||||
+ return 1
|
||||
@ -262,30 +297,42 @@ index 1ce8c4c..d31bc17 100755
|
||||
fi
|
||||
+echo -n "${passphrase}"
|
||||
diff --git a/src/luks/clevis-luks-regen b/src/luks/clevis-luks-regen
|
||||
index 9535ba3..44fd673 100755
|
||||
--- a/src/luks/clevis-luks-regen
|
||||
new file mode 100755
|
||||
index 0000000..44fd673
|
||||
--- /dev/null
|
||||
+++ b/src/luks/clevis-luks-regen
|
||||
@@ -1,8 +1,9 @@
|
||||
-#!/usr/bin/env bash
|
||||
@@ -0,0 +1,185 @@
|
||||
+#!/usr/bin/bash
|
||||
# vim: set tabstop=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80:
|
||||
#
|
||||
# Copyright (c) 2018 Red Hat, Inc.
|
||||
# Author: Radovan Sroka <rsroka@redhat.com>
|
||||
+# vim: set tabstop=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80:
|
||||
+#
|
||||
+# Copyright (c) 2018 Red Hat, Inc.
|
||||
+# Author: Radovan Sroka <rsroka@redhat.com>
|
||||
+# Author: Sergio Correia <scorreia@redhat.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
@@ -28,19 +29,27 @@ if [ "$1" == "--summary" ]; then
|
||||
fi
|
||||
|
||||
function usage_and_exit () {
|
||||
- echo >&2
|
||||
- echo "Usage: clevis luks regen -d DEV -s SLOT" >&2
|
||||
- echo >&2
|
||||
- echo "$SUMMARY" >&2
|
||||
- echo >&2
|
||||
- exit "$1"
|
||||
+#
|
||||
+# This program is free software: you can redistribute it and/or modify
|
||||
+# it under the terms of the GNU General Public License as published by
|
||||
+# the Free Software Foundation, either version 3 of the License, or
|
||||
+# (at your option) any later version.
|
||||
+#
|
||||
+# This program is distributed in the hope that it will be useful,
|
||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+# GNU General Public License for more details.
|
||||
+#
|
||||
+# You should have received a copy of the GNU General Public License
|
||||
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
+#
|
||||
+
|
||||
+. clevis-luks-common-functions
|
||||
+
|
||||
+SUMMARY="Regenerate LUKS metadata"
|
||||
+
|
||||
+if [ "$1" == "--summary" ]; then
|
||||
+ echo "$SUMMARY"
|
||||
+ exit 0
|
||||
+fi
|
||||
+
|
||||
+function usage_and_exit () {
|
||||
+ exec >&2
|
||||
+ echo "Usage: clevis luks regen -d DEV -s SLOT"
|
||||
+ echo
|
||||
@ -296,11 +343,8 @@ index 9535ba3..44fd673 100755
|
||||
+ echo " -s SLT The LUKS slot to use"
|
||||
+ echo
|
||||
+ exit "${1}"
|
||||
}
|
||||
|
||||
-if [ "$#" -ne "4" ]; then
|
||||
- usage_and_exit 1
|
||||
-fi
|
||||
+}
|
||||
+
|
||||
+on_exit() {
|
||||
+ if [ ! -d "${TMP}" ] || ! rm -rf "${TMP}"; then
|
||||
+ echo "Delete temporary files failed!" >&2
|
||||
@ -308,142 +352,49 @@ index 9535ba3..44fd673 100755
|
||||
+ exit 1
|
||||
+ fi
|
||||
+}
|
||||
|
||||
-while getopts "hd:s:" o; do
|
||||
+
|
||||
+while getopts ":hfd:s:" o; do
|
||||
case "$o" in
|
||||
d) DEV="$OPTARG";;
|
||||
h) usage_and_exit 0;;
|
||||
@@ -49,88 +58,6 @@ while getopts "hd:s:" o; do
|
||||
esac
|
||||
done
|
||||
|
||||
-function decode_luks_header () {
|
||||
- if DATA_CODED="$(jose jwe fmt -i- <<< "$1")"; then
|
||||
- DATA_CODED="$(jose fmt -j- -g protected -u- <<< "$DATA_CODED")"
|
||||
- DATA_DECODED="$(jose b64 dec -i- <<< "$DATA_CODED")"
|
||||
- else
|
||||
- echo "Error decoding JWE protected header!" >&2
|
||||
- exit 1
|
||||
- fi
|
||||
-
|
||||
- echo "$DATA_DECODED"
|
||||
-}
|
||||
-
|
||||
-function generate_cfg () {
|
||||
- echo -n "{"
|
||||
- DATA="$(decode_luks_header "$1")"
|
||||
-
|
||||
- if ! P="$(jose fmt -j- -g clevis -g pin -u- <<< "$DATA")" || [ -z "$P" ]; then
|
||||
- echo "Pin wasn't found in LUKS metadata!" >&2
|
||||
- exit 1
|
||||
- fi
|
||||
-
|
||||
- if ! CONTENT="$(jose fmt -j- -g clevis -g "$P" -o- <<< "$DATA")" || [ -z "$CONTENT" ]; then
|
||||
- echo "Content was not found!" >&2
|
||||
- fi
|
||||
-
|
||||
- # echo -n "\"$P\": ["
|
||||
-
|
||||
- if [ "$P" = "tang" ] || [ "$P" = "http" ]; then
|
||||
- URL="$(jose fmt -j- -g url -u- <<< "$CONTENT")"
|
||||
- echo -n "\"url\":\"$URL\""
|
||||
- elif [ "$P" = "sss" ]; then
|
||||
- THRESHOLD="$(jose fmt -j- -g t -o- <<< "$CONTENT")"
|
||||
- if [ -n "$THRESHOLD" ]; then
|
||||
- echo -n "\"t\":$THRESHOLD,"
|
||||
- fi
|
||||
-
|
||||
- echo -n "\"pins\":{"
|
||||
-
|
||||
- CNT=0
|
||||
- PREV=""
|
||||
- while ITEM="$(jose fmt -j- -g jwe -g"$CNT" -u- <<< "$CONTENT")"; do
|
||||
- if [ -z "$ITEM" ]; then
|
||||
- CNT=$(( CNT + 1 ))
|
||||
- continue # in some cases it can be empty string
|
||||
- fi
|
||||
-
|
||||
- DD="$(decode_luks_header "$ITEM")"
|
||||
-
|
||||
- if ! PP="$(jose fmt -j- -g clevis -g pin -u- <<< "$DD")" || [ -z "$PP" ]; then
|
||||
- echo "Pin wasn't found in LUKS metadata!" >&2
|
||||
- exit 1
|
||||
- fi
|
||||
-
|
||||
- if [ "$CNT" -eq 0 ]; then
|
||||
- PREV="$PP"
|
||||
- echo -n "\"$PP\":["
|
||||
- echo -n "$(generate_cfg "$ITEM")"
|
||||
- else
|
||||
- if ! [ "$PREV" = "$PP" ]; then
|
||||
- echo -n "],\"$PP\":["
|
||||
- echo -n "$(generate_cfg "$ITEM")"
|
||||
- else
|
||||
- echo -n ",$(generate_cfg "$ITEM")"
|
||||
- fi
|
||||
- fi
|
||||
-
|
||||
- PREV="$PP"
|
||||
- CNT=$(( CNT + 1 ))
|
||||
- done
|
||||
-
|
||||
- echo -n "]}"
|
||||
-
|
||||
- else
|
||||
- echo "Unknown pin $P!" >&2
|
||||
- exit 1
|
||||
- fi
|
||||
-
|
||||
- echo -n "}"
|
||||
-}
|
||||
-
|
||||
-### get luks metadata
|
||||
-
|
||||
if [ -z "$DEV" ]; then
|
||||
echo "Did not specify a device!" >&2
|
||||
exit 1
|
||||
@@ -141,23 +68,14 @@ if [ -z "$SLT" ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
-if ! OLD_LUKS_CODED="$(clevis_luks_read_slot "$DEV" "$SLT")"; then
|
||||
- echo "Error reading metadata from LUKS device!" >&2
|
||||
- exit 1
|
||||
-fi
|
||||
-
|
||||
### ----------------------------------------------------------------------
|
||||
-
|
||||
-DECODED="$(decode_luks_header "$OLD_LUKS_CODED")"
|
||||
-
|
||||
-if ! PIN="$(jose fmt -j- -g clevis -g pin -u- <<< "$DECODED")" || [ -z "$PIN" ]; then
|
||||
- echo "Pin wasn't found in LUKS metadata!" >&2
|
||||
+ case "$o" in
|
||||
+ d) DEV="$OPTARG";;
|
||||
+ h) usage_and_exit 0;;
|
||||
+ s) SLT="$OPTARG";;
|
||||
+ *) usage_and_exit 1;;
|
||||
+ esac
|
||||
+done
|
||||
+
|
||||
+if [ -z "$DEV" ]; then
|
||||
+ echo "Did not specify a device!" >&2
|
||||
+ exit 1
|
||||
+fi
|
||||
+
|
||||
+if [ -z "$SLT" ]; then
|
||||
+ echo "Did not specify a slot!" >&2
|
||||
+ exit 1
|
||||
+fi
|
||||
+
|
||||
+### ----------------------------------------------------------------------
|
||||
+if ! pin_cfg=$(clevis luks list -d "${DEV}" -s "${SLT}" 2>/dev/null); then
|
||||
+ echo "Error obtaining current configuration of device ${DEV}:${SLT}" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
-CFG="$(generate_cfg "$OLD_LUKS_CODED")"
|
||||
-
|
||||
-### ----------------------------------------------------------------------
|
||||
+ exit 1
|
||||
+fi
|
||||
+
|
||||
+PIN=$(echo "${pin_cfg}" | awk '{ print $2 }')
|
||||
+CFG=$(echo "${pin_cfg}" | awk '{ print $3 }' | tr -d "'")
|
||||
|
||||
echo "Regenerating with:"
|
||||
echo "PIN: $PIN"
|
||||
@@ -166,20 +84,101 @@ echo "CONFIG: $CFG"
|
||||
trap 'echo "Ignoring CONTROL-C!"' INT TERM
|
||||
|
||||
# Get the existing key.
|
||||
-read -r -s -p "Enter existing LUKS password: " existing_key; echo
|
||||
+
|
||||
+echo "Regenerating with:"
|
||||
+echo "PIN: $PIN"
|
||||
+echo "CONFIG: $CFG"
|
||||
+
|
||||
+trap 'echo "Ignoring CONTROL-C!"' INT TERM
|
||||
+
|
||||
+# Get the existing key.
|
||||
+if ! existing_key=$(clevis luks pass -d "${DEV}" -s "${SLT}" 2>/dev/null); then
|
||||
+ # We failed to obtain the passphrase for the slot -- perhaps
|
||||
+ # it was rotated? --, so let's request user input.
|
||||
+ read -r -s -p "Enter existing LUKS password: " existing_key; echo
|
||||
+fi
|
||||
|
||||
# Check if the key is valid.
|
||||
-if ! cryptsetup luksOpen --test-passphrase "${DEV}" <<< "${existing_key}"; then
|
||||
+
|
||||
+# Check if the key is valid.
|
||||
+if ! cryptsetup open --test-passphrase "${DEV}" <<< "${existing_key}"; then
|
||||
+ exit 1
|
||||
+fi
|
||||
@ -480,11 +431,9 @@ index 9535ba3..44fd673 100755
|
||||
+# Backup LUKS header.
|
||||
+if ! clevis_luks_backup_dev "${DEV}" "${TMP}"; then
|
||||
+ echo "Error while trying to back up LUKS header from ${DEV}" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
-if ! clevis luks unbind -d "${DEV}" -s "${SLT}" -f; then
|
||||
- echo "Error during unbind of rotated key from slot:$SLT in $DEV" >&2
|
||||
+ exit 1
|
||||
+fi
|
||||
+
|
||||
+restore_device() {
|
||||
+ local DEV="${1}"
|
||||
+ local TMP="${2}"
|
||||
@ -525,20 +474,87 @@ index 9535ba3..44fd673 100755
|
||||
+if ! clevis_luks_save_slot "${DEV}" "${SLT}" "${jwe}" "overwrite"; then
|
||||
+ echo "Error updating metadata in ${DEV}:${SLT}" >&2
|
||||
+ restore_device "${DEV}" "${TMP}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
-if ! clevis luks bind -d "${DEV}" -s "${SLT}" "${PIN}" "${CFG}" -k - <<< "${existing_key}"; then
|
||||
- echo "Error during bind of new key from slot:$SLT in $DEV" >&2
|
||||
+ exit 1
|
||||
+fi
|
||||
+
|
||||
+# Now make sure that we can unlock this device after the change.
|
||||
+# If we can't, undo the changes.
|
||||
+if ! cryptsetup open --test-passphrase --key-slot "${SLT}" "${DEV}" 2>/dev/null \
|
||||
+ <<< $(clevis luks pass -d "${DEV}" -s "${SLT}" 2>/dev/null); then
|
||||
+ echo "Invalid configuration detected after rebinding. Reverting changes."
|
||||
+ restore_device "${DEV}" "${TMP}"
|
||||
exit 1
|
||||
fi
|
||||
+ exit 1
|
||||
+fi
|
||||
+
|
||||
+echo "Keys were succesfully rotated."
|
||||
diff --git a/src/luks/clevis-luks-regen.1.adoc b/src/luks/clevis-luks-regen.1.adoc
|
||||
new file mode 100644
|
||||
index 0000000..763fa1e
|
||||
--- /dev/null
|
||||
+++ b/src/luks/clevis-luks-regen.1.adoc
|
||||
@@ -0,0 +1,48 @@
|
||||
+CLEVIS-LUKS-REGEN(1)
|
||||
+=====================
|
||||
+:doctype: manpage
|
||||
+
|
||||
+
|
||||
+== NAME
|
||||
+
|
||||
+clevis-luks-regen - Regenerates LUKS binding
|
||||
+
|
||||
+== SYNOPSIS
|
||||
+
|
||||
+*clevis luks regen* -d DEV -s SLT
|
||||
+
|
||||
+== OVERVIEW
|
||||
+
|
||||
+The *clevis luks regen* command regenerates the LUKS binding for a given slot in a LUKS device, using the same configuration of the
|
||||
+existing binding. Its operation can be compared to performing *clevis luks unbind* and *clevis luks bind* for rebinding said slot and device.
|
||||
+This is useful when rotating keys.
|
||||
+
|
||||
+== OPTIONS
|
||||
+
|
||||
+* *-d* _DEV_ :
|
||||
+ The bound LUKS device
|
||||
+
|
||||
+* *-s* _SLT_ :
|
||||
+ The slot or key slot number for rebinding. Note that it requires that such slot is currently bound by clevis.
|
||||
+
|
||||
+== EXAMPLE
|
||||
+
|
||||
+ Let's start by using clevis luks list to see the current binding configuration in /dev/sda1:
|
||||
+
|
||||
+ # clevis luks list -d /dev/sda1
|
||||
+ 1: tang '{"url":"http://tang.server"}'
|
||||
+ 2: tpm2 '{"hash":"sha256","key":"ecc"}'
|
||||
+
|
||||
+ We see that slot 1 in /dev/sda1 has a tang binding with the following configuration:
|
||||
+ '{"url":"http://tang.server"}'
|
||||
+
|
||||
+ Now let's do the rebinding of slot 1:
|
||||
+ # clevis luks regen -d /dev/sda1 -s 1
|
||||
+
|
||||
+ After a successful operation, we will have the new binding using the same configuration that was already in place.
|
||||
+
|
||||
+== SEE ALSO
|
||||
+
|
||||
+link:clevis-luks-list.1.adoc[*clevis-luks-list*(1)]
|
||||
+link:clevis-luks-bind.1.adoc[*clevis-luks-bind*(1)]
|
||||
+link:clevis-luks-unbind.1.adoc[*clevis-luks-unbind*(1)]
|
||||
diff --git a/src/luks/meson.build b/src/luks/meson.build
|
||||
index fda2ca8..f21388d 100644
|
||||
--- a/src/luks/meson.build
|
||||
+++ b/src/luks/meson.build
|
||||
@@ -44,6 +44,9 @@ if libcryptsetup.found() and luksmeta.found() and pwmake.found()
|
||||
|
||||
bins += join_paths(meson.current_source_dir(), 'clevis-luks-pass')
|
||||
mans += join_paths(meson.current_source_dir(), 'clevis-luks-pass.1')
|
||||
+
|
||||
+ bins += join_paths(meson.current_source_dir(), 'clevis-luks-regen')
|
||||
+ mans += join_paths(meson.current_source_dir(), 'clevis-luks-regen.1')
|
||||
else
|
||||
warning('Will not install LUKS support due to missing dependencies!')
|
||||
endif
|
||||
diff --git a/src/luks/tests/backup-restore-luks1 b/src/luks/tests/backup-restore-luks1
|
||||
new file mode 100755
|
||||
index 0000000..733a4b6
|
||||
@ -781,11 +797,11 @@ index 0000000..a3b8608
|
||||
+! wait "${PID}"
|
||||
+unset PID
|
||||
diff --git a/src/luks/tests/meson.build b/src/luks/tests/meson.build
|
||||
index 248d2ea..4e0a6cb 100644
|
||||
index 4757c4b..dbef9bf 100644
|
||||
--- a/src/luks/tests/meson.build
|
||||
+++ b/src/luks/tests/meson.build
|
||||
@@ -35,6 +35,9 @@ else
|
||||
warning('Will not run "clevis luks list" tests due to missing jq dependency')
|
||||
@@ -87,6 +87,9 @@ if has_tang
|
||||
test('unlock-tang-luks1', find_program('unlock-tang-luks1'), env: env, timeout: 90)
|
||||
endif
|
||||
test('pass-tang-luks1', find_program('pass-tang-luks1'), env: env)
|
||||
+test('backup-restore-luks1', find_program('backup-restore-luks1'), env: env)
|
||||
@ -794,14 +810,130 @@ index 248d2ea..4e0a6cb 100644
|
||||
|
||||
# LUKS2 tests go here, and they get included if we get support for it, based
|
||||
# on the cryptsetup version.
|
||||
@@ -45,3 +48,7 @@ if jq.found()
|
||||
test('list-sss-tang-luks2', find_program('list-sss-tang-luks2'), env: env, timeout: 60)
|
||||
@@ -107,4 +110,7 @@ if luksmeta_data.get('OLD_CRYPTSETUP') == '0'
|
||||
test('unlock-tang-luks2', find_program('unlock-tang-luks2'), env: env, timeout: 120)
|
||||
endif
|
||||
test('pass-tang-luks2', find_program('pass-tang-luks2'), env: env, timeout: 60)
|
||||
+ test('backup-restore-luks2', find_program('backup-restore-luks2'), env:env, timeout: 90)
|
||||
+ test('regen-inplace-luks2', find_program('regen-inplace-luks2'), env: env, timeout: 90)
|
||||
+ test('regen-not-inplace-luks2', find_program('regen-not-inplace-luks2'), env: env, timeout: 90)
|
||||
endif
|
||||
test('pass-tang-luks2', find_program('pass-tang-luks2'), env: env, timeout: 60)
|
||||
+test('backup-restore-luks2', find_program('backup-restore-luks2'), env:env, timeout: 90)
|
||||
+test('regen-inplace-luks2', find_program('regen-inplace-luks2'), env: env, timeout: 90)
|
||||
+test('regen-not-inplace-luks2', find_program('regen-not-inplace-luks2'), env: env, timeout: 90)
|
||||
diff --git a/src/luks/tests/meson.build.orig b/src/luks/tests/meson.build.orig
|
||||
new file mode 100644
|
||||
index 0000000..4757c4b
|
||||
--- /dev/null
|
||||
+++ b/src/luks/tests/meson.build.orig
|
||||
@@ -0,0 +1,110 @@
|
||||
+actv = find_program(
|
||||
+ 'systemd-socket-activate',
|
||||
+ 'systemd-activate',
|
||||
+ required: false
|
||||
+)
|
||||
+
|
||||
+# We use jq for comparing the pin config in the clevis luks list tests.
|
||||
+jq = find_program('jq', required: false)
|
||||
+
|
||||
+# we use systemd-socket-activate for running test tang servers.
|
||||
+actv = find_program(
|
||||
+ 'systemd-socket-activate',
|
||||
+ 'systemd-activate',
|
||||
+ required: false
|
||||
+)
|
||||
+
|
||||
+kgen = find_program(
|
||||
+ join_paths(libexecdir, 'tangd-keygen'),
|
||||
+ join_paths(get_option('prefix'), get_option('libdir'), 'tangd-keygen'),
|
||||
+ join_paths(get_option('prefix'), get_option('libexecdir'), 'tangd-keygen'),
|
||||
+ join_paths('/', 'usr', get_option('libdir'), 'tangd-keygen'),
|
||||
+ join_paths('/', 'usr', get_option('libexecdir'), 'tangd-keygen'),
|
||||
+ required: false
|
||||
+)
|
||||
+tang = find_program(
|
||||
+ join_paths(libexecdir, 'tangd'),
|
||||
+ join_paths(get_option('prefix'), get_option('libdir'), 'tangd'),
|
||||
+ join_paths(get_option('prefix'), get_option('libexecdir'), 'tangd'),
|
||||
+ join_paths('/', 'usr', get_option('libdir'), 'tangd'),
|
||||
+ join_paths('/', 'usr', get_option('libexecdir'), 'tangd'),
|
||||
+ required: false
|
||||
+)
|
||||
+
|
||||
+common_functions = configure_file(input: 'tests-common-functions.in',
|
||||
+ output: 'tests-common-functions',
|
||||
+ configuration: luksmeta_data,
|
||||
+ install: false
|
||||
+)
|
||||
+
|
||||
+env = environment()
|
||||
+env.prepend('PATH',
|
||||
+ join_paths(meson.source_root(), 'src'),
|
||||
+ join_paths(meson.source_root(), 'src', 'luks'),
|
||||
+ join_paths(meson.source_root(), 'src', 'pins', 'sss'),
|
||||
+ join_paths(meson.source_root(), 'src', 'pins', 'tang'),
|
||||
+ join_paths(meson.source_root(), 'src', 'pins', 'tpm2'),
|
||||
+ meson.current_source_dir(),
|
||||
+ meson.current_build_dir(),
|
||||
+ join_paths(meson.build_root(), 'src'),
|
||||
+ join_paths(meson.build_root(), 'src', 'luks'),
|
||||
+ join_paths(meson.build_root(), 'src', 'pins', 'sss'),
|
||||
+ join_paths(meson.build_root(), 'src', 'pins', 'tang'),
|
||||
+ join_paths(meson.build_root(), 'src', 'pins', 'tpm2'),
|
||||
+ libexecdir,
|
||||
+ '/usr/libexec',
|
||||
+ separator: ':'
|
||||
+)
|
||||
+env.set('SD_ACTIVATE', actv.path())
|
||||
+
|
||||
+has_tang = false
|
||||
+if actv.found() and kgen.found() and tang.found()
|
||||
+ has_tang = true
|
||||
+ env.set('SD_ACTIVATE', actv.path())
|
||||
+ env.set('TANGD_KEYGEN', kgen.path())
|
||||
+ env.set('TANGD', tang.path())
|
||||
+endif
|
||||
+
|
||||
+test('bind-wrong-pass-luks1', find_program('bind-wrong-pass-luks1'), env: env)
|
||||
+test('bind-luks1', find_program('bind-luks1'), env: env)
|
||||
+test('unbind-unbound-slot-luks1', find_program('unbind-unbound-slot-luks1'), env: env)
|
||||
+test('unbind-luks1', find_program('unbind-luks1'), env: env)
|
||||
+test('bind-key-file-non-interactive', find_program('bind-key-file-non-interactive-luks1'), env: env)
|
||||
+test('bind-pass-with-newline', find_program('bind-pass-with-newline-luks1'), env: env)
|
||||
+test('bind-pass-with-newline-keyfile', find_program('bind-pass-with-newline-keyfile-luks1'), env: env)
|
||||
+# Bug #70.
|
||||
+test('bind-already-used-luksmeta-slot', find_program('bind-already-used-luksmeta-slot'), env: env, timeout: 60)
|
||||
+
|
||||
+if jq.found()
|
||||
+ test('list-recursive-luks1', find_program('list-recursive-luks1'), env: env)
|
||||
+ test('list-tang-luks1', find_program('list-tang-luks1'), env: env)
|
||||
+ test('list-sss-tang-luks1', find_program('list-sss-tang-luks1'), env: env)
|
||||
+else
|
||||
+ warning('Will not run "clevis luks list" tests due to missing jq dependency')
|
||||
+endif
|
||||
+
|
||||
+if has_tang
|
||||
+ test('unlock-tang-luks1', find_program('unlock-tang-luks1'), env: env, timeout: 90)
|
||||
+endif
|
||||
+test('pass-tang-luks1', find_program('pass-tang-luks1'), env: env)
|
||||
+
|
||||
+# LUKS2 tests go here, and they get included if we get support for it, based
|
||||
+# on the cryptsetup version.
|
||||
+# Binding LUKS2 takes longer, so timeout is increased for a few tests.
|
||||
+if luksmeta_data.get('OLD_CRYPTSETUP') == '0'
|
||||
+ test('bind-wrong-pass-luks2', find_program('bind-wrong-pass-luks2'), env: env)
|
||||
+ test('bind-luks2', find_program('bind-luks2'), env: env, timeout: 60)
|
||||
+ test('unbind-unbound-slot-luks2', find_program('unbind-unbound-slot-luks2'), env: env)
|
||||
+ test('unbind-luks2', find_program('unbind-luks2'), env: env, timeout: 60)
|
||||
+
|
||||
+ if jq.found()
|
||||
+ test('list-recursive-luks2', find_program('list-recursive-luks2'), env: env, timeout: 60)
|
||||
+ test('list-tang-luks2', find_program('list-tang-luks2'), env: env, timeout: 60)
|
||||
+ test('list-sss-tang-luks2', find_program('list-sss-tang-luks2'), env: env, timeout: 60)
|
||||
+ endif
|
||||
+
|
||||
+ if has_tang
|
||||
+ test('unlock-tang-luks2', find_program('unlock-tang-luks2'), env: env, timeout: 120)
|
||||
+ endif
|
||||
+ test('pass-tang-luks2', find_program('pass-tang-luks2'), env: env, timeout: 60)
|
||||
+endif
|
||||
diff --git a/src/luks/tests/regen-inplace-luks1 b/src/luks/tests/regen-inplace-luks1
|
||||
new file mode 100755
|
||||
index 0000000..3a42ced
|
||||
@ -1214,23 +1346,15 @@ index 0000000..dc91449
|
||||
+kill -9 "${PID}"
|
||||
+! wait "${PID}"
|
||||
+unset PID
|
||||
diff --git a/src/luks/tests/tests-common-functions b/src/luks/tests/tests-common-functions
|
||||
index 7758876..1139f09 100644
|
||||
--- a/src/luks/tests/tests-common-functions
|
||||
+++ b/src/luks/tests/tests-common-functions
|
||||
@@ -63,7 +63,7 @@ new_device() {
|
||||
return 0
|
||||
fi
|
||||
|
||||
- fallocate -l16M "${DEV}"
|
||||
+ fallocate -l64M "${DEV}"
|
||||
local extra_options='--pbkdf pbkdf2 --pbkdf-force-iterations 1000'
|
||||
cryptsetup luksFormat --type "${LUKS}" ${extra_options} --batch-mode --force-password "${DEV}" <<< "${DEFAULT_PASS}"
|
||||
# Caching the just-formatted device for possible reuse.
|
||||
@@ -83,4 +83,29 @@ pin_cfg_equal() {
|
||||
<(jq -S . < <(echo -n "${cfg2}"))
|
||||
diff --git a/src/luks/tests/tests-common-functions.in b/src/luks/tests/tests-common-functions.in
|
||||
index 7b3fdad..6101f28 100755
|
||||
--- a/src/luks/tests/tests-common-functions.in
|
||||
+++ b/src/luks/tests/tests-common-functions.in
|
||||
@@ -229,5 +229,31 @@ tang_get_adv() {
|
||||
curl -o "${adv}" http://"${TANG_HOST}":"${port}"/adv
|
||||
}
|
||||
|
||||
+# Regenerate binding.
|
||||
+clevis_regen() {
|
||||
+ local DEV="${1}"
|
||||
+ local SLT="${2}"
|
||||
@ -1256,7 +1380,8 @@ index 7758876..1139f09 100644
|
||||
+ return "${ret}"
|
||||
+}
|
||||
+
|
||||
export TANG_HOST=127.0.0.1
|
||||
export DEFAULT_PASS='just-some-test-password-here'
|
||||
--
|
||||
2.18.2
|
||||
2.18.4
|
||||
|
@ -1,23 +1,17 @@
|
||||
From 70d3da5ce8d68e8ff258122592670eb70da0c839 Mon Sep 17 00:00:00 2001
|
||||
From a85f50f789d69d9ca0a4096a64ac912f5967f97f Mon Sep 17 00:00:00 2001
|
||||
From: Sergio Correia <scorreia@redhat.com>
|
||||
Date: Wed, 16 Oct 2019 09:14:58 -0300
|
||||
Subject: [PATCH 2/2] Add clevis luks report/regen
|
||||
Date: Sun, 10 May 2020 15:32:50 -0300
|
||||
Subject: [PATCH 7/8] Add clevis luks report
|
||||
|
||||
---
|
||||
src/luks/clevis-luks-common-functions | 143 ++++++++++++++++++++
|
||||
src/luks/clevis-luks-regen | 186 ++++++++++++++++++++++++++
|
||||
src/luks/clevis-luks-regen.1.adoc | 36 +++++
|
||||
src/luks/clevis-luks-report | 95 +++++++++++++
|
||||
src/luks/clevis-luks-report-compare | 71 ++++++++++
|
||||
src/luks/clevis-luks-report-decode | 59 ++++++++
|
||||
src/luks/clevis-luks-report-sss | 53 ++++++++
|
||||
src/luks/clevis-luks-report-tang | 67 ++++++++++
|
||||
src/luks/clevis-luks-report.1.adoc | 41 ++++++
|
||||
src/luks/meson.build | 12 ++
|
||||
10 files changed, 763 insertions(+)
|
||||
create mode 100644 src/luks/clevis-luks-common-functions
|
||||
create mode 100755 src/luks/clevis-luks-regen
|
||||
create mode 100644 src/luks/clevis-luks-regen.1.adoc
|
||||
src/luks/clevis-luks-report | 95 +++++++++++++++++++++++++++++
|
||||
src/luks/clevis-luks-report-compare | 71 +++++++++++++++++++++
|
||||
src/luks/clevis-luks-report-decode | 59 ++++++++++++++++++
|
||||
src/luks/clevis-luks-report-sss | 53 ++++++++++++++++
|
||||
src/luks/clevis-luks-report-tang | 67 ++++++++++++++++++++
|
||||
src/luks/clevis-luks-report.1.adoc | 41 +++++++++++++
|
||||
src/luks/meson.build | 7 +++
|
||||
7 files changed, 393 insertions(+)
|
||||
create mode 100755 src/luks/clevis-luks-report
|
||||
create mode 100755 src/luks/clevis-luks-report-compare
|
||||
create mode 100755 src/luks/clevis-luks-report-decode
|
||||
@ -25,389 +19,6 @@ Subject: [PATCH 2/2] Add clevis luks report/regen
|
||||
create mode 100755 src/luks/clevis-luks-report-tang
|
||||
create mode 100644 src/luks/clevis-luks-report.1.adoc
|
||||
|
||||
diff --git a/src/luks/clevis-luks-common-functions b/src/luks/clevis-luks-common-functions
|
||||
new file mode 100644
|
||||
index 0000000..d676253
|
||||
--- /dev/null
|
||||
+++ b/src/luks/clevis-luks-common-functions
|
||||
@@ -0,0 +1,143 @@
|
||||
+#!/bin/bash -e
|
||||
+# vim: set tabstop=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80:
|
||||
+#
|
||||
+# Copyright (c) 2019 Red Hat, Inc.
|
||||
+# Author: Sergio Correia <scorreia@redhat.com>
|
||||
+#
|
||||
+# This program is free software: you can redistribute it and/or modify
|
||||
+# it under the terms of the GNU General Public License as published by
|
||||
+# the Free Software Foundation, either version 3 of the License, or
|
||||
+# (at your option) any later version.
|
||||
+#
|
||||
+# This program is distributed in the hope that it will be useful,
|
||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+# GNU General Public License for more details.
|
||||
+#
|
||||
+# You should have received a copy of the GNU General Public License
|
||||
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
+#
|
||||
+
|
||||
+# valid_slot() will check whether a given slot is possibly valid, i.e., if it
|
||||
+# is a numeric value within the specified range.
|
||||
+valid_slot() {
|
||||
+ local SLT="${1}"
|
||||
+ local MAX_SLOTS="${2}"
|
||||
+ case "${SLT}" in
|
||||
+ ''|*[!0-9]*)
|
||||
+ return 1
|
||||
+ ;;
|
||||
+ *)
|
||||
+ # We got an integer, now let's make sure it is within the
|
||||
+ # supported range.
|
||||
+ if [ "${SLT}" -ge "${MAX_SLOTS}" ]; then
|
||||
+ return 1
|
||||
+ fi
|
||||
+ ;;
|
||||
+ esac
|
||||
+}
|
||||
+
|
||||
+# clevis_luks_read_slot() will read a particular slot of a given device, which
|
||||
+# should be either LUKS1 or LUKS2. Returns 1 in case of failure; 0 in case of
|
||||
+# success.
|
||||
+clevis_luks_read_slot() {
|
||||
+ local DEV="${1}"
|
||||
+ local SLT="${2}"
|
||||
+
|
||||
+ if [ -z "${DEV}" ] || [ -z "${SLT}" ]; then
|
||||
+ echo "Need both a device and a slot as arguments." >&2
|
||||
+ return 1
|
||||
+ fi
|
||||
+
|
||||
+ local DATA_CODED=''
|
||||
+ local MAX_LUKS1_SLOTS=8
|
||||
+ local MAX_LUKS2_SLOTS=32
|
||||
+ if cryptsetup isLuks --type luks1 "${DEV}"; then
|
||||
+ if ! valid_slot "${SLT}" "${MAX_LUKS1_SLOTS}"; then
|
||||
+ echo "Please, provide a valid key slot number; 0-7 for LUKS1" >&2
|
||||
+ return 1
|
||||
+ fi
|
||||
+
|
||||
+ if ! luksmeta test -d "${DEV}"; then
|
||||
+ echo "The ${DEV} device is not valid!" >&2
|
||||
+ return 1
|
||||
+ fi
|
||||
+
|
||||
+ local uuid
|
||||
+ # Pattern from luksmeta: active slot uuid.
|
||||
+ read -r _ _ uuid <<< "$(luksmeta show -d "${DEV}" | grep "^${SLT} *")"
|
||||
+
|
||||
+ if [ "${uuid}" = "empty" ]; then
|
||||
+ echo "The LUKSMeta slot ${SLT} on device ${DEV} is already empty." >&2
|
||||
+ return 1
|
||||
+ fi
|
||||
+
|
||||
+ if ! DATA_CODED="$(luksmeta load -d "${DEV}" -s "${SLT}")"; then
|
||||
+ echo "Cannot load data from ${DEV} slot:${SLT}!" >&2
|
||||
+ return 1
|
||||
+ fi
|
||||
+ elif cryptsetup isLuks --type luks2 "${DEV}"; then
|
||||
+ if ! valid_slot "${SLT}" "${MAX_LUKS2_SLOTS}"; then
|
||||
+ echo "Please, provide a valid key slot number; 0-31 for LUKS2" >&2
|
||||
+ return 1
|
||||
+ fi
|
||||
+
|
||||
+ local token_id
|
||||
+ token_id=$(cryptsetup luksDump "${DEV}" \
|
||||
+ | grep -E -B1 "^\s+Keyslot:\s+${SLT}$" \
|
||||
+ | head -n 1 | sed -rn 's|^\s+([0-9]+): clevis|\1|p')
|
||||
+ if [ -z "${token_id}" ]; then
|
||||
+ echo "Cannot load data from ${DEV} slot:${SLT}. No token found!" >&2
|
||||
+ return 1
|
||||
+ fi
|
||||
+
|
||||
+ local token
|
||||
+ token=$(cryptsetup token export --token-id "${token_id}" "${DEV}")
|
||||
+ DATA_CODED=$(jose fmt -j- -Og jwe -o- <<< "${token}" \
|
||||
+ | jose jwe fmt -i- -c)
|
||||
+
|
||||
+ if [ -z "${DATA_CODED}" ]; then
|
||||
+ echo "Cannot load data from ${DEV} slot:${SLT}!" >&2
|
||||
+ return 1
|
||||
+ fi
|
||||
+ else
|
||||
+ echo "${DEV} is not a supported LUKS device!" >&2
|
||||
+ return 1
|
||||
+ fi
|
||||
+ echo "${DATA_CODED}"
|
||||
+}
|
||||
+
|
||||
+# Generate a key with the same entropy as the LUKS Master key of a given
|
||||
+# device.
|
||||
+generate_key() {
|
||||
+ local DEV="${1}"
|
||||
+
|
||||
+ if [ -z "${DEV}" ]; then
|
||||
+ echo "Please, specify a device." >&2
|
||||
+ return 1
|
||||
+ fi
|
||||
+
|
||||
+ local dump
|
||||
+ local filter
|
||||
+ dump=$(cryptsetup luksDump "${DEV}")
|
||||
+ if cryptsetup isLuks --type luks1 "${DEV}"; then
|
||||
+ filter=$(sed -rn 's|MK bits:[ \t]*([0-9]+)|\1|p' <<< "${dump}")
|
||||
+ elif cryptsetup isLuks --type luks2 "${DEV}"; then
|
||||
+ filter=$(sed -rn 's|^\s+Key:\s+([0-9]+) bits\s*$|\1|p' <<< "${dump}")
|
||||
+ else
|
||||
+ echo "${DEV} is not a supported LUKS device!" >&2
|
||||
+ return 1
|
||||
+ fi
|
||||
+ local bits
|
||||
+ bits=$(sort -n <<< "${filter}" | tail -n 1)
|
||||
+ pwmake "${bits}"
|
||||
+}
|
||||
+
|
||||
+findexe() {
|
||||
+ while read -r -d: path; do
|
||||
+ [ -f "${path}/${1}" ] && [ -x "${path}/${1}" ] && \
|
||||
+ echo "${path}/${1}" && return 0
|
||||
+ done <<< "${PATH}:"
|
||||
+ return 1
|
||||
+}
|
||||
+
|
||||
diff --git a/src/luks/clevis-luks-regen b/src/luks/clevis-luks-regen
|
||||
new file mode 100755
|
||||
index 0000000..9535ba3
|
||||
--- /dev/null
|
||||
+++ b/src/luks/clevis-luks-regen
|
||||
@@ -0,0 +1,186 @@
|
||||
+#!/usr/bin/env bash
|
||||
+# vim: set tabstop=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80:
|
||||
+#
|
||||
+# Copyright (c) 2018 Red Hat, Inc.
|
||||
+# Author: Radovan Sroka <rsroka@redhat.com>
|
||||
+#
|
||||
+# This program is free software: you can redistribute it and/or modify
|
||||
+# it under the terms of the GNU General Public License as published by
|
||||
+# the Free Software Foundation, either version 3 of the License, or
|
||||
+# (at your option) any later version.
|
||||
+#
|
||||
+# This program is distributed in the hope that it will be useful,
|
||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+# GNU General Public License for more details.
|
||||
+#
|
||||
+# You should have received a copy of the GNU General Public License
|
||||
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
+#
|
||||
+
|
||||
+. clevis-luks-common-functions
|
||||
+
|
||||
+SUMMARY="Regenerate LUKS metadata"
|
||||
+
|
||||
+if [ "$1" == "--summary" ]; then
|
||||
+ echo "$SUMMARY"
|
||||
+ exit 0
|
||||
+fi
|
||||
+
|
||||
+function usage_and_exit () {
|
||||
+ echo >&2
|
||||
+ echo "Usage: clevis luks regen -d DEV -s SLOT" >&2
|
||||
+ echo >&2
|
||||
+ echo "$SUMMARY" >&2
|
||||
+ echo >&2
|
||||
+ exit "$1"
|
||||
+}
|
||||
+
|
||||
+if [ "$#" -ne "4" ]; then
|
||||
+ usage_and_exit 1
|
||||
+fi
|
||||
+
|
||||
+while getopts "hd:s:" o; do
|
||||
+ case "$o" in
|
||||
+ d) DEV="$OPTARG";;
|
||||
+ h) usage_and_exit 0;;
|
||||
+ s) SLT="$OPTARG";;
|
||||
+ *) usage_and_exit 1;;
|
||||
+ esac
|
||||
+done
|
||||
+
|
||||
+function decode_luks_header () {
|
||||
+ if DATA_CODED="$(jose jwe fmt -i- <<< "$1")"; then
|
||||
+ DATA_CODED="$(jose fmt -j- -g protected -u- <<< "$DATA_CODED")"
|
||||
+ DATA_DECODED="$(jose b64 dec -i- <<< "$DATA_CODED")"
|
||||
+ else
|
||||
+ echo "Error decoding JWE protected header!" >&2
|
||||
+ exit 1
|
||||
+ fi
|
||||
+
|
||||
+ echo "$DATA_DECODED"
|
||||
+}
|
||||
+
|
||||
+function generate_cfg () {
|
||||
+ echo -n "{"
|
||||
+ DATA="$(decode_luks_header "$1")"
|
||||
+
|
||||
+ if ! P="$(jose fmt -j- -g clevis -g pin -u- <<< "$DATA")" || [ -z "$P" ]; then
|
||||
+ echo "Pin wasn't found in LUKS metadata!" >&2
|
||||
+ exit 1
|
||||
+ fi
|
||||
+
|
||||
+ if ! CONTENT="$(jose fmt -j- -g clevis -g "$P" -o- <<< "$DATA")" || [ -z "$CONTENT" ]; then
|
||||
+ echo "Content was not found!" >&2
|
||||
+ fi
|
||||
+
|
||||
+ # echo -n "\"$P\": ["
|
||||
+
|
||||
+ if [ "$P" = "tang" ] || [ "$P" = "http" ]; then
|
||||
+ URL="$(jose fmt -j- -g url -u- <<< "$CONTENT")"
|
||||
+ echo -n "\"url\":\"$URL\""
|
||||
+ elif [ "$P" = "sss" ]; then
|
||||
+ THRESHOLD="$(jose fmt -j- -g t -o- <<< "$CONTENT")"
|
||||
+ if [ -n "$THRESHOLD" ]; then
|
||||
+ echo -n "\"t\":$THRESHOLD,"
|
||||
+ fi
|
||||
+
|
||||
+ echo -n "\"pins\":{"
|
||||
+
|
||||
+ CNT=0
|
||||
+ PREV=""
|
||||
+ while ITEM="$(jose fmt -j- -g jwe -g"$CNT" -u- <<< "$CONTENT")"; do
|
||||
+ if [ -z "$ITEM" ]; then
|
||||
+ CNT=$(( CNT + 1 ))
|
||||
+ continue # in some cases it can be empty string
|
||||
+ fi
|
||||
+
|
||||
+ DD="$(decode_luks_header "$ITEM")"
|
||||
+
|
||||
+ if ! PP="$(jose fmt -j- -g clevis -g pin -u- <<< "$DD")" || [ -z "$PP" ]; then
|
||||
+ echo "Pin wasn't found in LUKS metadata!" >&2
|
||||
+ exit 1
|
||||
+ fi
|
||||
+
|
||||
+ if [ "$CNT" -eq 0 ]; then
|
||||
+ PREV="$PP"
|
||||
+ echo -n "\"$PP\":["
|
||||
+ echo -n "$(generate_cfg "$ITEM")"
|
||||
+ else
|
||||
+ if ! [ "$PREV" = "$PP" ]; then
|
||||
+ echo -n "],\"$PP\":["
|
||||
+ echo -n "$(generate_cfg "$ITEM")"
|
||||
+ else
|
||||
+ echo -n ",$(generate_cfg "$ITEM")"
|
||||
+ fi
|
||||
+ fi
|
||||
+
|
||||
+ PREV="$PP"
|
||||
+ CNT=$(( CNT + 1 ))
|
||||
+ done
|
||||
+
|
||||
+ echo -n "]}"
|
||||
+
|
||||
+ else
|
||||
+ echo "Unknown pin $P!" >&2
|
||||
+ exit 1
|
||||
+ fi
|
||||
+
|
||||
+ echo -n "}"
|
||||
+}
|
||||
+
|
||||
+### get luks metadata
|
||||
+
|
||||
+if [ -z "$DEV" ]; then
|
||||
+ echo "Did not specify a device!" >&2
|
||||
+ exit 1
|
||||
+fi
|
||||
+
|
||||
+if [ -z "$SLT" ]; then
|
||||
+ echo "Did not specify a slot!" >&2
|
||||
+ exit 1
|
||||
+fi
|
||||
+
|
||||
+if ! OLD_LUKS_CODED="$(clevis_luks_read_slot "$DEV" "$SLT")"; then
|
||||
+ echo "Error reading metadata from LUKS device!" >&2
|
||||
+ exit 1
|
||||
+fi
|
||||
+
|
||||
+### ----------------------------------------------------------------------
|
||||
+
|
||||
+DECODED="$(decode_luks_header "$OLD_LUKS_CODED")"
|
||||
+
|
||||
+if ! PIN="$(jose fmt -j- -g clevis -g pin -u- <<< "$DECODED")" || [ -z "$PIN" ]; then
|
||||
+ echo "Pin wasn't found in LUKS metadata!" >&2
|
||||
+ exit 1
|
||||
+fi
|
||||
+
|
||||
+CFG="$(generate_cfg "$OLD_LUKS_CODED")"
|
||||
+
|
||||
+### ----------------------------------------------------------------------
|
||||
+
|
||||
+echo "Regenerating with:"
|
||||
+echo "PIN: $PIN"
|
||||
+echo "CONFIG: $CFG"
|
||||
+
|
||||
+trap 'echo "Ignoring CONTROL-C!"' INT TERM
|
||||
+
|
||||
+# Get the existing key.
|
||||
+read -r -s -p "Enter existing LUKS password: " existing_key; echo
|
||||
+
|
||||
+# Check if the key is valid.
|
||||
+if ! cryptsetup luksOpen --test-passphrase "${DEV}" <<< "${existing_key}"; then
|
||||
+ exit 1
|
||||
+fi
|
||||
+
|
||||
+if ! clevis luks unbind -d "${DEV}" -s "${SLT}" -f; then
|
||||
+ echo "Error during unbind of rotated key from slot:$SLT in $DEV" >&2
|
||||
+ exit 1
|
||||
+fi
|
||||
+
|
||||
+if ! clevis luks bind -d "${DEV}" -s "${SLT}" "${PIN}" "${CFG}" -k - <<< "${existing_key}"; then
|
||||
+ echo "Error during bind of new key from slot:$SLT in $DEV" >&2
|
||||
+ exit 1
|
||||
+fi
|
||||
+
|
||||
+echo "Keys were succesfully rotated."
|
||||
diff --git a/src/luks/clevis-luks-regen.1.adoc b/src/luks/clevis-luks-regen.1.adoc
|
||||
new file mode 100644
|
||||
index 0000000..3cd6b7c
|
||||
--- /dev/null
|
||||
+++ b/src/luks/clevis-luks-regen.1.adoc
|
||||
@@ -0,0 +1,36 @@
|
||||
+CLEVIS-LUKS-REGEN(1)
|
||||
+=====================
|
||||
+:doctype: manpage
|
||||
+
|
||||
+
|
||||
+== NAME
|
||||
+
|
||||
+clevis-luks-regen - Regenerates LUKS metadata
|
||||
+
|
||||
+== SYNOPSIS
|
||||
+
|
||||
+*clevis luks regen* -d DEV -s SLT
|
||||
+
|
||||
+== OVERVIEW
|
||||
+
|
||||
+The *clevis luks regen* command regenerates the LUKS metadata for a given slot in a LUKS device. It effectively
|
||||
+performs an operation equivalent to *clevis luks unbind* and *clevis luks bind* for rebinding said slot and device.
|
||||
+
|
||||
+== OPTIONS
|
||||
+
|
||||
+* *-d* _DEV_ :
|
||||
+ The bound LUKS device
|
||||
+
|
||||
+* *-s* _SLT_ :
|
||||
+ The slot or key slot number for rebinding. Note that it requires that such slot is currently bound by clevis.
|
||||
+
|
||||
+== EXAMPLE
|
||||
+
|
||||
+ Regenerate the binding of slot 1 from /dev/sda1:
|
||||
+
|
||||
+ # clevis luks regen -d /dev/sda1 -s 1
|
||||
+
|
||||
+== SEE ALSO
|
||||
+
|
||||
+link:clevis-luks-bind.1.adoc[*clevis-luks-bind*(1)]
|
||||
+link:clevis-luks-unbind.1.adoc[*clevis-luks-unbind*(1)]
|
||||
diff --git a/src/luks/clevis-luks-report b/src/luks/clevis-luks-report
|
||||
new file mode 100755
|
||||
index 0000000..f047256
|
||||
@ -831,17 +442,13 @@ index 0000000..cf42afe
|
||||
+
|
||||
+link:clevis-luks-regen.1.adoc[*clevis-luks-regen*(1)]
|
||||
diff --git a/src/luks/meson.build b/src/luks/meson.build
|
||||
index 1f64ab0..7c045c4 100644
|
||||
index f21388d..ee588c3 100644
|
||||
--- a/src/luks/meson.build
|
||||
+++ b/src/luks/meson.build
|
||||
@@ -15,6 +15,18 @@ if libcryptsetup.found() and luksmeta.found() and pwmake.found()
|
||||
bins += join_paths(meson.current_source_dir(), 'clevis-luks-bind')
|
||||
mans += join_paths(meson.current_source_dir(), 'clevis-luks-bind.1')
|
||||
@@ -47,6 +47,13 @@ if libcryptsetup.found() and luksmeta.found() and pwmake.found()
|
||||
|
||||
+ bins += join_paths(meson.current_source_dir(), 'clevis-luks-common-functions')
|
||||
+
|
||||
+ bins += join_paths(meson.current_source_dir(), 'clevis-luks-regen')
|
||||
+ mans += join_paths(meson.current_source_dir(), 'clevis-luks-regen.1')
|
||||
bins += join_paths(meson.current_source_dir(), 'clevis-luks-regen')
|
||||
mans += join_paths(meson.current_source_dir(), 'clevis-luks-regen.1')
|
||||
+
|
||||
+ bins += join_paths(meson.current_source_dir(), 'clevis-luks-report')
|
||||
+ bins += join_paths(meson.current_source_dir(), 'clevis-luks-report-compare')
|
||||
@ -849,10 +456,9 @@ index 1f64ab0..7c045c4 100644
|
||||
+ bins += join_paths(meson.current_source_dir(), 'clevis-luks-report-sss')
|
||||
+ bins += join_paths(meson.current_source_dir(), 'clevis-luks-report-tang')
|
||||
+ mans += join_paths(meson.current_source_dir(), 'clevis-luks-report.1')
|
||||
+
|
||||
mans += join_paths(meson.current_source_dir(), 'clevis-luks-unlockers.7')
|
||||
else
|
||||
warning('Will not install LUKS support due to missing dependencies!')
|
||||
endif
|
||||
--
|
||||
2.21.0
|
||||
2.18.4
|
||||
|
339
SOURCES/0008-Use-one-clevis-luks-askpass-per-device.patch
Normal file
339
SOURCES/0008-Use-one-clevis-luks-askpass-per-device.patch
Normal file
@ -0,0 +1,339 @@
|
||||
From 3250784e99016d9f920892dbb1438b9e76fb210b Mon Sep 17 00:00:00 2001
|
||||
From: Sergio Correia <scorreia@redhat.com>
|
||||
Date: Sun, 10 May 2020 15:57:23 -0300
|
||||
Subject: [PATCH 8/8] Use one clevis-luks-askpass per device
|
||||
|
||||
This should improve the reliability of the boot unlocking, especially
|
||||
when unlocking multiple devices upon boot.
|
||||
|
||||
It also greatly simplifies the configuration, as there is no need to
|
||||
enable any systemd units manually nor add _netdev to either fstab or
|
||||
crypttab.
|
||||
---
|
||||
src/luks/clevis-luks-common-functions | 8 ++
|
||||
src/luks/clevis-luks-unlockers.7.adoc | 16 +---
|
||||
src/luks/systemd/clevis-luks-askpass | 81 ++++++-------------
|
||||
src/luks/systemd/clevis-luks-askpass.path | 10 ---
|
||||
.../systemd/clevis-luks-askpass.service.in | 8 --
|
||||
src/luks/systemd/clevis-luks-askpass@.path | 12 +++
|
||||
.../systemd/clevis-luks-askpass@.service.in | 8 ++
|
||||
.../systemd/dracut/clevis/module-setup.sh.in | 23 ++++++
|
||||
src/luks/systemd/meson.build | 6 +-
|
||||
9 files changed, 80 insertions(+), 92 deletions(-)
|
||||
delete mode 100644 src/luks/systemd/clevis-luks-askpass.path
|
||||
delete mode 100644 src/luks/systemd/clevis-luks-askpass.service.in
|
||||
create mode 100644 src/luks/systemd/clevis-luks-askpass@.path
|
||||
create mode 100644 src/luks/systemd/clevis-luks-askpass@.service.in
|
||||
|
||||
diff --git a/src/luks/clevis-luks-common-functions b/src/luks/clevis-luks-common-functions
|
||||
index 5b515ad..c9d712a 100644
|
||||
--- a/src/luks/clevis-luks-common-functions
|
||||
+++ b/src/luks/clevis-luks-common-functions
|
||||
@@ -555,3 +555,11 @@ clevis_luks_restore_dev() {
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
+
|
||||
+# clevis_is_luks_device_by_uuid_open() checks whether the LUKS device with
|
||||
+# given UUID is open.
|
||||
+clevis_is_luks_device_by_uuid_open() {
|
||||
+ local LUKS_UUID="${1}"
|
||||
+ [ -z "${LUKS_UUID}" ] && return 1
|
||||
+ test -b /dev/disk/by-id/dm-uuid-*"${LUKS_UUID//-/}"*
|
||||
+}
|
||||
diff --git a/src/luks/clevis-luks-unlockers.7.adoc b/src/luks/clevis-luks-unlockers.7.adoc
|
||||
index 161b73a..e8d47ba 100644
|
||||
--- a/src/luks/clevis-luks-unlockers.7.adoc
|
||||
+++ b/src/luks/clevis-luks-unlockers.7.adoc
|
||||
@@ -26,7 +26,7 @@ You can unlock a LUKS volume manually using the following command:
|
||||
|
||||
For more information, see link:clevis-luks-unlock.1.adoc[*clevis-luks-unlock*(1)].
|
||||
|
||||
-== EARLY BOOT UNLOCKING
|
||||
+== BOOT UNLOCKING
|
||||
|
||||
If Clevis integration does not already ship in your initramfs, you may need to
|
||||
rebuild your initramfs with this command:
|
||||
@@ -34,23 +34,13 @@ rebuild your initramfs with this command:
|
||||
$ sudo dracut -f
|
||||
|
||||
Once Clevis is integrated into your initramfs, a simple reboot should unlock
|
||||
-your root volume. Note, however, that early boot integration only works for the
|
||||
-root volume. Non-root volumes should use the late boot unlocker.
|
||||
+your clevis-bound volumes. Root volumes will be unlocked in early-boot, while the
|
||||
+remaining volumes will be unlocked after dracut switch-root.
|
||||
|
||||
Dracut will bring up your network using DHCP by default. If you need to specify
|
||||
additional network parameters, such as static IP configuration, please consult
|
||||
the dracut documentation.
|
||||
|
||||
-== LATE BOOT UNLOCKING
|
||||
-
|
||||
-You can enable late boot unlocking by executing the following command:
|
||||
-
|
||||
- $ sudo systemctl enable clevis-luks-askpass.path
|
||||
-
|
||||
-After a reboot, Clevis will attempt to unlock all *_netdev* devices listed in
|
||||
-*/etc/crypttab* when systemd prompts for their passwords. This implies that
|
||||
-systemd support for *_netdev* is required.
|
||||
-
|
||||
== DESKTOP UNLOCKING
|
||||
|
||||
When the udisks2 unlocker is installed, your GNOME desktop session should
|
||||
diff --git a/src/luks/systemd/clevis-luks-askpass b/src/luks/systemd/clevis-luks-askpass
|
||||
index 9fea6aa..20294e5 100755
|
||||
--- a/src/luks/systemd/clevis-luks-askpass
|
||||
+++ b/src/luks/systemd/clevis-luks-askpass
|
||||
@@ -19,96 +19,61 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
-UUID=cb6e8904-81ff-40da-a84a-07ab9ab5715e
|
||||
+. clevis-luks-common-functions
|
||||
|
||||
shopt -s nullglob
|
||||
|
||||
path=/run/systemd/ask-password
|
||||
-while getopts ":lp:" o; do
|
||||
+while getopts ":lp:u:" o; do
|
||||
case "$o" in
|
||||
l) loop=true;;
|
||||
p) path="$OPTARG";;
|
||||
+ u) device_uuid=$OPTARG;;
|
||||
+ *) ;;
|
||||
esac
|
||||
done
|
||||
|
||||
-luks1_decrypt() {
|
||||
- luksmeta load "$@" \
|
||||
- | clevis decrypt
|
||||
-
|
||||
- local rc
|
||||
- for rc in "${PIPESTATUS[@]}"; do
|
||||
- [ $rc -eq 0 ] || return $rc
|
||||
- done
|
||||
- return 0
|
||||
-}
|
||||
-
|
||||
-luks2_jwe() {
|
||||
- # jose jwe fmt -c outputs extra \n, so clean it up
|
||||
- cryptsetup token export "$@" \
|
||||
- | jose fmt -j- -Og jwe -o- \
|
||||
- | jose jwe fmt -i- -c \
|
||||
- | tr -d '\n'
|
||||
-
|
||||
- local rc
|
||||
- for rc in "${PIPESTATUS[@]}"; do
|
||||
- [ $rc -eq 0 ] || return $rc
|
||||
- done
|
||||
- return 0
|
||||
-}
|
||||
-
|
||||
while true; do
|
||||
todo=0
|
||||
|
||||
for question in "$path"/ask.*; do
|
||||
- metadata=false
|
||||
unlocked=false
|
||||
d=
|
||||
s=
|
||||
|
||||
- while read line; do
|
||||
+ while read -r line; do
|
||||
case "$line" in
|
||||
Id=cryptsetup:*) d="${line##Id=cryptsetup:}";;
|
||||
Socket=*) s="${line##Socket=}";;
|
||||
esac
|
||||
done < "$question"
|
||||
|
||||
- [ "$d" ] && [ "$s" ] || continue
|
||||
+ [ -b "${d}" ] || continue
|
||||
+ [ -S "${s}" ] || continue
|
||||
|
||||
- if cryptsetup isLuks --type luks1 "$d"; then
|
||||
- # If the device is not initialized, sliently skip it.
|
||||
- luksmeta test -d "$d" || continue
|
||||
-
|
||||
- while read -r slot state uuid; do
|
||||
- [ "$state" == "active" ] || continue
|
||||
- [ "$uuid" == "$UUID" ] || continue
|
||||
- metadata=true
|
||||
-
|
||||
- if pt="$(luks1_decrypt -d "$d" -s "$slot" -u "$UUID")"; then
|
||||
- echo -n "+$pt" | ncat -U -u --send-only "$s"
|
||||
- unlocked=true
|
||||
- break
|
||||
- fi
|
||||
- done < <(luksmeta show -d "$d")
|
||||
- elif cryptsetup isLuks --type luks2 "$d"; then
|
||||
- while read -r id; do
|
||||
- jwe="$(luks2_jwe --token-id "$id" "$d")" \
|
||||
- || continue
|
||||
- metadata=true
|
||||
+ if [ -n "${device_uuid}" ]; then
|
||||
+ uuid="$(cryptsetup luksUUID "${d}")"
|
||||
+ [ "${uuid}" != "${device_uuid}" ] && todo=1 && continue
|
||||
+ fi
|
||||
|
||||
- if pt="$(echo -n "$jwe" | clevis decrypt)"; then
|
||||
- echo -n "+$pt" | ncat -U -u --send-only "$s"
|
||||
- unlocked=true
|
||||
- break
|
||||
- fi
|
||||
- done < <(cryptsetup luksDump "$d" | sed -rn 's|^\s+([0-9]+): clevis|\1|p')
|
||||
+ if pt="$(clevis_luks_unlock_device "${d}")"; then
|
||||
+ echo -n "+$pt" | ncat -U -u --send-only "$s"
|
||||
+ unlocked=true
|
||||
fi
|
||||
|
||||
- [ "$metadata" == true ] || continue
|
||||
+ [ -n "${device_uuid}" ] && [ "${unlocked}" == true ] && break
|
||||
[ "$unlocked" == true ] && continue
|
||||
((todo++))
|
||||
done
|
||||
|
||||
- if [ $todo -eq 0 ] || [ "$loop" != true ]; then
|
||||
+ if [ -n "${device_uuid}" ]; then
|
||||
+ [ ! -b /dev/disk/by-uuid/"${device_uuid}" ] && break
|
||||
+ if clevis_is_luks_device_by_uuid_open "${device_uuid}"; then
|
||||
+ break
|
||||
+ fi
|
||||
+ fi
|
||||
+
|
||||
+ if [ "$todo" -eq 0 ] || [ "$loop" != true ]; then
|
||||
break;
|
||||
fi
|
||||
|
||||
diff --git a/src/luks/systemd/clevis-luks-askpass.path b/src/luks/systemd/clevis-luks-askpass.path
|
||||
deleted file mode 100644
|
||||
index a4d01ba..0000000
|
||||
--- a/src/luks/systemd/clevis-luks-askpass.path
|
||||
+++ /dev/null
|
||||
@@ -1,10 +0,0 @@
|
||||
-[Unit]
|
||||
-Description=Clevis systemd-ask-password Watcher
|
||||
-Before=remote-fs-pre.target
|
||||
-Wants=remote-fs-pre.target
|
||||
-
|
||||
-[Path]
|
||||
-PathChanged=/run/systemd/ask-password
|
||||
-
|
||||
-[Install]
|
||||
-WantedBy=remote-fs.target
|
||||
diff --git a/src/luks/systemd/clevis-luks-askpass.service.in b/src/luks/systemd/clevis-luks-askpass.service.in
|
||||
deleted file mode 100644
|
||||
index 2c6bbed..0000000
|
||||
--- a/src/luks/systemd/clevis-luks-askpass.service.in
|
||||
+++ /dev/null
|
||||
@@ -1,8 +0,0 @@
|
||||
-[Unit]
|
||||
-Description=Clevis LUKS systemd-ask-password Responder
|
||||
-Requires=network-online.target
|
||||
-After=network-online.target
|
||||
-
|
||||
-[Service]
|
||||
-Type=oneshot
|
||||
-ExecStart=@libexecdir@/clevis-luks-askpass -l
|
||||
diff --git a/src/luks/systemd/clevis-luks-askpass@.path b/src/luks/systemd/clevis-luks-askpass@.path
|
||||
new file mode 100644
|
||||
index 0000000..3f23665
|
||||
--- /dev/null
|
||||
+++ b/src/luks/systemd/clevis-luks-askpass@.path
|
||||
@@ -0,0 +1,12 @@
|
||||
+[Unit]
|
||||
+Description=Clevis systemd-ask-password Watcher for %i
|
||||
+DefaultDependencies=no
|
||||
+Conflicts=shutdown.target
|
||||
+Before=basic.target shutdown.target
|
||||
+
|
||||
+[Path]
|
||||
+DirectoryNotEmpty=/run/systemd/ask-password
|
||||
+MakeDirectory=yes
|
||||
+
|
||||
+[Install]
|
||||
+WantedBy=basic.target
|
||||
diff --git a/src/luks/systemd/clevis-luks-askpass@.service.in b/src/luks/systemd/clevis-luks-askpass@.service.in
|
||||
new file mode 100644
|
||||
index 0000000..4165ec5
|
||||
--- /dev/null
|
||||
+++ b/src/luks/systemd/clevis-luks-askpass@.service.in
|
||||
@@ -0,0 +1,8 @@
|
||||
+[Unit]
|
||||
+Description=Clevis LUKS systemd-ask-password Responder for luks-%i
|
||||
+DefaultDependencies=no
|
||||
+Conflicts=shutdown.target
|
||||
+Before=shutdown.target
|
||||
+
|
||||
+[Service]
|
||||
+ExecStart=@libexecdir@/clevis-luks-askpass -u %i
|
||||
diff --git a/src/luks/systemd/dracut/clevis/module-setup.sh.in b/src/luks/systemd/dracut/clevis/module-setup.sh.in
|
||||
index abc79b3..1a0d6f7 100755
|
||||
--- a/src/luks/systemd/dracut/clevis/module-setup.sh.in
|
||||
+++ b/src/luks/systemd/dracut/clevis/module-setup.sh.in
|
||||
@@ -23,6 +23,24 @@ depends() {
|
||||
return 255
|
||||
}
|
||||
|
||||
+configure_passwd_watchers() {
|
||||
+ if ! command -v systemctl >/dev/null; then
|
||||
+ return 1
|
||||
+ fi
|
||||
+
|
||||
+ find /etc/systemd/system/ -name "clevis-luks-askpass*" -exec rm -f {} \;
|
||||
+
|
||||
+ local uuid
|
||||
+ for dev in $(lsblk -p -n -s -r \
|
||||
+ | awk '$6 == "crypt" { getline; print $1 }' | sort -u); do
|
||||
+ uuid=$(cryptsetup luksUUID "${dev}")
|
||||
+
|
||||
+ if clevis luks list -d "${dev}" >/dev/null 2>/dev/null; then
|
||||
+ systemctl enable "clevis-luks-askpass@${uuid}.path" 2>/dev/null
|
||||
+ fi
|
||||
+ done
|
||||
+}
|
||||
+
|
||||
install() {
|
||||
inst_hook initqueue/online 60 "$moddir/clevis-hook.sh"
|
||||
inst_hook initqueue/settled 60 "$moddir/clevis-hook.sh"
|
||||
@@ -30,6 +48,10 @@ install() {
|
||||
inst_multiple \
|
||||
/etc/services \
|
||||
@libexecdir@/clevis-luks-askpass \
|
||||
+ clevis-luks-common-functions \
|
||||
+ head \
|
||||
+ grep \
|
||||
+ sed \
|
||||
clevis-decrypt \
|
||||
cryptsetup \
|
||||
luksmeta \
|
||||
@@ -38,5 +60,6 @@ install() {
|
||||
jose \
|
||||
ncat
|
||||
|
||||
+ configure_passwd_watchers
|
||||
dracut_need_initqueue
|
||||
}
|
||||
diff --git a/src/luks/systemd/meson.build b/src/luks/systemd/meson.build
|
||||
index 369e7f7..334e84c 100644
|
||||
--- a/src/luks/systemd/meson.build
|
||||
+++ b/src/luks/systemd/meson.build
|
||||
@@ -6,13 +6,13 @@ if systemd.found()
|
||||
unitdir = systemd.get_pkgconfig_variable('systemdsystemunitdir')
|
||||
|
||||
configure_file(
|
||||
- input: 'clevis-luks-askpass.service.in',
|
||||
- output: 'clevis-luks-askpass.service',
|
||||
+ input: 'clevis-luks-askpass@.service.in',
|
||||
+ output: 'clevis-luks-askpass@.service',
|
||||
install_dir: unitdir,
|
||||
configuration: data,
|
||||
)
|
||||
|
||||
- install_data('clevis-luks-askpass.path', install_dir: unitdir)
|
||||
+ install_data('clevis-luks-askpass@.path', install_dir: unitdir)
|
||||
install_data('clevis-luks-askpass', install_dir: libexecdir)
|
||||
else
|
||||
warning('Will not install systemd support due to missing dependencies!')
|
||||
--
|
||||
2.18.4
|
||||
|
@ -0,0 +1,555 @@
|
||||
From 7b1639b2194a8bfbb0daedf1cbdfc4ebef5f6b31 Mon Sep 17 00:00:00 2001
|
||||
From: Sergio Correia <scorreia@redhat.com>
|
||||
Date: Mon, 18 May 2020 08:36:17 -0300
|
||||
Subject: [PATCH] Introduce -y (assume yes) argument to clevis luks bind
|
||||
|
||||
In order to simplify automated operations with e.g. ansible,
|
||||
it would be helpful to have a way to automate the creation of
|
||||
bindings with clevis.
|
||||
|
||||
In simple scenarios, it's possible to download the advertisement
|
||||
from a tang server and pass it in the binding configuration, to
|
||||
do the binding offline, in the following way:
|
||||
|
||||
curl -sfg http://tang.server/adv -o adv.jws
|
||||
|
||||
clevis luks bind -d /dev/sda2 tang '{"url":"http://tang.server", "adv":"adv.jws}'
|
||||
|
||||
However, for more complex scenarios using multiple servers with
|
||||
the sss pin, it becomes a lot more complicated to do the same
|
||||
thing and do the binding in an automated fashion. An alternative
|
||||
would be to use expect (tcl), but it can also be complicated.
|
||||
|
||||
In this commit we introduce -y as a parameter to clevis luks bind,
|
||||
meanining _assume yes_. Essentially, this would make it so that
|
||||
the user would not have to manually trust tang key(s) by typing
|
||||
y/yes.
|
||||
|
||||
Security-wise, it would be similar to downloading the advertisement
|
||||
manually and passing it to tang as the "adv" configuration option,
|
||||
something already supported.
|
||||
|
||||
We already have a -f parameter, so we picked something different,
|
||||
not to change existing behavior and possibly break existing scripts.
|
||||
---
|
||||
src/luks/clevis-luks-bind.1.adoc | 7 +-
|
||||
src/luks/clevis-luks-bind.in | 11 +++-
|
||||
src/luks/clevis-luks-regen | 4 +-
|
||||
src/luks/tests/assume-yes-luks1 | 81 ++++++++++++++++++++++++
|
||||
src/luks/tests/assume-yes-luks2 | 81 ++++++++++++++++++++++++
|
||||
src/luks/tests/meson.build | 2 +
|
||||
src/pins/sss/clevis-encrypt-sss.1.adoc | 14 +++-
|
||||
src/pins/sss/clevis-encrypt-sss.c | 30 ++++++---
|
||||
src/pins/tang/clevis-encrypt-tang | 35 ++++++----
|
||||
src/pins/tang/clevis-encrypt-tang.1.adoc | 11 +++-
|
||||
10 files changed, 246 insertions(+), 30 deletions(-)
|
||||
create mode 100755 src/luks/tests/assume-yes-luks1
|
||||
create mode 100755 src/luks/tests/assume-yes-luks2
|
||||
|
||||
diff --git a/src/luks/clevis-luks-bind.1.adoc b/src/luks/clevis-luks-bind.1.adoc
|
||||
index 336c0f4..438e517 100644
|
||||
--- a/src/luks/clevis-luks-bind.1.adoc
|
||||
+++ b/src/luks/clevis-luks-bind.1.adoc
|
||||
@@ -9,7 +9,7 @@ clevis-luks-bind - Bind a LUKS device using the specified policy
|
||||
|
||||
== SYNOPSIS
|
||||
|
||||
-*clevis luks bind* [-f] -d DEV [-s SLT] [-k KEY] PIN CFG
|
||||
+*clevis luks bind* [-f] [-y] -d DEV [-s SLT] [-k KEY] PIN CFG
|
||||
|
||||
== OVERVIEW
|
||||
|
||||
@@ -34,6 +34,11 @@ Clevis LUKS unlockers. See link:clevis-luks-unlockers.7.adoc[*clevis-luks-unlock
|
||||
* *-f* :
|
||||
Do not prompt for LUKSMeta initialization
|
||||
|
||||
+* *-y* :
|
||||
+ Automatically answer yes for all questions. When using _tang_, it
|
||||
+ causes the advertisement trust check to be skipped, which can be
|
||||
+ useful in automated deployments
|
||||
+
|
||||
* *-d* _DEV_ :
|
||||
The LUKS device on which to perform binding
|
||||
|
||||
diff --git a/src/luks/clevis-luks-bind.in b/src/luks/clevis-luks-bind.in
|
||||
index 89a5e22..8b8b5ee 100755
|
||||
--- a/src/luks/clevis-luks-bind.in
|
||||
+++ b/src/luks/clevis-luks-bind.in
|
||||
@@ -33,12 +33,14 @@ function luks2_supported() {
|
||||
function usage() {
|
||||
exec >&2
|
||||
echo
|
||||
- echo "Usage: clevis luks bind [-f] [-s SLT] [-k KEY] -d DEV PIN CFG"
|
||||
+ echo "Usage: clevis luks bind [-f] [-y] [-s SLT] [-k KEY] -d DEV PIN CFG"
|
||||
echo
|
||||
echo "$SUMMARY":
|
||||
echo
|
||||
echo " -f Do not prompt for LUKSMeta initialization"
|
||||
echo
|
||||
+ echo " -y Automatically answer yes for all questions"
|
||||
+ echo
|
||||
echo " -d DEV The LUKS device on which to perform binding"
|
||||
echo
|
||||
echo " -s SLT The LUKS slot to use"
|
||||
@@ -55,12 +57,15 @@ if [ $# -eq 1 ] && [ "$1" == "--summary" ]; then
|
||||
fi
|
||||
|
||||
FRC=()
|
||||
-while getopts ":hfd:s:k:" o; do
|
||||
+YES=()
|
||||
+while getopts ":fyd:s:k:" o; do
|
||||
case "$o" in
|
||||
f) FRC+=(-f);;
|
||||
d) DEV="$OPTARG";;
|
||||
s) SLT="$OPTARG";;
|
||||
k) KEY="$OPTARG";;
|
||||
+ y) FRC+=(-f)
|
||||
+ YES+=(-y);;
|
||||
*) usage;;
|
||||
esac
|
||||
done
|
||||
@@ -139,7 +144,7 @@ cryptsetup luksDump "$DEV" \
|
||||
)")"
|
||||
|
||||
# Encrypt the new key
|
||||
-jwe="$(echo -n "$key" | clevis encrypt "$PIN" "$CFG")"
|
||||
+jwe="$(echo -n "$key" | clevis encrypt "$PIN" "$CFG" "${YES}")"
|
||||
|
||||
# If necessary, initialize the LUKS volume
|
||||
if [ "$luks_type" == "luks1" ] && ! luksmeta test -d "$DEV"; then
|
||||
diff --git a/src/luks/clevis-luks-regen b/src/luks/clevis-luks-regen
|
||||
index 44fd673..6071d85 100755
|
||||
--- a/src/luks/clevis-luks-regen
|
||||
+++ b/src/luks/clevis-luks-regen
|
||||
@@ -110,7 +110,7 @@ if ! new_passphrase=$(generate_key "${DEV}"); then
|
||||
fi
|
||||
|
||||
# Reencrypt the new password.
|
||||
-if ! jwe=$(clevis encrypt "${PIN}" "${CFG}" <<< "${new_passphrase}"); then
|
||||
+if ! jwe="$(clevis encrypt "${PIN}" "${CFG}" <<< "${new_passphrase}")"; then
|
||||
echo "Error using pin '${PIN}' with config '${CFG}'" >&2
|
||||
exit 1
|
||||
fi
|
||||
@@ -176,7 +176,7 @@ fi
|
||||
# Now make sure that we can unlock this device after the change.
|
||||
# If we can't, undo the changes.
|
||||
if ! cryptsetup open --test-passphrase --key-slot "${SLT}" "${DEV}" 2>/dev/null \
|
||||
- <<< $(clevis luks pass -d "${DEV}" -s "${SLT}" 2>/dev/null); then
|
||||
+ <<< "$(clevis luks pass -d "${DEV}" -s "${SLT}" 2>/dev/null)"; then
|
||||
echo "Invalid configuration detected after rebinding. Reverting changes."
|
||||
restore_device "${DEV}" "${TMP}"
|
||||
exit 1
|
||||
diff --git a/src/luks/tests/assume-yes-luks1 b/src/luks/tests/assume-yes-luks1
|
||||
new file mode 100755
|
||||
index 0000000..ad9dea4
|
||||
--- /dev/null
|
||||
+++ b/src/luks/tests/assume-yes-luks1
|
||||
@@ -0,0 +1,81 @@
|
||||
+#!/bin/bash -ex
|
||||
+# vim: set ts=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80:
|
||||
+#
|
||||
+# Copyright (c) 2020 Red Hat, Inc.
|
||||
+# Author: Sergio Correia <scorreia@redhat.com>
|
||||
+#
|
||||
+# This program is free software: you can redistribute it and/or modify
|
||||
+# it under the terms of the GNU General Public License as published by
|
||||
+# the Free Software Foundation, either version 3 of the License, or
|
||||
+# (at your option) any later version.
|
||||
+#
|
||||
+# This program is distributed in the hope that it will be useful,
|
||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+# GNU General Public License for more details.
|
||||
+#
|
||||
+# You should have received a copy of the GNU General Public License
|
||||
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
+
|
||||
+TEST=$(basename "${0}")
|
||||
+. tests-common-functions
|
||||
+
|
||||
+. clevis-luks-common-functions
|
||||
+
|
||||
+on_exit() {
|
||||
+ local d
|
||||
+ for d in "${TMP}" "${TMP2}"; do
|
||||
+ [ ! -d "${d}" ] && continue
|
||||
+ tang_stop "${d}"
|
||||
+ rm -rf "${d}"
|
||||
+ done
|
||||
+}
|
||||
+
|
||||
+trap 'on_exit' EXIT
|
||||
+trap 'on_exit' ERR
|
||||
+
|
||||
+TMP="$(mktemp -d)"
|
||||
+
|
||||
+port=$(get_random_port)
|
||||
+tang_run "${TMP}" "${port}" &
|
||||
+tang_wait_until_ready "${port}"
|
||||
+
|
||||
+url="http://${TANG_HOST}:${port}"
|
||||
+
|
||||
+cfg=$(printf '{"url":"%s"}' "$url")
|
||||
+
|
||||
+# LUKS1.
|
||||
+DEV="${TMP}/luks1-device"
|
||||
+new_device "luks1" "${DEV}"
|
||||
+
|
||||
+if ! clevis luks bind -y -d "${DEV}" tang "${cfg}" <<< "${DEFAULT_PASS}"; then
|
||||
+ error "${TEST}: Bind should have succeeded."
|
||||
+fi
|
||||
+
|
||||
+if ! clevis_luks_unlock_device "${DEV}"; then
|
||||
+ error "${TEST}: we were unable to unlock ${DEV}."
|
||||
+fi
|
||||
+
|
||||
+# Let's use a second tang server to test the sss pin.
|
||||
+TMP2="$(mktemp -d)"
|
||||
+
|
||||
+port2=$(get_random_port)
|
||||
+tang_run "${TMP2}" "${port2}" &
|
||||
+tang_wait_until_ready "${port2}"
|
||||
+
|
||||
+url2="http://${TANG_HOST}:${port2}"
|
||||
+
|
||||
+cfg2=$(printf '{"t":1,"pins":{"tang":[{"url":"%s"},{"url":"%s"}]}}' \
|
||||
+ "${url1}" "${url2}")
|
||||
+
|
||||
+# LUKS1.
|
||||
+new_device "luks1" "${DEV}"
|
||||
+# Now let's test the sss pin with the two test tang servers we deployed.
|
||||
+if ! clevis luks bind -y -d "${DEV}" sss "${cfg2}" <<< "${DEFAULT_PASS}"; then
|
||||
+ error "${TEST}: Bind should have succeeded."
|
||||
+fi
|
||||
+
|
||||
+# Unlock should still work now.
|
||||
+if ! clevis_luks_unlock_device "${DEV}"; then
|
||||
+ error "${TEST}: we should still be able to unlock ${DEV}"
|
||||
+fi
|
||||
diff --git a/src/luks/tests/assume-yes-luks2 b/src/luks/tests/assume-yes-luks2
|
||||
new file mode 100755
|
||||
index 0000000..5c0edc3
|
||||
--- /dev/null
|
||||
+++ b/src/luks/tests/assume-yes-luks2
|
||||
@@ -0,0 +1,81 @@
|
||||
+#!/bin/bash -ex
|
||||
+# vim: set ts=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80:
|
||||
+#
|
||||
+# Copyright (c) 2020 Red Hat, Inc.
|
||||
+# Author: Sergio Correia <scorreia@redhat.com>
|
||||
+#
|
||||
+# This program is free software: you can redistribute it and/or modify
|
||||
+# it under the terms of the GNU General Public License as published by
|
||||
+# the Free Software Foundation, either version 3 of the License, or
|
||||
+# (at your option) any later version.
|
||||
+#
|
||||
+# This program is distributed in the hope that it will be useful,
|
||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+# GNU General Public License for more details.
|
||||
+#
|
||||
+# You should have received a copy of the GNU General Public License
|
||||
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
+
|
||||
+TEST=$(basename "${0}")
|
||||
+. tests-common-functions
|
||||
+
|
||||
+. clevis-luks-common-functions
|
||||
+
|
||||
+on_exit() {
|
||||
+ local d
|
||||
+ for d in "${TMP}" "${TMP2}"; do
|
||||
+ [ ! -d "${d}" ] && continue
|
||||
+ tang_stop "${d}"
|
||||
+ rm -rf "${d}"
|
||||
+ done
|
||||
+}
|
||||
+
|
||||
+trap 'on_exit' EXIT
|
||||
+trap 'on_exit' ERR
|
||||
+
|
||||
+TMP="$(mktemp -d)"
|
||||
+
|
||||
+port=$(get_random_port)
|
||||
+tang_run "${TMP}" "${port}" &
|
||||
+tang_wait_until_ready "${port}"
|
||||
+
|
||||
+url="http://${TANG_HOST}:${port}"
|
||||
+
|
||||
+cfg=$(printf '{"url":"%s"}' "$url")
|
||||
+
|
||||
+# LUKS2.
|
||||
+DEV="${TMP}/luks2-device"
|
||||
+new_device "luks2" "${DEV}"
|
||||
+
|
||||
+if ! clevis luks bind -y -d "${DEV}" tang "${cfg}" <<< "${DEFAULT_PASS}"; then
|
||||
+ error "${TEST}: Bind should have succeeded."
|
||||
+fi
|
||||
+
|
||||
+if ! clevis_luks_unlock_device "${DEV}"; then
|
||||
+ error "${TEST}: we were unable to unlock ${DEV}."
|
||||
+fi
|
||||
+
|
||||
+# Let's use a second tang server to test the sss pin.
|
||||
+TMP2="$(mktemp -d)"
|
||||
+
|
||||
+port2=$(get_random_port)
|
||||
+tang_run "${TMP2}" "${port2}" &
|
||||
+tang_wait_until_ready "${port2}"
|
||||
+
|
||||
+url2="http://${TANG_HOST}:${port2}"
|
||||
+
|
||||
+cfg2=$(printf '{"t":1,"pins":{"tang":[{"url":"%s"},{"url":"%s"}]}}' \
|
||||
+ "${url1}" "${url2}")
|
||||
+
|
||||
+# LUKS2.
|
||||
+new_device "luks2" "${DEV}"
|
||||
+# Now let's test the sss pin with the two test tang servers we deployed.
|
||||
+if ! clevis luks bind -y -d "${DEV}" sss "${cfg2}" <<< "${DEFAULT_PASS}"; then
|
||||
+ error "${TEST}: Bind should have succeeded."
|
||||
+fi
|
||||
+
|
||||
+# Unlock should still work now.
|
||||
+if ! clevis_luks_unlock_device "${DEV}"; then
|
||||
+ error "${TEST}: we should still be able to unlock ${DEV}"
|
||||
+fi
|
||||
diff --git a/src/luks/tests/meson.build b/src/luks/tests/meson.build
|
||||
index dbef9bf..4795488 100644
|
||||
--- a/src/luks/tests/meson.build
|
||||
+++ b/src/luks/tests/meson.build
|
||||
@@ -85,6 +85,7 @@ endif
|
||||
|
||||
if has_tang
|
||||
test('unlock-tang-luks1', find_program('unlock-tang-luks1'), env: env, timeout: 90)
|
||||
+ test('assume-yes-luks1', find_program('assume-yes-luks1'), env: env)
|
||||
endif
|
||||
test('pass-tang-luks1', find_program('pass-tang-luks1'), env: env)
|
||||
test('backup-restore-luks1', find_program('backup-restore-luks1'), env: env)
|
||||
@@ -108,6 +109,7 @@ if luksmeta_data.get('OLD_CRYPTSETUP') == '0'
|
||||
|
||||
if has_tang
|
||||
test('unlock-tang-luks2', find_program('unlock-tang-luks2'), env: env, timeout: 120)
|
||||
+ test('assume-yes-luks2', find_program('assume-yes-luks2'), env: env, timeout: 60)
|
||||
endif
|
||||
test('pass-tang-luks2', find_program('pass-tang-luks2'), env: env, timeout: 60)
|
||||
test('backup-restore-luks2', find_program('backup-restore-luks2'), env:env, timeout: 90)
|
||||
diff --git a/src/pins/sss/clevis-encrypt-sss.1.adoc b/src/pins/sss/clevis-encrypt-sss.1.adoc
|
||||
index 7144e7e..7152144 100644
|
||||
--- a/src/pins/sss/clevis-encrypt-sss.1.adoc
|
||||
+++ b/src/pins/sss/clevis-encrypt-sss.1.adoc
|
||||
@@ -5,11 +5,11 @@ CLEVIS-ENCRYPT-SSS(1)
|
||||
|
||||
== NAME
|
||||
|
||||
-clevis-encrypt-sss - Encrypts using a Shamir's Secret Sharing policy
|
||||
+clevis-encrypt-sss - Encrypts using a Shamir's Secret Sharing policy
|
||||
|
||||
== SYNOPSIS
|
||||
|
||||
-*clevis encrypt sss* CONFIG < PT > JWE
|
||||
+*clevis encrypt sss* CONFIG [-y] < PT > JWE
|
||||
|
||||
== OVERVIEW
|
||||
|
||||
@@ -52,6 +52,16 @@ The format of the *pins* property is as follows:
|
||||
When the list version of the format is used, multiple pins of that type will
|
||||
receive key fragments.
|
||||
|
||||
+== OPTIONS
|
||||
+
|
||||
+* *-y* :
|
||||
+ Automatically answer yes for all questions. For the _tang_ pin, it will
|
||||
+ skip the advertisement trust check, which can be useful in automated
|
||||
+ deployments:
|
||||
+
|
||||
+ $ cfg='{"t":1,"pins":{"tang":[{"url":...},{"url":...}]}}'
|
||||
+ $ clevis encrypt sss "$cfg" -y < PT > JWE
|
||||
+
|
||||
== SEE ALSO
|
||||
|
||||
link:clevis-encrypt-tang.1.adoc[*clevis-encrypt-tang*(1)],
|
||||
diff --git a/src/pins/sss/clevis-encrypt-sss.c b/src/pins/sss/clevis-encrypt-sss.c
|
||||
index d6f2c2c..531e918 100644
|
||||
--- a/src/pins/sss/clevis-encrypt-sss.c
|
||||
+++ b/src/pins/sss/clevis-encrypt-sss.c
|
||||
@@ -86,9 +86,9 @@ npins(json_t *pins)
|
||||
}
|
||||
|
||||
static json_t *
|
||||
-encrypt_frag(json_t *sss, const char *pin, const json_t *cfg)
|
||||
+encrypt_frag(json_t *sss, const char *pin, const json_t *cfg, int assume_yes)
|
||||
{
|
||||
- char *args[] = { "clevis", "encrypt", (char *) pin, NULL, NULL };
|
||||
+ char *args[] = { "clevis", "encrypt", (char *) pin, NULL, NULL, NULL };
|
||||
json_auto_t *jwe = json_string("");
|
||||
str_auto_t *str = NULL;
|
||||
uint8_t *pnt = NULL;
|
||||
@@ -100,6 +100,10 @@ encrypt_frag(json_t *sss, const char *pin, const json_t *cfg)
|
||||
if (!str)
|
||||
return NULL;
|
||||
|
||||
+ if (assume_yes) {
|
||||
+ args[4] = "-y";
|
||||
+ }
|
||||
+
|
||||
pnt = sss_point(sss, &pntl);
|
||||
if (!pnt)
|
||||
return NULL;
|
||||
@@ -137,7 +141,7 @@ encrypt_frag(json_t *sss, const char *pin, const json_t *cfg)
|
||||
}
|
||||
|
||||
static json_t *
|
||||
-encrypt_frags(json_int_t t, json_t *pins)
|
||||
+encrypt_frags(json_int_t t, json_t *pins, int assume_yes)
|
||||
{
|
||||
const char *pname = NULL;
|
||||
json_auto_t *sss = NULL;
|
||||
@@ -172,7 +176,7 @@ encrypt_frags(json_int_t t, json_t *pins)
|
||||
json_array_foreach(pcfgs, i, pcfg) {
|
||||
json_auto_t *jwe = NULL;
|
||||
|
||||
- jwe = encrypt_frag(sss, pname, pcfg);
|
||||
+ jwe = encrypt_frag(sss, pname, pcfg, assume_yes);
|
||||
if (!jwe)
|
||||
return NULL;
|
||||
|
||||
@@ -201,14 +205,24 @@ main(int argc, char *argv[])
|
||||
const char *iv = NULL;
|
||||
json_t *pins = NULL;
|
||||
json_int_t t = 1;
|
||||
+ int assume_yes = 0;
|
||||
|
||||
if (argc == 2 && strcmp(argv[1], "--summary") == 0) {
|
||||
fprintf(stdout, "%s\n", SUMMARY);
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
- if (isatty(STDIN_FILENO) || argc != 2)
|
||||
- goto usage;
|
||||
+ if (isatty(STDIN_FILENO) || argc != 2) {
|
||||
+ if (argc != 3) {
|
||||
+ goto usage;
|
||||
+ }
|
||||
+
|
||||
+ if (strcmp(argv[2], "-y") == 0) {
|
||||
+ assume_yes = 1;
|
||||
+ } else if (strlen(argv[2]) > 0) {
|
||||
+ goto usage;
|
||||
+ }
|
||||
+ }
|
||||
|
||||
/* Parse configuration. */
|
||||
cfg = json_loads(argv[1], 0, NULL);
|
||||
@@ -228,7 +242,7 @@ main(int argc, char *argv[])
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
- sss = encrypt_frags(t, pins);
|
||||
+ sss = encrypt_frags(t, pins, assume_yes);
|
||||
if (!sss)
|
||||
return EXIT_FAILURE;
|
||||
|
||||
@@ -287,7 +301,7 @@ main(int argc, char *argv[])
|
||||
|
||||
usage:
|
||||
fprintf(stderr, "\n");
|
||||
- fprintf(stderr, "Usage: clevis encrypt sss CONFIG < PLAINTEXT > JWE\n");
|
||||
+ fprintf(stderr, "Usage: clevis encrypt sss CONFIG [-y] < PLAINTEXT > JWE\n");
|
||||
fprintf(stderr, "\n");
|
||||
fprintf(stderr, "%s\n", SUMMARY);
|
||||
fprintf(stderr, "\n");
|
||||
diff --git a/src/pins/tang/clevis-encrypt-tang b/src/pins/tang/clevis-encrypt-tang
|
||||
index 378b25d..4a43f1f 100755
|
||||
--- a/src/pins/tang/clevis-encrypt-tang
|
||||
+++ b/src/pins/tang/clevis-encrypt-tang
|
||||
@@ -28,10 +28,14 @@ fi
|
||||
if [ -t 0 ]; then
|
||||
exec >&2
|
||||
echo
|
||||
- echo "Usage: clevis encrypt tang CONFIG < PLAINTEXT > JWE"
|
||||
+ echo "Usage: clevis encrypt tang CONFIG [-y] < PLAINTEXT > JWE"
|
||||
echo
|
||||
echo "$SUMMARY"
|
||||
echo
|
||||
+ echo " -y Use this option for skipping the advertisement"
|
||||
+ echo " trust check. This can be useful in automated"
|
||||
+ echo " deployments"
|
||||
+ echo
|
||||
echo "This command uses the following configuration properties:"
|
||||
echo
|
||||
echo " url: <string> The base URL of the Tang server (REQUIRED)"
|
||||
@@ -60,6 +64,9 @@ if ! cfg="$(jose fmt -j- -Oo- <<< "$1" 2>/dev/null)"; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
+trust=
|
||||
+[ -n "${2}" ] && [ "${2}" == "-y" ] && trust=yes
|
||||
+
|
||||
if ! url="$(jose fmt -j- -Og url -u- <<< "$cfg")"; then
|
||||
echo "Missing the required 'url' property!" >&2
|
||||
exit 1
|
||||
@@ -100,18 +107,20 @@ if ! jose jws ver -i "$jws" -k- -a <<< "$ver"; then
|
||||
fi
|
||||
|
||||
### Check advertisement trust
|
||||
-if [ -z "$thp" ]; then
|
||||
- echo "The advertisement contains the following signing keys:" >&2
|
||||
- echo >&2
|
||||
- jose jwk thp -i- <<< "$ver" >&2
|
||||
- echo >&2
|
||||
- read -r -p "Do you wish to trust these keys? [ynYN] " ans < /dev/tty
|
||||
- [[ "$ans" =~ ^[yY]$ ]] || exit 1
|
||||
-
|
||||
-elif [ "$thp" != "any" ] && \
|
||||
- ! jose jwk thp -i- -f "$thp" -o /dev/null <<< "$ver"; then
|
||||
- echo "Trusted JWK '$thp' did not sign the advertisement!" >&2
|
||||
- exit 1
|
||||
+if [ -z "${trust}" ]; then
|
||||
+ if [ -z "$thp" ]; then
|
||||
+ echo "The advertisement contains the following signing keys:" >&2
|
||||
+ echo >&2
|
||||
+ jose jwk thp -i- <<< "$ver" >&2
|
||||
+ echo >&2
|
||||
+ read -r -p "Do you wish to trust these keys? [ynYN] " ans < /dev/tty
|
||||
+ [[ "$ans" =~ ^[yY]$ ]] || exit 1
|
||||
+
|
||||
+ elif [ "$thp" != "any" ] && \
|
||||
+ ! jose jwk thp -i- -f "$thp" -o /dev/null <<< "$ver"; then
|
||||
+ echo "Trusted JWK '$thp' did not sign the advertisement!" >&2
|
||||
+ exit 1
|
||||
+ fi
|
||||
fi
|
||||
|
||||
### Perform encryption
|
||||
diff --git a/src/pins/tang/clevis-encrypt-tang.1.adoc b/src/pins/tang/clevis-encrypt-tang.1.adoc
|
||||
index 276575f..c34d109 100644
|
||||
--- a/src/pins/tang/clevis-encrypt-tang.1.adoc
|
||||
+++ b/src/pins/tang/clevis-encrypt-tang.1.adoc
|
||||
@@ -9,7 +9,7 @@ clevis-encrypt-tang - Encrypts using a Tang binding server policy
|
||||
|
||||
== SYNOPSIS
|
||||
|
||||
-*clevis encrypt tang* CONFIG < PT > JWE
|
||||
+*clevis encrypt tang* CONFIG [-y] < PT > JWE
|
||||
|
||||
== OVERVIEW
|
||||
|
||||
@@ -76,6 +76,15 @@ This command uses the following configuration properties:
|
||||
* *adv* (object) :
|
||||
A trusted advertisement (raw JSON)
|
||||
|
||||
+== OPTIONS
|
||||
+
|
||||
+* *-y* :
|
||||
+ Automatically answer yes for all questions. Use this option for skipping
|
||||
+ the advertisement trust check. This can be useful in automated deployments:
|
||||
+
|
||||
+ $ clevis encrypt tang '{"url":...}' -y < PT > JWE
|
||||
+
|
||||
+
|
||||
== SEE ALSO
|
||||
|
||||
link:clevis-decrypt.1.adoc[*clevis-decrypt*(1)]
|
||||
--
|
||||
2.18.4
|
||||
|
1036
SOURCES/0010-Add-clevis-luks-edit-command.patch
Normal file
1036
SOURCES/0010-Add-clevis-luks-edit-command.patch
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,34 +0,0 @@
|
||||
From 6826e5d31d6323eac5137404f0194bf2183b561c Mon Sep 17 00:00:00 2001
|
||||
From: Javier Martinez Canillas <javierm@redhat.com>
|
||||
Date: Wed, 7 Nov 2018 16:48:47 +0100
|
||||
Subject: [PATCH 3/3] Add device TCTI library to the initramfs
|
||||
|
||||
The tpm2-tools don't dynamically link against the TCTI libraries anymore,
|
||||
but instead dlopen() the correct library depending on the TCTI used.
|
||||
|
||||
So dracut isn't able anymore to figure out automatically using ldd what
|
||||
libraries are needed by the tpm2-tools. Since clevis uses the device TCTI
|
||||
to access the TPM directly, add the libtss2-tcti-device.so to the initrd.
|
||||
|
||||
Suggested-by: Federico Chiacchiaretta <federico.chia@gmail.com>
|
||||
|
||||
Fixes: ##74
|
||||
---
|
||||
src/luks/systemd/dracut/module-setup.sh.in | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/src/luks/systemd/dracut/module-setup.sh.in b/src/luks/systemd/dracut/module-setup.sh.in
|
||||
index 41e7d6c9b002..990bf4aeed56 100755
|
||||
--- a/src/luks/systemd/dracut/module-setup.sh.in
|
||||
+++ b/src/luks/systemd/dracut/module-setup.sh.in
|
||||
@@ -65,6 +65,7 @@ install() {
|
||||
tpm2_pcrlist \
|
||||
tpm2_unseal \
|
||||
tpm2_load
|
||||
+ inst_libdir_file "libtss2-tcti-device.so*"
|
||||
fi
|
||||
|
||||
dracut_need_initqueue
|
||||
--
|
||||
2.19.1
|
||||
|
@ -1,57 +0,0 @@
|
||||
From 25009adea66d3bf9b73f128273de28e532b03281 Mon Sep 17 00:00:00 2001
|
||||
From: Sergio Correia <scorreia@redhat.com>
|
||||
Date: Sat, 30 Nov 2019 18:23:09 -0500
|
||||
Subject: [PATCH] Add rd.neednet=1 to cmdline only if there are devices bound
|
||||
to tang
|
||||
|
||||
---
|
||||
src/luks/systemd/dracut/module-setup.sh.in | 24 ++++++++++++++++++----
|
||||
1 file changed, 20 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/src/luks/systemd/dracut/module-setup.sh.in b/src/luks/systemd/dracut/module-setup.sh.in
|
||||
index 990bf4a..841f7a8 100755
|
||||
--- a/src/luks/systemd/dracut/module-setup.sh.in
|
||||
+++ b/src/luks/systemd/dracut/module-setup.sh.in
|
||||
@@ -18,19 +18,35 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
+is_bound_to_tang() {
|
||||
+ local dev
|
||||
+ for dev in $(lsblk -p -n -s -r \
|
||||
+ | awk '$6 == "crypt" { getline; print $1 }' | sort -u); do
|
||||
+ if clevis luks list -d "${dev}" 2>/dev/null | grep -q tang; then
|
||||
+ return 0
|
||||
+ fi
|
||||
+ done
|
||||
+ return 1
|
||||
+}
|
||||
+
|
||||
depends() {
|
||||
- echo crypt systemd network
|
||||
- return 0
|
||||
+ local depends="crypt systemd"
|
||||
+ if is_bound_to_tang; then
|
||||
+ depends=$(printf "%s network" "${depends}")
|
||||
+ fi
|
||||
+ echo "${depends}"
|
||||
}
|
||||
|
||||
-cmdline() {
|
||||
+tang_cmdline() {
|
||||
echo "rd.neednet=1"
|
||||
}
|
||||
|
||||
install() {
|
||||
local ret=0
|
||||
|
||||
- cmdline > "${initdir}/etc/cmdline.d/99clevis.conf"
|
||||
+ if is_bound_to_tang; then
|
||||
+ tang_cmdline > "${initdir}/etc/cmdline.d/99clevis.conf"
|
||||
+ fi
|
||||
|
||||
inst_hook initqueue/online 60 "$moddir/clevis-hook.sh"
|
||||
inst_hook initqueue/settled 60 "$moddir/clevis-hook.sh"
|
||||
--
|
||||
2.18.1
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,77 +0,0 @@
|
||||
From 53ecfcf6d934206e3daef4ed3515a0d6f098e276 Mon Sep 17 00:00:00 2001
|
||||
From: Sergio Correia <scorreia@redhat.com>
|
||||
Date: Wed, 16 Oct 2019 11:40:33 -0300
|
||||
Subject: [PATCH 1/2] Adjust pin-tang test to account for newer tang without
|
||||
tangd-update
|
||||
|
||||
---
|
||||
src/pins/tang/meson.build | 9 ++-------
|
||||
src/pins/tang/pin-tang | 11 ++++++++---
|
||||
2 files changed, 10 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/src/pins/tang/meson.build b/src/pins/tang/meson.build
|
||||
index 110d72d..061a79f 100644
|
||||
--- a/src/pins/tang/meson.build
|
||||
+++ b/src/pins/tang/meson.build
|
||||
@@ -8,11 +8,6 @@ kgen = find_program(
|
||||
'/usr/libexec/tangd-keygen',
|
||||
required: false
|
||||
)
|
||||
-updt = find_program(
|
||||
- join_paths(libexecdir, 'tangd-update'),
|
||||
- '/usr/libexec/tangd-update',
|
||||
- required: false
|
||||
-)
|
||||
tang = find_program(
|
||||
join_paths(libexecdir, 'tangd'),
|
||||
'/usr/libexec/tangd',
|
||||
@@ -25,7 +20,7 @@ if curl.found()
|
||||
bins += join_paths(meson.current_source_dir(), 'clevis-encrypt-tang')
|
||||
mans += join_paths(meson.current_source_dir(), 'clevis-encrypt-tang.1')
|
||||
|
||||
- if actv.found() and kgen.found() and updt.found() and tang.found()
|
||||
+ if actv.found() and kgen.found() and tang.found()
|
||||
env = environment()
|
||||
env.set('SD_ACTIVATE', actv.path())
|
||||
env.append('PATH',
|
||||
@@ -42,4 +37,4 @@ if curl.found()
|
||||
endif
|
||||
else
|
||||
warning('Will not install tang pin due to missing dependencies!')
|
||||
-endif
|
||||
\ No newline at end of file
|
||||
+endif
|
||||
diff --git a/src/pins/tang/pin-tang b/src/pins/tang/pin-tang
|
||||
index f420818..9dcc2da 100755
|
||||
--- a/src/pins/tang/pin-tang
|
||||
+++ b/src/pins/tang/pin-tang
|
||||
@@ -31,18 +31,23 @@ mkdir -p $TMP/db
|
||||
mkdir -p $TMP/cache
|
||||
|
||||
# Generate the server keys
|
||||
+KEYS=$TMP/db
|
||||
tangd-keygen $TMP/db sig exc
|
||||
-tangd-update $TMP/db $TMP/cache
|
||||
+if which tangd-update; then
|
||||
+ tangd-update $TMP/db $TMP/cache
|
||||
+ KEYS=$TMP/cache
|
||||
+fi
|
||||
|
||||
# Start the server
|
||||
port=`shuf -i 1024-65536 -n 1`
|
||||
-$SD_ACTIVATE --inetd -l 127.0.0.1:$port -a tangd $TMP/cache &
|
||||
+$SD_ACTIVATE --inetd -l 127.0.0.1:$port -a tangd $KEYS &
|
||||
export PID=$!
|
||||
sleep 0.25
|
||||
|
||||
thp=`jose jwk thp -i "$TMP/db/sig.jwk"`
|
||||
-adv="$TMP/cache/default.jws"
|
||||
url="http://localhost:${port}"
|
||||
+adv="$TMP/adv"
|
||||
+curl "$url/adv" -o $adv
|
||||
|
||||
cfg=`printf '{"url":"%s","adv":"%s"}' "$url" "$adv"`
|
||||
enc=`echo -n "hi" | clevis encrypt tang "$cfg"`
|
||||
--
|
||||
2.21.0
|
||||
|
@ -1,30 +0,0 @@
|
||||
From 8b707e8bfcbfd073579ee553b982b4784490f5ea Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Kopecek <dkopecek@redhat.com>
|
||||
Date: Wed, 5 Dec 2018 13:18:59 +0100
|
||||
Subject: [PATCH] clevis-encrypt-tang: check key derivation key is available
|
||||
before encryption
|
||||
|
||||
---
|
||||
src/pins/tang/clevis-encrypt-tang | 6 +++++-
|
||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/pins/tang/clevis-encrypt-tang b/src/pins/tang/clevis-encrypt-tang
|
||||
index e65a7d1..7fc55ca 100755
|
||||
--- a/src/pins/tang/clevis-encrypt-tang
|
||||
+++ b/src/pins/tang/clevis-encrypt-tang
|
||||
@@ -114,7 +114,11 @@ elif [ "$thp" != "any" ] && \
|
||||
fi
|
||||
|
||||
### Perform encryption
|
||||
-enc=`jose jwk use -i- -r -u deriveKey -o- <<< "$jwks"`
|
||||
+if ! enc=`jose jwk use -i- -r -u deriveKey -o- <<< "$jwks"`; then
|
||||
+ echo "Key derivation key not available!" >&2
|
||||
+ exit 1
|
||||
+fi
|
||||
+
|
||||
jose fmt -j "$enc" -Og keys -A || enc="{\"keys\":[$enc]}"
|
||||
|
||||
for jwk in `jose fmt -j- -Og keys -Af- <<< "$enc"`; do
|
||||
--
|
||||
2.13.6
|
||||
|
@ -1,132 +0,0 @@
|
||||
From 1e344dbf6a60fcd2c60a4b8512be455e112d8398 Mon Sep 17 00:00:00 2001
|
||||
From: Javier Martinez Canillas <javierm@redhat.com>
|
||||
Date: Wed, 7 Nov 2018 14:53:08 +0100
|
||||
Subject: [PATCH 1/3] Delete remaining references to the removed http pin
|
||||
|
||||
Commit 800d73185d7f ("Remove HTTP pin") removed the clevis http pin, but
|
||||
there are still references of it in the docs and also the dracut module.
|
||||
|
||||
This was causing dracut to fail building the initramfs due the following:
|
||||
|
||||
dracut-install: ERROR: installing 'clevis-decrypt-http'
|
||||
|
||||
Suggested-by: Dominick Grift <dac.override@gmail.com>
|
||||
|
||||
Fixes: #73
|
||||
---
|
||||
README.md | 21 ---------------------
|
||||
src/clevis.1.adoc | 21 ---------------------
|
||||
src/luks/clevis-luks-bind.1.adoc | 1 -
|
||||
src/luks/systemd/dracut/module-setup.sh.in | 1 -
|
||||
src/pins/sss/clevis-encrypt-sss.1.adoc | 1 -
|
||||
5 files changed, 45 deletions(-)
|
||||
|
||||
diff --git a/README.md b/README.md
|
||||
index ce8def12ec96..d57339aca5d9 100644
|
||||
--- a/README.md
|
||||
+++ b/README.md
|
||||
@@ -58,27 +58,6 @@ advertisement is stored, or the JSON contents of the advertisment itself. When
|
||||
the advertisment is specified manually like this, Clevis presumes that the
|
||||
advertisement is trusted.
|
||||
|
||||
-#### PIN: HTTP
|
||||
-
|
||||
-Clevis also ships a pin for performing escrow using HTTP. Please note that,
|
||||
-at this time, this pin does not provide HTTPS support and is suitable only
|
||||
-for use over local sockets. This provides integration with services like
|
||||
-[Custodia](http://github.com/latchset/custodia).
|
||||
-
|
||||
-For example:
|
||||
-
|
||||
-```bash
|
||||
-$ echo hi | clevis encrypt http '{"url": "http://server.local/key"}' > hi.jwe
|
||||
-```
|
||||
-
|
||||
-The HTTP pin generate a new (cryptographically-strong random) key and performs
|
||||
-encryption using it. It then performs a PUT request to the URL specified. It is
|
||||
-understood that the server will securely store this key for later retrieval.
|
||||
-During decryption, the pin will perform a GET request to retrieve the key and
|
||||
-perform decryption.
|
||||
-
|
||||
-Patches to provide support for HTTPS and authentication are welcome.
|
||||
-
|
||||
#### PIN: TPM2
|
||||
|
||||
Clevis provides support to encrypt a key in a Trusted Platform Module 2.0 (TPM2)
|
||||
diff --git a/src/clevis.1.adoc b/src/clevis.1.adoc
|
||||
index 756aba57a4c8..dea0a696f5f7 100644
|
||||
--- a/src/clevis.1.adoc
|
||||
+++ b/src/clevis.1.adoc
|
||||
@@ -21,26 +21,6 @@ take a policy as its first argument and plaintext on standard input and to
|
||||
encrypt the data so that it can be automatically decrypted if the policy is
|
||||
met. Lets walk through an example.
|
||||
|
||||
-== HTTP ESCROW
|
||||
-
|
||||
-When using the HTTP pin, we create a new, cryptographically-strong, random key.
|
||||
-This key is stored in a remote HTTP escrow server (using a simple PUT or POST).
|
||||
-Then at decryption time, we attempt to fetch the key back again in order to
|
||||
-decrypt our data. So, for our configuration we need to pass the URL to the key
|
||||
-location:
|
||||
-
|
||||
- $ clevis encrypt http '{"url":"https://escrow.srv/1234"}' < PT > JWE
|
||||
-
|
||||
-To decrypt the data, simply provide the ciphertext (JWE):
|
||||
-
|
||||
- $ clevis decrypt < JWE > PLAINTEXT
|
||||
-
|
||||
-Notice that we did not pass any configuration during decryption. The decrypt
|
||||
-command extracted the URL (and possibly other configuration) from the JWE
|
||||
-object, fetched the encryption key from the escrow and performed decryption.
|
||||
-
|
||||
-For more information, see link:clevis-encrypt-http.1.adoc[*clevis-encrypt-http*(1)].
|
||||
-
|
||||
== TANG BINDING
|
||||
|
||||
Clevis provides support for the Tang network binding server. Tang provides
|
||||
@@ -136,7 +116,6 @@ For more information, see link:clevis-luks-bind.1.adoc[*clevis-luks-bind*(1)].
|
||||
|
||||
== SEE ALSO
|
||||
|
||||
-link:clevis-encrypt-http.1.adoc[*clevis-encrypt-http*(1)],
|
||||
link:clevis-encrypt-tang.1.adoc[*clevis-encrypt-tang*(1)],
|
||||
link:clevis-encrypt-tpm2.1.adoc[*clevis-encrypt-tpm2*(1)],
|
||||
link:clevis-encrypt-sss.1.adoc[*clevis-encrypt-sss*(1)],
|
||||
diff --git a/src/luks/clevis-luks-bind.1.adoc b/src/luks/clevis-luks-bind.1.adoc
|
||||
index 9f3a880cfb0c..0d649e3ec28b 100644
|
||||
--- a/src/luks/clevis-luks-bind.1.adoc
|
||||
+++ b/src/luks/clevis-luks-bind.1.adoc
|
||||
@@ -61,7 +61,6 @@ The images cannot be shared without also sharing a master key.
|
||||
== SEE ALSO
|
||||
|
||||
link:clevis-luks-unlockers.7.adoc[*clevis-luks-unlockers*(7)],
|
||||
-link:clevis-encrypt-http.1.adoc[*clevis-encrypt-http*(1)],
|
||||
link:clevis-encrypt-tang.1.adoc[*clevis-encrypt-tang*(1)],
|
||||
link:clevis-encrypt-sss.1.adoc[*clevis-encrypt-sss*(1)],
|
||||
link:clevis-decrypt.1.adoc[*clevis-decrypt*(1)]
|
||||
diff --git a/src/luks/systemd/dracut/module-setup.sh.in b/src/luks/systemd/dracut/module-setup.sh.in
|
||||
index 119762e38326..48aea5b3f29a 100755
|
||||
--- a/src/luks/systemd/dracut/module-setup.sh.in
|
||||
+++ b/src/luks/systemd/dracut/module-setup.sh.in
|
||||
@@ -36,7 +36,6 @@ install() {
|
||||
inst_hook initqueue/settled 60 "$moddir/clevis-hook.sh"
|
||||
|
||||
inst_multiple /etc/services \
|
||||
- clevis-decrypt-http \
|
||||
clevis-decrypt-tang \
|
||||
clevis-decrypt-sss \
|
||||
@libexecdir@/clevis-luks-askpass \
|
||||
diff --git a/src/pins/sss/clevis-encrypt-sss.1.adoc b/src/pins/sss/clevis-encrypt-sss.1.adoc
|
||||
index d46498db328c..7144e7e9ea96 100644
|
||||
--- a/src/pins/sss/clevis-encrypt-sss.1.adoc
|
||||
+++ b/src/pins/sss/clevis-encrypt-sss.1.adoc
|
||||
@@ -54,6 +54,5 @@ receive key fragments.
|
||||
|
||||
== SEE ALSO
|
||||
|
||||
-link:clevis-encrypt-http.1.adoc[*clevis-encrypt-http*(1)],
|
||||
link:clevis-encrypt-tang.1.adoc[*clevis-encrypt-tang*(1)],
|
||||
link:clevis-decrypt.1.adoc[*clevis-decrypt*(1)]
|
||||
--
|
||||
2.19.1
|
||||
|
@ -1,42 +0,0 @@
|
||||
From 02f17448e379c92745f8203f47e5de0725b1c1b6 Mon Sep 17 00:00:00 2001
|
||||
From: Sergio Correia <scorreia@redhat.com>
|
||||
Date: Fri, 18 Oct 2019 09:04:22 -0300
|
||||
Subject: [PATCH] Improve error message when bind is given an invalid PIN
|
||||
|
||||
---
|
||||
src/luks/clevis-luks-bind | 7 ++++++-
|
||||
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/luks/clevis-luks-bind b/src/luks/clevis-luks-bind
|
||||
index 7aae2ea..1b5caf2 100755
|
||||
--- a/src/luks/clevis-luks-bind
|
||||
+++ b/src/luks/clevis-luks-bind
|
||||
@@ -19,6 +19,8 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
+. clevis-luks-common-functions
|
||||
+
|
||||
SUMMARY="Binds a LUKS device using the specified policy"
|
||||
UUID=cb6e8904-81ff-40da-a84a-07ab9ab5715e
|
||||
|
||||
@@ -68,6 +70,9 @@ fi
|
||||
if ! PIN=${@:$((OPTIND++)):1} || [ -z "$PIN" ]; then
|
||||
echo "Did not specify a pin!" >&2
|
||||
usage
|
||||
+elif ! EXE=$(findexe clevis-encrypt-"${PIN}"); then
|
||||
+ echo "'$PIN' is not a valid pin!" >&2
|
||||
+ usage
|
||||
fi
|
||||
|
||||
if ! CFG=${@:$((OPTIND++)):1} || [ -z "$CFG" ]; then
|
||||
@@ -142,4 +147,4 @@ else
|
||||
cryptsetup luksRemoveKey "$DEV" <<<"$key"
|
||||
exit 1
|
||||
fi
|
||||
-fi
|
||||
\ No newline at end of file
|
||||
+fi
|
||||
--
|
||||
2.21.0
|
||||
|
@ -1,60 +0,0 @@
|
||||
From 874ee402645f9c3c40eaf5882a9cb92bc88b1a8f Mon Sep 17 00:00:00 2001
|
||||
From: Sergio Correia <scorreia@redhat.com>
|
||||
Date: Sun, 22 Dec 2019 16:46:19 -0500
|
||||
Subject: [PATCH] Improve tests speed Also run tests only as root, if they
|
||||
involve cryptsetup
|
||||
|
||||
---
|
||||
src/luks/tests/tests-common-functions | 16 +++++++++++++---
|
||||
1 file changed, 13 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/luks/tests/tests-common-functions b/src/luks/tests/tests-common-functions
|
||||
index b65a84a..7758876 100644
|
||||
--- a/src/luks/tests/tests-common-functions
|
||||
+++ b/src/luks/tests/tests-common-functions
|
||||
@@ -25,6 +25,11 @@ luks2_supported() {
|
||||
return 0
|
||||
}
|
||||
|
||||
+skip_test() {
|
||||
+ echo "${1}" >&2
|
||||
+ exit 77
|
||||
+}
|
||||
+
|
||||
# Creates a tang adv to be used in the test.
|
||||
create_tang_adv() {
|
||||
local adv="${1}"
|
||||
@@ -39,14 +44,18 @@ create_tang_adv() {
|
||||
| jose jws sig -I- -s "${TEMPLATE}" -k "${SIG}" -o "${adv}"
|
||||
}
|
||||
|
||||
-
|
||||
# Creates a new LUKS1 or LUKS2 device to be used.
|
||||
new_device() {
|
||||
local LUKS="${1}"
|
||||
local DEV="${2}"
|
||||
-
|
||||
local DEV_CACHED="${TMP}/${LUKS}.cached"
|
||||
|
||||
+ # Some builders fail if the cryptsetup steps are not ran as root, so let's
|
||||
+ # skip the test now if not running as root.
|
||||
+ if [ $(id -u) != 0 ]; then
|
||||
+ skip_test "WARNING: You must be root to run this test; test skipped."
|
||||
+ fi
|
||||
+
|
||||
# Let's reuse an existing device, if there is one.
|
||||
if [ -f "${DEV_CACHED}" ]; then
|
||||
echo "Reusing cached ${LUKS} device..."
|
||||
@@ -55,7 +64,8 @@ new_device() {
|
||||
fi
|
||||
|
||||
fallocate -l16M "${DEV}"
|
||||
- cryptsetup luksFormat --type "${LUKS}" --batch-mode --force-password "${DEV}" <<< "${DEFAULT_PASS}"
|
||||
+ local extra_options='--pbkdf pbkdf2 --pbkdf-force-iterations 1000'
|
||||
+ cryptsetup luksFormat --type "${LUKS}" ${extra_options} --batch-mode --force-password "${DEV}" <<< "${DEFAULT_PASS}"
|
||||
# Caching the just-formatted device for possible reuse.
|
||||
cp -f "${DEV}" "${DEV_CACHED}"
|
||||
}
|
||||
--
|
||||
2.18.1
|
||||
|
@ -1,49 +0,0 @@
|
||||
From 34658590e45ab85f6008379d9433406a5c7fd914 Mon Sep 17 00:00:00 2001
|
||||
From: Javier Martinez Canillas <javierm@redhat.com>
|
||||
Date: Wed, 7 Nov 2018 15:12:17 +0100
|
||||
Subject: [PATCH 2/3] Install cryptsetup and tpm2_pcrlist in the initramfs
|
||||
|
||||
The cryptsetup and tpm2_pcrlist are missing in the initramfs, this makes
|
||||
automatic LUKS unlocking fail with the following errors:
|
||||
|
||||
dracut-initqueue[382]: /usr/libexec/clevis-luks-askpass: line 52: cryptsetup: command not found
|
||||
dracut-initqueue[382]: /usr/bin/clevis-decrypt-tpm2: line 40: tpm2_pcrlist: command not found
|
||||
|
||||
Suggested-by: Federico Chiacchiaretta <federico.chia@gmail.com>
|
||||
|
||||
Fixes: #74
|
||||
---
|
||||
src/luks/systemd/dracut/module-setup.sh.in | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/src/luks/systemd/dracut/module-setup.sh.in b/src/luks/systemd/dracut/module-setup.sh.in
|
||||
index 48aea5b3f29a..41e7d6c9b002 100755
|
||||
--- a/src/luks/systemd/dracut/module-setup.sh.in
|
||||
+++ b/src/luks/systemd/dracut/module-setup.sh.in
|
||||
@@ -40,6 +40,7 @@ install() {
|
||||
clevis-decrypt-sss \
|
||||
@libexecdir@/clevis-luks-askpass \
|
||||
clevis-decrypt \
|
||||
+ cryptsetup \
|
||||
luksmeta \
|
||||
clevis \
|
||||
mktemp \
|
||||
@@ -49,6 +50,7 @@ install() {
|
||||
|
||||
for cmd in clevis-decrypt-tpm2 \
|
||||
tpm2_createprimary \
|
||||
+ tpm2_pcrlist \
|
||||
tpm2_unseal \
|
||||
tpm2_load; do
|
||||
|
||||
@@ -60,6 +62,7 @@ install() {
|
||||
if (($ret == 0)); then
|
||||
inst_multiple clevis-decrypt-tpm2 \
|
||||
tpm2_createprimary \
|
||||
+ tpm2_pcrlist \
|
||||
tpm2_unseal \
|
||||
tpm2_load
|
||||
fi
|
||||
--
|
||||
2.19.1
|
||||
|
@ -1,237 +0,0 @@
|
||||
From 523f1361c759d5af0952b0137d4dbd51be1e7b3d Mon Sep 17 00:00:00 2001
|
||||
From: Sergio Correia <scorreia@redhat.com>
|
||||
Date: Sun, 22 Dec 2019 17:01:09 -0500
|
||||
Subject: [PATCH] Use one clevis-luks-askpass per device
|
||||
|
||||
This should improve the reliability of the boot unlocking, especially
|
||||
when unlocking multiple devices upon boot.
|
||||
|
||||
It also greatly simplifies the configuration, as three is no need to
|
||||
enable any systemd units manually nor add _netdev to either fstab or
|
||||
crypttab.
|
||||
---
|
||||
src/luks/clevis-luks-unlockers.7.adoc | 16 +++----------
|
||||
src/luks/systemd/clevis-luks-askpass | 7 +++++-
|
||||
src/luks/systemd/clevis-luks-askpass.path | 10 --------
|
||||
.../systemd/clevis-luks-askpass.service.in | 8 -------
|
||||
src/luks/systemd/clevis-luks-askpass@.path | 12 ++++++++++
|
||||
.../systemd/clevis-luks-askpass@.service.in | 9 +++++++
|
||||
src/luks/systemd/dracut/module-setup.sh.in | 24 +++++++++++++++++++
|
||||
src/luks/systemd/meson.build | 8 +++----
|
||||
8 files changed, 58 insertions(+), 36 deletions(-)
|
||||
delete mode 100644 src/luks/systemd/clevis-luks-askpass.path
|
||||
delete mode 100644 src/luks/systemd/clevis-luks-askpass.service.in
|
||||
create mode 100644 src/luks/systemd/clevis-luks-askpass@.path
|
||||
create mode 100644 src/luks/systemd/clevis-luks-askpass@.service.in
|
||||
|
||||
diff --git a/src/luks/clevis-luks-unlockers.7.adoc b/src/luks/clevis-luks-unlockers.7.adoc
|
||||
index 161b73a..e8d47ba 100644
|
||||
--- a/src/luks/clevis-luks-unlockers.7.adoc
|
||||
+++ b/src/luks/clevis-luks-unlockers.7.adoc
|
||||
@@ -26,7 +26,7 @@ You can unlock a LUKS volume manually using the following command:
|
||||
|
||||
For more information, see link:clevis-luks-unlock.1.adoc[*clevis-luks-unlock*(1)].
|
||||
|
||||
-== EARLY BOOT UNLOCKING
|
||||
+== BOOT UNLOCKING
|
||||
|
||||
If Clevis integration does not already ship in your initramfs, you may need to
|
||||
rebuild your initramfs with this command:
|
||||
@@ -34,23 +34,13 @@ rebuild your initramfs with this command:
|
||||
$ sudo dracut -f
|
||||
|
||||
Once Clevis is integrated into your initramfs, a simple reboot should unlock
|
||||
-your root volume. Note, however, that early boot integration only works for the
|
||||
-root volume. Non-root volumes should use the late boot unlocker.
|
||||
+your clevis-bound volumes. Root volumes will be unlocked in early-boot, while the
|
||||
+remaining volumes will be unlocked after dracut switch-root.
|
||||
|
||||
Dracut will bring up your network using DHCP by default. If you need to specify
|
||||
additional network parameters, such as static IP configuration, please consult
|
||||
the dracut documentation.
|
||||
|
||||
-== LATE BOOT UNLOCKING
|
||||
-
|
||||
-You can enable late boot unlocking by executing the following command:
|
||||
-
|
||||
- $ sudo systemctl enable clevis-luks-askpass.path
|
||||
-
|
||||
-After a reboot, Clevis will attempt to unlock all *_netdev* devices listed in
|
||||
-*/etc/crypttab* when systemd prompts for their passwords. This implies that
|
||||
-systemd support for *_netdev* is required.
|
||||
-
|
||||
== DESKTOP UNLOCKING
|
||||
|
||||
When the udisks2 unlocker is installed, your GNOME desktop session should
|
||||
diff --git a/src/luks/systemd/clevis-luks-askpass b/src/luks/systemd/clevis-luks-askpass
|
||||
index b01d93a..feebb1a 100755
|
||||
--- a/src/luks/systemd/clevis-luks-askpass
|
||||
+++ b/src/luks/systemd/clevis-luks-askpass
|
||||
@@ -24,15 +24,17 @@ UUID=cb6e8904-81ff-40da-a84a-07ab9ab5715e
|
||||
shopt -s nullglob
|
||||
|
||||
path=/run/systemd/ask-password
|
||||
-while getopts ":lp:" o; do
|
||||
+while getopts ":lpu:" o; do
|
||||
case "$o" in
|
||||
l) loop=true;;
|
||||
p) path=$OPTARG;;
|
||||
+ u) device_uuid=$OPTARG;;
|
||||
esac
|
||||
done
|
||||
|
||||
while true; do
|
||||
todo=0
|
||||
+ [ -n "${device_uuid}" ] && todo=1 && loop=true
|
||||
|
||||
for question in $path/ask.*; do
|
||||
metadata=false
|
||||
@@ -48,6 +50,8 @@ while true; do
|
||||
done < "$question"
|
||||
|
||||
[ -z "$d" -o -z "$s" ] && continue
|
||||
+ [[ -n "${device_uuid}" ]] && [[ "${d}" != *"${device_uuid}"* ]] \
|
||||
+ && continue
|
||||
|
||||
if cryptsetup isLuks --type luks1 "$d"; then
|
||||
# If the device is not initialized, sliently skip it.
|
||||
@@ -79,6 +83,7 @@ while true; do
|
||||
done
|
||||
fi
|
||||
|
||||
+ [ -n "${device_uuid}" ] && [ "${unlocked}" == true ] && todo=0 && break
|
||||
[ $metadata == true ] || continue
|
||||
[ $unlocked == true ] && continue
|
||||
todo=$((todo + 1))
|
||||
diff --git a/src/luks/systemd/clevis-luks-askpass.path b/src/luks/systemd/clevis-luks-askpass.path
|
||||
deleted file mode 100644
|
||||
index a4d01ba..0000000
|
||||
--- a/src/luks/systemd/clevis-luks-askpass.path
|
||||
+++ /dev/null
|
||||
@@ -1,10 +0,0 @@
|
||||
-[Unit]
|
||||
-Description=Clevis systemd-ask-password Watcher
|
||||
-Before=remote-fs-pre.target
|
||||
-Wants=remote-fs-pre.target
|
||||
-
|
||||
-[Path]
|
||||
-PathChanged=/run/systemd/ask-password
|
||||
-
|
||||
-[Install]
|
||||
-WantedBy=remote-fs.target
|
||||
diff --git a/src/luks/systemd/clevis-luks-askpass.service.in b/src/luks/systemd/clevis-luks-askpass.service.in
|
||||
deleted file mode 100644
|
||||
index 2c6bbed..0000000
|
||||
--- a/src/luks/systemd/clevis-luks-askpass.service.in
|
||||
+++ /dev/null
|
||||
@@ -1,8 +0,0 @@
|
||||
-[Unit]
|
||||
-Description=Clevis LUKS systemd-ask-password Responder
|
||||
-Requires=network-online.target
|
||||
-After=network-online.target
|
||||
-
|
||||
-[Service]
|
||||
-Type=oneshot
|
||||
-ExecStart=@libexecdir@/clevis-luks-askpass -l
|
||||
diff --git a/src/luks/systemd/clevis-luks-askpass@.path b/src/luks/systemd/clevis-luks-askpass@.path
|
||||
new file mode 100644
|
||||
index 0000000..3f23665
|
||||
--- /dev/null
|
||||
+++ b/src/luks/systemd/clevis-luks-askpass@.path
|
||||
@@ -0,0 +1,12 @@
|
||||
+[Unit]
|
||||
+Description=Clevis systemd-ask-password Watcher for %i
|
||||
+DefaultDependencies=no
|
||||
+Conflicts=shutdown.target
|
||||
+Before=basic.target shutdown.target
|
||||
+
|
||||
+[Path]
|
||||
+DirectoryNotEmpty=/run/systemd/ask-password
|
||||
+MakeDirectory=yes
|
||||
+
|
||||
+[Install]
|
||||
+WantedBy=basic.target
|
||||
diff --git a/src/luks/systemd/clevis-luks-askpass@.service.in b/src/luks/systemd/clevis-luks-askpass@.service.in
|
||||
new file mode 100644
|
||||
index 0000000..cd26eb2
|
||||
--- /dev/null
|
||||
+++ b/src/luks/systemd/clevis-luks-askpass@.service.in
|
||||
@@ -0,0 +1,9 @@
|
||||
+[Unit]
|
||||
+Description=Clevis LUKS systemd-ask-password Responder for luks-%i
|
||||
+DefaultDependencies=no
|
||||
+Conflicts=shutdown.target
|
||||
+Before=shutdown.target
|
||||
+
|
||||
+[Service]
|
||||
+Type=oneshot
|
||||
+ExecStart=@libexecdir@/clevis-luks-askpass -u %i
|
||||
diff --git a/src/luks/systemd/dracut/module-setup.sh.in b/src/luks/systemd/dracut/module-setup.sh.in
|
||||
index 841f7a8..1877715 100755
|
||||
--- a/src/luks/systemd/dracut/module-setup.sh.in
|
||||
+++ b/src/luks/systemd/dracut/module-setup.sh.in
|
||||
@@ -29,6 +29,29 @@ is_bound_to_tang() {
|
||||
return 1
|
||||
}
|
||||
|
||||
+configure_passwd_watchers() {
|
||||
+ if ! command -v systemctl >/dev/null; then
|
||||
+ return 1
|
||||
+ fi
|
||||
+
|
||||
+ local proc_cmdline
|
||||
+ proc_cmdline=$(</proc/cmdline)
|
||||
+
|
||||
+ local luks_uuid
|
||||
+ local cfg
|
||||
+ for dev in $(lsblk -p -n -s -r \
|
||||
+ | awk '$6 == "crypt" { getline; print $1 }' | sort -u); do
|
||||
+ luks_uuid=$(cryptsetup luksUUID "${dev}")
|
||||
+ [[ "${proc_cmdline}" == *"rd.luks.uuid=luks-${luks_uuid}"* ]] && continue
|
||||
+
|
||||
+ if cfg=$(clevis luks list -d "${dev}" 2>/dev/null); then
|
||||
+ local action=enable
|
||||
+ [ -z "${cfg}" ] && action=disable
|
||||
+ systemctl "${action}" "clevis-luks-askpass@${luks_uuid}.path" 2>/dev/null
|
||||
+ fi
|
||||
+ done
|
||||
+}
|
||||
+
|
||||
depends() {
|
||||
local depends="crypt systemd"
|
||||
if is_bound_to_tang; then
|
||||
@@ -84,6 +107,7 @@ install() {
|
||||
inst_libdir_file "libtss2-tcti-device.so*"
|
||||
fi
|
||||
|
||||
+ configure_passwd_watchers
|
||||
dracut_need_initqueue
|
||||
}
|
||||
|
||||
diff --git a/src/luks/systemd/meson.build b/src/luks/systemd/meson.build
|
||||
index 108e9d8..334e84c 100644
|
||||
--- a/src/luks/systemd/meson.build
|
||||
+++ b/src/luks/systemd/meson.build
|
||||
@@ -6,14 +6,14 @@ if systemd.found()
|
||||
unitdir = systemd.get_pkgconfig_variable('systemdsystemunitdir')
|
||||
|
||||
configure_file(
|
||||
- input: 'clevis-luks-askpass.service.in',
|
||||
- output: 'clevis-luks-askpass.service',
|
||||
+ input: 'clevis-luks-askpass@.service.in',
|
||||
+ output: 'clevis-luks-askpass@.service',
|
||||
install_dir: unitdir,
|
||||
configuration: data,
|
||||
)
|
||||
|
||||
- install_data('clevis-luks-askpass.path', install_dir: unitdir)
|
||||
+ install_data('clevis-luks-askpass@.path', install_dir: unitdir)
|
||||
install_data('clevis-luks-askpass', install_dir: libexecdir)
|
||||
else
|
||||
warning('Will not install systemd support due to missing dependencies!')
|
||||
-endif
|
||||
\ No newline at end of file
|
||||
+endif
|
||||
--
|
||||
2.18.1
|
||||
|
@ -1,61 +0,0 @@
|
||||
From 1f9e0d9533e970a79bb9a525b5e407bf80f6fc5b Mon Sep 17 00:00:00 2001
|
||||
From: Sergio Correia <scorreia@redhat.com>
|
||||
Date: Mon, 6 Jul 2020 08:53:58 -0300
|
||||
Subject: [PATCH] luks: fix handling of devices in clevis-luks-askpass to
|
||||
handle
|
||||
|
||||
---
|
||||
src/luks/systemd/clevis-luks-askpass | 23 ++++++++++++++++++++---
|
||||
1 file changed, 20 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/luks/systemd/clevis-luks-askpass b/src/luks/systemd/clevis-luks-askpass
|
||||
index feebb1a..5719ab6 100755
|
||||
--- a/src/luks/systemd/clevis-luks-askpass
|
||||
+++ b/src/luks/systemd/clevis-luks-askpass
|
||||
@@ -23,6 +23,12 @@ UUID=cb6e8904-81ff-40da-a84a-07ab9ab5715e
|
||||
|
||||
shopt -s nullglob
|
||||
|
||||
+clevis_is_luks_device_by_uuid_open() {
|
||||
+ local LUKS_UUID="${1}"
|
||||
+ [ -z "${LUKS_UUID}" ] && return 1
|
||||
+ test -b /dev/disk/by-id/dm-uuid-*"${LUKS_UUID//-/}"*
|
||||
+}
|
||||
+
|
||||
path=/run/systemd/ask-password
|
||||
while getopts ":lpu:" o; do
|
||||
case "$o" in
|
||||
@@ -49,9 +55,13 @@ while true; do
|
||||
esac
|
||||
done < "$question"
|
||||
|
||||
- [ -z "$d" -o -z "$s" ] && continue
|
||||
- [[ -n "${device_uuid}" ]] && [[ "${d}" != *"${device_uuid}"* ]] \
|
||||
- && continue
|
||||
+ [ -b "${d}" ] || continue
|
||||
+ [ -S "${s}" ] || continue
|
||||
+
|
||||
+ if [ -n "${device_uuid}" ]; then
|
||||
+ uuid="$(cryptsetup luksUUID "${d}")"
|
||||
+ [ "${uuid}" != "${device_uuid}" ] && todo=1 && continue
|
||||
+ fi
|
||||
|
||||
if cryptsetup isLuks --type luks1 "$d"; then
|
||||
# If the device is not initialized, sliently skip it.
|
||||
@@ -89,6 +99,13 @@ while true; do
|
||||
todo=$((todo + 1))
|
||||
done
|
||||
|
||||
+ if [ -n "${device_uuid}" ]; then
|
||||
+ [ ! -b /dev/disk/by-uuid/"${device_uuid}" ] && break
|
||||
+ if clevis_is_luks_device_by_uuid_open "${device_uuid}"; then
|
||||
+ break
|
||||
+ fi
|
||||
+ fi
|
||||
+
|
||||
if [ $todo -eq 0 ] || [ "$loop" != "true" ]; then
|
||||
break;
|
||||
fi
|
||||
--
|
||||
2.18.4
|
||||
|
@ -1,28 +1,24 @@
|
||||
%global _hardened_build 1
|
||||
|
||||
Name: clevis
|
||||
Version: 11
|
||||
Release: 9%{?dist}.1
|
||||
Version: 13
|
||||
Release: 3%{?dist}
|
||||
Summary: Automated decryption framework
|
||||
|
||||
License: GPLv3+
|
||||
URL: https://github.com/latchset/%{name}
|
||||
Source0: https://github.com/latchset/%{name}/releases/download/v%{version}/%{name}-%{version}.tar.xz
|
||||
|
||||
Patch01: Delete-remaining-references-to-the-removed-http-pin.patch
|
||||
Patch02: Install-cryptsetup-and-tpm2_pcrlist-in-the-initramfs.patch
|
||||
Patch03: Add-device-TCTI-library-to-the-initramfs.patch
|
||||
Patch04: Check-key-derivation-key-is-available.patch
|
||||
Patch05: Adjust-pin-tang-test-to-account-for-newer-tang-witho.patch
|
||||
Patch06: Add-clevis-luks-report-regen.patch
|
||||
Patch07: Improve-error-message-when-bind-is-given-an-invalid-.patch
|
||||
Patch08: Add-support-for-listing-existing-PBD-policies-in-pla.patch
|
||||
Patch09: Add-the-option-to-extract-luks-passphrase-used-for-b.patch
|
||||
Patch10: Add-rd.neednet-1-to-cmdline-only-if-there-are-device.patch
|
||||
Patch11: Improve-tests-speed.patch
|
||||
Patch12: Use-one-clevis-luks-askpass-per-device.patch
|
||||
Patch13: Improve-clevis-luks-regen-no-unbind-in-every-case.patch
|
||||
Patch14: luks-fix-handling-of-devices-in-clevis-luks-askpass-.patch
|
||||
Patch0001: 0001-Adjust-pin-tang-test-to-account-for-newer-tang-witho.patch
|
||||
Patch0002: 0002-Fix-clevis-luks-unlock-and-add-related-tests.patch
|
||||
Patch0003: 0003-Improve-error-message-when-bind-is-given-an-invalid-.patch
|
||||
Patch0004: 0004-Add-rd.neednet-1-to-cmdline-only-if-there-are-device.patch
|
||||
Patch0005: 0005-Add-the-option-to-extract-luks-passphrase-used-for-b.patch
|
||||
Patch0006: 0006-Add-clevis-luks-regen-command.patch
|
||||
Patch0007: 0007-Add-clevis-luks-report.patch
|
||||
Patch0008: 0008-Use-one-clevis-luks-askpass-per-device.patch
|
||||
Patch0009: 0009-Introduce-y-assume-yes-argument-to-clevis-luks-bind.patch
|
||||
Patch0010: 0010-Add-clevis-luks-edit-command.patch
|
||||
|
||||
BuildRequires: gcc
|
||||
BuildRequires: meson
|
||||
@ -48,11 +44,14 @@ BuildRequires: cracklib-dicts
|
||||
Buildrequires: jq
|
||||
BuildRequires: diffutils
|
||||
BuildRequires: expect
|
||||
BuildRequires: openssl
|
||||
|
||||
Requires: cracklib-dicts
|
||||
Requires: tpm2-tools >= 3.0.0
|
||||
Requires: coreutils
|
||||
Requires: jose >= 8
|
||||
Requires: curl
|
||||
Requires: jq
|
||||
Requires(pre): shadow-utils
|
||||
|
||||
%description
|
||||
@ -63,17 +62,17 @@ occur automatically.
|
||||
The clevis package provides basic encryption/decryption policy support.
|
||||
Users can use this directly; but most commonly, it will be used as a
|
||||
building block for other packages. For example, see the clevis-luks
|
||||
and clevis-dracut packages for automatic root volume unlocking of LUKSv1
|
||||
and clevis-dracut packages for automatic root volume unlocking of LUKS
|
||||
volumes during early boot.
|
||||
|
||||
%package luks
|
||||
Summary: LUKSv1 integration for clevis
|
||||
Summary: LUKS integration for clevis
|
||||
Requires: %{name}%{?_isa} = %{version}-%{release}
|
||||
Requires: cryptsetup
|
||||
Requires: luksmeta >= 8
|
||||
|
||||
%description luks
|
||||
LUKSv1 integration for clevis. This package allows you to bind a LUKSv1
|
||||
LUKS integration for clevis. This package allows you to bind a LUKS
|
||||
volume to a clevis unlocking policy. For automated unlocking, an unlocker
|
||||
will also be required. See, for example, clevis-dracut and clevis-udisks2.
|
||||
|
||||
@ -96,7 +95,7 @@ Requires: systemd%{?_isa} >= 236
|
||||
Requires: nc
|
||||
|
||||
%description systemd
|
||||
Automatically unlocks LUKSv1 _netdev block devices from /etc/crypttab.
|
||||
Automatically unlocks clevis-bound LUKS block devices during boot.
|
||||
|
||||
%package dracut
|
||||
Summary: Dracut integration for clevis
|
||||
@ -104,18 +103,18 @@ Requires: %{name}-systemd%{?_isa} = %{version}-%{release}
|
||||
Requires: dracut-network
|
||||
|
||||
%description dracut
|
||||
Automatically unlocks LUKSv1 block devices in early boot.
|
||||
Automatically unlocks LUKS block devices in early boot.
|
||||
|
||||
%package udisks2
|
||||
Summary: UDisks2/Storaged integration for clevis
|
||||
Requires: %{name}-luks%{?_isa} = %{version}-%{release}
|
||||
|
||||
%description udisks2
|
||||
Automatically unlocks LUKSv1 block devices in desktop environments that
|
||||
Automatically unlocks LUKS block devices in desktop environments that
|
||||
use UDisks2 or storaged (like GNOME).
|
||||
|
||||
%prep
|
||||
%autosetup -p1
|
||||
%autosetup -S git
|
||||
|
||||
%build
|
||||
%meson -Duser=clevis -Dgroup=clevis
|
||||
@ -167,22 +166,24 @@ exit 0
|
||||
%{_mandir}/man1/%{name}-luks-unlock.1*
|
||||
%{_mandir}/man1/%{name}-luks-unbind.1*
|
||||
%{_mandir}/man1/%{name}-luks-bind.1*
|
||||
%{_mandir}/man1/%{name}-luks-list.1*
|
||||
%{_mandir}/man1/%{name}-luks-pass.1*
|
||||
%{_mandir}/man1/%{name}-luks-regen.1*
|
||||
%{_mandir}/man1/%{name}-luks-report.1*
|
||||
%{_mandir}/man1/%{name}-luks-list.1*
|
||||
%{_mandir}/man1/%{name}-luks-pass.1.*
|
||||
%{_mandir}/man1/%{name}-luks-edit.1*
|
||||
%{_bindir}/%{name}-luks-unlock
|
||||
%{_bindir}/%{name}-luks-unbind
|
||||
%{_bindir}/%{name}-luks-bind
|
||||
%{_bindir}/%{name}-luks-common-functions
|
||||
%{_bindir}/%{name}-luks-list
|
||||
%{_bindir}/%{name}-luks-pass
|
||||
%{_bindir}/%{name}-luks-regen
|
||||
%{_bindir}/%{name}-luks-report
|
||||
%{_bindir}/%{name}-luks-report-compare
|
||||
%{_bindir}/%{name}-luks-report-decode
|
||||
%{_bindir}/%{name}-luks-report-sss
|
||||
%{_bindir}/%{name}-luks-report-tang
|
||||
%{_bindir}/%{name}-luks-list
|
||||
%{_bindir}/%{name}-luks-pass
|
||||
%{_bindir}/%{name}-luks-edit
|
||||
|
||||
%files systemd
|
||||
%{_libexecdir}/%{name}-luks-askpass
|
||||
@ -191,17 +192,33 @@ exit 0
|
||||
|
||||
%files dracut
|
||||
%{_prefix}/lib/dracut/modules.d/60%{name}
|
||||
%{_prefix}/lib/dracut/modules.d/60%{name}-pin-sss
|
||||
%{_prefix}/lib/dracut/modules.d/60%{name}-pin-tang
|
||||
%{_prefix}/lib/dracut/modules.d/60%{name}-pin-tpm2
|
||||
|
||||
%files udisks2
|
||||
%{_sysconfdir}/xdg/autostart/%{name}-luks-udisks2.desktop
|
||||
%attr(4755, root, root) %{_libexecdir}/%{name}-luks-udisks2
|
||||
|
||||
%changelog
|
||||
* Mon Jul 06 2020 Sergio Correia <scorreia@redhat.com> - 11-9.1
|
||||
- Fix handling of device names in clevis-luks-askpass
|
||||
Resolves: rhbz#1849593
|
||||
* Wed May 20 2020 Sergio Correia <scorreia@redhat.com> - 13-3
|
||||
- Add clevis luks edit command
|
||||
Resolves: rhbz#1436735
|
||||
|
||||
* Wed Feb 02 2020 Sergio Correia <scorreia@redhat.com> - 11-9
|
||||
* Mon May 18 2020 Sergio Correia <scorreia@redhat.com> - 13-2
|
||||
- Introduce -y (assume yes) argument to clevis luks bind
|
||||
Resolves: rhbz#1819767
|
||||
|
||||
* Sun May 10 2020 Sergio Correia <scorreia@redhat.com> - 13-1
|
||||
- Update to new upstream release, v13
|
||||
Resolves: rhbz#1827225
|
||||
Resolves: rhbz#1827665
|
||||
Resolves: rhbz#1801556
|
||||
Resolves: rhbz#1784448
|
||||
Resolves: rhbz#1826917
|
||||
Resolves: rhbz#1812014
|
||||
|
||||
* Sun Feb 02 2020 Sergio Correia <scorreia@redhat.com> - 11-9
|
||||
- Improve clevis luks regen not to unbind+bind in every case
|
||||
Resolves: rhbz#1795675
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user