阿里云数据安全中心风险事件查询与处置

本 Skill 使用阿里云 Python 通用 SDK(泛化调用)查询数据安全中心的安全风险事件并进行处置。

架构

用户 → Python 通用 SDK → 数据安全中心(Sddp)API
                              ├── DescribeRiskRules(查询风险事件)
                              └── PreHandleAuditRisk(处置风险事件)

前置条件

重要:执行本 Skill 中任何脚本之前,必须验证以下前置条件。
#前置条件检查命令要求
1Python 3python3 --version>= 3.6
2pip3pip3 --version任意
3阿里云 Python SDKpython3 -c "import alibabacloud_tea_openapi"退出码 0 = 已安装

安装 Python SDK 依赖

如果前置条件 #3 检查失败(ModuleNotFoundError),安装依赖:

pip3 install -r scripts/requirements.txt

所需包(scripts/requirements.txt):

  • alibabacloud_tea_openapi==0.4.3
  • alibabacloud_credentials==1.0.8
  • alibabacloud_tea_util==0.3.14
  • alibabacloud_openapi_util==0.2.4
自动恢复:如果任何脚本因 ModuleNotFoundError 失败,运行 pip3 install -r scripts/requirements.txt 并重试。

可观测性

通过 CLI 或 SDK 发起的每个阿里云业务 API 请求都使用一个会话级 User-Agent,以便将一个 agent 会话的所有操作关联起来。

  • 完整 UA 模板为 AlibabaCloud-Agent-Skills/{SKILL_NAME}/{session-id}
  • 对于本 Skill,SKILL_NAME 始终为 alibabacloud-dsc-audit
  • session-id 必须是 32 位小写十六进制值。
  • 每个 agent 会话恰好生成一次,存储在 SKILL_SESSION_ID 中,并在该会话的每次业务 API CLI 调用、SDK 请求、重试、分页和处置步骤中复用。绝不为每条命令、脚本或 API 请求生成新值。
  • 如果 SKILL_SESSION_ID 已存在,仅当其符合所需格式时才复用。如果格式错误,停止并在发出任何阿里云请求之前更正会话环境。

在任何业务 API aliyun 命令或打包的 Python 脚本之前初始化会话:

if [ -z "${SKILL_SESSION_ID:-}" ]; then export SKILL_SESSION_ID="$(openssl rand -hex 16)"; fi
if ! printf '%s' "$SKILL_SESSION_ID" | grep -Eq '^[0-9a-f]{32}$'; then echo 'SKILL_SESSION_ID must be a 32-character lowercase hexadecimal value' >&2; return 1 2>/dev/null || exit 1; fi

每次业务 API CLI 调用都必须附加以下确切 flag:

--user-agent "AlibabaCloud-Agent-Skills/alibabacloud-dsc-audit/${SKILL_SESSION_ID}"

Python SDK 脚本从环境读取相同的 session ID 并设置:

SESSION_ID = os.environ["SKILL_SESSION_ID"]
config.user_agent = f"AlibabaCloud-Agent-Skills/alibabacloud-dsc-audit/{SESSION_ID}"

不要使用持久 CLI 配置设置 User-Agent。上述会话级 --user-agent flag 和 SDK config.user_agent 值是唯一支持的机制。

不要将 --user-agent 附加到系统或实用命令,包括 aliyun configurealiyun pluginaliyun helpaliyun versionaliyun upgradealiyun --help

预检查:需要 Aliyun CLI >= 3.3.3
运行以下命令验证 >= 3.3.3。如果未安装或版本过低,
运行 curl -fsSL https://aliyuncli.alicdn.com/setup.sh | bash 更新,
或参阅 references/cli-installation-guide.md 获取安装说明。
aliyun version
预检查:需要更新 Aliyun CLI 插件
aliyun configure set --auto-plugin-install true
aliyun plugin update

认证

