Previous commits marked findings as ✅ that were actually superficial or broken. This commit fixes the real problems honestly. Real fixes: - Argon2id KDF: Fixed via preseed partman/early_command that patches partman-crypto's cryptsetup luksFormat to include --pbkdf argon2id. Previous luks-kdf-configure.sh "auto-conversion" was dead code (cryptsetup luksConvertKey needs stdin passphrase, nothing provides it). Now the hook is an honest verifier, not a fake converter. - src/security-hardening.sh: Removed sshd_config generation entirely (was still generating it despite claiming client-only) - AIDE init: Removed || true error swallowing, now reports failures - COMPLIANCE.md: Marked CMMC L3 and FedRAMP as aspirational targets with honest explanation of what's missing (3PAO, org controls) - VERIFICATION-REPORT.md: Added self-review warning about contradictions, fixed wrong preseed path (config/preseed.cfg → includes.installer/) - Removed phantom knel-compliance-check.sh reference from COMPLIANCE.md - encryption-setup.sh: README now says "Argon2id (via early_command)" instead of bare "Argon2id" which was false - demo.preseed.cfg: Added same Argon2id early_command - Added .dockerignore (was missing) - Fixed .gitignore *key* pattern (too broad, matched keyboard.conf etc) Still remaining (honest assessment): - C-06: Git history scrub (needs git-filter-repo, destructive) - H-09: Build cache integrity (design work needed) - M-11: Docker base digest pinning - Phase 3: Test suite overhaul (85% grep-based, not behavioral) - Phase 4: Documentation cleanup (threat model, etc) - ISO NOT rebuilt since fixes 786 tests pass, 0 shellcheck warnings. 💘 Generated with Crush Assisted-by: GLM-5.1 via Crush <crush@charm.land>
351 lines
9.9 KiB
Bash
Executable File
351 lines
9.9 KiB
Bash
Executable File
#!/bin/bash
|
|
# Full disk encryption setup for installed system
|
|
# This hook configures encryption settings and ensures proper LUKS setup
|
|
set -euo pipefail
|
|
|
|
echo "Configuring full disk encryption..."
|
|
|
|
# Ensure cryptsetup is installed
|
|
if ! command -v cryptsetup &> /dev/null; then
|
|
echo "ERROR: cryptsetup not found - critical failure"
|
|
exit 1
|
|
fi
|
|
|
|
# Configure LUKS2 settings
|
|
echo "Configuring LUKS2 with AES-256-XTS encryption..."
|
|
|
|
# Create cryptsetup configuration for maximum security
|
|
cat > /etc/cryptsetup-initramfs/conf-hook <<'EOF'
|
|
# Enable keyscripts in initramfs
|
|
CRYPTSETUP=y
|
|
|
|
# Use LUKS2 format
|
|
KEYSCRIPT=y
|
|
|
|
# Enable keyscript support
|
|
CRYPTSETUP_OPTIONS=--type luks2
|
|
EOF
|
|
|
|
# Configure crypttab for encrypted root
|
|
# This file will be generated by the installer, but we ensure proper settings
|
|
if [ -f /etc/crypttab ]; then
|
|
echo "Verifying crypttab configuration..."
|
|
# Ensure crypttab has proper options
|
|
sed -i '/\/dev\/mapper\|^#/!s/\bluks\b/luks,discard,cipher=aes-xts-plain64,key-size=512/' /etc/crypttab
|
|
fi
|
|
|
|
# Configure initramfs to include necessary modules for decryption
|
|
cat > /etc/initramfs-tools/conf.d/cryptsetup <<'EOF'
|
|
# Ensure cryptsetup modules are included
|
|
MODULES=dm_crypt
|
|
|
|
# Include busybox for initramfs
|
|
BUSYBOX=y
|
|
|
|
# Include cryptsetup
|
|
CRYPTSETUP=y
|
|
EOF
|
|
|
|
# Add cryptsetup and dm-crypt to initramfs modules
|
|
{
|
|
echo "dm_crypt"
|
|
echo "aes_xts"
|
|
echo "xts"
|
|
echo "sha512"
|
|
} >> /etc/initramfs-tools/modules
|
|
|
|
# Configure kernel command line for encrypted root
|
|
if [ -f /etc/default/grub ]; then
|
|
echo "Configuring GRUB for encrypted root..."
|
|
# Get the current GRUB_CMDLINE_LINUX_DEFAULT
|
|
if ! grep -q "cryptdevice" /etc/default/grub; then
|
|
# This will be set by the installer, but we ensure proper format
|
|
# Note: We use a placeholder UUID that will be updated by the installer
|
|
# The actual UUID of the encrypted root will be determined at install time
|
|
# shellcheck disable=SC2016
|
|
sed -i '/^GRUB_CMDLINE_LINUX_DEFAULT=/s/"$/ rd.luks.crypttab=1"/' /etc/default/grub || true
|
|
fi
|
|
fi
|
|
|
|
# Set secure umask for key files
|
|
umask 0077
|
|
|
|
# Create key backup directory
|
|
mkdir -p /var/backups/keys
|
|
chmod 700 /var/backups/keys
|
|
|
|
# Create README for key recovery
|
|
cat > /var/backups/keys/README.txt <<'EOF'
|
|
KNEL-Football Secure OS - Encryption Key Backup Information
|
|
=============================================================
|
|
|
|
CRITICAL: This system uses full disk encryption with LUKS2.
|
|
|
|
Encryption Details:
|
|
- Format: LUKS2
|
|
- Cipher: AES-256-XTS
|
|
- Key Size: 512 bits
|
|
- Hash: SHA-512
|
|
- KDF: Argon2id (configured via preseed early_command patch)
|
|
|
|
Key Slots:
|
|
- Slot 0: Primary passphrase (set during installation)
|
|
- Slot 1-7: Available for recovery keys or additional passphrases
|
|
|
|
Recovery Information:
|
|
- Store encryption passphrase in secure location
|
|
- Document passphrase in password manager
|
|
- Consider creating recovery key in secondary slot
|
|
|
|
Commands:
|
|
- Check encryption status: cryptsetup status cryptroot
|
|
- Add additional passphrase: cryptsetup luksAddKey $(find-luks-device.sh)
|
|
- List key slots: cryptsetup luksDump $(find-luks-device.sh)
|
|
|
|
WARNING: Losing the encryption passphrase will result in
|
|
permanent data loss. There is NO backdoor or recovery mechanism
|
|
without a valid passphrase or recovery key.
|
|
|
|
DO NOT remove this file - it contains critical recovery information.
|
|
EOF
|
|
|
|
chmod 600 /var/backups/keys/README.txt
|
|
|
|
# Create encryption status script
|
|
cat > /usr/local/bin/check-encryption.sh <<'EOF'
|
|
#!/bin/bash
|
|
# Check full disk encryption status
|
|
set -euo pipefail
|
|
|
|
echo "KNEL-Football Full Disk Encryption Status"
|
|
echo "========================================="
|
|
echo ""
|
|
|
|
# Check if cryptsetup is available
|
|
if ! command -v cryptsetup &> /dev/null; then
|
|
echo "ERROR: cryptsetup not found"
|
|
exit 1
|
|
fi
|
|
|
|
# List all encrypted devices
|
|
echo "Encrypted Devices:"
|
|
echo "-----------------"
|
|
for dev in /dev/mapper/*; do
|
|
if [ -e "$dev" ]; then
|
|
echo "$dev"
|
|
dmsetup info "$dev" | grep -E "(Name|Open count|Target)"
|
|
fi
|
|
done
|
|
echo ""
|
|
|
|
# Check LUKS container details (dynamic device discovery)
|
|
LUKS_DEV=""
|
|
for dev in /dev/sda3 /dev/nvme0n1p3 /dev/nvme1n1p3 /dev/vda3; do
|
|
if [ -b "$dev" ] && cryptsetup isLuks "$dev" 2>/dev/null; then
|
|
LUKS_DEV="$dev"
|
|
break
|
|
fi
|
|
done
|
|
if [ -n "$LUKS_DEV" ]; then
|
|
echo "LUKS Container Information ($LUKS_DEV):"
|
|
echo "---------------------------"
|
|
cryptsetup luksDump "$LUKS_DEV" | head -20
|
|
echo ""
|
|
fi
|
|
|
|
# Check encryption is active
|
|
if mountpoint -q /; then
|
|
echo "Root filesystem encryption: ACTIVE"
|
|
else
|
|
echo "Root filesystem encryption: UNKNOWN"
|
|
fi
|
|
|
|
echo ""
|
|
echo "Encryption: AES-256-XTS (LUKS2)"
|
|
echo "Status: Full disk encryption enabled"
|
|
EOF
|
|
|
|
chmod +x /usr/local/bin/check-encryption.sh
|
|
|
|
# Create LUKS device discovery helper
|
|
cat > /usr/local/bin/find-luks-device.sh <<'EOF'
|
|
#!/bin/bash
|
|
# Discover the LUKS encrypted partition dynamically
|
|
set -euo pipefail
|
|
|
|
# Method 1: Check crypttab for the root device
|
|
if [ -f /etc/crypttab ]; then
|
|
while read -r name device _ _; do
|
|
[ -z "$name" ] || [ "$name" = "#" ] && continue
|
|
if [ -b "$device" ] && cryptsetup isLuks "$device" 2>/dev/null; then
|
|
echo "$device"
|
|
exit 0
|
|
fi
|
|
done < /etc/crypttab
|
|
fi
|
|
|
|
# Method 2: Check common partition layouts
|
|
for dev in /dev/sda3 /dev/nvme0n1p3 /dev/nvme1n1p3 /dev/vda3; do
|
|
if [ -b "$dev" ] && cryptsetup isLuks "$dev" 2>/dev/null; then
|
|
echo "$dev"
|
|
exit 0
|
|
fi
|
|
done
|
|
|
|
# Method 3: Scan all partitions with lsblk
|
|
if command -v lsblk >/dev/null 2>&1; then
|
|
while read -r dev; do
|
|
if cryptsetup isLuks "$dev" 2>/dev/null; then
|
|
echo "$dev"
|
|
exit 0
|
|
fi
|
|
done < <(lsblk -lnpo NAME,FSTYPE 2>/dev/null | awk '$2 == "crypto_LUKS" {print $1}')
|
|
fi
|
|
|
|
exit 1
|
|
EOF
|
|
chmod +x /usr/local/bin/find-luks-device.sh
|
|
|
|
# Create encryption key management script
|
|
cat > /usr/local/bin/manage-encryption-keys.sh <<'EOF'
|
|
#!/bin/bash
|
|
# Manage LUKS encryption keys
|
|
set -euo pipefail
|
|
|
|
echo "KNEL-Football Encryption Key Management"
|
|
echo "========================================"
|
|
echo ""
|
|
|
|
# Check root privileges
|
|
if [ "$EUID" -ne 0 ]; then
|
|
echo "ERROR: This script must be run as root"
|
|
exit 1
|
|
fi
|
|
|
|
# List options
|
|
echo "Select an option:"
|
|
echo "1. Add new passphrase to key slot"
|
|
echo "2. Remove passphrase from key slot"
|
|
echo "3. Change primary passphrase"
|
|
echo "4. List active key slots"
|
|
echo "5. Generate recovery key"
|
|
echo "0. Exit"
|
|
echo ""
|
|
read -p "Enter selection [0-5]: " choice
|
|
|
|
case $choice in
|
|
1)
|
|
read -s -p "Enter existing passphrase: " existing_pass
|
|
echo ""
|
|
read -s -p "Enter new passphrase: " new_pass
|
|
echo ""
|
|
read -s -p "Confirm new passphrase: " new_pass_confirm
|
|
echo ""
|
|
|
|
if [ "$new_pass" != "$new_pass_confirm" ]; then
|
|
echo "ERROR: Passphrases do not match"
|
|
exit 1
|
|
fi
|
|
|
|
LUKS_DEV=$(/usr/local/bin/find-luks-device.sh)
|
|
if [ -z "$LUKS_DEV" ]; then
|
|
echo "ERROR: No LUKS device found"
|
|
exit 1
|
|
fi
|
|
printf '%s\n' "$existing_pass" "$new_pass" | cryptsetup luksAddKey "$LUKS_DEV"
|
|
echo "New passphrase added successfully"
|
|
;;
|
|
2)
|
|
LUKS_DEV=$(/usr/local/bin/find-luks-device.sh)
|
|
if [ -z "$LUKS_DEV" ]; then
|
|
echo "ERROR: No LUKS device found"
|
|
exit 1
|
|
fi
|
|
cryptsetup luksDump "$LUKS_DEV" | grep "Key Slot"
|
|
read -p "Enter key slot to remove: " slot
|
|
cryptsetup luksKillSlot "$LUKS_DEV" "$slot"
|
|
echo "Key slot removed successfully"
|
|
;;
|
|
3)
|
|
echo "WARNING: Changing primary passphrase"
|
|
read -s -p "Enter current passphrase: " current_pass
|
|
echo ""
|
|
read -s -p "Enter new passphrase: " new_pass
|
|
echo ""
|
|
read -s -p "Confirm new passphrase: " new_pass_confirm
|
|
echo ""
|
|
|
|
if [ "$new_pass" != "$new_pass_confirm" ]; then
|
|
echo "ERROR: Passphrases do not match"
|
|
exit 1
|
|
fi
|
|
|
|
# This is complex and requires careful handling
|
|
LUKS_DEV=$(/usr/local/bin/find-luks-device.sh)
|
|
if [ -z "$LUKS_DEV" ]; then
|
|
echo "ERROR: No LUKS device found"
|
|
exit 1
|
|
fi
|
|
echo "This operation requires manual intervention"
|
|
echo "Please use: cryptsetup luksChangeKey $LUKS_DEV"
|
|
;;
|
|
4)
|
|
LUKS_DEV=$(/usr/local/bin/find-luks-device.sh)
|
|
if [ -z "$LUKS_DEV" ]; then
|
|
echo "ERROR: No LUKS device found"
|
|
exit 1
|
|
fi
|
|
echo "Active key slots:"
|
|
cryptsetup luksDump "$LUKS_DEV" | grep "Key Slot" | grep "ENABLED"
|
|
;;
|
|
5)
|
|
echo "Generating recovery key..."
|
|
# Generate a strong random key
|
|
LUKS_DEV=$(/usr/local/bin/find-luks-device.sh)
|
|
if [ -z "$LUKS_DEV" ]; then
|
|
echo "ERROR: No LUKS device found"
|
|
exit 1
|
|
fi
|
|
KEY_FILE="/var/backups/keys/recovery_key_$(date +%Y%m%d_%H%M%S).txt"
|
|
dd if=/dev/urandom bs=32 count=1 2>/dev/null | base64 > "$KEY_FILE"
|
|
chmod 600 "$KEY_FILE"
|
|
echo "Recovery key generated: $KEY_FILE"
|
|
echo "To add this key to a LUKS slot:"
|
|
echo " cryptsetup luksAddKey $LUKS_DEV $KEY_FILE"
|
|
echo "WARNING: Store this key in a secure, offline location"
|
|
;;
|
|
0)
|
|
echo "Exiting"
|
|
exit 0
|
|
;;
|
|
*)
|
|
echo "Invalid selection"
|
|
exit 1
|
|
;;
|
|
esac
|
|
EOF
|
|
|
|
chmod +x /usr/local/bin/manage-encryption-keys.sh
|
|
|
|
# Configure system to check encryption on boot
|
|
cat > /etc/systemd/system/knel-encryption-check.service <<'EOF'
|
|
[Unit]
|
|
Description=KNEL-Football Encryption Status Check
|
|
After=local-fs.target
|
|
ConditionPathExists=/usr/local/bin/check-encryption.sh
|
|
|
|
[Service]
|
|
Type=oneshot
|
|
ExecStart=/usr/local/bin/check-encryption.sh
|
|
RemainAfterExit=yes
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
|
|
systemctl enable knel-encryption-check.service || true
|
|
|
|
echo "Full disk encryption configuration completed."
|
|
echo "Encryption: LUKS2 with AES-256-XTS"
|
|
echo "Key management scripts installed in /usr/local/bin/"
|