mcpField
O
openclaw-secret-scanning-maintainer

openclaw-secret-scanning-maintainer

github.com/openclawセキュリティ393.3k437 回インストール今日更新
リポジトリ

openclaw-secret-scanning-maintainer について

OpenClaw の GitHub Secret Scanning アラートを扱う、メンテナー専用のスキルです。場所の種類に応じて処理を振り分け、スクリプトで秘匿情報の伏せ字化、コメントの整理、通知、解決を行い、平文の秘匿情報を端末出力に含めません。

主な機能

  1. 01場所の種類に応じた処理
  2. 02秘匿情報の特定と伏せ字化
  3. 03コメントの削除と再作成
  4. 04通知とアラート解決
  5. 05書式付き結果の生成

活用シーン

  1. 01Issue や PR に露出した認証情報の整理
  2. 02秘匿情報を含むコメントの伏せ字版への置換
  3. 03コミット内の秘匿情報アラートへの対応

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/openclaw/openclaw --skill openclaw-secret-scanning-maintainer

インストール後、Claude Code で/openclaw-secret-scanning-maintainerを入力して読み込まれたか確認します。

同梱ファイルscripts/secret-scanning.mjs

詳細

OpenClaw シークレットスキャンメンテナー

メンテナー専用です。 このスキルでは、他のユーザーのコメントを編集または削除し、シークレットスキャンのアラートを解決するためのリポジトリ管理者/メンテナー権限が必要です。

https://github.com/openclaw/openclaw/security/secret-scanning のアラートを処理するときに、このスキルを使用します。

言語ルール: 通知コメントと置き換えコメントは、すべて英語で記述する必要があります。

スクリプト

API 呼び出し、一時ファイル管理、セキュリティの適用など、すべての機械的な操作は次のものが処理します。

$REPO_ROOT/.agents/skills/openclaw-secret-scanning-maintainer/scripts/secret-scanning.mjs

このスクリプトでは、以下を徹底します。

  • すべてのアラート取得時に hide_secret=true を指定する(標準出力に平文のシークレットを出力しない)
  • すべての一時ファイルにランダムな UUID を使って mktemp を実行する
  • すべての本文アップロードに -F body=@file を使用する(インラインのシェルクォートは使用しない)
  • 場所の種類に応じて通知テンプレートを切り替える
  • .secret または .body を標準出力に出力しない

全体のフロー

単一または複数のアラートに対応しています。複数のアラートを処理する場合は、昇順に処理します。

各アラートについて、次の手順を実行します。

  1. 特定 — fetch-alert と fetch-content を使ってメタデータと本文を取得します
  2. 判断 — エージェントが本文ファイルを読み取り、平文のシークレットが残っているかを特定し、必要な場合にのみ編集済みバージョンを作成します
  3. 編集 — issue/PR の本文には redact-body-if-needed を使用します。コメントの場合はスキップして直接削除します
  4. 削除 — コメントの場合は delete-comment と recreate-comment を使用します。本文の履歴は削除できません
  5. 通知 — 現在の issue/PR の本文がすでに編集済みの場合を除き、場所の種類に応じたテンプレートを notify で投稿します
  6. 解決 — resolve でアラートを閉じます
  7. 概要 — summary で書式付きの結果を出力します

ステップ 1:特定

# List all open alerts
node secret-scanning.mjs list-open

# Fetch specific alert metadata + locations
node secret-scanning.mjs fetch-alert <NUMBER>

# Fetch content for each location (saves body to temp file)
node secret-scanning.mjs fetch-content '<location-json>'

fetch-content の出力には、次の情報が含まれます。

  • body_file:本文全体を含む一時ファイルのパス
  • author:投稿者
  • issue_number / pr_number:投稿場所
  • edit_history_count:既存の編集回数
  • type:振り分けに使用する場所の種類
  • discussion_comment の場合、元のコメントが返信であれば comment_node_id、discussion_node_id、reply_to_node_id も含まれます。
