Amazon API GatewayのIAM認証の動作を確認しました
2021/10/17
API GatewayのIAM認証は、IAMユーザーが実行できるように認証する、ということはわかっていても細かい動作は手元で動かしてみないと、でしたのでやってみました。
主な手順は公式ナレッジのAPI Gateway API の IAM 認証を有効にする方法を教えてくださいを参考にしています。
Amazon API Gatewayでモックを作るで作ったAPIで試します。
目次
API Gatewayの設定
メソッドリクエストで、[認可]に[AWS_IAM]を選択しました。
[アクション]-[APIのデプロイ]でデプロイしておきました。
そして、ブラウザからAPIの呼び出しをすると、以下のメッセージが返ってきました。
1 2 3 4 |
{ message: "Missing Authentication Token" } |
IAM
IAMユーザーは同じアカウントと別アカウントで3ユーザー作っておきます。
* api-exe-valid
* api-exe-nonvalid
* api-not-exe
各IAMユーザーの最終的なシナリオです。
IAMユーザー | IDベースのポリシー | リソース(API)ベースのポリシー | アカウント |
---|---|---|---|
api-exe-valid | 許可 | 許可 | 別 |
api-exe-nonvalid | 許可 | なし | 同 |
api-not-exe | なし | なし | 同 |
IDベースのポリシーは以下をインラインポリシーに設定しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "execute-api:Invoke" ], "Resource": [ "arn:aws:execute-api:us-east-1:123456789012:apiid/prod/GET/" ] } ] } |
ARNは、API Gatewayコンソールのリソースのメソッドリクエストにありますので、コピーして貼り付けています。
段階的に確認していきますので、まずはユーザーを作成して、APIのリソースベースのポリシーはなしで試します。
IDベースのみで確認
APIの実行確認は、POSTMANで行いました。
IAM認証によるAPIの実行には、バージョン4での署名が必要なのですが、POSTMANにアクセスキーIDとシークレットアクセスキーを設定すると、生成してくれますので便利です。
同じアカウントでIDベースのポリシーなし
api-not-exe
1 2 3 4 |
{ "Message": "User: arn:aws:iam::123456789012:user/api-not-exe is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:us-east-1:********9012:apiid/prod/GET/" } |
IDベースのポリシーで許可していませんので、api-not-exeユーザーには権限が無いメッセージが返ってきました。
想定どおりです。
同じアカウントでIDベースのポリシーあり
api-exe-nonvalid
1 2 3 4 5 |
{ "statusCode": 200, "message": "Hello from API Gateway!" } |
IAM認証が成功して、結果が表示されました。
違うアカウントでIDベースのポリシーあり
api-exe-valid
1 2 3 4 |
{ "Message": "User: arn:aws:iam::098765432109:user/api-exe-valid is not authorized to access this resource" } |
リソースに対しての権限がないというメッセージが表示されました。
リソースベースのポリシーを別アカウント向けに設定して確認
APIのリソースポリシーはこのようなポリシーです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS":"arn:aws:iam::098765432109:user/api-exe-valid" }, "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:us-east-1:1234566789012:apiid/prod/GET/" } ] } |
今回は特定のIAMユーザーのみですが、対象のアカウント側に誰に許可するかを委任する場合は、 “arn:aws:iam::098765432109:root”をPrincipalにします。
違うアカウントでIDベースのポリシーあり
api-exe-valid
1 2 3 4 5 |
{ "statusCode": 200, "message": "Hello from API Gateway!" } |
認証が成功しました。
別のアカウントからはAPIにリソースポリシーが必要ということがわかりました。
ちなみに
同じアカウントでIDベースのポリシーあり
api-exe-nonvalid
1 2 3 4 5 |
{ "statusCode": 200, "message": "Hello from API Gateway!" } |
認証成功しました。
リソースポリシーで別アカウントのみとしたいときは拒否ポリシーも必要ですね。
ということで、リソースポリシーに拒否ポリシーを追加してNotPrincipalにしてみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::098765432109:user/api-exe-valid" }, "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:us-east-1:1234566789012:apiid/prod/GET/" }, { "Effect": "Deny", "NotPrincipal": { "AWS": "arn:aws:iam::098765432109:user/api-exe-valid" }, "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:us-east-1:1234566789012:apiid/prod/GET/" } ] } |
これで、別アカウントの特定のIAMユーザー以外からは拒否できるAPIができました。
最後までお読みいただきましてありがとうございました!
「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。
「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第2版」という本を書きました。
「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。
「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。
「AWSではじめるLinux入門ガイド」という本を書きました。
開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
AWSアカウントrootユーザーのメールアドレスを変更
昔、うっかり会社の個人メールアドレスで作ってしまったAWSアカウントがあるのでメ …
-
AWSルートユーザーのパスワード復旧
AWSルートユーザーのパスワード最設定は、メールアドレスだけでいいのですね。 M …
-
Feedlyのフィードを自動でSlackへ投稿する(AWS Lambda , Amazon DynamoDB)
やりたいこと Feedlyで共有したいフィードに特定のタグを付けます。 特定のタ …
-
IAMユーザーにパスワード変更とMFA設定を許可する
組織管理のIAMで、ユーザーにMFAを使ってサインインしない限り操作は許可しない …
-
AWS Transit GatewayのVPCアタッチメント
構成 これぐらいの構成なら、VPCピアリングでいいのですが、Transit Ga …
-
SendGridのイベントをAPI Gateway -> Lambda(Python) -> DynamoDBに格納する
SendGridのメールイベントログはコンソールで確認出来るのは直近7日分で一括 …
-
RDSインスタンス作成時にEC2に接続設定するオプション
EC2 インスタンスと RDS データベース を自動的に接続するの動作を確認した …
-
「re:CAP ~サーバーワークス re:Invent 2018 報告会~」でre:Invent2018について思われたことを聞かせていただいた
サーバーワークスさんのre:Invent re:CAPにおじゃましました。 re …
-
S3リクエストメトリクスをプレフィックスを指定して有効化
検証でどのリクエストがどれぐらい発生しているのか、さっと知りたくなったので、特定 …
-
AWS CloudFormationでAmazon DynamoDBテーブルを作ってアイテムを追加する
デモ用にDynamoDBテーブルを作って消して、ということをたまにするので、Cl …