Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[app-crypt/clevis] Add preliminary support for clevis #909

Closed
wants to merge 17 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pkgmetadata SYSTEM "https://www.gentoo.org/dtd/metadata.dtd">
<pkgmetadata>
<maintainer type="person">
<email>julien@jroy.ca</email>
<name>Julien Roy</name>
</maintainer>
</pkgmetadata>
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Copyright 2022-2023 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

inherit acct-group

DESCRIPTION="Group for tang daemon"

ACCT_GROUP_ID=-1
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pkgmetadata SYSTEM "https://www.gentoo.org/dtd/metadata.dtd">
<pkgmetadata>
<maintainer type="person">
<email>julien@jroy.ca</email>
<name>Julien Roy</name>
</maintainer>
</pkgmetadata>
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Copyright 2022-2023 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

inherit acct-user

DESCRIPTION="User for tang daemon"

ACCT_USER_ID=-1
ACCT_USER_GROUPS=( ${PN} )

acct-user_add_deps
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
DIST clevis-19.tar.gz 81324 BLAKE2B 75323940d0b53e307f5dbc197e3117e7ddc900d76ae1043bac3d17cc3af0264ba00a5f840c5c9dd3c2dd9c8fbde2cf05934b8ab3e89cd403ad8a8eb28609bb78 SHA512 dee19354c908c3843fc295a84b431780d5d6062c77766ee7ce9550636d3623d92b0cd1f6d4c40d57bef14debddc161da2b72289a5d6185cdd17b09a1ef67409a
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Copyright 2022-2023 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

inherit meson

DESCRIPTION="Automated Encryption Framework"
HOMEPAGE="https://github.com/latchset/clevis"
SRC_URI="https://github.com/latchset/${PN}/archive/v${PV}.tar.gz -> ${P}.tar.gz"

LICENSE="GPL-3"
SLOT="0"
KEYWORDS="amd64 arm64"
IUSE="+luks +tpm"

DEPEND="
dev-libs/jose
sys-fs/cryptsetup
luks? (
app-misc/jq
dev-libs/libpwquality
dev-libs/luksmeta
)
tpm? ( app-crypt/tpm2-tools )
"
RDEPEND="${DEPEND}"

