Security Hub SSM.1コントロールをタグベースで自動抑制する仕組みを作ってみる

Security Hub SSM.1コントロールをタグベースで自動抑制する仕組みを作ってみる

Clock Icon2025.02.19

自分の関わっている環境ではEC2インスタンスを Systems Manager(SSM)管理下にすることを標準としています。 SSMを通じてソフトウェア棚卸しやパッチ管理、コマンド実行などを 一元的に実施できます。

SSM管理下を標準とするために、検出環境の構築は必須です。 SSM管理になっていないインスタンスを検出するには、 SSM.1コントロール が役に立ちます。

https://dev.classmethod.jp/articles/securityhub-fsbp-remediation-ssm-1/

ただ 一部のインスタンスにおいては、特別な理由で 検出を抑制させたいケースがでてきます。 例えば「ある分析ワークロードにおいて、 計算処理用に一時的に起動されるインスタンス」などです。

今回はそういったインスタンスを Security Hub の Automation Rules を使って自動抑制してみます。 本ブログでは「抑制する/しないの判断」にはリソースタグを使います。

Automation Rules を作成する

Security Hub の [管理 > オートメーション] から [ルールを作成] を選択します。

sc_2025-02-18_15-32-29_10757

ルールタイプを [カスタムルール] として、 ルール名と説明を記入します。

sc_2025-02-18_15-38-11_5697

項目
ルール名 suppress-ssm1-specific-noncompliant-instances
ルールの説明 Automatically suppresses SSM.1 findings for specific non-compliant instances based on defined tags.

ルールの条件は以下のような項目を記載します。 ひとことでいうと SSM.1に失敗している特定リソースタグの新規検出結果 が条件です。

sc_2025-02-18_15-42-44_23754

キー 演算子
ComplianceSecurityControlId Equals SSM.1
RecordState Equals ACTIVE
WorkflowStatus Equals NEW
ComplianceStatus Equals FAILED
ResourceTags Equals SSM1Exception=Yes

自動アクションは以下赤枠部分のみ変更して、 ほかはそのままです。

sc_2025-02-18_15-45-05_8552

項目
ワークフローステータス SUPPRESSED
Automatically suppressed - Instance tagged with SSM1Exception=Yes

ルールステータスは [有効] のままで、作成します。

sc_2025-02-18_15-45-42_5147

sc_2025-02-19_07-39-05_1923
作成後のルール画面

抑制されることを確認する

実際にインスタンスを立ててみます。 SSM管理下にならない設定で、 SSM1Exception=Yes タグを付与したインスタンスを起動しました。

sc_2025-02-18_15-53-56_27012

その後、Security Hub のコンソールを確認すると、 ちゃんと抑制済み(SUPPRESSED)になっていました。

sc_2025-02-19_07-35-39_24614

sc_2025-02-19_07-36-03_31791
注(Note)も付与されている

おわりに

Security Hub Automation Rules の1活用例でした。 SSMの利用を標準としている環境では、 役に立つ場面があるのではないでしょうか。

以上、参考になれば幸いです。

参考

補足

作成したAutomation Rulesの設定(AWS CLI)

aws securityhub list-automation-rules
{
  "AutomationRulesMetadata": [
    {
      "RuleArn": "arn:aws:securityhub:ap-northeast-1:123456789012:automation-rule/6f331a72-f52a-4d92-b596-4c505c6a25b3",
      "RuleStatus": "ENABLED",
      "RuleOrder": 1,
      "RuleName": "suppress-ssm1-specific-noncompliant-instances",
      "Description": "Automatically suppresses SSM.1 findings for specific non-compliant instances based on defined tags.",
      "IsTerminal": false,
      "CreatedAt": "2025-02-18T06:46:28.510000+00:00",
      "UpdatedAt": "2025-02-18T06:46:28.510000+00:00",
      "CreatedBy": "arn:aws:sts::123456789012:assumed-role/kawahara.masahiro/kawahara.masahiro"
    }
  ]
}
aws securityhub batch-get-automation-rules
{
  "Rules": [
    {
      "RuleArn": "arn:aws:securityhub:ap-northeast-1:123456789012:automation-rule/6f331a72-f52a-4d92-b596-4c505c6a25b3",
      "RuleStatus": "ENABLED",
      "RuleOrder": 1,
      "RuleName": "suppress-ssm1-specific-noncompliant-instances",
      "Description": "Automatically suppresses SSM.1 findings for specific non-compliant instances based on defined tags.",
      "IsTerminal": false,
      "Criteria": {
        "ResourceTags": [
          {
            "Key": "SSM1Exception",
            "Value": "Yes",
            "Comparison": "EQUALS"
          }
        ],
        "ComplianceStatus": [
          {
            "Value": "FAILED",
            "Comparison": "EQUALS"
          }
        ],
        "ComplianceSecurityControlId": [
          {
            "Value": "SSM.1",
            "Comparison": "EQUALS"
          }
        ],
        "WorkflowStatus": [
          {
            "Value": "NEW",
            "Comparison": "EQUALS"
          }
        ],
        "RecordState": [
          {
            "Value": "ACTIVE",
            "Comparison": "EQUALS"
          }
        ]
      },
      "Actions": [
        {
          "Type": "FINDING_FIELDS_UPDATE",
          "FindingFieldsUpdate": {
            "Note": {
              "Text": "Automatically suppressed: Instance tagged with SSM1Exception=Yes",
              "UpdatedBy": "sechub-automation"
            },
            "Workflow": {
              "Status": "SUPPRESSED"
            }
          }
        }
      ],
      "CreatedAt": "2025-02-18T06:46:28.510000+00:00",
      "UpdatedAt": "2025-02-18T06:46:28.510000+00:00",
      "CreatedBy": "arn:aws:sts::123456789012:assumed-role/kawahara.masahiro/kawahara.masahiro"
    }
  ],
  "UnprocessedAutomationRules": []
}

