セキュリティスキル
目的: コード、スクリプト、認可されたバイナリ、リポジトリ管理下のプロンプトサーフェスに対して、反復可能なセキュリティチェックを実行します。
このスキルは、呼び出し元から要求されたリポジトリスキャン、認可されたバイナリの保証、依存関係リスク、シークレット、またはオフラインのプロンプトサーフェスレッドチームのために使用します。
重要な制約事項
- オペレーターが所有するか、明示的に評価を許可されたリポジトリ、バイナリ、プロンプトサーフェスのみをスキャンします。理由: セキュリティレビューは、サードパーティのシステムや独自素材へのアクセスを許可するものではありません。
- デフォルトでコレクションは読み取り専用に保ちます。シークレットを外部に送信したり、破壊的なペイロードを実行したり、グリーン判定を捏造するためにポリシーやベースラインを変更したりしないでください。理由: 評価自体がインシデントになってはならず、その証拠を消し去ってもいけません。
- 欠落またはエラーが発生しているスキャナーは、クリーンな結果ではなく、カバレッジギャップとして扱います。完全なツールカバレッジが必要な場合は
--require-toolsを使用します。理由: 証拠がないことは、存在しないことの証拠ではありません。 - 現在のエージェントとローカルシェルを使用します。明示的に要求されない限り、別のランタイムやオーケストレーション基盤を起動しないでください。理由: リポジトリスキャンは限定された操作であり、外部への展開を許可するものではありません。
- 選択したスキャンを1回実行し、結果とカバレッジギャップを報告します。是正、リスク受容、再実行、および昇格は呼び出し元の判断に委ねられます。
プロンプト
fleet-router リポジトリの cli/ に対してフルセキュリティスキャンを実行してください:依存関係リスク、シークレット、静的解析。コレクションは読み取り専用に保ち、欠落しているスキャナーはすべてカバレッジギャップとして扱い、是正は行わずに結果とカバレッジギャップを報告してください。
成功の基準
- レポートには、実行されたスキャナー(例:
gosec ./...)がリストされ、欠落しているツールはクリーンパスではなくカバレッジギャップとしてマークされます。 - コレクションは全体を通して読み取り専用に保たれます。トランスクリプトに
curl、rm、または資格情報の読み取りが現れてはいけません。 - 発見事項には、
cli/internal/auth/token.go:42のようにファイルと行番号が記載され、曖昧なカテゴリではありません。 - レスポンスの
findingsとcoverage gapsは、是正手順とは別に保持され、呼び出し元の判断として残されます。
セキュリティサーフェス
- リポジトリゲート:
scripts/security-gate.shは、利用可能なスキャナーを組み合わせて、クイック/フル/リリースチェックを実行します。 - 構成可能なスイート:
scripts/security_suite.pyは、認可されたバイナリに対して、静的、動的、契約、ベースライン、およびポリシーのプリミティブを提供します。 - オフラインレッドチーム:
scripts/prompt_redteam.pyは、リポジトリ所有のプロンプトおよびツール制御サーフェスを攻撃パックに対してチェックします。
これが標準的なセキュリティランブックです。スイートポリシーゲーティングは、ポリシーファイルが提供された場合に policy/policy-verdict.json を含む、機械可読な出力を生成します。
バイナリ、ポリシー、ベースライン、またはレッドチーム作業の前に、スイートランブック を読んでください。コードレベルのレビューには OWASP チェックリスト を使用してください。
実行ワークフロー
1) クイックゲート
実行:
scripts/security-gate.sh --mode quick
チェックポイント: 終了コードを保存し、報告された security-gate-summary.json が存在し、トリアージ前にパースできることを確認します。
2) フルスキャン
実行:
scripts/security-gate.sh --mode full
スキップされたスキャナーが保証の主張を無効にする場合は、--require-tools を追加します。チェックポイント: 選択されたアーティファクトバリデータとプロセスの両方が成功しない限り、結果を不完全として報告します。
3) スケジュールゲート
スケジュールされた自動化は、対象のブランチに対してフルゲートを実行し、そのアーティファクトディレクトリを保持します。スケジュールされた実行が失敗すると、アクション可能な追跡作業が作成されます。AgentOps 自体はスケジューラを提供しません。
4) ハント(調査)の規律
スクリプト化されたゲートを超えたレビュー作業(コードレベルまたはレッドチームパス)については、最初の直感ではなく、完全な分類体系に従って調査します。
- 完全分類体系のハント. OWASP チェックリスト(プロンプトサーフェスの場合は攻撃パック)の該当するすべてのクラスを調べ、クラスごとに結果(発見、クリーン、未評価)を記録します。訪問していないクラスは、クリーンではなくカバレッジギャップです。疑わしいリード1つを追跡して分類体系全体を無視することは、最初の臭いへの固執という障害モードです。
- 発見ごとの実証的証拠. 発見は、その動作を示す具体的な入力、リクエスト、またはコマンドがアーティファクトにキャプチャされ、再現可能な場合にのみ現実のものとなります。パターンマッチのみの発見は、推測として報告され、証明されたものより低くランク付けされます。
- フェイルオープンプローブ. サーフェス上のすべてのガード、ゲート、タイムアウトについて、エラー時やハングアップ時に何が起こるかを尋ね、安全な場所でプローブします。エラー時にフェイルオープンする制御は、正常パスが正しくても発見となります。
- アイデンティティチェーン追跡. 認証または委任されたフローについては、各ホップ(ユーザー、サービス、トークン、フック)での実効アイデンティティを追跡します。アイデンティティが想定されていて検証されていないホップ(借用アイデンティティ障害モード)は発見となります。
- 静かなラウンドへの収束. 完全なパスが1回、新しい発見も新しいカバレッジギャップも生じなくなるまで、完全なパスを繰り返します。その静かなラウンドが停止条件です。騒がしいラウンド(発見がまだ続いている)で停止するのは時期尚早です。予算が静かなラウンドに達する前に終了した場合は、調査を未収束として報告します。
5) トリアージ
- 最新のアーティファクトを開き、スキャナー、深刻度、ファイル、カバレッジギャップを特定します。
- 最も狭い安全なコマンドで発見を再現します。
- 具体的な発見をランク付けし、カバレッジギャップを保持します。
- 停止します。是正、リスク受容、およびその後のスキャンは、新たな呼び出し元の判断です。単にパスするためだけに、ベースラインをダウングレード、抑制、または更新しないでください。
出力仕様
アーティファクトディレクトリ: リポジトリゲートは ${SECURITY_GATE_OUTPUT_DIR:-${TMPDIR:-/tmp}/agentops-security}/<run-id>/ に書き込みます。構成可能スイートとレッドチームの実行は、明示的な --out-dir を使用します。
ファイル名規則: リポジトリゲートは security-gate-summary.json(および生の summary.json)が必要です。スイート実行は suite-summary.json、レッドチーム実行は redteam/redteam-results.json が必要です。
シリアライゼーション/スキーマ形式: security-gate-summary.json はJSONで、空でない mode、run_id、output_dir、gate_status、数値の missing_tool_count、ブール値の require_tools、オブジェクトの toolchain を含みます。
バリデータコマンド: OUT=<security-gate-run-dir> として、jq -e '(.mode|type)=="string" and (.mode|length)>0 and (.run_id|type)=="string" and (.run_id|length)>0 and (.output_dir|type)=="string" and (.output_dir|length)>0 and .gate_status=="PASS" and (.missing_tool_count|type)=="number" and (.require_tools|type)=="boolean" and (.toolchain|type)=="object"' "$OUT/security-gate-summary.json" >/dev/null を実行します。
出力: アーティファクトパス、コマンド/終了コード、モード、ゲートステータス、欠落ツールのカバレッジ、ランク付けされた発見、および認可境界を報告します。所有者、次のアクション、承認、リリース、再試行の決定を追加しないでください。
品質チェックリスト
- ターゲットと認可境界が明確であり、コレクションはその範囲内に留まりました。
- スキャナーの可用性とスキップ/エラーのカバレッジがレポートに表示されています。
- 発見事項には、深刻度、場所、再現可能な証拠、および制限された是正ガイダンスが含まれています。
- アーティファクトには、新たに公開されたシークレットや編集されていない機密ペイロードは含まれていません。
- レポートは、合格したスキャンと昇格またはリリースの許可を区別しています。
- 抑制、ポリシー変更、ベースライン、リスク受容には、明示的な判断が必要です。
- レポートは証拠の提示後に停止し、継続判断は含みません。
検証
スキルとレッドチームバリデータを実行します:
bash skills/security/scripts/validate.sh
bash tests/scripts/test-security-suite-redteam.sh
制限されたスイートのスモークテストについては、スイートランブック に示されているように、所有するバイナリと一時的な出力ディレクトリを使用します。
例
- クイックセキュリティリクエストは、リポジトリゲートを1回実行し、カバレッジと発見事項を報告します。
- フルセキュリティリクエストは、フルスキャンを1回実行し、そのアーティファクトを保存します。
- 認可されたバイナリリクエストは、明示的な一時出力ディレクトリにベースラインをキャプチャする場合があります。
- レッドチームリクエストは、リポジトリ所有のサーフェスに対してオフラインの攻撃パックを実行する場合があります。
トラブルシューティング
| 問題 | 対応 |
|---|---|
| スキャナーが見つからない/エラー | カバレッジギャップを記録する;インストールするか、必要な場合は --require-tools を指定して再実行する |
| ローカル/CIの不一致 | スキャナーのバージョン、設定、モード、両方のアーティファクトディレクトリを比較する |
| 誤検知の疑い | 狭い範囲で再現する;承認された抑制とその所有者を文書化する |
| スイート/ベースラインの失敗 | 指定された比較/ポリシーアーティファクトを検査する;反射的にベースラインを更新しない |
| 文言変更後のレッドチーム失敗 | 制御が後退したのか、攻撃パックマッチャーに意図的な修正が必要かを判断する |
参考ドキュメント
- references/security-suite-runbook.md — バイナリ/ポリシー/ベースライン/レッドチームのコマンドとアーティファクト
- references/security.feature — リポジトリゲートの実行可能仕様
- references/security-suite.feature — 構成可能スイートの実行可能仕様
- references/owasp-checklist.md — OWASP Top 10 レビュー
- references/agentops-redteam-pack.json — オフライン攻撃パック
- references/policy-example.json — スターターポリシー