Amazon GuardDutyのマルウェアスキャン結果を受動的に受け取ることができるか確認してみた + 裏側の仕組みを推測してみた

Amazon GuardDuty Malware Protection機能によるマルウェアスキャンの結果、マルウェアが検知されなくてもその結果を受取る事ができるのか調べてみました。
2022.08.26

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、臼田です。

みなさん、マルウェア検知してますか?(挨拶

今回は、先日アップデートされたGuardDutyのマルウェアスキャン機能について調査したのでその結果を共有します。

スキャン結果を受け取りたい

上記機能を簡単に説明すると、これまでGuardDutyではマルウェア感染などの疑いがあることをVPC Flow LogsやDNS Logsなどで検知できていましたが、じゃあ実際にEC2などの中にマルウェア等が含まれているのか?というところは手動で、何かしらのツールを任意で使って調査する必要がありましたが、それをGuardDutyが自動的にやってくれるようになったというものです。

人が頑張ってやらなければいけなくて、しかもこういう場合往々にしてすぐに使える適切な商用のソフトウェアなどは調達できないためフリーのツールなどを利用してお茶を濁すことも多かったので、マネージドで、自動で、安全に、しかも実環境に影響なく実施してくれるのはまさにネ申アップデートなのです。

今回新しくマルウェアスキャンができるようになり、マルウェアスキャンの結果実際にマルウェアが発見されたら新しいFindings(検知結果)としてイベントが発生します。

問題はここで、じゃあ検知されなかったらどうなるんだ?というとこです。これについて調査をしました。

結論としては、「検知されなかったら自動的に通知はされない」です。

以降は調べた内容と、どうすれば結果を確認することができそうかについて紹介していきます。

マルウェアスキャンとイベントの関係

まずマルウェアスキャンはスキャンの結果何も発見されなかったら、新しいFindingsは作成されず何も通知されません。これは仕様です。

異常がある場合にのみ通知が受け取れることから、これはこれで嬉しい作りであります。

一方で、マルウェアスキャン自体は行われるので、その結果に関わらず終了した際には結果を受け取りたいなーという気持ちにもなるわけです。

例えば、スキャンのトリガーとして既にC&Cサーバーと通信している可能性があります、というFindingsが発生しているわけですから、スキャンが済み次第実際にファイルが存在しているのか、していないのかを知ることで次のアクションに移行することが可能です。現状では見つからなかった場合に何も来ないので、これを能動的に取りに行く必要があり、実際にはマネジメントコンソール上で定期的にステータスを確認する感じになるでしょう。

というわけでFindingsが出ないならどうしようか、というところから調査を始めました。

まず最初に思いついたのは、EventBridgeでイベントが発生するのではないか?というところです。

EventBridgeの画面を確認しましょう。下記はルールを設定するときのイベントパターン設定の画面です。

CloudTrailのものとすべてのイベントは他のサービスでも同じように出るところで、GuardDuty個別のイベントタイプは現状GuardDuty Findingのみです。

先程の記述通りマルウェアスキャン自体はFindingではありませんので、少なくともEventBridgeに用意されているデフォルトのイベントパターンではマルウェアスキャンをキャッチする仕組みは垣間見えません。

そこですべてのイベントを設定して、マルウェアスキャンに関するイベントがEventBridgeに流れてくるかを確認しましたが、Finding発生やGuardDutyの設定更新は通知されるのもの、マルウェアスキャンに関しては流れてきませんでした。

後ほど記述しますが、CloudTrail周りでもマルウェアスキャン自体は直接自信のAWSアカウント上の権限や仕組みで行っているわけではないため、イベントに上がってこないと推測しました。

APIからマルウェアスキャンの挙動を推測する

どうやらマルウェアスキャンのイベントを受け取るのが難しそうなので、マルウェアスキャンに関するAPIからもう少し挙動を確認してみようと思いました。

GuradDutyのAPIリファレンスには*Malware*となっているAPIは下記3種類ありました。

  • DescribeMalwareScans
  • GetMalwareScanSettings
  • UpdateMalwareScanSettings

うち2つは設定に関するものですから、実質マルウェアスキャンの情報を取得するAPIは1つです。リストとして一覧を取得するAPIと詳細を取得するAPIが1つになっているのでなかなかなものですね!

そして、私が気にしてたポイントとしては、マルウェアスキャンを実行するAPIが無いということです。当たり前といえば当たり前ですが、このスキャン自体はGuardDutyの機能として内部的に実行され、我々のAWS環境上で表に見えるような操作がされるわけでは無いので、我々の見える(利用できる)APIも無いということですね。

そのため、先程あげたEventBridgeのうちCloudTrailをベースとしたGuardDutyイベントでMalwareスキャン関連のイベントが上がってこないのも納得がいきます。

それでも検知したい場合のアプローチ案

私の目的としては、出てくるものがあれば拾いたい、というモチベーションなので、ここまで調査して満足したのですが、もしどうしても無理矢理にでもスキャン結果が問題なくてもそれを知りたい、という方のためにアプローチだけ考えてみました。未検証なのでやりたい方はやってみて、結果をアウトプットしてもらえればと思います。

案1: スキャン対象のFindingsを受け取ったら定期的に結果をポーリングする

マルウェアスキャンはトリガーされるFinding Typesは決まっています。なのでこれを追跡することでスキャンが起きていることを確認でき、結果ポーリングするトリガーにできます。

対象Finding Typesはこちらにありますが、こちらの欠点はこのリストの管理が難しいところです。何かしら仕組みで提供されているリストではないので、更新があった時にその検知と変更対応を頑張る必要があります。

まあそんなに更新頻度が高くないと思うのでリアルタイム性が必要ないとは思いますが、考えるのが大変そうなので考えるのをやめました。

案2: GuardDutyMalwareProtectionユーザーのCreateTagsを確認する

一方で、マルウェアスキャンの挙動をCloudTrailから確認できる部分もあります。前回の機能紹介のブログにも書いてありますが、このスキャンに必要なEBSのスナップショット作成などは今回新しく作られたService-Linked RoleであるAWSServiceRoleForAmazonGuardDutyMalwareProtectionGuardDutyMalwareProtectionというユーザー名で利用されますので、このユーザー名のCloudTrailログを確認すればマルウェアスキャンに関する挙動のうち、APIが実行されている部分は確認できます。

この内、下記のようにCreateTagsのイベントのリクエスト内容を見ればスキャン結果のタグ付けが確認できるので、結果を拾うことができそうです。

具体的なやり方はおまかせします。(丸投げ

まとめ

GuardDutyのマルウェアスキャンの結果を受け取ることができるのか、という観点で調査をしたので結果をまとめました。

残念ながら現状は楽に受け取ることはできなかったですが、仕組みはいろいろと理解できました。

この機能が欲しいなーと思った方は是非AWSにフィードバックしましょう。