5
0

Amazon API Gatewayを利用して相互TLS認証通信の実現

Last updated at Posted at 2023-12-14

API Gatewayは、REST、HTTP及びWebSocketのAPIを作成・公開・維持・モニタリングするためのAWSマネージドサービスで、豊富な機能は提供してあり、簡単にAPIの構築ができます。
最近Amazon API Gatewayを触る機会がありまして、相互TLS認証の実現にあたって、サーバー証明書(OpenSSLやプライベートCA)のインポート、カスタムドメインの作成とVPCリンクの作成など色々試してみました。

mTLSとはMutual Transport Layer Security (相互トランスポート層セキュリティ)の略称で、さらに、略して「相互TLS認証」と言います。クライアントとサーバーの両方が互いに証明書を利用して認証することで、セキュアに認証できる方式のことを指します。
※ 今記事はAPI Gatewayの説明とさせてください。mtlsの詳細紹介、証明書の発行周りは別途記事を用意する予定です。

Amazon API Gatewayは2020年ごろに、mTLSをサポートすることはアナウンスしました。これでAPI Gateway利用してMutual TLSの実現ができるようになりました。

  • まずは全体的にAPIの流れのイメージですが、下図に示している通りになります。
    1. 外部サーバから相互TLS認証を利用して、Amazon API Gatewayと通信を行います。
    2. インターナールNLBを通して、プライベートサーブネットにあるAPIエンドポイントを呼び出します。
    3. APIエンドポイントからのレスポンスを外部に返します。
      image.png

では、早速作っていきます。

AWS API Gatewayの作成

  • AWS Console->API Gatewayのダッシュボードに遷移します。
    image.png
  • 今回はREST APIの構築を利用します(※Swagger(OpenAPI)の形式のファイルをインポートも可能です)。
    image.png
  • 作成画面では4つの選択あります。今回は新しいAPIを一から作成します。
    • APIエンドポイントタイプ3種類あります。
      • リージョン <- 今回はこちら
      • エッジ最適化
      • プライベート
        image.png
  • 以下の感じで作成しました。
    image.png

AWS API Gatewayカスタムドメインの作成

※ 左のサイトメニューよりカスタムドメインの作成を選びます。
image.png

  • カスタムドメイン名の画面で作成ボタンを押下します.
  • カスタムドメイン名の作成画面が表示されます。
    • ドメイン名(事前にドメインを取得済みが必要であること, hogehoge.com)
      • サブドメインでtest.hogehoge.comと入力します。
    • TLSのバージョン情報
      • TLS1.2を選びます。
    • 相互TLS認証:スイフトして有効にします。
      • トラストストラURIの入力が求められています。S3バケットを作成し、トラストストアをS3にアップロードし、URIを記載します。
      • S3バージョンニングを有効することはお勧めします。
        • 例:s3://hogehoge/test.truststore
    • エンドポイントタイプ設定します。
      • 先ほどのステップにあわせて「リージョン」を選択します。
        image.png
    • 証明書タイプ
      • インポートされた証明書またはプライベート証明書を選択
        • 証明書
          • 事前にTLS通信用のサーバー証明書を用意して、ACMにインポートします。
        •  所有権証明書
          • ドメインの所有権を証明するための証明書で、事前にACMでパブリック証明書をリクエストします。
            image.png
            ※今回の記事では証明書周りの説明は割愛させてください。後日別途記事作成する予定あります。
  • 全て入力して終わったら「ドメイン名を作成」ボタン押下でカスタムドメインを作成します。
  • カスタムドメインで通信するために、デフォルトのAPIエンドポイントを無効化にします。
    • APIの設定をクリックして設定画面に遷移します。
    • デフォルトのエンドポイントを「非アクティブ」に選択します。「変更を保存」ボタンをクリックします。
    • image.png

これでカスタムドメインの作成が完了で、外部からAPI Gatewayとの間に、TLS相互通信認証ができるようになりました。
image.png

VPCリンクの作成

続きまして、API GatewayからプライベートサブネットにあるAPIエンドポイントとの通信方法について説明します。
プライベートサブネットのAPIエンドポイントを呼び出すためにVPCリンクを作成する必要あります。

  • 左サイトメニューの「VPCリンク」をクリックします。

    • image.png
  • VPCリンクバージョンを選択

    • 「REST APIのVPCリンク」を選択します。
  • VPCリンクの詳細

    • 名前:例:APIDEMO
    • ターゲットNLB
      • 内部通信用インタナールNLBは必要で、事前に用意したものを選択します。(内部NLBについては別記事で紹介する予定あります。)
    • タグは適宜入力し、最後「作成」ボタンを押下します。
      image.png
  • API Gatewayでのマッピング

    • 「リソースを作成」ボタンを押下します
      • image.png
        image.png
    • 続きまして、「メソッドを作成」ボタンを押下します
      • image.png
    • メソッド作成画面で以下の感じで情報を選択・入力します
      • メソッドタイプ
        • POST(例)
      • 統合タイプ
        • VPCリンク
      • HTTPメソッド
        • POST(例)
      • VPCリンク
        • 先ほど作成したVPCリンクを選択します
      • エンドポイントURL
      • image.png
    • 「メソッドを作成」ボタンを押下、メソッドを作成します。
    • 以下の感じで作成完了です。 image.png
  • 上記を持ちまして、API GatewayからプライベートサブネットにあるAPIエンドポイントへの通信設定が完了しました。

    • image.png

最後は全体的の動作確認を実施します。
クライアント側に以下のCurlコマンドを利用して確認できます。

$ curl --key hogehoge_client.key --cert hogehoge_client.pem -X GET https://test.hogehoge.com/healthcheck/

OKの場合: http status code 200, レスポンス本文(例) :{"DEMO":"Health Check OK"}
NGの場合: http status code 403など, レスポンス本文(例) :{"message":"Forbidden"}

NGの場合に、Cloudwatchのログより原因調査したりが必要なので、ログの詳細出力も設定していきましょう。

5
0
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
5
0