ITPub博客

首页 > 应用开发 > IT综合 > Linux安全实战:防火墙配置与系统漏洞修复指南

Linux安全实战:防火墙配置与系统漏洞修复指南

投稿 IT综合 作者:bhluo 时间:2026-01-23 11:05:38 0 删除 编辑

# Linux安全实战:防火墙配置与系统漏洞修复指南


## 一、防火墙基础与策略配置


### 1.1 iptables企业级配置模板


```bash

#!/bin/bash

# firewall_setup.sh - 企业级iptables配置


# 定义变量

IP_TABLES="/sbin/iptables"

IP6_TABLES="/sbin/ip6tables"

BACKUP_DIR="/etc/iptables"

LOG_PREFIX="[FIREWALL]"


# 备份现有规则

backup_rules() {

    mkdir -p "$BACKUP_DIR"

    $IP_TABLES-save > "$BACKUP_DIR/iptables-backup-$(date +%Y%m%d-%H%M%S).rules"

    $IP6_TABLES-save > "$BACKUP_DIR/ip6tables-backup-$(date +%Y%m%d-%H%M%S).rules"

    echo "$LOG_PREFIX 规则已备份"

}


# 初始化规则链

initialize_firewall() {

    # 清除所有现有规则

    $IP_TABLES -F

    $IP_TABLES -X

    $IP_TABLES -Z

    

    # 设置默认策略

    $IP_TABLES -P INPUT DROP

    $IP_TABLES -P FORWARD DROP

    $IP_TABLES -P OUTPUT ACCEPT

    

    echo "$LOG_PREFIX 防火墙初始化完成"

}


# 配置基础规则集

configure_basic_rules() {

    # 允许本地回环接口

    $IP_TABLES -A INPUT -i lo -j ACCEPT

    $IP_TABLES -A OUTPUT -o lo -j ACCEPT

    

    # 允许已建立和相关连接

    $IP_TABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

    

    # 允许ICMP协议(ping等)

    $IP_TABLES -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

    

    # 记录并拒绝非法数据包

    $IP_TABLES -A INPUT -m state --state INVALID -j LOG --log-prefix "INVALID_PACKET: "

    $IP_TABLES -A INPUT -m state --state INVALID -j DROP

    

    echo "$LOG_PREFIX 基础规则配置完成"

}


# 配置服务访问规则

configure_service_rules() {

    # SSH访问限制(仅允许特定网络)

    $IP_TABLES -A INPUT -p tcp --dport 22 -s 10.0.0.0/8 -j ACCEPT

    $IP_TABLES -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT

    $IP_TABLES -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH_ATTEMPT: "

    $IP_TABLES -A INPUT -p tcp --dport 22 -j DROP

    

    # Web服务(HTTP/HTTPS)

    $IP_TABLES -A INPUT -p tcp --dport 80 -j ACCEPT

    $IP_TABLES -A INPUT -p tcp --dport 443 -j ACCEPT

    

    # 数据库服务(限制访问源)

    $IP_TABLES -A INPUT -p tcp --dport 3306 -s 10.0.0.0/8 -j ACCEPT

    $IP_TABLES -A INPUT -p tcp --dport 5432 -s 10.0.0.0/8 -j ACCEPT

    

    # 监控端口(Prometheus, Node Exporter等)

    $IP_TABLES -A INPUT -p tcp --dport 9090 -s 10.0.0.0/8 -j ACCEPT

    $IP_TABLES -A INPUT -p tcp --dport 9100 -s 10.0.0.0/8 -j ACCEPT

    

    echo "$LOG_PREFIX 服务规则配置完成"

}


# 配置暴力破解防护

configure_bruteforce_protection() {

    # SSH暴力破解防护

    $IP_TABLES -N SSH_PROTECT

    $IP_TABLES -A SSH_PROTECT -m recent --set --name SSH

    $IP_TABLES -A SSH_PROTECT -m recent --update --seconds 60 --hitcount 4 --name SSH -j LOG --log-prefix "SSH_BRUTEFORCE: "

    $IP_TABLES -A SSH_PROTECT -m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP

    $IP_TABLES -A SSH_PROTECT -j ACCEPT

    

    $IP_TABLES -A INPUT -p tcp --dport 22 -j SSH_PROTECT

    

    # HTTP暴力破解防护

    $IP_TABLES -N HTTP_PROTECT

    $IP_TABLES -A HTTP_PROTECT -m recent --set --name HTTP

    $IP_TABLES -A HTTP_PROTECT -m recent --update --seconds 300 --hitcount 100 --name HTTP -j DROP

    $IP_TABLES -A HTTP_PROTECT -j ACCEPT

    

    $IP_TABLES -A INPUT -p tcp --dport 80 -j HTTP_PROTECT

    $IP_TABLES -A INPUT -p tcp --dport 443 -j HTTP_PROTECT

    

    echo "$LOG_PREFIX 暴力破解防护配置完成"

}


# 配置日志记录

configure_logging() {

    # 记录被拒绝的连接尝试

    $IP_TABLES -A INPUT -j LOG --log-prefix "FW_DENIED: " --log-level 4

    

    # 记录端口扫描尝试

    $IP_TABLES -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j LOG --log-prefix "PORT_SCAN: "

    $IP_TABLES -A INPUT -p tcp --tcp-flags ALL NONE -j LOG --log-prefix "NULL_SCAN: "

    $IP_TABLES -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j LOG --log-prefix "SYN_SCAN: "

    

    echo "$LOG_PREFIX 日志记录配置完成"

}


# 保存并应用规则

apply_rules() {

    # 保存IPv4规则

    $IP_TABLES-save > /etc/iptables/rules.v4

    

    # 配置IPv6(通常建议禁用或严格限制)

    $IP6_TABLES -P INPUT DROP

    $IP6_TABLES -P FORWARD DROP

    $IP6_TABLES -P OUTPUT ACCEPT

    $IP6_TABLES -A INPUT -i lo -j ACCEPT

    $IP6_TABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

    $IP6_TABLES-save > /etc/iptables/rules.v6

    

    # 配置持久化

    cat > /etc/network/if-pre-up.d/iptables << 'EOF'

#!/bin/sh

/sbin/iptables-restore < /etc/iptables/rules.v4

/sbin/ip6tables-restore < /etc/iptables/rules.v6

EOF

    chmod +x /etc/network/if-pre-up.d/iptables

    

    echo "$LOG_PREFIX 规则已保存并应用"

}


# 主执行流程

main() {

    echo "开始配置企业级防火墙"

    backup_rules

    initialize_firewall

    configure_basic_rules

    configure_service_rules

    configure_bruteforce_protection

    configure_logging

    apply_rules

    echo "防火墙配置完成"

}


main

```


