Security Hub SSM.1コントロールをタグベースで自動抑制する仕組みを作ってみる
自分の関わっている環境ではEC2インスタンスを Systems Manager(SSM)管理下にすることを標準としています。 SSMを通じてソフトウェア棚卸しやパッチ管理、コマンド実行などを 一元的に実施できます。
SSM管理下を標準とするために、検出環境の構築は必須です。 SSM管理になっていないインスタンスを検出するには、 SSM.1コントロール が役に立ちます。
ただ 一部のインスタンスにおいては、特別な理由で 検出を抑制させたいケースがでてきます。 例えば「ある分析ワークロードにおいて、 計算処理用に一時的に起動されるインスタンス」などです。
今回はそういったインスタンスを Security Hub の Automation Rules を使って自動抑制してみます。 本ブログでは「抑制する/しないの判断」にはリソースタグを使います。
Automation Rules を作成する
Security Hub の [管理 > オートメーション] から [ルールを作成] を選択します。
ルールタイプを [カスタムルール] として、 ルール名と説明を記入します。
項目 | 値 |
---|---|
ルール名 | suppress-ssm1-specific-noncompliant-instances |
ルールの説明 | Automatically suppresses SSM.1 findings for specific non-compliant instances based on defined tags. |
ルールの条件は以下のような項目を記載します。 ひとことでいうと SSM.1に失敗している特定リソースタグの新規検出結果
が条件です。
キー | 演算子 | 値 |
---|---|---|
ComplianceSecurityControlId | Equals | SSM.1 |
RecordState | Equals | ACTIVE |
WorkflowStatus | Equals | NEW |
ComplianceStatus | Equals | FAILED |
ResourceTags | Equals | SSM1Exception=Yes |
自動アクションは以下赤枠部分のみ変更して、 ほかはそのままです。
項目 | 値 |
---|---|
ワークフローステータス | SUPPRESSED |
注 | Automatically suppressed - Instance tagged with SSM1Exception=Yes |
ルールステータスは [有効] のままで、作成します。
作成後のルール画面
抑制されることを確認する
実際にインスタンスを立ててみます。 SSM管理下にならない設定で、 SSM1Exception=Yes
タグを付与したインスタンスを起動しました。
その後、Security Hub のコンソールを確認すると、 ちゃんと抑制済み(SUPPRESSED)になっていました。
注(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"
}