16
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Auth0 カスタムオーソライザーを使用してAWS API Gateway Endpointへセキュアにアクセスする (2/2)

Last updated at Posted at 2018-03-01

###パート1(1/2)はこちら
このブログは、Auth0のSecure AWS API Gateway Endpoints Using Custom Authorizerを日本語化したものです(英語版のPart 3 およびPart 4の内容です)。
本ブログは2部構成になっています。パート1をまだ読んでいない方は、はじめにパート1を読んでいただくことをお薦めいたします。

##3. カスタムオーソライザーを作成する

チュートリアルの1章では、Auth0をAPI Gatewayと連携するための設定方法を説明しました。2章ではAmazon Web Services (AWS) API Gatewayを使用してAPIをインポート、テスト、およびデプロイする方法を紹介しました。3章では、適切な権限を持つユーザーのみがAPIのバックエンドにアクセスできるように、このAPIを保護する方法を説明します。

これを実行するために、API Gatewayのカスタム [リクエスト] オーソライザーを使用します。これによりOAuth 2.0やSAMLなどbearerトークン認可戦略を用いてAPI認可を行うことが可能になります。リクエストを受信するたびに、以下の処理が行われます:

  1. API Gatewayは適切に構成されたカスタムオーソライザーを確認します。
  2. API GatewayはAuthorizationトークンを使用して(Lambda関数の機能により)カスタムオーソライザーを呼び出します。
  3. Authorizationトークンが正当な場合、カスタムオーソライザーは適切なAWS Identity and Access Management (IAM) ポリシーを返します。
  4. API Gateway はリクエストを認可するために手順3で返されたポリシーを使用します。

カスタムオーソライザーを準備する

Auth0が発行したトークンをサポートするサンプル カスタムオーソライザーをダウンロードします。その後、あなたの環境でカスタムオーソライザーが動作するためにファイルをカスタマイズする必要があります。

  1. 指定したフォルダにダウンロードされたサンプルファイルを解凍し、コマンドラインを使用して該当フォルダに移動します。

  2. サンプルフォルダの中で、デプロイに必要なNode.jsパッケージをインストールするために、npm installを実行します。後の手順でAWSにアップロードをしますが、AWSはバンドルされているファイルを含めた、これらのファイルを必要とします。

  3. .envファイルにローカル環境変数を定義します。cp .env.sample .envを実行することで、.env.sampleファイルを.envファイルへコピー(すると同時にリネーム)することができます。以下の変更を行います:

パラメーター
TOKEN_ISSUER トークンの発行者。Auth0がトークンの発行者の場合、https://${account.namespace}/を定義します。
JWKS_URI JWKSエンドポイントのURL。Auth0がトークンの発行者の場合、https://${account.namespace}/.well-known/jwks.jsonを定義します。
AUDIENCE 第1章で作成されたAPIのAudienceの値

※ ${account.namespace}は、あなたのAuth0ドメインです。

例えば、定義が完了すると.envファイルは以下のようなテキストになります:

JWKS_URI=https://hfurutaau.au.auth0.com/.well-known/jwks.json
AUDIENCE=hVG7...3QA1q
TOKEN_ISSUER=https://hfurutaau.au.auth0.com/
  1. ローカルでカスタムオーソライザーをテストします。

a. はじめに、正当なJWT Access Tokenを取得します。JWT Access Tokenを取得する方法は複数あり、選択する方法はクライアントのタイプ、信頼レベル、または全体的なエンドユーザーエクスペリエンスによって異なります。
API用のテスト トークンはAuth0 ダッシュボードAPIs > 作成したAPI > Test から入手できます。詳細については Access Tokenの入手方法を参照してください。

b. ローカルにトークン情報を含んだevent.jsonファイルを作成します。サンプルファイルからコピーすることができます(コマンドラインから cp event.json.sample event.json を実行)。 ACCESS_TOKENに手順a.で入手したJWTトークン, methodArnに APIのGETメソッドにある適切なARNの値で置き換えてください。

methodArnの値を入手するには:

  1. AWS API Gatewayコンソールで、PetStore APIを開きます。
  2. 左側のナビゲーションパネルにある、リソース をクリックします。
  3. 中央の リソース パネルで、 リソースツリーを展開し、/petsの下にあるGETをクリックします。
  4. メソッドリクエストボックスの中に、ARNがあるのを確認できます。

c. npm testを実行してテストを行います。ここではlambda-localパッケージを使用して、カスタムオーソライザーのテストします。テストが成功した場合は、次のような文字列が出力されます:

Message
------
{
    "principalId": "C8npTEMVnBrILsBTI91MOh6dfuZbPVAU@clients",
    "policyDocument": {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": "execute-api:Invoke",
                "Effect": "Allow",
                "Resource": "arn:aws:execute-api:us-east-1:1234567890:apiId/stage/method/resourcePath"
            }
        ]
    },
    "context": {
        "scope": "FULL_LIST_OF_SCOPES"
    }
}

