EC2インスタンスに特定のアプリケーションがインストールされていない場合、Security Hub経由で自動通知させる仕組みを作ってみた

この仕組みによって、EC2インスタンスにセキュリティや監視製品などの必要なアプリケーションが適切にインストールされていることをチェックすることができます。
2023.08.08

はじめに

自身の管理するEC2インスタンスにセキュリティのアプリケーションがインストールされているかチェックしたいことがありました。

アカウント内の全てのEC2インスタンスに特定のアプリケーションがインストール状況をチェックし、未インストールの場合、メールで自動通知する手順を紹介します

構成は以下の通りです。

構築方法の流れは、以下の通りです

  1. EC2インスタンスをAWS Systems Manager(以降、SSM)でマネージドインスタンスにします
  2. SSMインベントリでEC2インスタンスのアプリケーションを含めた情報を取得する設定を行います
  3. 特定のアプリケーションがEC2インスタンスにインストールされているかチェックするAWS Configのルールを作成します
  4. 特定のアプリケーションが未インストールの場合、Security Hubに送信するため、ConfigをSecurity Hubに統合します
  5. 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にアクセスできます。

パブリックサブネット上に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になり、通知がされます。

参考