第249篇:安全基线检查清单

关键词:安全基线、配置核查、等保合规、CIS Benchmark、配置审计、自动化巡检、配置标准化

一、引言

安全基线(Security Baseline)是一组最低限度的安全配置要求,定义了网络设备在上线前必须满足的安全标准。没有基线的网络安全建设如同没有标准的建筑工程——每台设备的配置因人而异,安全隐患无法系统性排查,合规审计无从下手。

安全基线检查不是"一次性任务",而是贯穿设备全生命周期的常态化工作。从设备初始化、上线前核查、定期巡检到变更后的回归检查,基线检查为网络安全提供了可量化、可审计的保障机制。

二、安全基线框架

2.1 基线分类体系

基线分类体系 - 图示

2.2 交换机安全基线检查清单

2.2.1 访问控制检查项

序号 检查项 要求 检查命令 合规标准
AC-01 无默认账号 禁用 initial 默认账号 display local-user initial 等保三级
AC-02 管理员密码复杂度 ≥8 位,含大小写字母+数字+特殊字符 display local-user verbose CIS
AC-03 密码有效期 ≤90 天 display local-user verbose CIS
AC-04 密码历史检查 至少记住最近 5 次密码 display aaalimit password CIS
AC-05 登录失败锁定 ≤5 次失败锁定 ≥15 分钟 display aaalimit login CIS
AC-06 账号权限分级 非所有账号均为 level 15 display local-user 最小权限
AC-07 首次登录强制改密 启用 first-login display local-user verbose CIS

2.2.2 协议安全检查项

序号 检查项 要求 检查命令 合规标准
PR-01 Telnet 禁用 VTY 仅允许 SSH display this interface vty 0 等保三级
PR-02 SSH 版本 仅启用 SSHv2 display ssh server status CIS
PR-03 HTTP 禁用 仅启用 HTTPS display http server CIS
PR-04 SNMP 版本 使用 SNMPv3 display snmp-agent CIS
PR-05 SNMP ACL 限制 SNMP 访问源 display snmp-agent CIS
PR-06 CDP/LLDP 非必要接口关闭 display this interface CIS

2.2.3 网络安全检查项

序号 检查项 要求 检查命令 合规标准
NW-01 VLAN 划分 至少划分管理 VLAN 和业务 VLAN display vlan 等保三级
NW-02 管理 ACL VTY 接口配置管理 ACL display this interface vty 0 CIS
NW-03 DHCP Snooping 启用,信任端口正确配置 display dhcp snooping CIS
NW-04 端口安全 接入端口限制 MAC 数量 display port-security CIS
NW-05 STP 保护 BPDU 保护/根保护启用 display stp brief CIS
NW-06 广播风暴抑制 启用 storm-control display storm-control CIS
NW-07 未用端口关闭 未使用端口 shutdown display port CIS

2.2.4 审计日志检查项

序号 检查项 要求 检查命令 合规标准
AU-01 Syslog 启用 配置远程 Syslog 服务器 display info-center loghost 等保三级
AU-02 时钟同步 配置 NTP 服务器 display ntp status CIS
AU-03 操作日志 记录配置变更 display log configuration CIS
AU-04 日志级别 ≥ informational display info-center source CIS
AU-05 配置备份 定期自动备份 display timer task CIS

2.2.5 系统安全检查项

序号 检查项 要求 检查命令 合规标准
SY-01 Banner 配置 显示安全警告信息 display banner CIS
SY-02 固件版本 使用最新稳定版本 display version CIS
SY-03 无用服务关闭 关闭 unused 服务 display this CIS
SY-04 文件权限 配置文件权限保护 display file CIS

2.3 防火墙安全基线检查清单

序号 检查项 要求 检查命令 合规标准
FW-01 默认策略 区域间默认 deny display security-policy 等保三级
FW-02 策略最小化 无 service any 策略 display security-policy all CIS
FW-03 策略日志 所有策略启用日志 display security-policy 等保三级
FW-04 NAT 策略 仅必要的地址转换 display nat session CIS
FW-05 IPS 启用 入侵防御功能启用 display ips status 等保三级
FW-06 应用识别 启用应用识别引擎 display application status CIS
FW-07 防病毒 启用防病毒扫描 display av status 等保三级
FW-08 URL 过滤 启用 URL 分类过滤 display url-filter status CIS
FW-09 会话超时 合理的会话超时时间 display firewall session aging CIS
FW-10 管理界面 仅 HTTPS + SSH 管理 display this CIS

