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の流れのイメージですが、下図に示している通りになります。
では、早速作っていきます。
AWS API Gatewayの作成
- AWS Console->API Gatewayのダッシュボードに遷移します。
- 今回はREST APIの構築を利用します(※Swagger(OpenAPI)の形式のファイルをインポートも可能です)。
- 作成画面では4つの選択あります。今回は新しいAPIを一から作成します。
- 以下の感じで作成しました。
AWS API Gatewayカスタムドメインの作成
※ 左のサイトメニューよりカスタムドメインの作成を選びます。
- カスタムドメイン名の画面で作成ボタンを押下します.
- カスタムドメイン名の作成画面が表示されます。
- ドメイン名(事前にドメインを取得済みが必要であること, hogehoge.com)
- サブドメインでtest.hogehoge.comと入力します。
- TLSのバージョン情報
- TLS1.2を選びます。
- 相互TLS認証:スイフトして有効にします。
- トラストストラURIの入力が求められています。S3バケットを作成し、トラストストアをS3にアップロードし、URIを記載します。
- S3バージョンニングを有効することはお勧めします。
- 例:s3://hogehoge/test.truststore
- エンドポイントタイプ設定します。
- 証明書タイプ
- ドメイン名(事前にドメインを取得済みが必要であること, hogehoge.com)
- 全て入力して終わったら「ドメイン名を作成」ボタン押下でカスタムドメインを作成します。
- カスタムドメインで通信するために、デフォルトのAPIエンドポイントを無効化にします。
これでカスタムドメインの作成が完了で、外部からAPI Gatewayとの間に、TLS相互通信認証ができるようになりました。
VPCリンクの作成
続きまして、API GatewayからプライベートサブネットにあるAPIエンドポイントとの通信方法について説明します。
プライベートサブネットのAPIエンドポイントを呼び出すためにVPCリンクを作成する必要あります。
-
左サイトメニューの「VPCリンク」をクリックします。
-
VPCリンクバージョンを選択
- 「REST APIのVPCリンク」を選択します。
-
VPCリンクの詳細
-
API Gatewayでのマッピング
- 「リソースを作成」ボタンを押下します
- 続きまして、「メソッドを作成」ボタンを押下します
- メソッド作成画面で以下の感じで情報を選択・入力します
- メソッドタイプ
- POST(例)
- 統合タイプ
- VPCリンク
- HTTPメソッド
- POST(例)
- VPCリンク
- 先ほど作成したVPCリンクを選択します
- エンドポイントURL
- EC2サーバー上起動しているAPIのエンドポイントURL(内部NLBのアドレス+APIのパス)を入力します。
- 例:http://hogehoge-nlb-xxxxx.elb.ap-northeast-1.amazonaws.com/apis/healthcheck
- メソッドタイプ
- 「メソッドを作成」ボタンを押下、メソッドを作成します。
- 以下の感じで作成完了です。
-
上記を持ちまして、API GatewayからプライベートサブネットにあるAPIエンドポイントへの通信設定が完了しました。
最後は全体的の動作確認を実施します。
クライアント側に以下の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のログより原因調査したりが必要なので、ログの詳細出力も設定していきましょう。
- 参考したサイト
- AWS Compute Blog: Introducing mutual TLS authentication for Amazon API Gateway