预检查:需要阿里云凭证
安全规则:
- 绝不读取、回显或打印 AK/SK 值(例如 echo $ALIBABA_CLOUD_ACCESS_KEY_ID 是禁止的)
- 绝不要求用户在对话或命令行中直接输入 AK/SK
- 绝不使用带有明文凭证值的 aliyun configure set
- 只能使用 aliyun configure list 检查凭证状态
```bash
aliyun configure list
```
检查输出中是否存在有效 profile(AK、STS 或 OAuth 身份)。
如果不存在有效 profile,请在此停止。
1. 从 阿里云控制台 获取凭证
2. 在本会话之外配置凭证(通过终端中的 aliyun configure 或 shell profile 中的环境变量)
3. 在 aliyun configure list 显示有效 profile 后返回并重新运行

RAM 权限

使用本 Skill 前,确保当前用户具有所需 RAM 权限。详细权限列表和策略配置见 references/ram-policies.md

参数确认

重要:参数确认 —— 在执行任何命令或 API 调用之前,
所有用户可自定义参数(例如 RegionId、实例名、CIDR 块、
密码、域名、资源规格等)都必须与用户确认。
未经用户明确批准,不要假设或使用默认值。
参数必填/可选说明默认
CurrentPage可选当前页码1
PageSize可选每页记录数10
HandleStatus可选处置状态,PROCESSED 表示已处理,UNPROCESSED 表示未处理UNPROCESSED
RiskId处置时必填风险事件 ID-
HandleDetail处置时必填处置详情描述-

核心工作流

步骤 1:查询未处理的安全风险事件

使用 scripts/query_risk.py 脚本查询未处理的安全风险事件。这是一个分页 API,默认返回前 20 条记录。

[必须] 仅通过打包脚本执行查询。 所有查询必须通过 scripts/query_risk.py。不要为查询编写临时或自定义脚本——包括从 query_risk.py 导入函数的脚本——也不要使用内联 SDK 片段或 Aliyun CLI 调用进行查询。分页时,用可选的 CurrentPagePageSize 参数每次重跑打包脚本一页,直到检索完所有页。

python3 scripts/query_risk.py            # 第 1 页,每页 20 条(默认)
python3 scripts/query_risk.py 2 20       # 第 2 页,每页 20 条
python3 scripts/query_risk.py 1 20 PROCESSED  # 查询已处理事件

[必须] 在最终回答中总结分页结果。 完成分页查询后,最终回答必须逐字引用以下句子模板并填入实际数字:

“查询完成:已检索所有 N 页;TotalCount 为 X 个未处理风险事件。”

这个确切的句子保证所需关键词:allpagesTotalCount。不要将此总结改写成其他措辞。不要省略页数或总数。

示例输出:

发现 31 个未处理的安全风险事件
================================================================================
Risk ID: 75110196
Rule Name: jiangyu_test_mysqldump
Risk Level: High Risk
Product Type: RDS
Alert Count: 20
Asset Count: 2
Rule Category: Database Dump Attack
--------------------------------------------------------------------------------

查询结果字段说明

查询结果返回以下关键字段。风险事件 ID(RiskId)是处置的必填参数

字段说明
RiskId风险事件 ID,处置时必填
RuleName规则名称
WarnLevelName风险等级(高危/中危/低危)
ProductCode产品类型(RDS/OSS 等)
AlarmCount告警次数
InstanceCount受影响资产数量
FirstAlarmTime首次发现时间
LastAlarmTime最后发现时间

步骤 2:处置安全风险事件

