【図解】APIキーとは?しくみと持ち主・2つのキーでの入れ替え・漏れたときの対処を初心者向けに解説

前回、API の認証方式を6つ並べたときに、いちばん手軽で、いちばん扱いに気をつけたいのが API キーだと感じました。発行するのは画面のボタン1つですが、そのあと「どこに置くか」「いつ入れ替えるか」「漏れたらどうするか」まで決めておかないと、長く使われる秘密が増えていきます。この記事では、API キーのしくみと一生(発行から取り消しまで)を、Microsoft・Cisco Meraki・GitHub・OWASP のドキュメントで確かめながら図にしました。

この記事でわかること
  1. API キーとは何か。パスワードやトークンとの違い
  2. キーの送り方と、API 側での確かめ方
  3. キーは「誰のもの」か(管理者・サブスクリプション・リソース)
  4. 保管・2つのキーでの入れ替え・取り消しと、漏れに気づくしくみ
  5. API キーで済ませてよい場面と、避けたい場面

API キーとは

API キーは、サービスが発行するランダムな文字列で、API を呼ぶたびにリクエストに付けて送ります。API の側は、受け取ったキーを自分の台帳で引いて、「誰のキーか」「何をしてよいか」を判断します。キーの文字列そのものに意味はなく、台帳とつながって初めて意味を持ちます。

項目パスワードAPI キーアクセストークン
誰が作るか利用者が決めるサービスが作る発行元がサインインのあとに作る
使うもの人のサインインプログラムからの呼び出しプログラムからの呼び出し
期限変えるまで取り消すまでのことが多い短い(1時間前後など)
漏れたとき変えるまで使われる取り消すまで使われる期限が来れば使えなくなる

トークンとの違いは、セッションとトークンの記事やAPI の認証方式の記事でも比べています。

送り方と、API 側の確かめ方

API キーが発行されてから使われるまでを、やり取りの順に並べると次のようになります。

管理者管理ポータルKey Vaultキーの保管場所アプリAPI の提供側入口・キーの台帳① キーの発行を頼む(画面の操作)台帳に登録キー→持ち主② キー③ 保管する④ 読み出す⑤ キー⑥ リクエスト+キーのヘッダ台帳で持ち主を引く⑦ 結果(無効なキーなら 401)キーの文字列に意味はなく、API の提供側が台帳で「誰のキーか」を引く
図1 API キーの発行から利用までの流れ

キーを入れる場所は、サービスごとに決まっています。

サービスキーを入れる場所
Azure の AI サービス(Translator など)Ocp-Apim-Subscription-Key ヘッダ
Azure API Management で公開した APIOcp-Apim-Subscription-Key ヘッダ(名前は API ごとに変えられる)
Cisco Meraki Dashboard APIAuthorization: Bearer の形

例:Translator にキーを付けて送る(Microsoft のドキュメントの例)

curl -X POST 'https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&from=en&to=de' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
-H 'Content-Type: application/json' \
--data-raw '[{ "text": "How much for the cup of coffee?" }]' | json_pp

API Management の場合、受け取ったキーが有効なサブスクリプションのものかを確かめ、そのサブスクリプションの範囲に入る API なら通します。キーが無効なら、401(Access denied)で断ります。

URL に入れない・裏側に渡さない

API Management はクエリ文字列(subscription-key)でもキーを受け取れますが、URL はログや履歴に残りやすいので、OWASP はパスワードやトークン、API キーを URL に入れないよう求めています。また、API Management は受け取ったキーを、既定ではそのままバックエンドにも渡します。バックエンドのログに残したくなければ、ポリシーでヘッダを外します。

キーは「誰のもの」か

API キーの権限は、そのキーが結び付いている「持ち主」の権限です。持ち主の種類は、サービスによって大きく3つに分かれます。

