mcpField
R
rekey

rekey

ローカル
github.comセキュリティ22 週間前に更新

rekey について

rekeyは、対応プロバイダーのAPIキーやトークンをローテーションするCLI兼MCPサーバーです。新しい認証情報を配布して検証してから旧キーを退役させ、OSのキーチェーンに認証情報を保存し、MCP応答には秘密値を含めません。

主な機能

  1. 01対応プロバイダー間でのキーのローテーション
  2. 02設定済みの保存先への新しい認証情報の配布
  3. 03旧キー退役前の新しい認証情報の検証
  4. 04OSキーチェーンへのログイン情報の保存
  5. 05TOMLによる繰り返しローテーションの設定
  6. 06MCP書き込み操作の明示的な有効化

活用シーン

  1. 01GitLabトークンを.envファイルへローテーション
  2. 02新しいキーをGitHub ActionsやAWS SSMへ配布
  3. 03設定済みのローテーションをスクリプトやCIで実行
  4. 04秘密値を公開せずMCPクライアントからキー一覧を確認

MCP 対応

stdio MCPサーバーは、プロバイダー、接続状態、キー一覧の読み取り専用ツールを標準で提供します。ローテーションと退役には明示的なフラグが必要で、秘密値がクライアントに返されることはありません。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

インストール方法は未掲載です

このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。

リポジトリ
パッケージ
cargorekey0.1.0

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

rekey

1 つの CLI から、プロバイダー間で API キーとトークンをローテーションします。新しいキーを発行し、 それを使用するすべての場所に反映して、検証し、古いキーを無効化します。MCP サーバーも含まれています。

管理しているアカウントにのみアクセスします。各プロバイダーで使用するのは、ご自身の認証情報です。

CLI — GitLab トークンを CLI から直接 .env ファイルにローテーションします。

CLI から GitLab トークンをローテーションする rekey

MCP — Claude が rekey mcp を通じて同じトークンをローテーションします。シークレットが モデルに渡ることはありません。

rekey MCP サーバーを使って GitLab トークンをローテーションする Claude

インストール

macOS、Linux、Windows 向けのビルド済みバイナリ: リリース。

または、Rust(stable)を使います。

cargo install rekey

OS キーチェーンへの対応(macOS Keychain、Windows Credential Manager、Linux Secret Service)は組み込みです。

クイックスタート

まず、使い捨ての GitLab トークンで試してください。以下のコマンドはすべて安全に コピーできます。28550311 を手順 3 で確認したご自身の ID に置き換えてください。

1. ローテーション用の使い捨てトークンを作成します。 GitLab → Access tokens で、名前を kr-test(スコープは任意)にしてトークンを作成します。

2. ログインします。 GitLab のトークンページが、名前と api スコープが入力された状態で開きます。 Create token をクリックし、生成されたトークンを貼り付けます(入力内容は表示されません)。

rekey login gitlab
Checking with GitLab…
✓ Logged in to GitLab as @you. Saved to your macOS Keychain.
  rekey now works from any terminal — nothing to export.

3. キー ID を確認します。

rekey list gitlab
ID        NAME
28550267  rekey   (signed in with this key)
28550311  kr-test

4. .env ファイルにローテーションします。 rekey が実行計画を表示し、確認を待ちます。

rekey rotate gitlab 28550311 --dotenv /tmp/kr-test.env:KR_TEST_TOKEN
Here's what will happen:
  1. GitLab replaces "kr-test" with a new token and immediately revokes the old one. This can't be undone.
  2. The new token is saved to KR_TEST_TOKEN in /tmp/kr-test.env.
  3. rekey checks that the new token works.

Go ahead? [Y/n] y

Rotating kr-test…
  · Rotating (provider revokes old token immediately)…
  · Updating 1 consumer(s)…
  · Verifying new token…
  ✓ Rotated successfully.

New key id: 28550312
Updated: KR_TEST_TOKEN in /tmp/kr-test.env
Old token was revoked by the provider.

5. 確認して、後片付けをします。

cat /tmp/kr-test.env      # KR_TEST_TOKEN=glpat-…
rm /tmp/kr-test.env

