ペンテスト前のセキュリティ対策として行った事

# はじめに
とあるiPadアプリからの画像アップロードシステムをクライアントへ提供するにあたって、外部セキュリティ診断会社によるペンテスト[^1]を行う運びになり、その際にセキュリティ対策をいくつか実施しました。
これまで、セキュリティグループによるIP制限・S3バケットアクセス制限・IAMユーザー権限・DBユーザー権限まわりの設定は、それぞれのAWSサービスを使った環境構築の手順に必ずといっていいほど出てくる内容なので真新しい事はなかったのですが、ペンテスト前のセキュリティ対策を行うにあたって、今回初めて設定をした内容が複数ありました。

これを機に、これからのシステム構築の際のセキュリティ対策の際に見返せるものがあった方が良いと考えたので、記事にします。

※セキュリティグループによるIP制限・S3バケットアクセス制限・IAMユーザー権限・RDSユーザー権限まわりの設定に関しては、それぞれの環境構築手順に出てくる基本的な設定である、かつ、記事の内容が膨大になってしまうため、省略します。

[^1]: 実際にネットワークに接続しシステムに攻撃を仕掛け侵入を試みることで、ネットワーク、PC・サーバーやシステムの脆弱性を検証するテスト手法の1つ




# 行ったセキュリティ対策
- [Amazon GuarddutyによるAWSアカウントの保護](#amazon-guarddutyによるawsアカウントの保護)
- [Amazon WAFによるwebシステムの保護](#amazon-wafによるwebシステムの保護)
- [Amazon Inspectorによる脆弱性診断](#amazon-inspectorによる脆弱性診断)
- [特定のパスは特定のIPからのリクエストのみを受け付ける設定](#特定のパスは特定のipからのリクエストのみを受け付ける設定)


# Amazon GuardDutyによるAWSアカウントの保護
Amazon GuardDutyはAWSアカウントやAWS環境に対する脅威検知サービスであり、AWS環境のセキュリティを継続的にチェックしてくれます。

## 設定方法
「有効化をするだけ」なので、簡単です。

## 何ができるか

AWS環境のセキュリティリスクについて考える際は、以下２つの種類に分けて考える必要があります。
- インターネット上のリソースに対する攻撃リスク
- AWSアカウントへの攻撃リスク

ここで考慮すべき対象としてあがりにくいケースが、AWSアカウントへの攻撃リスクかと思います。
Amazon GuardDutyを使えば、その **検知を行う** 事ができます。

注）勘違いがないように言っておくと、防ぐ事まではできません。

## 動作
AWS 環境内で予期しない潜在的な悪意のあるアクティビティを検出するたびに、結果を生成します。

- 各種AWSのログを収集
    - AWSへのAPIコールを記録するCloudTrailのイベントログ
    - VPC内のトラフィックを記録するVPC Flow Logs
    - 各種リソースからのDNSログ
- ログを機械学習とAIで分析
    - 不正なIPの情報など既存の脅威情報を活用
    - 通常の利用と異なるリクエストなどを検知
    - リスクレベルを10段階で評価


また、有料オプションではありますが、以下の設定を追加する事ができます。
- S3 Protection
S3 データイベントのモニタリングと検出結果の生成。

- EKS Protection
Kubernetes 監査ログとランタイムアクティビティをモニタリングして、EKS クラスターに対する脅威を検出。

- RDS Protection
アカウントの RDS ログインアクティビティを表示およびモニタリング。

- Malware Protection
EC2 インスタンスまたはコンテナワークロード内のマルウェアを示す検出結果を生成した後、自動的にマルウェアスキャンを開始。

- Lambda Protection
アカウントの Lambda 関数からのネットワークアクティビティログを表示およびモニタリング。

今回は、EKS Protection以外の項目を有効化しました。


## 通知
いちいちAWS管理画面を開いて確認する事はできないので、通知の仕組みを導入しました。
以下記事を参考にし、SNS、EventBridge、Chatbotを利用したslack通知を行うようにしました。

https://kikuchitk7.hatenablog.com/entry/2022/03/28/150327

脅威が検出された場合、このような形で通知が来ます。
![スクリーンショット 2023-07-31 14.36.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730383/85919694-f8c8-1a18-6436-98f16173783b.png)

# Amazon WAFによるwebシステムの保護
WAF は、インターネット上のリソースに対する攻撃リスクに対しての保護を目的として使用するサービスです。
例えば、SQLインジェクションやクロスサイトスクリプティング (XSS) などの一般的な攻撃パターンをブロックすることができます。

WAFの設定に関しては、以下記事を参考にしました。
非常に詳しく載っており、わかりやすかったです。
設定項目についての具体的な説明については以下記事を参照してもらえればと思います。

https://www.wafcharm.com/jp/blog/how-to-choose-aws-managed-rules/

設定した内容は以下です。
- Core Rule Set
- Admin Protection
- Known Bad Inputs
- SQL Database
- LINUX operating system
- Amazon IP Reputation
- Anonymous IP List


# Amazon Inspectorによる脆弱性診断
起動しているサーバーで使用しているソフトウェア・パッケージに関する脆弱性があった場合も、攻撃対象となる可能性があるため、対策を打っておく必要があります。

そこで、ソフトウェアの脆弱性や意図しないネットワーク露出がないか継続的にスキャンする脆弱性管理サービスであるAmazon Inspectorを使用し、脆弱性の診断を行いました。

## Amazon Inspectorの診断対象
Amazon EC2 と Amazon ECR にあるコンテナイメージがスキャンの対象です。

## 設定方法
こちらも「有効化をするだけ」なので、簡単です。
初めて Amazon Inspector を利用する場合、15 日間の無料トライアル期間があります。
「Get Started」をクリックしてから「有効化」をクリックしてください。

## 脆弱性の確認方法
少し待つと、以下のようにダッシュボードに脆弱性が表示されます。
![スクリーンショット 2023-07-31 15.52.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730383/404378e7-01bb-0d8c-904b-22d4fc781de4.png)

また、ECRであれば、 **コンテナイメージをプッシュしたタイミング** で診断が始まります。
都度コンテナイメージをプッシュする事で、コンテナイメージ単位での脆弱性を確認する事ができます。

例えば、Critical となっている項目をクリックすると、画面右にその脆弱性についての情報が表示されます。

![スクリーンショット 2023-07-31 15.54.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730383/b92b1413-9f90-a115-7b02-e65b56a87fa3.png)

## 脆弱性の解消方法
上記画面右に表示された「対策」に載っている内容を実施すれば大方解消できます。
私の方では、Dockerfileを修正及びbuildし、都度コンテナイメージをプッシュして診断を行い、脆弱性減ってるかな？
を繰り返し、脆弱性の数を減らしていきました。


# 特定のパスは特定のIPからのリクエストのみを受け付ける設定
今回のiPadからの画像アップロードシステムでは、アップロードされた画像をお客様へ受け渡しするためのLPの表示に関して、サーバーサイドレンダリングを行っている都合上、画像アップロード用のAPIと画面表示用のAPIは、同じロードバランサーを経由する形で構成されています。

- 画像をアップロードするAPI
- 画像受け渡しLPをレンダリングするAPI

画像を受け渡しするAPIに関しては、全てのお客様の端末でアクセスできるようにする必要があるため、
画像をアップロードするAPIのみ、IP制限をかける形としました。

参考にした記事は以下です。

https://dev.classmethod.jp/articles/alb-listerrule-iprestrict/

設定は記事の通りなので、省略します。


# まとめ
無事、外部セキュリティ診断会社によるペンテストの結果、criticalな脆弱性の報告はありませんでした。
特にAmazon GuardDutyと、Amazon WAFに関しては、簡単に導入・設定できる内容なので、やっておかない手はないと思います。まだまだセキュリティ対策に関しての知見を増やしていく必要があるため、これを機に引き続き精進していく所存です。