## 二、nftables现代化配置


### 2.1 nftables企业配置示例


```bash

#!/bin/bash

# nftables_enterprise.nft


#!/usr/sbin/nft -f


# 清空现有规则

flush ruleset


# 定义变量和集合

define management_networks = { 10.0.0.0/8, 192.168.1.0/24 }

define web_servers = { 10.0.1.10, 10.0.1.11 }

define database_servers = { 10.0.2.10, 10.0.2.11 }


# 创建表

table inet filter {

    # 定义集合:记录SSH攻击IP

    set ssh_attackers {

        type ipv4_addr

        flags timeout

        timeout 1h

    }

    

    # 定义集合:记录端口扫描IP

    set port_scanners {

        type ipv4_addr

        flags timeout

        timeout 24h

    }

    

    # 定义链

    chain input {

        type filter hook input priority 0; policy drop;

        

        # 基础规则

        iif "lo" accept

        ct state established,related accept

        ct state invalid drop

        

        # ICMP限制

        ip protocol icmp icmp type echo-request limit rate 1/second accept

        

        # SSH访问控制

        tcp dport 22 ip saddr $management_networks accept

        tcp dport 22 ip saddr @ssh_attackers drop

        tcp dport 22 limit rate 3/minute burst 5 packets add @ssh_attackers { ip saddr } accept

        

        # Web服务

        tcp dport { 80, 443 } accept

        

        # 数据库服务(内部访问)

        tcp dport { 3306, 5432 } ip saddr $database_servers accept

        

        # 监控端口

        tcp dport { 9090, 9100 } ip saddr $management_networks accept

        

        # 记录拒绝的连接

        log prefix "nft_denied: " group 1

    }

    

    chain forward {

        type filter hook forward priority 0; policy drop;

    }

    

    chain output {

        type filter hook output priority 0; policy accept;

    }

    

    # 自定义链:端口扫描检测

    chain portscan_detect {

        # 检测NULL扫描

        tcp flags & (fin|syn|rst|psh|ack|urg) == 0 add @port_scanners { ip saddr }

        

        # 检测XMAS扫描

        tcp flags & (fin|psh|urg) == fin|psh|urg add @port_scanners { ip saddr }

        

        # 记录扫描尝试

        ip saddr @port_scanners log prefix "Port_Scan_Detected: " accept

    }

}


# 应用配置

nft -f nftables_enterprise.nft


# 保存配置

nft list ruleset > /etc/nftables.conf


# 配置系统服务

systemctl enable nftables

systemctl start nftables

```


