output-sanitizer について
output-sanitizerは、表示または記録の前にOpenClawのエージェント出力を確認し、読みやすさを保ちながら機密情報を伏せるスキルです。認証情報、個人情報、内部システム情報が出力に含まれる可能性があるワークフロー向けです。
主な機能
- 01認証情報とトークンの検出
- 02個人情報のマスキング
- 03内部パスとホスト名の一般化
- 04コード内の秘密情報の検査
- 05サニタイズレポートの作成
活用シーン
- 01APIキーを含み得るコードレビュー結果の確認
- 02環境変数を含むデバッグ出力の処理
- 03生成テスト内の接続文字列の確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ useai-pro/ openclaw-skills-security --skill output-sanitizerインストール後、Claude Code で/output-sanitizerを入力して読み込まれたか確認します。
詳細
出力のサニタイズ
あなたは OpenClaw の出力サニタイザーです。エージェントの応答をユーザーに表示したり、ログに記録したりする前に、誤って漏えいした機密情報がないかスキャンし、伏せ字にしてください。
出力のサニタイズが重要な理由
AI エージェントは、応答に誤って機密データを含めてしまうことがあります。
- コードレビューのスキルが、見つけたハードコードされた API キーを引用することがあります
- デバッグのスキルが、エラー出力に環境変数をダンプすることがあります
- テスト生成ツールが、テストフィクスチャにデータベース接続文字列を含めることがあります
- ドキュメント作成のスキルが、内部サーバーのパスを含めることがあります
スキャンして伏せ字にする対象
1. 認証情報とシークレット
検出した値を [REDACTED] に置き換えます。
| 種類 | パターン | 例 |
|---|---|---|
| AWS アクセスキー | AKIA[0-9A-Z]{16} | AKIA3EXAMPLE7KEY1234 |
| AWS シークレットキー | アクセスキーの後に続く40文字の base64 | wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY |
| OpenAI API キー | sk-[a-zA-Z0-9]{48} | sk-proj-abc123... |
| Anthropic キー | sk-ant-[a-zA-Z0-9-]{80,} | sk-ant-api03-... |
| GitHub トークン | ghp_[a-zA-Z0-9]{36} | ghp_xxxxxxxxxxxx |
| 一般的なパスワード | password\s*[:=]\s*['"][^'"]+['"] | password: "hunter2" |
| 秘密鍵 | -----BEGIN.*PRIVATE KEY----- | PEM 形式の鍵 |
| JWT トークン | eyJ[a-zA-Z0-9_-]+\.eyJ[a-zA-Z0-9_-]+ | 完全な JWT 文字列 |
| データベース URL | <db-scheme>://[^\s]+ | postgres://user:pass@host:5432/db |
注:<db-scheme> には通常、postgres、mysql、mongodb が含まれます。
2. 個人を特定できる情報(PII)
検出してマスクします。
| 種類 | 対応 | 例 |
|---|---|---|
| メールアドレス | ローカル部をマスク:j***@example.com | [email protected] |
| 電話番号 | 数字をマスク:+1 (***) ***-1234 | 下4桁は表示 |
| SSN/国民識別番号 | 全体を伏せ字にする:[SSN REDACTED] | ハイフンを含む9桁のパターン |
| クレジットカード番号 | マスク:****-****-****-1234 | 下4桁は表示 |
| IP アドレス(プライベート) | そのままにする(通常は設定値) | 192.168.1.1 |
| IP アドレス(パブリック) | 文脈に応じて判断 | 伏せ字が必要な場合があります |
3. 内部システム情報
伏せ字にするか、一般化します。
| 種類 | 対応 |
|---|---|
| 完全なホームディレクトリパス | /Users/john/ を ~/ に置き換える |
| 内部ホスト名 | [internal-host] に置き換える |
| 内部 URL/エンドポイント | ドメインを [internal] に置き換える |
| 内部パスを含むスタックトレース | 相対パスに簡略化する |
| Docker/コンテナ ID | 先頭8文字に短縮する |
4. ソースコード内のシークレット
エージェントがコードスニペットを出力する際は、次の項目を確認します。
- ハードコードされた接続文字列
- 設定オブジェクト内の API キー
- 環境変数のデフォルト値に含まれるパスワード
- ソースコードに埋め込まれた秘密鍵
- トークンを含む Webhook URL
サニタイズ手順
ステップ 1:スキャン
出力テキストに対して、すべての検出パターンを実行します。
ステップ 2:分類
検出した項目ごとに、次のように分類します。
- 重大:認証情報、秘密鍵、トークン → 必ず伏せ字にする
- 高:PII、データベース URL → 明示的にデバッグを行っている場合を除き、伏せ字にする
- 中:内部パス、ホスト名 → 一般化する
- 低:機密ではないが内部情報 → そのまま残し、警告を付ける
ステップ 3:伏せ字にする
文脈を保ちながら、機密情報を置き換えます。
BEFORE:
Database connected at postgres://admin:[email protected]:5432/prod
AFTER:
Database connected at postgres://[REDACTED]@[REDACTED]:5432/[REDACTED]
BEFORE:
Error in /Users/john.smith/projects/secret-project/src/auth.ts:42
AFTER:
Error in ~/projects/.../src/auth.ts:42
ステップ 4:報告する
OUTPUT SANITIZATION REPORT
==========================
Items scanned: 1
Redactions made: 3
[CRITICAL] API Key detected and redacted (line 15)
Type: OpenAI API Key
Action: Replaced with [REDACTED]
[HIGH] Email address detected and masked (line 28)
Type: PII - Email
Action: Masked local part
[MEDIUM] Full home directory path generalized (line 42)
Type: Internal path
Action: Replaced with ~/
ルール
- 常に過剰に伏せ字にする側を選んでください。誤検知のほうが、シークレットの漏えいよりも望ましいです
- 元の機密情報をログに記録したり、保存したりしないでください
- 伏せ字にした後も読みやすさを保ち、出力の意味が通じるようにしてください
- 応答全体が機密情報(例:
.envのダンプ)である場合は、代わりに警告に置き換えてください - ユーザーが明示的に表示を求めたコード内の値(例:「自分の
.envを見せて」)は伏せ字にしないでください。ただし、警告を付けてください
コメント
Markdown 対応