mcpField
A
alibabacloud-dsc-audit

alibabacloud-dsc-audit

github.com/aliyunセキュリティ281144 回インストール1 日前に更新
リポジトリ

alibabacloud-dsc-audit について

Alibaba Cloud Python SDKを通じて、Alibaba Cloud Data Security Centerのリスクイベントを照会・処理するスキルです。セキュリティ担当者やクラウド運用担当者向けに、ページ単位の検索を提供し、イベント処理には対象と記録内容の確認を求めます。

主な機能

  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

詳細

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)

前提条件

重要:このスキルのスクリプトを実行する前に、以下の前提条件を必ず確認してください。

#前提条件確認コマンド必須条件
1Python 3python3 --version>= 3.6
2pip3pip3 --version任意
3Alibaba Cloud 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 経由で行うすべての 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)があることを確かめてください。

有効なプロファイルがない場合は、ここで停止してください。

  1. Alibaba Cloud Console から認証情報を取得します。
  2. このセッションの外部で認証情報を設定します(ターミナルで aliyun configure を使用するか、シェルプロファイルで環境変数を設定します)。
  3. 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:セキュリティリスクイベントに対応する

対応は、承認を必要とする操作です。対応コマンドを実行する前に、以下の確認を順番に完了してください。

  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 を提示または選択するまで待ってください。
    • クエリ結果にリスクが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 のみを使用してください。
  2. HandleDetail を確認する

    • HandleDetail は必須の監査証跡です。ユーザーが記録する正確なテキストを提示していない場合は、処理を止めて確認してください。
    • 確認を求める際、最終回答では次の文を一字一句そのまま引用しなければなりません:"Please provide the exact text to record as HandleDetail." この正確な文により、必要なキーワードである provide、exact text、HandleDetail が確実に含まれます。この依頼を言い換えてはいけません(たとえば、「どのように処理したか説明してください」など)。言い換えると必要なキーワードが抜ける可能性があります。
    • 「処理する」「処理済みとしてマークする」「すでに確認した」「フォローアップ不要」「クローズする」といった曖昧な処理意図は、ユーザーがその正確なテキストを記録するよう明示的に指示しない限り、有効な HandleDetail ではありません。
    • 処理の説明を創作、要約、再利用したり、既定値を使ったりしてはいけません。
  3. 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 を直接呼び出してはいけません。
  4. HandleDetail の安全性を事前検証する

    • シェルコマンドを示す要素、SQL インジェクションを示す要素、実行可能なテキストとともに使用されるコマンド区切り文字、コメント記号、コマンド置換、パイプ、リダイレクトが含まれている場合、実行前に HandleDetail を拒否します。
    • 処理内容の説明を通常の監査テキストとして書き直すよう、ユーザーに依頼します。
    • --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 を使用します。このフラグは、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
処理パラメーターの説明
パラメーター説明
RiskIdDescribeRiskRules API から取得したリスクイベント ID
HandleType処理タイプ。Manual(手動処理)に固定
HandleMethod処理方法。0 に固定
HandleDetail処理の詳細。ユーザーが具体的な処理内容の説明を入力する必要があります
処理の安全境界
  • ユーザーが後続のターンで別の対象を明示的に確認しない限り、1 回の処理リクエストで扱う RiskId は、ユーザーが確認したもの 1 つだけにしてください。
  • 検証に失敗した場合や、未処理リストにリスクが見つからなかった場合に、別の 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:このスキルでは、Data Security Center の DescribeRiskRules API と PreHandleAuditRisk API のみを使用します。 これら 2 つの API が見つからない場合は、エラーを報告してください。許可なく他の OpenAPI を呼び出さないでください。 Alibaba Cloud CLI ツールを使用して API を呼び出さないでください。

コメント