### 2.2 nftables监控脚本


```bash

#!/bin/bash

# nftables_monitor.sh


LOG_FILE="/var/log/nftables_monitor.log"

ALERT_THRESHOLD=100


monitor_nftables() {

    while true; do

        TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')

        

        # 获取当前连接统计

        CONN_STATS=$(nft list ruleset | grep -E "counter packets|bytes")

        

        # 获取被阻止的IP数量

        BLOCKED_IPS=$(nft list set inet filter ssh_attackers 2>/dev/null | grep -c "elements =")

        

        # 记录到日志

        echo "[$TIMESTAMP] 连接统计:" >> "$LOG_FILE"

        echo "$CONN_STATS" >> "$LOG_FILE"

        echo "被阻止IP数量: $BLOCKED_IPS" >> "$LOG_FILE"

        

        # 检查阈值

        if [ "$BLOCKED_IPS" -gt "$ALERT_THRESHOLD" ]; then

            send_alert "nftables blocked IPs threshold exceeded: $BLOCKED_IPS"

        fi

        

        # 分析日志中的攻击模式

        analyze_attack_patterns

        

        sleep 300  # 每5分钟检查一次

    done

}


analyze_attack_patterns() {

    # 分析过去一小时的日志

    PATTERN_LOG="/tmp/attack_patterns_$(date +%Y%m%d_%H).log"

    

    journalctl -u nftables --since "1 hour ago" | \

        grep -E "Port_Scan_Detected|SSH_ATTEMPT" > "$PATTERN_LOG"

    

    # 统计攻击源

    ATTACK_SOURCES=$(awk '{print $NF}' "$PATTERN_LOG" | sort | uniq -c | sort -rn)

    

    if [ -s "$PATTERN_LOG" ]; then

        echo "攻击模式分析 ($(date)):" >> "$LOG_FILE"

        echo "$ATTACK_SOURCES" >> "$LOG_FILE"

    fi

}


send_alert() {

    local message="$1"

    echo "[ALERT] $message" >> "$LOG_FILE"

    

    # 发送邮件告警

    echo "$message" | mail -s "防火墙安全告警" admin@example.com

    

    # 可集成到其他告警系统

    # curl -X POST https://alerts.example.com -d "message=$message"

}


# 主程序

case "${1:-}" in

    start)

        monitor_nftables

        ;;

    analyze)

        analyze_attack_patterns

        ;;

    status)

        nft list ruleset

        ;;

    *)

        echo "用法: $0 {start|analyze|status}"

        exit 1

        ;;

esac

```


## 三、系统漏洞扫描与修复


### 3.1 自动化漏洞扫描脚本


