2
0
mirror of https://github.com/xcat2/confluent.git synced 2026-09-05 20:47:57 +00:00
Files
confluent/confluent_osdeploy/common/profile/scripts/tpm_luks_reseal.sh
T
2026-08-11 09:26:03 -04:00

124 lines
3.1 KiB
Bash

#!/bin/bash
# Resealing to allow more practical use of, for example, PCR1, which frequently gets changed booting from install environment
# to local disk
get_requested_pcrs() {
local encryptboot=$(grep ^encryptboot: /etc/confluent/confluent.deploycfg | awk '{print $2}')
IFS=':' read -ra params <<< "$encryptboot"
for param in "${params[@]}"; do
if [[ "$param" =~ ^pcrs= ]]; then
echo "${param#pcrs=}"
return 0
fi
done
}
wipe_slots() {
local device="$1"
if [[ -z "$device" ]]; then
echo "Error: No device specified" >&2
return 1
fi
# Check if device exists
if [[ ! -e "$device" ]]; then
echo "Error: Device $device not found" >&2
return 1
fi
# Wipe existing TPM2 slots using clevis
echo "Wiping TPM2 slots for $device"
if [ -e /bin/systemd-cryptenroll ]; then
systemd-cryptenroll --wipe-slot=tpm2 "$device"
else
clevis luks unbind -d "$device" tpm2 || true
fi
return 0
}
seal_tpm() {
local device="$1"
if [[ -z "$device" ]]; then
echo "Error: No device specified" >&2
return 1
fi
if [[ ! -e "$device" ]]; then
echo "Error: Device $device not found" >&2
return 1
fi
local pcrs=$(get_requested_pcrs)
if [ -e /bin/systemd-cryptenroll ]; then
PASSWORD=$(cat /etc/confluent/luks.key) systemd-cryptenroll --tpm2-device=auto --tpm2-pcrs="$pcrs" "$device"
else
if [ -n "$pcrs" ]; then
clevispcrs=$(echo "$pcrs" | sed -e 's/,/, /g')
clevis luks bind -f -d "$device" -k - tpm2 "{\"pcr_ids\":\"$clevispcrs\"}" < /etc/confluent/luks.key
else
clevis luks bind -f -d "$device" -k - tpm2 "{}" < /etc/confluent/luks.key
fi
fi
if [[ $? -eq 0 ]]; then
echo "Successfully enrolled TPM2 for $device"
return 0
else
echo "Failed to enroll TPM2 for $device" >&2
return 1
fi
}
reseal_luks() {
local device="$1"
if [[ -z "$device" ]]; then
echo "Error: No device specified" >&2
return 1
fi
# Check if device exists
if [[ ! -e "$device" ]]; then
echo "Error: Device $device not found" >&2
return 1
fi
# Wipe existing TPM2 slots
wipe_slots "$device"
# Enroll TPM2 key
seal_tpm "$device"
}
while IFS= read -r line; do
# Skip comments and empty lines
[[ "$line" =~ ^[[:space:]]*# ]] && continue
[[ -z "$line" ]] && continue
device=$(echo "$line" | awk '{print $2}')
# If it's a UUID, convert to device name
if [[ "$device" =~ ^UUID= ]]; then
device=$(blkid -U "${device#UUID=}")
fi
if [ -e /bin/systemd-cryptenroll ]; then
systemd-cryptenroll "$device" | grep -q "tpm2" || continue
else
clevis luks list -d "$device" | grep -q "tpm2" || continue
fi
# Process the device
if [[ -n "$device" ]]; then
reseal_luks "$device"
else
echo "Warning: Could not determine device for line: $line" >&2
fi
done < /etc/crypttab