引言
《网络安全法》第21条明确规定:国家实行网络安全等级保护制度。等保2.0(GB/T 22239-2019)于2019年12月1日正式实施,将云计算、移动互联、物联网、工业控制和工控系统纳入保护对象。其中三级系统(安全标记保护级)是广大政企单位最常见的定级级别。本文基于多次参与等保测评和系统建设的实战经验,提供一份从解读到落地的完整指南。
一、等保2.0框架解读
1.1 等保2.0 vs 1.0 核心变化
| 变化维度 | 等保1.0 | 等保2.0 |
|---|---|---|
| 标准体系 | GB/T 22239-2008 | GB/T 22239-2019 |
| 保护对象 | 传统信息系统 | 新增:云计算/移动互联/物联网/工控 |
| 安全要求结构 | 10大类 | “一个中心、三重防护” |
| 可信验证 | 未明确要求 | 各级别均有可信验证要求 |
| 密码技术 | 提及较少 | 明确要求使用国密算法 |
| 测评周期 | 四级每半年,三级每年 | 四级每半年,三级每年,二级每两年 |
| 定级流程 | 自主定级 | 专家评审+主管部门核准 |
1.2 “一个中心、三重防护"架构
┌──────────────────┐
│ 安全管理中心 │
│ (系统管理/审计管理│
│ 安全管理/集中管控)│
└────────┬─────────┘
│
┌───────────────────┼───────────────────┐
│ │ │
┌────┴────┐ ┌────┴────┐ ┌────┴────┐
│ 安全计算 │ │ 安全区域 │ │ 安全通信 │
│ 环境 │ │ 边界 │ │ 网络 │
│(身份鉴别 │ │(边界防护 │ │(通信加密 │
│ 访问控制 │ │ 访问控制 │ │ 可信验证)│
│ 安全审计 │ │ 入侵防范 │ │ │
│ 入侵防范)│ │ 安全审计)│ │ │
└─────────┘ └─────────┘ └─────────┘
物理安全 ─── 贯穿所有层面 ─── 基础底座
1.3 三级系统核心指标
三级系统的核心要义是:在遭受攻击后,能保护重要数据不泄露,系统能够恢复基本功能。共 300+ 条安全要求,以下是 10 条三级特别关注的高权重指标:
| 序号 | 要求项 | 关键内容 | 权重 |
|---|---|---|---|
| 1 | 身份鉴别 | 双因素认证、密码复杂度策略 | 高 |
| 2 | 访问控制 | 最小权限、三权分立 | 高 |
| 3 | 安全审计 | 日志全覆盖、审计记录保护、不可删除 | 高 |
| 4 | 入侵防范 | WAF/IDS/IPS、APT检测 | 高 |
| 5 | 数据保密性 | 传输加密、存储加密、国密算法 | 高 |
| 6 | 数据备份恢复 | 异地备份、恢复演练 | 高 |
| 7 | 剩余信息保护 | 存储空间释放前清除、内存释放前清除 | 中 |
| 8 | 可信验证 | 引导程序、系统程序可信度量 | 中 |
| 9 | 安全管理中心 | 三权分立审计、集中管控 | 高 |
| 10 | 个人信息保护 | 仅采集必要信息、脱敏处理 | 高 |
二、技术部分建设
2.1 安全物理环境
机房门禁系统配置:
# 门禁系统配置要点
机房物理安全:
出入口控制:
- 双向刷卡 + 生物识别(指纹/人脸)
- 进出记录保存 >= 180天
- 视频监控覆盖所有出入口
区域划分:
- 主机房 / 辅助区 / 支持区 / 行政管理区
- 不同安全等级设备物理隔离
环境监控:
- 温湿度传感器(报警阈值:温度 22±3°C,湿度 45%-65%)
- 漏水检测(空调下方、管线区域)
- UPS 供电 >= 2小时(三级要求)
2.2 安全通信网络
通信完整性校验实现:
#!/usr/bin/env python3
"""通信完整性校验模块 (HMAC-SM3 国密)"""
import hmac
import hashlib
try:
from gmssl.sm3 import sm3_hash
USE_GMSSL = True
except ImportError:
USE_GMSSL = False
class CommunicationIntegrity:
"""等保三级通信完整性校验"""
def __init__(self, secret_key: bytes):
if len(secret_key) < 32:
raise ValueError("密钥长度至少 32 字节")
self.secret_key = secret_key
def compute_hmac_sm3(self, message: bytes) -> str:
"""使用 HMAC-SM3 计算消息认证码"""
if USE_GMSSL:
# 使用国密 SM3
block_size = 64 # SM3 块大小
if len(self.secret_key) > block_size:
key = bytes.fromhex(sm3_hash(self.secret_key.hex()))
else:
key = self.secret_key.ljust(block_size, b'\x00')
o_key_pad = bytes(x ^ 0x5c for x in key)
i_key_pad = bytes(x ^ 0x36 for x in key)
inner_hash = sm3_hash((i_key_pad + message).hex())
return sm3_hash((o_key_pad + bytes.fromhex(inner_hash)).hex())
else:
# 回退到 HMAC-SHA256
return hmac.new(self.secret_key, message, hashlib.sha256).hexdigest()
def verify(self, message: bytes, mac: str) -> bool:
"""验证消息完整性"""
computed = self.compute_hmac_sm3(message)
return hmac.compare_digest(computed, mac)
# 使用示例
ci = CommunicationIntegrity(b'my-32-byte-secret-key-here!!')
msg = b'{"user":"admin","action":"delete_record","id":12345}'
mac = ci.compute_hmac_sm3(msg)
assert ci.verify(msg, mac)
通信保密性实现(国密 SM4):
from gmssl.sm4 import CryptSM4, SM4_ENCRYPT, SM4_DECRYPT
class CommunicationConfidentiality:
"""等保三级通信加密(国密 SM4-CBC)"""
def __init__(self, key: bytes, iv: bytes = None):
if len(key) != 16:
raise ValueError("SM4 密钥 16 字节")
self.key = key
self.iv = iv or b'\x00' * 16
self.crypt_sm4 = CryptSM4()
def encrypt(self, plaintext: str) -> bytes:
self.crypt_sm4.set_key(self.key, SM4_ENCRYPT)
data = plaintext.encode('utf-8')
# PKCS7 填充
pad_len = 16 - len(data) % 16
data += bytes([pad_len]) * pad_len
return self.crypt_sm4.crypt_cbc(self.iv, data)
def decrypt(self, ciphertext: bytes) -> str:
self.crypt_sm4.set_key(self.key, SM4_DECRYPT)
plain = self.crypt_sm4.crypt_cbc(self.iv, ciphertext)
# 去除 PKCS7 填充
pad_len = plain[-1]
return plain[:-pad_len].decode('utf-8')
2.3 安全区域边界
边界防护系统部署架构:
# 等保三级边界设备推荐清单
边界防护设备:
下一代防火墙(NGFW):
- 型号: 华为 USG6600E / 深信服 AF
- 策略: 默认拒绝 + 业务白名单
- 功能: IPS/AV/URL过滤/应用识别全线开启
Web应用防火墙(WAF):
- 型号: 长亭 SafeLine / F5 BIG-IP ASM
- 策略: OWASP Top-10 全覆盖
- 部署: 反向代理模式或透明桥接
入侵检测/防御(IDS/IPS):
- 开源方案: Suricata + Elastic Stack
- 规则: ET Open + 自定义业务规则
- 更新频率: 每日自动更新
安全审计:
- 堡垒机: JumpServer / 齐治
- 日志审计: Graylog / Splunk
- 数据库审计: 安恒 DAS
Suricata 自定义规则示例:
# suricata-custom.rules — 等保三级边界检测规则
# 1. 检测敏感数据外泄(身份证号)
alert tcp $HOME_NET any -> $EXTERNAL_NET any (
msg:"等保-敏感数据外泄-身份证号";
flow:to_server,established;
content:"|e8 ba ab e4 bb bd e8 af 81|"; nocase;
pcre:"/[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]/";
classtype:policy-violation;
priority:1;
sid:1000001;
rev:1;
)
# 2. 检测非工作时段运维操作
alert tcp any any -> $HOME_NET 22 (
msg:"等保-非工作时段SSH连接";
flow:to_server,established;
detect_offset:0;
threshold:type limit, track by_src, count 1, seconds 60;
classtype:attempted-admin;
priority:2;
sid:1000002;
rev:1;
)
# 3. 检测暴力破解
alert tcp $EXTERNAL_NET any -> $HOME_NET [22,3389,3306,1433] (
msg:"等保-暴力破解检测";
flow:to_server,established;
threshold:type both, track by_src, count 10, seconds 60;
classtype:attempted-admin;
priority:1;
sid:1000003;
rev:1;
)
2.4 安全计算环境
操作系统安全加固脚本:
#!/bin/bash
# os-hardening-dengbao3.sh — 等保三级操作系统加固
set -euo pipefail
LOG_FILE="/var/log/dengbao-hardening.log"
exec 2> >(tee -a "$LOG_FILE" >&2)
echo "===== 等保三级操作系统加固开始 $(date) =====" | tee -a "$LOG_FILE"
# 1. 身份鉴别 (g)
echo "[+] 配置密码策略..."
cat >> /etc/security/pwquality.conf << 'EOF'
minlen = 10
dcredit = -1 # 至少 1 个数字
ucredit = -1 # 至少 1 个大写字母
lcredit = -1 # 至少 1 个小写字母
ocredit = -1 # 至少 1 个特殊字符
maxrepeat = 3 # 最多连续重复 3 次
difok = 5 # 新密码至少 5 个不同字符
EOF
# 2. 登录失败锁定
echo "[+] 配置登录失败锁定..."
cat >> /etc/pam.d/common-auth << 'EOF'
auth required pam_tally2.so deny=5 unlock_time=300 even_deny_root root_unlock_time=600
EOF
# 3. 超时自动退出
echo "[+] 配置超时自动退出..."
cat >> /etc/profile << 'EOF'
TMOUT=600
readonly TMOUT
export TMOUT
EOF
# 4. 审计策略(全覆盖)
echo "[+] 配置系统审计..."
cat > /etc/audit/rules.d/dengbao.rules << 'EOF'
# 审计系统管理操作
-w /etc/passwd -p wa -k identity_changes
-w /etc/shadow -p wa -k identity_changes
-w /etc/group -p wa -k identity_changes
-w /etc/sudoers -p wa -k privilege_escalation
-w /etc/crontab -p wa -k scheduled_tasks
# 审计计划任务
-w /var/spool/cron -p wa -k scheduled_tasks
# 审计网络配置
-w /etc/hosts -p wa -k network_config
-w /etc/sysconfig/network -p wa -k network_config
# 审计 SSH 配置
-w /etc/ssh/sshd_config -p wa -k sshd_config
# 审计执行系统调用
-a always,exit -F arch=b64 -S execve -k process_execution
-a always,exit -F arch=b32 -S execve -k process_execution
# 审计权限提升
-a always,exit -F arch=b64 -S setuid -S setreuid -S setresuid -k privilege_escalation
# 设置审计规则不可变
-e 2
EOF
# 5. 最小化安装
echo "[+] 卸载非必要服务..."
for pkg in telnet rsh-server talk-server xinetd; do
apt-get remove --purge -y "$pkg" 2>/dev/null || yum remove -y "$pkg" 2>/dev/null || true
done
# 6. 关闭非必要端口
echo "[+] 防火墙最小化..."
ufw default deny incoming 2>/dev/null || iptables -P INPUT DROP
ufw default allow outgoing 2>/dev/null || iptables -P OUTPUT ACCEPT
for port in 22 80 443; do
ufw allow $port 2>/dev/null || iptables -A INPUT -p tcp --dport $port -j ACCEPT
done
ufw enable 2>/dev/null || true
echo "===== 等保三级操作系统加固完成 $(date) =====" | tee -a "$LOG_FILE"
2.5 数据安全实现
数据脱敏中间件:
import re
from typing import Any, Dict
class DataMasking:
"""等保三级数据脱敏(支持身份证、手机号、银行卡、邮箱)"""
PATTERNS = {
'id_card': (r'[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]',
lambda m: m.group()[:6] + '********' + m.group()[-4:]),
'phone': (r'1[3-9]\d{9}',
lambda m: m.group()[:3] + '****' + m.group()[-4:]),
'bank_card': (r'\d{16,19}',
lambda m: m.group()[:4] + ' **** **** ' + m.group()[-4:]),
'email': (r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}',
lambda m: m.group()[0] + '***@' + m.group().split('@')[1]),
}
@classmethod
def mask_data(cls, data: Any) -> Any:
"""递归脱敏"""
if isinstance(data, str):
for _, (pattern, replacer) in cls.PATTERNS.items():
data = re.sub(pattern, replacer, data)
return data
elif isinstance(data, dict):
return {k: cls.mask_data(v) for k, v in data.items()}
elif isinstance(data, list):
return [cls.mask_data(item) for item in data]
return data
# 使用
original = {"user": "张三", "phone": "13812345678", "id_card": "320102199001011234"}
masked = DataMasking.mask_data(original)
print(masked)
# {'user': '张三', 'phone': '138****5678', 'id_card': '320102********1234'}
三、安全管理中心建设
3.1 三权分立
-- 等保三级三权分立数据库配置
-- 系统管理员(仅负责系统配置,不可查看审计日志)
CREATE USER sys_admin WITH PASSWORD 'Sys@Admin#2026';
GRANT CREATE, ALTER, DROP ON DATABASE db_prod TO sys_admin;
REVOKE SELECT ON audit_log FROM sys_admin;
-- 安全管理员(仅负责权限管理)
CREATE USER sec_admin WITH PASSWORD 'Sec@Admin#2026';
GRANT CREATE USER, ALTER USER, DROP USER ON *.* TO sec_admin;
REVOKE ALL ON db_prod.* FROM sec_admin;
-- 审计管理员(仅负责审计日志查看)
CREATE USER aud_admin WITH PASSWORD 'Aud@Admin#2026';
GRANT SELECT ON audit_log TO aud_admin;
REVOKE ALL ON db_prod.* FROM aud_admin;
3.2 集中管控平台
建议实现以下集中管控功能:
集中管控平台功能清单:
资产管理:
- 硬件资产自动发现与盘点
- 软件资产许可管理
- 资产变更自动审计与告警
安全事件管理:
- 多源日志聚合 (syslog/snmp/http)
- 关联分析规则引擎
- 自动化 SOAR 剧本 (playbooks)
漏洞管理:
- 定期漏洞扫描(三级要求每周)
- 漏洞生命周期追踪 (发现→确认→修复→验证)
- 补丁管理自动化
态势感知:
- 全网资产态势大屏
- 威胁情报集成 (TIP)
- 攻击链可视化
四、建设实施步骤
等保三级建设推荐以下实施路径:
| 阶段 | 周期 | 交付物 | 要点 |
|---|---|---|---|
| 1. 系统定级 | 1-2 周 | 定级报告、专家评审意见 | 明确系统边界 |
| 2. 差距分析 | 2-3 周 | 差距分析报告、整改清单 | 对标 GB/T 22239 |
| 3. 方案设计 | 3-4 周 | 建设方案、产品选型 | 技术+管理并重 |
| 4. 实施部署 | 4-8 周 | 部署文档、配置基线 | 最小影响业务 |
| 5. 自查整改 | 2-3 周 | 自查报告 | 逐条核验 300+ 项 |
| 6. 等级测评 | 1-2 周 | 测评报告(70分以上通过) | 选择有资质机构 |
| 7. 持续运营 | 长期 | 年度自查、定期演练 | PDCA 循环 |
五、常见失分项及应对
| 失分项 | 扣分 | 原因 | 对策 |
|---|---|---|---|
| 未实现双因素认证 | -5 至 -10 | 三级强制要求 | 部署堡垒机+MFA |
| 审计日志可删除 | -5 | 审计记录应防篡改 | 日志写入 WORM 存储/CDN 实时转发 |
| 未做异地备份 | -5 至 -8 | 异地 ≥ 30 公里 | 使用对象存储跨地域复制 |
| 未进行应急演练 | -3 至 -5 | 需每年至少 1 次 | 制定演练方案,保留演练记录 |
| 无剩余信息保护 | -3 | 内存/磁盘释放前清除 | 采购带自毁功能的存储设备 |
结语
等保三级建设不是单纯的产品堆砌,而是一个系统工程。从定级、备案、整改、测评到持续运营,需要安全团队与业务团队的深度协作。建议将等保要求融入开发生命周期(DevSecOps),从源头解决安全问题;同时在日常运营中贯彻 PDCA 循环,真正做到"持续合规"而非"测评前临时抱佛脚”。