その後、GitLab で kr-test を削除します。

実際のキーの場合: 引数なしで rekey rotate gitlab を実行すると、キーと保存先を選択できます。その内容を rekey.toml に保存できるため、次回のローテーションは 1 つのコマンドで実行できます。スクリプト/CI では:

rekey rotate gitlab 28550311 --dotenv .env --yes --no-input

コマンド

コマンド
login [provider]プロバイダーのトークンページを開きます(GitLab では入力済み)。貼り付けたトークンを受け取り、検証して OS キーチェーンに保存します。セルフホストの GitLab/Datadog サイトでは --url を指定します。プロバイダーを指定しない場合は、状態を表示します。
logout <provider>保存済みの認証情報を削除します(トークン自体は失効しません)。
connect <provider>認証情報とキー管理へのアクセスを確認します。
list <provider>キーの一覧を表示します。1 列目は、他のコマンドで指定する ID です。
rotate <provider> [id]1 つのキーをローテーションします。
rotate-all <provider>保存先が設定されているすべてのキーをローテーションします。ログインに使用しているキーはスキップします。
retire <provider> [id]古いキーを無効化(対応している場合)または削除します。無効化済みのキーを削除するには --delete を指定します。
mcpstdio で MCP サーバーを起動します。

グローバルオプション:--config <path>、--no-input(プロンプトを表示せずに失敗します)。 --yes は確認を省略します。引数を省略すると、TTY では入力を求められます。フラグは どの順序でも指定できます。標準出力には list の出力と --print-secret の値のみが出力されます。 それ以外はすべて標準エラー出力に出力されます。

保存先

新しいシークレットの保存先が 1 つ以上指定されていない場合、rotate は開始されません。

フラグ保存先
--dotenv <path>[:VAR].env ファイルの VAR を設定します。プロバイダーごとに既定の VAR が設定されます。AWS の場合は AWS_ACCESS_KEY_ID も書き込みます。
--gh-secret <owner/repo>:<NAME>gh を使って GitHub Actions のシークレットに保存します(stdin 経由)。
--ssm <name>:<region>aws を使って AWS SSM の SecureString に保存します(stdin 経由)。
--secret-file <path>ファイルに保存します。モードは 0600 です。
--secret-dir <dir>rotate-all:キーごとに 0600 のファイルを 1 つ作成します。
--keychainOS キーチェーンのサービス rekey に保存します。
--print-secret標準出力に出力します。

繰り返し指定できるフラグ:--dotenv、--gh-secret、--ssm。 --delete-old-now は、新しいキーの反映直後に古いキーを削除します。

Config

./rekey.toml、次に ~/.config/rekey/config.toml の順に読み込みます。シークレットは含まれません。対話型の rotate でエントリを作成できます。

[[keys]]
provider = "gitlab"
name = "ci-deploy"            # match on id, name and/or principal
consumers = [
  { type = "dot_env_file", path = ".env", variable = "GITLAB_TOKEN" },
  { type = "github_actions_secret", repo = "me/app", secret_name = "GITLAB_TOKEN" },
]

[[keys]]
provider = "aws"
principal = "ci-user"         # IAM user; survives the new key id
consumers = [
  { type = "dot_env_file", path = ".env", variable = "AWS_SECRET_ACCESS_KEY", id_variable = "AWS_ACCESS_KEY_ID" },
  { type = "aws_ssm_parameter", name = "/ci/aws", region = "us-east-1" },
]

コンシューマーの種類:dot_env_file、github_actions_secret、aws_ssm_parameter、 file、keychain。ローテーションごとに新しい ID を発行するプロバイダーでは、 name/principal で照合します。相対パスは設定ファイルを基準に解決されます。完全な例: rekey.toml.example。

Credentials

検索順序:環境変数 → 保存済みのログイン(rekey login)→ プロンプト (TTY の場合のみ。保存するかどうかを確認します)。フラグとして渡されることはありません。rekey がサインインに使用するトークンをローテーションすると (GitLab、Cloudflare)、保存済みのログインが更新されます。 REKEY_DISABLE_KEYCHAIN=1 を設定すると、キーチェーンの読み書きが無効になります。