三、自动化基线检查实施

3.1 基线检查脚本(Python + Netmiko)

#!/usr/bin/env python3
"""
网络设备安全基线自动检查脚本
支持华为 VRP 设备(交换机/路由器/防火墙)
"""
from netmiko import ConnectHandler
import json
import csv
from datetime import datetime

# 设备清单
devices = [
    {"host": "10.10.100.10", "username": "admin", "password": "xxx", "device_type": "huawei"},
    {"host": "10.10.100.11", "username": "admin", "password": "xxx", "device_type": "huawei"},
]

# 基线检查项定义
baseline_checks = {
    "AC-01_Default_Account": {
        "name": "默认账号检查",
        "command": "display local-user initial",
        "pass_condition": "不存在",  # 如果命令报错则通过
    },
    "PR-01_Telnet_Disabled": {
        "name": "Telnet 禁用检查",
        "command": "display this interface vty 0",
        "fail_pattern": "telnet",  # 如果输出包含 telnet 则失败
        "pass_pattern": "protocol inbound ssh",
    },
    "PR-02_SSH_Version": {
        "name": "SSH 版本检查",
        "command": "display ssh server status",
        "pass_pattern": "version 2",
    },
    "AU-01_Syslog": {
        "name": "Syslog 配置检查",
        "command": "display info-center loghost",
        "pass_pattern": "loghost",  # 如果存在 loghost 配置则通过
    },
    "AU-02_NTP": {
        "name": "NTP 配置检查",
        "command": "display ntp status",
        "pass_pattern": "synchronized",
    },
    "SY-01_Banner": {
        "name": "Banner 检查",
        "command": "display banner",
        "pass_pattern": "warning|authorized|unauthorized",
    },
}

def check_device(device, checks):
    """检查单个设备的安全基线"""
    results = []
    try:
        conn = ConnectHandler(**device)
        conn.enable()

        for check_id, check in checks.items():
            try:
                output = conn.send_command(check["command"], read_timeout=30)

                # 判断合规状态
                passed = False
                if "fail_pattern" in check:
                    passed = check["fail_pattern"] not in output.lower()
                if "pass_pattern" in check:
                    passed = check["pass_pattern"] in output.lower()
                if "pass_condition" == check.get("pass_condition"):
                    passed = True  # 命令报错视为通过

                results.append({
                    "check_id": check_id,
                    "name": check["name"],
                    "status": "PASS" if passed else "FAIL",
                    "output_snippet": output[:200].strip(),
                })
            except Exception as e:
                results.append({
                    "check_id": check_id,
                    "name": check["name"],
                    "status": "ERROR",
                    "error": str(e)[:200],
                })

        conn.disconnect()
    except Exception as e:
        return {"error": str(e), "results": []}

    return results

def generate_report(all_results):
    """生成基线检查报告"""
    report = {
        "report_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
        "summary": {},
        "device_results": all_results,
    }

    # 统计
    total = 0
    passed = 0
    failed = 0
    for device_result in all_results.values():
        for r in device_result:
            total += 1
            if r["status"] == "PASS":
                passed += 1
            elif r["status"] == "FAIL":
                failed += 1

    report["summary"] = {
        "total_checks": total,
        "passed": passed,
        "failed": failed,
        "compliance_rate": f"{(passed/total*100):.1f}%" if total > 0 else "N/A",
    }

    return report

if __name__ == "__main__":
    all_results = {}
    for device in devices:
        print(f"Checking {device['host']}...")
        all_results[device["host"]] = check_device(device, baseline_checks)

    report = generate_report(all_results)

    # 输出 JSON 报告
    with open("baseline_report.json", "w") as f:
        json.dump(report, f, indent=2, ensure_ascii=False)

    # 输出 CSV 摘要
    with open("baseline_summary.csv", "w", newline="") as f:
        writer = csv.writer(f)
        writer.writerow(["Device", "Check_ID", "Check_Name", "Status"])
        for host, results in all_results.items():
            for r in results:
                writer.writerow([host, r["check_id"], r["name"], r["status"]])

    print(f"\n合规率: {report['summary']['compliance_rate']}")
    print("报告已保存: baseline_report.json, baseline_summary.csv")

