コンテンツにスキップ

API キーの管理

GPUStack は API キーによる認証に対応しています。各 GPUStack ユーザーは、自分の API キーを生成して管理できます。

API キーの作成

  1. Access Control > API Keys ページに移動します。
  2. Add API Key ボタンをクリックします。
  3. API キーの Name と Description を入力し、Expiration を選択します。
  4. API キーの Type を選択します。
  • 自動生成:GPUStack が API キーを生成します。
  • カスタム:Key フィールドに独自のキー値を入力します。カスタムを選んだ場合、このフィールドは必須です。覚える必要のないパスワードと同程度の強度を持つ値を選んでください。下の注意を参照してください。
  1. Access Permissions 欄で、API キーの権限を選択します。
  • プラットフォーム管理:ユーザー、モデル、Worker などのプラットフォーム管理エンドポイントへのアクセスを許可します。
  • モデルアクセス:推論 API へのアクセスを許可します。選択した場合は、All models または Allowed models を選びます。Allowed models の場合は、この API キーでアクセスできるモデルを一覧から選択します。

権限を選択しなかった API キーには、アクセス権限がありません。 6. Save ボタンをクリックします。 7. キーをコピーして安全な場所に保存し、Done ボタンをクリックします。

注記

API キーの完全な値は、作成時に一度だけ表示されます。その後はマスクされた値だけが表示されます。カスタムキーは、自分で値を把握しているため例外です。

カスタムキーの強度は指定する値で決まります

GPUStack は任意の文字列をカスタムキーとして受け入れるため、ランダムな値と 123456 を区別できません。自動生成キーは暗号学的乱数源から生成した 128 ビットの値であり、誤って弱いキーが作成されることはありません。

この違いは、推測されやすさ以外にも重要です。Server ではなく API ゲートウェイでキーを認証するため、GPUStack は各キーの高速なハッシュをゲートウェイ構成に公開します。その構成を読める人はハッシュを取得でき、診断バンドルにも含まれます。カスタムキーのハッシュはソルトを使用せず、シークレットだけで決まるため、すべてのデプロイで同じ値になります。一度作った事前計算テーブルを、すべてのデプロイに対して使えます。ランダムなキーは、いずれにせよ探索が現実的ではないため影響しませんが、推測しやすいキーはオフラインで安価に復元できるようになります。

可能な限り、乱数源からカスタムキーを生成してください。人が手動で選ぶ場合は、GPUSTACK_GATEWAY_AUTH_ALLOW_CUSTOM_KEYS=false を設定してください。カスタムキーは従来どおり各リクエストで Server が認証し、ハッシュは公開されなくなります。ゲートウェイには、その ID のキーの存在と有効期限だけが通知されるため、Server が停止中でもキーの無効化が機能します。

この設定は新しいキーだけでなく、既存のキーにも適用されます。無効にすると、有効中に作成されたカスタムキーのハッシュは、次の再同期時に取り下げられます。

アクセス権限の編集

  1. Access Control > API Keys ページに移動します。
  2. 編集する API キーを探します。
  3. Operations 列の Edit ボタンをクリックします。
  4. 必要に応じて Description を更新します。
  5. Access Permissions 欄で、選択した権限を調整します。
  • プラットフォーム管理:ユーザー、モデル、Worker などのプラットフォーム管理エンドポイントへのアクセスを許可します。
  • モデルアクセス:推論 API へのアクセスを許可します。選択した場合は、All models または Allowed models を選びます。Allowed models の場合は、この API キーでアクセスできるモデルを一覧から選択します。
  1. Save ボタンをクリックします。

注記

変更は 1 分以内に有効になります。

API キーの削除

  1. Access Control > API Keys ページに移動します。
  2. 削除する API キーを探します。
  3. Operations 列の Delete ボタンをクリックします。
  4. 削除を確認します。

Server が利用できない間にキーを停止する

通常はキーを削除すれば十分です。Server が API ゲートウェイに通知し、数秒以内にそのキーが受け入れられなくなります。この節は、アップグレード中など、GPUStack Server が停止していて、キーを今すぐ停止する必要がある場合だけを対象とします。

ゲートウェイは、受け入れてよいキーのコピーを保持しているため、Server が利用できない間も推論を提供できます。そのコピーは Server 内ではなく Kubernetes にあるので、Server なしで編集できます。

kubectl -n higress-system edit wasmplugin gpustack-llm-ext-auth

spec.defaultConfig.local_auth の下からキーのエントリーを削除します。ほとんどの場合は keys にあり、キーのアクセスキーで索引付けされています。自動生成キーでは、gpustack_<access key>_<secret> の中央の部分です。カスタムキーの内部にはアクセスキーがないため、代わりに所有者の数値 user_id で keys を検索するか、exp 値をキーの有効期限と照合してください。

GPUSTACK_GATEWAY_AUTH_ALLOW_CUSTOM_KEYS が false の場合、カスタムキーは代わりに refs にあり、API に表示される数値のキー ID で索引付けされています。

どちらにも存在しないキーは、すでに各リクエストで Server に問い合わせています。そのため削除するものはなく、Server が復旧して削除を処理した時点で機能しなくなります。

変更は、このリソースの他の変更と同じ仕組みで伝わり、保存後数秒以内にゲートウェイへ到達します。すでに進行中のセッションにも適用されます。ゲートウェイが Server に問い合わせず受け入れるものは、先にこれらのエントリーと再照合されるため、1 つのエントリーを削除すると、すべての場所で同時に無効になります。

警告

これは一時的な対処であり、正式な失効処理ではありません。Server は起動後数秒以内にデータベースから一覧を再構築するため、ここでだけ削除したキーは Server の復旧時に戻ります。Server が利用可能になったら、通常の方法でもキーを削除してください。

注記

このリソースを編集するには、ゲートウェイを実行するクラスターへのアクセスが必要です。上記の higress-system は既定のゲートウェイの名前空間です。変更している場合は置き換えてください。GPUStack データベースを直接編集する方法には対応しておらず、デプロイの整合性を損なう可能性があります。

この名前空間を読めるユーザー

同じリソースには、ゲートウェイが内部 ID トークンに署名するためのキーも含まれます。そのため、ゲートウェイの名前空間のリソースを読める人はトークンを生成し、任意のユーザーとして受け入れられる可能性があります。この読み取り権限は、プラットフォームレベルの権限として扱い、相応に付与してください。

API キーの使用

GPUStack は API キーを Bearer トークンとして使用できます。

OpenAI 互換の GET /v1/models エンドポイントは、ユーザーと現在の組織コンテキストから見える、準備済みのモデルだけを返します。API キーを許可モデルに制限している場合、一覧は組織プレフィックス(team-a/qwen3 など)を含む、それらのモデル ID にさらに絞り込まれます。これは、従来の GET /v1-openai/models エンドポイントと、管理者が作成したキーにも適用されます。allowed_model_names 一覧が未設定または空の場合、追加のモデル制限は課されません。

curl を使用する例を次に示します。

export GPUSTACK_API_KEY=your_api_key
curl http://your_gpustack_server_url/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $GPUSTACK_API_KEY" \
  -d '{
    "model": "qwen3",
    "messages": [
      {
        "role": "system",
        "content": "You are a helpful assistant."
      },
      {
        "role": "user",
        "content": "Hello!"
      }
    ],
    "stream": true
  }'