#!/bin/bash # [STRG-1846] Disable drivers like firewire sudo tee /etc/modprobe.d/firewire-disable.conf > /dev/null < /dev/null sudo systemctl restart systemd-resolved # [USB-3000] Ensure USBGUARD is installed and configured sudo pacman -S --noconfirm --needed usbguard sudo usbguard generate-policy | sudo tee /etc/usbguard/rules.conf > /dev/null sudo sed -i 's/^PresentControllerPolicy=.*/PresentControllerPolicy=apply-policy/' /etc/usbguard/usbguard-daemon.conf sudo systemctl enable --now usbguard # [NETW-3032] Checking for ARP monitoring software sudo pacman -S --noconfirm --needed arpwatch # Find first non-loopback, non-virbr/vmbr interface and enable arpwatch on it iface=$(ip -o link show | awk -F': ' '{print $2}' | sed 's/@.*$//' | grep -Ev '^(lo|virbr|vmbr)' | head -n1) if [ -n "$iface" ]; then sudo systemctl enable --now "arpwatch@${iface}.service" else echo "No suitable network interface found for arpwatch; service not enabled." >&2 fi # [NETW-3200] Disable unused network protocols sudo tee /etc/modprobe.d/network-protocols-disable.conf > /dev/null < /dev/null sudo echo 'SCRIPTWHITELIST=/usr/bin/fgrep' | sudo tee -a /etc/rkhunter.conf > /dev/null sudo echo 'SCRIPTWHITELIST=/usr/bin/ldd' | sudo tee -a /etc/rkhunter.conf > /dev/null sudo echo 'SCRIPTWHITELIST=/usr/bin/rkhunter' | sudo tee -a /etc/rkhunter.conf > /dev/null # [MALW-3282] Ensure ClamAV is installed sudo pacman -S --noconfirm --needed clamav sudo freshclam sudo systemctl enable --now clamav-freshclam sleep 5 sudo systemctl enable --now clamav-daemon # [FINT-4350] Install a file integrity tool sudo pacman -S --noconfirm --needed aide sudo aide --init sudo mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz sudo systemctl enable --now aidecheck.timer # [FIRE-45XX] Firewall configuration # remove iptables if installed if pacman -Qi iptables &> /dev/null; then sudo pacman -R --noconfirm iptables fi sudo pacman -S --noconfirm --needed nftables sudo tee /etc/modprobe.d/ip_tables-disable.conf > /dev/null < /dev/null <<'EOL' [Coredump] # Prevent any core file data being stored and limit accepted size to 0 ProcessSizeMax=0 Storage=none EOL sudo systemctl daemon-reload sudo mkdir -p /etc/security/limits.d/ sudo tee /etc/security/limits.d/20-disable-core-dumps.conf > /dev/null < * hard core 0 * soft core 0 EOL # Append to /etc/profile to enforce core dump restriction system-wide echo '# Disable core dumps system-wide' | sudo tee -a /etc/profile > /dev/null echo 'ulimit -c 0 > /dev/null 2>&1' | sudo tee -a /etc/profile > /dev/null echo '# Set the core dump soft limit to 0 (current enforceable limit)' | sudo tee -a /etc/profile > /dev/null echo 'ulimit -S -c 0 > /dev/null 2>&1' | sudo tee -a /etc/profile > /dev/null echo '# Set the hard limit to 0 (absolute maximum limit)' | sudo tee -a /etc/profile > /dev/null echo 'ulimit -H -c 0 > /dev/null 2>&1' | sudo tee -a /etc/profile > /dev/null # [KRNL-6000] Check sysctl settings for kernel hardening sudo tee /etc/sysctl.d/99-hardened.conf > /dev/null <<'EOL' # Kernel and filesystem hardening settings kernel.randomize_va_space = 2 kernel.kptr_restrict = 2 kernel.unprivileged_bpf_disabled = 1 #kernel.modules_disabled = 1 # Uncomment to disable module loading entirely at your own risk kernel.sysrq = 0 kernel.core_uses_pid = 1 fs.suid_dumpable = 0 fs.protected_fifos = 2 fs.protected_hardlinks = 1 fs.protected_regular = 2 fs.protected_symlinks = 1 dev.tty.ldisc_autoload = 0 net.core.bpf_jit_harden = 2 net.ipv4.conf.all.forwarding = 0 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.all.log_martians = 1 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.default.log_martians = 1 net.ipv6.conf.all.accept_redirects = 0 net.ipv6.conf.default.accept_redirects = 0 EOL sudo sysctl --system # [SHLL-6220] Idle session handling echo 'TMOUT=900' | sudo tee -a /etc/profile > /dev/null echo 'readonly TMOUT' | sudo tee -a /etc/profile > /dev/null echo 'export TMOUT' | sudo tee -a /etc/profile > /dev/null # [MACF-6290] Enable MAC framework (AppArmor) sudo pacman -S --noconfirm --needed apparmor apparmor.d-git sudo systemctl enable --now apparmor # [FILE-6344] Restricting process details to users ## Editing fstab if ! grep -q '^proc\s\+/proc\s\+proc\s\+' /etc/fstab; then echo '# /proc' | sudo tee -a /etc/fstab > /dev/null echo 'proc /proc proc defaults,hidepid=2,gid=wheel 0 0' | sudo tee -a /etc/fstab > /dev/null else sudo sed -i 's|^proc[[:space:]]\+/proc[[:space:]]\+proc[[:space:]]\+.*$|proc /proc proc defaults,hidepid=1,gid=wheel 0 0|' /etc/fstab fi ## Remount /proc to apply changes immediately sudo systemctl daemon-reload sudo mount -o remount /proc # [FILE-6374] Check mount options # if /dev/shm is not in /etc/fstab, add it with the correct options if ! grep -q '^tmpfs\s\+/dev/shm\s\+tmpfs\s\+' /etc/fstab; then echo '# /dev/shm' | sudo tee -a /etc/fstab > /dev/null echo 'tmpfs /dev/shm tmpfs rw,nosuid,nodev,noexec 0 0' | sudo tee -a /etc/fstab > /dev/null else sudo sed -i 's|^tmpfs[[:space:]]\+/dev/shm[[:space:]]\+tmpfs[[:space:]]\+.*$|tmpfs /dev/shm tmpfs rw,nosuid,nodev,noexec 0 0|' /etc/fstab fi # Remount /dev/shm to apply changes immediately sudo systemctl daemon-reload sudo mount -o remount /dev/shm # Replace /tmp mount if ! grep -q '^tmpfs\s\+/tmp\s\+tmpfs\s\+' /etc/fstab; then echo '# /tmp' | sudo tee -a /etc/fstab > /dev/null echo 'tmpfs /tmp tmpfs rw,nosuid,nodev,noexec 0 0' | sudo tee -a /etc/fstab > /dev/null else sudo sed -i 's|^tmpfs[[:space:]]\+/tmp[[:space:]]\+tmpfs[[:space:]]\+.*$|tmpfs /tmp tmpfs rw,nosuid,nodev,noexec 0 0|' /etc/fstab fi # Remount /tmp to apply changes immediately sudo systemctl daemon-reload sudo mount -o remount /tmp # [FILE-6430] Disable mounting of some filesystems sudo tee /etc/modprobe.d/fs_blacklist.conf > /dev/null < /dev/null <> /etc/pacman.conf' fi fi # [HRDN-7222] Restricting compilator access to root user only sudo chown 700 /usr/bin/as sudo chmod 700 /usr/bin/gcc sudo chmod 700 /usr/bin/g++ sudo chmod 700 /usr/bin/cc sudo chmod 700 /usr/bin/c++ sudo chmod 700 /usr/bin/ld sudo chmod 700 /usr/bin/lld sudo chmod 700 /usr/bin/clang # [PKGS-7320] Checking for package auditing tools sudo pacman -S --noconfirm --needed arch-audit # [FILE-7524] Ensuring file permissions sudo chmod 600 /etc/ssh/sshd_config sudo chmod 700 /etc/cron.hourly # [CRYP-8004] Presence of hardware random number generator sudo pacman -S --noconfirm --needed rng-tools sudo systemctl enable --now rngd # [CRYP-8005] Presence of software pseudo random number generator #sudo pacman -S --noconfirm --needed haveged #sudo systemctl enable --now haveged # [CRYP-8006] Ensure MemoryOverwriteRequest-bit set sudo tee /usr/lib/systemd/system-shutdown/mor-bit-wipe.sh > /dev/null <<'EOL' #!/bin/bash # Path to the MemoryOverwriteRequestControl UEFI variable MOR_VAR_PATH="/sys/firmware/efi/efivars/MemoryOverwriteRequestControl-e20939be-32d4-41be-a150-897f85d49829" # Check if the UEFI variable path exists if [ -e "$MOR_VAR_PATH" ]; then # The expected format is: Attributes (4 bytes) + Value (1 byte for MOR state) # We need to write 5 bytes in total: 0x07 0x00 0x00 0x00 (Attributes) + 0x01 (MOR-bit set) # Use printf to create the necessary 5-byte data and write it to the variable # 0x01 means MOR is SET (request memory wipe) printf "\x07\x00\x00\x00\x01" | dd of="$MOR_VAR_PATH" bs=5 count=1 conv=notrunc >/dev/null 2>&1 # Log the action (optional, for debugging/audit logs) echo "$(date) - Successfully set MOR-bit (MemoryOverwriteRequestControl) for next boot memory wipe." >> /var/log/mor-wipe.log fi exit 0 EOL sudo chmod +x /usr/lib/systemd/system-shutdown/mor-bit-wipe.sh # [AUTH-9230] Ensure password hashing algorithm is set to YESCRYPT and hashing rounds to minimum of 5000 and maximum of 5000000 sudo sed -i 's/^ENCRYPT_METHOD .*/ENCRYPT_METHOD YESCRYPT/' /etc/login.defs sudo sed -i 's/^#SHA_CRYPT_MIN_ROUNDS .*/SHA_CRYPT_MIN_ROUNDS 5000/' /etc/login.defs sudo sed -i 's/^#SHA_CRYPT_MAX_ROUNDS .*/SHA_CRYPT_MAX_ROUNDS 5000000/' /etc/login.defs # [AUTH-9262] Password strength checking tool is installed sudo pacman -S --noconfirm --needed libpwquality sudo tee /etc/security/pwquality.conf > /dev/null < /dev/null fi if sudo grep -qE '^[[:space:]]*#?[[:space:]]*umask' /etc/profile; then sudo sed -i 's/^[[:space:]]*#\?[[:space:]]*umask.*/umask 027/' /etc/profile else echo 'umask 027' | sudo tee -a /etc/profile > /dev/null fi # [AUTH-9408] Logging of failed login attempts is enabled if sudo grep FAILLOG_ENAB /etc/login.defs; then sudo sed -i 's/^FAILLOG_ENAB .*/FAILLOG_ENAB yes/' /etc/login.defs else echo 'FAILLOG_ENAB yes' | sudo tee -a /etc/login.defs > /dev/null fi # [ACCT-9622] Enable process accounting sudo pacman -S --noconfirm --needed acct sudo systemctl enable --now acct # [ACCT-9626] Enable sysstat to collect accounting data sudo pacman -S --noconfirm --needed sysstat sudo systemctl enable --now sysstat-collect.timer sysstat-rotate.timer # [ACCT-9628] Enable auditd to collect audit data sudo systemctl enable --now auditd audit-rules # [ACCT-9630] Configure auditd rules sudo tee /etc/audit/rules.d/10-harden.rules > /dev/null < /dev/null <