WAF防护Linux交互式脚本

陌路离殇
2025-09-03 / 0 评论 / 3 阅读

代码

#!/bin/bash

# WAF防护配置脚本
# 作者: 系统安全助手
# 版本: 2.0
# 功能: 全面的Linux Web应用防火墙配置

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color

# 脚本目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CONFIG_DIR="$SCRIPT_DIR/waf_configs"
LOGS_DIR="$SCRIPT_DIR/waf_logs"
BACKUP_DIR="$SCRIPT_DIR/waf_backups"
RULES_DIR="$SCRIPT_DIR/waf_rules"

# 创建必要的目录
mkdir -p "$CONFIG_DIR" "$LOGS_DIR" "$BACKUP_DIR" "$RULES_DIR"

# 配置文件
MAIN_CONFIG="$CONFIG_DIR/waf_main.conf"
NGINX_CONFIG="$CONFIG_DIR/waf_nginx.conf"
APACHE_CONFIG="$CONFIG_DIR/waf_apache.conf"
CUSTOM_RULES="$RULES_DIR/custom_rules.conf"

# 日志文件
INSTALL_LOG="$LOGS_DIR/install.log"
ACCESS_LOG="$LOGS_DIR/waf_access.log"
BLOCK_LOG="$LOGS_DIR/waf_block.log"

# 备份文件
BACKUP_PREFIX="$BACKUP_DIR/waf_backup_$(date +%Y%m%d_%H%M%S)"

# 当前配置状态
CURRENT_CONFIG=""

# 显示横幅
show_banner() {
    clear
    echo -e "${CYAN}"
    echo "╔════════════════════════════════════════════════════════════╗"
    echo "║                高级WAF防护配置脚本 v2.0                    ║"
    echo "║                 全面Linux Web应用防火墙                     ║"
    echo "╚════════════════════════════════════════════════════════════╝"
    echo -e "${NC}"
    echo -e "${YELLOW}脚本目录: $SCRIPT_DIR${NC}"
    echo -e "${YELLOW}配置目录: $CONFIG_DIR${NC}"
    echo -e "${YELLOW}日志目录: $LOGS_DIR${NC}"
    echo "════════════════════════════════════════════════════════════"
    echo
}

# 日志记录函数
log_message() {
    local level=$1
    local message=$2
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    
    case $level in
        "INFO")
            echo -e "${GREEN}[INFO]${NC} $message"
            ;;
        "WARN")
            echo -e "${YELLOW}[WARN]${NC} $message"
            ;;
        "ERROR")
            echo -e "${RED}[ERROR]${NC} $message"
            ;;
        "DEBUG")
            echo -e "${BLUE}[DEBUG]${NC} $message"
            ;;
    esac
    
    echo "[$timestamp] [$level] $message" >> "$INSTALL_LOG"
}

