あなたのAWS S3は安全ですか?

## はじめに

みなさま、超ウキウキするイベントが開催されていることはご存知でしょうか。
TrendMicro社が開催する以下の**イベントで大賞を取ると、超大盤振る舞い、アマゾンギフト券10万円分が手にできます!!**
TrendMicro社が誇るクラウドセキュリティ製品について学びを深めることができて、なおかつ商品ゲットのチャンスもあるということで、参加するしかない...!!と本記事を執筆するに至りました。

https://qiita.com/official-events/21bbb48549a4a68172a4

ギフト券を取るぞという気持ち半分、公平な目線でTrendMicroの製品を評価していき、より良い記事にしたいと考えています。

**アプリケーションでAWS S3を利用している方に、ぜひご覧いただけますと幸いです。
まだ利用されたことがない方も、AWS S3をアプリケーションを利用する機会も増えていると思いますので、ぜひ未来のためにご参考ください。**

## AWS S3のセキュリティって意識できてますか?

突然ですが、AWS S3のセキュリティについて、しっかりと検討できていらっしゃいますか。
AWS S3のセキュリティというと、パブリックアクセスを許可しないようにしようなど、アクセス制限を意識することが多いように思います。

アクセス制限をかけて、、、それで安心だと思っていませんか?
私は思っていました。 ...というよりは、その点しか考慮できていませんでした。

**サーバとS3間がプライベートにアクセスされていても、パブリックにファイルを受け取り、ファイルをS3に保管するようなアプリケーションだと、受信するファイルが安全かチェックする必要があります。**

## S3のセキュリティ対策がされていないと...

たとえば、あなたは勉強がてらTwitterライクなアプリケーションを作り、パブリックに公開していると想定してみましょう。
このアプリケーションでは、自分のプロフィール画像を設定することができます。
ユーザが設定した画像は、アプリケーション経由でAWS S3に保存するような実装になっています。

アプリケーションを公開して、暫くたったある日、クラウドの利用金額が膨大になっていることに気づきました。
久しぶりにAWSコンソールにログインすると、見知らぬEC2インタンスが大量に起動しているではありませんか!
どこかから認証情報が漏れ、攻撃者にマイニング用の環境として利用されていたようです。

調査した結果、AWS S3にウィルスが仕込まれたファイルが保存されており、アプリケーションからそのファイルを読み込んだ際に、不正なプログラムを実行され、コードから認証情報を抜き取って攻撃者に送信されていたことがわかりました。

![computer_virus.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83519/826b4b97-40b7-0657-f7a7-ea5455748a16.png)


あぁ...しっかりとセキュリティを固めておけばよかった...

なんてことになりかねません。もちろん、攻撃は容易ではないため、このような事象が起こる可能性は低いです。
しかし、**一切チェックされていないファイルが内部に保存されることは避けるべき**で、個人開発のアプリケーションならともかく、エンタープライズなアプリケーションでは何らか対策をすべきです。

対策方法としては、以下のようなものが考えられます。

* AWS S3のファイルをスキャンする仕組み/製品を導入する。
* アプリケーションが稼働するサーバにセキュリティ対策製品を導入する ...etc

本記事では、1つめの「AWS S3のファイルをスキャンする製品/仕組みを導入する」で考えてみます。

## AWS S3をスキャンできる製品/仕組みについて

AWS S3をスキャン方法はどのようなものがあるか調べてみましょう。

Googleで「s3 ウィルススキャン」で検索をかけると以下の記事が見つかりました。

https://qiita.com/hitomatagi/items/69ac6d1037b926047010

AWS Lambdaでアンチウィルスソフト(CalmAV)を起動し、S3のファイルをチェックする仕組みを実装しているようです。

引き続き、検索結果を調べていくと、TrendMicroさんのセキュリティソフト(Cloud One File Storage Security)について出てきました。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83519/b3fc358d-cacc-d740-0106-3692f79d8848.png width=600px />

本記事を執筆するに至ったTrendMicroさんの製品ですね。

その後、色々と探しましたが、見つけることができたのは上記の2件でした。
**AWS S3を対象としたセキュリティ製品/仕組みについての情報は少なそう**ですね。

