【ITニュース解説】Automating On-demand GuardDuty EC2 malware scans
2025年09月07日に「Dev.to」が公開したITニュース「Automating On-demand GuardDuty EC2 malware scans」について初心者にもわかりやすいように丁寧に解説しています。
ITニュース概要
AWS GuardDutyとLambda関数をAWS SAMで連携させ、EC2インスタンスのマルウェアスキャンを自動化する方法を解説。これにより、オンデマンドまたは定期的にEC2のセキュリティチェックが実行でき、システム運用におけるセキュリティ対策を強化できる。
ITニュース解説
このニュース記事は、Amazon Web Services(AWS)の環境で稼働する仮想サーバー、EC2インスタンスのマルウェアスキャンを自動化する具体的な方法を解説している。特に、AWSの脅威検知サービスであるGuardDutyを使って、オンデマンドでEC2インスタンスのマルウェアスキャンを定期的に実行する仕組みを、システムエンジニアを目指す初心者にも理解できるように掘り下げていく。
まず、この自動化の目的は、クラウド環境におけるセキュリティを強化することにある。EC2インスタンスは、アプリケーションやサービスを実行するための基盤であり、マルウェア感染はシステム全体のセキュリティリスクを高める。GuardDutyのマルウェアスキャン機能は、EC2インスタンスにアタッチされているストレージ(EBSボリューム)を分析し、マルウェアの脅威を検出する。しかし、このスキャンを手動で実行するのは手間がかかり、忘れがちになるため、自動化が非常に重要となる。
この自動化システムは、主に以下のAWSサービスを組み合わせて構築される。 GuardDutyは、脅威検知とマルウェアスキャンを実行する中核サービスである。 EC2は、スキャン対象となる仮想サーバーである。 Lambdaは、サーバーレスでコードを実行できるサービスで、今回の自動化処理を担う。指定したスケジュールで起動し、マルウェアスキャンを指示する。 AWS SAM (Serverless Application Model) は、Lambda関数などのサーバーレスアプリケーションを簡単に定義し、デプロイするためのフレームワークである。YAML形式のテンプレートファイルで、設定をコードとして管理できる。 IAM (Identity and Access Management) は、AWSリソースへのアクセス権限を管理するサービスである。Lambda関数がGuardDutyやEC2を操作するために必要な権限を与える。 KMS (Key Management Service) は、データ暗号化に使用されるキーを管理するサービスである。スキャン対象のEC2インスタンスのEBSボリュームがKMSカスタマーマネージドキー(CMK)で暗号化されていることが、この仕組みの前提条件となっている。
このシステムの全体像はこうである。AWS SAMテンプレートを用いてLambda関数を定義し、そのLambda関数が毎週月曜日の午前6時 (UTC) に自動で実行されるようにスケジュールを設定する。Lambda関数が起動すると、AWSのPython SDKであるboto3を使って、実行中のEC2インスタンスを特定し、それぞれのインスタンスに対してGuardDutyのマルウェアスキャンを開始する。
SAMテンプレートは、Lambda関数の設定を記述する設計図のようなものである。ニュース記事に示されたYAMLコードブロックでは、EC2MalwareScanという名前のLambda関数を定義している。
Type: AWS::Serverless::Functionは、これがサーバーレス関数であることを示している。
FunctionNameは、Lambda関数にec2-malware-scan-weeklyという名前を付けている。
Runtime: python3.13は、Python 3.13でコードが実行されることを意味する。
Handler: ec2_malware_scan_guardduty.ec2_malware_scanは、Lambdaが呼び出されたときに実行されるPythonコード内の関数を指定している。
CodeUriは、Lambda関数のコードが保存されている場所を指している。
Eventsセクションには、このLambda関数をいつ実行するかを定義している。ScheduleV2タイプは、cron式(cron(0 6 ? * MON *))を使って毎週月曜日の午前6時 (UTC) に実行されるように設定している。これは、定期的なスキャンを自動化するための重要な部分である。
特に重要なのは、Lambda関数に与えられるIAM権限である。Lambda関数は、他のAWSサービス(EC2やGuardDuty)と連携するために、適切な権限を持っている必要がある。このSAMテンプレートでは、以下の権限が設定されている。
ec2:DescribeInstances: 実行中のEC2インスタンスの情報を取得するために必要である。
guardduty:ListDetectors, guardduty:GetDetector, guardduty:StartMalwareScan: GuardDutyの検出器をリストし、その詳細を取得し、オンデマンドでマルウェアスキャンを開始するために必要である。
iam:GetRole, iam:PassRole: GuardDutyのマルウェア保護に必要なサービスリンクロール(特定のAWSサービスがユーザーに代わって他のサービスを操作するための特殊なIAMロール)の情報を取得し、そのロールを渡すために必要である。
sts:GetCallerIdentity: Lambda関数自身のAWS ID(アカウントIDなど)を取得するために必要である。これらの権限は、Lambda関数が必要最小限の操作だけを実行できるように、セキュリティのベストプラクティスに従って設定されている。
次に、Lambda関数の中身となるPythonコードについて見ていく。このコードはboto3ライブラリを利用してAWSサービスと対話する。ec2, guardduty, stsという3つのクライアントを初期化している。
_get_detector_id()関数は、現在のAWSリージョンで設定されているGuardDutyの検出器IDを取得する。検出器が見つからない場合はエラーを発生させる。
_malware_protection_enabled()関数は、取得した検出器IDを使って、GuardDutyのマルウェア保護(EBSボリュームのスキャン)が有効になっているかを確認する。有効でなければ、スキャンは実行できないため、このチェックは重要である。
_running_instances()関数は、現在実行中のEC2インスタンスをリストアップする。instance-state-nameがrunningであるインスタンスと、tag:Nameが何らかの値を持つインスタンスをフィルタリングして取得する。ここで取得されるインスタンスの情報には、インスタンスIDとARN(Amazon Resource Name)が含まれる。
_start_scan()関数は、引数として受け取ったEC2インスタンスのARNに対して、guardduty.start_malware_scanAPIを呼び出し、マルウェアスキャンを開始する。スキャンが成功すればスキャンIDを返し、失敗した場合はエラー情報を返す。
Lambda関数のエントリーポイントであるec2_malware_scan(event, context)関数が、これらの補助関数を呼び出し、全体の処理を統括する。
まず、GuardDutyのマルウェア保護が有効であるかを確認する。有効でなければ、エラーメッセージを返して処理を中断する。
次に、_running_instances()を呼び出して、実行中のEC2インスタンスのリストを取得する。
この際、EXCLUDED_INSTANCESという環境変数にインスタンスIDを指定することで、特定のスキャンしたくないインスタンスをスキャン対象から除外できる機能も組み込まれている。これは、テスト環境のインスタンスや、特定の理由でスキャンを避けたいインスタンスがある場合に便利である。
最後に、スキャン対象となった各インスタンスに対して_start_scan()を呼び出し、マルウェアスキャンを順次開始する。全てのスキャンが完了すると、開始されたスキャンの数や結果をJSON形式で返す。
このシステムを導入する上での前提条件として、スキャン対象となるEC2インスタンスのEBSボリュームがAWS KMSカスタマーマネージドキー(CMK)で暗号化されている必要がある。これは、GuardDutyがEBSボリュームの内容を安全に分析するために必要な条件である。既存のEBSボリュームの暗号化キーを変更する方法も提供されているため、必要に応じて参照すると良い。また、AWS SAMアプリケーションをデプロイするための適切なIAM権限も必要となる。
このように、このニュース記事で解説されている自動化ソリューションは、GuardDutyの強力なマルウェア検知機能を活用し、Lambda関数とAWS SAMを使って、効率的かつ定期的にEC2インスタンスのセキュリティ状態を監視する仕組みを構築する方法を示している。システムエンジニアにとって、このようなセキュリティ自動化は、運用コストの削減とセキュリティレベルの向上に直結する重要なスキルとなるだろう。