Automation Rules によって抑制された検出結果JSON

finding.json
{
  "AwsAccountId": "123456789012",
  "AwsAccountName": "Example",
  "CompanyName": "AWS",
  "Compliance": {
    "Status": "FAILED",
    "SecurityControlId": "SSM.1",
    "AssociatedStandards": [
      {
        "StandardsId": "standards/aws-foundational-security-best-practices/v/1.0.0"
      }
    ]
  },
  "CreatedAt": "2025-02-18T08:55:31.796Z",
  "Description": "This AWS control checks whether the Amazon EC2 instances in your account are managed by AWS Systems Manager.",
  "FindingProviderFields": {
    "Types": [
      "Software and Configuration Checks/Industry and Regulatory Standards/AWS-Foundational-Security-Best-Practices"
    ],
    "Severity": {
      "Normalized": 40,
      "Label": "MEDIUM",
      "Product": 40,
      "Original": "MEDIUM"
    }
  },
  "FirstObservedAt": "2025-02-18T08:55:26.787Z",
  "GeneratorId": "aws-foundational-security-best-practices/v/1.0.0/SSM.1",
  "Id": "arn:aws:securityhub:ap-northeast-1:123456789012:subscription/aws-foundational-security-best-practices/v/1.0.0/SSM.1/finding/c9283490-6750-470e-bc70-b26ce413c754",
  "LastObservedAt": "2025-02-18T08:55:26.787Z",
  "Note": {
    "UpdatedBy": "sechub-automation",
    "Text": "Automatically suppressed: Instance tagged with SSM1Exception=Yes",
    "UpdatedAt": "2025-02-18T08:55:46.734Z"
  },
  "ProcessedAt": "2025-02-18T08:55:47.474Z",
  "ProductArn": "arn:aws:securityhub:ap-northeast-1::product/aws/securityhub",
  "ProductFields": {
    "StandardsArn": "arn:aws:securityhub:::standards/aws-foundational-security-best-practices/v/1.0.0",
    "StandardsSubscriptionArn": "arn:aws:securityhub:ap-northeast-1:123456789012:subscription/aws-foundational-security-best-practices/v/1.0.0",
    "ControlId": "SSM.1",
    "RecommendationUrl": "https://docs.aws.amazon.com/console/securityhub/SSM.1/remediation",
    "RelatedAWSResources:0/name": "securityhub-ec2-instance-managed-by-ssm-f1a7341e",
    "RelatedAWSResources:0/type": "AWS::Config::ConfigRule",
    "StandardsControlArn": "arn:aws:securityhub:ap-northeast-1:123456789012:control/aws-foundational-security-best-practices/v/1.0.0/SSM.1",
    "aws/securityhub/ProductName": "Security Hub",
    "aws/securityhub/CompanyName": "AWS",
    "Resources:0/Id": "arn:aws:ec2:ap-northeast-1:123456789012:instance/i-0e0341987fd0fd6ee",
    "aws/securityhub/FindingId": "arn:aws:securityhub:ap-northeast-1::product/aws/securityhub/arn:aws:securityhub:ap-northeast-1:123456789012:subscription/aws-foundational-security-best-practices/v/1.0.0/SSM.1/finding/c9283490-6750-470e-bc70-b26ce413c754"
  },
  "ProductName": "Security Hub",
  "RecordState": "ACTIVE",
  "Region": "ap-northeast-1",
  "Remediation": {
    "Recommendation": {
      "Text": "For information on how to correct this issue, consult the AWS Security Hub controls documentation.",
      "Url": "https://docs.aws.amazon.com/console/securityhub/SSM.1/remediation"
    }
  },
  "Resources": [
    {
      "Details": {
        "AwsEc2Instance": {
          "VpcId": "vpc-003dfbc1e9ada85c7",
          "MetadataOptions": {
            "HttpPutResponseHopLimit": 2,
            "HttpProtocolIpv6": "disabled",
            "HttpTokens": "required",
            "InstanceMetadataTags": "disabled",
            "HttpEndpoint": "enabled"
          },
          "VirtualizationType": "hvm",
          "NetworkInterfaces": [
            {
              "NetworkInterfaceId": "eni-020c8dd08dd6d61cb"
            }
          ],
          "ImageId": "ami-02e5504ea463e3f34",
          "SubnetId": "subnet-01f7c80d004776ed6",
          "LaunchedAt": "2025-02-18T06:53:06.000Z",
          "Monitoring": {
            "State": "disabled"
          }
        }
      },
      "Id": "arn:aws:ec2:ap-northeast-1:123456789012:instance/i-0e0341987fd0fd6ee",
      "Partition": "aws",
      "Region": "ap-northeast-1",
      "Tags": {
        "SSM1Exception": "Yes",
        "Name": "test-2025-02-18"
      },
      "Type": "AwsEc2Instance"
    }
  ],
  "SchemaVersion": "2018-10-08",
  "Severity": {
    "Label": "MEDIUM",
    "Normalized": 40,
    "Original": "MEDIUM",
    "Product": 40
  },
  "Title": "SSM.1 EC2 instances should be managed by AWS Systems Manager",
  "Types": [
    "Software and Configuration Checks/Industry and Regulatory Standards/AWS-Foundational-Security-Best-Practices"
  ],
  "UpdatedAt": "2025-02-18T08:55:31.796Z",
  "Workflow": {
    "Status": "SUPPRESSED"
  },
  "WorkflowState": "NEW"
}

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.