

# Amazon API Gateway のアイデンティティベースのポリシーの例
<a name="security_iam_id-based-policy-examples"></a>

デフォルトでは、IAM ユーザーとロールには API Gateway リソースを作成または変更するためのアクセス許可はありません。AWS マネジメントコンソール、AWS CLI、または AWS SDK を使用してタスクを実行することもできません。IAM 管理者は、ユーザーとロールに必要な、指定されたリソースで特定の API オペレーションを実行するアクセス許可をユーザーとロールに付与する IAM ポリシーを作成する必要があります。続いて、管理者はそれらのアクセス許可が必要な IAM ユーザーまたはグループにそのポリシーをアタッチします。

IAM ポリシーの作成方法の詳細については、* IAM ユーザーガイド* の [「[JSON] タブでのポリシーの作成 ](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-json-editor)」を参照してください。API Gateway 固有のアクション、リソース、条件の詳細については、「[Amazon API Gateway Management のアクション、リソース、および条件キー](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonapigatewaymanagement.html)」および「[Amazon API Gateway Management V2 のアクション、リソース、および条件キー](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonapigatewaymanagementv2.html)」を参照してください。

**Topics**
+ [ポリシーに関するベストプラクティス](#security_iam_service-with-iam-policy-best-practices)
+ [ユーザーが自分の権限を表示できるようにする](#security_iam_id-based-policy-examples-view-own-permissions)
+ [シンプルな読み取りアクセス許可](#api-gateway-policy-example-apigateway-general)
+ [REQUEST または JWT オーライザだけを作成する](#security_iam_id-based-policy-examples-v2-import)
+ [デフォルトの `execute-api` エンドポイントが無効になっていることを要求する](#security_iam_id-based-policy-examples-v2-endpoint-status)
+ [ユーザーにプライベート REST API の作成または更新のみを許可する](#security_iam_id-based-policy-examples-private-api)
+ [API ルートに認可を要求する](#security_iam_id-based-policy-examples-require-authorization)
+ [ユーザーが VPC リンクを作成または更新することを防止する](#security_iam_id-based-policy-examples-deny-vpc-link)
+ [ルーティングルールを使用するためのポリシーの例](#security_iam_id-based-policy-examples-routing-mode)

## ポリシーに関するベストプラクティス
<a name="security_iam_service-with-iam-policy-best-practices"></a>

ID ベースのポリシーは、あるユーザーがアカウント内で API Gateway リソースを作成、アクセス、または削除できるどうかを決定します。これらのアクションでは、AWS アカウント に費用が発生する場合があります。アイデンティティベースポリシーを作成したり編集したりする際には、以下のガイドラインと推奨事項に従ってください:
+ **AWS マネージドポリシーの使用を開始し、最小特権のアクセス許可に移行する** – ユーザーとワークロードへのアクセス許可の付与を開始するには、多くの一般的なユースケースのためにアクセス許可を付与する *AWS マネージドポリシー*を使用します。これらは AWS アカウントで使用できます。ユースケースに固有の AWS カスタマー管理ポリシーを定義して、アクセス許可を絞り込むことをお勧めします。詳細については、*IAM ユーザーガイド* の [AWS マネージドポリシー](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies) または [ジョブ機能の AWS マネージドポリシー](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_job-functions.html) を参照してください。
+ **最小特権を適用する** – IAM ポリシーでアクセス許可を設定する場合は、タスクの実行に必要な許可のみを付与します。これを行うには、特定の条件下で特定のリソースに対して実行できるアクションを定義します。これは、*最小特権*アクセス許可とも呼ばれています。IAM を使用して許可を適用する方法の詳細については、*IAM ユーザーガイド* の [IAM でのポリシーとアクセス許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html) を参照してください。
+ **IAM ポリシーで条件を使用してアクセスをさらに制限する** - ポリシーに条件を追加して、アクションやリソースへのアクセスを制限できます。たとえば、ポリシー条件を記述して、すべてのリクエストを SSL を使用して送信するように指定できます。また、CloudFormation などの特定の AWS のサービス を介して使用する場合、条件を使用してサービスアクションへのアクセスを許可することもできます。詳細については、*IAM ユーザーガイド* の [IAM JSON ポリシー要素:条件](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html) を参照してください。
+ **IAM アクセスアナライザー を使用して IAM ポリシーを検証し、安全で機能的な権限を確保する** - IAM アクセスアナライザー は、新規および既存のポリシーを検証して、ポリシーが IAM ポリシー言語 (JSON) および IAM のベストプラクティスに準拠するようにします。IAM アクセスアナライザーは 100 を超えるポリシーチェックと実用的な推奨事項を提供し、安全で機能的なポリシーの作成をサポートします。詳細については、*IAM ユーザーガイド* の [IAM Access Analyzer でポリシーを検証する](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-validation.html) を参照してください。
+ **多要素認証 (MFA) を要求する** – AWS アカウントで IAM ユーザーまたはルートユーザーを要求するシナリオがある場合は、セキュリティを強化するために MFA をオンにします。API オペレーションが呼び出されるときに MFA を必須にするには、ポリシーに MFA 条件を追加します。詳細については、*IAM ユーザーガイド* の [MFA を使用した安全な API アクセス](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_configure-api-require.html) を参照してください。

IAM でのベストプラクティスの詳細については、「*IAM ユーザーガイド*」の「[IAM でのセキュリティベストプラクティス](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)」を参照してください。

## ユーザーが自分の権限を表示できるようにする
<a name="security_iam_id-based-policy-examples-view-own-permissions"></a>

この例では、ユーザーアイデンティティにアタッチされたインラインおよびマネージドポリシーの表示を IAM ユーザーに許可するポリシーの作成方法を示します。このポリシーには、コンソールで、または AWS CLI か AWS API を使用してプログラム的に、このアクションを完了するアクセス許可が含まれています。

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ViewOwnUserInfo",
            "Effect": "Allow",
            "Action": [
                "iam:GetUserPolicy",
                "iam:ListGroupsForUser",
                "iam:ListAttachedUserPolicies",
                "iam:ListUserPolicies",
                "iam:GetUser"
            ],
            "Resource": ["arn:aws:iam::*:user/${aws:username}"]
        },
        {
            "Sid": "NavigateInConsole",
            "Effect": "Allow",
            "Action": [
                "iam:GetGroupPolicy",
                "iam:GetPolicyVersion",
                "iam:GetPolicy",
                "iam:ListAttachedGroupPolicies",
                "iam:ListGroupPolicies",
                "iam:ListPolicyVersions",
                "iam:ListPolicies",
                "iam:ListUsers"
            ],
            "Resource": "*"
        }
    ]
}
```

## シンプルな読み取りアクセス許可
<a name="api-gateway-policy-example-apigateway-general"></a>

このポリシーの例は、AWS リージョン us-east-1 の `a123456789` の識別子を使用して、HTTP または WebSocket API のすべてのリソースに関する情報を取得する許可をユーザーに付与します。リソース `arn:aws:apigateway:us-east-1::/apis/a123456789/*` には、認証者やデプロイなど、API のすべてのサブリソースが含まれます。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "apigateway:GET"
      ],
      "Resource": [
        "arn:aws:apigateway:us-east-1::/apis/a123456789/*"
      ]
    }
  ]
}
```

------

## REQUEST または JWT オーライザだけを作成する
<a name="security_iam_id-based-policy-examples-v2-import"></a>

このポリシーの例を参考にすれば、ユーザーが [インポート](https://docs.aws.amazon.com/apigatewayv2/latest/api-reference/apis.html#ImportApi)を含む、`REQUEST` または `JWT` オーソリザーだけを使用して API を作成できます。ポリシーの `Resource` セクションによると、`arn:aws:apigateway:us-east-1::/apis/??????????` では、リソースは最大10 文字にする必要があります。これはAPI のサブリソースでは除外されます。この例では、`ForAllValues` セクションの `Condition` を使用します。これは、ユーザーが API をインポートすることで複数のオーソリザーを一度に作成できるためです。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "OnlyAllowSomeAuthorizerTypes",
      "Effect": "Allow",
      "Action": [
        "apigateway:PUT",
        "apigateway:POST",
        "apigateway:PATCH"
      ],
      "Resource": [
        "arn:aws:apigateway:us-east-1::/apis",
        "arn:aws:apigateway:us-east-1::/apis/??????????",
        "arn:aws:apigateway:us-east-1::/apis/*/authorizers",
        "arn:aws:apigateway:us-east-1::/apis/*/authorizers/*"
      ],
      "Condition": {
        "ForAllValues:StringEqualsIfExists": {
          "apigateway:Request/AuthorizerType": [
            "REQUEST",
            "JWT"
          ]
        }
      }
    }
  ]
}
```

------

## デフォルトの `execute-api` エンドポイントが無効になっていることを要求する
<a name="security_iam_id-based-policy-examples-v2-endpoint-status"></a>

 このポリシーの例は、`DisableExecuteApiEndpoint` が `true`の場合に、ユーザーが API を作成、更新、またはインポートすることを示してます。`DisableExecuteApiEndpoint` が `true` の場合は、クライアントは API を呼び出すために、デフォルトの `execute-api` エンドポイントを使用できません。

`BoolIfExists` の条件を使用して、 `DisableExecuteApiEndpoint` 条件キーが入力されない API を更新する呼び出しを処理します。ユーザーが API を作成またはインポートしようとすると、`DisableExecuteApiEndpoint` 条件キーは常に入力されます。

`apis/*`リソースはオーソリザーやメソッドなどのサブリソースもキャプチャするため、明示的に `Deny` ステートメントを使用して API だけを範囲とします。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "DisableExecuteApiEndpoint",
      "Effect": "Allow",
      "Action": [
        "apigateway:PATCH",
        "apigateway:POST",
        "apigateway:PUT"
      ],
      "Resource": [
        "arn:aws:apigateway:us-east-1::/apis",
        "arn:aws:apigateway:us-east-1::/apis/*"
      ],
      "Condition": {
        "BoolIfExists": {
          "apigateway:Request/DisableExecuteApiEndpoint": true
        }
      }
    },
    {
      "Sid": "ScopeDownToJustApis",
      "Effect": "Deny",
      "Action": [
        "apigateway:PATCH",
        "apigateway:POST",
        "apigateway:PUT"
      ],
      "Resource": [
        "arn:aws:apigateway:us-east-1::/apis/*/*"
      ]
    }
  ]
}
```

------

## ユーザーにプライベート REST API の作成または更新のみを許可する
<a name="security_iam_id-based-policy-examples-private-api"></a>

このポリシーの例は、ユーザーが `PRIVATE` API のみを作成することを必須とし、API を `PRIVATE` から別のタイプ (`REGIONAL` など) に変更する可能性がある更新が行われないように条件キーを使用します。

`ForAllValues` を使用して、API に追加されるすべての `EndpointType` が `PRIVATE` であることを義務付けています。API に対する更新はいずれも、それが `PRIVATE` の場合に限り、リソース条件キーを使用して許可されます。`ForAllValues` は、条件キーが存在する場合にのみ適用されます。

非貪欲マッチャー（`?`）を使用して、API IDと明示的に照合し、オーソリザーなどの非 API リソースを許可しないようにしています。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ScopePutToPrivateApis",
            "Effect": "Allow",
            "Action": [
                "apigateway:PUT"
            ],
            "Resource": [
                "arn:aws:apigateway:us-east-1::/restapis",
                "arn:aws:apigateway:us-east-1::/restapis/??????????"
            ],
            "Condition": {
                "ForAllValues:StringEquals": {
                    "apigateway:Resource/EndpointType": "PRIVATE"
                }
            }
        },
        {
            "Sid": "ScopeToPrivateApis",
            "Effect": "Allow",
            "Action": [
                "apigateway:DELETE",
                "apigateway:PATCH",
                "apigateway:POST"
            ],
            "Resource": [
                "arn:aws:apigateway:us-east-1::/restapis",
                "arn:aws:apigateway:us-east-1::/restapis/??????????"
            ],
            "Condition": {
                "ForAllValues:StringEquals": {
                    "apigateway:Request/EndpointType": "PRIVATE",
                    "apigateway:Resource/EndpointType": "PRIVATE"
                }
            }
        },
        {
            "Sid": "AllowResourcePolicyUpdates",
            "Effect": "Allow",
            "Action": [
                "apigateway:UpdateRestApiPolicy"
            ],
            "Resource": [
                "arn:aws:apigateway:us-east-1::/restapis/*"
            ]
        }
    ]
}
```

