Amazon API Gateway のアイデンティティベースのポリシーの例 - Amazon API Gateway

Amazon API Gateway のアイデンティティベースのポリシーの例

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

IAM ポリシーの作成方法の詳細については、 IAM ユーザーガイド「[JSON] タブでのポリシーの作成 」を参照してください。API Gateway 固有のアクション、リソース、条件の詳細については、「Amazon API Gateway Management のアクション、リソース、および条件キー」および「Amazon API Gateway Management V2 のアクション、リソース、および条件キー」を参照してください。

ポリシーに関するベストプラクティス

ID ベースのポリシーは、あるユーザーがアカウント内で API Gateway リソースを作成、アクセス、または削除できるどうかを決定します。これらのアクションを実行すると、AWS アカウントに料金が発生する可能性があります。アイデンティティベースポリシーを作成したり編集したりする際には、以下のガイドラインと推奨事項に従ってください:

  • AWS マネージドポリシーを使用して開始し、最小特権の許可に移行する – ユーザーとワークロードへの許可の付与を開始するには、多くの一般的なユースケースのために許可を付与する AWS マネージドポリシーを使用します。これらは AWS アカウントで使用できます。ユースケース別に AWS カスタマーマネージドポリシーを定義して、マネージドポリシーを絞り込むことをお勧めします。詳細については、「IAM ユーザーガイド」の「AWS マネージドポリシー」または「ジョブ機能の AWS マネージドポリシー」を参照してください。

  • 最小特権を適用する – IAM ポリシーで許可を設定する場合は、タスクの実行に必要な許可のみを付与します。これを行うには、特定の条件下で特定のリソースに対して実行できるアクションを定義します。これは、最小特権アクセス許可とも呼ばれています。IAM を使用して許可を適用する方法の詳細については、「IAM ユーザーガイド」の「IAM でのポリシーとアクセス許可」を参照してください。

  • IAM ポリシーで条件を使用してアクセスをさらに制限する - ポリシーに条件を追加して、アクションやリソースへのアクセスを制限できます。例えば、ポリシー条件を記述して、すべてのリクエストを SSL を使用して送信するように指定できます。また、AWS CloudFormation などの特定の AWS のサービス を介して使用する場合、条件を使用してサービスアクションへのアクセスを許可することもできます。詳細については、「IAM ユーザーガイド」の「IAM JSON ポリシー要素:条件」を参照してください。

  • IAM Access Analyzer を使用して IAM ポリシーを検証し、安全で機能的な権限を確保する - IAM Access Analyzer は、新規および既存のポリシーを検証して、ポリシーが IAM ポリシー言語 (JSON) および IAM のベストプラクティスに準拠するようにします。IAM アクセスアナライザーは 100 を超えるポリシーチェックと実用的な推奨事項を提供し、安全で機能的なポリシーの作成をサポートします。詳細については、「IAM ユーザーガイド」の「IAM Access Analyzer でポリシーを検証する」を参照してください。

  • 多要素認証 (MFA) を要求する – AWS アカウントで IAM ユーザーまたはルートユーザーを要求するシナリオがある場合は、セキュリティを強化するために MFA をオンにします。API オペレーションが呼び出されるときに MFA を必須にするには、ポリシーに MFA 条件を追加します。詳細については、「IAM ユーザーガイド」の「MFA を使用した安全な API アクセス」を参照してください。

IAM でのベストプラクティスの詳細については、「IAM ユーザーガイド」の「IAM でのセキュリティベストプラクティス」を参照してください。

ユーザーが自分の権限を表示できるようにする

この例では、ユーザーアイデンティティにアタッチされたインラインおよびマネージドポリシーの表示を 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": "*" } ] }

シンプルな読み取りアクセス許可

このポリシーの例は、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:::/apis/a123456789/*" ] } ] }

REQUEST または JWT オーライザだけを作成する

このポリシーの例を参考にすれば、ユーザーが インポートを含む、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 エンドポイントが無効になっていることを要求する

このポリシーの例は、DisableExecuteApiEndpointtrueの場合に、ユーザーが API を作成、更新、またはインポートすることを示してます。DisableExecuteApiEndpointtrue の場合は、クライアントは 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 の作成または更新のみを許可する

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

ForAllValues を使用して、API に追加されるすべての EndpointTypePRIVATE であることを義務付けています。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 ルートに認可を要求する

このポリシーにより、ルートに認可がない場合、ルートの作成または更新 (インポートを含む) の試行が失敗します。ルートが作成または更新されていないときなど、キーが存在しないと、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 リンクを作成または更新することを防止します。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/*" ] } ] }

ルーティングルールを使用するためのポリシーの例

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

カスタムドメイン名によるリクエストのルーティング方法をユーザーが変更できないようにする

このポリシーは、ユーザーが BasePathMappingApiMapping、または 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/*" ] } ] }

ユーザーが特定の優先順位のルーティングルールを更新できるようにする

このポリシーは、ユーザーがルーティングルールを 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 } } } ] }

ユーザーが特定のベースパス値のルーティングルールまたはベースパスマッピングを更新できるようにする

このポリシーにより、ユーザーは 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" } } } ] }

ユーザーがルーティングモードを特定の値に更新できるようにする

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

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