場所の種類による振り分け
typeフロー
issue_commentコメント:削除して再作成
pull_request_commentコメント:削除して再作成
pull_request_review_commentコメント:削除して再作成
discussion_commentディスカッションコメント:削除して再作成(GraphQL)
issue_body本文:その場で編集
pull_request_body本文:その場で編集
commit通知のみ
その他スキップして報告

ステップ 2:判断(エージェント)

エージェントは fetch-content の出力に含まれる本文ファイルを読み取り、次のことを行います。

  1. 内容に含まれるすべてのシークレットを特定します(アラートで検出されたもの以外にも含まれている場合があります)
  2. 現在の本文に平文の認証情報が残っているかを判断します
  3. 残っている各シークレットを [REDACTED <secret_type>] に置き換えます — 値の一部、接頭辞、接尾辞は残しません
  4. 編集済みの内容を新しい一時ファイルに保存します

意味を理解する必要があるのは、この手順だけです。それ以外はすべて機械的に処理されます。

issue_body と pull_request_body の場合、現在の本文が投稿者によってすでに編集されており、平文の認証情報が残っていないなら、公開通知コメントを投稿しないでください。次のようなメンテナー専用の解決コメントを付けて、アラートを解決します。

node secret-scanning.mjs resolve <ALERT_NUMBER> revoked "Current issue/PR body is already redacted; no public notification posted."

これにより、過去の機密情報を新たに公開状態で示すことを避けられます。

ステップ 3:編集

コメントの場合(issue_comment/PR コメント)

編集しないでください。 ステップ 4(削除+再作成)に直接進みます。削除前に PATCH すると、不要な編集履歴が追加されます。

issue_body / pull_request_body の場合
node secret-scanning.mjs redact-body-if-needed <issue|pr> <NUMBER> <current-body-file> <redacted-body-file> <result-file>

fetch-content の body_file を <current-body-file> として使用します。このコマンドは <result-file> に notify_required を書き込み、秘匿化されたファイルが現在の本文と異なる場合にのみ本文を PATCH します。

ステップ 4:編集履歴を削除する

コメント — 削除して再作成する

issue/PR のコメントの場合:

# Delete original (all edit history gone)
node secret-scanning.mjs delete-comment <COMMENT_ID>

# Recreate with redacted content
node secret-scanning.mjs recreate-comment <ISSUE_NUMBER> <body-file>

ディスカッションのコメントの場合(GraphQL を使用):

# Delete original
node secret-scanning.mjs delete-discussion-comment <COMMENT_NODE_ID>

# Recreate with redacted content
node secret-scanning.mjs recreate-discussion-comment <DISCUSSION_NODE_ID> <body-file> [REPLY_TO_NODE_ID]

discussion_comment の fetch-content 出力には、これらのコマンドに必要な comment_node_id と discussion_node_id が含まれます。元のディスカッションコメントが返信だった場合は、reply_to_node_id も含まれます。秘匿化したコメントが元のスレッドに残るよう、この省略可能な 3 番目の引数を渡してください。

再作成するコメントは、次の形式にしてください。

> **Note:** The original comment by @<AUTHOR> has been removed due to secret leakage. Below is the redacted version of the original content.

---

<redacted original content>
issue_body / pull_request_body — 編集履歴は削除できません

編集すると、編集前の平文を含む編集履歴のリビジョンが作成されます。これは API から削除できません。

作成者に対し、公開の場で issue の削除と再作成、または PR のクローズと再オープンを勧めてはいけません。過去の内容に注目が集まるおそれがあります。削除に関する案内はメンテナーのみにしてください。

メンテナーのターミナルにのみ出力してください(公開コメントには絶対に出力しないでください):

⚠️ Issue/PR body edit history still contains plaintext secrets.
Contact GitHub Support to purge: https://support.github.com/contact
Request purge of issue/PR #{NUMBER} userContentEdits.