------

## API ルートに認可を要求する
<a name="security_iam_id-based-policy-examples-require-authorization"></a>

このポリシーにより、ルートに認可がない場合、ルートの作成または更新 ([インポート](https://docs.aws.amazon.com/apigatewayv2/latest/api-reference/apis.html#ImportApi)を含む) の試行が失敗します。ルートが作成または更新されていないときなど、キーが存在しないと、`ForAnyValue` は false と評価します。インポートによって複数のルートを作成することができるので、`ForAnyValue` を使用します。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowUpdatesOnApisAndRoutes",
      "Effect": "Allow",
      "Action": [
        "apigateway:POST",
        "apigateway:PATCH",
        "apigateway:PUT"
      ],
      "Resource": [
        "arn:aws:apigateway:us-east-1::/apis",
        "arn:aws:apigateway:us-east-1::/apis/??????????",
        "arn:aws:apigateway:us-east-1::/apis/*/routes",
        "arn:aws:apigateway:us-east-1::/apis/*/routes/*"
      ]
    },
    {
      "Sid": "DenyUnauthorizedRoutes",
      "Effect": "Deny",
      "Action": [
        "apigateway:POST",
        "apigateway:PATCH",
        "apigateway:PUT"
      ],
      "Resource": [
        "arn:aws:apigateway:us-east-1::/apis",
        "arn:aws:apigateway:us-east-1::/apis/*"
      ],
      "Condition": {
        "ForAnyValue:StringEqualsIgnoreCase": {
          "apigateway:Request/RouteAuthorizationType": "NONE"
        }
      }
    }
  ]
}
```

------

## ユーザーが VPC リンクを作成または更新することを防止する
<a name="security_iam_id-based-policy-examples-deny-vpc-link"></a>

このポリシーは、ユーザーが VPC リンクを作成または更新することを防止します。VPC リンクを使用すると、Amazon VPC 内のリソースを VPC 外のクライアントに公開できます。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "DenyVPCLink",
      "Effect": "Deny",
      "Action": [
        "apigateway:POST",
        "apigateway:PUT",
        "apigateway:PATCH"
      ],
      "Resource": [
        "arn:aws:apigateway:us-east-1::/vpclinks",
        "arn:aws:apigateway:us-east-1::/vpclinks/*"
      ]
    }
  ]
}
```