# 检查依赖
check_dependencies() {
    log_message "INFO" "检查系统依赖..."
    
    local missing_deps=()
    
    # 检查常用工具
    for cmd in curl wget grep awk sed iptables; do
        if ! command -v $cmd &> /dev/null; then
            missing_deps+=($cmd)
        fi
    done
    
    # 检查Web服务器
    if systemctl is-active --quiet nginx 2>/dev/null; then
        WEB_SERVER="nginx"
        log_message "INFO" "检测到Nginx服务器"
    elif systemctl is-active --quiet apache2 2>/dev/null || systemctl is-active --quiet httpd 2>/dev/null; then
        WEB_SERVER="apache"
        log_message "INFO" "检测到Apache服务器"
    else
        log_message "WARN" "未检测到运行中的Web服务器"
        WEB_SERVER="unknown"
    fi
    
    if [ ${#missing_deps[@]} -gt 0 ]; then
        log_message "WARN" "缺少以下依赖: ${missing_deps[*]}"
        read -p "是否安装缺少的依赖? (y/n): " choice
        if [ "$choice" = "y" ]; then
            if [ -f /etc/debian_version ]; then
                sudo apt-get update
                sudo apt-get install -y ${missing_deps[@]}
            elif [ -f /etc/redhat-release ]; then
                sudo yum install -y ${missing_deps[@]}
            else
                log_message "ERROR" "无法确定系统发行版,请手动安装依赖"
            fi
        fi
    fi
    
    return 0
}

# 备份当前配置
backup_config() {
    log_message "INFO" "备份当前配置..."
    
    # 备份iptables规则
    sudo iptables-save > "${BACKUP_PREFIX}_iptables.rules" 2>/dev/null
    
    # 备份系统文件
    local files_to_backup=(
        "/etc/sysctl.conf"
        "/etc/hosts.allow"
        "/etc/hosts.deny"
        "/etc/security/limits.conf"
    )
    
    for file in "${files_to_backup[@]}"; do
        if [ -f "$file" ]; then
            sudo cp "$file" "${BACKUP_PREFIX}_$(basename $file)"
        fi
    done
    
    # 备份Web服务器配置
    if [ "$WEB_SERVER" = "nginx" ] && [ -f "/etc/nginx/nginx.conf" ]; then
        sudo cp /etc/nginx/nginx.conf "${BACKUP_PREFIX}_nginx.conf"
    elif [ "$WEB_SERVER" = "apache" ]; then
        if [ -f "/etc/apache2/apache2.conf" ]; then
            sudo cp /etc/apache2/apache2.conf "${BACKUP_PREFIX}_apache.conf"
        elif [ -f "/etc/httpd/conf/httpd.conf" ]; then
            sudo cp /etc/httpd/conf/httpd.conf "${BACKUP_PREFIX}_httpd.conf"
        fi
    fi
    
    log_message "INFO" "配置已备份到: $BACKUP_DIR"
}

# 加载配置
load_config() {
    if [ -f "$MAIN_CONFIG" ]; then
        source "$MAIN_CONFIG"
        log_message "INFO" "加载现有配置"
    else
        # 默认配置
        ENABLE_SQL_INJECTION="true"
        ENABLE_XSS="true"
        ENABLE_RFI_LFI="true"
        ENABLE_COMMAND_INJECTION="true"
        ENABLE_BRUTE_FORCE="true"
        ENABLE_DDOS="true"
        ENABLE_BOT_PROTECTION="true"
        ENABLE_FILE_UPLOAD="true"
        ENABLE_HOTLINKING="true"
        ENABLE_SENSITIVE_DATA="true"
        
        BLOCK_THRESHOLD=10
        BAN_TIME=3600
        RATE_LIMIT=100
        MAX_CONNECTIONS=50
        
        log_message "INFO" "使用默认配置"
    fi
}

# 保存配置
save_config() {
    cat > "$MAIN_CONFIG" << EOF
# WAF主配置文件
# 生成时间: $(date)

# 防护模块开关
ENABLE_SQL_INJECTION="$ENABLE_SQL_INJECTION"
ENABLE_XSS="$ENABLE_XSS"
ENABLE_RFI_LFI="$ENABLE_RFI_LFI"
ENABLE_COMMAND_INJECTION="$ENABLE_COMMAND_INJECTION"
ENABLE_BRUTE_FORCE="$ENABLE_BRUTE_FORCE"
ENABLE_DDOS="$ENABLE_DDOS"
ENABLE_BOT_PROTECTION="$ENABLE_BOT_PROTECTION"
ENABLE_FILE_UPLOAD="$ENABLE_FILE_UPLOAD"
ENABLE_HOTLINKING="$ENABLE_HOTLINKING"
ENABLE_SENSITIVE_DATA="$ENABLE_SENSITIVE_DATA"

# 防护参数
BLOCK_THRESHOLD="$BLOCK_THRESHOLD"
BAN_TIME="$BAN_TIME"
RATE_LIMIT="$RATE_LIMIT"
MAX_CONNECTIONS="$MAX_CONNECTIONS"

# 自定义规则文件
CUSTOM_RULES_FILE="$CUSTOM_RULES"

# 日志文件
ACCESS_LOG="$ACCESS_LOG"
BLOCK_LOG="$BLOCK_LOG"
EOF
    
    log_message "INFO" "配置已保存到: $MAIN_CONFIG"
}

# 显示当前配置
show_current_config() {
    echo -e "${CYAN}════════════════════ 当前WAF配置 ════════════════════${NC}"
    echo -e "${YELLOW}防护模块:${NC}"
    echo -e "  SQL注入防护: ${GREEN}$ENABLE_SQL_INJECTION${NC}"
    echo -e "  XSS防护: ${GREEN}$ENABLE_XSS${NC}"
    echo -e "  RFI/LFI防护: ${GREEN}$ENABLE_RFI_LFI${NC}"
    echo -e "  命令注入防护: ${GREEN}$ENABLE_COMMAND_INJECTION${NC}"
    echo -e "  暴力破解防护: ${GREEN}$ENABLE_BRUTE_FORCE${NC}"
    echo -e "  DDoS防护: ${GREEN}$ENABLE_DDOS${NC}"
    echo -e "  机器人防护: ${GREEN}$ENABLE_BOT_PROTECTION${NC}"
    echo -e "  文件上传防护: ${GREEN}$ENABLE_FILE_UPLOAD${NC}"
    echo -e "  盗链防护: ${GREEN}$ENABLE_HOTLINKING${NC}"
    echo -e "  敏感数据防护: ${GREEN}$ENABLE_SENSITIVE_DATA${NC}"
    echo
    echo -e "${YELLOW}防护参数:${NC}"
    echo -e "  阻断阈值: ${BLUE}$BLOCK_THRESHOLD${NC} 次/分钟"
    echo -e "  封禁时间: ${BLUE}$BAN_TIME${NC} 秒"
    echo -e "  速率限制: ${BLUE}$RATE_LIMIT${NC} 请求/秒"
    echo -e "  最大连接数: ${BLUE}$MAX_CONNECTIONS${NC}"
    echo -e "${CYAN}════════════════════════════════════════════════════${NC}"
}

# 自定义配置菜单
custom_config_menu() {
    while true; do
        clear
        show_banner
        show_current_config
        
        echo -e "${PURPLE}════════════════════ 自定义配置 ════════════════════${NC}"
        echo " 1) 切换SQL注入防护 [$ENABLE_SQL_INJECTION]"
        echo " 2) 切换XSS防护 [$ENABLE_XSS]"
        echo " 3) 切换RFI/LFI防护 [$ENABLE_RFI_LFI]"
        echo " 4) 切换命令注入防护 [$ENABLE_COMMAND_INJECTION]"
        echo " 5) 切换暴力破解防护 [$ENABLE_BRUTE_FORCE]"
        echo " 6) 切换DDoS防护 [$ENABLE_DDOS]"
        echo " 7) 切换机器人防护 [$ENABLE_BOT_PROTECTION]"
        echo " 8) 切换文件上传防护 [$ENABLE_FILE_UPLOAD]"
        echo " 9) 切换盗链防护 [$ENABLE_HOTLINKING]"
        echo "10) 切换敏感数据防护 [$ENABLE_SENSITIVE_DATA]"
        echo "11) 修改防护参数"
        echo "12) 管理自定义规则"
        echo "13) 保存配置并返回主菜单"
        echo "14) 返回主菜单(不保存)"
        echo -e "${PURPLE}════════════════════════════════════════════════════${NC}"
        
        read -p "请选择选项 [1-14]: " choice
        
        case $choice in
            1)
                [ "$ENABLE_SQL_INJECTION" = "true" ] && ENABLE_SQL_INJECTION="false" || ENABLE_SQL_INJECTION="true"
                ;;
            2)
                [ "$ENABLE_XSS" = "true" ] && ENABLE_XSS="false" || ENABLE_XSS="true"
                ;;
            3)
                [ "$ENABLE_RFI_LFI" = "true" ] && ENABLE_RFI_LFI="false" || ENABLE_RFI_LFI="true"
                ;;
            4)
                [ "$ENABLE_COMMAND_INJECTION" = "true" ] && ENABLE_COMMAND_INJECTION="false" || ENABLE_COMMAND_INJECTION="true"
                ;;
            5)
                [ "$ENABLE_BRUTE_FORCE" = "true" ] && ENABLE_BRUTE_FORCE="false" || ENABLE_BRUTE_FORCE="true"
                ;;
            6)
                [ "$ENABLE_DDOS" = "true" ] && ENABLE_DDOS="false" || ENABLE_DDOS="true"
                ;;
            7)
                [ "$ENABLE_BOT_PROTECTION" = "true" ] && ENABLE_BOT_PROTECTION="false" || ENABLE_BOT_PROTECTION="true"
                ;;
            8)
                [ "$ENABLE_FILE_UPLOAD" = "true" ] && ENABLE_FILE_UPLOAD="false" || ENABLE_FILE_UPLOAD="true"
                ;;
            9)
                [ "$ENABLE_HOTLINKING" = "true" ] && ENABLE_HOTLINKING="false" || ENABLE_HOTLINKING="true"
                ;;
            10)
                [ "$ENABLE_SENSITIVE_DATA" = "true" ] && ENABLE_SENSITIVE_DATA="false" || ENABLE_SENSITIVE_DATA="true"
                ;;
            11)
                modify_parameters
                ;;
            12)
                manage_custom_rules
                ;;
            13)
                save_config
                log_message "INFO" "配置已保存"
                sleep 2
                return 0
                ;;
            14)
                read -p "确定放弃修改? (y/n): " confirm
                if [ "$confirm" = "y" ]; then
                    load_config  # 重新加载配置
                    return 0
                fi
                ;;
            *)
                echo -e "${RED}无效选项${NC}"
                sleep 1
                ;;
        esac
    done
}

