[アップデート]Amazon GuardDutyのマルウェアスキャンがAWS管理キーで暗号化されたEBSのスキャンに対応しました

Amazon GuardDutyがAWS管理キーで暗号化されたEBSボリュームをマルウェアスキャンできるようになり、すべてのEBSに対して該当機能が利用できるようになりました。使わない手はない機能なのでとりあえず有効化しておきましょう。
2024.02.06

こんにちは、臼田です。

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

今回はAmazon GuardDutyでめでたくすべてのEBSをスキャンすることができるようになったのでその動作を確認してみたいと思います。

Supported Amazon EBS volumes for malware scan - Amazon GuardDuty

概要

このブログを書いている時点でまだWhat's New等には掲載されていませんが、GuardDutyの機能強化通知にて以下の通知が来ました。

{
    "version": "1",
    "type": "NEW_FEATURES",
    "featureDetails": [
        {
            "link": "https://docs.aws.amazon.com/guardduty/latest/ug/gdu-malpro-supported-volumes.html",
            "featureDescription": "Amazon GuardDuty extends Malware Protection for EC2 instance and container workloads by now also supporting malware scan of EBS volumes encrypted with an AWS managed key. Scans can be initiated by GuardDuty, or by the user through the GuardDuty console, or programmatically via the API, without the need to deploy security software and with no impact to running workloads."
        }
    ]
}

内容は以下のとおりです。

Amazon GuardDuty は、AWS 管理キーで暗号化された EBS ボリュームのマルウェア スキャンもサポートすることで、EC2 インスタンスとコンテナのワークロードのマルウェア保護を拡張します。 スキャンは、GuardDuty によって、またはユーザーが GuardDuty コンソールを通じて、または API を通じてプログラム的に開始でき、セキュリティ ソフトウェアを導入する必要がなく、実行中のワークロードに影響を与えません。

GuardDutyのマルウェアスキャンリリース時には暗号化されていないEBSとカスタマー管理キーで暗号化されたEBSのスキャンが対応していましたが、唯一AWS管理キーで暗号化されたEBSだけスキャンできませんでした。

今回のアップデートですべてのEBSがカバーされたので心置きなくこの機能を利用できます。

GuardDutyのマルウェアスキャン機能は、怪しい挙動を確認したEC2にだけスキャンするという安価でコスパの良いマルウェアスキャンですので、すべてのAWSユーザーが利用すべき機能です。ぜひその恩恵を受けましょう。

やってみた

というわけで実際に動作確認してみます。

すでにGuardDutyは有効になっていてマルウェアスキャンも有効になっている前提です。詳細な方法は前述ブログをご参照ください。

AWS管理キー(デフォルトキー)を使用したEC2を起動します。最近はアカウントの設定でデフォルトで暗号化を入れておけるので便利ですね。私はほぼデフォルトの設定で作成しただけです。以下のように暗号化されていることが確認できます。

続いてこのEC2でマルウェアを仕込んでGuardDutyを検出させます。方法はこれまた前述のブログにある通り、EICARをwgetしてきて、コインマイニング用のドメインにクエリします。Session Managerで接続して操作しますが、これまた最近はDHMCがあるのでロールの割当をしなくてもSession Managerが利用できて便利ですね。以下のような感じ。

sh-4.2$ sudo su - ec2-user
[ec2-user@ip-172-31-31-231 ~]$ wget https://secure.eicar.org/eicar.com
--2024-02-06 05:19:14--  https://secure.eicar.org/eicar.com
Resolving secure.eicar.org (secure.eicar.org)... 89.238.73.97, 2a00:1828:1000:2497::2
Connecting to secure.eicar.org (secure.eicar.org)|89.238.73.97|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 68
Saving to: ‘eicar.com’

100%[===========================================================================================================================>] 68          --.-K/s   in 0s

2024-02-06 05:19:15 (9.91 MB/s) - ‘eicar.com’ saved [68/68]

