等保整改 — 安全审计(操作审计)整改报告
一、问题描述
| 项目 |
内容 |
| 控制点 |
安全审计 |
| 要求项 |
对审计记录进行保护,定期备份,避免受到未预期的删除、修改或覆盖等 |
| 风险级别 |
中 |
| 问题描述 |
云平台的操作审计未创建跟踪,仅能留存90天,审计记录留存时间不足六个月,未定期对操作审计进行备份,未接入日志服务对操作审计进行实时收集保护 |
| 整改建议 |
建议配置日志审计系统或日志服务器等设备,实时收集网络边界、重要网络节点的审计记录,并对审计记录进行定期备份,保证审计记录保存时间大于6个月,降低日志遭到非授权删除、修改或覆盖的风险 |
二、方案选型
2.1 可选方案对比
| 方案 |
成本 |
覆盖度 |
推荐度 |
| ActionTrail + 日志服务SLS |
约200-500元/年 |
完全覆盖 |
预算充足时选 |
| ActionTrail + OSS |
约10元/年 |
完全覆盖 |
首选 |
| CLI拉取 + 本地存储 |
0元 |
完全覆盖 |
预算极紧时选(本次采用) |
| 仅JumpServer备份 |
0元 |
部分覆盖 |
不太推荐 |
2.2 最终选择:CLI拉取 + 本地存储
选择理由:
- 零成本,无需为审计日志额外付费
- 利用已有运维服务器114.55.33.1的磁盘空间
- 通过阿里云CLI直接拉取ActionTrail审计事件,存储为本地JSON文件
- 配置SHA256完整性校验,满足防篡改要求
补充说明:
ActionTrail创建跟踪时阿里云平台要求必须配置一项存储服务(OSS或SLS),因此额外配置了OSS投递作为平台侧的数据留存。核心整改逻辑仍为CLI定时拉取 + 本地存储,OSS投递属于平台强制要求的附属配置。
三、整改方案
3.1 整体架构
阿里云 ActionTrail(操作审计,免费)
│
├─→ OSS投递(平台强制要求,附属配置)
│
└─→ 本地CLI定时拉取(核心方案,0元)
│
├─→ /var/log/audit-logs/raw/ 按月目录存储
├─→ SHA256完整性校验(防篡改)
├─→ 权限收紧750(防未授权访问)
└─→ 定期清理过期日志(保留180天)
3.2 整改措施
| 措施 |
说明 |
| 创建ActionTrail跟踪 |
跟踪名称:audit-log-cli,跟踪事件:管控事件 |
| 部署CLI拉取脚本 |
每日凌晨2点自动拉取前一天审计日志至本地 |
| 配置日志清理 |
每周日凌晨3点自动清理超过180天的审计日志 |
| 配置完整性校验 |
每日凌晨4点对前一天日志执行SHA256校验 |
| 权限保护 |
审计日志目录权限750,仅root可访问 |
四、服务器环境
| 项目 |
内容 |
| 运维服务器 |
114.55.33.1(CentOS) |
| ActionTrail区域 |
华东1(杭州) |
| RAM账号 |
songrc(仅授予ActionTrail只读权限) |
| 跟踪地域 |
所有地域 |
五、费用明细
| 项目 |
费用 |
说明 |
| ActionTrail跟踪 |
免费 |
阿里云操作审计基础功能不收费 |
| ActionTrail官方留存 |
免费 |
官方免费保留90天 |
| CLI拉取脚本 |
0元 |
自研脚本,无额外授权费用 |
| 本地磁盘存储 |
0元 |
使用已有服务器磁盘空间 |
| OSS存储(附属) |
约10元/年 |
平台强制要求配置,非核心方案 |
| 核心方案总计 |
0元 |
完全零成本满足等保合规要求 |
| 含附属配置总计 |
约10元/年 |
极低成本 |
六、文件清单
6.1 脚本文件
| 路径 |
说明 |
/opt/scripts/audit-log-pull.sh |
审计日志拉取脚本(每日凌晨2点) |
/opt/scripts/audit-log-cleanup.sh |
过期日志清理脚本(每周日凌晨3点) |
/opt/scripts/audit-log-integrity.sh |
完整性校验脚本(每日凌晨4点) |
6.2 定时任务
| 任务文件 |
执行时间 |
说明 |
/etc/cron.d/audit-log-pull |
0 2 * * * |
每日凌晨2点拉取前一天审计日志 |
/etc/cron.d/audit-log-cleanup |
0 3 * * 0 |
每周日凌晨3点清理超期日志 |
/etc/cron.d/audit-log-integrity |
0 4 * * * |
每日凌晨4点校验前一天日志完整性 |
6.3 数据目录
| 路径 |
说明 |
/var/log/audit-logs/raw/ |
审计日志存储(按月子目录) |
/var/log/audit-logs/query/ |
校验记录存储 |
/var/log/audit-logs/pull.log |
拉取运行日志 |
七、脚本内容
7.1 audit-log-pull.sh
#!/bin/bash
LOG_BASE="/var/log/audit-logs"
RAW_DIR="${LOG_BASE}/raw"
LOG_FILE="${LOG_BASE}/pull.log"
RETENTION_DAYS=180
DATE_YESTERDAY=$(date -d 'yesterday' -u +%Y-%m-%d)
MONTH_DIR="${RAW_DIR}/${DATE_YESTERDAY:0:7}"
mkdir -p "$MONTH_DIR"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
log "===== 开始拉取审计日志: ${DATE_YESTERDAY} ====="
START_TIME=$(date -d "yesterday 00:00:00" -u +%Y-%m-%dT%H:%M:%SZ)
END_TIME=$(date -d "yesterday 23:59:59" -u +%Y-%m-%dT%H:%M:%SZ)
OUTPUT_FILE="${MONTH_DIR}/audit-${DATE_YESTERDAY}.json"
TEMP_FILE=$(mktemp)
TOTAL_EVENTS=0
PAGE=1
NEXT_TOKEN=""
RESPONSE=$(aliyun actiontrail LookupEvents \
--StartTime "$START_TIME" \
--EndTime "$END_TIME" \
--MaxResults 50 \
--NextToken "$NEXT_TOKEN" 2>/dev/null)
EVENT_COUNT=$(echo "$RESPONSE" | python3 -c "
import sys, json
try:
data = json.load(sys.stdin)
print(len(data.get('Events', [])))
except:
print(0)
" 2>/dev/null)
if [ "$EVENT_COUNT" = "0" ]; then
log "警告: ${DATE_YESTERDAY} 无审计事件"
echo "{\"date\":\"${DATE_YESTERDAY}\",\"events\":[],\"total\":0,\"pull_time\":\"$(date -Iseconds)\"}" > "$OUTPUT_FILE"
rm -f "$TEMP_FILE"
log "===== 完成: 0条事件 ====="
exit 0
fi
echo "$RESPONSE" | python3 -c "
import sys, json
data = json.load(sys.stdin)
for e in data.get('Events', []):
print(json.dumps(e, ensure_ascii=False))
print('---NEXT---')
print(data.get('NextToken', ''))
" > "$TEMP_FILE"
TOTAL_EVENTS=$((TOTAL_EVENTS + EVENT_COUNT))
NEXT_TOKEN=$(awk '/---NEXT---/{getline; print}' "$TEMP_FILE")
while [ -n "$NEXT_TOKEN" ] && [ "$NEXT_TOKEN" != "" ]; do
PAGE=$((PAGE + 1))
log "拉取第 ${PAGE} 页..."
RESPONSE=$(aliyun actiontrail LookupEvents \
--StartTime "$START_TIME" \
--EndTime "$END_TIME" \
--MaxResults 50 \
--NextToken "$NEXT_TOKEN" 2>/dev/null)
echo "$RESPONSE" | python3 -c "
import sys, json
data = json.load(sys.stdin)
for e in data.get('Events', []):
print(json.dumps(e, ensure_ascii=False))
print('---NEXT---')
print(data.get('NextToken', ''))
" >> "$TEMP_FILE"
EVENT_COUNT=$(echo "$RESPONSE" | python3 -c "
import sys, json
print(len(json.load(sys.stdin).get('Events', [])))
" 2>/dev/null)
TOTAL_EVENTS=$((TOTAL_EVENTS + EVENT_COUNT))
NEXT_TOKEN=$(awk '/---NEXT---/{getline; print}' "$TEMP_FILE")
sleep 0.5
done
python3 << PYTHON
import json
events = []
with open("$TEMP_FILE", "r") as f:
for line in f:
line = line.strip()
if line and line != "---NEXT---":
try:
events.append(json.loads(line))
except:
pass
output = {
"date": "${DATE_YESTERDAY}",
"pull_time": "$(date -Iseconds)",
"total": len(events),
"retention_days": ${RETENTION_DAYS},
"events": events
}
with open("$OUTPUT_FILE", "w") as f:
json.dump(output, f, ensure_ascii=False, indent=2)
print(f"保存 {len(events)} 条事件到 $OUTPUT_FILE")
PYTHON
rm -f "$TEMP_FILE"
log "===== 完成: ${TOTAL_EVENTS} 条事件 ====="
7.2 audit-log-cleanup.sh
#!/bin/bash
find /var/log/audit-logs/raw -name "audit-*.json" -mtime +180 -delete
find /var/log/audit-logs/raw -type d -empty -delete
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 清理完成" >> /var/log/audit-logs/pull.log
7.3 audit-log-integrity.sh
#!/bin/bash
HASH_FILE="/var/log/audit-logs/query/integrity-hashes.log"
echo "===== 完整性校验 $(date '+%Y-%m-%d %H:%M:%S') =====" >> "$HASH_FILE"
find /var/log/audit-logs/raw -name "audit-*.json" -mtime -1 -exec sha256sum {} \; >> "$HASH_FILE"
八、等保控制点覆盖对照
| 等保要求 |
整改措施 |
覆盖状态 |
| 审计记录留存时间大于6个月 |
CLI每日拉取+180天保留周期 |
已覆盖 |
| 对审计记录进行定期备份 |
本地服务器定时归档 |
已覆盖 |
| 避免受到未预期的删除 |
权限750仅root可访问 |
已覆盖 |
| 避免受到未预期的修改 |
SHA256完整性校验+校验日志留存 |
已覆盖 |
| 避免受到未预期的覆盖 |
按日期+月份子目录存储,不覆盖写入 |
已覆盖 |
九、整改表格填写
| 字段 |
内容 |
| 整改情况截图 |
已部署阿里云操作审计(ActionTrail),创建跟踪audit-log-cli,覆盖所有地域管控事件。通过阿里云CLI定时拉取审计日志至本地服务器/var/log/audit-logs/,设置180天保留周期,配置SHA256完整性校验防篡改,目录权限750仅root可访问,定期清理过期日志。审计记录留存时间满足6个月以上要求,具备防删除、防修改、防覆盖能力。 |
| 备注 |
采用CLI拉取+本地存储方案,零成本。审计日志留存机制已于2026年6月3日部署完成,每日自动累积。 |
十、方案适用场景
10.1 适用场景
- 预算为零:无需为审计日志存储支付任何云服务费用
- 小型云环境:服务器数量较少,审计日志量可控
- 已有运维服务器:可直接在现有CentOS服务器上部署脚本
- 等保二级/三级整改:需要满足审计记录留存6个月以上的基本要求
10.2 不适用场景
- 大型企业、多账号多区域:日志量大,建议使用SLS方案统一管理
- 需要实时告警:本方案为每日定时拉取,不具备实时监控能力
- 服务器磁盘空间紧张:本地存储需要预留足够磁盘空间
十一、后续维护
| 维护项 |
频率 |
操作 |
| 检查拉取日志 |
每日 |
查看 pull.log 确认拉取正常 |
| 检查校验记录 |
每周 |
查看 integrity-hashes.log |
| 监控磁盘空间 |
每月 |
检查 /var/log/audit-logs/ 目录大小 |
| 轮转AccessKey |
每3个月 |
删除旧AK,创建新AK,执行 aliyun configure 更新 |
十二、操作时间线
| 时间 |
操作 |
| 2026-06-03 |
创建RAM账号songrc,授权ActionTrail只读权限 |
| 2026-06-03 |
创建ActionTrail跟踪audit-log-cli |
| 2026-06-03 |
服务器安装阿里云CLI v3.3.19并配置认证 |
| 2026-06-03 |
部署拉取/清理/校验脚本及定时任务 |
| 2026-06-03 |
全部验证通过,整改完成 |