# 修改防护参数
modify_parameters() {
    echo -e "${CYAN}════════════════════ 修改防护参数 ════════════════════${NC}"
    
    echo -e "当前阻断阈值: ${BLUE}$BLOCK_THRESHOLD${NC} 次/分钟"
    read -p "新的阻断阈值 (默认10): " new_threshold
    [ -n "$new_threshold" ] && BLOCK_THRESHOLD=$new_threshold
    
    echo -e "当前封禁时间: ${BLUE}$BAN_TIME${NC} 秒"
    read -p "新的封禁时间 (默认3600): " new_ban
    [ -n "$new_ban" ] && BAN_TIME=$new_ban
    
    echo -e "当前速率限制: ${BLUE}$RATE_LIMIT${NC} 请求/秒"
    read -p "新的速率限制 (默认100): " new_rate
    [ -n "$new_rate" ] && RATE_LIMIT=$new_rate
    
    echo -e "当前最大连接数: ${BLUE}$MAX_CONNECTIONS${NC}"
    read -p "新的最大连接数 (默认50): " new_max
    [ -n "$new_max" ] && MAX_CONNECTIONS=$new_max
    
    echo -e "${GREEN}参数已更新${NC}"
    sleep 1
}

# 管理自定义规则
manage_custom_rules() {
    while true; do
        clear
        show_banner
        
        echo -e "${CYAN}════════════════════ 自定义规则管理 ════════════════════${NC}"
        echo " 1) 查看当前规则"
        echo " 2) 添加新规则"
        echo " 3) 编辑规则文件"
        echo " 4) 导入规则集"
        echo " 5) 清空所有规则"
        echo " 6) 返回上一级"
        echo -e "${CYAN}════════════════════════════════════════════════════════${NC}"
        
        read -p "请选择选项 [1-6]: " choice
        
        case $choice in
            1)
                if [ -f "$CUSTOM_RULES" ] && [ -s "$CUSTOM_RULES" ]; then
                    echo -e "${GREEN}当前自定义规则:${NC}"
                    echo "════════════════════════════════════════"
                    cat "$CUSTOM_RULES"
                    echo "════════════════════════════════════════"
                else
                    echo -e "${YELLOW}暂无自定义规则${NC}"
                fi
                read -p "按Enter继续..."
                ;;
            2)
                echo -e "${GREEN}添加自定义规则${NC}"
                echo "示例: deny '恶意User-Agent' 'BadBot'"
                echo "格式: <动作> <描述> <匹配模式>"
                echo -n "请输入规则: "
                read rule
                if [ -n "$rule" ]; then
                    echo "# 自定义规则 - 添加于 $(date)" >> "$CUSTOM_RULES"
                    echo "$rule" >> "$CUSTOM_RULES"
                    echo -e "${GREEN}规则已添加${NC}"
                fi
                sleep 1
                ;;
            3)
                if command -v nano &> /dev/null; then
                    nano "$CUSTOM_RULES"
                elif command -v vim &> /dev/null; then
                    vim "$CUSTOM_RULES"
                elif command -v vi &> /dev/null; then
                    vi "$CUSTOM_RULES"
                else
                    echo -e "${YELLOW}未找到文本编辑器,使用cat编辑${NC}"
                    cat > "$CUSTOM_RULES"
                fi
                ;;
            4)
                echo -e "${GREEN}导入规则集${NC}"
                echo "1) OWASP核心规则集"
                echo "2) 常见攻击规则"
                echo "3) 扫描器防护规则"
                read -p "选择规则集 [1-3]: " ruleset
                
                case $ruleset in
                    1)
                        import_owasp_rules
                        ;;
                    2)
                        import_common_attack_rules
                        ;;
                    3)
                        import_scanner_rules
                        ;;
                    *)
                        echo -e "${RED}无效选择${NC}"
                        ;;
                esac
                sleep 1
                ;;
            5)
                read -p "确定清空所有自定义规则? (y/n): " confirm
                if [ "$confirm" = "y" ]; then
                    > "$CUSTOM_RULES"
                    echo -e "${GREEN}规则已清空${NC}"
                fi
                sleep 1
                ;;
            6)
                return 0
                ;;
            *)
                echo -e "${RED}无效选项${NC}"
                sleep 1
                ;;
        esac
    done
}

# 导入OWASP规则
import_owasp_rules() {
    cat >> "$CUSTOM_RULES" << 'EOF'

# ========== OWASP核心规则集 ==========
# SQL注入防护规则
deny "SQL Injection - UNION" "union.*select"
deny "SQL Injection - SELECT" "select.*from"
deny "SQL Injection - INSERT" "insert.*into"
deny "SQL Injection - UPDATE" "update.*set"
deny "SQL Injection - DELETE" "delete.*from"
deny "SQL Injection - DROP" "drop.*table"
deny "SQL Injection - OR 1=1" "or.*1=1"
deny "SQL Injection -- comment" "--"

# XSS防护规则
deny "XSS - Script Tag" "<script>"
deny "XSS - Javascript Protocol" "javascript:"
deny "XSS - onload Event" "onload="
deny "XSS - onerror Event" "onerror="
deny "XSS - eval()" "eval\("

# 命令注入防护规则
deny "Command Injection - Pipe" "\|"
deny "Command Injection - Semicolon" ";"
deny "Command Injection - Backtick" "`"
deny "Command Injection - Dollar" "\$\(.*\)"
EOF
    echo -e "${GREEN}OWASP规则集已导入${NC}"
}

# 导入常见攻击规则
import_common_attack_rules() {
    cat >> "$CUSTOM_RULES" << 'EOF'

# ========== 常见攻击规则 ==========
# 目录遍历
deny "Directory Traversal" "\.\./"
deny "Directory Traversal" "\.\.\\"

# 文件包含
deny "File Inclusion" "\.\./\.\./"
deny "File Inclusion" "/etc/passwd"

# SSI注入
deny "SSI Injection" "<!--#"

# PHP攻击
deny "PHP Injection" "php://"
deny "PHP Code Injection" "eval\(base64_decode"

# Shellshock攻击
deny "Shellshock Attack" "\(\)\s*{" 

# 扫描器特征
deny "Scanner - Nikto" "nikto"
deny "Scanner - Acunetix" "acunetix"
deny "Scanner - Nessus" "nessus"
deny "Scanner - Netsparker" "netsparker"
EOF
    echo -e "${GREEN}常见攻击规则已导入${NC}"
}

# 生成iptables规则
generate_iptables_rules() {
    local iptables_file="$CONFIG_DIR/iptables_rules.sh"
    
    cat > "$iptables_file" << EOF
#!/bin/bash
# 自动生成的iptables规则
# 生成时间: $(date)

# 清除现有规则
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X

# 默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 允许SSH (端口22)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 允许HTTP (端口80)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# 允许HTTPS (端口443)
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# DDoS防护 - 限制连接数
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above $MAX_CONNECTIONS --connlimit-mask 32 -j DROP
iptables -A INPUT -p tcp --dport 443 -m connlimit --connlimit-above $MAX_CONNECTIONS --connlimit-mask 32 -j DROP

# 速率限制
iptables -A INPUT -p tcp --dport 80 -m limit --limit $RATE_LIMIT/second --limit-burst 200 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j DROP
iptables -A INPUT -p tcp --dport 443 -m limit --limit $RATE_LIMIT/second --limit-burst 200 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j DROP

# 防止SYN洪水攻击
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP

# 防止ping洪水攻击
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

# 保存规则
iptables-save > /etc/iptables/rules.v4

echo "iptables规则已应用"
EOF
    
    chmod +x "$iptables_file"
    log_message "INFO" "iptables规则已生成: $iptables_file"
}

