2025-09-22 16:50:35 -07:00
|
|
|
#!/bin/bash
|
|
|
|
|
|
|
|
# Real-time attack monitoring for HAProxy
|
|
|
|
# Shows blocked requests and suspicious activity
|
|
|
|
|
|
|
|
LOG_FILE="/var/log/haproxy.log"
|
|
|
|
SOCKET="/tmp/haproxy-cli"
|
|
|
|
|
|
|
|
echo "==================================================="
|
|
|
|
echo "HAProxy Security Monitor - Real-time Attack Detection"
|
|
|
|
echo "==================================================="
|
|
|
|
echo ""
|
|
|
|
|
|
|
|
# Function to show current threats
|
|
|
|
show_threats() {
|
2025-09-22 17:13:26 -07:00
|
|
|
echo "Current Threat IPs (Rate Limiting Table):"
|
2025-09-22 16:50:35 -07:00
|
|
|
echo "show table web" | socat stdio "$SOCKET" 2>/dev/null | \
|
2025-09-22 17:13:26 -07:00
|
|
|
awk '$4 > 0 || $5 > 20 || $6 > 5 || $7 > 10 {
|
|
|
|
printf "%-15s req_rate:%-3s err_rate:%-3s conn_rate:%-3s marked:%s\n",
|
|
|
|
$1, $5, $6, $7, $4
|
|
|
|
}' | head -10
|
|
|
|
|
|
|
|
echo ""
|
|
|
|
echo "Blacklisted IPs (24h tracking):"
|
|
|
|
echo "show table security_blacklist" | socat stdio "$SOCKET" 2>/dev/null | \
|
|
|
|
awk '$4 > 0 || $5 > 0 {
|
|
|
|
printf "%-15s blacklisted:%s violations:%s\n",
|
|
|
|
$1, $4, $5
|
|
|
|
}' | head -10
|
|
|
|
|
|
|
|
echo ""
|
|
|
|
echo "WordPress 403 Failures:"
|
|
|
|
echo "show table wp_403_track" | socat stdio "$SOCKET" 2>/dev/null | \
|
|
|
|
awk '$4 > 2 {
|
|
|
|
printf "%-15s 403_rate:%-3s\n",
|
|
|
|
$1, $4
|
|
|
|
}' | head -10
|
2025-09-22 16:50:35 -07:00
|
|
|
echo "---------------------------------------------------"
|
|
|
|
}
|
|
|
|
|
|
|
|
# Function to show recent blocks
|
|
|
|
show_recent_blocks() {
|
|
|
|
echo "Recent Blocked Requests:"
|
|
|
|
tail -100 "$LOG_FILE" 2>/dev/null | \
|
2025-09-22 17:37:16 -07:00
|
|
|
grep -E "(high_threat|medium_threat|low_threat|critical_threat|tarpit|denied|403)" | \
|
2025-09-22 16:50:35 -07:00
|
|
|
tail -10 | \
|
|
|
|
awk '{
|
|
|
|
if (match($0, /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+/)) {
|
|
|
|
ip = substr($0, RSTART, RLENGTH)
|
|
|
|
gsub(/:.*/, "", ip)
|
|
|
|
reason = ""
|
2025-09-22 17:37:16 -07:00
|
|
|
if ($0 ~ /high_threat/) reason = "HIGH_THREAT"
|
|
|
|
else if ($0 ~ /critical_threat/) reason = "CRITICAL_THREAT"
|
|
|
|
else if ($0 ~ /medium_threat/) reason = "MEDIUM_THREAT"
|
|
|
|
else if ($0 ~ /low_threat/) reason = "LOW_THREAT"
|
2025-09-22 16:50:35 -07:00
|
|
|
else if ($0 ~ /tarpit/) reason = "TARPIT"
|
|
|
|
else if ($0 ~ /denied/) reason = "DENIED"
|
2025-09-22 17:37:16 -07:00
|
|
|
else if ($0 ~ /403/) reason = "BLOCKED"
|
2025-09-22 16:50:35 -07:00
|
|
|
printf "[%s] %-15s %s\n", strftime("%H:%M:%S"), ip, reason
|
|
|
|
}
|
|
|
|
}'
|
|
|
|
echo ""
|
|
|
|
}
|
|
|
|
|
|
|
|
# Monitor mode selection
|
|
|
|
if [ "$1" == "live" ]; then
|
|
|
|
echo "Live monitoring mode - Press Ctrl+C to exit"
|
|
|
|
echo ""
|
|
|
|
|
|
|
|
while true; do
|
|
|
|
clear
|
|
|
|
echo "==================================================="
|
|
|
|
echo "HAProxy Security Monitor - $(date '+%Y-%m-%d %H:%M:%S')"
|
|
|
|
echo "==================================================="
|
|
|
|
echo ""
|
|
|
|
show_threats
|
|
|
|
echo ""
|
|
|
|
show_recent_blocks
|
|
|
|
sleep 5
|
|
|
|
done
|
|
|
|
else
|
|
|
|
# Single run mode
|
|
|
|
show_threats
|
|
|
|
echo ""
|
|
|
|
show_recent_blocks
|
|
|
|
echo ""
|
|
|
|
echo "Tip: Run with 'live' parameter for continuous monitoring"
|
|
|
|
echo "Usage: $0 [live]"
|
|
|
|
fi
|