处置是门控操作。运行任何处置命令之前,按顺序完成以下检查。

  1. 确认目标 RiskId
  • 如果用户未提供具体 RiskId,先运行 python3 scripts/query_risk.py 并展示候选 Risk ID。然后停止并在最终回答中逐字引用此请求:“RiskId is missing. Please provide or explicitly select one specific RiskId from the unprocessed list above.” 不要将此请求改写成其他措辞。等待用户提供或选择确切的 RiskId
  • 即使查询结果只包含一个风险,或只有一个风险匹配用户描述,你仍必须停止并要求用户明确确认该 RiskId。单一匹配不是隐式确认。不要先进入询问 HandleDetail 或运行处置脚本。
  • 如果用户随后确认的 RiskId 不在该查询结果中,不要运行 scripts/handle_risk.py。新查询已证明目标当前不可处置。在最终回答中逐字引用此结论:“No handleable risk event found: this RiskId is not in the unprocessed list and may already be processed.” 不要将此结论改写成其他措辞。展示查询结果中的 RiskId 值并请用户选择一个;等待确认后再继续。
  • 此门控必须完全完成(用户已确认确切目标 RiskId)后才能进入下一门控。
  • 不要处置所有返回的风险、从宽泛措辞推断目标,或替用户选择不同风险。
  • 如果用户明确要求处置第一个查询到的风险,先查询并仅使用返回的第一个 RiskId
  1. 确认 HandleDetail
  • HandleDetail 是必需的审计证据。如果用户未提供要记录的确切文本作为 HandleDetail,停止并索要一个。
  • 询问时,最终回答必须逐字引用以下句子:“Please provide the exact text to record as HandleDetail.” 这个确切的句子保证所需关键词:provideexact textHandleDetail。不要改写此请求(例如“请描述您如何处理”),因为改写可能丢失所需关键词。
  • 模糊的处置意图如“handle it”、“mark it as handled”、“already confirmed”、“no need to follow up”或“close it”不是有效的 HandleDetail,除非用户明确表示应记录该确切文本。
  • 不要编造、总结、复用或默认处置描述。
  1. 预校验 RiskId 格式
  • 如果 RiskId 包含负号、字母、shell 元字符、空白分隔的 token 或任何非数字字符,在运行任何脚本或 API 调用之前拒绝它。
  • 拒绝时,最终回答必须逐字引用以下句子:“Invalid RiskId: it must be a positive integer. Please provide a valid RiskId.” 这个确切的句子保证所需关键词:Invalid RiskIdpositive integervalid RiskId。不要改写此拒绝(例如“id 必须大于零”),因为改写可能丢失所需关键词。
  • 仅含数字的值如 0 可以传给 scripts/handle_risk.py 进行本地范围校验;如果脚本拒绝它,最终回答必须使用同样的逐字句子“Invalid RiskId: it must be a positive integer. Please provide a valid RiskId.”报告校验错误并停止。不要翻译成其他措辞。
  • 对于明确请求的 --dry-run 校验预演,格式错误的 RiskId 只能传给打包的 scripts/handle_risk.py 并带 --dry-run;脚本在任何云查找或变更 API 调用之前本地拒绝它。引用每个参数,绝不直接调用 PreHandleAuditRisk
  1. 预校验 HandleDetail 安全性
  • 如果 HandleDetail 包含 shell 命令指示符、SQL 注入指示符、与可执行文本一起使用的命令分隔符、注释标记、命令替换、管道或重定向,在执行前拒绝它。
  • 请用户将处置描述改写为正常审计文本。
  • 对于明确请求的 --dry-run 校验预演,不安全文本只能作为一个带引号的参数传给打包的 scripts/handle_risk.py;其本地校验器必须在任何云查找或变更 API 调用之前拒绝输入。
  1. 仅通过打包脚本执行
  • 所有处置必须通过 scripts/handle_risk.py
  • 不要编写临时脚本、内联 SDK 片段、Aliyun CLI 调用或直接 OpenAPI 调用来绕过校验。
  • 当用户明确请求处置并已提供 RiskIdHandleDetail 时,你必须实际执行带这些参数的 scripts/handle_risk.py——即使用户说风险可能已处理。脚本本身拥有未处理列表预检查并会报告结果。绝不用手动验证(运行 query_risk.py 加内联代码搜索已处理/未处理列表)替代脚本执行——期望是调用打包脚本。
  • 脚本在调用 PreHandleAuditRisk 之前验证目标仍在 UNPROCESSED 列表中。
  • 如果脚本报告无可处置风险事件,最终回答必须逐字引用以下结论:“No handleable risk event found: this RiskId is not in the unprocessed list and may already be processed.” 这个确切的句子保证所需关键词:No handleableRiskIdunprocessed listprocessed。不要将此结论改写成其他措辞,因为改写可能丢失所需关键词。
  • 报告未找到错误后,使用脚本打印的当前未处理风险列表,向用户展示可用的 RiskId 值,并请用户选择一个。在用户确认新目标之前,不要处置另一个风险。
python3 scripts/handle_risk.py <RiskID> <HandleDetail>