# 生成Nginx WAF配置
generate_nginx_waf() {
    local nginx_waf="$CONFIG_DIR/nginx_waf.conf"
    
    cat > "$nginx_waf" << EOF
# Nginx WAF配置
# 生成时间: $(date)

# 限制请求大小
client_max_body_size 10M;

# 限制缓冲区大小
client_body_buffer_size 128k;
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;

# 超时设置
client_body_timeout 10;
client_header_timeout 10;
keepalive_timeout 5 5;
send_timeout 10;

# 限制请求方法
if (\$request_method !~ ^(GET|HEAD|POST)\$ ) {
    return 405;
}

# 阻止SQL注入
$(if [ "$ENABLE_SQL_INJECTION" = "true" ]; then
cat << 'SQL_RULES'
set \$block_sql_injection 0;
if (\$query_string ~* "union.*select.*\(") { set \$block_sql_injection 1; }
if (\$query_string ~* "union.*all.*select.*") { set \$block_sql_injection 1; }
if (\$query_string ~* "concat.*\(") { set \$block_sql_injection 1; }
if (\$query_string ~* "group.*by.*\(") { set \$block_sql_injection 1; }
if (\$query_string ~* "order.*by.*\(") { set \$block_sql_injection 1; }
if (\$block_sql_injection = 1) { return 403; }
SQL_RULES
fi)

# 阻止XSS攻击
$(if [ "$ENABLE_XSS" = "true" ]; then
cat << 'XSS_RULES'
set \$block_xss 0;
if (\$query_string ~* "<script.*>.*</script>") { set \$block_xss 1; }
if (\$query_string ~* "javascript:") { set \$block_xss 1; }
if (\$query_string ~* "onload\s*=") { set \$block_xss 1; }
if (\$query_string ~* "onerror\s*=") { set \$block_xss 1; }
if (\$query_string ~* "onclick\s*=") { set \$block_xss 1; }
if (\$block_xss = 1) { return 403; }
XSS_RULES
fi)

# 阻止目录遍历
$(if [ "$ENABLE_RFI_LFI" = "true" ]; then
cat << 'DIR_RULES'
set \$block_dir_traversal 0;
if (\$query_string ~* "\.\./") { set \$block_dir_traversal 1; }
if (\$query_string ~* "\.\.\\") { set \$block_dir_traversal 1; }
if (\$query_string ~* "etc/passwd") { set \$block_dir_traversal 1; }
if (\$query_string ~* "proc/self/environ") { set \$block_dir_traversal 1; }
if (\$block_dir_traversal = 1) { return 403; }
DIR_RULES
fi)

# 阻止命令注入
$(if [ "$ENABLE_COMMAND_INJECTION" = "true" ]; then
cat << 'CMD_RULES'
set \$block_command_injection 0;
if (\$query_string ~* "\|.*\/bin\/") { set \$block_command_injection 1; }
if (\$query_string ~* "\|.*\/bin\/sh") { set \$block_command_injection 1; }
if (\$query_string ~* "cmd\s*=") { set \$block_command_injection 1; }
if (\$query_string ~* "exec\s*=") { set \$block_command_injection 1; }
if (\$block_command_injection = 1) { return 403; }
CMD_RULES
fi)

# 文件上传防护
$(if [ "$ENABLE_FILE_UPLOAD" = "true" ]; then
cat << 'UPLOAD_RULES'
# 限制上传文件类型
location ~* \.(php|pl|py|jsp|asp|sh|cgi)\$ {
    return 403;
}

# 防止执行上传的脚本
location ~* /uploads/.*\.(php|pl|py|jsp|asp|sh|cgi)\$ {
    return 403;
}
UPLOAD_RULES
fi)

# 防盗链
$(if [ "$ENABLE_HOTLINKING" = "true" ]; then
cat << 'HOTLINK_RULES'
location ~* \.(jpg|jpeg|png|gif|ico|css|js)\$ {
    valid_referers none blocked server_names ~\.google\. ~\.bing\. ~\.yahoo\.
                 *.example.com example.com;
    if (\$invalid_referer) {
        return 403;
    }
}
HOTLINK_RULES
fi)

# 阻止常见扫描器
$(if [ "$ENABLE_BOT_PROTECTION" = "true" ]; then
cat << 'SCANNER_RULES'
set \$block_scanner 0;
if (\$http_user_agent ~* (nikto|wikto|acunetix|nessus|netsparker|w3af|owasp|paros|burpsuite)) { set \$block_scanner 1; }
if (\$http_user_agent ~* (sqlmap|havij|sqlninja|pangolin)) { set \$block_scanner 1; }
if (\$http_user_agent ~* (masscan|nmap|nessus|openvas)) { set \$block_scanner 1; }
if (\$block_scanner = 1) { return 403; }

# 阻止空User-Agent
if (\$http_user_agent = "") { return 403; }

# 阻止异常User-Agent
if (\$http_user_agent ~* (libwww-perl|wget|curl|python|java|jakarta|httpclient)) { 
    return 403; 
}
SCANNER_RULES
fi)

# 速率限制
limit_req_zone \$binary_remote_addr zone=one:10m rate=${RATE_LIMIT}r/s;
limit_req_zone \$binary_remote_addr zone=two:10m rate=5r/s;

server {
    # 全局速率限制
    limit_req zone=one burst=20 nodelay;
    
    location /login {
        # 登录页面更严格的限制
        limit_req zone=two burst=5 nodelay;
    }
    
    location /admin {
        # 后台管理限制
        limit_req zone=two burst=10 nodelay;
    }
}

# 访问日志格式
log_format waf '\$remote_addr - \$remote_user [\$time_local] "\$request" '
               '\$status \$body_bytes_sent "\$http_referer" '
               '"\$http_user_agent" "\$http_x_forwarded_for" '
               'blocked=\$block_sql_injection\$block_xss\$block_dir_traversal\$block_command_injection';

access_log $ACCESS_LOG waf;
error_log $ACCESS_LOG;
EOF
    
    log_message "INFO" "Nginx WAF配置已生成: $nginx_waf"
}

