AWS API Gatewayチュートリアルの手順2

手順2 - Amazon API Gatewayのセキュリティ保護とデプロイ

APIが動き出したところで、セキュリティを追加する必要があります。この手順では以下を行います。

  • アップデートAPIをセキュリティ保護し、特定のAWS IAMロールを持つ認証されたユーザーのみにアクセスを制限する。

  • Auth0の委任を設定して、AWS IAMのフェデレーション機能が利用できるようにする。

  • AWS IAMロールを使用するAWSアクセストークンを取得する。

APIがセキュリティ保護されたら、サーバーレスのシングルページアプリケーション(SPA)を構築します。SPAは、どのユーザーにアクセスが許可されているかを決定するために、フェデレーションIDを使用します。AWS Gateway APIのAWS IAM統合、SAMLのAWS IAM IDフェデレーション、AWS向けのAuth0の委任を組み合わせることで、ソーシャルプロバイダーやエンタープライズ接続を含むさまざまなソースからのユーザーが、APIにアクセスできるようにすることができます。以下の図は、SAMLベースのIDプロバイダーと、Auth0のSAMLフェデレーションおよびAWS向け委任を使用したサンプルフローを示しています。

このフローを実装する方法は2つあります。

  1. AWS IAMとAuth0の委任を使用する

  2. IDトークンをフローに追加して、Lambda関数にIDを渡す

委任を使用すると、アプリケーション内でAWSサービスにアクセスするためのトークンをAWSから簡単に取得できます。

Amazon API Gatewayをセキュリティ保護する方法

AWS API Gatewayには、APIをセキュリティ保護するためのいくつかの異なる方法があります。

  1. APIキー

  2. IAM

  3. Amazon Cognito

APIキーの使用は、通常、以下に示されているようなサービス間でのやり取りに適しています。ただし、このアプローチには、いくつかの欠点があります。

  • アプリケーションにライフタイムの長いシークレットを置くことはリスクが高い(アプリケーションが侵害されやすくなる)

  • APIキーを発行および管理するためのフレームワークを作成するには、セキュリティ保護された実装が必要だが、この開発が難しい場合がある

このチュートリアルのセクションでは、API GatewayでAPIをセキュリティ保護するためにIAMロールとポリシーを使用しますが、Amazon Cognitoのユーザープールを使用してセキュリティ保護することも可能です。AWS APIをセキュリティ保護するための詳細な手順については、「Cognitoを使用してAWS API Gatewayをセキュリティ保護する」をお読みください。IAMロールとポリシーの使用に関する詳細については、Amazonの記事「IAMアクセス許可を使用してAPIへのアクセスを制御する」をお読みください。Cognitoのユーザープールについての詳細は、「Amazon Cognitユーザープール」をご覧ください。

1.API GatewayとのSAML統合のためにIAMとAuth0を構成する

AWSトークンと交換するSAMLトークンに対して、AWS IAMロールを指定することができます。そのIAMロールに付与された権限(IDプロバイダーを使用して設定)に応じて、受け取ったトークンも同じ許可を持つことになります。異なるSAMLトークンを発行し、それぞれに独自のAWS IAMロールを割り当てることで、ユーザーのアクセスレベルを制御することができます。

たとえば、IDPはグループメンバーシップ(例:Active Directoryの管理者)や認証ソース(例:データベース接続やFacebookなどのソーシャルプロバイダー)に基づいて、IAMロールを指定することができます。このアプローチを使用すると、AWS IAMを使用してセキュリティ保護されている場合に、Amazon API Gatewayのメソッドに対するユーザーアクセスを区別することができます。

Auth0の設定

Auth0アカウントにログインします。Management Dashboardが表示されます。ページの右上隅にある[+ New Application(+新しいアプリケーション)]をクリックします。

新しいアプリケーションに「AWS API Gateway」と名前を付け、このアプリケーションがシングルページアプリケーションであることを指定します。[Create(作成)]をクリックします。

新しく作成したアプリケーションの[Addons(アドオン)]タブに移動します。適切なスライドを使用して、Amazon Web Servicesを有効にします。これで、AWSの委任が有効になります。

AWSを構成する

SAMLを使用する委任アクセス用にAWSを構成するには、「AWSの委任認証をセットアップする方法」チュートリアルに従ってください。いくつか注意点があります。

  • リンク先のチュートリアルの権限ポリシーではなく、ロールに権限ポリシーを割り当てるには、以下の指示に従ってください。

  • 作成するSAMLプロバイダーにauth0と名前を付けます。

  • AWS IAMロールにauth0-api-roleと名前を付けます。

IWS IAMロールの権限ポリシーを設定する

AWS IAMロールを構成したら、API Gatewayのメソッドを実行できるようにするauth0-api-roleにポリシーを追加します。このプロセスに関する詳細については、「Amazon API Gatewayのユーザーアクセス権限」を参照してください。

Gateway API ARNを取得する

始める前に、Gateway APIのARNが必要です。

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

  2. 適切なAPIを選択します。

  3. APIに関連する任意のメソッドをクリックして、[Method Execution(メソッドの実行)]ページを表示します。

  4. [Method Execution(メソッドの実行)]ページの左上隅にある[Method Request(メソッドの要求)]ボックスに、メソッド名を含むAPIのARNが表示されます。

