alibabacloud-dsc-audit について
Alibaba Cloud Python SDKを通じて、Alibaba Cloud Data Security Centerのリスクイベントを照会・処理するスキルです。セキュリティ担当者やクラウド運用担当者向けに、ページ単位の検索を提供し、イベント処理には対象と記録内容の確認を求めます。
主な機能
- 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詳細
Alibaba Cloud Data Security Center のリスクイベントのクエリと処理
このスキルでは、Alibaba Cloud Python Common SDK(汎用呼び出し)を使用して、Data Security Center からセキュリティリスクイベントを照会し、処理します。
アーキテクチャ
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 | Alibaba Cloud 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 経由で行うすべての Alibaba Cloud ビジネス API リクエストで、セッション単位の User-Agent を共通して使用してください。これにより、1 つのエージェントセッションから行われたすべての操作を関連付けられます。
- User-Agent の完全なテンプレートは
AlibabaCloud-Agent-Skills/{SKILL_NAME}/{session-id}です。 - このスキルでは、
SKILL_NAMEは常にalibabacloud-dsc-auditです。 session-idは 32 文字の小文字の 16 進数値である必要があります。- エージェントセッションごとに一度だけ生成し、
SKILL_SESSION_IDに保存して、そのセッション内のすべてのビジネス API の CLI 呼び出し、SDK リクエスト、再試行、ページ、および処理ステップで再利用してください。コマンド、スクリプト、API リクエストごとに新しい値を生成しないでください。 SKILL_SESSION_IDがすでに存在する場合は、必要な形式に一致するときに限り再利用してください。形式が正しくない場合は、Alibaba Cloud へのリクエストを行う前に停止し、セッション環境を修正してください。
ビジネス 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}"
User-Agent の設定に永続的な CLI 設定を使用しないでください。サポートされている方法は、セッション単位の --user-agent フラグと、上記の SDK の config.user_agent 値のみです。
aliyun configure、aliyun plugin、aliyun help、aliyun version、aliyun upgrade、aliyun --help などのシステムコマンドまたはユーティリティコマンドには、--user-agent を付けないでください。
事前確認: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
認証
事前確認:Alibaba Cloud の認証情報が必要です
セキュリティルール:
- AK/SK の値を読み取ったり、エコーしたり、出力したりすることは絶対にしないでください(例:
echo $ALIBABA_CLOUD_ACCESS_KEY_IDは禁止されています)。- ユーザーに会話やコマンドラインで AK/SK を直接入力するよう絶対に求めないでください。
- リテラルの認証情報を指定して
aliyun configure setを使用することは絶対にしないでください。- 認証情報の状態確認には
aliyun configure listのみを使用してください。aliyun configure list出力を確認し、有効なプロファイル(AK、STS、または OAuth ID)があることを確かめてください。
有効なプロファイルがない場合は、ここで停止してください。
- Alibaba Cloud Console から認証情報を取得します。
- このセッションの外部で認証情報を設定します(ターミナルで
aliyun configureを使用するか、シェルプロファイルで環境変数を設定します)。aliyun configure listに有効なプロファイルが表示された後、戻って再実行します。
RAM 権限
このスキルを使用する前に、現在のユーザーが必要な RAM 権限を持っていることを確認してください。詳細な権限一覧とポリシー設定については、references/ram-policies.md を参照してください。
パラメーターの確認
重要:パラメーターの確認 — コマンドまたは API 呼び出しを実行する前に、 ユーザーがカスタマイズできるすべてのパラメーター(例:RegionId、インスタンス名、CIDR ブロック、 パスワード、ドメイン名、リソース仕様など)をユーザーに確認する必要があります。 明示的な承認なしに、デフォルト値を推測したり使用したりしないでください。
| パラメーター | 必須/任意 | 説明 | デフォルト |
|---|---|---|---|
CurrentPage | 任意 | 現在のページ番号 | 1 |
PageSize | 任意 | 1 ページあたりのレコード数 | 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 # 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
[必須]最終回答でページネーション結果を要約してください。 ページネーションを伴う照会を完了したら、最終回答には次の文のテンプレートをそのまま引用し、実際の数値を入力する必要があります。
"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を提示または選択するまで待ってください。 - クエリ結果にリスクが1件しかない場合や、ユーザーの説明に一致するリスクが1件しかない場合でも、必ず処理を止め、ユーザーに
RiskIdを明示的に確認してください。一致が1件だけでも、暗黙の確認とは見なせません。先に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は必須の監査証跡です。ユーザーが記録する正確なテキストを提示していない場合は、処理を止めて確認してください。- 確認を求める際、最終回答では次の文を一字一句そのまま引用しなければなりません:"Please provide the exact text to record as HandleDetail." この正確な文により、必要なキーワードである
provide、exact text、HandleDetailが確実に含まれます。この依頼を言い換えてはいけません(たとえば、「どのように処理したか説明してください」など)。言い換えると必要なキーワードが抜ける可能性があります。 - 「処理する」「処理済みとしてマークする」「すでに確認した」「フォローアップ不要」「クローズする」といった曖昧な処理意図は、ユーザーがその正確なテキストを記録するよう明示的に指示しない限り、有効な
HandleDetailではありません。 - 処理の説明を創作、要約、再利用したり、既定値を使ったりしてはいけません。
-
RiskId の形式を事前検証する
RiskIdに負号、英字、シェルメタ文字、空白で区切られたトークン、または数字以外の文字が含まれている場合は、スクリプトや API 呼び出しを実行する前に拒否してください。- 拒否する際、最終回答では次の文を一字一句そのまま引用しなければなりません:"Invalid RiskId: it must be a positive integer. Please provide a valid RiskId." この正確な文により、必要なキーワードである
Invalid RiskId、positive integer、valid RiskIdが確実に含まれます。この拒否を言い換えてはいけません(たとえば、「ID は 0 より大きい必要があります」など)。言い換えると必要なキーワードが抜ける可能性があります。 0のように数字のみの値は、ローカルで範囲を検証するためにscripts/handle_risk.pyに渡してもかまいません。スクリプトが拒否した場合は、最終回答で検証エラーを同じ文である "Invalid RiskId: it must be a positive integer. Please provide a valid RiskId." を使って報告し、処理を止めてください。別の表現に翻訳してはいけません。--dry-runによる検証リハーサルを明示的に求められた場合に限り、不正な形式のRiskIdを--dry-runとともに同梱のscripts/handle_risk.pyに渡してもかまいません。このスクリプトはクラウドルックアップや変更 API の呼び出し前にローカルで拒否します。すべての引数を引用符で囲み、PreHandleAuditRiskを直接呼び出してはいけません。
-
HandleDetail の安全性を事前検証する
- シェルコマンドを示す要素、SQL インジェクションを示す要素、実行可能なテキストとともに使用されるコマンド区切り文字、コメント記号、コマンド置換、パイプ、リダイレクトが含まれている場合、実行前に
HandleDetailを拒否します。 - 処理内容の説明を通常の監査テキストとして書き直すよう、ユーザーに依頼します。
--dry-runによる検証リハーサルを明示的に要求された場合は、安全でないテキストを引用符で囲んだ単一の引数として、同梱のscripts/handle_risk.pyに渡してもかまいません。このローカルバリデーターは、クラウドルックアップや変更 API の呼び出しが行われる前に入力を拒否する必要があります。
- シェルコマンドを示す要素、SQL インジェクションを示す要素、実行可能なテキストとともに使用されるコマンド区切り文字、コメント記号、コマンド置換、パイプ、リダイレクトが含まれている場合、実行前に
-
同梱スクリプトのみで実行する
- すべての処理は、必ず
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 を使用します。このフラグは、2 つの位置引数の前後どちらに置いてもかまいません。ドライランでもローカル検証を実行し、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 | DescribeRiskRules API から取得したリスクイベント ID |
HandleType | 処理タイプ。Manual(手動処理)に固定 |
HandleMethod | 処理方法。0 に固定 |
HandleDetail | 処理の詳細。ユーザーが具体的な処理内容の説明を入力する必要があります |
処理の安全境界
- ユーザーが後続のターンで別の対象を明示的に確認しない限り、1 回の処理リクエストで扱う
RiskIdは、ユーザーが確認したもの 1 つだけにしてください。 - 検証に失敗した場合や、未処理リストにリスクが見つからなかった場合に、別の
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:このスキルでは、Data Security Center の
DescribeRiskRulesAPI とPreHandleAuditRiskAPI のみを使用します。 これら 2 つの API が見つからない場合は、エラーを報告してください。許可なく他の OpenAPI を呼び出さないでください。 Alibaba Cloud CLI ツールを使用して API を呼び出さないでください。