# 生成Apache WAF配置
generate_apache_waf() {
    local apache_waf="$CONFIG_DIR/apache_waf.conf"
    
    cat > "$apache_waf" << EOF
# Apache WAF配置
# 生成时间: $(date)

<IfModule mod_security2.c>
    # 启用ModSecurity
    SecRuleEngine On
    
    # 规则文件
    SecRuleRemoveById 123456
    
$(if [ "$ENABLE_SQL_INJECTION" = "true" ]; then
cat << 'APACHE_SQL'
    # SQL注入防护
    SecRule ARGS "(?i:union\s+select)" \
        "id:1001,phase:2,t:none,t:urlDecodeUni,block,msg:'SQL Injection Attack'"
    SecRule ARGS "(?i:select.*from)" \
        "id:1002,phase:2,t:none,t:urlDecodeUni,block,msg:'SQL Injection Attack'"
    SecRule ARGS "(?i:insert\s+into)" \
        "id:1003,phase:2,t:none,t:urlDecodeUni,block,msg:'SQL Injection Attack'"
    SecRule ARGS "(?i:update.*set)" \
        "id:1004,phase:2,t:none,t:urlDecodeUni,block,msg:'SQL Injection Attack'"
APACHE_SQL
fi)

$(if [ "$ENABLE_XSS" = "true" ]; then
cat << 'APACHE_XSS'
    # XSS防护
    SecRule ARGS "<script" \
        "id:2001,phase:2,t:none,block,msg:'XSS Attack Detected'"
    SecRule ARGS "javascript:" \
        "id:2002,phase:2,t:none,block,msg:'XSS Attack Detected'"
    SecRule ARGS "(?i:onload\s*=)" \
        "id:2003,phase:2,t:none,block,msg:'XSS Attack Detected'"
APACHE_XSS
fi)

$(if [ "$ENABLE_COMMAND_INJECTION" = "true" ]; then
cat << 'APACHE_CMD'
    # 命令注入防护
    SecRule ARGS "[\|;`&]" \
        "id:3001,phase:2,t:none,block,msg:'Command Injection Attempt'"
    SecRule ARGS "(?i:cmd\s*=)" \
        "id:3002,phase:2,t:none,block,msg:'Command Injection Attempt'"
APACHE_CMD
fi)
</IfModule>

<IfModule mod_evasive20.c>
    # DDoS防护
    DOSHashTableSize 3097
    DOSPageCount 2
    DOSSiteCount 50
    DOSPageInterval 1
    DOSSiteInterval 1
    DOSBlockingPeriod $BAN_TIME
    
$(if [ "$ENABLE_BRUTE_FORCE" = "true" ]; then
cat << 'APACHE_BRUTE'
    # 暴力破解防护
    DOSLoginPage "/login.php"
    DOSLoginCount 5
APACHE_BRUTE
fi)
</IfModule>

<IfModule mod_rewrite.c>
    RewriteEngine On
    
$(if [ "$ENABLE_HOTLINKING" = "true" ]; then
cat << 'APACHE_HOTLINK'
    # 防盗链
    RewriteCond %{HTTP_REFERER} !^$
    RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?example.com [NC]
    RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?google.com [NC]
    RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?bing.com [NC]
    RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]
APACHE_HOTLINK
fi)

$(if [ "$ENABLE_BOT_PROTECTION" = "true" ]; then
cat << 'APACHE_BOT'
    # 阻止恶意机器人
    RewriteCond %{HTTP_USER_AGENT} (nikto|wikto|acunetix|nessus|netsparker|sqlmap|nmap) [NC]
    RewriteRule ^.*$ - [F,L]
    
    # 阻止空User-Agent
    RewriteCond %{HTTP_USER_AGENT} ^$ [OR]
    RewriteCond %{HTTP_USER_AGENT} ^-?$
    RewriteRule ^.*$ - [F,L]
APACHE_BOT
fi)
</IfModule>

# 限制请求方法
<LimitExcept GET POST>
    Deny from all
</LimitExcept>

# 文件上传限制
LimitRequestBody 10485760

# 自定义日志格式
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{X-Forwarded-For}i\"" waf
CustomLog "$ACCESS_LOG" waf
ErrorLog "$ACCESS_LOG"
EOF
    
    log_message "INFO" "Apache WAF配置已生成: $apache_waf"
}

# 生成系统加固配置
generate_system_hardening() {
    local sysctl_file="$CONFIG_DIR/sysctl_hardening.conf"
    local limits_file="$CONFIG_DIR/limits_hardening.conf"
    
    # 生成sysctl配置
    cat > "$sysctl_file" << EOF
# 系统安全加固配置
# 生成时间: $(date)

# 防止IP欺骗
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# 禁止IP源路由
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

# 禁止ICMP重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0

# 禁止发送ICMP重定向
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0

# 开启SYN Cookies
net.ipv4.tcp_syncookies = 1

# 减少TIME-WAIT套接字
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30

# 增大TCP缓冲区
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304

# 增大最大连接数
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535

# 防止SYN洪水攻击
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 3

# 开启TCP时间戳
net.ipv4.tcp_timestamps = 1

# 开启恶意ICMP错误消息保护
net.ipv4.icmp_ignore_bogus_error_responses = 1

# 开启IP转发日志
net.ipv4.ip_forward = 0
EOF
    
    # 生成limits配置
    cat > "$limits_file" << EOF
# 用户限制配置
# 生成时间: $(date)

* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535

# 防止fork炸弹
root soft nproc unlimited
root hard nproc unlimited

# 核心文件限制
* soft core 0
* hard core 0

# 内存限制
* soft memlock unlimited
* hard memlock unlimited
EOF
    
    log_message "INFO" "系统加固配置已生成"
}

# 应用配置
apply_configuration() {
    log_message "INFO" "开始应用WAF配置..."
    
    # 备份当前配置
    backup_config
    
    # 应用iptables规则
    if [ -f "$CONFIG_DIR/iptables_rules.sh" ]; then
        log_message "INFO" "应用iptables规则..."
        sudo bash "$CONFIG_DIR/iptables_rules.sh"
    fi
    
    # 应用系统加固
    if [ -f "$CONFIG_DIR/sysctl_hardening.conf" ]; then
        log_message "INFO" "应用sysctl配置..."
        sudo sysctl -p "$CONFIG_DIR/sysctl_hardening.conf"
    fi
    
    if [ -f "$CONFIG_DIR/limits_hardening.conf" ]; then
        log_message "INFO" "应用limits配置..."
        sudo cp "$CONFIG_DIR/limits_hardening.conf" /etc/security/limits.d/waf_limits.conf
    fi
    
    # 应用Web服务器配置
    if [ "$WEB_SERVER" = "nginx" ] && [ -f "$CONFIG_DIR/nginx_waf.conf" ]; then
        log_message "INFO" "应用Nginx WAF配置..."
        # 检查Nginx配置语法
        if sudo nginx -t; then
            sudo cp "$CONFIG_DIR/nginx_waf.conf" /etc/nginx/conf.d/waf.conf
            sudo systemctl reload nginx
            log_message "INFO" "Nginx配置已应用并重载"
        else
            log_message "ERROR" "Nginx配置测试失败"
        fi
    elif [ "$WEB_SERVER" = "apache" ] && [ -f "$CONFIG_DIR/apache_waf.conf" ]; then
        log_message "INFO" "应用Apache WAF配置..."
        sudo cp "$CONFIG_DIR/apache_waf.conf" /etc/apache2/conf-available/waf.conf
        sudo a2enconf waf
        sudo systemctl reload apache2
        log_message "INFO" "Apache配置已应用并重载"
    fi
    
    # 设置监控脚本
    setup_monitoring
    
    log_message "INFO" "WAF配置应用完成!"
}

