feat: initial setup for PVE security scanner VM

Scripts for deploying a hardened internal network security scanner on Proxmox VE:
- PVE-level firewall and VM creation
- System hardening (sysctl, auditd, AIDE)
- nftables firewall with dynamic IP blocking
- SSH hardening with fail2ban
- Security tools (OpenVAS, Nmap, Nuclei, httpx, Nikto, testssl, NetExec)
- Monitoring, logging, and Docker autostart
This commit is contained in:
Yaojia Wang
2026-03-08 20:21:29 +01:00
commit 5e49b977ab
10 changed files with 1511 additions and 0 deletions

207
vm/01-system-harden.sh Normal file
View File

@@ -0,0 +1,207 @@
#!/bin/bash
# =============================================================================
# System Hardening for Security Scanner VM
# Run this inside the VM as root
# =============================================================================
set -euo pipefail
echo "============================================"
echo " System Hardening - Security Scanner VM"
echo "============================================"
# --- 1. Update system ---
echo "[+] Updating system packages..."
apt update && apt upgrade -y
apt install -y unattended-upgrades apt-listchanges
# Enable automatic security updates
cat > /etc/apt/apt.conf.d/50unattended-upgrades << 'EOF'
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}-security";
};
Unattended-Upgrade::AutoFixInterruptedDpkg "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
Unattended-Upgrade::Automatic-Reboot "false";
EOF
dpkg-reconfigure -f noninteractive unattended-upgrades
# --- 2. Kernel hardening (sysctl) ---
echo "[+] Applying kernel hardening..."
cat > /etc/sysctl.d/99-security-scanner.conf << 'EOF'
# --- Network hardening ---
# Disable IP forwarding (scanner should not route traffic)
net.ipv4.ip_forward = 0
net.ipv6.conf.all.forwarding = 0
# Ignore ICMP redirects
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
# Don't send ICMP redirects
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
# Enable reverse path filtering (anti-spoofing)
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# Ignore broadcast pings
net.ipv4.icmp_echo_ignore_broadcasts = 1
# Enable SYN flood protection
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
# Log suspicious packets
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
# Disable source routing
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# --- Memory protection ---
# Restrict dmesg access
kernel.dmesg_restrict = 1
# Restrict kernel pointer exposure
kernel.kptr_restrict = 2
# Enable ASLR
kernel.randomize_va_space = 2
# Restrict ptrace
kernel.yama.ptrace_scope = 2
# --- File system ---
# Restrict core dumps
fs.suid_dumpable = 0
EOF
sysctl -p /etc/sysctl.d/99-security-scanner.conf
# --- 3. Restrict core dumps ---
echo "[+] Disabling core dumps..."
cat > /etc/security/limits.d/99-no-core.conf << 'EOF'
* hard core 0
* soft core 0
EOF
# --- 4. Secure shared memory ---
echo "[+] Securing shared memory..."
if ! grep -q "tmpfs /dev/shm" /etc/fstab; then
echo "tmpfs /dev/shm tmpfs defaults,noexec,nosuid,nodev 0 0" >> /etc/fstab
fi
# --- 5. Set file permissions ---
echo "[+] Hardening file permissions..."
chmod 700 /root
chmod 600 /etc/crontab
chmod 700 /etc/cron.d
chmod 700 /etc/cron.daily
chmod 700 /etc/cron.hourly
chmod 700 /etc/cron.weekly
chmod 700 /etc/cron.monthly
# --- 6. Disable unnecessary services ---
echo "[+] Disabling unnecessary services..."
DISABLE_SERVICES=(
"avahi-daemon"
"cups"
"rpcbind"
"bluetooth"
)
for svc in "${DISABLE_SERVICES[@]}"; do
if systemctl is-enabled "${svc}" 2>/dev/null; then
systemctl disable --now "${svc}"
echo " Disabled: ${svc}"
fi
done
# --- 7. Install security tools ---
echo "[+] Installing security audit tools..."
apt install -y \
aide \
rkhunter \
lynis \
auditd \
audispd-plugins \
fail2ban \
logwatch
# --- 8. Initialize AIDE (file integrity monitoring) ---
echo "[!] Initializing AIDE database - this may take 10-20 minutes..."
aideinit
cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db
# --- 9. Configure auditd ---
echo "[+] Configuring audit rules..."
cat > /etc/audit/rules.d/scanner-audit.rules << 'EOF'
# Delete all existing rules
-D
# Buffer size
-b 8192
# Failure mode (1=printk, 2=panic)
-f 1
# Monitor /etc changes
-w /etc/ -p wa -k etc_changes
# Monitor authentication
-w /var/log/auth.log -p wa -k auth_log
-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
# Monitor sudo usage
-w /etc/sudoers -p wa -k sudoers
-w /etc/sudoers.d/ -p wa -k sudoers
# Monitor network config changes
-w /etc/hosts -p wa -k network
-w /etc/network/ -p wa -k network
-w /etc/nftables.conf -p wa -k firewall
# Monitor cron changes
-w /etc/crontab -p wa -k cron
-w /etc/cron.d/ -p wa -k cron
# Monitor scanner tool configs
-w /opt/greenbone/ -p wa -k scanner_config
# Lock audit rules (requires reboot to change)
-e 2
EOF
systemctl restart auditd
# --- 10. Password policy ---
echo "[+] Setting password policy..."
apt install -y libpam-pwquality
sed -i 's/^#\s*minlen.*/minlen = 12/' /etc/security/pwquality.conf
sed -i 's/^#\s*minclass.*/minclass = 3/' /etc/security/pwquality.conf
sed -i 's/^#\s*maxrepeat.*/maxrepeat = 3/' /etc/security/pwquality.conf
# Verify settings were applied
for setting in minlen minclass maxrepeat; do
if ! grep -q "^${setting}" /etc/security/pwquality.conf; then
echo "[!] WARNING: ${setting} was not set - appending to config"
case "${setting}" in
minlen) echo "minlen = 12" >> /etc/security/pwquality.conf ;;
minclass) echo "minclass = 3" >> /etc/security/pwquality.conf ;;
maxrepeat) echo "maxrepeat = 3" >> /etc/security/pwquality.conf ;;
esac
fi
done
echo ""
echo "[+] System hardening complete."
echo "[!] Reboot recommended: shutdown -r now"