はじめに
APIキー
APIキーは、APIへのアクセスを認証するためにクライアントに割り当てられる一意の文字列です。APIキーは、APIリクエストの一部として送信され、API Gatewayや他のAPI管理システムでそのリクエストが許可されるかどうかを判断します。
APIキーの機能と利点
- アクセス制御:
- APIキーを利用することで、APIにアクセスできるクライアントを制御できます。APIキーを持っているクライアントのみがAPIにリクエストを送信できるように設定できます。
- レート制限とクォータ管理:
- APIキーを使用すると、特定のクライアントごとにリクエスト数を制限するレート制限や、一定期間内のリクエスト数を管理するクォータを設定することができます。これにより、APIの過負荷を防止し、サービスの安定性を保つことができます。
- API使用のモニタリング:
- APIキーごとにリクエストをトラッキングすることで、どのクライアントがどれだけのリソースを使用しているかを監視できます。これにより、使用量に応じた課金やリソースの適切な割り当てが可能になります。
- 簡単な導入:
- APIキーの導入は比較的簡単で、クライアント側でも設定が容易です。これにより、APIの利用を迅速に開始することができます。
APIキーの限界とセキュリティリスク
- クライアント側での露出:
- APIキーはリクエストヘッダーに含まれるため、クライアント側で容易に露出する可能性があります。特に、公開されたクライアントアプリケーションやWebブラウザでの使用では、APIキーが第三者に漏洩するリスクがあります。
- 認証の強度が低い:
- APIキーは、ユーザーやクライアントを一意に識別する手段としては効果的ですが、暗号化された通信や署名のような強力な認証メカニズムに比べるとセキュリティ強度は低いです。APIキーが漏洩した場合、そのキーを使った不正アクセスが容易になります。
- アクセスの制御が粗い:
- APIキーは、基本的にはクライアント単位でのアクセス制御しかできないため、ユーザーごとの詳細なアクセス制御には向いていません。細かいアクセス権限を管理するためには、OAuthやJWTなどのトークンベースの認証を併用する必要があります。
- キーの管理とローテーション:
- APIキーの管理(生成、削除、ローテーションなど)は適切に行わなければなりません。特に、APIキーのローテーションが適切に行われないと、長期間にわたって同じキーが使用され、セキュリティリスクが増加します。
APIキーのセキュリティ強化策
- HTTPSを使用する:
- APIキーが送信される通信は必ずHTTPSを使用して暗号化することで、キーの盗聴を防ぎます。
- APIキーの定期的なローテーション:
- APIキーを定期的に変更(ローテーション)することで、キーが漏洩した場合のリスクを軽減します。
- IP制限:
- APIキーの使用を特定のIPアドレスに制限することで、キーが漏洩しても不正なIPアドレスからのアクセスを防ぐことができます。
- レート制限とクォータ管理:
- 過度のリクエストや不正アクセスを防ぐために、レート制限やクォータを適用します。
- 監視とアラート:
- APIキーの使用状況を監視し、不審なアクティビティが検出された場合にアラートを発する仕組みを導入します。
設定手順
- API リソース、メソッドを作成する
- メソッドのAPI RequiredをTrueに設定する
- APIリソースにステージを作成する
- APIキーを作成する
- API使用計画を作成する
- API使用計画にAPIキーをアサインする
- API使用計画にステージを追加する
- APIステージを再デプロイする
確認
- APIキーをヘッダーにつけて、APIを呼び出す
- キーが不正な場合は、403 Forbbidenエラーが発生する
curl -X POST https://xxxxx.execute-api.ap-northeast-1.amazonaws.com/{stage}/{method} -v \
-H "Content-Type: application/json" \
-H "x-api-key: xxxxx" \
-d '{"id": 1}'
IPアドレスによる制限
API GatewayのIPアドレス制限は、特定のIPアドレスやIPレンジからのみAPIにアクセスできるようにするためのセキュリティ機能です。これにより、APIのセキュリティが強化され、許可されていないIPアドレスからのリクエストがブロックされます。
IPアドレス制限の方法
API GatewayでIPアドレスを制限するには、主に以下の方法があります。
- リソースポリシーを使用する方法
- WAF(Web Application Firewall)を使用する方法
- VPCエンドポイントを使用する方法
ここでは、リソースポリシーによる方法のみに言及します。
リソースポリシーとは
リソースポリシーは、API Gatewayの特定のリソースやエンドポイントに対するアクセスを制御するためのポリシーです。リソースポリシーを使用して、特定のIPアドレスまたはIPレンジからのアクセスのみを許可する設定が可能です。
- 設定例: 特定のIPアドレスを許可するリソースポリシー
以下の例では、特定のIPアドレス203.0.113.0/24
からのみAPIにアクセスを許可しています。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "arn:aws:execute-api:{region}:{account_id}:{api_id}/{stage}/{http_verb}/{resource_path}",
"Condition": {
"IpAddress": {
"aws:SourceIp": "203.0.113.0/24"
}
}
}
]
}
Resourceの各部分の説明
{region}
:- API GatewayがデプロイされているAWSリージョンを指定します(例:
ap-northeast-1
)。
- API GatewayがデプロイされているAWSリージョンを指定します(例:
{account_id}
:- AWSアカウントIDを指定します(例:
123456789012
)。これは12桁の数字です。
- AWSアカウントIDを指定します(例:
{api_id}
:- API GatewayのIDを指定します。これはAPI Gatewayが自動的に割り当てた一意の識別子です(例:
abcdef1234
)。 - 注:Resource IDではありません。
- API GatewayのIDを指定します。これはAPI Gatewayが自動的に割り当てた一意の識別子です(例:
{stage}
:- API Gatewayのステージ名を指定します。通常は
dev
,prod
,test
などが使われます。
- API Gatewayのステージ名を指定します。通常は
{http_verb}
:- HTTPメソッドを指定します(例:
GET
,POST
,PUT
,DELETE
,PATCH
,OPTIONS
)。
- HTTPメソッドを指定します(例:
{resource_path}
:- API Gatewayのリソースパスを指定します(例:
resource
,users/{userId}
,orders
など)。 - 全リソースを指定する場合は、
*
を使うこともできます。 - {api_id}/*, {api_id}/{stage}/* も可能
- API Gatewayのリソースパスを指定します(例: