Fargateでもセキュリティ対策がしたい（DeepSecurity）

# はじめに

Fargateはじめました！でもセキュリティ対策がわかりません！
「Fargate セキュリティ対策」で検索しても、広告と「Fargateはセキュリティ対策不要」という記事しか表示されません！
という、主に企業ではたらくエンジニアさん向けの記事です。

# 要約

- Fargateのセキュリティ対策の選択肢は、大きく3つ
    - サイドカー
    - RASP（アプリに埋め込む）
    - 経路上で対策する
- 今回はRASP方式の「Cloud One」を使うアプローチのお話
    - Cloud OneはDeepSecurit後継製品
- Cloud One自体の情報は少ないが、（~~ググっても出てこない~~）[ドキュメント](https://cloudone.trendmicro.com/docs/application-security/)は丁寧なので導入は楽なはず
- ちなみにFargate以外のサーバレス製品（Lambdaとか）でも動く！
- 対応言語はPython/Java/PHP/Node.JS/.NET 

# Fargateのセキュリティ対策

Fargateを使う利点でもありますが、インフラ・ミドルウェアレイヤーはAWSの責任範囲となります

![alt](https://qiita-image.cloudremix.net/fargate-shared-responsibility.png)

[https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/bestpracticesguide/security-shared.html](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/bestpracticesguide/security-shared.html)

が、稼働するコンテナの責任範囲は引き続きユーザで、何らかのセキュリティ対策必要です。
特に企業ユーザの場合は社内規定でセキュリティ対策が必須になっていることも少なくないはず。

Fargateでセキュリティ対策を手段としては大きく3つの選択肢があります。

1. サイドカー方式のセキュリティコンテナを起動させる
1. 経路上でセキュリティ対策を行う
1. アプリケーションにセキュリティ対策を行う

「1」はFargateのセキュリティ対策として有名なAquaの方式です。
アプリケーションが稼働するコンテナの横に「Aqua Enforcer」といったエージェントコンテナを稼働させ、コンテナを保護します。（いわゆるサイドカー方式）

[コンテナセキュリティの決定版「Aqua Container Security Platform」を試してみた（インストール〜イメージスキャン編）](https://dev.classmethod.jp/articles/about-aqua-csp/)

![alt](https://docs.paloaltonetworks.com/content/dam/techdocs/en_US/dita/_graphics/21-04/prisma-cloud-compute-admin/install_app_embedded_defender_fargate_architecture.png/jcr:content/renditions/original)

[https://docs.paloaltonetworks.com/prisma/prisma-cloud/21-04/prisma-cloud-compute-edition-admin/install/install_defender/install_app_embedded_defender_fargate](https://docs.paloaltonetworks.com/prisma/prisma-cloud/21-04/prisma-cloud-compute-edition-admin/install/install_defender/install_app_embedded_defender_fargate)

「2」はコンテナの起動前、起動後（稼働中）に分けて対策する方式です。
起動前はコンテナイメージに対して脆弱性チェックなどを実施して脅威を排除します。
起動後はコンテナの前段にIPSやWAFを設定し、コンテナに到達する前に脅威を排除します。
脅威が排除された状態で起動され、起動後も外部からの脅威は到達することはないので、コンテナのセキュリティは担保される。という方式らしいです。

「3」は今回使用するCloud Oneの方式で、RASP（Runtime Application Self Protection）と言われています。
仕組みは簡単で、コンテナで動くアプリケーションにセキュリティ対策モジュールを埋め込み、アプリケーションのセキュリティ対策を行おうぜ！という方式で、比較的最近登場した方式らしいです。

[サーバーレス環境をサイバー攻撃から守れ、「RASP」の実力と課題とは | 日経クロステック（xTECH）](https://xtech.nikkei.com/atcl/nxt/column/18/00001/05152/)

RASPという言葉自体初めて聞いたので、ぜひ利用者の方には経験上のメリデメをおしえてほしいところ。

# Cloud Oneについて

Cloud Oneというと聞きなれませんが、Deep Securityの新しい名前で2020年7月に変更されていたようです。

大きく6つのセキュリティ製品から構成されており、今回使用するのはその中の「Application Security」というサーバレス向け製品で、FargateやLambdaといった従来のセキュリティ対策ツールではカバーできない範囲に対応します。

 1. Workload Security（いらゆる従来のアンチウィルスツール）
 1. Application Security（サーバレス向けセキュリティ対策ツール）
 1. Network Security（ネットワーク型IPS）
 1. Container Security（コンテナイメージスキャナー）
 1. File Storage Security（ストレージ向けスキャナー）
 1. Conformity（CSPMソリューション）

[クラウドセキュリティはまとめてシンプルに Trend Micro Deep Security™ on AWS | トレンドマイクロ](https://www.trendmicro.com/ja_jp/business/campaigns/aws/cloud-one-on-aws.html)

コンテナイメージスキャナーも用意されているので、併用すると更にGoodです。
File Storage Securityは、[@sanshouo様が記事を書いてますね](https://qiita.com/sanshouo/items/becfd1b94bd305c67752)


## Application Securityについて

最初に説明した通りですが、Application SecurityはRASP（Runtime Application Self Protection）というアプリケーション自体にセキュリティ対策モジュールを組み込む手法で保護します。従来のサイドカー方式と違ってインフラ構成に影響を与えない点と、セキュリティ対策モジュールがコンテナイメージに含まれるので、気軽にローカル環境で動作確認ができるのがうれしいところです。
（サイドカーだとローカルで動かすのは非常に面倒です。一回仕組みを作れば楽なんでしょうが）

管理画面もいまどきのSaaS（cloudone.trendmicro.com）で特に管理サーバを立てる必要はなく、検知時の挙動としてブロックと通知が選択できます。

### リファレンス

- [公式サイト](https://www.trendmicro.com/ja_jp/business/products/hybrid-cloud/cloud-one-application-security.html)
- [ドキュメント（英語）](https://cloudone.trendmicro.com/docs/application-security/)
- 対応プラットフォーム
    - ECS Fargate
    - Lambda
    - Kubernetes（DaemonSet）
    - Azure Functions
- 対応言語
    - Python
    - Java
    - PHP
    - Node.JS
    - .NET ※プレビュー

# セットアップ

ここからは実際に手を動かします。

## アカウントの作成

Cloud Oneの利用にはあらかじめアカウントが必要です。

とはいえ30日間無償の体験版があり、登録時に必要な項目は「メールアドレス」で、会社名や電話番号は不要です。（今のところ営業メールは来ていません）

### アカウントの作成方法

[https://cloudone.trendmicro.com/register](https://cloudone.trendmicro.com/register)にアクセスして、メールアドレス等に入力して登録するだけです。

![alt](https://qiita-image.cloudremix.net/Creating-Cloud-One-account.jpg)

`no-reply-cloudone@trendmicro.com`から届く認証URLが届くので、それをクリックして管理画面が表示されたら完了。（Gmailだと「迷惑メール」に分類されるので注意です）

ちなみに「Country」を日本にしてもUIが日本語になるわけではありません（残念）

## セキュリティグループの作成と設定

Application Securityでは「セキュリティグループ」という単位でアプリケーションを管理します。
（EC2の仮想FWと同じ名前ですね）

セキュリティグループでは脅威毎のポリシー（ブロック・通知）と細かい検知ルールが設定でき、複数のアプリケーションを登録可能です。

セキュリティグループ毎にキーとシークレットが発行されるので、各アプリケーションにはこのキーとシークレットのセットを設定すれば、いい感じに紐づけが完了します。

### セキュリティグループの作成方法

Cloud Oneにログインし「Application Security」に移動します。

![alt](https://qiita-image.cloudremix.net/Cloud-One-home-screen.jpg)

ダッシュボード**左下**の「Create New Group」をクリックして、セキュリティグループを作成します。

![alt](https://qiita-image.cloudremix.net/Cloud-One-Create-New-Group-1.jpg)

※大文字・小文字は区別されません。

![alt](https://qiita-image.cloudremix.net/Cloud-One-Create-New-Group-2.jpg)

## セキュリティグループの設定

作成したセキュリティグループは左側のバーに表示されます。

![alt](https://qiita-image.cloudremix.net/Cloud-One-Create-New-Group-3.jpg)

[≡] をクリックで設定画面が表示されます。設定項目は左から有効・無効スイッチ、ポリシー（ブロック・通知）で、右側の[≡]で細かいルールを設定できます。

![alt](https://qiita-image.cloudremix.net/Cloud-One-Create-New-Group-4.jpg)

下部はブロック時のメッセージテンプレートで、メッセージは自由に変更できます。
※日本語は使用できません。

なお、セキュリティグループ左横の白丸はステータスで、白or灰色がアプリケーション未接続、緑で同期状態、赤は攻撃検知をあらわします。

## アプリケーションの作成

Application Securityで保護するアプリケーションにはあらかじめセキュリティ対策モジュールとキーとシークレットの設定が必要です。

今回は[クラスメソッド様の記事](https://dev.classmethod.jp/articles/cloud-one-application-security-ecs-fargate/)を参考にします。

## セキュリティ対策モジュールを導入方法

DockerFileにモジュールの組み込み処理を追加します。
詳細は各言語向けのドキュメントを確認します。

 - [Python](https://cloudone.trendmicro.com/docs/application-security/python/#download-the-agent)
 - [Java](https://cloudone.trendmicro.com/docs/application-security/java/#download-the-agent)
 - [PHP](https://cloudone.trendmicro.com/docs/application-security/php/#download-the-agent)
 - [Node.JS](https://cloudone.trendmicro.com/docs/application-security/nodejs-with-express/#download-the-agent)
 - [.NET](https://cloudone.trendmicro.com/docs/application-security/dotnet/#download-the-agent)


```dockerfile
FROM node:13-alpine

WORKDIR /usr/src/app/
RUN mkdir juice-shop
WORKDIR /usr/src/app/juice-shop

RUN wget https://github.com/bkimminich/juice-shop/releases/download/v10.3.2/juice-shop-10.3.2_node13_linux_x64.tgz
RUN tar -xzvf juice-shop-10.3.2_node13_linux_x64.tgz -C /usr/src/app/juice-shop

RUN pwd
RUN ls -al

WORKDIR /usr/src/app/juice-shop/juice-shop_10.3.2

RUN npm install

RUN apk add --update python
RUN apk add make gcc g++
RUN npm i trend_app_protect

RUN sed -i -e "1i require('trend_app_protect');" app.js

ENTRYPOINT ["npm", "start"]
```

あとはいつもどおりに`docker build`を行います。
※キーとシークレットはタスク定義の環境変数に設定します。

## インフラの作成

コンテナアプリケーションが稼働するインフラ基盤を作成します。

 - [ECS クラスター](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/create_cluster.html)
 - [ECS サービス](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/create-service.html)
 - [ECS タスク定義](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/create-task-definition.html)
 - [ECR プライベートレジストリ](https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/repository-create.html)

基本的にリンク先のAWSチュートリアル通りに作成すれば良いですが、次のポイントに修正が必要です。

 - ECS サービス
    - 管理サーバへの通信のため「Public IP」の割り当てが必要です。
    - 通信先:`https://agent-manager.app-protect.trendmicro.com/`[ドキュメント](https://cloudone.trendmicro.com/docs/application-security/agent-connection-failed/)
 - ECS タスク定義
    - コンテナ定義の「environment」にキーとシークレットの設定が必要です。
    - キー
        - name:`TREND_AP_KEY`
    - シークレット
        - name:`TREND_AP_SECRET` 

### インフラの設定

<details><summary>（クリックで表示）作成時のスクリーンショット</summary><div>

#### ECS クラスター

![alt](https://qiita-image.cloudremix.net/Cloud-One-Create-AWS-ECS-Cluster-1.jpg)

![alt](https://qiita-image.cloudremix.net/Cloud-One-Create-AWS-ECS-Cluster-2.jpg)

#### ECS サービス

![alt](https://qiita-image.cloudremix.net/Cloud-One-Create-AWS-ECS-Service.jpg)

#### ECS タスク定義

![alt](https://qiita-image.cloudremix.net/Cloud-One-Create-AWS-ECS-Task-Definition-1.jpg)

![alt](https://qiita-image.cloudremix.net/Cloud-One-Create-AWS-ECS-Task-Definition-2.jpg)


#### ECR プライベートレジストリ

![alt](https://qiita-image.cloudremix.net/Cloud-One-Create-AWS-ECR.jpg)

</div></details>





# 動作確認

http://example.com:3000にアクセス

右上の「Account」をクリックして、ログイン画面を表示します。
（その横で言語設定を日本語にできます）

![alt](https://qiita-image.cloudremix.net/Cloud-One-OWASP-Juice-shop-1.jpg)

SQLインジェクションを起こすユーザ名と適当なパスワードを入力して実行

メールアドレス:`' or 1=1--`
パスワード:`password`

![alt](https://qiita-image.cloudremix.net/Cloud-One-OWASP-Juice-shop-2.jpg)


ブラウザでは特に何も起こりませんが、この状態でダッシュボードにデータが表示されています。
（左上のステータスもグリーンに）

![alt](https://qiita-image.cloudremix.net/Cloud-One-Console-1.jpg)

そしてしばらく待つとSQLインジェクションのイベントが表示されます。
（何件も表示されているのは連打したからです、、、）

![alt](https://qiita-image.cloudremix.net/Cloud-One-Console-3.jpg)



今回は「Report（通知）」を選択していたので、何もおきませんが、「Mitigate（ブロック」を設定しておくと

![alt](https://qiita-image.cloudremix.net/Cloud-One-Console-2.jpg)

こんな感じにブロックが行われます。
（JavaScriptでリクエストを投げているのでひどい絵図になっていますが）

![alt](https://qiita-image.cloudremix.net/Cloud-One-OWASP-Juice-shop-3.jpg)

# まとめ

 - FargateでもCloud One を導入すればセキュリティ対策は可能。
 - Cloud OneはRASP方式を採用し、インフラへの影響を最小限に導入可能。
 - 管理サーバはSaaSでいい感じ

## 気になったこと

 - 管理サーバのタイムアウト時間が短い（多分30分）
    - せっかくリアルタイム更新が使えるのに開きっぱができない
    - 設定画面もなさそうなんで固定？
 - ドキュメントがGoogle検索に引っかからない（検索の仕方がわるい？）
    - 動作確認までした後に気が付いて、めちゃくちゃショック。
    - 内容も丁寧・充実しているのでダブルでショック
    - 「Cloud OneでFargateが保護できるらしいけど何か知らない？」ってわたしの狭い交友範囲でも聞くぐらい需要はあるので、トレンドマイクロさん頑張って
 - 日本語ください
    - 管理画面とメッセージテンプレートに日本語が欲しいです、、、