secure-secret-drop について
Secure Secret Drop は、一時フォームでシークレットを受け取り、承認済みファイルへ直接書き込むローカルスキルです。入力値をチャットやモデルのコンテキストに含めず、Cloudflare を信頼境界とする Quick Tunnel を使用します。
主な機能
- 01一時的なシークレット入力フォームの作成
- 02Quick Tunnel 経由での送信内容の転送
- 03値を表示せずにレシート状態を確認
- 04承認済み env または JSON ファイルへの書き込み
- 05フォームとレシートの期限切れまたはキャンセル
活用シーン
- 01チャットを使わない API キーの収集
- 02送信された認証情報の承認済み env ファイルへの保存
- 03明示的に承認されたパスへのシークレット受信
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ moeadham/ secure-secret-drop --skill secure-secret-dropインストール後、Claude Code で/secure-secret-dropを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
.gitignoreLICENSEREADME.mdreferences/security-model.mdcloudflared-setup.mdscripts/handoff.pytests/test_handoff.py詳細
Secure Secret Drop
ユーザーがチャットやボールトを使わずにシークレットを提供する必要がある場合は、このローカルスキルを使用します。分離された Cloudflare Quick Tunnel の一時的な公開ケイパビリティ URL を作成します。この URL は、127.0.0.1 のみにバインドされた HTTP オリジンを経由し、送信されたバイト列をモデルのコンテキストに入れることなく、明示的に許可された宛先ファイルに直接書き込みます。
要件と初回セットアップ
必要なもの:
- Python 3(標準ライブラリ)。Python パッケージは不要です。
cloudflared実行ファイル。- Cloudflare へのアウトバウンドネットワークアクセス。ローカルのフォームオリジンは
127.0.0.1のみにバインドされます。
Cloudflare アカウント、ドメイン、API トークン、cloudflared tunnel login、名前付きトンネル、DNS レコード、バックグラウンドサービスは必要ありません。このスキルは、ドロップごとに匿名の一時的な Quick Tunnel を作成します。
最初のフォームを作成する前に、doctor を実行してください。cloudflared=missing と報告された場合、create を試みないでください。また、ターミナルツールを利用できる場合は、ユーザーに手動で解決するよう求めないでください。Cloudflared setup を読み、ホスト OS とパッケージマネージャーを特定し、提案するインストール方法を説明して、パッケージのインストールや sudo に必要な承認を得てから、Cloudflare の公式配布チャネルからインストールし、cloudflared --version と doctor の両方を再実行してください。このスキルのために、cloudflared tunnel login を実行したり、DNS を作成したり、トンネルサービスをインストールしたり、既存の Cloudflare 設定を変更したりしないでください。
cloudflared が PATH 以外の場所にインストールされている場合は、コマンドの実行時またはエージェントのサービス環境で、CLOUDFLARED_BIN に実行ファイルの絶対パスを設定してください。CLI は、macOS/Linux の一般的な場所も自動的に確認します。
ワークフロー
doctorを実行します。- フォームを作成し、返された URL をユーザーに送ります。値をチャットに貼り付けるよう求めてはいけません。
- ユーザーが一度送信し、送信が完了したことだけを伝えます。
status RECEIPT_IDを実行します。ステータスとフィールド名のみが表示され、値、長さ、ハッシュは表示されません。- 承認された正確なパスに直接取り込むか、ダミーのテストレシートを破棄します。
スキルローダーからインストール済みのスキルディレクトリを特定してください。作成者固有の絶対パスをコピーしてはいけません。次に、そのスクリプトを使用します。
PY="$(command -v python3)"
CLI="<installed-skill-directory>/scripts/handoff.py"
$PY "$CLI" doctor
$PY "$CLI" create --field API_KEY --field API_SECRET --ttl 600
$PY "$CLI" status RECEIPT_ID
$PY "$CLI" consume RECEIPT_ID --env-file /exact/approved/path.env
$PY "$CLI" consume RECEIPT_ID --json-file /exact/approved/path.json
$PY "$CLI" consume RECEIPT_ID --env-file /exact/path.env --overwrite
$PY "$CLI" consume RECEIPT_ID --discard
$PY "$CLI" cancel RECEIPT_ID
オプション:--field NAME を繰り返して指定できます。--label NAME=Visible label でラベルを指定できます。宣言済みの非シークレットフィールドに限り、--plain NAME を使用できます。名前は初期状態では、大文字の環境変数キー形式に一致する必要があります。デフォルトの TTL は 10 分です。
運用ルール
- レシートに対して
read_file、cat、show、その他の表示コマンドを決して実行しないでください。CLI には意図的に生の出力コマンドがありません。 - 値を引数、URL、ログ、ステータス出力、チャットに決して含めないでください。
- 宛先に既存のキーがある場合は、
--overwriteが必要です。ユーザーが明示した宛先パスは、すでに承認済みとして扱います。取り込み前に再度確認してはいけません。宛先が不明または曖昧な場合、あるいは上書きの承認が必要な場合に限り、確認してください。 - 宛先の検証または書き込みに失敗した場合、送信済みレシートは再試行可能な状態のままになります。
- GET と HEAD は消費されません。有効な POST が成功するのは一度だけです。そのため、リンクスキャナーによってフォームが消費されることはありません。
- フォームには有効期限があり、ローカルオリジンとトンネルは自動的に終了します。早期に閉じるには
cancelを使用します。POST が成功すると、ケイパビリティはただちに無効になります。確認応答全体がブラウザーに届くまで約 2 秒間待ってから、配信を停止します。レシートは明示的に取り込まれるまで保持されます。 - 新しい Hermes セッションでも一貫した動作になるよう、スクリプトと宛先には絶対パスを使用してください。
- フォームの見た目は控えめでプロフェッショナルなものにしてください。配色に紫を使用してはいけません。
信頼とストレージのモデル
これは TLS のみを使用する MVP であり、ブラウザーによるエンドツーエンド暗号化ではありません。URL は一時的な公開ケイパビリティ URL です。Cloudflare はエッジで公開 TLS を終端し、Quick Tunnel 経由で 127.0.0.1 のみにバインドされた HTTP オリジンへ転送します。そのため、Cloudflare は信頼境界に含まれます。トンネルは tunnel --no-autoupdate --config /dev/null --url http://127.0.0.1:<random-port> で起動します。名前付きトンネル、既存の設定、DNS、Workers、sudo には触れません。
保留中のフォームのケイパビリティ/CSRF 情報と送信された受領データは、デフォルトでスキルの外部にある $XDG_STATE_HOME/secure-secret-drop/ または ~/.local/state/secure-secret-drop/ に保存されます(ディレクトリのモードは 0700、ファイルのモードは 0600)。SECURE_SECRET_DROP_STATE_DIR を設定すると、保存先を変更できます。この承認済み MVP では、受領データは保存時に平文であり、ローカルユーザーアカウントとディスク暗号化のセキュリティを引き継ぎます。速やかに受領またはキャンセルしてください。受領データ/非公開フォームデータは、受領、キャンセル、または期限切れの後に削除されます。status で終了状態を報告できるよう、機密情報を含まない最小限のステータスレコードは残ります。
制限事項と不変条件については、セキュリティモデルを参照してください。