AWS Security Hub CSPM の検出結果ステータス変更を特定のロール以外で禁止する SCP を適用してみた
はじめに
AWS Security Hub CSPM を利用していると、検出結果のステータスを不用意に変更されたくないケースがあります。
たとえば、構築や運用を委託しているベンダーに AWS アカウントで作業してもらう一方で、検出結果のステータス変更までは許可したくない、といったケースです。
今回は、AWS Organizations の SCP を使って、特定のIAMロール以外は Security Hub CSPM の検出結果ステータスを変更できないようにしてみました。
今回の前提は以下です。
- AWS Organizations 配下で運用している
- 東京リージョンにて IAM Identity Center を利用している
- AdministratorAccess 権限セット経由の管理者ロール以外は、Security Hub CSPM の検出結果ステータス変更を禁止したい
- ステータス以外の検出結果更新は、できるだけ制限しないようにしたい
Security Hub CSPM と Security Hub の違い
最初に、Security Hub CSPM と Security Hub の違いを整理しておきます。
Security Hub CSPM は、AWS 環境のセキュリティ設定や標準準拠状況を評価するサービスです。
設定不備や標準への非準拠を検出し、その結果を Security Hub Findings Format(ASFF)という形式で扱います。
一方、Security Hub は、Security Hub CSPM、GuardDuty、Inspector、Macie など複数サービスの検出結果を集約し、相関分析、可視化、ワークフロー連携を行う統合サービスです。
Security Hub では、検出結果を Open Cybersecurity Schema Framework(OCSF)という形式で扱います。
このように、Security Hub CSPM と Security Hub では、検出結果を扱うデータ形式が異なります。
今回のように検出結果のステータス変更を制御する場合、この形式の違いが重要になります。
この関係性は、以下の記事が分かりやすいです。
今回のポイントはここです。
- Security Hub CSPM の検出結果ステータス変更は ASFF の
Workflow.Status - Security Hub の検出結果ステータス変更は OCSF の
StatusId
そのため、同じ「ステータス変更」を制限したい場合でも、Security Hub CSPM と Security Hub では見るべき条件キーが異なります。
Security Hub CSPM の検出結果形式については、以下のドキュメントがあります。
Security Hub の OCSF 形式については、以下のドキュメントがあります。
今回の制御方針
今回は、Security Hub CSPM の検出結果ステータス変更を制御するため、ASFF の Workflow.Status を対象にします。
また、Security Hub 側で同様にステータス変更を制御する場合は、OCSF の StatusId が対象になります。
そのため、今回の SCP には Security Hub 向けの条件も含めています。
securityhub:ASFFSyntaxPath/Workflow.Status- Security Hub CSPM 向け
securityhub:OCSFSyntaxPath/StatusId- Security Hub 向け
また、securityhub:BatchUpdateFindings を丸ごと Deny するのではなく、Null 条件を使って対象フィールドが含まれる更新だけを拒否するようにします。これにより、ステータス変更だけを制限し、他の検出結果更新はなるべく影響を受けにくくできます。
BatchUpdateFindings に対するフィールド単位の制御については、以下のドキュメントが参考になります。
SCP 内容
今回使った SCP は以下です。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenySecurityHubAsffWorkflowStatusUpdateExceptAllowedPrincipals",
"Effect": "Deny",
"Action": "securityhub:BatchUpdateFindings",
"Resource": "*",
"Condition": {
"ArnNotLike": {
"aws:PrincipalArn": [
"arn:aws:iam::*:role/aws-reserved/sso.amazonaws.com/ap-northeast-1/AWSReservedSSO_AdministratorAccess_*"
]
},
"Null": {
"securityhub:ASFFSyntaxPath/Workflow.Status": "false"
}
}
},
{
"Sid": "DenySecurityHubOcsfStatusIdUpdateExceptAllowedPrincipals",
"Effect": "Deny",
"Action": "securityhub:BatchUpdateFindings",
"Resource": "*",
"Condition": {
"ArnNotLike": {
"aws:PrincipalArn": [
"arn:aws:iam::*:role/aws-reserved/sso.amazonaws.com/ap-northeast-1/AWSReservedSSO_AdministratorAccess_*"
]
},
"Null": {
"securityhub:OCSFSyntaxPath/StatusId": "false"
}
}
}
]
}
ポリシーの見方
1つ目の Statement は Security Hub CSPM 向けです。
DenySecurityHubAsffWorkflowStatusUpdateExceptAllowedPrincipalssecurityhub:ASFFSyntaxPath/Workflow.Statusを条件にしている- ASFF の
Workflow.Statusを含む更新を拒否する
2つ目の Statement は Security Hub 向けです。
DenySecurityHubOcsfStatusIdUpdateExceptAllowedPrincipalssecurityhub:OCSFSyntaxPath/StatusIdを条件にしている- OCSF の
StatusIdを含む更新を拒否する
API リファレンスは以下です。
なお、BatchUpdateFindings と BatchUpdateFindingsV2 は、IAM ポリシーの Action 要素ではどちらも securityhub:BatchUpdateFindings を使用します。
Null = false の意味
ここでの Null = false は、「その項目が更新対象としてリクエストに含まれている場合に条件一致させる」という意味です。
たとえば、以下の条件です。
"Null": {
"securityhub:ASFFSyntaxPath/Workflow.Status": "false"
}
これは Workflow.Status を変更しようとするリクエストだけを狙って拒否できます。
そのため、ステータス変更のみを抑止したい場合に使いやすい書き方です。
aws:PrincipalArn で管理者ロールを除外する
今回は IAM Identity Center の AdministratorAccess 権限セット経由のロールだけを除外対象にしています。
IAM Identity Center のロール ARN は AWSReservedSSO_... 形式で作成されるため、ArnNotLike に以下のようなパターンを指定しています。
"arn:aws:iam::*:role/aws-reserved/sso.amazonaws.com/ap-northeast-1/AWSReservedSSO_AdministratorAccess_*"
IAM Identity Center を東京リージョンで利用している前提なので、ap-northeast-1 を含めています。
IAM Identity Center のロール参照については、以下のドキュメントが参考になります。
Security Hub CSPM で試してみる
対象の AWS アカウントまたは OU に SCP を適用し、Security Hub CSPM の検出結果ステータスを変更できるか確認しました。
AdministratorAccess 権限セット経由のロールの場合
まずは、除外対象である AdministratorAccess 権限セット経由の管理者ロールで試します。

ステータスを変更してみます。

こちらは問題なく変更できました。
除外対象ではないロールの場合
次に、除外対象ではないロールで同じ操作を試します。
すると、以下のように拒否されました。

期待通り、管理者ロール以外では Security Hub CSPM の検出結果ステータス変更を禁止できています。
まとめ
AWS Organizations の SCP を使い、Security Hub CSPM の検出結果ステータス変更を、特定ロール以外で禁止できることを確認しました。
ポイントは、Security Hub CSPM のステータス変更では ASFF の Workflow.Status を条件キーで見ることです。
Null = false を使うことで、BatchUpdateFindings 全体ではなく、ステータス変更を含む更新だけを拒否できます。
なお、Security Hub 側で同様に制御する場合は、OCSF の StatusId を対象にします。
本記事では Security Hub CSPM 側で動作確認しました。








