- fix(shellcheck): SC2016 in encryption-setup.sh - remove non-expanding $(blkid...) - fix(shellcheck): SC1091 in firewall-setup.sh and security-hardening.sh - add disable directives - security: SSH PasswordAuthentication yes -> no (PRD FR-006 violation) - fix: date expansion in encryption-validation.sh heredoc - docs: create SDLC.md with TDD workflow and security requirements - docs: update AGENTS.md to reference SDLC.md - chore: update STATUS.md with build completion - chore: minor build-iso.sh output formatting All 78 tests pass (63 run, 15 skip for libvirt). Zero shellcheck warnings. 💘 Generated with Crush Assisted-by: GLM-5 via Crush <crush@charm.land>
276 lines
7.6 KiB
Bash
Executable File
276 lines
7.6 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 's/luks$/luks,discard,cipher=aes-xts-plain64,key-size=512/g' /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
|
|
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
|
|
|
|
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 /dev/sda3
|
|
- List key slots: cryptsetup luksDump /dev/sda3
|
|
|
|
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
|
|
if [ -b /dev/sda3 ]; then
|
|
echo "LUKS Container Information:"
|
|
echo "---------------------------"
|
|
cryptsetup luksDump /dev/sda3 | 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 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
|
|
|
|
echo "$existing_pass" | cryptsetup luksAddKey /dev/sda3 - <<< "$new_pass"
|
|
echo "New passphrase added successfully"
|
|
;;
|
|
2)
|
|
cryptsetup luksDump /dev/sda3 | grep "Key Slot"
|
|
read -p "Enter key slot to remove: " slot
|
|
cryptsetup luksKillSlot /dev/sda3 "$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
|
|
echo "This operation requires manual intervention"
|
|
echo "Please use: cryptsetup luksChangeKey /dev/sda3"
|
|
;;
|
|
4)
|
|
echo "Active key slots:"
|
|
cryptsetup luksDump /dev/sda3 | grep "Key Slot" | grep "ENABLED"
|
|
;;
|
|
5)
|
|
echo "Generating recovery key..."
|
|
# Generate a strong random key
|
|
dd if=/dev/urandom bs=1 count=32 2>/dev/null | base64 > /var/backups/keys/recovery_key_$(date +%Y%m%d_%H%M%S).txt
|
|
chmod 600 /var/backups/keys/recovery_key_*.txt
|
|
echo "Recovery key generated and stored in /var/backups/keys/"
|
|
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/"
|