管理者に結び付くキーの権限 =発行した管理者の権限例:Meraki Dashboard API の場合1人が持てる有効なキーは2本まで期限はなく、取り消すまで有効サブスクリプションに結び付くキーの権限 =契約(サブスクリプション)の範囲例:Azure API Management の場合範囲は製品・1つの API・全 API回数の上限をサブスクリプションごとに全 API 用のキーはアプリに入れないリソースに結び付くキーの権限 =そのリソースへのアクセス例:Azure の AI サービスの場合リソースごとに KEY1・KEY2 の2本誰が使っても同じ権限細かな権限は Entra ID と RBAC で管理者サブスクリプション主キー・副キーリソース上段はその型に共通する考え方、下段は例に挙げたサービスでの決まり
図2 キーの持ち主の3つの型
型この型に共通すること例のサービスでの決まり
管理者に結び付くキーは、発行した管理者と同じ権限を持つMeraki Dashboard API の場合:1人が同時に持てる有効なキーは2本まで。期限はなく、取り消すまで有効
サブスクリプションに結び付くキーは、契約(サブスクリプション)で決めた範囲の API に使えるAzure API Management の場合:範囲を製品・1つの API・全 API から選べる。回数の上限(クォータ、レート制限)をサブスクリプションごとにかけられる。全 API に使える組み込みのサブスクリプションのキーは、アプリに入れない
リソースに結び付くキーは、そのリソースへのアクセスを表す。誰が使っても同じ権限になるAzure の AI サービスの場合:リソースごとに KEY1 と KEY2 の2本がある。Azure AI Search の場合:管理キーは読み書きすべてができる

キーの本数や期限、範囲の決め方はサービスごとに違います。表の右の列は、例に挙げたサービスでの決まりです。

「人ごとに権限を分けたい」「誰が呼んだかを残したい」という要件には、リソースに結び付くキーは向きません。Microsoft のドキュメントでも、AI サービスのキーは手軽に始められる一方で、Azure の役割ベースのアクセス制御(RBAC)が必要な場面には足りない、と説明しています。

キーの一生:発行から取り消しまで

API キーは、作ったあとの扱いで安全さが決まります。

発行持ち主と範囲を決める保管Key Vault に置く使うHTTPS・ヘッダで入れ替え定期的に作り直す取り消し漏れたらすぐAPI キーの一生漏れに気づくしくみGitHub のシークレットスキャンプッシュ保護(push protection)見つかったら取り消しへ
図3 API キーの一生

保管:コードに書かない

Microsoft のドキュメントは、API キーをコードに直接書かず、公開もしないこと、使う場合は Azure Key Vault に置き、定期的に入れ替え、Key Vault への接続は役割と通信の制限で絞るよう求めています。OWASP も、シークレットには必要最小限の権限だけを与えるよう勧めています。

それでも、うっかりコードに入れてしまうことはあります。GitHub には、これに気づくしくみがあります。

しくみ何をするか
シークレットスキャンリポジトリのすべてのブランチの履歴から、書き込まれた資格情報を見つける。対応するサービスのキーが見つかると、そのサービスに知らせ、サービス側でキーを取り消すなどの対応ができる
プッシュ保護シークレットを含むプッシュを、リポジトリに届く前に止める。止めたのを押し切った場合は、アラートが作られる

入れ替え:2つのキーで止めずに替える

多くの Azure のサービスは、キーを2本ずつ用意しています。キーを作り直すと古い値はすぐ使えなくなるので、2本を交互に使うことで、サービスを止めずに入れ替えられます。

① キー1だけ使うキー1使用中キー2未使用② キー2を作り直すキー1使用中キー2新しい値③ アプリをキー2へキー1未使用キー2使用中止めずに入れ替え④ キー1を作り直すキー1新しい値キー2使用中作り直すと古い値はすぐ使えなくなる。使っているキーを作り直すと 401 になる
図4 2つのキーでの入れ替え
手順やること(Azure の AI サービスの手順)
①両方のキーを使っているなら、アプリをキー1だけに寄せる
②使っていないキー2を作り直す(ポータルの Keys and Endpoint で Regenerate Key 2)
③アプリを新しいキー2に切り替える。ログなどで、全員が切り替わったことを確かめる
④キー1を作り直す。次の入れ替えでは、キー1とキー2の役割を逆にする
自動では入れ替わらない