Effectの値がAllowの場合、カスタムオーソライザーはAPI Gatewayを呼び出すことが許可されます。

IAMロールの作成

IAMロールには、Lambda関数を呼び出すために必要な権限があります。カスタムオーソライザーを実行する前に、API Gatewayがアクセスリクエストを受け取るたびにカスタムオーソライザーを呼び出すことができるIAMロールを作成する必要があります。

1.AWSにログインし、IAM Consoleにアクセスし、画面左側のナビゲーションバーからロールをクリックします。

2.ロールの作成をクリックします。

スクリーンショット 2018-03-01 23.13.05.png

3.AWS サービス ロールを選択し、その下にある、AWS Lambda をクリックしたのち、画面下にある 次のステップ:アクセス権限ボタンをクリックします。

4.アクセス権限ポリシーをアタッチする 画面で、AWSLambdaRoleを選択します (たくさんのポリシーが表示されているのでフィルターを使用して検索することをお勧めします)。AWSLambdaRoleの左側にあるチェックボックスをOnにしてから 次のステップ:確認をクリックします。

スクリーンショット 2018-03-01 23.20.41.png

5.ロールの作成:確認画面で、ロール名を入力します( 例えば Auth0Integration )。その他の項目はそのままにして、ロールの作成をクリックします。

スクリーンショット 2018-03-01 23.22.43.png

6.AWSがロールの作成を完了すると、IAMのロールページにリダイレクトされます。作成されたロールをクリックしてください。

スクリーンショット 2018-03-01 23.24.06.png

7.作成したロールの概要ページで、信頼関係タブをクリックします。

スクリーンショット 2018-03-01 23.26.02.png

8.信頼関係の編集をクリックし、ポリシードキュメントフィールドに以下のJSON snippetを追加してください。:

```json
{
"Version": "2012-10-17",
"Statement": [
    {
    "Effect": "Allow",
    "Principal": {
        "Service": [
        "apigateway.amazonaws.com",
        "lambda.amazonaws.com"
        ]
    },
    "Action": "sts:AssumeRole"
    }
]
}
```

スクリーンショット 2018-03-01 23.28.12.png

信頼ポリシーの更新をクリックします。

9 ロールの概要ページにリダイレクトされます。後ほど使用するので、画面上に記載されているロールARNの値をコピーしておいてください。

スクリーンショット 2018-03-01 23.30.53.png

Lambda関数の作成 および カスタムオーソライザーのデプロイ

これまでカスタムオーソライザーをあなたの環境用に構成し、テストを通して動作することを確認してきました。つづいてAWSにカスタムオーソライザーをデプロイします。

