自动化脚本如何清理未使用ACL规则

wen 实用脚本 6

本文目录导读:

自动化脚本如何清理未使用ACL规则

  1. 核心检测方法
  2. 自动化清理流程
  3. 不同平台的实现示例
  4. 安全措施
  5. 监控与审计
  6. 最佳实践建议
  7. 注意事项

针对自动化清理未使用的ACL(访问控制列表)规则,以下是一个系统化的处理方案:

核心检测方法

日志分析

#!/bin/bash
# 检测7天内未被匹配的ACL规则
last_match=$(date -d "7 days ago" +%s)
grep "ACL_MATCH" /var/log/firewall.log | awk '{print $NF}' | sort | uniq -c | while read count acl_id; do
    if [ $count -eq 0 ]; then
        echo "UNUSED_ACL:$acl_id"
    fi
done

流量统计比对

# Python脚本示例
import netaddr
from collections import defaultdict
def compare_acl_with_traffic(acl_rules, traffic_logs):
    unused_rules = []
    for rule in acl_rules:
        if not is_traffic_matching_rule(rule, traffic_logs):
            unused_rules.append(rule)
    return unused_rules

自动化清理流程

脚本实现

#!/bin/bash
# clean_unused_acl.sh
# 配置参数
ACL_BACKUP_DIR="/backup/acl"
DRY_RUN=true  # 先以dry-run模式运行
# 1. 备份当前配置
backup_acls() {
    timestamp=$(date +%Y%m%d_%H%M%S)
    mkdir -p $ACL_BACKUP_DIR/$timestamp
    # 根据设备类型执行备份
    case $DEVICE_TYPE in
        "cisco") show running-config | grep "access-list" > $ACL_BACKUP_DIR/$timestamp/acl.cfg ;;
        "linux") cp /etc/iptables/rules.v4 $ACL_BACKUP_DIR/$timestamp/ ;;
    esac
}
# 2. 识别未使用ACL
identify_unused_acl() {
    # 方法1:检查ACL引用计数
    # 方法2:分析日志匹配次数
    # 方法3:检查是否被接口引用
    for acl in $(list_acls); do
        if ! is_acl_referenced $acl && ! has_traffic_match $acl; then
            echo $acl >> /tmp/unused_acls.txt
        fi
    done
}
# 3. 验证并清理
cleanup_acls() {
    if [ "$DRY_RUN" = true ]; then
        echo "Dry-run mode: Would remove these ACLs:"
        cat /tmp/unused_acls.txt
    else
        # 先测试影响
        impact_test_on_unused_acl
        # 逐条删除
        while read acl; do
            remove_acl_rule $acl
            log_cleanup_action $acl
        done < /tmp/unused_acls.txt
    fi
}
# 主流程
main() {
    backup_acls
    identify_unused_acl
    cleanup_acls
    verify_connectivity  # 验证网络连通性
}

不同平台的实现示例

Cisco IOS

#!/usr/bin/expect
set timeout 30
spawn ssh admin@switch
expect "Password:"
send "your_password\r"
# 获取ACL信息
send "show access-lists | include (no matches)\r"
expect "#"
# 清理未使用的ACL
send "conf t\r"
send "no access-list 101\r"
send "end\r"
send "write memory\r"

Linux iptables

#!/bin/bash
# 清理未使用的iptables规则
cleanup_iptables() {
    # 获取所有规则
    iptables-save > /tmp/iptables_backup.rules
    # 标记统计为0的规则
    iptables -L -n -v -t filter | tail -n +3 | awk '$1==0 && $2==0 {print $0}' | 
    while read line; do
        # 解析并删除规则
        chain=$(echo $line | awk '{print $1}')
        rule_num=$(echo $line | awk '{print $NF}')
        if [ ! -z "$chain" ] && [ ! -z "$rule_num" ]; then
            iptables -D $chain $rule_num
        fi
    done
    iptables-save > /etc/iptables/rules.v4
}

AWS Security Groups

import boto3
from datetime import datetime, timedelta
def clean_unused_security_groups():
    ec2 = boto3.client('ec2')
    # 获取所有安全组
    sgs = ec2.describe_security_groups()['SecurityGroups']
    # 获取所有ENI(网络接口)
    enis = set()
    for eni in ec2.describe_network_interfaces()['NetworkInterfaces']:
        for sg in eni['Groups']:
            enis.add(sg['GroupId'])
    # 查找未使用的安全组
    unused_sgs = []
    for sg in sgs:
        if sg['GroupId'] not in enis and sg['GroupName'] != 'default':
            # 检查最后使用时间
            if is_unused_for_days(sg['GroupId'], days=30):
                unused_sgs.append(sg['GroupId'])
    # 删除未使用的安全组
    for sg_id in unused_sgs:
        ec2.delete_security_group(GroupId=sg_id)
        print(f"Deleted unused security group: {sg_id}")
def is_unused_for_days(sg_id, days=30):
    # 检查CloudTrail日志
    # 实现具体逻辑
    return True

安全措施

# 1. 分级清理策略
GRACE_PERIOD=30  # 30天观察期
ROLLOUT_PHASES=("10%" "25%" "50%" "100%")
# 2. 回滚机制
rollback_acl_changes() {
    if [ -f "$ACL_BACKUP_DIR/last_backup" ]; then
        restore_from_backup $ACL_BACKUP_DIR/last_backup
        verify_network_functionality
    fi
}
# 3. 审批流程
notify_teams() {
    echo "Pending ACL cleanup requires approval:"
    cat /tmp/unused_acls.txt | mail -s "ACL Cleanup Request" network-team@company.com
}
# 4. 影响分析
impact_analysis() {
    acl=$1
    # 检查关联的接口、VLAN、VPN等
    # 输出影响范围报告
}

监控与审计

# 持续监控脚本
import schedule
import time
def periodic_acl_audit():
    # 运行清理检查
    identify_unused_acls()
    # 生成报告
    generate_acl_usage_report()
    # 发送告警
    if found_unused_acls:
        send_alert()
# 每天凌晨2点运行
schedule.every().day.at("02:00").do(periodic_acl_audit)
while True:
    schedule.run_pending()
    time.sleep(60)

最佳实践建议

  1. 实施灰度发布:在测试环境验证后,分批在生产环境执行
  2. 保留快照:清理前保留完整配置快照
  3. 监控告警:清理后持续监控24-48小时
  4. 文档化:记录每次清理的ACL规则及原因
  5. 自动化程度:从人工审核 → 半自动 → 全自动分级实施

注意事项

  • 不要清理具有动态更新机制的ACL
  • 警惕被集中认证系统引用的ACL
  • 考虑业务低峰期执行
  • 保留7-30天的审计日志

建议先以报告模式(只识别不删除)运行至少一个完整业务周期,确认无负面影响后再执行实际清理。

抱歉,评论功能暂时关闭!