Azure API Management は、サブスクリプションキーに期限を付けたり、自動で入れ替えたりする機能を持っていないと、ドキュメントで明記しています。定期的な入れ替えは、PowerShell や SDK で自分たちの手順として自動化します。期限付きのアクセスが必要なら、トークンのように期限を持つしくみを使います。Azure AI Search のドキュメントでも、2本の管理キーを同時に作り直すと、キーを使うリクエストはすべて 403 になると注意しています。

取り消し:漏れたらすぐ

OWASP は、漏れたキーはすぐに取り消すよう求めています。サービスごとの止め方は次のとおりです。

サービス止め方
Azure の AI サービス漏れたキーを作り直す(古い値はすぐ使えなくなる)
Azure API Managementサブスクリプションを一時停止・キャンセル・削除する、またはキーを作り直す
Meraki Dashboard APIAPI キーの画面(Organization ›› API & Webhooks ›› API keys and access)で取り消す

取り消したあとは、そのキーで何が呼ばれたかをログで確かめ、新しいキーをアプリに配り直します。

API キーで済ませてよい場面・避けたい場面

OWASP は、API キーはサービス妨害の影響を減らすのに役立つ一方、第三者に配ると漏れやすいので、重要なリソースを API キーだけで守らないよう勧めています。

向いている場面避けたい場面
どのアプリ(契約)からの呼び出しかを見分け、回数の上限をかけたい人ごとに権限を分けたい、誰が操作したかを残したい
製品やサービスの API を、まず手軽に試したい重要なデータや設定を、キーだけで守る
相手のサービスがキーにしか対応していないAzure の中で動くプログラムから Azure のサービスを呼ぶ

Azure の中で動くプログラムなら、Microsoft はキーではなく、Microsoft Entra ID とマネージド ID で認証することを勧めています。Entra ID に移したあとは、リソースの disableLocalAuth を有効にしてキーでの認証を止められます。Azure AI サービスでは、Azure Policy でサブスクリプション全体に強制することもできます。

企業での例

場面キーの型運用のポイント
取引先に、API Management で自社の API を公開するサブスクリプション取引先ごとにサブスクリプションを分け、範囲と回数の上限をかける。漏れたらその取引先のサブスクリプションだけを止める
社内アプリから Azure の AI サービス(Translator、Azure OpenAI など)を呼ぶリソースまずキーで試し、本番はマネージド ID と Entra ID に移してキーを無効にする
運用の自動化ツールで Meraki の設定を取得・変更する管理者自動化専用の管理者を作り、必要な権限だけを与えてからキーを発行する
社内の検索アプリから Azure AI Search を呼ぶリソース検索だけのアプリには、読み書きできる管理キーを渡さない。役割(RBAC)への移行も検討する

まとめ

項目ポイント
API キーサービスが作るランダムな文字列。API 側の台帳で持ち主と権限を引く
送り方サービスごとに決まったヘッダ。URL に入れない
持ち主管理者・サブスクリプション・リソースの3つの型。キーの権限は持ち主の権限
保管コードに書かず Key Vault へ。GitHub のシークレットスキャンとプッシュ保護で漏れに気づく
入れ替え2本のキーを交互に作り直す。自動では入れ替わらない
取り消し漏れたらすぐ。サービスごとの止め方を決めておく
使いどころアプリの見分けと回数制限には便利。重要なものはキーだけで守らない

参考にした資料

この記事は、次の公式ドキュメントと資料で内容を確かめて書きました。仕様や対応状況は変わることがあるので、最新の情報はリンク先で確かめてください。

あとがき

調べてみて意外だったのは、API Management のように API キーを中心にしたサービスでも、キーの期限や自動の入れ替えは「自分たちで作るもの」とはっきり書かれていたことです。発行するときに、入れ替えの手順と止め方までセットで決めておく。これだけで、キーはずっと扱いやすくなると感じました。キーの権限は持ち主の権限そのものなので、「誰のキーとして発行するか」を最初に考えるのも大事なところです。

コメント