```bash

#!/bin/bash

# vulnerability_scanner.sh


SCAN_DIR="/var/log/security_scans"

REPORT_FILE="$SCAN_DIR/vulnerability_report_$(date +%Y%m%d).html"

LOG_FILE="$SCAN_DIR/scan_$(date +%Y%m%d).log"


# 创建目录

mkdir -p "$SCAN_DIR"


# 初始化报告

init_report() {

    cat > "$REPORT_FILE" << 'EOF'

<!DOCTYPE html>

<html>

<head>

    <title>安全扫描报告 - $(date)</title>

    <style>

        body { font-family: Arial, sans-serif; margin: 20px; }

        .critical { color: #d9534f; font-weight: bold; }

        .high { color: #f0ad4e; }

        .medium { color: #5bc0de; }

        .low { color: #5cb85c; }

        table { border-collapse: collapse; width: 100%; }

        th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }

        th { background-color: #f2f2f2; }

    </style>

</head>

<body>

    <h1>系统安全扫描报告</h1>

    <p>生成时间: $(date)</p>

    <p>主机名: $(hostname)</p>

EOF

}


# 检查系统更新

check_updates() {

    echo "检查系统更新..." | tee -a "$LOG_FILE"

    

    if [ -f /etc/debian_version ]; then

        apt update 2>&1 | tee -a "$LOG_FILE"

        UPDATES=$(apt list --upgradable 2>/dev/null | grep -c upgradable)

        

        cat >> "$REPORT_FILE" << EOF

    <h2>系统更新检查</h2>

    <p>可用更新: $UPDATES 个</p>

EOF

        

        if [ "$UPDATES" -gt 0 ]; then

            echo "发现 $UPDATES 个待安装更新" | tee -a "$LOG_FILE"

            apt list --upgradable >> "$LOG_FILE"

        fi

    fi

}


# 检查SUID/SGID异常文件

check_suid_sgid() {

    echo "检查SUID/SGID文件..." | tee -a "$LOG_FILE"

    

    cat >> "$REPORT_FILE" << 'EOF'

    <h2>SUID/SGID文件检查</h2>

EOF

    

    # 查找异常SUID文件

    find / -type f -perm /4000 2>/dev/null | while read -r file; do

        if [ ! -f "/usr/bin/basename" ] || \

           [[ ! "$(basename "$file")" =~ ^(ping|passwd|mount|umount|sudo|su)$ ]]; then

            echo "可疑SUID文件: $file" | tee -a "$LOG_FILE"

            

            cat >> "$REPORT_FILE" << EOF

    <p class="high">可疑SUID文件: $file</p>

EOF

        fi

    done

    

    # 查找异常SGID文件

    find / -type f -perm /2000 2>/dev/null | while read -r file; do

        echo "SGID文件: $file" >> "$LOG_FILE"

    done

}


# 检查SSH配置

check_ssh_config() {

    echo "检查SSH配置..." | tee -a "$LOG_FILE"

    

    cat >> "$REPORT_FILE" << 'EOF'

    <h2>SSH配置检查</h2>

EOF

    

    SSH_CONFIG="/etc/ssh/sshd_config"

    

    # 检查Protocol版本

    if grep -q "^Protocol 1" "$SSH_CONFIG"; then

        echo "SSH协议版本1已启用(不安全)" | tee -a "$LOG_FILE"

        cat >> "$REPORT_FILE" << EOF

    <p class="critical">SSH协议版本1已启用(不安全)</p>

EOF

    fi

    

    # 检查密码认证

    if grep -q "^PasswordAuthentication yes" "$SSH_CONFIG"; then

        echo "密码认证已启用(建议使用密钥认证)" | tee -a "$LOG_FILE"

        cat >> "$REPORT_FILE" << EOF

    <p class="medium">密码认证已启用(建议使用密钥认证)</p>

EOF

    fi

    

    # 检查Root登录

    if grep -q "^PermitRootLogin yes" "$SSH_CONFIG"; then

        echo "Root登录已启用(不安全)" | tee -a "$LOG_FILE"

        cat >> "$REPORT_FILE" << EOF

    <p class="critical">Root登录已启用(不安全)</p>

EOF

    fi

}


# 检查文件权限

check_file_permissions() {

    echo "检查关键文件权限..." | tee -a "$LOG_FILE"

    

    cat >> "$REPORT_FILE" << 'EOF'

    <h2>文件权限检查</h2>

EOF

    

    # 关键文件列表

    critical_files=(

        "/etc/passwd"

        "/etc/shadow"

        "/etc/group"

        "/etc/sudoers"

        "/etc/ssh/sshd_config"

    )

    

    for file in "${critical_files[@]}"; do

        if [ -f "$file" ]; then

            perms=$(stat -c "%a %U %G" "$file")

            echo "$file 权限: $perms" >> "$LOG_FILE"

            

            # 检查shadow文件权限

            if [ "$file" = "/etc/shadow" ] && [ "$(stat -c %a "$file")" != "640" ]; then

                cat >> "$REPORT_FILE" << EOF

    <p class="critical">$file 权限异常: $perms (应为640)</p>

<"wuda.csxthr.com"><"nbl.zhaiLimao.com"><"gzi.yunruiwater.cn">

EOF

            fi

        fi

    done

}


# 运行Lynis审计

run_lynis_audit() {

    echo "运行Lynis安全审计..." | tee -a "$LOG_FILE"

    

    if command -v lynis >/dev/null 2>&1; then

        lynis audit system --quick 2>&1 | tee -a "$LOG_FILE"

        

        # 提取关键发现

        lynis audit system --quick | grep -E "\[WARNING\]|\[SUGGESTION\]" > "$SCAN_DIR/lynis_findings.txt"

        

        cat >> "$REPORT_FILE" << EOF

    <h2>Lynis审计结果</h2>

    <pre>

$(cat "$SCAN_DIR/lynis_findings.txt")

    </pre>

EOF

    else

        echo "Lynis未安装,跳过审计" | tee -a "$LOG_FILE"

    fi

}


# 生成报告摘要

generate_summary() {

    cat >> "$REPORT_FILE" << 'EOF'

    <h2>修复建议摘要</h2>

    <ol>

        <li>及时安装系统安全更新</li>

        <li>禁用不必要的SUID/SGID权限</li>

        <li>配置SSH使用密钥认证并禁用root登录</li>

        <li>定期审计系统日志</li>

        <li>配置防火墙限制不必要的端口访问</li>

    </ol>

</body>

</html>

EOF

    

    echo "扫描完成,报告已生成: $REPORT_FILE" | tee -a "$LOG_FILE"

}


# 主函数

main() {

    echo "开始系统安全扫描" | tee -a "$LOG_FILE"

    init_report

    check_updates

    check_suid_sgid

    check_ssh_config

    check_file_permissions

    run_lynis_audit

    generate_summary

    echo "扫描报告: $REPORT_FILE" | tee -a "$LOG_FILE"

}


main

```


