#!/bin/bash # Security hardening script set -euo pipefail # Function to create WiFi module blacklist create_wifi_blacklist() { local output_file="${1:-/etc/modprobe.d/blacklist-wifi.conf}" cat >"$output_file" <<'EOF' # WiFi module blacklisting blacklist cfg80211 blacklist mac80211 blacklist brcmfmac blacklist iwlwifi blacklist ath9k blacklist rt73usb EOF echo "WiFi blacklist created at $output_file" } # Function to create Bluetooth module blacklist create_bluetooth_blacklist() { local output_file="${1:-/etc/modprobe.d/blacklist-bluetooth.conf}" cat >"$output_file" <<'EOF' # Bluetooth module blacklisting blacklist btusb blacklist bluetooth blacklist btrtl blacklist btintel blacklist btbcm EOF echo "Bluetooth blacklist created at $output_file" } # Function to configure SSH client (client only - no server) # This system does NOT run an SSH server per security requirements configure_ssh_client() { local output_file="${1:-/etc/ssh/ssh_config}" cat >"$output_file" <<'EOF' # SSH Client Configuration # Reference: PRD FR-006 - Client-only, no inbound SSH services # Global defaults Host * # Security settings PasswordAuthentication no PubkeyAuthentication yes # Key algorithms (modern, secure) KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256 Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com # Connection settings ConnectTimeout 30 ServerAliveInterval 300 ServerAliveCountMax 2 # Strict host key checking StrictHostKeyChecking ask UserKnownHostsFile ~/.ssh/known_hosts EOF echo "SSH client configuration created at $output_file" } # Function to configure password policy configure_password_policy() { local output_file="${1:-/etc/security/pwquality.conf}" cat >"$output_file" <<'EOF' # KNEL-Football Password Quality Requirements (MANDATORY for tier0 security) # Reference: NIST SP 800-63B, CIS Benchmarks for Debian # All passwords/passphrases must meet these strict requirements # Minimum length: 14 characters (strongly recommended: 20+ characters) minlen = 14 # Minimum requirements (negative values = mandatory minimum counts) dcredit = -1 # Require at least 1 digit (0-9) ucredit = -1 # Require at least 1 uppercase letter (A-Z) lcredit = -1 # Require at least 1 lowercase letter (a-z) ocredit = -1 # Require at least 1 special character (!@#$%^&*) # Additional complexity requirements difok = 4 # Require at least 4 characters different from old password maxrepeat = 2 # Max 2 consecutive identical characters maxclassrepeat = 2 # Max 2 consecutive characters from same class maxsequence = 2 # Max 2 monotonic character sequences (e.g., 123, abc) # Security checks (all enabled) usercheck = 1 # Check if password contains username dictcheck = 1 # Check against common dictionary words gecoscheck = 1 # Check against GECOS field information enforcing = 1 # Reject weak passwords (for all users including root) # Reject common weak patterns badwords = password secret admin root knel football tier0 12345 qwerty # Additional restrictions minclass = 3 # Require at least 3 of 4 character classes # Classes: digits, uppercase, lowercase, other characters EOF echo "Password policy configured at $output_file" echo "Requirements: 14+ chars, 1 uppercase, 1 lowercase, 1 digit, 1 special char" } # Function to configure AIDE (File Integrity Monitoring) # Reference: CIS 1.4, FedRAMP AC-6, CMMC AU.3.059 configure_fim() { local aide_conf="${1:-/etc/aide/aide.conf}" # Database location is configured in aide.conf below # shellcheck disable=SC2034 local aide_db="${2:-/var/lib/aide/aide.db}" cat >"$aide_conf" <<'EOF' # AIDE Configuration for KNEL-Football Secure OS # File Integrity Monitoring (FIM) - CIS/FedRAMP/CMMC Compliance # Reference: CIS Benchmark 1.4, FedRAMP AU-7, CMMC AU.3.059 # Database locations database_out=file:/var/lib/aide/aide.db.new database=file:/var/lib/aide/aide.db # Report URL report_url=stdout # Custom group definitions for security-critical files SECURITY = p+u+g+s+m+c+md5+sha256+sha512 # Monitor critical system directories /etc SECURITY /boot SECURITY /usr SECURITY /bin SECURITY /sbin SECURITY /lib SECURITY /lib64 SECURITY # Monitor SSH configurations /etc/ssh SECURITY # Monitor WireGuard configurations /etc/wireguard SECURITY # Monitor security configurations /etc/security SECURITY /etc/audit SECURITY /etc/modprobe.d SECURITY /etc/nftables.conf SECURITY # Monitor sudo and PAM /etc/sudoers SECURITY /etc/sudoers.d SECURITY /etc/pam.d SECURITY # Exclude paths that change legitimately !/proc !/sys !/dev !/run !/tmp !/var/log !/var/cache !/var/lib/aide !/var/tmp EOF echo "FIM configuration created at $aide_conf" echo "Run 'aideinit' to initialize the database after installation" } # Function to initialize AIDE database initialize_fim() { if command -v aideinit >/dev/null 2>&1; then aideinit --force echo "AIDE database initialized" else echo "WARNING: aideinit not found, manual initialization required" fi } # Function to configure system limits configure_system_limits() { local output_file="${1:-/etc/security/limits.d/security.conf}" cat >"$output_file" <<'EOF' # System security limits * hard core 0 * soft nproc 1024 * hard nproc 2048 EOF echo "System limits configured at $output_file" } # Function to configure audit rules (CIS 6.2, FedRAMP AU-2, CMMC AU.2.042) configure_audit_rules() { local output_file="${1:-/etc/audit/rules.d/audit.rules}" cat >"$output_file" <<'EOF' # Comprehensive Audit Rules for KNEL-Football Secure OS # Reference: CIS Benchmark 6.2, FedRAMP AU-2/AU-3, CMMC AU.2.042/AU.3.059 ## Identity and access management -w /etc/passwd -p wa -k identity -w /etc/shadow -p wa -k identity -w /etc/group -p wa -k identity -w /etc/gshadow -p wa -k identity -w /etc/sudoers -p wa -k privilege_escalation -w /etc/sudoers.d/ -p wa -k privilege_escalation ## Authentication configuration -w /etc/pam.d/ -p wa -k authentication -w /etc/security/ -p wa -k authentication -w /etc/login.defs -p wa -k authentication -w /var/log/faillog -p wa -k authentication -w /var/log/lastlog -p wa -k authentication -w /var/log/tallylog -p wa -k authentication ## Network configuration -w /etc/network/ -p wa -k network_config -w /etc/hosts -p wa -k network_config -w /etc/hostname -p wa -k network_config -w /etc/resolv.conf -p wa -k network_config -w /etc/nftables.conf -p wa -k firewall -w /etc/wireguard/ -p wa -k wireguard_config ## SSH client configuration (no server - client only) -w /etc/ssh/ssh_config -p wa -k ssh_config ## System configuration -w /etc/fstab -p wa -k filesystem -w /etc/crypttab -p wa -k encryption -w /etc/modprobe.d/ -p wa -k kernel_modules -w /etc/sysctl.conf -p wa -k kernel_parameters -w /etc/sysctl.d/ -p wa -k kernel_parameters ## Boot configuration -w /boot/ -p wa -k boot_config -w /efi/ -p wa -k boot_config -w /etc/default/grub -p wa -k boot_config -w /etc/grub.d/ -p wa -k boot_config ## Audit subsystem (self-monitoring) -w /etc/audit/ -p wa -k audit_config -w /var/log/audit/ -p wa -k audit_logs ## Time synchronization -w /etc/chrony/ -p wa -k time_sync -w /etc/ntp.conf -p wa -k time_sync ## System administration -w /usr/bin/sudo -p x -k privilege_escalation -w /usr/bin/su -p x -k privilege_escalation -w /usr/bin/passwd -p x -k password_change -w /usr/bin/chsh -p x -k user_modification -w /usr/bin/usermod -p x -k user_modification ## Session monitoring -w /var/run/utmp -p wa -k session -w /var/log/wtmp -p wa -k session -w /var/log/btmp -p wa -k session ## Module loading -a always,exit -F arch=b64 -S init_module -S finit_module -S delete_module -k kernel_modules ## File integrity monitoring alerts -w /var/lib/aide/ -p wa -k file_integrity EOF echo "Audit rules configured at $output_file" } # Function to apply all security configurations # shellcheck disable=SC2120 apply_security_hardening() { echo "Applying security hardening..." create_wifi_blacklist "${1:-}" create_bluetooth_blacklist "${2:-}" configure_ssh_client "${3:-}" configure_password_policy "${4:-}" configure_fim "${5:-}" configure_system_limits "${6:-}" configure_audit_rules "${7:-}" echo "Security hardening completed." echo "IMPORTANT: Run 'aideinit' to initialize file integrity database after installation" } # Main execution main() { echo "Starting KNEL-Football security hardening..." apply_security_hardening echo "Security hardening completed successfully!" } # Run main if script is executed directly if [[ ${BASH_SOURCE[0]} == "${0}" ]]; then main "$@" fi