【Python】ID PoolでAPI GatewayのIAM認証を突破する方法

悩んでいる人

PythonでAPI GatewayのIAM認証を突破する方法が知りたいんだよね…

こんな疑問にお答えします。

  • 本記事の執筆者
プロフィール
  • フリーランスエンジニア(保有資格約20個)
  • ブログ・アフィリエイト歴5年
  • ブランドせどりで月利50万円⇨脱サラ
  • Twitterフォロワー約2,000人
いずみん

本記事を書いている僕はエンジニア歴7年です。
AWSは業務歴2年半なので、かなり有益な情報を発信できるかと思います。

結論、CognitoのID Poolを使ってAPI GatewayのIAM認証を突破するのは非常に簡単です。

具体的なソースコードも載せているので安心してくださいね。

本記事を読んでもらえれば、ID PoolでAPI GatewayのIAM認証を突破する方法が理解できるので、早速見ていきましょう。

いずみん

すぐ読み終わるので、是非最後まで読んでみてください!

目次

ID PoolでAPI GatewayのIAM認証を突破する方法

早速ですが、CognitoのID PoolでAPI GatewayのIAM認証を突破する方法を解説します。

Chaliceの設定

まずは環境を準備します。

今回はChaliceを使いますが、API GatewayにIAM認証付きのAPIがあればOKです。

※画像クリックで拡大
いずみん

↑のような感じですね。
Chaliceのソースコードは後ほど載せておきます。

IDプールの作成

IAM認証を通過するには権限が必要です。

今回は、CognitoのIDプールを利用して一時的な権限を払い出します。

STEP
IDプールを開く
※画像クリックで拡大

IDプールの管理をクリックします。

STEP
新しいIDプールの作成をクリック
※画像クリックで拡大

新しいIDプールの作成をクリックします。

STEP
新しいIDプールの作成
※画像クリックで拡大
※画像クリックで拡大

IDプール名を入力し、プールの作成をクリックします。

いずみん

認証されていないIDに必ずチェックを入れてください。

STEP
ロールを編集
※画像クリックで拡大

ロールを編集し、許可をクリックします。

ロールの内容は以下になります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "execute-api:Invoke"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

API Gatewayの認証を突破するための権限が必要なので「execute-api:Invoke」を記載します。

いずみん

Resouceは面倒くさいので全てにしていますが、限定的にするのをおすすめします。

STEP
IDプールのIDをコピー
※画像クリックで拡大

IDプールのIDはソースコード内で使用するのでコピーします。

Pythonのソースコードはこちら

Pythonのソースコードは以下になります。

from chalice import Chalice, IAMAuthorizer
from botocore.awsrequest import AWSRequest
from botocore.auth import SigV4Auth
import boto3
import json
import requests

app = Chalice(app_name='hello-world')

authorizer = IAMAuthorizer()

@app.route('/', methods=['GET'], authorizer=authorizer)
def index():
    return {'hello': 'world'}

@app.route('/hoge', methods=['GET'])
def hoge():
    REGION = 'ap-northeast-1'
    ARN_ID_POOL = 'ap-northeast-1:...'

    client = boto3.client('cognito-identity', REGION)

    credentials_for_identity = client.get_credentials_for_identity(
        IdentityId=client.get_id(IdentityPoolId=ARN_ID_POOL)['IdentityId']
    )

    session = boto3.session.Session(
        aws_access_key_id=credentials_for_identity['Credentials']['AccessKeyId'],
        aws_secret_access_key=credentials_for_identity['Credentials']['SecretKey'],
        aws_session_token=credentials_for_identity['Credentials']['SessionToken'],
        region_name=REGION
    )

    url = 'https://....execute-api.ap-northeast-1.amazonaws.com/api/'

    credentials = session.get_credentials()
    request = AWSRequest(method = "GET", url = url)
    SigV4Auth(credentials, 'execute-api', REGION).add_auth(request)

    res = requests.get(
        url,
        headers = {
            'Authorization': request.headers['Authorization'],
            'X-Amz-Date': request.context['timestamp'],
            'X-Amz-Security-Token': credentials_for_identity['Credentials']['SessionToken']
        }
    )

    return res.json()

/」のAPIを「/hoge」から実行しています。

いずみん

意外と簡単ですよね?
難しいのはIAMロールの権限周りでしたね。

よくある質問|ID PoolでAPI GatewayのIAM認証を突破する方法

署名バージョン4の公式ドキュメントはありますか?

下記になります。

CognitoIdentityのドキュメントはありますか?

下記になります。

まとめ|ID PoolでAPI GatewayのIAM認証を突破するのは簡単

今回は、ID PoolでAPI GatewayのIAM認証を突破する方法について解説しました。

以下が本記事のまとめになります。

まとめ
  • IDプールを使うことで一時的な権限を払い出せる。
  • IDプールにAPI Gatewayの実行権限を付与する必要がある。
  • Pythonのソースコードはboto3を使えば比較的簡単。

この記事があなたのお役に立てば幸いです。

サイト内には、他にも初心者向けの記事を多く投稿していますので良ければ参考にしてみてください。

最後までお読みいただきありがとうございました!

この記事が気に入ったら
フォローしてね!

シェアしてね!
  • URLをコピーしました!
目次