API Gatewayメソッドの認証設定の確認

保護が必要なAPI Gatewayメソッドに、呼び出し元の認証と必要な権限確認を適用してください。

説明

aws_api_gateway_method.authorization = "NONE"の場合、API Gatewayはそのメソッドの呼び出し元を認証しません。保護すべき機能に他の制御もなければ、意図しない利用者がデータを読んだり操作したりするおそれがあります。

公開コンテンツやCORSプリフライトには、認証のないメソッドが適切な場合があります。リソースポリシーやバックエンドの認証・認可もアクセスに影響し、OPTIONSへの応答だけでは他のメソッドを保護できません。

想定される影響

  • 必要な権限を持たない利用者が保護対象の機能を呼び出すおそれがあります。
  • 読み取りAPIから非公開のデータが漏えいする可能性があります。
  • 書き込みAPIの不正利用が、費用の増加やデータの改ざんにつながるおそれがあります。

対処方法

  • 各メソッドを公開する必要があるか確認し、保護対象にはIAM、Cognito、Lambda Authorizerなど適切な認証を適用してください。
  • 認証された利用者の操作権限も制限し、実際のステージに変更をデプロイしてください。
  • 意図的に公開するAPIにも、適切なアクセスポリシー、利用制限、監査ログを構成してください。

例

同じGETメソッドの認証設定を比較する抜粋です。API、リソース、統合、Lambda Authorizerと呼び出し権限は別途構成してください。

変更前

hcl
resource "aws_api_gateway_method" "example" {
  rest_api_id   = aws_api_gateway_rest_api.this.id
  resource_id   = aws_api_gateway_resource.this.id
  http_method   = "GET"
  authorization = "NONE"

  request_parameters = {
    "method.request.path.proxy" = true
  }
}

変更後

hcl
resource "aws_api_gateway_method" "example" {
  rest_api_id   = aws_api_gateway_rest_api.this.id
  resource_id   = aws_api_gateway_resource.this.id
  http_method   = "GET"
  authorization = "CUSTOM"
  authorizer_id = aws_api_gateway_authorizer.this.id

  request_parameters = {
    "method.request.path.proxy" = true
  }
}

説明:

  • 変更前: GETはAPI Gatewayによる呼び出し元の認証を使いません。リソースポリシーとバックエンドの制御も確認してください。
  • 変更後: 同じGETにCUSTOM認証とAuthorizerを関連付けています。許可した呼び出しが成功し、許可していない呼び出しが拒否されることを確認してください。

参考資料