重大な注意: 公開コメントや resolution_comment で、編集履歴や「編集済み」ボタンに触れてはいけません。

コミット

クリーンアップできません。作成者にブランチの削除または force-push を依頼してください(マージされていない PR の場合)。

ステップ 5:通知する

node secret-scanning.mjs notify <TARGET> <AUTHOR> <LOCATION_TYPE> <SECRET_TYPES> [REPLY_TO_NODE_ID|BODY_REDACTION_RESULT_FILE]
  • ディスカッション以外の種類では、<TARGET> は issue/PR 番号です。
  • discussion_comment の場合、<TARGET> は fetch-content が返す discussion_node_id です。
  • 返信形式の discussion_comment の場合、通知が同じスレッドに残るよう、fetch-content の省略可能な reply_to_node_id を渡してください。
  • issue_body と pull_request_body の場合は、redact-body-if-needed の <result-file> を渡してください。スクリプトは notify_required が false の場合に通知をスキップし、このファイルがない場合は本文についての通知を拒否します。

シークレットの種類はカンマ区切りです:"Discord Bot Token,Feishu App Secret"

スクリプトは適切なテンプレートを選択します:

  • コメントの種類:「あなたのコメントが削除され、置き換えられました」
  • 本文の種類:「あなたの issue/PR の説明がその場で秘匿化されました」
  • コミット:「あなたがコミットしたコード」

issue_body と pull_request_body の場合は、現在の本文に平文が残っていて、メンテナーが秘匿化した場合にのみ通知してください。ユーザーがすでに現在の本文を秘匿化している場合は、この手順をスキップし、通知せずに解決してください。

ステップ 6:解決する

node secret-scanning.mjs resolve <ALERT_NUMBER>
# or with custom resolution:
node secret-scanning.mjs resolve <ALERT_NUMBER> revoked "Custom comment"

解決のステータスは、デフォルトで revoked です。ユーザーがローテーションするかどうかをメンテナーが制御することはできません。私たちの責任は、現在の平文の露出を取り除き、公開通知が有用な場合にのみ通知することです。revoked は「このシークレットは漏えいしたものと見なすべき」という意味であり、「失効を確認した」という意味ではありません。

ステップ 7:概要

処理後、JSON の結果ファイルを作成し、概要コマンドに渡します:

node secret-scanning.mjs summary /tmp/results.json

スクリプトは ---BEGIN SUMMARY--- と ---END SUMMARY--- で区切られたブロックを出力します。これらのマーカーの間の内容を、ユーザーにそのまま出力しなければなりません。言い換え、書式変更、省略、または独自の概要の作成はしないでください。 スクリプトには、すべてのアラートと場所の完全な URL がすでに含まれています。

JSON 形式:

[
  {
    "number": 72,
    "secret_type": "Discord Bot Token",
    "location_label": "Issue #63101 comment",
    "location_url": "https://github.com/openclaw/openclaw/issues/63101#issuecomment-xxx",
    "actions": "Deleted+Recreated+Notified",
    "history_cleared": true
  }
]

未対応の種類には、"skipped": true, "unsupported_type": "<type>" を追加してください。

安全規則

  • エージェントは内容を読み取り、シークレットを特定し、秘匿化を行います。 API 呼び出しはスクリプトが処理します。
  • シークレットの一部であっても、公開コメント、秘匿化マーカー、ターミナル出力に含めてはいけません。
  • アラートの URL や番号を公開コメントに含めてはいけません。
  • コメントの場合、PATCH はスキップし、DELETE と再作成を直接行ってください。
  • 公開コンテンツで編集履歴、「編集済み」ボタン、またはコミット SHA に触れてはいけません。
  • コメントを削除する前に確認を求めてください。
  • ユーザーが一括処理を依頼した場合を除き、アラートは一度に 1 件処理してください。
  • 公開コメントはすべて英語にしてください。
  • 未対応の場所の種類はスキップし、概要で報告してください。

コメント