等保整改 — 安全审计(操作审计)整改报告


一、问题描述

项目 内容
控制点 安全审计
要求项 对审计记录进行保护,定期备份,避免受到未预期的删除、修改或覆盖等
风险级别
问题描述 云平台的操作审计未创建跟踪,仅能留存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 全部验证通过,整改完成