PATCHES=(
# From https://github.com/latchset/clevis/pull/347
# Allows using dracut without systemd
"${FILESDIR}/clevis-dracut.patch"
# Fix for systemd on Gentoo
"${FILESDIR}/clevis-meson.patch"
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,216 @@
diff --git a/src/luks/systemd/dracut/clevis-pin-sss/meson.build b/src/dracut/clevis-pin-sss/meson.build
similarity index 100%
rename from src/luks/systemd/dracut/clevis-pin-sss/meson.build
rename to src/dracut/clevis-pin-sss/meson.build
diff --git a/src/luks/systemd/dracut/clevis-pin-sss/module-setup.sh.in b/src/dracut/clevis-pin-sss/module-setup.sh.in
similarity index 100%
rename from src/luks/systemd/dracut/clevis-pin-sss/module-setup.sh.in
rename to src/dracut/clevis-pin-sss/module-setup.sh.in
diff --git a/src/luks/systemd/dracut/clevis-pin-tang/meson.build b/src/dracut/clevis-pin-tang/meson.build
similarity index 100%
rename from src/luks/systemd/dracut/clevis-pin-tang/meson.build
rename to src/dracut/clevis-pin-tang/meson.build
diff --git a/src/luks/systemd/dracut/clevis-pin-tang/module-setup.sh.in b/src/dracut/clevis-pin-tang/module-setup.sh.in
similarity index 100%
rename from src/luks/systemd/dracut/clevis-pin-tang/module-setup.sh.in
rename to src/dracut/clevis-pin-tang/module-setup.sh.in
diff --git a/src/luks/systemd/dracut/clevis-pin-tpm2/meson.build b/src/dracut/clevis-pin-tpm2/meson.build
similarity index 100%
rename from src/luks/systemd/dracut/clevis-pin-tpm2/meson.build
rename to src/dracut/clevis-pin-tpm2/meson.build
diff --git a/src/luks/systemd/dracut/clevis-pin-tpm2/module-setup.sh.in b/src/dracut/clevis-pin-tpm2/module-setup.sh.in
similarity index 100%
rename from src/luks/systemd/dracut/clevis-pin-tpm2/module-setup.sh.in
rename to src/dracut/clevis-pin-tpm2/module-setup.sh.in
diff --git a/src/dracut/clevis/clevis-hook.sh.in b/src/dracut/clevis/clevis-hook.sh.in
new file mode 100755
index 0000000..91ff2bd
--- /dev/null
+++ b/src/dracut/clevis/clevis-hook.sh.in
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+@libexecdir@/clevis-luks-generic-unlocker -l
diff --git a/src/dracut/clevis/clevis-luks-generic-unlocker b/src/dracut/clevis/clevis-luks-generic-unlocker
new file mode 100755
index 0000000..a3b9d62
--- /dev/null
+++ b/src/dracut/clevis/clevis-luks-generic-unlocker
@@ -0,0 +1,70 @@
+#!/bin/bash
+set -eu
+# vim: set ts=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80:
+#
+# Copyright (c) 2020-2021 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/>.
+#
+
+. clevis-luks-common-functions
+
+# Make sure to exit cleanly if SIGTERM is received.
+trap 'echo "Exiting due to SIGTERM" && exit 0' TERM
+
+loop=
+while getopts ":l" o; do
+ case "${o}" in
+ l) loop=true;;
+ *) ;;
+ esac
+done
+
+to_unlock() {
+ local _devices='' _d _uuid
+ for _d in $(lsblk -o PATH,FSTYPE,RM \
+ | awk '$2 == "crypto_LUKS" && $3 == "0" { print $1 }' | sort -u);
+ do
+ if ! bindings="$(clevis luks list -d "${_d}" 2>/dev/null)" \
+ || [ -z "${bindings}" ]; then
+ continue
+ fi
+ _uuid="$(cryptsetup luksUUID "${_d}")"
+ if clevis_is_luks_device_by_uuid_open "${_uuid}"; then
+ continue
+ fi
+ _devices="$(printf '%s\n%s' "${_devices}" "${_d}")"
+ done
+ echo "${_devices}" | sed -e 's/^\n$//'
+}
+
+while true; do
+ for d in $(to_unlock); do
+ uuid="$(cryptsetup luksUUID "${d}")"
+ if ! clevis luks unlock -d "${d}"; then
+ echo "Unable to unlock ${d} (UUID=${uuid})" >&2
+ continue
+ fi
+ echo "Unlocked ${d} (UUID=${uuid}) successfully" >&2
+ done
+
+ [ "${loop}" != true ] && break
+ # Checking for pending devices to be unlocked.
+ if remaining=$(to_unlock) && [ -z "${remaining}" ]; then
+ break;
+ fi
+
+ sleep 0.5
+done
diff --git a/src/luks/systemd/dracut/clevis/meson.build b/src/dracut/clevis/meson.build
similarity index 87%
rename from src/luks/systemd/dracut/clevis/meson.build
rename to src/dracut/clevis/meson.build
index 167e708..224e27f 100644
--- a/src/luks/systemd/dracut/clevis/meson.build
+++ b/src/dracut/clevis/meson.build
@@ -16,6 +16,7 @@ if dracut.found()
install_dir: dracutdir,
configuration: data,
)
+ install_data('clevis-luks-generic-unlocker', install_dir: libexecdir)
else
warning('Will not install dracut module due to missing dependencies!')
endif
diff --git a/src/luks/systemd/dracut/clevis/module-setup.sh.in b/src/dracut/clevis/module-setup.sh.in
similarity index 76%
rename from src/luks/systemd/dracut/clevis/module-setup.sh.in
rename to src/dracut/clevis/module-setup.sh.in
index bfe657c..dbce790 100755
--- a/src/luks/systemd/dracut/clevis/module-setup.sh.in
+++ b/src/dracut/clevis/module-setup.sh.in
@@ -19,7 +19,11 @@
#

depends() {
- echo crypt systemd
+ local __depends=crypt
+ if dracut_module_included "systemd"; then
+ __depends=$(printf '%s systemd' "${_depends}")
+ fi
+ echo "${__depends}"
return 255
}

