APIキーのセキュリティは、四つの習慣に集約されます。各キーに必要最小限の権限だけを与えること、適切なシークレットストアに保管すること、ダウンタイムなしでローテーションすること、そしていつか漏えいする日に備えた計画を用意しておくことです。漏えいした送信用キーは誰にでもあなたとしてメールを送らせてしまうため、データだけでなく送信者の評価も危険にさらします。
お使いのアカウントの権限名を確認してください。 本ガイドに出てくる権限名は、パターンを示す例です。MigoSMTPのアカウントで実際に提供されているオプションを使用し、機能する中で最も狭いものを選んでください。
キーが漏えいする理由
| 漏えいの経路 | 例 | 予防策 |
|---|---|---|
| リポジトリにコミットされる | キーを含む設定ファイルが公開または共有リポジトリにプッシュされる | 環境変数、無視ファイル、シークレットスキャンを使う |
| クライアントに配布される | JavaScriptやモバイルアプリの中にあるキー | 代わりに自社のサーバーを呼び出す |
| チャットやチケットで共有される | サポートのやり取りに貼り付けられたキー | シークレットマネージャー経由で共有し、露出した場合はローテーションする |
| 退職者のアカウントに残る | 元の業務委託先がまだキーを持っている | 人が離れるときにローテーションする |
| 誤ってログに出力される | デバッグログがリクエストヘッダーを出力する | ログ内のシークレットをマスクする |
| サーバーが侵害される | マルウェアが環境変数を読み取る | サーバーにパッチを適用し、各サーバーが到達できる範囲を制限する |
ステップ1:アプリケーションと環境ごとに1つのキー
本番、ステージング、メールを送信するすべてのアプリケーションごとに、別々のキーを作成します。監査ログで見分けられるように名前を付けてください。
| キー名 | 使用元 | 権限 |
|---|---|---|
| shop-production | オンラインストア、注文メール | 送信のみ |
| shop-staging | テスト環境 | 送信のみ(テスト用アドレス宛て) |
| crm-production | CRM、キャンペーン送信 | 送信と自身の連絡先の管理 |
| webhooks-reader | レポート用のジョブ | イベントの読み取りのみ |
| ops-admin | 特定の担当者、まれな作業 | 二要素認証付きのフルアクセス |
ステップ2:最小権限を適用する
それぞれのキーについて、必要な最小限のことは何かを問いかけます。メールの送信に、連絡先リストの読み取り、DNSの変更、請求の管理は必要ありません。また、レポート用のジョブは送信できてはいけません。
- メッセージを配信するだけのシステムには、送信専用のキーを優先して使います。
- アカウント、請求、ユーザー管理は、キーではなく二要素認証を設定した人間のために残します。
- 四半期ごとに権限を見直し、不要になったものを削除します。
- アカウントでIPアドレス、ドメイン、レートによる制限が使える場合は、利用してください。使える内容はアカウントのセキュリティ設定をご覧ください。
ステップ3:キーを安全に保管する
キーは実行時に環境またはシークレットマネージャーから読み込みます。最小限のパターンを以下に示します。
# .env (never commit this file)
MIGOSMTP_API_KEY=replace-with-your-key
# .gitignore
.env
*.pem
<?php
$key = getenv('MIGOSMTP_API_KEY');
if (!$key) {
throw new RuntimeException('API key is not configured');
}
シークレットスキャンを追加しましょう。 コードホストでシークレットスキャンを有効にし、ビルドパイプラインでもスキャナーを実行してください。共有ブランチに届く前にキーを検出し、すり抜けた場合にもアラートで知らせてくれます。
ステップ4:ダウンタイムなしでローテーションする
- 新しいキーを作成する。 同じ権限を付与し、日付やバージョンを含む名前を付けます。
- 保管する。 シークレットマネージャーまたは環境設定に追加します。
- デプロイする。 変更をリリースし、キーを読み込むサービスを再起動します。
- 確認する。 配信ログで、通信が新しいキーを使っていることを確かめます。
- 古いキーを無効化する。 通信が移行してから行ってください。少し待って、失敗が出ていないかを確認します。
- 記録する。 日付、理由、実施者を書き留めます。
ステップ5:不正利用を監視する
| 兆候 | 考えられる意味 | 対応 |
|---|---|---|
| 送信量が通常よりはるかに多い | キーの漏えい、またはコード内のループ | キーを一時停止して調査する |
| 新規または見慣れない宛先 | あなたのキーでスパムやフィッシングが送信されている | キーを無効化し、メッセージを確認する |
| 異常な時間帯の送信 | 自動化された不正利用 | 送信元IPを確認し、アクセスを制限する |
| バウンスや苦情の増加 | 不適切な宛先、または不正利用 | 抑制リストと送信元を確認する。スパムチェックリストを参照 |
| 新しいIPアドレスからのリクエスト | 自社のサーバー以外でキーが使われている | 許可リストを追加してローテーションする |
キーが漏えいしたら:最初の1時間
| 経過時間(分) | 実施すること |
|---|---|
| 0〜10 | キーを無効化する。まだ代替をデプロイできなくても、不正利用が続くより短い停止を受け入れる |
| 10〜30 | 新しいキーを作成してデプロイする。通常の送信を確認する |
| 30〜60 | 配信ログで、身に覚えのないメッセージがないか確認する。苦情率、バウンス率、ブロックリストを確認する |
| その後 | 漏えいの経緯を突き止め、原因を取り除き、関連するシークレットをローテーションして、学んだことを書き残す |
あなたの名義でメールが送信された場合は、ブロックリスト解除ガイドに従い、アカウントの審査に経緯が伝わるよう、サポートにもご連絡ください。
キーが露出した可能性がありますか? まずキーを無効化し、その後キーの名前と時刻を添えてご連絡ください。直近の送信内容の確認をお手伝いします。
参考資料と出典
よくある質問
メール送信用のAPIキーが特に重要なのはなぜですか?
送信用のキーを持つ人は誰でも、あなたとして送信できます。攻撃者は漏えいしたキーを使って数分のうちにフィッシングやスパムを送信し、その結果、ドメインとIPがブロックリストに載り、アカウントが停止されることがあります。被害は評判に及び、その回復には数週間かかります。
APIキーにおける最小権限とはどういう意味ですか?
各キーに、その役割に必要なことだけを許可し、それ以上は許可しないということです。Webフォームからメールを送信するためのキーは、連絡先の閲覧、ドメインの変更、請求の管理ができるべきではありません。漏えいしても、被害はそのキーに許可されていた範囲に限られます。
すべてに1つのキーを使ってもよいですか?
いいえ。アプリケーションと環境ごとに別々のキーを使ってください。1つが漏えいしても、そのキーだけを無効化でき、ログからどのシステムが送信したメッセージかが分かります。キーを共有すると、インシデント対応が遅くなり、リスクも高まります。
APIキーはどこに保管すべきですか?
環境変数またはシークレットマネージャーを使い、実行時に読み込んでください。キーをソースコード、Webサイトやモバイルアプリのフロントエンド、公開リポジトリ、チケット、チャットに入れないでください。シークレットを含む設定ファイルは、無視ファイルに追加してください。
キーはどのくらいの頻度でローテーションすべきですか?
本番用のキーは90日ごと、そしてアクセス権を持つ人が退職したとき、ノートパソコンを紛失したとき、漏えいが疑われるときにはすぐに、というのが一般的な基準です。間隔より重要なのは、すでに実践したことのあるローテーションの手順を持っていることです。
ダウンタイムなしでキーをローテーションするにはどうすればよいですか?
新しいキーを作成し、シークレットストアに追加し、変更をデプロイして、通信が新しいキーを使っていることを確認してから、最後に古いキーを無効化します。先に無効化してはいけません。デプロイ中に障害が発生します。
キーが漏えいした場合はどうすればよいですか?
ただちにキーを無効化し、代わりのキーを作成してデプロイし、直近の送信に身に覚えのないメッセージがないかを確認し、ブロックリストへの登録や苦情の急増がないかを調べます。そのうえで、どのように漏えいしたのかを突き止め、その経路をふさいでください。
キーが悪用されていることはどうすれば分かりますか?
急な送信量の増加、新規または普段と異なる宛先、深夜などの異常な時間帯の送信、バウンスや苦情の増加、見慣れないIPアドレスからのリクエストに注目します。送信量とバウンス率のアラートを設定しておくと、早期に気づけます。
SMTP認証情報はAPIキーと違うものですか?
どちらも送信が許可されていることを証明するという同じ目的を持ち、同じ注意が必要です。SMTPのユーザー名とパスワードはAPIキーと同様に扱い、アプリケーションごとに1組を使い、シークレットとして保管し、定期的にローテーションしてください。接続の詳細はSMTP設定ガイドをご覧ください。
モバイルアプリやWebページのJavaScriptにAPIキーを入れてもよいですか?
いいえ。デバイスやブラウザに配布されたものは、すべて取り出される可能性があります。メールは自社のサーバーから送信し、アプリやページにはそのサーバーを呼び出させて、サーバーがキーを使ってメールAPIを呼び出すようにしてください。