[ec2-user@ip-172-31-31-231 ~]$ ls -al
total 16
drwx------ 3 ec2-user ec2-user  91 Feb  6 05:19 .
drwxr-xr-x 4 root     root      38 Feb  6 05:18 ..
-rw-r--r-- 1 ec2-user ec2-user  18 Jul 15  2020 .bash_logout
-rw-r--r-- 1 ec2-user ec2-user 193 Jul 15  2020 .bash_profile
-rw-r--r-- 1 ec2-user ec2-user 231 Jul 15  2020 .bashrc
-rw-rw-r-- 1 ec2-user ec2-user  68 Jul  1  2020 eicar.com
drwx------ 2 ec2-user ec2-user  29 Feb  6 05:11 .ssh
[ec2-user@ip-172-31-31-231 ~]$ nslookup pool.supportxmr.com
Server:         172.31.0.2
Address:        172.31.0.2#53

Non-authoritative answer:
pool.supportxmr.com     canonical name = pool-hk.supportxmr.com.
Name:   pool-hk.supportxmr.com
Address: 139.99.123.196
Name:   pool-hk.supportxmr.com
Address: 139.99.124.170
Name:   pool-hk.supportxmr.com
Address: 139.99.125.38

実行できたらしばらく待つとGuardDutyがコインマイニングを検出します。そして追加で10分ぐらい待つとスキャンが完了します。以下の通りEICARの検出ができました。

スキャンの結果も見に行ってみます。スキャンを選んでJSONを確認します。

以下のように"EncryptionType": "EBS_MANAGED"でもスキャンができました。

KMSのポリシーは変更なし

マルウェアスキャンがリリースされた当初は、AWS管理キーのキーポリシー側の問題でスキャンできないと推測していました。そこでポリシーに変更がないか確認しましたが、以下のようにポリシーは変更されていませんでした。

{
    "Version": "2012-10-17",
    "Id": "auto-ebs-2",
    "Statement": [
        {
            "Sid": "Allow access through EBS for all principals in the account that are authorized to use EBS",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*",
                "kms:CreateGrant",
                "kms:DescribeKey"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "kms:ViaService": "ec2.ap-northeast-1.amazonaws.com",
                    "kms:CallerAccount": "999999999999"
                }
            }
        },
        {
            "Sid": "Allow direct access to key metadata to the account",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::999999999999:root"
            },
            "Action": [
                "kms:Describe*",
                "kms:Get*",
                "kms:List*",
                "kms:RevokeGrant"
            ],
            "Resource": "*"
        }
    ]
}

今あらためてこのポリシーを確認してみたら、GuardDutyが利用するマルウェアスキャン用のIAM Roleは自身のAWSアカウントに作成されているため、そのRoleから問題なく利用できるポリシーであると考えられます。

どうやらKMSのポリシーの問題ではなく、単に仕様として縛っていただけかもしれませんね。

ログの確認

マルウェアスキャンに関するログは、スキャン自体のCloudWatch LogsとGuardDutyのRoleの操作に対するCloudTrailログが出ています。

CloudWatch Logsはスキャン画面から開くと、CloudWatch Logs Insightでクエリが入力された状態で開き、すぐにクエリできて便利です。

CloudTrailのログはユーザー名をGuardDutyMalwareProtectionで検索すると確認できます。スナップショットの作成やKMSによるDecryptなど一通りの動作がトラッキング可能です。

機能制限

現状ユーザーガイドによれば、AWS管理キーのEBSマルウェアスキャンはオレゴンリージョンではサポートされていないようです。

Malware Protection でサポートされるボリュームには、AWS 管理のキーで暗号化された Amazon EBS ボリュームも含まれるようになりました。現在、この機能は 米国西部 (オレゴン) リージョンでのみサポートされていません。

まとめ

AWS管理キーで暗号化されたEBSボリュームをAmazon GuardDutyがマルウェアスキャンできるようになりました。もう怖いものなしですね。

使わない手はない機能なので、とりあえずマルウェアスキャンは有効化しておきましょう。