[アップデート] AWS Chatbotを使ったSecurity Hubの検知通知に検知を抑制するボタンが自動設定されるようになりました

スムーズに検知を抑制したい場合に役立ちそう
2024.04.30

検知の抑制をスムーズに行いたい

こんにちは、のんピ(@non____97)です。

皆さんはSecurity Hubの通知の抑制をスムーズに行いたいなと思ったことはありますか? 私はあります。

通知の内容を確認して、明らかに抑制する形で良いものであった場合はすぐさまに検知を抑制したいところです。都度各AWSアカウントにログインして検知を抑制するのは地味に面倒です。

今回、AWS Chatbotを使ったSecurity Hubの検知通知に検知を抑制するボタンが自動設定されるようになりました。

これは、昨年のアップデートにより追加されたAWS Chatbotのアクションボタンを活用したものです。

これにより、都度各AWSアカウントにログインして検知を抑制する必要がなくなりました。通知されたSlackやTeamsのチャンネル上で、通知内容について議論してそのまま検知を抑制することが可能になります。オペレーションがスムーズになりそうです。

実際にやってみたので紹介します。

いきなりまとめ

  • SlackやTeamsチャンネル上でSecurity Hubの検知を抑制できるようになった
  • チャンネル内のいずれのメンバーもチャンネル内で抑制しないようにするためには以下のいずれかを行う
    • チャネルロールにSecurity HubのBatchUpdateFindingsの許可するポリシーを付与しない
    • ガードレールポリシーにSecurity HubのBatchUpdateFindingsの許可するポリシーを付与しない
  • チャンネル内の特定ユーザーにのみチャンネル内での通知の抑制を許可する場合はユーザーロールを設定する

やってみた

AWS ChatbotとEventBridge Ruleの設定

まず、AWS ChatbotとEventBridge Ruleの設定を行います。

事前準備として以下の設定を行います。

  • AWS ChatbotにてSlackのワークグループを追加
  • 通知先のチャンネルにAWS Chatbotのアプリを追加

それ以外のリソースはAWS CDKでデプロイします。

./lib/security-hub-notification-stack.ts

import * as cdk from "aws-cdk-lib";
import { Construct } from "constructs";

export class SecurityHubNotificationStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const topic = new cdk.aws_sns.Topic(this, "Topic");

    const slackChannel = new cdk.aws_chatbot.SlackChannelConfiguration(
      this,
      "SlackChannel",
      {
        slackChannelConfigurationName: "times-non-97",
        slackWorkspaceId: "<SlackワークスペースID>",
        slackChannelId: "<SlackチャンネルID>",
        guardrailPolicies: [
          cdk.aws_iam.ManagedPolicy.fromAwsManagedPolicyName(
            "AWSSecurityHubFullAccess"
          ),
        ],
      }
    );

    slackChannel.addNotificationTopic(topic);

    new cdk.aws_events.Rule(this, "Rule", {
      eventPattern: {
        source: ["aws.securityhub"],
        detailType: ["Security Hub Findings - Imported"],
        detail: {
          findings: {
            ProductFields: {
              StandardsArn: [
                "arn:aws:securityhub:::standards/aws-foundational-security-best-practices/v/1.0.0",
              ],
            },
            Compliance: {
              Status: [
                {
                  "anything-but": "PASSED",
                },
              ],
            },
            Severity: {
              Label: ["CRITICAL", "HIGH", "MEDIUM"],
            },
            Workflow: {
              Status: ["NEW"],
            },
            RecordState: ["ACTIVE"],
          },
        },
      },
      targets: [new cdk.aws_events_targets.SnsTopic(topic)],
    });
  }
}

パブリック IPv4 アドレスを自動割り当ての有効化

Security Hubで検知してくれるように、パブリック IPv4 アドレスを自動割り当ての有効化を行います。こちらはEC2.15というコントロールに該当します。

パブリック IPv4 アドレスを自動割り当ての有効化

数分待つと、Security Hubで該当リソースが検知されていました。

検出されたことを確認

加えて、指定したSlackチャンネルに通知が来ました。Suppress findingsというボタンを確認できますね。

EC2.15 EC2 subnets should not automatically assign public IP addresses

通知の抑制

それでは通知の抑制を行ってみます。

Suppress findingsをクリックすると、指定した検知項目の抑制をしても良いか確認されます。Suprpressをクリックします。

Suppress finding?

すると、I got an exception when trying to run the commandとエラーになりました。

I got an exception when trying to run the command

これはチャネルロールにSecurity HubのBatchUpdateFindingsの許可がないためです。

以下のようにSecurity HubのBatchUpdateFindingsの許可を設定してあげます。

./lib/security-hub-notification-stack.ts

import * as cdk from "aws-cdk-lib";
import { Construct } from "constructs";

export class SecurityHubNotificationStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const topic = new cdk.aws_sns.Topic(this, "Topic");

    const slackChannel = new cdk.aws_chatbot.SlackChannelConfiguration(
      this,
      "SlackChannel",
      {
        slackChannelConfigurationName: "times-non-97",
        slackWorkspaceId: "<SlackワークスペースID>",
        slackChannelId: "<SlackチャンネルID>",
        guardrailPolicies: [
          cdk.aws_iam.ManagedPolicy.fromAwsManagedPolicyName(
            "AWSSecurityHubFullAccess"
          ),
        ],
      }
    );

    slackChannel.addToRolePolicy(
      new cdk.aws_iam.PolicyStatement({
        effect: cdk.aws_iam.Effect.ALLOW,
        actions: ["securityhub:BatchUpdateFindings"],
        resources: ["*"],
      })
    );
.
.
(中略)
.
.
}

設定後、再度デプロイします。

デプロイ完了後にSuppress findings-Suppressをクリックすると、Suppressed finding with ID:<FindingのID>のメッセージが出力されました。

Suppressed finding with ID-

Security Hubのコンソールを確認すると、確かに該当項目が抑制済みになっています。やったぜ。

抑制されたことを確認

スムーズに検知を抑制したい場合に役立ちそう

AWS Chatbotを使ったSecurity Hubの検知通知に検知を抑制するボタンが自動設定されるようになったアップデートを紹介しました。

スムーズに検知を抑制したい場合に役立ちそうですね。

一方で気になるポイントとしては、紹介した方法だとチャンネルに参加している誰でも検知を抑制できるところでしょうか。

チャンネル参加者全員が検知抑制をできる権限持たせても良いのであれば問題ないですが、そうでない場合もあるでしょう。その場合はAWS Chatbotでチャネルロールではなくユーザーロールを用いて権限付与をしましょう。ユーザーロールを用いることでチャンネル参加者個別に権限を付与することができます。

また、検知を抑制する際にはGitHubやGitLabのIssueの中で議論してから行いたい組織もあるでしょう。そのような運用をしている場合、チャンネル上で意思決定をして検知を抑制されると情報が散らばってしまいます。このような場合はチャネルロールやガードレールポリシーにSecurity HubのBatchUpdateFindingsの許可するポリシーを付与しないことで対処可能です。

場合によってはIssue内にチャンネル上のやり取りを転記する形や、Issue内でやりとりしてからチャンネル上で抑制するというのもアリかと思います。

この記事が誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!