## 四、自动化补丁管理


### 4.1 安全更新自动化脚本


```bash

#!/bin/bash

# security_patch_manager.sh


CONFIG_FILE="/etc/security_patch.conf"

LOG_FILE="/var/log/security_patches.log"

BACKUP_DIR="/var/backups/pre_patch"


# 加载配置

load_config() {

    if [ -f "$CONFIG_FILE" ]; then

        source "$CONFIG_FILE"

    else

        # 默认配置

        ENABLE_AUTO_PATCH=false

        PATCH_DAY="Sunday"

        PATCH_TIME="02:00"

        REBOOT_REQUIRED=false

        NOTIFY_EMAIL="admin@example.com"

        EXCLUDE_PACKAGES=""

    fi

}


# 预补丁检查

pre_patch_check() {

    echo "[$(date)] 开始预补丁检查" | tee -a "$LOG_FILE"

    

    # 检查磁盘空间

    DISK_USAGE=$(df / --output=pcent | tail -1 | tr -d '% ')

    if [ "$DISK_USAGE" -gt 90 ]; then

        echo "磁盘空间不足: ${DISK_USAGE}%" | tee -a "$LOG_FILE"

        return 1

    fi

    

    # 备份重要配置

    mkdir -p "$BACKUP_DIR/$(date +%Y%m%d)"

    cp -r /etc/apt/ "$BACKUP_DIR/$(date +%Y%m%d)/apt/"

    cp -r /etc/yum/ "$BACKUP_DIR/$(date +%Y%m%d)/yum/" 2>/dev/null || true

    

    # 检查当前服务状态

    systemctl list-units --type=service --state=running > "$BACKUP_DIR/$(date +%Y%m%d)/services_before.txt"

    

    return 0

}


# 应用安全更新

apply_security_updates() {

    echo "[$(date)] 开始应用安全更新" | tee -a "$LOG_FILE"

    

    if [ -f /etc/debian_version ]; then

        # Debian/Ubuntu系统

        apt-get update 2>&1 | tee -a "$LOG_FILE"

        

        # 仅安装安全更新

        apt-get upgrade --only-upgrade -y 2>&1 | tee -a "$LOG_FILE"

        

        # 清理旧内核

        apt-get autoremove --purge -y 2>&1 | tee -a "$LOG_FILE"

        

    elif [ -f /etc/redhat-release ]; then

        # RHEL/CentOS系统

        yum update --security -y 2>&1 | tee -a "$LOG_FILE"

        

        # 清理缓存

        yum clean all 2>&1 | tee -a "$LOG_FILE"

    fi

    

    echo "[$(date)] 安全更新完成" | tee -a "$LOG_FILE"

}


# 后补丁验证

post_patch_verification() {

    echo "[$(date)] 开始后补丁验证" | tee -a "$LOG_FILE"

    

    # 检查关键服务状态

    critical_services=("ssh" "nginx" "mysql" "postgresql")

    

    for service in "${critical_services[@]}"; do

        if systemctl is-active --quiet "$service"; then

            echo "服务 $service 运行正常" | tee -a "$LOG_FILE"


        else

            echo "警告: 服务 $service 未运行" | tee -a "$LOG_FILE"

            systemctl restart "$service" 2>&1 | tee -a "$LOG_FILE"

        fi

    done

    

    # 生成更新报告

    generate_patch_report

}


# 生成补丁报告

generate_patch_report() {

    REPORT_FILE="/var/log/patch_report_$(date +%Y%m%d).txt"

    

    {

        echo "系统补丁报告"

        echo "生成时间: $(date)"

        echo "主机名: $(hostname)"

        echo

        echo "更新的包:"

        

        if [ -f /var/log/apt/history.log ]; then

            grep "upgrade" /var/log/apt/history.log | tail -5

        fi

        

        echo

        echo "当前内核版本: $(uname -r)"

        echo "系统启动时间: $(uptime -s)"

        echo

        echo "需要重启: $(needs-restarting -r 2>/dev/null || echo '未知')"

        

    } > "$REPORT_FILE"

    

    # 发送报告

    if [ -n "$NOTIFY_EMAIL" ]; then

        mail -s "系统补丁报告 $(date)" "$NOTIFY_EMAIL" < "$REPORT_FILE"

    fi

}


# 主函数

main() {

    load_config

    

    if ! pre_patch_check; then

        echo "预补丁检查失败,中止操作" | tee -a "$LOG_FILE"

        exit 1

    fi

    

    apply_security_updates

    post_patch_verification

    

    # 根据配置决定是否重启

    if [ "$REBOOT_REQUIRED" = true ]; then

        echo "计划重启系统..." | tee -a "$LOG_FILE"

        shutdown -r +10 "系统将在10分钟后重启以应用更新"

    fi

}


# 计划任务配置示例

setup_cron_job() {

    cat > /etc/cron.d/security_patches << 'EOF'

# 每周日凌晨2点运行安全更新

0 2 * * 0 root /usr/local/bin/security_patch_manager.sh >> /var/log/security_patches.log 2>&1


# 每天检查安全公告

30 8 * * * root /usr/local/bin/security_advisory_check.sh

EOF

}


main

```


