EC2インスタンスに特定のアプリケーションがインストールされていない場合、Security Hub経由で自動通知させる仕組みを作ってみた
はじめに
自身の管理するEC2インスタンスにセキュリティのアプリケーションがインストールされているかチェックしたいことがありました。
アカウント内の全てのEC2インスタンスに特定のアプリケーションがインストール状況をチェックし、未インストールの場合、メールで自動通知する手順を紹介します
構成は以下の通りです。
構築方法の流れは、以下の通りです
- EC2インスタンスをAWS Systems Manager(以降、SSM)でマネージドインスタンスにします
- SSMインベントリでEC2インスタンスのアプリケーションを含めた情報を取得する設定を行います
- 特定のアプリケーションがEC2インスタンスにインストールされているかチェックするAWS Configのルールを作成します
- 特定のアプリケーションが未インストールの場合、Security Hubに送信するため、ConfigをSecurity Hubに統合します
- EventBridgeを使用して、Security HubにConfigルールの非準拠が通知された際にSNSを使用してメール通知を設定します
Security Hubを利用しない場合、以下の記事の方法でも実現できます。
ただし、Security Hubをすでに利用している環境の場合や、マルチアカウントの場合、管理アカウントのSecurity Hubで複数のSecurity Hubを集約できるため、今回はSecurity Hubを経由します。
EC2インスタンスをマネージドインスタンス
使用するOSは、Amazon Linux 2023で、EC2インスタンスは、2つ用意します。
1つは、特定のアプリケーションをインストール済み、もう一つは、未インストールEC2インスタンスです。
プライベートサブネット上にEC2インスタンスがある場合、以下の記事を参考に設定しましょう。
上記の記事でも説明している通り、プライベートサブネットの場合、以下の4つを設定する必要があります
- EC2インスタンスにSSMエージェントがインストールされていること
- SSMへのアクセスに必要なIAMロールがEC2インスタンスに関連付いていること
- NATGatewayでインターネットにアクセスできる
- 今回、Nginxをインストールするため。インストールしなくて良い場合、不要です
- SSMへアクセス可能な環境がVPCエンドポイントかNAT Gatewayを通じて提供されること
- VPCエンドポイントの場合、以下の3つが必要です
- com.amazonaws.region.ssm
- com.amazonaws.region.ec2messages
- com.amazonaws.region.ssmmessages
- NAT Gatewayの場合は、SSMにアクセスできます。
- VPCエンドポイントの場合、以下の3つが必要です
パブリックサブネット上にEC2インスタンスがいる場合は、以下の3つの設定が必要です
- EC2インスタンスに、SSMエージェントがインストールされていること
- EC2インスタンスに、SSMへのアクセスに必要なIAMロールが関連付けられていること
- EC2インスタンスに、パブリックIPが付与されていること。
特定のアプリケーションをインストール
今回は、EC2インスタンスに、Nginxがインストールされているかチェックをします。
セッションマネージャーを使用してEC2インスタンスに接続し、EC2インスタンスの1台にNginxをインストールします。
sudo dnf -y install nginx Complete!
SSMインベントリの設定
SSMのFleet Managerで、EC2インスタンスがマネージドインスタンスとして表示されていることを確認します。
続いて、SSMインベントリの設定をします。
名前とターゲットとスケジュールを設定して、他はデフォルトのまま作成します。
名前は、Inventory-Association-nginx
です
ターゲットは、NginxをインストールしたEC2インスタンスと未インストールのEC2インスタンスで。
スケジュールでは、30分毎にSSMインベントリデータを収集する設定にします。
[インベントリ]から、画面最下部のインスタンスIDをクリックすると、インスタンスのSSMインベントリが確認できます。
SSMインベントリからNginxのバージョンなどが確認できました。
Configの設定
Configを有効にします。
Configルールに記録対象のリソースタイプとしてAWS SSM ManagedInstanceInventory
を含めることで、SSMインベントリをConfigに記録できます。
記録対象を設定した直後は、SSMインベントリデータはまだConfigに記録されていません。
SSMインベントリを手動で収集するため、作成したSSMインベントリ設定の[設定]から、アソシエーションID
をクリックします
[Apply association now]をクリックすると、SSMインベントリがすぐに収集され、Configにも記録されるようになります。
Configに戻り、[リソース]からConfigが記録した[SSM ManagedInstanceInventory]タイプのEC2インスタンスIDをクリックします。
EC2インスタンスのOSやインストール済みのアプリケーション情報などが確認できます。
Configのルール作成
Configルールを作成します。
AWSマネージドルールのec2-managedinstance-applications-required
を選択します。
このルールは、EC2インスタンスに指定したアプリケーションがインストールされているかを確認します。
ルール名を記入し、パラメータのキーapplicationNames
の値は、nginx
にします。
platformType
の値は、なくてもよいです。
他は、デフォルトのまま作成します。
作成すると、アプリケーションがインストールされていれば準拠、されていなければ非準拠になります。
Security Hubを有効にする
Security Hubの有効方法については、以下の記事をご参照ください。
Configの結果をSecurity Hubに送信するため、[統合]からステータスを確認します。
Configが有効化されているリージョンでは自動で連携される設定になっているため、特に設定は必要ありませんでした。
[結果を参照]をクリックすると、Configの評価結果があり、非準拠のec2-managedinstance-applications-required-nginx
のConfigルールもFailedと確認できました。
SNS作成
メールを送信するためのトピックを作成します。
送信したいメールアドレスを記載し、サブスクリプションを作成します。
指定したメールアドレスにメールが送信されるため、受信箱から確認します。
EventBridgeを設定
ec2-managedinstance-applications-required-nginx
ルールが非準拠の場合、Security Hubからメール通知するようにEventBridge設定します。
イベントパターンは、以下の記事を参考にしました。
{ "source": ["aws.securityhub"], "detail-type": ["Security Hub Findings - Imported"], "detail": { "findings": { "Compliance": { "Status": ["FAILED", "WARNING", "NOT_AVAILABLE"] }, "RecordState": ["ACTIVE"], "Workflow": { "Status": ["NEW"] } } } }
ターゲットは、作成したSNSを指定します。
[ターゲット入力を設定]は、入力トランスフォーマー
を選択します。
理由としては、メール通知の文章を読みやすくするためです。
下記記事を参考にしました。
ターゲット入力トランスフォーマーは、入力パス
とテンプレート
を以下の用に入力します。
{ "Account_ID": "$.detail.findings[0].AwsAccountId", "Finding_Type": "$.detail.findings[0].Types[0]", "Finding_description": "$.detail.findings[0].Description", "region": "$.region", "severity": "$.detail.findings[0].Severity.Label" }
"AWS <Account_ID> has a severity <severity> Security HUB finding type <Finding_Type> in the <region> region." "Finding Description:" "<Finding_description>. " "For more details open the Security HUB console at https://<region>.console.aws.amazon.com/securityhub/home?region=<region>#/summary"
テストしてみる
Security Hubから、[ワークフローのステータス]から新規
をクリックすると、EventBridgeがトリガーされメールが通知するはずです。
ec2-managedinstance-applications-required-nginx
というルールで、特定のアプリケーションがインストールされていないEC2インスタンスがあった場合、メールで通知することができました!
Security Hubのステータスは、以下のような運用で対応するとよいでしょう。
- メールで通知確認した場合、
通知済み
- メール通知されたEC2には、特定のアプリケーションのインストールが不要の場合、
抑制済み
- インストール対応した場合、
解決済み
Security Hub運用時のクエッション
- 未インストールでSecurity Hubのステータスが
NEW
場合、インストールすると自動でステータスが解決済み
になるか- →なります。
- インストールした後、アプリケーションをアンインストールしたら、通知がされる?
- →ワークフローのステータスが
NEW
になり、通知がされます。
- →ワークフローのステータスが