@@ -27,17 +31,24 @@ install() {
if dracut_module_included "systemd"; then
inst_multiple \
$systemdsystemunitdir/clevis-luks-askpass.service \
- $systemdsystemunitdir/clevis-luks-askpass.path
+ $systemdsystemunitdir/clevis-luks-askpass.path \
+ @SYSTEMD_REPLY_PASS@ \
+ @libexecdir@/clevis-luks-askpass
systemctl -q --root "$initdir" add-wants cryptsetup.target clevis-luks-askpass.path
else
inst_hook initqueue/online 60 "$moddir/clevis-hook.sh"
inst_hook initqueue/settled 60 "$moddir/clevis-hook.sh"
+
+ inst_multiple \
+ @libexecdir@/clevis-luks-generic-unlocker \
+ clevis-luks-unlock \
+ lsblk \
+ sort \
+ awk
fi

inst_multiple \
/etc/services \
- @SYSTEMD_REPLY_PASS@ \
- @libexecdir@/clevis-luks-askpass \
clevis-luks-common-functions \
grep sed cut \
clevis-decrypt \
diff --git a/src/luks/systemd/dracut/meson.build b/src/dracut/meson.build
similarity index 78%
rename from src/luks/systemd/dracut/meson.build
rename to src/dracut/meson.build
index 7ad5b14..fdb264b 100644
--- a/src/luks/systemd/dracut/meson.build
+++ b/src/dracut/meson.build
@@ -2,4 +2,3 @@ subdir('clevis')
subdir('clevis-pin-tang')
subdir('clevis-pin-tpm2')
subdir('clevis-pin-sss')
-subdir('clevis-pin-null')
diff --git a/src/luks/systemd/dracut/clevis/clevis-hook.sh.in b/src/luks/systemd/dracut/clevis/clevis-hook.sh.in
deleted file mode 100755
index cb257c9..0000000
--- a/src/luks/systemd/dracut/clevis/clevis-hook.sh.in
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/bash
-@libexecdir@/clevis-luks-askpass
diff --git a/src/luks/systemd/meson.build b/src/luks/systemd/meson.build
index e3b3d91..b10494e 100644
--- a/src/luks/systemd/meson.build
+++ b/src/luks/systemd/meson.build
@@ -10,7 +10,6 @@ sd_reply_pass = find_program(

if systemd.found() and sd_reply_pass.found()
data.set('SYSTEMD_REPLY_PASS', sd_reply_pass.path())
- subdir('dracut')

unitdir = systemd.get_pkgconfig_variable('systemdsystemunitdir')

diff --git a/src/meson.build b/src/meson.build
index c4e696f..a0dff5b 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -1,6 +1,7 @@
subdir('bash')
subdir('luks')
subdir('pins')
+subdir('dracut')
subdir('initramfs-tools')

bins += join_paths(meson.current_source_dir(), 'clevis-decrypt')
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
diff --git a/src/luks/systemd/meson.build b/src/luks/systemd/meson.build
index b10494e3ca4d620437aee0d5e440eecf323b03d9..09f7fb51e7320aa71e275c34baa0561233821d69 100644
--- a/src/luks/systemd/meson.build
+++ b/src/luks/systemd/meson.build
@@ -5,6 +5,7 @@ sd_reply_pass = find_program(
join_paths(get_option('prefix'), 'lib', 'systemd', 'systemd-reply-password'),
join_paths('/', 'usr', get_option('libdir'), 'systemd', 'systemd-reply-password'),
join_paths('/', 'usr', 'lib', 'systemd', 'systemd-reply-password'),
+ join_paths('/', 'lib', 'systemd', 'systemd-reply-password'),
required: false
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pkgmetadata SYSTEM "https://www.gentoo.org/dtd/metadata.dtd">
<pkgmetadata>
<maintainer type="person">
<email>kjain7@u.rochester.edu</email>
<name>Krish Jain (based off Julien Roy's work) </name>
</maintainer>
<upstream>
<remote-id type="github">latchset/clevis</remote-id>
</upstream>
<use>
<flag name="luks">Enable LUKS support</flag>
<flag name="tpm">Enable TPM support</flag>
</use>
</pkgmetadata>
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
DIST tang-13.tar.gz 41537 BLAKE2B 23c7ebb0e74d56c712200e0bcbf048d32e82f08c91eece19337fc9725a6de48240958435c560a32f47fe506e607b38fc29c2b05635f232f713c8af6066a33ac0 SHA512 c8e99498b31a45bb97092d764bbe5f13f9152a8128ef774de6ac99bd44f15d5895b462ecefc504f37142fdacafc86a39059204514aa509db257b342553e00641
DIST tang-14.tar.gz 41616 BLAKE2B a26091108b16342f51cf05745ae68b56fab5ffac6d9f9191b4d6952a5c88afcbad8bbcfc0e4754b8d9c5ebf659874026a2020c1ad305f4f7393d2487ec5f95d5 SHA512 3b0872f51d9aa8dfd232fa328a326503800a1eedfe7cf9d73f8e10a3cfb97f667996708a18ea04c982c3ca477fe36961045649437b953c593fce544d8dee8048
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Address for tang to listen to (default: 0.0.0.0)
ADDRESS=0.0.0.0

# Port for tang to listen to (default: 8888)
PORT=8888

# Directory where keys will be stored (default: /var/db/tang)
TANGDIR=/var/db/tang
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#!/sbin/openrc-run
# Copyright 2022 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

name="tang daemon"
description="Tang binding daemon"
command=/usr/bin/socat
pidfile="/var/run/${RC_SVCNAME}.pid"
command_user="tang"
command_args="TCP-LISTEN:${PORT},bind=${ADDRESS},fork SYSTEM:'/usr/libexec/tangd ${TANGDIR}'"
command_background=true
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
[Unit]
Description=Tang Server

[Service]
ExecStart=/usr/bin/socat TCP-LISTEN:8888,bind=0.0.0.0,fork SYSTEM:'/usr/libexec/tangd /var/db/tang'
User=tang
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pkgmetadata SYSTEM "https://www.gentoo.org/dtd/metadata.dtd">
<pkgmetadata>
<maintainer type="person">
<email>julien@jroy.ca</email>
<name>Julien Roy</name>
</maintainer>
<upstream>
<remote-id type="github">latchset/tang</remote-id>
</upstream>
</pkgmetadata>
Loading