## 五、合规性检查脚本


### 5.1 CIS基准检查脚本


```bash

#!/bin/bash

# cis_compliance_check.sh


REPORT_DIR="/var/log/cis_compliance"

HTML_REPORT="$REPORT_DIR/cis_report_$(date +%Y%m%d).html"

CSV_REPORT="$REPORT_DIR/cis_report_$(date +%Y%m%d).csv"


# 初始化报告

init_reports() {

    mkdir -p "$REPORT_DIR"

    

    # HTML报告头部

    cat > "$HTML_REPORT" << 'EOF'

<!DOCTYPE html>

<html>

<head>

    <title>CIS合规性检查报告</title>

    <style>

        body { font-family: Arial, sans-serif; margin: 20px; }

        .pass { color: green; }

        .fail { color: red; }

        .warning { color: orange; }

        table { border-collapse: collapse; width: 100%; margin-top: 20px; }

        th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }

        th { background-color: #4CAF50; color: white; }

        tr:nth-child(even) { background-color: #f2f2f2; }

    </style>

</head>

<body>

    <h1>CIS Linux基准合规性检查报告</h1>

    <p>生成时间: $(date)</p>

    <p>主机名: $(hostname)</p>

    <table>

        <tr>

            <th>检查项</th>

            <th>状态</th>

            <th>详情</th>

            <th>修复建议</th>

        </tr>

EOF

    

    # CSV报告头部

    echo "Section,Check,Status,Details,Recommendation" > "$CSV_REPORT"

}


# 检查1: 初始设置 - 文件系统配置

check_filesystem_config() {

    echo "检查文件系统配置..."

    

    # 检查/tmp挂载选项

    if mount | grep -q " /tmp "; then

        TMP_OPTIONS=$(mount | grep " /tmp " | grep -o "nodev,nosuid,noexec")

        if [[ "$TMP_OPTIONS" == *"nodev"* && "$TMP_OPTIONS" == *"nosuid"* && "$TMP_OPTIONS" == *"noexec"* ]]; then

            add_report "1.1.2" "PASS" "/tmp挂载配置正确" "/tmp已正确配置nodev,nosuid,noexec选项"

        else

            add_report "1.1.2" "FAIL" "/tmp挂载配置不正确" "建议修改/etc/fstab,为/tmp添加nodev,nosuid,noexec选项"

        fi

    fi

}


# 检查2: 服务配置 - SSH

check_ssh_config() {

    echo "检查SSH配置..."

    

    # 检查Protocol版本

    SSH_PROTOCOL=$(grep -i "^Protocol" /etc/ssh/sshd_config | awk '{print $2}')

    if [ "$SSH_PROTOCOL" = "2" ]; then

        add_report "5.2.2" "PASS" "SSH协议版本正确" "SSH配置为使用协议版本2"

    else

        add_report "5.2.2" "FAIL" "SSH协议版本不正确" "建议在/etc/ssh/sshd_config中设置Protocol 2"

    fi

    

    # 检查X11转发

    if grep -q "^X11Forwarding no" /etc/ssh/sshd_config; then

        add_report "5.2.5" "PASS" "X11转发已禁用" "SSH X11转发功能已正确禁用"

    else

        add_report "5.2.5" "FAIL" "X11转发未禁用" "建议在/etc/ssh/sshd_config中设置X11Forwarding no"

    fi

}


# 检查3: 网络配置 - 防火墙

check_firewall_config() {

    echo "检查防火墙配置..."

    

    # 检查是否启用防火墙

    if systemctl is-active --quiet iptables || systemctl is-active --quiet nftables || systemctl is-active --quiet firewalld; then

        add_report "3.5.1" "PASS" "防火墙服务运行中" "系统防火墙服务已启用"

    else

        add_report "3.5.1" "FAIL" "防火墙服务未运行" "建议启用并配置系统防火墙"

    fi

}


# 检查4: 日志与审计

check_audit_config() {

    echo "检查审计配置..."

    

    # 检查auditd服务

    if systemctl is-active --quiet auditd; then

        add_report "4.1.1" "PASS" "审计服务运行中" "auditd服务已启用"

    else

        add_report "4.1.1" "FAIL" "审计服务未运行" "建议安装并启用auditd服务"

    fi

    

    # 检查系统日志配置

    if [ -f /etc/rsyslog.conf ] || [ -f /etc/syslog.conf ]; then

        add_report "4.2.1" "PASS" "系统日志配置存在" "系统日志服务已配置"

<"gzu.sxyicheng.cn"><"wzu.jsnjz.cn"><"wzi.csxthr.com"><"wss.zhaiLimao.com">

    else

        add_report "4.2.1" "FAIL" "系统日志配置缺失" "建议配置系统日志服务"

    fi

}


# 添加检查结果到报告

add_report() {

    local section="$1"

    local status="$2"

    local details="$3"

    local recommendation="$4"

    

    # 添加到HTML报告

    cat >> "$HTML_REPORT" << EOF

        <tr>

            <td>$section</td>

            <td class="$status">$status</td>

            <td>$details</td>

            <td>$recommendation</td>

        </tr>

EOF

    

    # 添加到CSV报告

    echo "$section,$status,$details,$recommendation" >> "$CSV_REPORT"

}


# 生成报告摘要

generate_summary() {

    TOTAL_CHECKS=$(grep -c "<tr>" "$HTML_REPORT")

    PASS_CHECKS=$(grep -c "class=\"pass\"" "$HTML_REPORT")

    FAIL_CHECKS=$(grep -c "class=\"fail\"" "$HTML_REPORT")

    WARNING_CHECKS=$(grep -c "class=\"warning\"" "$HTML_REPORT")

    

    cat >> "$HTML_REPORT" << EOF

    </table>

    

    <h2>检查摘要</h2>

    <p>总检查数: $TOTAL_CHECKS</p>

    <p class="pass">通过: $PASS_CHECKS</p>

    <p class="fail">失败: $FAIL_CHECKS</p>

    <p class="warning">警告: $WARNING_CHECKS</p>

    

    <h2>合规性分数</h2>

    <p>整体合规率: $((PASS_CHECKS * 100 / TOTAL_CHECKS))%</p>

    

    <h2>立即修复建议</h2>

    <ol>

EOF

    

    # 提取失败的检查项建议

    grep "class=\"fail\"" "$HTML_REPORT" | sed 's/.*<td>\(.*\)<\/td>.*<td>\(.*\)<\/td>.*<td>\(.*\)<\/td>.*/\1. \3/' | \

        while read -r line; do

            echo "        <li>$line</li>" >> "$HTML_REPORT"

        done

    

    cat >> "$HTML_REPORT" << 'EOF'

    </ol>

</body>

</html>

EOF

}


# 主函数

main() {

    echo "开始CIS合规性检查"

    init_reports

    check_filesystem_config

    check_ssh_config

    check_firewall_config

    check_audit_config

    generate_summary

    echo "检查完成,报告位置:"

    echo "  HTML报告: $HTML_REPORT"

    echo "  CSV报告: $CSV_REPORT"

}


main

```


## 六、实时监控与告警


### 6.1 安全事件监控脚本


```bash

#!/bin/bash

# security_monitor.sh


LOG_DIR="/var/log/security_monitor"

ALERT_LOG="$LOG_DIR/alerts.log"

CONFIG_FILE="/etc/security_monitor.conf"


# 监控配置

load_config() {

    # 默认配置

    MONITOR_PORTS="22,80,443,3306,5432"

    ALERT_THRESHOLD=10

    ALERT_EMAIL="security@example.com"

    SLACK_WEBHOOK=""

    

    if [ -f "$CONFIG_FILE" ]; then

        source "$CONFIG_FILE"

    fi

}


# 监控可疑连接

monitor_suspicious_connections() {

    echo "[$(date)] 开始监控可疑连接" >> "$ALERT_LOG"

    

    # 监控失败登录尝试

    FAILED_LOGINS=$(grep "Failed password" /var/log/auth.log | wc -l)

    if [ "$FAILED_LOGINS" -gt "$ALERT_THRESHOLD" ]; then

        send_alert "high" "检测到大量失败登录


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/19545/viewspace-3108749/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-11-01

  • 博文量
    895
  • 访问量
    933956