Providers

プロバイダー方式ローテーション対象認証情報備考
awsoverlapIAM アクセスキーaws CLI セッション、AWS_PROFILEユーザーごとに最大 2 個のキーです。両方存在する場合は処理を拒否します。古いキーは Inactive になります。
gitlabatomicパーソナルアクセストークンGITLAB_TOKEN(api スコープ)、GITLAB_URL、GITLAB_TOKEN_EXPIRY_DAYS
cloudflareatomicユーザー API トークンCLOUDFLARE_API_TOKEN(API Tokens: Edit)トークン ID は固定です。
datadogoverlapAPI キーDD_API_KEY、DD_APP_KEY、DD_SITE無効化状態はありません。
npmoverlapクラシックトークンnpm CLI セッション、NPM_REGISTRYCLI の出力を解析します。詳細設定可能なトークンには対応していません。
dockerhuboverlapパーソナルアクセストークンDOCKERHUB_USERNAME、DOCKERHUB_PASSWORD新しいトークンには repo:read+repo:write が付与されます。
openaioverlap組織管理者キーOPENAI_ADMIN_KEY
anthropicmanual—ANTHROPIC_ADMIN_KEY作成 API はありません。rotate は Console での手順を表示し、retire は無効化します。
twiliooverlap標準 API キーTWILIO_ACCOUNT_SID、TWILIO_AUTH_TOKEN、TWILIO_API_USER
sendgridoverlapAPI キーSENDGRID_API_KEY古いキーのスコープをコピーします。
github-appephemeralインストールトークンGITHUB_APP_ID、GITHUB_APP_PRIVATE_KEY_PATH または GITHUB_APP_PRIVATE_KEY有効期間は約 1 時間です。失効処理は不要です。

AWS には aws CLI、npm には npm、--gh-secret には gh が必要です。

別のプロバイダーをお望みですか? リクエストする。

Rotation semantics

方式順序失敗時の処理
overlap作成 → 検証 → 配信 → 古いキーを無効化 →(古いキーを削除)検証に失敗するか、すべての配信に失敗した場合:新しいキーを削除し、変更はありません。一部の配信に失敗した場合:両方のキーが有効なままになり、終了コード 1 が返されます。
atomicローテーション(プロバイダーにより古いキーが失効)→ 配信 → 検証元に戻せません。すべての配信に失敗した場合:シークレットを rekey-rescue-*.secret(0600)に書き込みます。
ephemeral発行 → 検証 → 配信古いトークンは自動的に期限切れになります。
manual—手動での手順を表示します。

--delete-old-now を指定しない場合、無効化状態のない古いキーは有効なままです。 出力に retire コマンドが表示されます。対応が必要な項目がある場合、終了コードは 0 以外になります。

MCP

rekey login gitlab
claude mcp add rekey -- rekey mcp --config ~/.config/rekey/config.toml
ツール有効化方法
list_providers、check_connection、list_keysデフォルト読み取り専用です。
rotate_key--allow-rotate設定内のコンシューマーにのみ配信します。宛先の引数はありません。
retire_key--allow-retireサーバー自身のログインキーは拒否します。

シークレットの値がクライアントに返されることはありません。認証情報は環境変数または保存済みのログインから取得されます。macOS では、新しいビルドをインストールした後、キーチェーンへのアクセスを一度許可してください。

Security

  • シークレットは argv ではなく、標準入力経由でサブプロセスに渡されます。
  • rekey が作成するファイルの権限は 0600 です。既存の .env の権限は保持され、書き込みはアトミックに行われます。
  • シークレットの値は --print-secret を指定した場合にのみ表示されます。
  • 脆弱性はリポジトリの Security タブから非公開で報告してください。

Contributing

  • 新しいプロバイダーまたは機能:issue を作成してください。
  • コード:CONTRIBUTING.md を参照してください。プロバイダーは Connector トレイトを実装する 1 つのファイルです。

Links

  • crates.io: rekey
  • MCP Registry name — mcp-name: io.github.Ezra-Black/rekey

Credits

Built by Ezra Black — ezrablack.dev.

License

MIT

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。