1.はじめに、コマンドラインからnpm run bundleを実行してAWSにアップロードするためのバンドルを作成する必要があります。このコマンドを実行すると、AWS Lambdaに必要なソース、構成ファイル、node modulesを含んだ`custom-authorizer.zip'が生成されます。

2.Lambdaコンソールに移動し、関数の作成をクリックします。

スクリーンショット 2018-03-01 23.41.11.png

3.関数の作成 ページで、一から作成 をクリックします。

4.一から作成 オプション画面で、Lambda関数の作成に必要な以下の情報を登録します(Lambda関数設定画面の基本設定に記載される内容です)。登録が完了したら関数の作成をクリックします:

Parameter Value
名前 Lambda関数の名前。例えば jwtRsaCustomAuthorizer
ランタイム Node.js 4.3を選択
ロール 既存のロールを選択を選択
既存のロール さきに作ったロールを選択 Auth0Integration

スクリーンショット 2018-03-01 23.44.12.png

a. つづいて、関数コードを登録します。コードエントリ タイプから**.ZIPファイルをアップロード**を選択し、アップロードをクリックします。ファイル選択画面が表示されるので、先ほど作成したcustom-authorizer.zipバンドルを選択します。

b. それから、以下の3つの内容を環境変数に登録します。これらの内容は.envファイルに記載した内容と同一のものを登録します:

Parameter Value
TOKEN_ISSUER トークンの発行者。Auth0がトークンの発行者の場合、https://${account.namespace}/を定義します。
JWKS_URI JWKSエンドポイントのURL。Auth0がトークンの発行者の場合、https://${account.namespace}/.well-known/jwks.jsonを定義します。
AUDIENCE 第1章で作成されたAPIのAudienceの値

c. 関数コードのハンドラ および 実行ロールには以下の値を設定します:

パラメーター
ハンドラ index.handler
実行ロール 既存のロールを選択
Existing role さきに作ったロールを選択 Auth0Integration

d. 基本設定 で、タイムアウト を30秒に設定します。

上記の内容の登録が完了しましたら、保存をクリックします。

AWSが関数の作成を完了すると、以下のような画面が表示されます。

スクリーンショット 2018-03-01 23.59.50.png

6.作成したLambda関数をテストします。画面右上にあるテストをクリックします。

7.event.jsonファイルの内容を、JSON形式でテストイベントの設定画面にコピーします。

スクリーンショット 2018-03-02 0.29.53.png

**保存 (もしくは作成)をクリックしてテスト**をクリックします。 テストが成功した場合には、以下のような画面が表示されます。

スクリーンショット 2018-03-02 0.27.19.png

詳細情報を開くと、ローカルテストで成功した時と同様のメッセージが表示されているのが確認できます。

スクリーンショット 2018-03-02 0.30.53.png

API Gatewayカスタムオーソライザーの構成

API Gatewayコンソールに戻ります。

スクリーンショット 2018-03-02 0.32.25.png

まえに作成したPetStoreを開きます。

スクリーンショット 2018-03-02 0.34.07.png

画面左のナビゲーションバーからオーソライザーを開きます。初めてオーソライザーを作成した場合、デフォルトでオーソライザーの作成設定画面が表示されます。そうでない場合には、画面中央の新しいオーソライザーの作成をクリックして、この画面を表示することができます。

以下のパラメーターを定義してください:

パラメーター
Lambda リージョン 以前作成したLambda関数のリージョンを指定します
Lambda 関数 jwtRsaCustomAuthorizer
名前 jwt-rsa-custom-authorizer
Lambda 実行ロール 先にコピーしたIAMロールのARN
トークンのソース Authorization
トークンの検証 ^Bearer [-0-9a-zA-z\.]*$
TTL (seconds) 3600

スクリーンショット 2018-03-02 0.39.08.png

作成をクリックします。

AWSがオーソライザーを作成し、ページが更新されると、オーソライザー画面の一番下にテストが表示されます。テストをクリックすると、認証トークンを入力するポップアップが表示されます。以前に使用したAuth0トークン (Bearer ey... )を入力し、テストをクリックすることで、オーソライザーのテストをすることができます。

スクリーンショット 2018-03-02 0.43.58.png

テストが成功した場合、以下のようなレスポンスが表示されます。

スクリーンショット 2018-03-02 0.44.41.png

まとめ

API Gatewayチュートリアル 第3章では、アクセス要求を処理するカスタムオーソライザーの構成を行いました。これを行うには、次のようにします:

  1. Auth0サンプルを使用して、Lambda関数によって使用されるコードを含むバンドルを準備します
  2. Lambda関数を呼びだるIAMロールを作成します
  3. 手順1で作成したカスタムバンドルを使用するLambda関数を作成します
  4. 手順3で作成したLambda関数を使用するAPI Gatewayカスタムオーソライザーを作成します

第4章では、作成したカスタムオーソライザーを実際に使ってみます。

4: カスタムオーソライザーを使用してAPIを保護する

第1章ではAPI Gatewayで使用するAuth0の構成をしました。第2章ではAPI Gatewayを使用してAPIを構成しました。第3章ではAPIがアクセスリクエストを受け取った際に、適切なポリシーを検索できるようにカスタムオーソライザーを構成しました。本章ではどのようにAPIエンドポイントを保護するためのカスタムオーソライザーの使用方法を説明します。

カスタムオーソライザーを使用するためにAPI Gatewayリソースを構成する

AWSにログインし、API Gatewayコンソールに移動します。

スクリーンショット 2018-03-02 1.05.55.png

注意: カスタムオーソライザーは、メソッドごとにメソッドに設定されます。1つのオーソライザーで複数のメソッドを保護したい場合は、各メソッドに対して次の手順を繰り返す必要があります。

2章で作成したPetStore APIを開きます。画面中央のリソース ツリーから、/petsリソースのGETメソッドを選択します。

スクリーンショット 2018-03-02 1.07.38.png

メソッドリクエストを選択します。

スクリーンショット 2018-03-02 1.08.32.png

設定画面で、認証の右側にあるペンアイコンをクリックし、3章で作成したカスタムオーソライザーjwt-rsa-custom-authorizerを選択します。

スクリーンショット 2018-03-02 1.09.52.png

選択したカスタムオーソライザーの横にある、チェックマークをクリックして保存します。APIキーの必要性は、確実にfalseになっていることを確認してください。

スクリーンショット 2018-03-02 1.10.52.png

APIのデプロイ

変更内容を公開するには、2章で行ったAPIのデプロイをする必要があります。

デプロイが成功すると、Testステージエディターにリダイレクトされます。画面一番上の青いバナーにURLの呼び出しが記載されているので、URLの情報をコピーしておいてください。デプロイしたAPIのテストをする際に必要となります。

スクリーンショット 2018-03-02 1.12.28.png

デプロイしたAPIのテスト

上記手順でコピーした、GETコールにあるURLの呼び出しを使用して、デプロイしたAPIのテストができます。

curl --request GET \
  --url https://your_invoke_url/pets

まとめ

このチュートリアルで、以下のことを学習いたしました。

  1. API Gatewayを使用するためにAuth0を構成
  2. API Gatewayを使用するためにAPIをインポート
  3. AWS IAMおよびLambdaと一緒に動作することが必要なAPIエンドポイントをセキュアにするためのカスタムオーソライザーの作成
  4. カスタムオーソライザーを使用してAPIを保護
16
13
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
16
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?