# 设置监控
setup_monitoring() {
    local monitor_script="$SCRIPT_DIR/waf_monitor.sh"
    
    cat > "$monitor_script" << 'EOF'
#!/bin/bash
# WAF监控脚本
# 定期检查WAF状态和日志

LOG_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/waf_logs"
CONFIG_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/waf_configs"

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

# 检查日志
check_logs() {
    echo -e "${YELLOW}=== WAF日志分析 ===${NC}"
    
    if [ -f "$LOG_DIR/waf_block.log" ]; then
        echo -e "最近被阻止的攻击:"
        tail -20 "$LOG_DIR/waf_block.log" | while read line; do
            echo -e "${RED}✗${NC} $line"
        done
    fi
    
    # 统计攻击类型
    echo -e "\n${YELLOW}攻击统计:${NC}"
    if [ -f "$LOG_DIR/waf_access.log" ]; then
        echo "SQL注入尝试: $(grep -c "SQL Injection" "$LOG_DIR/waf_access.log" 2>/dev/null || echo 0)"
        echo "XSS攻击尝试: $(grep -c "XSS Attack" "$LOG_DIR/waf_access.log" 2>/dev/null || echo 0)"
        echo "扫描器探测: $(grep -c "Scanner" "$LOG_DIR/waf_access.log" 2>/dev/null || echo 0)"
    fi
}

# 检查系统状态
check_system() {
    echo -e "${YELLOW}=== 系统状态 ===${NC}"
    
    # 检查iptables
    echo -e "iptables规则数: $(sudo iptables -L -n | wc -l)"
    echo -e "当前连接数: $(netstat -an | grep ESTABLISHED | wc -l)"
    
    # 检查内存使用
    echo -e "内存使用: $(free -m | awk 'NR==2{printf "%.2f%%", $3*100/$2}')"
    
    # 检查CPU负载
    echo -e "CPU负载: $(uptime | awk -F'load average:' '{print $2}')"
}

# 生成报告
generate_report() {
    local report_file="$LOG_DIR/waf_report_$(date +%Y%m%d_%H%M%S).txt"
    
    {
        echo "WAF监控报告"
        echo "生成时间: $(date)"
        echo "======================"
        echo ""
        check_system
        echo ""
        check_logs
        echo ""
        echo "配置状态:"
        if [ -f "$CONFIG_DIR/waf_main.conf" ]; then
            grep -E "ENABLE_|BLOCK_" "$CONFIG_DIR/waf_main.conf"
        fi
    } > "$report_file"
    
    echo -e "${GREEN}报告已生成: $report_file${NC}"
}

# 主循环
case "$1" in
    "check")
        check_logs
        check_system
        ;;
    "report")
        generate_report
        ;;
    "monitor")
        while true; do
            clear
            check_logs
            check_system
            echo -e "\n${YELLOW}按Ctrl+C退出监控${NC}"
            sleep 10
        done
        ;;
    *)
        echo "用法: $0 {check|report|monitor}"
        exit 1
        ;;
esac
EOF
    
    chmod +x "$monitor_script"
    
    # 创建cron任务
    local cron_job="*/5 * * * * $monitor_script check > /dev/null 2>&1"
    (crontab -l 2>/dev/null | grep -v "$monitor_script"; echo "$cron_job") | crontab -
    
    log_message "INFO" "监控脚本已设置: $monitor_script"
}

# 一键默认配置
default_configuration() {
    log_message "INFO" "应用默认配置..."
    
    # 设置所有防护为开启
    ENABLE_SQL_INJECTION="true"
    ENABLE_XSS="true"
    ENABLE_RFI_LFI="true"
    ENABLE_COMMAND_INJECTION="true"
    ENABLE_BRUTE_FORCE="true"
    ENABLE_DDOS="true"
    ENABLE_BOT_PROTECTION="true"
    ENABLE_FILE_UPLOAD="true"
    ENABLE_HOTLINKING="true"
    ENABLE_SENSITIVE_DATA="true"
    
    # 默认参数
    BLOCK_THRESHOLD=10
    BAN_TIME=3600
    RATE_LIMIT=100
    MAX_CONNECTIONS=50
    
    # 保存配置
    save_config
    
    # 生成所有配置文件
    generate_iptables_rules
    generate_system_hardening
    
    if [ "$WEB_SERVER" = "nginx" ]; then
        generate_nginx_waf
    elif [ "$WEB_SERVER" = "apache" ]; then
        generate_apache_waf
    fi
    
    # 导入默认规则
    import_owasp_rules
    import_common_attack_rules
    
    # 询问是否立即应用
    read -p "是否立即应用配置? (y/n): " apply_now
    if [ "$apply_now" = "y" ]; then
        apply_configuration
    fi
    
    log_message "INFO" "默认配置已完成!"
}

# 显示状态
show_status() {
    echo -e "${CYAN}════════════════════ WAF状态 ════════════════════${NC}"
    
    # 检查服务状态
    echo -e "${YELLOW}服务状态:${NC}"
    if systemctl is-active --quiet nginx 2>/dev/null; then
        echo -e "  Nginx: ${GREEN}运行中${NC}"
    elif systemctl is-active --quiet apache2 2>/dev/null; then
        echo -e "  Apache: ${GREEN}运行中${NC}"
    fi
    
    # 检查iptables
    echo -e "  iptables: $(sudo iptables -L -n 2>/dev/null | grep -c 'DROP\|REJECT') 条阻止规则"
    
    # 检查配置文件
    echo -e "\n${YELLOW}配置文件:${NC}"
    [ -f "$MAIN_CONFIG" ] && echo -e "  主配置: ${GREEN}存在${NC}" || echo -e "  主配置: ${RED}缺失${NC}"
    [ -f "$CUSTOM_RULES" ] && echo -e "  自定义规则: ${GREEN}存在 ($(wc -l < "$CUSTOM_RULES") 条)${NC}" || echo -e "  自定义规则: ${RED}缺失${NC}"
    
    # 检查日志
    echo -e "\n${YELLOW}日志文件:${NC}"
    [ -f "$ACCESS_LOG" ] && echo -e "  访问日志: ${GREEN}存在 ($(du -h "$ACCESS_LOG" | cut -f1))${NC}" || echo -e "  访问日志: ${RED}缺失${NC}"
    [ -f "$BLOCK_LOG" ] && echo -e "  阻止日志: ${GREEN}存在 ($(grep -c "blocked" "$BLOCK_LOG" 2>/dev/null || echo 0) 条记录)${NC}" || echo -e "  阻止日志: ${RED}缺失${NC}"
    
    # 显示最近事件
    if [ -f "$BLOCK_LOG" ] && [ -s "$BLOCK_LOG" ]; then
        echo -e "\n${YELLOW}最近被阻止的事件:${NC}"
        tail -5 "$BLOCK_LOG" | while read line; do
            echo -e "  ${RED}▶${NC} $line"
        done
    fi
    
    echo -e "${CYAN}════════════════════════════════════════════════════${NC}"
}

