RASPツールの Trend Micro Cloud One Application Security を使ってみました
はじめに
皆さん、こんにちは!DWS のアーノルドです。
現代では、アプリケーションを保護し、安全性を確保することが非常に重要な課題となっています。この目標を達成するための技術の1つとして、Runtime Application Self Protection (RASP) があります。RASP は、悪意のある攻撃や脅威からリアルタイムで保護する、比較的新しい技術です。アプリケーションをリアルタイムで監視することで、疑わしい活動や悪意のある攻撃を検出し、それに応じて対応することができるのが、RASPの特徴なのです※1。
このブログ記事では、RASP 製品の一例である Trend Micro Cloud One Application Security と、意図的に脆弱性を持つ Python アプリケーション「Vulpy」を統合する方法についてハンズオン形式でご紹介していきたいと思います。このチュートリアルに沿って、ぜひご自身の環境でも実践してみてください!
※1 RASPについてもっと知りたい方は、以下のブログ記事をご覧ください:https://blog.mmmcorp.co.jp/blog/2022/11/25/waf-vs-rasp/
前提条件
このチュートリアルを実行するには、以下のものが必要になります。
- Trend Micro Cloud One のアカウント
Cloud One のホームページから30日間の無料体験への登録が可能です。サインアップの際には氏名、メアド、パスワード、会社名のみを入力する必要があり、クレジットカードなどの情報は不要です。 - Python 3.8 がインストールされている Web サーバー ※2
今回の検証環境としては、Ubuntu 20.04 の AWS EC2 インスタンスを使用することにします。 - 上記サーバーのセキュリティグループは、TCP ポート5000へのインバウンド接続を許可にすること。
※2この記事を執筆した時点では、Application Security のエージェントは Python 3.5 〜 3.8 に対応しています。参照:https://cloudone.trendmicro.com/docs/jp/application-security/python/
Application Security の設定
まず最初に、Application Security のダッシュボードでいくつかの設定が必要です。
-
Cloud One のアカウントを作成しログインした後、メインダッシュボードから Application Security を選択します。
-
Application Security が監視・検知するリソースのロジカルなグループを作成します。画面左下の「Create New Group」をクリックし、画面に表示されるダイアログボックスにグループ名を入力し、「Create Group」をクリックします。
-
「Group Credentials」のセクションに表示されるキーとシークレットは、Application Security のエージェントをセットアップする際に必要となるため、メモしておきましょう。
※これらの認証情報は、画面左の歯車アイコンの「Groups Configuration」をクリックすれば、後からでも取得することが可能です。
-
「Groups Policy」の画面で、すべての保護機能をONにします。右側には、"Report "と "Mitigate "の2つのオプションがあります。Report を選択した場合、Application Security は攻撃を検出して報告しますが、ブロックはしようとしません。一方、Mitigate を選択した場合、検出されたすべてのアクティブな脅威をブロックします。
これで、Application Security の設定は完了になります。
次に、Application Security と vulpy のアプリケーションとの連携を行います。
Application Security のエージェントと vulpy を連携させる方法
全体的な流れ
このセクションで実施する手順の要約は、以下のとおりになります。
- GitHub から vulpy のソースコードをダウンロードします。
- 必要なパッケージをインストールします。
- vulpy を設定・実行し、期待通りに動作しているかどうか確認します。
- Application Security のドキュメンテーションに記載されている手順に沿って、Application Security の連携を行います。
- vulpy を再度実行し、アプリケーションセキュリティの連携が正しく行われるかを確認します。
- (オプション) Docker コンテナ化します
上記のステップを完了した GitHub リポジトリに関してはこちらご参照ください。
ローカルな環境での実装手順
-
GitHub から vulpy のソースコードをダウンロードします。
git clone https://github.com/fportantier/vulpy
-
必要なパッケージをインストールします。
sudo apt update && sudo apt install python3-pip -y cd vulpy/ chmod +x install-on-kali.sh sudo ./install-on-kali.sh pip3 install -r requirements.txt
-
vulpy を設定・実行し、期待通りに動作するか確認します。
- データベースの初期化を行います
cd bad/ ./db_init.py
- Vulpy はデフォルトでは localhost からのアクセスのみ許可しているため、インターネットに開放する必要があります。
~/vulpy/bad/vulpy.py
をvim
などで編集し、最下行のapp.run(debug=True, host='127.0.1.1', port=5000, extra_files='csp.txt')
のhost
変数の値を127.0.1.1
から0.0.0.0
に変更しましょう。 ~/vulpy/bad/vulpy.py
を実行し、ブラウザからポート5000でサーバーIPにアクセスしてみます。以下の画面が表示されれば、正常に動作していることがわわかります。
- データベースの初期化を行います
-
Application Security のドキュメンテーションに記載されている手順に沿って、Application Security の連携を行います。
- vulpy のサーバーが動作している場合は、まず Ctrl+C で停止しましょう。
- プロジェクトのルートフォルダにある requirements.txt にApplication Security パッケージを追加します。
echo 'trend_app_protect' >> ~/vulpy/requirements.txt
- pipを再実行してパッケージをインストールします
pip3 install -r ~/vulpy/requirements.txt
~/vulpy/bad/vulpy.py
の先頭(シバンの直下)にimport trend_app_protect.start
の行を追加し、trend_app_protect.start モジュールをインポートします。
- pipを再実行してパッケージをインストールします
bad/
フォルダー内でtrend_app_protect.ini
ファイルを作成し、エージェントキーとシークレットを設定します。
key、secret
の値は、ご自身のアカウントのApplication Security Group Configuration の画面で表示されるものに更新してください。cat << EOF > ./trend_app_protect.ini [trend_app_protect] key = <キーの値を貼り付けます> secret = <シークレットの値を貼り付けます> EOF
-
~/vulpy/bad/vulpy.py
を再度実行し、Application Security の連携が正しく行われるかを確認します。- ブラウザから再度 vulpy にアクセスし、ページを何度も更新したり、あちこちクリックしたりします。その後、アプリケーションセキュリティダッシュボードでリクエスト数を確認します。リクエスト数が増加した場合は、連携が正常に行われていることがわかります。
- ブラウザから再度 vulpy にアクセスし、ページを何度も更新したり、あちこちクリックしたりします。その後、アプリケーションセキュリティダッシュボードでリクエスト数を確認します。リクエスト数が増加した場合は、連携が正常に行われていることがわかります。
(オプション) Dockerコンテナ化
Application Security の連携を含んだ Docker コンテナとして vulpy を動作させることも可能です。実装方法は以下通りとなります:
-
vulpy プロジェクトのルートフォルダに、以下内容のDockerfileを作成します。
FROM python:3.8.11-slim-buster RUN apt-get update && apt-get install --no-install-recommends -y meld python3-flask python3-cryptography python3-geoip2 python3-bcrypt python3-qrcode python3-jsonschema COPY requirements.txt /tmp RUN pip3 install -r /tmp/requirements.txt WORKDIR /vulpy COPY ./bad/ /vulpy/bad/ COPY ./good/ /vulpy/good/ COPY ./utils/ /vulpy/utils/ WORKDIR /vulpy/bad RUN /vulpy/bad/db_init.py ENTRYPOINT ["python3","vulpy.py"]
-
docker build -t vulpy .
を実行します -
docker run -d -p80:5000 vulpy
を実行します -
ブラウザからサーバーの IP(今回はポート80のまま)にアクセスし、Application Security の連携が正常に行われることを確認します。
ZAP で vulpy のサーバーを攻撃して、Application Security の動作確認をしましょう
以下のコマンドを実行すると、OWASP ZAP ※3 を利用してフルスキャン(攻撃)を実行することができます。Application Security のダッシュボードから、攻撃がブロックされている状況をフォローしてみましょう!
docker run --rm -t owasp/zap2docker-weekly zap-full-scan.py -t http://<vulpyのサーバーIPまたはFQDN>:5000 -m 3
※3 OWASP ZAPの概要につきましては、以前のブログ記事をご参照ください。
https://blog.mmmcorp.co.jp/blog/2022/10/18/devsecops-pipeline-with-zap-snyk/
後始末
検証が完了したら、実行中のEC2サーバーなどの不要なリソースを削除することを忘れないようにしましょう!