阿里云数据安全中心风险事件查询与处置
本 Skill 使用阿里云 Python 通用 SDK(泛化调用)查询数据安全中心的安全风险事件并进行处置。
架构
用户 → Python 通用 SDK → 数据安全中心(Sddp)API
├── DescribeRiskRules(查询风险事件)
└── PreHandleAuditRisk(处置风险事件)
前置条件
重要:执行本 Skill 中任何脚本之前,必须验证以下前置条件。
| # | 前置条件 | 检查命令 | 要求 |
|---|---|---|---|
| 1 | Python 3 | python3 --version | >= 3.6 |
| 2 | pip3 | pip3 --version | 任意 |
| 3 | 阿里云 Python SDK | python3 -c "import alibabacloud_tea_openapi" | 退出码 0 = 已安装 |
安装 Python SDK 依赖
如果前置条件 #3 检查失败(ModuleNotFoundError),安装依赖:
pip3 install -r scripts/requirements.txt
所需包(scripts/requirements.txt):
alibabacloud_tea_openapi==0.4.3alibabacloud_credentials==1.0.8alibabacloud_tea_util==0.3.14alibabacloud_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 configure、aliyun plugin、aliyun help、aliyun version、aliyun upgrade 和 aliyun --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 调用进行查询。分页时,用可选的 CurrentPage 和 PageSize 参数每次重跑打包脚本一页,直到检索完所有页。
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 个未处理风险事件。”
这个确切的句子保证所需关键词:all、pages 和 TotalCount。不要将此总结改写成其他措辞。不要省略页数或总数。
示例输出:
发现 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:处置安全风险事件
处置是门控操作。运行任何处置命令之前,按顺序完成以下检查。
- 确认目标 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。
- 确认 HandleDetail
HandleDetail是必需的审计证据。如果用户未提供要记录的确切文本作为 HandleDetail,停止并索要一个。- 询问时,最终回答必须逐字引用以下句子:“Please provide the exact text to record as HandleDetail.” 这个确切的句子保证所需关键词:
provide、exact text和HandleDetail。不要改写此请求(例如“请描述您如何处理”),因为改写可能丢失所需关键词。 - 模糊的处置意图如“handle it”、“mark it as handled”、“already confirmed”、“no need to follow up”或“close it”不是有效的
HandleDetail,除非用户明确表示应记录该确切文本。 - 不要编造、总结、复用或默认处置描述。
- 预校验 RiskId 格式
- 如果
RiskId包含负号、字母、shell 元字符、空白分隔的 token 或任何非数字字符,在运行任何脚本或 API 调用之前拒绝它。 - 拒绝时,最终回答必须逐字引用以下句子:“Invalid RiskId: it must be a positive integer. Please provide a valid RiskId.” 这个确切的句子保证所需关键词:
Invalid RiskId、positive integer和valid 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。
- 预校验 HandleDetail 安全性
- 如果
HandleDetail包含 shell 命令指示符、SQL 注入指示符、与可执行文本一起使用的命令分隔符、注释标记、命令替换、管道或重定向,在执行前拒绝它。 - 请用户将处置描述改写为正常审计文本。
- 对于明确请求的
--dry-run校验预演,不安全文本只能作为一个带引号的参数传给打包的scripts/handle_risk.py;其本地校验器必须在任何云查找或变更 API 调用之前拒绝输入。
- 仅通过打包脚本执行
- 所有处置必须通过
scripts/handle_risk.py。 - 不要编写临时脚本、内联 SDK 片段、Aliyun CLI 调用或直接 OpenAPI 调用来绕过校验。
- 当用户明确请求处置并已提供
RiskId和HandleDetail时,你必须实际执行带这些参数的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 handleable、RiskId、unprocessed list和processed。不要将此结论改写成其他措辞,因为改写可能丢失所需关键词。 - 报告未找到错误后,使用脚本打印的当前未处理风险列表,向用户展示可用的
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请求编码。
成功验证
验证查询操作
- 执行查询代码后,检查返回的
statusCode是否为200 - 检查返回的
body是否包含Items列表 - 验证
TotalCount与实际返回记录数是否一致
验证处置操作
- 执行处置代码后,检查返回的
statusCode是否为200 - 再次调用
DescribeRiskRules查询该RiskId,确认状态已变更
清理
查询和 dry-run 预演不需要云清理。成功的实际处置调用会将风险从 UNPROCESSED 持久变为 PROCESSED;本 Skill 无法自动恢复该状态。
API 与命令参考
| 产品 | API Action | 脚本 | 说明 |
|---|---|---|---|
| Sddp | DescribeRiskRules | scripts/query_risk.py | 查询安全风险事件 |
| Sddp | PreHandleAuditRisk | scripts/handle_risk.py | 处置安全风险事件 |
脚本用法
| 脚本 | 用法 | 说明 |
|---|---|---|
query_risk.py | python3 scripts/query_risk.py [CurrentPage] [PageSize] [HandleStatus] | 可选分页和状态参数;默认第 1 页、20 条、UNPROCESSED |
handle_risk.py | python3 scripts/handle_risk.py [--dry-run] <RiskID> <HandleDetail> | 需要 Risk ID 和处置描述;--dry-run 防止变更 |
详细 API 信息参见 references/related-apis.md
最佳实践
- 分页查询:要检索所有记录,用递增的
CurrentPage参数重跑scripts/query_risk.py直到检索完所有页 - 记录 RiskId:查询结果中的
RiskId是处置操作的必填参数,务必记录 - 处置描述:处置时提供清晰的
HandleDetail描述以便后续审计 - 错误处理:对
Throttling等临时错误实现重试机制 - 凭证安全:使用
CredentialClient管理凭证,不要硬编码 AK/SK
参考链接
| 参考文档 | 说明 |
|---|---|
| references/related-apis.md | API 详细文档 |
| references/ram-policies.md | RAM 权限配置 |
| references/cli-installation-guide.md | CLI 安装指南 |
| references/acceptance-criteria.md | 验收标准 |
| 通用调用文档 | 阿里云 Python SDK 通用调用文档 |
重要说明
警告:本 Skill 仅使用数据安全中心的DescribeRiskRules和PreHandleAuditRiskAPI。
如果找不到这两个 API,报告错误。未经授权不要调用其他 OpenAPI。
不要使用阿里云 CLI 工具调用 API。
阿里云skills
◯ 评论 0