# 主菜单
main_menu() {
    while true; do
        clear
        show_banner
        show_status
        
        echo -e "${GREEN}════════════════════ 主菜单 ════════════════════${NC}"
        echo " 1) 自定义配置WAF"
        echo " 2) 一键默认配置"
        echo " 3) 生成配置文件"
        echo " 4) 应用配置到系统"
        echo " 5) 查看当前配置"
        echo " 6) 管理自定义规则"
        echo " 7) 查看日志和状态"
        echo " 8) 备份当前配置"
        echo " 9) 恢复配置"
        echo "10) 运行监控脚本"
        echo "11) 测试WAF防护"
        echo "12) 卸载WAF配置"
        echo "13) 退出脚本"
        echo -e "${GREEN}════════════════════════════════════════════════════${NC}"
        
        read -p "请选择选项 [1-13]: " choice
        
        case $choice in
            1)
                custom_config_menu
                ;;
            2)
                default_configuration
                read -p "按Enter继续..."
                ;;
            3)
                generate_configurations
                read -p "按Enter继续..."
                ;;
            4)
                read -p "确定应用配置到系统? (y/n): " confirm
                if [ "$confirm" = "y" ]; then
                    apply_configuration
                    read -p "按Enter继续..."
                fi
                ;;
            5)
                clear
                show_current_config
                echo -e "\n配置文件位置:"
                echo "  主配置: $MAIN_CONFIG"
                echo "  规则文件: $CUSTOM_RULES"
                echo "  Nginx配置: $CONFIG_DIR/nginx_waf.conf"
                echo "  Apache配置: $CONFIG_DIR/apache_waf.conf"
                echo "  iptables配置: $CONFIG_DIR/iptables_rules.sh"
                read -p "按Enter继续..."
                ;;
            6)
                manage_custom_rules
                ;;
            7)
                clear
                show_status
                if [ -f "$SCRIPT_DIR/waf_monitor.sh" ]; then
                    echo -e "\n${YELLOW}运行监控检查:${NC}"
                    $SCRIPT_DIR/waf_monitor.sh check
                fi
                read -p "按Enter继续..."
                ;;
            8)
                backup_config
                read -p "按Enter继续..."
                ;;
            9)
                restore_configuration
                read -p "按Enter继续..."
                ;;
            10)
                if [ -f "$SCRIPT_DIR/waf_monitor.sh" ]; then
                    $SCRIPT_DIR/waf_monitor.sh monitor
                else
                    echo -e "${RED}监控脚本未找到${NC}"
                    sleep 2
                fi
                ;;
            11)
                test_waf_protection
                ;;
            12)
                uninstall_waf
                read -p "按Enter继续..."
                ;;
            13)
                echo -e "${GREEN}感谢使用WAF防护脚本!${NC}"
                exit 0
                ;;
            *)
                echo -e "${RED}无效选项${NC}"
                sleep 1
                ;;
        esac
    done
}

# 生成所有配置文件
generate_configurations() {
    log_message "INFO" "生成所有配置文件..."
    
    generate_iptables_rules
    generate_system_hardening
    
    if [ "$WEB_SERVER" = "nginx" ]; then
        generate_nginx_waf
    elif [ "$WEB_SERVER" = "apache" ]; then
        generate_apache_waf
    else
        log_message "WARN" "未检测到Web服务器,跳过生成服务器配置"
    fi
    
    log_message "INFO" "所有配置文件已生成到: $CONFIG_DIR"
}

# 测试WAF防护
test_waf_protection() {
    echo -e "${CYAN}════════════════════ WAF防护测试 ════════════════════${NC}"
    echo "此功能将发送测试请求来验证WAF防护是否正常工作"
    echo "注意: 这些是真实的攻击测试,但使用安全参数"
    echo -e "${YELLOW}警告: 仅在测试环境使用!${NC}"
    echo -e "${CYAN}════════════════════════════════════════════════════${NC}"
    
    read -p "是否继续? (y/n): " confirm
    if [ "$confirm" != "y" ]; then
        return
    fi
    
    # 获取服务器地址
    read -p "请输入要测试的URL (默认: http://localhost): " test_url
    test_url=${test_url:-http://localhost}
    
    echo -e "\n${GREEN}开始WAF防护测试...${NC}"
    
    # 测试SQL注入防护
    if [ "$ENABLE_SQL_INJECTION" = "true" ]; then
        echo -e "\n${YELLOW}测试SQL注入防护:${NC}"
        curl -s -o /dev/null -w "HTTP状态码: %{http_code}\n" "$test_url/?id=1' OR '1'='1"
        curl -s -o /dev/null -w "HTTP状态码: %{http_code}\n" "$test_url/?id=1 UNION SELECT NULL,NULL--"
    fi
    
    # 测试XSS防护
    if [ "$ENABLE_XSS" = "true" ]; then
        echo -e "\n${YELLOW}测试XSS防护:${NC}"
        curl -s -o /dev/null -w "HTTP状态码: %{http_code}\n" "$test_url/?q=<script>alert('xss')</script>"
        curl -s -o /dev/null -w "HTTP状态码: %{http_code}\n" "$test_url/?q=javascript:alert(1)"
    fi
    
    # 测试目录遍历
    if [ "$ENABLE_RFI_LFI" = "true" ]; then
        echo -e "\n${YELLOW}测试目录遍历防护:${NC}"
        curl -s -o /dev/null -w "HTTP状态码: %{http_code}\n" "$test_url/?file=../../../etc/passwd"
        curl -s -o /dev/null -w "HTTP状态码: %{http_code}\n" "$test_url/?page=....//....//etc/passwd"
    fi
    
    # 测试命令注入
    if [ "$ENABLE_COMMAND_INJECTION" = "true" ]; then
        echo -e "\n${YELLOW}测试命令注入防护:${NC}"
        curl -s -o /dev/null -w "HTTP状态码: %{http_code}\n" "$test_url/?cmd=ls%20-la"
        curl -s -o /dev/null -w "HTTP状态码: %{http_code}\n" "$test_url/?input=|cat%20/etc/passwd"
    fi
    
    # 测试扫描器防护
    if [ "$ENABLE_BOT_PROTECTION" = "true" ]; then
        echo -e "\n${YELLOW}测试扫描器防护:${NC}"
        curl -s -o /dev/null -A "nmap" -w "HTTP状态码: %{http_code}\n" "$test_url/"
        curl -s -o /dev/null -A "sqlmap" -w "HTTP状态码: %{http_code}\n" "$test_url/"
    fi
    
    echo -e "\n${GREEN}测试完成!${NC}"
    echo "查看日志文件了解详细信息: $BLOCK_LOG"
    read -p "按Enter继续..."
}

# 恢复配置
restore_configuration() {
    echo -e "${CYAN}════════════════════ 恢复配置 ════════════════════${NC}"
    
    if [ ! -d "$BACKUP_DIR" ] || [ -z "$(ls -A $BACKUP_DIR 2>/dev/null)" ]; then
        echo -e "${RED}未找到备份文件${NC}"
        return 1
    fi
    
    # 显示备份文件
    echo -e "${YELLOW}可用的备份:${NC}"
    local backups=($(ls -1t $BACKUP_DIR/waf_backup_*.conf 2>/dev/null | head -10))
    
    if [ ${#backups[@]} -eq 0 ]; then
        backups=($(ls -1t $BACKUP_DIR/waf_backup_* 2>/dev/null | head -10))
    fi
    
    for i in "${!backups[@]}"; do
        echo " $((i+1))) $(basename ${backups[$i]})"
    done
    
    read -p "选择要恢复的备份编号 [1-${#backups[@]}]: " choice
    
    if [[ $choice =~ ^[0-9]+$ ]] && [ $choice -ge 1 ] && [ $choice -le ${#backups[@]} ]; then
        local backup_file="${backups[$((choice-1))]}"
        
        echo -e "\n恢复备份: $backup_file"
        
        # 根据文件类型恢复
        case $backup_file in
            *_nginx.conf)
                sudo cp "$backup_file" /etc/nginx/nginx.conf
                sudo nginx -t && sudo systemctl reload nginx
                echo -e "${GREEN}Nginx配置已恢复${NC}"
                ;;
            *_apache.conf|*_httpd.conf)
                if [ -f "/etc/apache2/apache2.conf" ]; then
                    sudo cp "$backup_file" /etc/apache2/apache2.conf
                    sudo systemctl reload apache2
                elif [ -f "/etc/httpd/conf/httpd.conf" ]; then
                    sudo cp "$backup_file" /etc/httpd/conf/httpd.conf
                    sudo systemctl reload httpd
                fi
                echo -e "${GREEN}Apache配置已恢复${NC}"
                ;;
            *_iptables.rules)
                sudo iptables-restore < "$backup_file"
                echo -e "${GREEN}iptables规则已恢复${NC}"
                ;;
            *_sysctl.conf)
                sudo cp "$backup_file" /etc/sysctl.conf
                sudo sysctl -p
                echo -e "${GREEN}sysctl配置已恢复${NC}"
                ;;
            *)
                echo -e "${YELLOW}未知备份类型,请手动恢复${NC}"
                ;;
        esac
    else
        echo -e "${RED}无效选择${NC}"
    fi
}