------

## ルーティングルールを使用するためのポリシーの例
<a name="security_iam_id-based-policy-examples-routing-mode"></a>

次のポリシーの例は、RoutingRule 条件キーを使用して、ユーザーがカスタムドメイン名から REST API にトラフィックをルーティングする方法を制御する方法を示しています。これらの例を使用して、ユーザーが作成できるルーティングルールの種類に関するきめ細かなポリシーを作成できます。詳細については、「[API ステージを REST API のカスタムドメイン名に接続するためのルーティングルール](rest-api-routing-rules.md)」を参照してください。

### カスタムドメイン名によるリクエストのルーティング方法をユーザーが変更できないようにする
<a name="security_iam_id-based-policy-examples-routing-mode-1"></a>

このポリシーは、ユーザーが `BasePathMapping`、`ApiMapping`、または `RoutingRule` を作成または更新できないようにします。これらのリソースはすべて、カスタムドメイン名がリクエストを API にルーティングする方法を変更する可能性があります。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "DenyAccessBasePathMappingsApiMappingsRoutingRules",
      "Effect": "Deny",
      "Action": "apigateway:*",
      "Resource": [
        "arn:aws:apigateway:us-east-1::/domainnames/example.com/basepathmappings/*",
        "arn:aws:apigateway:us-east-1::/domainnames/example.com/apimappings/*",
        "arn:aws:apigateway:us-east-1:111122223333:/domainnames/example.com/routingrules/*"
      ]
    }
  ]
}
```

------

### ユーザーが特定の優先順位のルーティングルールを更新できるようにする
<a name="security_iam_id-based-policy-examples-routing-mode-2"></a>

このポリシーは、ユーザーがルーティングルールを 1001～2000 の優先度にのみ更新できるようにします。このルールを使用して、本番稼働用ルールを優先度の低いルールから分離し、ユーザーが本番稼働用ルールに影響を与えることなく優先度の低いルールを変更できるようにします。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "UpdatingRoutingRulePriorityBetween1001And2000",
      "Effect": "Allow",
      "Action": "apigateway:UpdateRoutingRule",
      "Resource": "arn:aws:apigateway:us-east-1:111122223333:/domainnames/example.com/routingrules/*",
      "Condition": {
        "NumericGreaterThanEquals": {
          "apigateway:Resource/Priority": 1001,
          "apigateway:Request/Priority": 1001
        },
       "NumericLessThanEquals": {
          "apigateway:Resource/Priority": 2000,
          "apigateway:Request/Priority": 2000
        } 
      }
    }
  ]
}
```

