AppSync GraphQL APIでのAPIキーによる認証について

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、「どうやって直すのか?」 という具体的な修復手順(コンソール、AWS CLI、Terraformなど)まで、分かりやすく解説します。
クラウドセキュリティで検出される課題を改修するシリーズです。 この記事では、AppSync GraphQL APIの認証にAPIキーが使用されているについて解説します。

ポリシーの説明
Security Hub コントロール AWS AppSync – AWS Security Hub
[AppSync.5] AWS AppSync GraphQL APIsは API キーで認証しないでください
このコントロールは、アプリケーションが API キーを使用して AWS AppSync GraphQL API とやり取りするかどうかをチェックします。 AWS AppSync GraphQL API が API キーで認証されている場合、コントロールは失敗します。
リスク: AppSync GraphQL APIの認証方法としてAPIキーが使用されている場合、以下のようなセキュリティリスクが高まります。
- 侵害の可能性: APIキーはアプリケーション内にハードコードされることが多く、リバースエンジニアリング、意図しない公開(コードリポジトリへのコミット、ログへの記録など)によって容易に侵害される可能性があります。
- アクセス制御の脆弱性: APIキーは通常、リクエストの発行者を識別するだけであり、きめ細かいアクセス制御を行うには不十分です。侵害されたAPIキーを持つ攻撃者は、APIに対して広範な操作を実行できる可能性があります。
- 監査の困難性: APIキーの使用状況を追跡し、特定のアクションがどのアプリケーションまたはユーザーによって実行されたかを監査することが困難になります。
- ローテーションの複雑性: APIキーが侵害された場合、すべてのアプリケーションでキーを更新する必要があり、大規模なシステムでは運用上の負担が大きくなります。また、ローテーションを強制する仕組みがないため、侵害されたキーが長期間使用され続けるリスクがあります。
対策: AppSync GraphQL APIの認証には、より安全で柔軟な認証方法であるAWS Lambda、AWS IAM、OpenID Connect (OIDC)、またはAmazon Cognitoユーザープールのいずれかを使用することが推奨されます。
- AWS Lambdaオーソライザーへの移行: カスタム認証ロジックが必要な場合は、AWS Lambda関数をオーソライザーとして使用します。これにより、トークンの検証、認可ロジックの実装、きめ細かいアクセス制御などが可能になります。
- AWS IAM認証への移行: AWSの認証情報(IAMユーザー、IAMロール)を使用してAPIにアクセスさせることができます。これにより、IAMの強力なアクセス管理機能と統合できます。
- OpenID Connect (OIDC) 認証への移行: 既存のIDプロバイダー(Okta、Auth0など)と連携する場合は、OIDC認証を使用します。これにより、外部の認証システムを利用してAPIへのアクセスを制御できます。
- Amazon Cognitoユーザープールへの移行: スケーラブルなユーザーディレクトリと認証機能が必要な場合は、Amazon Cognitoユーザープールを使用します。ユーザーの登録、認証、認可を容易に管理できます。
- APIキーの使用箇所の特定と段階的な移行: 現在APIキーを使用している箇所を特定し、より安全な認証方法への段階的な移行計画を立てます。
修復方法
AWSコンソールでの修復手順
AWSコンソールを用いて、AppSync GraphQL APIの認証方法をAPIキーからより安全な方法に変更します。
- AWSコンソールにログインします。
- ナビゲーションペインから AWS AppSync を選択します。
- GraphQL APIのリストから、該当するAPIの名前をクリックします。
- 左側のメニューから 設定 を選択します。
- デフォルト認証モード セクションを確認します。「認証モード」が「APIキー」になっている場合、編集 をクリックします。
- 「デフォルト認証モード」で、AWS IAM、Amazon Cognitoユーザープール、OpenID Connect、または AWS Lambdaオーソライザー のいずれかを選択します。

- 選択した認証モードに必要な設定(例:CognitoユーザープールのID、OIDCプロバイダーの詳細、LambdaオーソライザーのARNなど)を入力します。
- 必要に応じて、複数の認証モードを設定することも可能です。その場合は、「追加の認証モード」セクションで同様に設定を行います。
- 保存 ボタンをクリックして変更を適用します。
- APIキーを使用しているクライアントアプリケーションを、新しい認証方法を使用するように更新します。
- 古いAPIキーが不要になった場合は、左側のメニューから APIキー を選択し、該当するAPIキーを選択して 削除 をクリックします。
Terraformでの修復手順
TerraformでAppSync GraphQL APIの認証モードを設定するには、aws_appsync_graphql_api
リソースの authentication_type
パラメータを API_KEY
以外(AWS_IAM
、AMAZON_COGNITO_USER_POOLS
、OPENID_CONNECT
、AWS_LAMBDA
)に設定します。また、選択した認証モードに応じて追加の設定が必要です。
resource "aws_appsync_graphql_api" "example" {
name = "my-api"
authentication_type = "AMAZON_COGNITO_USER_POOLS" # 例:Cognitoユーザープールを使用する場合
user_pool_config {
user_pool_id = "us-west-2_xxxxxxxxx"
aws_region = "us-west-2"
default_action = "ALLOW"
}
schema = <<EOF
type Query {
hello: String
}
EOF
}
# APIキーを使用する場合は aws_appsync_api_key リソースを定義
# resource "aws_appsync_api_key" "example" {
# api_id = aws_appsync_graphql_api.example.id
# description = "My API Key"
# }
上記の例では、aws_appsync_graphql_api
リソースの authentication_type
を AMAZON_COGNITO_USER_POOLS
に設定し、関連する user_pool_config
を定義しています。APIキーを使用する場合は、aws_appsync_api_key
リソースを別途定義しますが、セキュリティの観点からは非推奨です。
既存のAPIの認証モードを変更する場合は、該当する aws_appsync_graphql_api
リソースを修正し、terraform apply
を実行します。APIキーを削除する場合は、対応する aws_appsync_api_key
リソースを Terraform の設定から削除し、terraform apply
を実行します。
最後に
この記事では、AppSync GraphQL APIの認証にAPIキーを使用することによるセキュリティリスクと、より安全な認証方法への移行について解説しました。APIキーはセキュリティ上の懸念が多いため、可能な限り他の認証方法への移行を推奨します。
こちらの内容の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。運用が非常にラクに出来る製品になっていますのでぜひ興味がある方はお問い合わせお待ちしております。
最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。