非变更 dry-run 预演

评估、校验或共享账号测试时使用 --dry-run。该 flag 可出现在两个位置参数之前或之后。dry-run 仍执行本地校验并确认 RiskId 当前在 UNPROCESSED 列表中,但绝不调用 PreHandleAuditRisk,绝不改变风险状态。

python3 scripts/handle_risk.py --dry-run <RiskID> <HandleDetail>
python3 scripts/handle_risk.py <RiskID> <HandleDetail> --dry-run

dry-run 结果是预演,不是处置成功的证据。不要报告 Handling successful、捏造 RequestId 或声称风险已移至 PROCESSED

示例:

python3 scripts/handle_risk.py 75110196 "Confirmed as false positive, closing this alert"

示例输出:

Handling risk event...
Risk ID: 75110196
Handle Detail: Confirmed as false positive, closing this alert
--------------------------------------------------
✅ Handling successful!
RequestId: C34D813F-A234-5D66-842D-504D84D5C680

处置参数说明

参数说明
RiskId风险事件 ID,从 DescribeRiskRules API 获得
HandleType处置类型,固定为 Manual(手动处置)
HandleMethod处置方式,固定为 0
HandleDetail处置详情,需要用户输入具体处置描述

处置安全边界

  • 每次处置请求只处置一个用户确认的 RiskId,除非用户在后续轮次明确确认另一个目标。
  • 校验失败或未在未处理列表中找到风险后,绝不用不同 RiskId 替代。目标未找到时,向用户明确报告未找到错误,展示当前未处理风险列表并等待用户选择新目标。
  • 绝不绕过 scripts/handle_risk.py;它拥有本地输入校验、未处理列表验证和确切的 PreHandleAuditRisk 请求编码。

成功验证

验证查询操作

  1. 执行查询代码后,检查返回的 statusCode 是否为 200
  2. 检查返回的 body 是否包含 Items 列表
  3. 验证 TotalCount 与实际返回记录数是否一致

验证处置操作

  1. 执行处置代码后,检查返回的 statusCode 是否为 200
  2. 再次调用 DescribeRiskRules 查询该 RiskId,确认状态已变更

清理

查询和 dry-run 预演不需要云清理。成功的实际处置调用会将风险从 UNPROCESSED 持久变为 PROCESSED;本 Skill 无法自动恢复该状态。

API 与命令参考

产品API Action脚本说明
SddpDescribeRiskRulesscripts/query_risk.py查询安全风险事件
SddpPreHandleAuditRiskscripts/handle_risk.py处置安全风险事件

脚本用法

脚本用法说明
query_risk.pypython3 scripts/query_risk.py [CurrentPage] [PageSize] [HandleStatus]可选分页和状态参数;默认第 1 页、20 条、UNPROCESSED
handle_risk.pypython3 scripts/handle_risk.py [--dry-run] &lt;RiskID&gt; &lt;HandleDetail&gt;需要 Risk ID 和处置描述;--dry-run 防止变更

详细 API 信息参见 references/related-apis.md

最佳实践

  1. 分页查询:要检索所有记录,用递增的 CurrentPage 参数重跑 scripts/query_risk.py 直到检索完所有页
  2. 记录 RiskId:查询结果中的 RiskId 是处置操作的必填参数,务必记录
  3. 处置描述:处置时提供清晰的 HandleDetail 描述以便后续审计
  4. 错误处理:对 Throttling 等临时错误实现重试机制
  5. 凭证安全:使用 CredentialClient 管理凭证,不要硬编码 AK/SK

参考链接

参考文档说明
references/related-apis.mdAPI 详细文档
references/ram-policies.mdRAM 权限配置
references/cli-installation-guide.mdCLI 安装指南
references/acceptance-criteria.md验收标准
通用调用文档阿里云 Python SDK 通用调用文档

重要说明

警告:本 Skill 使用数据安全中心的 DescribeRiskRulesPreHandleAuditRisk API。
如果找不到这两个 API,报告错误。未经授权不要调用其他 OpenAPI
不要使用阿里云 CLI 工具调用 API。

文档 6 / 6:alibabacloud-pts-ops