LoginSignup
0
0

More than 3 years have passed since last update.

TerraformでAmazon API Gatewayを構築する(リソースポリシー編)

Posted at

はじめに

API Gateway+Terraform記事第4弾。
TerraformのAWSプロバイダの3.16.0で2020/11/18にリソースポリシーの Terraform リソースが使えるようになったので、今回は、IPアドレスによる制限をさっそく試してみる。

Terraform

とはいっても、普通にIAMポリシーを書くだけである。

Condition(IpAddress)を使って許可をしてするよう、こんな感じで定義しよう。

resource "aws_api_gateway_rest_api_policy" "test" {
  rest_api_id = aws_api_gateway_rest_api.test.id
  policy      = data.aws_iam_policy_document.test.json
}

data "aws_iam_policy_document" "test" {
  statement {
    effect = "Allow"

    principals {
      type = "*"
      identifiers = [
        "*",
      ]
    }

    actions = [
      "execute-api:Invoke",
    ]

    resources = [
      "arn:aws:execute-api:${data.aws_region.current.name}:${data.aws_caller_identity.self.account_id}:${aws_api_gateway_rest_api.test.id}/*",
    ]

    condition {
      test     = "IpAddress"
      variable = "aws:SourceIp"

      values = [
        "xxx.xxx.xxx.xxx/32",
      ]
    }
  }
}

なお、resources の部分については、AWS公式の開発者ガイドでは、execute-api:/[ステージ名]/[メソッド]/[リソース名] にすれば良い感じに ARN に変換してくれるよ、と書いてあるのだが、良い感じに変換してもらえるがために、毎回 Terraform の差分として検出されるようになってしまうため、素直に↑のように ARN 形式で書いておこう。

"*" の部分については、上記の通り [ステージ名]/[メソッド]/[リソース名] で書くことも可能。

これで許容されていないIPアドレスでアクセスすると、

{"Message":"User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:ap-northeast-1:************:xxxxxxxxxx/prod/GET/xxxxxxxx"}

な感じでエラーが応答される。

アクセスログを設定している場合は、以下のように 403 応答を返したログが出力される。

{
    "requestId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "ip": "xxx.xxx.xxx.xxx",
    "caller": "-",
    "user": "-",
    "requestTime": "26/Nov/2020:13:51:55 +0000",
    "httpMethod": "GET",
    "resourcePath": "/xxxxxxxx",
    "path": "/prod/xxxxxxxx",
    "status": "403",
    "protocol": "HTTP/1.1",
    "responseLength": "168",
    "integrationLatency1": "-",
    "integrationRequestId": "-",
    "integrationStatus1": "-",
    "integrationErrorMessage": "-",
    "integrationLatency2": "-",
    "integrationStatus2": "-",
    "responseLatency": "1",
    "errorMessage": "User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:ap-northeast-1:************:xxxxxxxxxx/prod/GET/xxxxxxxx"
}

あとは、AWS公式の開発者ガイドに書いてある

API 作成後にリソースポリシーを更新する場合は、更新後のポリシーをアタッチしてから API をデプロイし、変更を伝達する必要があります。ポリシーのみ、更新または保存した場合、API のランタイム動作が変更されることはありません。API のデプロイの詳細については、「Amazon API Gateway での REST API のデプロイ」を参照してください。

が注意点といったところか。

これで、API Gatewayをよりセキュアに運用できるようになった!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0