3.2 华为设备基线核查命令速查

# ===== 一键基线核查命令集 =====

# 1. 访问控制
display local-user
display local-user verbose
display aaalimit all

# 2. 协议安全
display this interface vty 0
display ssh server status
display snmp-agent
display http server

# 3. 网络安全
display vlan brief
display current-configuration | include acl
display dhcp snooping brief
display stp brief

# 4. 审计日志
display info-center loghost
display ntp status
display log configuration

# 5. 系统信息
display version
display device
display banner

# 将核查结果导出
display current-configuration > running.cfg

3.3 基线检查报告模板

╔════════════════════════════════════════════════════════╗
║          网络设备安全基线检查报告                        ║
╠════════════════════════════════════════════════════════╣
║ 设备名称: Core-SW-01                                   ║
║ 设备型号: Huawei S6730H-52XC-EI                        ║
║ 检查时间: 2024-07-25 14:30                              ║
║ 检查人: 安全运维组                                      ║
║ 合规率: 92.3% (12/13 PASS, 1 FAIL)                     ║
╠════════════════════════════════════════════════════════╣
║ 检查项               状态     说明                       ║
╠════════════════════════════════════════════════════════╣
║ AC-01 默认账号       PASS     已禁用                     ║
║ AC-02 密码复杂度      PASS     满足要求                   ║
║ AC-03 密码有效期      PASS     90天                       ║
║ PR-01 Telnet禁用      PASS     仅SSH                      ║
║ PR-02 SSH版本         PASS     SSHv2                     ║
║ PR-03 HTTP禁用        FAIL     HTTP服务仍开启 ← 需整改    ║
║ AU-01 Syslog          PASS     已配置                     ║
║ AU-02 NTP             PASS     已同步                     ║
║ ...                                      ║
╚════════════════════════════════════════════════════════╝

四、基线管理与持续改进

4.1 基线检查频率

检查类型 频率 执行方式 说明
新设备上线前检查 每次上线 人工 + 脚本 上线前必须全部 PASS
定期巡检 每月 自动化脚本 发现偏离基线的配置
变更后回归检查 每次变更后 自动化脚本 确认变更未引入偏差
合规审计前检查 每季度 人工 + 脚本 全面核查,准备审计材料
安全事件后检查 事件发生后 人工 + 脚本 排查配置被篡改

4.2 基线偏离处理流程

基线偏离处理流程 - 图示

4.3 基线豁免管理

豁免编号 检查项 设备 豁免原因 审批人 有效期 状态
EX-001 PR-01 Telnet禁用 Legacy-SW-01 旧网管系统仅支持 Telnet CISO 2024-12-31 有效
EX-002 NW-06 风暴抑制 Core-SW-01 核心交换机高带宽不需要 安全主管 永久 有效
EX-003 PR-04 SNMPv3 Monitor-SW-01 监控代理不支持 v3 安全主管 2024-09-30 待审批

五、总结

维度 要点
基线价值 标准化配置、降低安全盲区、支撑合规审计
检查分类 访问控制、协议安全、网络安全、审计日志、系统安全
检查频率 上线前必查、每月定期查、变更后回归查
自动化工具 Python + Netmiko、Ansible、专用基线检查平台
基线偏离 分析原因、及时修复、特殊场景申请豁免
持续改进 通过检查数据驱动安全加固优先级排序
参考标准 CIS Benchmark、等保 2.0、企业自定义基线

核心结论:安全基线是网络安全建设的"地基"。一份完善的基线检查清单不仅为设备安全提供了最低保障,也为安全运营提供了可量化的度量指标。通过自动化基线检查,将安全配置从"人工记忆"升级为"系统保障",是网络安全管理从粗放走向精细化的必经之路。

思考

  1. 如何平衡安全基线的严格性与业务灵活性?当业务部门要求"例外"时应该如何处理?

  2. 安全基线检查发现大量设备不合规时,应该优先修复哪些项?排序原则是什么?

  3. 在容器化/云计算环境中,传统的网络设备安全基线检查还有哪些适用?哪些需要调整?

下篇预告:第250篇:一次完整的企业网安全渗透测试案例——从外到内的实战演练