それでは、各製品について調査していきましょう。

OSSツール(ClamAV)については、先人がいらっしゃるため記事の内容を確認するとして、
**本記事では、Cloud One File Storage Securityを導入し、使い勝手を確認していきます。**

## Cloud One File Storage Securityについて

Cloud One File Storage Security のアーキテクチャは以下のようになっています。

> ![スクリーンショット 2021-08-24 2.40.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83519/7a2c1ef1-7e00-bca9-0cc5-44ae32e64f1d.png)
https://cloudone.trendmicro.com/docs/jp/file-storage-security/arch-overview/

詳細なアーキテクチャは、[公式ドキュメント](https://cloudone.trendmicro.com/docs/jp/file-storage-security/arch-overview/)を読んで頂くとわかりやすいです。

ざっくりと説明しますと、以下の様な動作です。

1. ファイルをアップロードすると、SQSにイベントを飛ばす
2. SQSからイベントを受け取ると、Lambdaでウィルススキャンが実行される
3. スキャンが完了すると、スキャン結果情報を、S3オブジェクトファイルのtagに付与する

アーキテクチャ図を確認するとわかるように、**SQSやLambdaが利用されているため、SQSやLambdaのイベント/トリガに応じて、追加の処理を実装することが可能です。**

**デフォルトではファイルにスキャン結果tagを付与するまでで、ユースケースの多そうな「正常なファイルはそのまま保管、ウィルスファイルは隔離/削除」のような処理は追加実装する必要があります。**[公式ドキュメント](https://cloudone.trendmicro.com/docs/jp/file-storage-security/post-scan-action-create/)に、そのような処理を実現するサンプルコードは用意されていますので実装に困ることはなさそうです。

tagは以下の画像のようなイメージで付与されます。このtagは、テスト用ウィルスファイル(eicar)をスキャンした際に付与されたものです。

![スクリーンショット 2021-08-23 23.52.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83519/e9078951-8af6-817a-6877-799a62129431.png)

`fss-scan-result`が正常なもののみ、アプリケーションから利用するなど、実装方法は色々とありそうです。

アーキテクチャについては、確認できましたので実際に導入して動かしてみましょう!

## TrendMicro Cloud One File Storage Securityを導入してみる

TrendMicro公式サイトの「[File Storage Security導入参考ガイド](https://resources.trendmicro.com/jp-docdownload-form-m342-web-cloudone-filestoragesecurity-referenceguide.html?_ga=2.86205272.1143829623.1629726448-674670178.1629726448)」と「[公式ドキュメント](https://cloudone.trendmicro.com/docs/jp/file-storage-security/)」を参考にセットアップしていきます。

### 1. Cloud Oneにログインする

以下ドキュメントを参考に、Cloud One画面にログインします。
https://cloudone.trendmicro.com/docs/jp/file-storage-security/gs-sign-in/

### 2. AWSに Cloud One File Storage Security をデプロイする。

さきほどご説明したアーキテクチャ一式をAll-in-one Stackと呼ぶようです。
以下のドキュメントを参考に、AWS環境にデプロイします。
https://cloudone.trendmicro.com/docs/jp/file-storage-security/gs-deploy-all-in-one-stack/

実際に導入される際は、「[File Storage Security導入参考ガイド](https://resources.trendmicro.com/jp-docdownload-form-m342-web-cloudone-filestoragesecurity-referenceguide.html?_ga=2.86205272.1143829623.1629726448-674670178.1629726448)」か上記のドキュメントを参考にされるとスムーズに進むと思います。**ここでは、デプロイ作業のシンプルさをお伝えするため、手順をサマリでご紹介します。**

1. 以下が`File Storage Security`の管理画面です。 AWSタブから「Deploy」を押下して、画面の案内に沿って進めます。
![スクリーンショット_2021-08-23_22_57_39.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83519/fa4468ab-aefb-f490-27c6-155f226fe6b9.jpeg)
2. デプロイ先のリージョンを選択し、「Launch Stack」をクリックします。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83519/a8798ae9-99f0-e96b-3d3d-fff077de2b88.jpeg width=400px />
3. AWSのCloudFormation画面が開きます。色々と設定値がありますが、私の環境では、スキャン対象のバケット名(S3BucketToScan)だけの入力で問題なく動きました。必要に応じてドキュメントを参照し、パラメータを設定してください。
![スクリーンショット 2021-08-23 23.33.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83519/9910eff8-f665-611e-acd4-89034baf6a1b.png)
4. 手順3のCloudFormationスタックの作成の完了を待ちます。
![スクリーンショット 2021-08-23 23.35.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83519/0c6bb3cd-a1b4-d3a1-62b3-37763d60f766.png)
5. 作成完了後、「Scannar Stack」と「Storage Stack」の2種類が存在することがわかります。それぞれのARNを以下に入力し、「Submit」を押下します。  
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83519/53ce841e-c3e0-1962-bd05-aab5b9c92b85.jpeg width=400px />

以上でデプロイ、Cloud One File Storage Securityの導入は完了です。かんたんですね。

## 動かしてみる

テスト用のウィルスファイル(eicar)をS3にアップロードしてみます。端末にウィルス対策ソフトが導入されていると、自動削除されますのでお試しの際はセキュリティ対策ソフトを無効にしてください。

ドラッグ&ドロップでS3にeicarをアップロードし、以下のようにS3に保管されました。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83519/01c1f5ac-a2c3-db11-bb10-3ce7a2b4c2b2.png width=600px />

アップロード後すぐに、eicar.txtファイルを開くと、以下のスキャン結果tagが付与されていました。
![スクリーンショット 2021-08-23 23.52.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83519/3af7f710-8ee6-b1eb-6698-8b22dc2f35a7.png)

SQS → Lambda(Scan) → SNS → Lambda(tag) と順にいくつかのコンポーネントを通って、非同期にスキャン処理されますが、非常にスピーディーにスキャンが完了していました。

File Storage Securityの管理画面から、スキャンのアクティビティを確認することもできます。
![スクリーンショット_2021-08-23_23_53_44.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83519/51ae0edc-0a63-1477-0adc-c4028da93316.jpeg)

これで、しっかりとS3をスキャンする仕組みが整いました!
攻撃に不安を感じることなく、安心してアプリケーションを公開できそうです。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83519/af05ff2d-6a8d-1038-9df2-235f52b0541e.png width=300px />

## File Storage Securityの良いところ

* 導入が簡単で、数クリックでAWS S3のウィルススキャン環境が準備できる。
  * 内部的にはCloudFormationです。面倒な実装/構築部分を肩代わりしてもらえるので非常に楽です。
* セキュリティ対策に信頼のあるTrendMicro社が提供している。(エンタープライズの製品である)
* AWS LabdaやSQS、SNSで構築されているため拡張しやすい。
  * スキャン結果に応じてファイル移動
  * ウィルスが検知されたら通知...などの仕組みもシンプルに実装できそうですね。

## File Storage Securityの気になるところ

* スキャン後の処理は、ある程度実装が必要である。
  * サンプルコードはドキュメントにあるので、0から実装する必要はない。
* OSSと異なり、AWS費用以外にお金がかかる。
  * 面倒な構築部分を肩代わりしてもらっていたり、信頼性のあるセキュリティソフトを提供してもらっているのでもちろん費用がかかります。
  * どこまで運用をお金で解決するかとの天秤かと思います。

## まとめ

* AWS S3のファイルを簡単にスキャンできる製品「Cloud One File Storage Security」を試してみました。
    * 非常に簡単な手順で、信頼性の高いウィルス対策ソフトを導入できました。
* OSSでも同様の仕組みは実現可能ですが、実装コストがかかります。
* 金額と実装コストとの天秤ですが、信頼性が求められるアプリケーションであったり、運用をなるべく少なくしたいなどの要望があれば、本製品が適しているのではないかなと思いました。

## さいごに

オブジェクトストレージやクラウドのセキュリティ対策をあまり意識したことがなかったため、本記事/本イベントがより多くの人の目に止まれば良いなと思っています。もし **本記事で学びがあった方はLGTMをいただけると嬉しいです。**

本イベントは、8/25終了と期限がまもなくですが、ぜひ参加してみてはいかがでしょうか。
（TrendMicroの関係者ではありませんが、謎に宣伝してみました。）