关于 alibabacloud-dsc-audit
这是通过 Alibaba Cloud Python SDK 查询并处理 Data Security Center 安全风险事件的 Skill,面向安全与云运维人员。它支持分页查询风险事件,并在确认具体事件和处理说明后提交处理操作。
主要功能
- 01分页查询安全风险事件
- 02查看风险等级与受影响资产
- 03按指定 RiskId 处理事件
- 04要求提供处理说明作为审计记录
适用场景
- 01检索未处理的安全风险事件
- 02核查事件等级、资产和告警数量
- 03确认目标事件后记录处理结果
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ aliyun/ alibabacloud-aiops-skills --skill alibabacloud-dsc-audit安装后在 Claude Code 中输入/alibabacloud-dsc-audit确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/acceptance-criteria.mdcli-installation-guide.mdram-policies.mdrelated-apis.mdscripts/handle_risk.pyquery_risk.pyrequirements.txt详细介绍
阿里云数据安全中心风险事件查询与处理
此技能使用阿里云 Python Common SDK(通用调用)从数据安全中心查询并处理安全风险事件。
架构
User → Python Common SDK → Data Security Center (Sddp) API
├── DescribeRiskRules (Query risk events)
└── PreHandleAuditRisk (Handle risk events)
前置条件
重要:执行此技能中的任何脚本前,必须确认以下前置条件均已满足。
| # | 前置条件 | 检查命令 | 要求 |
|---|---|---|---|
| 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_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 调用都必须附加以下确切标志:
--user-agent "AlibabaCloud-Agent-Skills/alibabacloud-dsc-audit/${SKILL_SESSION_ID}"
Python SDK 脚本会从环境中读取相同的会话 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 标志和 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检查凭证状态aliyun configure list检查输出中是否存在有效配置(AK、STS 或 OAuth 身份)。
如果不存在有效配置,请立即停止。
- 从阿里云控制台获取凭证
- 在此会话之外配置凭证(在终端中运行
aliyun configure,或在 shell 配置文件中设置环境变量)- 等
aliyun configure list显示有效配置后,返回并重新运行
RAM 权限
使用此技能前,请确保当前用户拥有所需的 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 条记录。
[MUST] 只能通过捆绑脚本执行查询。 所有查询都必须通过 scripts/query_risk.py 执行。不得编写临时或自定义查询脚本——包括从 query_risk.py 导入函数的脚本;也不得使用内联 SDK 代码片段或 Aliyun CLI 调用进行查询。要翻页,请针对每一页重新运行捆绑脚本,并使用可选参数 CurrentPage 和 PageSize,直到检索完所有页面。
python3 scripts/query_risk.py # Page 1, 20 records per page (default)
python3 scripts/query_risk.py 2 20 # Page 2, 20 records per page
python3 scripts/query_risk.py 1 20 PROCESSED # Query processed events
[MUST] 在最终答复中汇总分页结果。 完成分页查询后,最终答复必须引用以下句子模板,逐字照录并填入实际数字:
"Query complete: all N pages were retrieved; TotalCount is X unprocessed risk events."
此确切句子可确保包含必需关键词:all、pages 和 TotalCount。不得将此摘要改写成其他措辞。不得省略页数或总数。
输出示例:
Found 31 unprocessed security risk events
================================================================================
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。不要改述此请求(例如“请描述你如何处理”),因为改述可能会遗漏必需的关键词。 - “处理它”“将其标记为已处理”“已确认”“无需跟进”或“关闭它”等含糊的处理意图,均不是有效的
HandleDetail,除非用户明确表示应将该确切文本记录下来。 - 不要编造、总结、复用或默认处理说明。
-
预先验证 RiskId 格式
- 如果
RiskId包含负号、字母、shell 元字符、以空格分隔的多个标记或任何非数字字符,请在运行任何脚本或 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 进行评估、校验或共享账户测试。该标志可以放在两个位置参数之前或之后。试运行仍会执行本地校验,并确认 RiskId 当前位于 UNPROCESSED 列表中,但绝不会调用 PreHandleAuditRisk,也不会更改风险状态。
python3 scripts/handle_risk.py --dry-run <RiskID> <HandleDetail>
python3 scripts/handle_risk.py <RiskID> <HandleDetail> --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,并确认状态已更改
清理
查询和试运行无需清理云资源。成功执行的线上处理调用会将风险状态从 UNPROCESSED 持久更改为 PROCESSED;此技能无法自动恢复该状态。
API 和命令参考
| 产品 | API 操作 | 脚本 | 描述 |
|---|---|---|---|
| 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> | 需要风险 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 | 验收标准 |
| 通用调用文档 | Alibaba Cloud Python SDK 通用调用文档 |
重要说明
Warning:此技能仅使用数据安全中心的
DescribeRiskRules和PreHandleAuditRiskAPI。 如果找不到这两个 API,请报告错误。未经授权,请勿调用其他 OpenAPI。 请勿使用 Alibaba Cloud CLI 工具调用 API。