はじめに
本記事はJapan AWS Ambassadors Advent Calendar 2023の11日目の記事になります。
re:Invent参加で溜めてしまった仕事が少しづつ片付きつつ、忘年会が本格的に始まる前に書く事をモチベーションに書いてます。
ECS/Fargateにて見逃せないUpdateがありましたので、下記記事の続きで実際に仮想通貨マイニングソフトが仕込まれたと仮定しGuardDutyでどのように検知されるかを試してみました。
Amazon GuardDuty にて ECS Fargate でセキュリティ上の脅威検出に対応 (Amazon GuardDuty ECS Runtime Monitoring)
目次
手順の概要
- GuardDuty ランタイムモニタリング機能の有効化
- ECRに新しいイメージをBuild&Push
- ECRScanの結果
- 新規ECSTaskの実行
- 検出結果
- GuardDuty検出結果の通知
- Bedrockにて通知サマライズ
想定環境
このような構成でマイニングソフトを仕込まれたイメージをECRにPushされてしまうシナリオ想定です。
他にも条件が揃えばアプリケーション脆弱性を突いて仕込む事も可能かもしれませんが、詳しくないため割愛します。
CodeDeploy による Blue/Green デプロイメントには未対応
実は当初、よくある構成でCI/CD Pipeline経由でマイニングソフトを仕込まれるシナリオを想定していたのですが
上記構成で、ECSタスクKill、パイプライン経由での新しいコンテナのデプロイ、ECSサービスの更新、タスク定義確認 何をやっても上手くいかず、AWSサポートに問い合わせた所
現時点では CodeDeploy による Blue/Green デプロイメントには対応していない、との事でした。 残念..ですがUpdateが心待ちな機能が増えました。
手順
1. GuardDuty ランタイムモニタリング機能の有効化
GuardDutyを有効化後、ランタイムモニタリングを有効化、AWS Fargateで自動エージェント設定を有効化するだけです。
2. ECRに新しいイメージをBuild&Push
既に何らかのアプリケーションが動作している環境に cnrig がインストールされ動作した場合に検知出来るかをテストしてみました。
詳細は割愛しますが、Dockerfileは下記のような形です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
FROM python:3.11.7-slim-bullseye WORKDIR /app COPY . /app RUN apt-get update && \ apt-get -y upgrade && \ pip install -r requirements.txt && \ apt-get install -y wget && \ wget -O cnrig https://github.com/cnrig/cnrig/releases/download/v0.1.5-release/cnrig-0.1.5-linux-x86_64 && \ chmod +x cnrig EXPOSE 80 CMD ["./startup.sh"] |
3. ECRScanの結果
ECRScanはソフトウェア(ライブラリ)の脆弱性スキャナのため、こちらには引っかかりません。
4. 新規ECSTaskの実行
タスク定義・コンテナ設定では何もしていませんが、勝手にサイドカーコンテナが立ち上がりました!
(aws-guardduty-agent-xxxx)
5. 検出結果
どのクラスタ、タスクId (どのバージョンのタスク定義で動いているか) 、コンテナのイメージ元等の情報が詳細に分かります。
また、プロセス名・ID、どちらのドメインと通信しようとしているか(名前引きされた)等も出てきます。
参考までに、コンテナ起動からGuardDuty画面に検出結果が出てくるまでに5分ほどでした。
6. GuardDuty検出結果の通知
EventBridgeにて設定
せっかくなので、検出されたらSNS Topic経由のEメールにて通知を設定してみます。
取り急ぎ、高(7.0~8.9)の通知を受け取る設定をEventBridgeにて設定してみました。
1 2 3 4 5 6 7 8 9 |
{ "source": ["aws.guardduty"], "detail-type": ["GuardDuty Finding"], "detail": { "severity": [{ "numeric": [">=", 7.0] }] } } |
Amazon GuardDuty の検出結果について
https://docs.aws.amazon.com/ja_jp/guardduty/latest/ug/guardduty_findings.html
通知されたメール
無事通知されました!が、折角なのでBedrockでサマライズ&翻訳するとどのようになるのか見てみます。
ちなみに、Amazon Q にJSONを渡して聞いてみようとした所、1,000文字縛りと利用できるキャラクタ制限が厳しく、期待した応答では無かったので断念しました。
7. Bedrockにて通知サマライズ
1 2 3 4 5 6 |
Human: 下記 GuardDuty からのメッセージを詳細に要約してください {"version":"0","id":"a0ab4970-2dc7-ad2b-40a9-569d77bed2fc","detail-type":"GuardDuty Finding","source":"aws.guardduty", ...省略 Assistant: この GuardDuty メッセージは、ECS クラスター "sample-dev-cluster" 上で実行されているタスク`arn:aws:ecs:ap-northeast-1:XXXX:task/sample-dev-cluster/a031235d7e86407ab9ec80da373c12a4` 内のコンテナ "sample-MyApplication" において、プロセス "cnrig" がビットコイン 採掘に関連するドメイン "xxxx" に対して5回の DNS クエリを行ったことを検知したものです。このアクティビティはビットコイン関連の脅威として分類されており、2023-12-07 11:17:00 から 2023-12-07 11:17:06 の間に複数回検知されています。 |
良い感じにサマライズ&翻訳してくれていますね、Bedrockに突っ込むTopicを用意してあげて、翻訳後のテキスト+元の内容を送信用のTopicに送ってあげると皆幸せになれそうです。
まとめ
これまでは、EKSのみ、EC2ホストの場合のみと色々な制約があったモニタリングツールがECS(Fargate環境)でも利用できるようになりました!
コンテナ導入がどんどん増える中、DockerHub上でそこそこ利用されているImageであっても安心出来ない物も中にはあるので、様々な観点から防御・検知が行える事は非常に重要です。
他にも検知されるパターン、eBPF型Agentのため高速という事でサイドカー有無にてベンチマーク取得等も実施してみたかったのですが、またの機会に。