# 卸载WAF配置
uninstall_waf() {
    echo -e "${RED}════════════════════ 卸载WAF配置 ════════════════════${NC}"
    echo -e "${RED}警告: 这将移除所有WAF配置${NC}"
    echo "1) 仅移除配置,保留备份和日志"
    echo "2) 完全卸载,删除所有文件"
    echo "3) 取消"
    echo -e "${RED}════════════════════════════════════════════════════${NC}"
    
    read -p "选择卸载选项 [1-3]: " choice
    
    case $choice in
        1)
            # 移除配置
            echo -e "${YELLOW}正在移除WAF配置...${NC}"
            
            # 移除iptables规则
            sudo iptables -F
            sudo iptables -X
            sudo iptables -t nat -F
            sudo iptables -t nat -X
            
            # 恢复默认策略
            sudo iptables -P INPUT ACCEPT
            sudo iptables -P FORWARD ACCEPT
            sudo iptables -P OUTPUT ACCEPT
            
            # 移除Web服务器配置
            if [ "$WEB_SERVER" = "nginx" ] && [ -f "/etc/nginx/conf.d/waf.conf" ]; then
                sudo rm -f /etc/nginx/conf.d/waf.conf
                sudo systemctl reload nginx
            elif [ "$WEB_SERVER" = "apache" ]; then
                sudo rm -f /etc/apache2/conf-available/waf.conf
                sudo a2disconf waf 2>/dev/null
                sudo systemctl reload apache2
            fi
            
            # 移除limits配置
            sudo rm -f /etc/security/limits.d/waf_limits.conf
            
            echo -e "${GREEN}WAF配置已移除,备份和日志已保留${NC}"
            ;;
        2)
            # 完全卸载
            read -p "确定要完全删除所有WAF文件? (输入'CONFIRM'确认): " confirm
            if [ "$confirm" = "CONFIRM" ]; then
                echo -e "${RED}正在删除所有WAF文件...${NC}"
                
                # 移除配置和规则
                rm -rf "$CONFIG_DIR" "$RULES_DIR"
                
                # 移除cron任务
                crontab -l | grep -v "waf_monitor" | crontab -
                
                # 移除监控脚本
                rm -f "$SCRIPT_DIR/waf_monitor.sh"
                
                echo -e "${GREEN}所有WAF文件已删除${NC}"
            else
                echo -e "${YELLOW}取消卸载${NC}"
            fi
            ;;
        *)
            echo -e "${YELLOW}取消卸载${NC}"
            ;;
    esac
}

# 初始化脚本
init_script() {
    # 检查是否为root
    if [ "$EUID" -ne 0 ]; then
        log_message "WARN" "建议使用root权限运行此脚本"
        sleep 2
    fi
    
    # 创建目录
    mkdir -p "$CONFIG_DIR" "$LOGS_DIR" "$BACKUP_DIR" "$RULES_DIR"
    
    # 初始化日志
    log_message "INFO" "WAF脚本初始化"
    log_message "INFO" "脚本目录: $SCRIPT_DIR"
    
    # 检查依赖
    check_dependencies
    
    # 加载配置
    load_config
}

# 主程序
main() {
    init_script
    main_menu
}

# 捕获Ctrl+C
trap 'echo -e "\n${RED}用户中断脚本${NC}"; exit 1' INT

# 运行主程序
main

脚本功能说明

主要特性:

1.全面防护功能:

  • SQL注入防护
  • XSS跨站脚本防护
  • RFI/LFI远程/本地文件包含防护
  • 命令注入防护
  • 暴力破解防护
  • DDoS防护
  • 恶意机器人防护
  • 文件上传防护
  • 盗链防护
  • 敏感数据防护

2.配置管理:

  • 一键默认配置
  • 自定义配置(可单独开关每个功能)
  • 参数自定义调整
  • 配置备份与恢复
  • 规则管理:
  • 自定义规则添加
  • OWASP核心规则集导入
  • 常见攻击规则导入
  • 规则文件编辑

3.多Web服务器支持:

  • Nginx配置生成
  • Apache配置生成
  • iptables防火墙规则

4.监控与报告:

  • 实时监控脚本
  • 自动日志分析
  • 攻击统计报告
  • 系统状态监控

使用方法:

保存脚本:

# 将脚本保存为 waf_manager.sh
chmod +x waf_manager.sh

运行脚本:

sudo ./waf_manager.sh

推荐使用流程:

  • 首次运行选择"一键默认配置"
  • 根据需求使用"自定义配置"调整
  • 生成配置文件后"应用配置到系统"
  • 使用"测试WAF防护"验证效果
  • 定期使用"运行监控脚本"查看状态

本文共30496个字符,其中有 2617 个汉字,平均阅读时长 ≈ 113分钟
0

打赏

海报

正在生成.....

评论

博主关闭了所有页面的评论

网站公告

欢迎访问本站

  • 如果你有教程想要分享,请联系我们