------

### ユーザーが特定のベースパス値のルーティングルールまたはベースパスマッピングを更新できるようにする
<a name="security_iam_id-based-policy-examples-routing-mode-3"></a>

このポリシーにより、ユーザーは `orders` で始まる任意のベースパスのベースパスマッピングのみを更新したり、`orders` で始まるベースパスに一致するルーティングルールを更新したりできます。このポリシーでは、ユーザーは `orders/create` または `orders123` のベースパスマッピングまたはルーティングルールを更新できますが、`payment/orders` は更新できません。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
      {
        "Sid": "AllowUpdateRoutingRuleUnderPathOrders",
        "Effect": "Allow",
        "Action": "apigateway:UpdateRoutingRule",
        "Resource": "arn:aws:apigateway:us-east-1:111122223333:/domainnames/example.com/routingrules/*",
        "Condition": {
            "ForAllValues:StringLike": {
                "apigateway:Request/ConditionBasePaths": ["orders*"],
                "apigateway:Resource/ConditionBasePaths": ["orders*"]
            },
            "Null":{
                 "apigateway:Request/ConditionBasePaths":"false",
                 "apigateway:Resource/ConditionBasePaths":"false"             
          }
        }
      }
  ]
}
```

------

### ユーザーがルーティングモードを特定の値に更新できるようにする
<a name="security_iam_id-based-policy-examples-routing-mode-4"></a>

このポリシーにより、ユーザーはルーティングモードを `API_MAPPING_ONLY` および `ROUTING_RULE_THEN_API_MAPPING` にのみ更新できるようになります。ルーティングモードの詳細については、「[カスタムドメイン名のルーティングモードを設定する](set-routing-mode.md)」を参照してください。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
        {
           "Sid": "AllowUpdateRoutingModeToAnythingWithApiMapping",
           "Effect": "Allow",
           "Action": ["apigateway:PATCH"],
           "Resource": "arn:aws:apigateway:us-east-1::/domainnames/example.com",
              "Condition": {
               "StringLike": {
                   "apigateway:Request/RoutingMode":"*API_MAPPING*"
               }
           }
       }
    ]
}
```

------