【必見！！！】Cloud One - Application SecurityをWebアプリケーションに組み込んでみた

#はじめに
前回は[RASP](https://qiita.com/chankoba/items/b1254712a4dcc936ab74)について書かせていただきましたが、RASPはすごそうだけど、どういうものなのかわからないという方も多いではないでしょうか。
アプリケーションに組み込んでIPSや、ウイルス対策機能、IPフィルター機能を提供するCloud One - Application Security（以下、Application Security）を触ってみました。

#Application Securityの特徴
Application Securityの特徴：
1.アプリケーションにセキュリティ機能を提供し、リアルタイムにアプリケーションを保護できます。
2.コンテナ環境はもちろん、AWS Lambdaのようなコード実行環境も守ることができます。
3.SQLインジェクションやOSコマンドインジェクションなどOWASP TOP10の脆弱性の対応ができます。
4.IPS/IDS機能も提供し、ゼロディ対策も実現可能です。
5.管理サーバはSaaSで提供されており、導入ハードルが低いです。

ちなみに、2020年10月現在、以下の言語をサポートしています。
- Python
- Java
- PHP
- Node.JS
- .NET（Linuxベースのみ）

#Application Securityが提供する機能
以下の7つの機能を提供しています。
**Malicious Payload**
脆弱性パッチを提供し、ゼロディ対策に使えます。
ベンダーが定期的に脆弱性パッチを公開しています。

**SQL Injection**
SQLインジェクションの試行をブロックします。

**Illegal File Access**
アプリケーションがなんらかの攻撃を受けて、初期せぬファイルにアクセスしようとする際に、その試行をブロックします。

**Remote Command Execution**
アプリケーションがなんらかの攻撃を受けて、コマンド実行を試行をブロックします。

**Open Direct**
アプリケーションがなんらかの攻撃を受けてクライアントに予期せぬWebページを返し、リダイレクションの試行をブロックします。

**Malicious File Upload**
アップロードされたファイルをスキャンし、ウイルスを検知した場合には、通信をブロックします。

**IP Protection**
拒否リストを作成し、特定のIPアドレスからのアクセスを遮断します

#検証環境
今回はAWS EC2を使用し、CentOS7でテストしてみようと思います。

テスト用のWebアプリケーションはGithubやDockerhubなどで探せば色々と出てきますが今回は[**DVWA**](https://hub.docker.com/r/vulnerables/web-dvwa)を使用し、Dockerコンテナを起動し、Webサーバを動かします。
執筆時点ではPHPバージョン7.0となっています。
ちなみにDVWAはPHPベースのWebアプリケーションのようですので、Application Securityがサポートする言語となっています。

#手順1 Cloud Oneのアカウント申請
アカウントは以下のURLから「Create an Account」でアカウントを申請します。
https://cloudone.trendmicro.com/
![アカウント申請.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698816/f0a373ee-c796-2d8a-b740-e09da58dfee4.png)


#手順2 Docker環境の準備

```
sudo -s
yum update　
yum install -y docker　
systemctl start docker　
systemctl enable docker
curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
```
#手順3　Webアプリケーションの準備

DVWAのDockerイメージをPullし、起動します。
待ち受けポートは8888番でなくても問題ありません。
```
docker pull infoslack/dvwa
docker run -d -p 8888:80 -p 3306:3306 -e MYSQL_PASS="mypass" vulnerables/web-dvwa
```
http://<IPアドレス>:8888　で以下のような画面が表示され、「Create/Reset Database」で設定完了です。
![DVWA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698816/bf660824-8113-75e4-21d1-ac4ec825ffaa.png)

ログインユーザ名：admin
パスワード:password


#手順4　Application Securityの組み込み
いよいよApplication Securityの組み込みですね。

まず、手順１で申請したCloud Oneアカウントにログインし、Application Securityの画面でGourpを作成します。
Gourp名は任意で、今回のテストは「DVWA」にします。
![NewGroup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698816/60ff4f2e-4bfc-41eb-46bb-69d7bc363178.png)

KeyとSecretを控えます。
![Key.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698816/bf8835e6-fbb8-d360-ce27-1679d5ef8e49.png)

Application Securityをダウンロードします。PHPであれば[こちら](https://cloudone.trendmicro.com/docs/application-security/downloads/#php)からダウンロードできます。
今回PHP7.0なので、対象バージョンのモジュールをダウンロードします。

```
wget https://files.trendmicro.com/products/CloudOne/ApplicationSecurity/1.0.2/agent-php/trend_app_protect-x86_64-Linux-gnu-4.1.9-20131106.so
```

Dockerコンテナの/tmp配下にコピーします。

```
docker cp ./trend_app_protect-x86_64-Linux-gnu-4.1.9-20131106.so <コンテナID>:/tmp/trend_app_protect-x86_64-Linux-gnu-4.1.9-20131106.so
```

PHPの拡張フォルダにApplication Securityを移動させます。

```
mv /tmp/trend_app_protect-*.so "$(php -r 'echo ini_get (
"extension_dir");')"/trend_app_protect.so
```

控えたKeyとSecretをphp.iniに追記します。

```
; Enable the extension
extension = trend_app_protect.so

; Add key and secret from the Application Protection dashboard
trend_app_protect.key = <Key>
trend_app_protect.secret = <Secret>
```

Apacheを再起動します。

```
service apache2 restart
```

Application Securityのコンソールに入り、ポリシーを編集します。
機能別にオン/オフができます。
REPORT:　ログのみ（ブロックはしません）
MITIGATE：ログ＋ブロック処理

![ポリシー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698816/916baeb1-8a93-bd17-e700-271bb20d6ceb.png)

Application Securityの導入は以上となります。

長々と書きましたが、Application Securityの導入はApplication Securityをダウンロードし、php.iniを編集して、数分もあれば導入完了となります。

試しに、DVWAでぽちぽちクリックしたり、脆弱性をついてみてApplication Securityがそれらをブロックできることを確認できます。
![イベント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698816/8c0352d4-b671-4a86-5963-a2fd9a6ace21.png)

ちなみに、通信をブロックする際に、アクセス元にブロック画面を返すことができます。
CSSはユーザ自身で定義することができますし、リンクを表示させ、
![メッセージ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698816/07941f8d-0460-7423-4b1a-c1c035444981.png)

これでもう一回脆弱性を突いてみると以下の画面が表示されます。
![ブロック.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698816/24799a3b-9ff4-41e7-575f-d8ab62805b09.png)

#まとめ
使ってみた感想として、以下のものがあります。

1.Application Securityの導入が簡単である。
2.SaaSなので管理サーバの用意も不要で、導入ハードルが低い。
3/汎用性があり、複数の言語を対応している。
4.OWASP TOP10をはじめ、さまざまな脆弱性対策に使える
5.アプリケーションレイヤーで動くので、SSL通信においても検知可能です。

さて、いかかでしょうか？RASPでアプリケーションにセキュリティ機能を実装するのは意外と簡単かも？と思っていただけると嬉しいです。

あとAWS Lambdaだと聞いて、保護を諦めた方も多いではないでしょうか？今度はAWS LambdaをApplication Securityで守ってみようと思いますので乞うご期待！