AWS API Gateway Developer Portal をセキュリティ強化観点でカスタマイズをしてみた

この記事は公開されてから半年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

先日、こちらのブログ「AWS API Gateway Developer Portal を使ってAPI定義を公開してみた」にて紹介した、「AWS API Gateway Developer Portal」ですが、今回は作成されたデプロイされたリソースの設定を変更してセキュリティ面の強化等々について考えてみたいと思います。

デプロイ時のオプションを指定することで設定できるものもありますが、今回はAWSコンソール上から設定を変更して、
AWSの設定とともに挙動確認をしてみます。

AWSコンソールから設定変更するとCloudFormation管理から外れるので設定変更は自己責任でお願いします。

IP制限

デプロイされた「API Developer Portal」のリソースにはグローバルから接続可能なAWSコンポーネントとして、「CloudFront」と「APIGateway」、「Cognito」があります。
APIGWリソースを管理・公開するためのものとなるため内部向けのポータルとして利用する場合、接続元IPで制限することがおすすめです。接続元IPが決まっておりホワイトリスト登録可能な場合、「APIGWへリソースポリシー」の設定や各サービスに「WAF」を設定をすることで、アクセスのIPによるホワイトリスト管理が可能となります。
また、WAFを利用すればIP制限の他にも必要に応じてルールを追加することで、悪意のあるアクセスを遮断することも可能なのでセキュリティ面を強化することが可能となります。

自己サインアップの禁止

デフォルトの設定ですと、右上の「Sign Up」ボタンを押下すると誰でもユーザ作成ができてしまいます。
管理者によりユーザ管理をしたい場合、よろしくない設定ですので、こちらを無効化してみます。

自己サインアップの禁止 設定

設定にはCognitoの設定を更新する必要があります。
Cognito - ユーザプール
から、ポータルで利用されているユーザプールを選択します。
「サインアップエクスペリエンス」のタブ内にある「セルフサービスのサインアップ」が「有効」になっているので、「編集」から「自己登録を有効化」のチェックを外します

「自己登録」が「無効」となっていれば設定は完了です。
先ほどと同様に「Register」を押下すると、「Signup is not allowed」と表示され、自分でユーザ追加ができない設定をすることが可能になります。

ロギング

「CloudFront」と「APIGateway」のアクセスログを「S3」もしくは「CloudWatchLogs」へ保管することが可能です。
アクセスの解析等で利用できるので、WAF同様設定しておくことがよさそうです。
上記に加えて、Lambdaも実行ログが「CloudwatchLogs」に出力されていますので、保持期間・ライフサイクル設定によるログの保管期間設定も忘れずに設定しましょう。

CloudFrontのアクセスログ設定

CloudFrontのアクセスログはS3に出力することができます。
下記の通り「出力先バケット」と「パス」を指定すれば設定完了です。

APIGWのアクセスログ設定

APIGWのアクセスログはCloudWatchLogsに出力することができます。

アクセスログの送信先ARNに入力するためにCloudWatchLogsを作成しておきます。
その後、APIGWの「ステージ」から「ログとトレース」の箇所を修正しアクセスログの設定が可能です。※アクセスログの送信先ARNには事前に作成したLogsのARNを指定してください。

アクセスログの出力にはAPIGWのアカウント設定で、IAMRoleを設定しておく必要がありますので、忘れずに作成・設定しましょう。

Node.jsのv16.x → v18.x バージョンアップ

まず結論からなのですが、CloudFormationのNode.jsバージョン書き換えだけですと失敗します。

Lambdaランタイム EOL

本システムのLambdaで利用されているNode.jsはv16.xなのですが、こちら、2024/6/12に廃止が決定しています。
2024/2/22現在、v16.x以上のバージョンで稼働させる方法はないのですが、試しにLambda/layerバージョンv18.xに更新して挙動するか確認してみます。

CloudFormationのバージョンを変更する

下記のように
cloudFormation/template.yamlに記載している「nodejs16.x」→「nodejs18.x」に書き換えます。

デプロイ実行

しばらくすると下記エラーとなってしまいました。

エラーとなっているイベントのLambda(CloudFrontSecurityHeadersSetup)の実行ログを確認すると下記エラーとなっていました。

もうすぐ廃止の時期がやってきてしまいますが、現状だと残念ながら、
更新をまつか、LambdaのNode.jsのソースコードを確認して更新するしかなさそうです。
こちらのエラーについてはまた後日時間ができた時に詳細を確認をしてみます。

まとめ

今回は「AWS API Gateway Developer Portal」をカスタマイズしてセキュリティ強化を実施しました。
あくまで私個人的に設定を更新してみた内容となりますので、本番環境等で利用される場合は十分ご検証した上で実施ください。

投稿者プロフィール

makuta
2024 Japan AWS Top Engineers

AWSを使ったサーバレスアーキテクチャ・コンテナサービスの設計・構築を担当。