mcpField
A
alibabacloud-dsc-audit

alibabacloud-dsc-audit

github.com/aliyun安全281144 次安装1 天前更新
代码仓库

关于 alibabacloud-dsc-audit

这是通过 Alibaba Cloud Python SDK 查询并处理 Data Security Center 安全风险事件的 Skill,面向安全与云运维人员。它支持分页查询风险事件,并在确认具体事件和处理说明后提交处理操作。

主要功能

  1. 01分页查询安全风险事件
  2. 02查看风险等级与受影响资产
  3. 03按指定 RiskId 处理事件
  4. 04要求提供处理说明作为审计记录

适用场景

  1. 01检索未处理的安全风险事件
  2. 02核查事件等级、资产和告警数量
  3. 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.md
cli-installation-guide.md
ram-policies.md
related-apis.md
scripts/
handle_risk.py
query_risk.py
requirements.txt

详细介绍

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

此技能使用阿里云 Python Common SDK(通用调用)从数据安全中心查询并处理安全风险事件。

架构

User → Python Common SDK → Data Security Center (Sddp) API
                              ├── DescribeRiskRules (Query risk events)
                              └── PreHandleAuditRisk (Handle risk events)

前置条件

重要:执行此技能中的任何脚本前,必须确认以下前置条件均已满足。

#前置条件检查命令要求
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_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 身份)。

如果不存在有效配置,请立即停止。

  1. 从阿里云控制台获取凭证
  2. 在此会话之外配置凭证(在终端中运行 aliyun configure,或在 shell 配置文件中设置环境变量)
  3. 等 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:处理安全风险事件

处理操作需要经过检查。运行任何处理命令前,请按顺序完成以下检查。

  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。
  2. 确认 HandleDetail

    • HandleDetail 是必需的审计证据。如果用户未提供要作为 HandleDetail 记录的确切文本,请停止并要求用户提供。
    • 提问时,最终答复必须逐字引用以下句子:“Please provide the exact text to record as HandleDetail.”此确切句子包含必需的关键词:provide、exact text 和 HandleDetail。不要改述此请求(例如“请描述你如何处理”),因为改述可能会遗漏必需的关键词。
    • “处理它”“将其标记为已处理”“已确认”“无需跟进”或“关闭它”等含糊的处理意图,均不是有效的 HandleDetail,除非用户明确表示应将该确切文本记录下来。
    • 不要编造、总结、复用或默认处理说明。
  3. 预先验证 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。
  4. 预先校验 HandleDetail 的安全性

    • 如果 HandleDetail 包含 Shell 命令指示符、SQL 注入指示符、与可执行文本搭配使用的命令分隔符、注释标记、命令替换、管道或重定向,则在执行前拒绝处理。
    • 要求用户将处理说明改写为普通审计文本。
    • 对于用户明确要求的 --dry-run 验证演练,可以将不安全文本作为单个带引号的参数,仅传递给随附的 scripts/handle_risk.py;其本地校验器必须在任何云端查询或变更 API 调用前拒绝该输入。
  5. 仅通过随附脚本执行

    • 所有处理都必须通过 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 请求。

成功验证

验证查询操作
  1. 执行查询代码后,检查返回的 statusCode 是否为 200
  2. 检查返回的 body 是否包含 Items 列表
  3. 验证 TotalCount 是否与实际返回的记录数一致
验证处理操作
  1. 执行处理代码后,检查返回的 statusCode 是否为 200
  2. 再次调用 DescribeRiskRules 查询 RiskId,并确认状态已更改

清理

查询和试运行无需清理云资源。成功执行的线上处理调用会将风险状态从 UNPROCESSED 持久更改为 PROCESSED;此技能无法自动恢复该状态。

API 和命令参考

产品API 操作脚本描述
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] <RiskID> <HandleDetail>需要风险 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验收标准
通用调用文档Alibaba Cloud Python SDK 通用调用文档

重要说明

Warning:此技能仅使用数据安全中心的 DescribeRiskRules 和 PreHandleAuditRisk API。 如果找不到这两个 API,请报告错误。未经授权,请勿调用其他 OpenAPI。 请勿使用 Alibaba Cloud CLI 工具调用 API。

评论

支持 Markdown