arn:aws:execute-api:us-east-2:484857107747:97i1dwv0j4/*/POST/

メソッド名を削除して、APIのベースのARNを取得します。

arn:aws:execute-api:us-east-2:484857107747:97i1dwv0j4/*

上記のARNにあるワイルドカード(*)を使うと、すべての段階でAPIの権限が有効になりますが、開発、テスト、運用など、異なる段階を個別にデプロイすることもできます。

先ほど作成したauth0-api-roleロールを選択して、その[Summary(サマリー)]ページを開きます。

[Inline Policies(インラインポリシー)]を展開し、[click here(ここをクリック)]をクリックします。

[Custom Policy(カスタムポリシー)]を選択し、[Select(選択)]をクリックします。

ポリシードキュメントを編集します。[Policy Name(ポリシー名)]は任意の名前に設定できますが、api-gateway-policyのような名前をお勧めします。このロールに対してAPIメソッドへのアクセスを有効にするために、API用にARNを更新した後、以下のポリシーを適用します。

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

Was this helpful?

/

[Apply policy(ポリシーを適用)]をクリックします。

API Gatewayがユーザーに代わってこのロールを引き受けるため、信頼ポリシーはこのアクションを許可する必要があります。そのため、ロールの[Summary(サマリー)]ページのこのタブに移動して、ロールの信頼関係を編集します。

最終的な信頼関係は以下のようになるはずです。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "auth0",
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::012345670:saml-provider/auth0-api"
      },
      "Action": "sts:AssumeRoleWithSAML",
      "Condition": {
        "StringEquals": {
          "SAML:iss": "urn:{yourDomain}"
        }
      }
    },
    {
      "Sid": "gateway",
      "Effect": "Allow",
      "Principal": {
        "Service": "apigateway.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

Was this helpful?

/

この時点で、API Gatewayの認可設定を指定する必要があります。

[Resources(リソース)]ビューで、/petsの下にあるPOSTメソッドを選択します。

[Method Request(メソッドの要求)]リンクをクリックします。

[Authorization Type(認可タイプ)]の横にある編集アイコンをクリックし、「AWS_IAM」を選択します。フィールドの横にあるチェックボタンをクリックして、設定を保存します。

2.CORSをセットアップし、APIをデプロイする

シングルページアプリケーション(SPA)は、ページとは異なるドメインからWeb APIメソッドにアクセスします。Cross-Originリソース共有設定では、ブラウザーがAWS API Gatewayへのアクセスを許可できるようにするために、このアクションを明示的に許可する必要があります。通常、ブラウザーは最初にOPTIONS要求を発行して、サイトがどのアクションを許可するかを確認します。

[Resources(リソース)]の下にある/petsを選択し、[Create Method(メソッドの作成)]をクリックします。ドロップダウンで、OPTIONSを選択し、チェックマークをクリックして設定を保存します。

Optionsメソッドは、ブラウザーが必要なHTTPヘッダーを取得するために使用しますが、この関数には、何をすべきかについてさらに指示を出す必要があります。OPTIONSセットアップ画面で、以下の変数/パラメーターを設定します。

  • [Integration type(統合タイプ)]:Lambda関数

  • [Use Lambda Proxy Integration(Lambdaプロキシ統合を使用する)]:チェックなしのまま

  • [Lambda Region(Lambdaリージョン)]:ご自身のリージョンを選択

  • [Lambda Function(Lambda関数)]:NoOp.

[Save(保存)]をクリックします。次のポップアップ画面で、Lambda関数に必要な権限を付与します。

すると、OPTIONSの[Method Execution(メソッドの実行)]ページが自動的に表示されます。[Method Respose(メソッドの応答)]ページを開きます。

HTTPステータスバーの下にある200セクションを展開し、以下の応答ヘッダーを追加します。

  • Access-Control-Allow-Headers

  • Access-Control-Allow-Methods

  • Access-Control-Allow-Origin

次に、各応答ヘッダーに適切な値をマッピングします。[Method Execution(メソッドの実行)]ページに戻ったら、[Integration Response(統合応答)]をクリックします。200メソッド応答ステータスに関連付けられた行を展開した後、[Header Mappings(ヘッダーのマッピング)]を展開し、以下のマッピングを適用します。

  • Access-Control-Allow-Headers:'Content-Type,X-Amz-Date,Authorization,x-api-key,x-amz-security-token';

  • Access-Control-Allow-Origin:'*'

  • Access-Control-Allow-Methods:'POST, GET, OPTIONS'

最後に、上記の手順を繰り返して、POSTメソッドとGETメソッドのCORSを有効にします。ただし、これらの2つのメソッドに対しては、1つのヘッダー「Access-Control-Allow-Origin」を追加し、その値を'*'に設定する必要があります。

APIをデプロイする

APIの[Resources(リソース)]ビューに戻ります。[Actions]をクリックし、[DEPLOY API(APIのデプロイ)]を選択します。

デプロイ状態に[New Stage(新しい段階)]を選択し、この段階にTestと名前を付けます。[Deploy(デプロイ)]ボタンをクリックします。

結果のページで、[SDK Generation(SDK生成)]に移動します。プラットフォームにJavaScriptを選択します。[Generate SDK(SDKの生成)]ボタンをクリックします。

ダウンロードしたzipファイルは、後で使用するために保存しておきます。