diff --git a/config/hooks/installed/luks-kdf-configure.sh b/config/hooks/installed/luks-kdf-configure.sh new file mode 100755 index 0000000..5f0639e --- /dev/null +++ b/config/hooks/installed/luks-kdf-configure.sh @@ -0,0 +1,138 @@ +#!/bin/bash +# LUKS KDF configuration hook - Convert PBKDF2 to Argon2id +# Addresses FINDING-005: Argon2id KDF not explicitly configured +# +# Debian partman-crypto does not support preseed configuration for KDF type. +# Default LUKS2 uses PBKDF2. This hook creates tools for user-initiated +# conversion to Argon2id (more resistant to GPU-based attacks). +# +# Reference: PRD.md FR-001, security-model.md +# Copyright 2026 Known Element Enterprises LLC +# License: GNU Affero General Public License v3.0 only +set -euo pipefail + +echo "Configuring LUKS KDF optimization tools..." + +# Create the KDF conversion helper script +cat > /usr/local/bin/convert-luks-kdf.sh <<'SCRIPT' +#!/bin/bash +# Convert LUKS2 KDF from PBKDF2 to Argon2id +# Run this script with sudo after first boot +set -euo pipefail + +echo "================================================================================" +echo " KNEL-Football Secure OS - LUKS KDF Optimization" +echo "================================================================================" +echo "" +echo "This script converts your LUKS2 key derivation function to Argon2id." +echo "Argon2id provides better resistance against GPU-based brute force attacks." +echo "" +echo "You will need to enter your encryption passphrase." +echo "" + +# Check root privileges +if [ "$EUID" -ne 0 ]; then + echo "ERROR: This script must be run as root (use sudo)" + exit 1 +fi + +# Find the LUKS device (typically /dev/sda3 or /dev/nvme0n1p3) +LUKS_DEVICE="" +for dev in /dev/sda3 /dev/nvme0n1p3 /dev/vda3; do + if [ -b "$dev" ] && cryptsetup isLuks "$dev" 2>/dev/null; then + LUKS_DEVICE="$dev" + break + fi +done + +if [ -z "$LUKS_DEVICE" ]; then + echo "ERROR: No LUKS device found" + echo "Checked: /dev/sda3, /dev/nvme0n1p3, /dev/vda3" + exit 1 +fi + +echo "Found LUKS device: $LUKS_DEVICE" +echo "" + +# Check current KDF +CURRENT_KDF=$(cryptsetup luksDump "$LUKS_DEVICE" 2>/dev/null | grep -E "^\s+KDF:" | head -1 | awk '{print $2}' || echo "unknown") +echo "Current KDF: $CURRENT_KDF" + +if [ "$CURRENT_KDF" = "argon2id" ]; then + echo "" + echo "SUCCESS: KDF is already configured as Argon2id" + echo "No conversion needed." + + # Mark as done so reminder stops appearing + touch /var/lib/knel-kdf-optimized + exit 0 +fi + +echo "" +echo "Converting KDF to Argon2id..." +echo "This will not change your passphrase, only the key derivation function." +echo "" + +# Convert to Argon2id +# Note: luksConvertKey requires entering the existing passphrase +if cryptsetup luksConvertKey "$LUKS_DEVICE" --pbkdf argon2id; then + echo "" + echo "================================================================================" + echo " SUCCESS: KDF converted to Argon2id" + echo "================================================================================" + echo "" + echo "Your LUKS encryption now uses Argon2id key derivation function." + echo "This provides better protection against brute force attacks." + echo "" + + # Mark as done so reminder stops appearing + touch /var/lib/knel-kdf-optimized + + # Verify the conversion + NEW_KDF=$(cryptsetup luksDump "$LUKS_DEVICE" 2>/dev/null | grep -E "^\s+KDF:" | head -1 | awk '{print $2}') + echo "Verified KDF: $NEW_KDF" +else + echo "" + echo "ERROR: KDF conversion failed" + echo "This may happen if the passphrase was incorrect." + echo "Your encryption is still working with the previous KDF." + exit 1 +fi +SCRIPT + +chmod +x /usr/local/bin/convert-luks-kdf.sh + +# Create login reminder for the user +cat > /etc/profile.d/knel-kdf-reminder.sh <<'REMINDER' +#!/bin/sh +# Reminder to optimize LUKS KDF (runs on login until completed) +# This file is removed/modified after KDF conversion + +if [ ! -f /var/lib/knel-kdf-optimized ] && [ "$EUID" -eq 0 ]; then + echo "" + echo "================================================================================" + echo " SECURITY RECOMMENDATION: Optimize LUKS Key Derivation Function" + echo "================================================================================" + echo "" + echo "Your system uses LUKS2 disk encryption. The default key derivation function" + echo "(PBKDF2) can be upgraded to Argon2id for better security." + echo "" + echo "To upgrade, run:" + echo " sudo /usr/local/bin/convert-luks-kdf.sh" + echo "" + echo "This is optional but recommended for enhanced protection against" + echo "GPU-based brute force attacks." + echo "" +fi +REMINDER + +chmod +x /etc/profile.d/knel-kdf-reminder.sh + +# Update the README to reflect the actual configuration +if [ -f /var/backups/keys/README.txt ]; then + sed -i 's/- KDF: Argon2id/- KDF: Argon2id (run \/usr\/local\/bin\/convert-luks-kdf.sh to enable)/' /var/backups/keys/README.txt 2>/dev/null || true +fi + +echo "LUKS KDF optimization tools configured." +echo "Helper script: /usr/local/bin/convert-luks-kdf.sh" +echo "User reminder: /etc/profile.d/knel-kdf-reminder.sh" diff --git a/tests/unit/encryption-setup_test.bats b/tests/unit/encryption-setup_test.bats index 139792c..568f468 100644 --- a/tests/unit/encryption-setup_test.bats +++ b/tests/unit/encryption-setup_test.bats @@ -54,3 +54,25 @@ @test "Encryption setup configures GRUB" { grep -q "grub" /workspace/config/hooks/installed/encryption-setup.sh } + +# ============================================================================= +# Argon2id KDF Configuration (FINDING-005) +# ============================================================================= + +@test "Argon2id KDF configuration hook or script exists" { + # Either a dedicated KDF hook or configuration in encryption-setup.sh + [ -f "/workspace/config/hooks/installed/luks-kdf-configure.sh" ] || \ + grep -q "argon2id\|luksConvertKey" /workspace/config/hooks/installed/encryption-setup.sh +} + +@test "KDF conversion helper script is created" { + # encryption-setup.sh should create a helper script for KDF conversion + grep -q "convert.*kdf\|kdf.*convert\|luksConvertKey" /workspace/config/hooks/installed/encryption-setup.sh || \ + [ -f "/workspace/config/hooks/installed/luks-kdf-configure.sh" ] +} + +@test "User receives notification about KDF optimization" { + # A reminder should be created for the user to optimize KDF + grep -q "profile.d\|motd\|reminder" /workspace/config/hooks/installed/encryption-setup.sh || \ + [ -f "/workspace/config/hooks/installed/luks-kdf-configure.sh" ] +}