Security Hubが自動作成するIAM Access Analyzerの未使用アナライザーはアーカイブルールが設定できないのでSecurity Hubの自動化ルールで抑制してみる
はじめに
皆様こんにちは、あかいけです。
Security Hubが自動作成する未使用アクセスアナライザーのアーカイブルールを検討する機会があったのですが、実はアーカイブルールが設定できないことに気づきました。
というわけで今回は、Security Hubの自動化ルールを使って未使用アクセスアナライザーの検知を抑制する方法をまとめます。
補足①
Security Hubが自動作成する未使用アクセスアナライザーの詳細については、以下の記事を参照してください。
補足②
この記事における「Security Hub」は、2025年に登場した新しいSecurity Hub(OCSF形式でFindingを扱う方)を指します。
従来のSecurity Hub CSPMとは別物なのでご注意ください。
前提条件
- Security Hubを有効化済みであること
- Security Hubの委任管理者を設定していること
Security Hubが作成する未使用アクセスアナライザーについて
まず前提として、Security Hubを有効化すると、IAM Access Analyzerの未使用アクセスアナライザーが自動作成されます。
作成されるアナライザーの仕様は以下のとおりです。
| 項目 | 内容 | 備考 |
|---|---|---|
| 有効化方式 | Security Hub有効化に伴い自動作成(サービスリンクアナライザー) | 追加コストなしで利用可能 |
| 作成単位 | 各アカウント | アカウントごとにus-east-1へ自動作成される |
| 追跡期間 | 90日(固定) | 変更不可 |
| 検出対象 | 未使用IAMロール/未使用IAMユーザーアクセスキー/未使用IAMユーザーパスワード/未使用IAM権限 | |
| 実行リージョン | 各アカウントのus-east-1(バージニア北部)のみ | IAMがグローバルサービスのため。FindingはSecurity Hub有効化済みの全リージョンに複製・表示される |
実際にSecurity Hubを有効化した後にIAM Access Analyzerのコンソールを確認すると、身に覚えのないアナライザーが作成されているかと思います。

未使用アクセスの検知自体は追加コストなしで利用できるためありがたい機能なのですが、運用していると検知の対象外にしたいリソースが出てきます。
たとえばControl Towerが各アカウントに作成する管理用IAMロールは、平常時にはほとんど使用されないため、未使用IAMロールとして検知されることが多いです。
こういった場合、通常であればアーカイブルールを設定するところですが、このSecurity Hubが自動作成する未使用アクセスアナライザーではアーカイブルールが設定できません…。
なぜアーカイブルールが設定できないのか
Security Hubが自動作成する未使用アクセスアナライザーは、サービスリンクアナライザーという特殊な扱いになっています。
IAM Access Analyzerのコンソールから参照はできますが、Security Hubが有効な間は変更も削除もできません。
実際にコンソールから確認してみると、通常のアナライザーでは表示されるアーカイブルールの設定項目が、このアナライザーでは操作できないことがわかります。
- サービスリンクアナライザーの場合

通常のアナライザーと比較するとそもそもアーカイブルール作成のボタンがないことがわかります。
- 通常のアナライザーの場合

詳細は以下のドキュメントを参照してください。
Security Hub が作成する IAM Access Analyzer は、サービスにリンクされたアナライザーです。
IAM Access Analyzer コンソールで表示できますが、Security Hub が有効になっている間は変更または削除することはできません。
結論として検知の抑制をアナライザー側で行うことはできないため、Findingの集約先であるSecurity Hub側で抑制する必要があるわけです。
Security Hubの自動化ルールで抑制する
Security Hubの自動化ルールは、条件に一致したFindingに対して、ステータスや重要度の更新などのアクションを自動実行できる機能です。
今回はこの機能を使い、抑制したいFindingのステータスをSuppressedに更新します。
例として、Control TowerやCloudFormation StackSetsが作成する管理用IAMロール(aws-controltower-プレフィックスのロール、AWSControlTowerExecution、AWSCloudFormationStackSetExecutionRole)に対する未使用アクセス検知を抑制するルールを作成してみます。
これらのロールは運用上必要なため削除できませんが、平常時は使用されないため未使用IAMロールや未使用IAM権限として検知されることが多いです。
抑制対象の検出結果の例
まずは抑制対象となる実際の検出結果を確認します。
この検出結果に含まれるフィールドをもとに、後述する自動化ルールの条件を考えていきます。
未使用のIAMロール
検出結果
{
"activity_id": 2,
"activity_name": "Update",
"category_name": "Findings",
"category_uid": 2,
"class_name": "IAM Analysis Finding",
"class_uid": 2008,
"cloud": {
"account": {
"name": "example-account",
"uid": "XXXXXXXXXXXX"
},
"provider": "AWS",
"region": "ap-northeast-1"
},
"finding_info": {
"analytic": {
"type": "Rule",
"type_id": 1,
"uid": "arn:aws:access-analyzer:us-east-1:XXXXXXXXXXXX:analyzer/_AccessAnalyzerForSecurityHubV2-xxxxxxxxxxxx"
},
"created_time": 1779729050157,
"created_time_dt": "2026-05-25T17:10:50.157Z",
"desc": "AWS::IAM::Role/arn:aws:iam::XXXXXXXXXXXX:role/AWSCloudFormationStackSetExecutionRole/ contains unused iam role",
"last_seen_time": 1787714685421,
"last_seen_time_dt": "2026-08-26T03:24:45.421Z",
"modified_time": 1787714685421,
"modified_time_dt": "2026-08-26T03:24:45.421Z",
"title": "AWSIAMRole/arn:aws:iam::XXXXXXXXXXXX:role/AWSCloudFormationStackSetExecutionRole/ is unused",
"types": [
"Posture Management",
"Software and Configuration Checks/AWS Security Best Practices/Unused IAM Role"
],
"uid": "arn:aws:access-analyzer:us-east-1:XXXXXXXXXXXX:analyzer/_AccessAnalyzerForSecurityHubV2-xxxxxxxxxxxx/unusedaccess/finding/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
},
"identity_activity_metrics": {
"last_seen_time": 1763689304000,
"last_seen_time_dt": "2025-11-21T01:41:44.000Z"
},
"metadata": {
"product": {
"name": "Security Hub",
"uid": "arn:aws:securityhub:ap-northeast-1::productv2/aws/securityhub",
"vendor_name": "AWS"
},
"profiles": [
"cloud",
"datetime",
"incident"
],
"uid": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"version": "1.8.0"
},
"remediation": {
"desc": "If the IAM role isn't required, delete the role through the IAM console to refine access to your account. Once you delete the role, the status of the finding changes to Resolved."
},
"resources": [
{
"cloud_partition": "aws",
"owner": {
"account": {
"name": "example-account",
"uid": "XXXXXXXXXXXX"
},
"org": {
"uid": "o-xxxxxxxxxx"
}
},
"provider": "AWS",
"region": "global",
"role": "Target",
"role_id": 1,
"type": "AWS::IAM::Role",
"uid": "AROAXXXXXXXXXXXXXXXXX",
"uid_alt": "arn:aws:iam::XXXXXXXXXXXX:role/AWSCloudFormationStackSetExecutionRole"
}
],
"severity": "Low",
"severity_id": 2,
"status": "New",
"status_id": 1,
"time": 1787714685421,
"time_dt": "2026-08-26T03:24:45.421Z",
"type_name": "IAM Analysis Finding: Update",
"type_uid": 200802,
"vendor_attributes": {
"severity": "Low",
"severity_id": 2
}
}
未使用のIAM権限
検出結果
{
"activity_id": 1,
"activity_name": "Create",
"category_name": "Findings",
"category_uid": 2,
"class_name": "IAM Analysis Finding",
"class_uid": 2008,
"cloud": {
"account": {
"name": "example-account",
"uid": "XXXXXXXXXXXX"
},
"provider": "AWS",
"region": "ap-northeast-1"
},
"finding_info": {
"analytic": {
"type": "Rule",
"type_id": 1,
"uid": "arn:aws:access-analyzer:us-east-1:XXXXXXXXXXXX:analyzer/_AccessAnalyzerForSecurityHubV2-xxxxxxxxxxxx"
},
"created_time": 1787676826659,
"created_time_dt": "2026-08-25T16:53:46.659Z",
"desc": "AWS::IAM::Role/arn:aws:iam::XXXXXXXXXXXX:role/AWSControlTowerExecution/ contains unused service and action-level permissions",
"last_seen_time": 1787676826659,
"last_seen_time_dt": "2026-08-25T16:53:46.659Z",
"modified_time": 1787676826659,
"modified_time_dt": "2026-08-25T16:53:46.659Z",
"title": "AWSIAMRole/arn:aws:iam::XXXXXXXXXXXX:role/AWSControlTowerExecution/ contains unused permissions",
"types": [
"Posture Management",
"Software and Configuration Checks/AWS Security Best Practices/Unused Permission"
],
"uid": "arn:aws:access-analyzer:us-east-1:XXXXXXXXXXXX:analyzer/_AccessAnalyzerForSecurityHubV2-xxxxxxxxxxxx/unusedaccess/finding/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
},
"metadata": {
"product": {
"name": "Security Hub",
"uid": "arn:aws:securityhub:ap-northeast-1::productv2/aws/securityhub",
"vendor_name": "AWS"
},
"profiles": [
"cloud",
"datetime",
"incident"
],
"uid": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"version": "1.8.0"
},
"remediation": {
"desc": "If the unused permissions aren't required, delete the permissions to refine access to your account. Use the IAM console to modify or remove the policy that grants the unused permissions. If all the unused permissions are removed, the status of the finding changes to Resolved."
},
"resources": [
{
"cloud_partition": "aws",
"owner": {
"account": {
"name": "example-account",
"uid": "XXXXXXXXXXXX"
},
"org": {
"uid": "o-xxxxxxxxxx"
}
},
"provider": "AWS",
"region": "global",
"role": "Target",
"role_id": 1,
"type": "AWS::IAM::Role",
"uid": "AROAXXXXXXXXXXXXXXXXX",
"uid_alt": "arn:aws:iam::XXXXXXXXXXXX:role/AWSControlTowerExecution"
}
],
"severity": "Low",
"severity_id": 2,
"status": "New",
"status_id": 1,
"time": 1787676826659,
"time_dt": "2026-08-25T16:53:46.659Z",
"type_name": "IAM Analysis Finding: Create",
"type_uid": 200801,
"vendor_attributes": {
"severity": "Low",
"severity_id": 2
}
}
自動化ルールの設定
先ほどの検出結果をもとに、今回自動化ルールに設定する条件は以下のとおりです。
- 検出結果のクラス名(
class_name)IAM Analysis Finding
- リソースタイプ(
resources.type)AWS::IAM::Role
- 検出結果のタイプ(
finding_info.types)Software and Configuration Checks/AWS Security Best Practices/Unused IAM RoleSoftware and Configuration Checks/AWS Security Best Practices/Unused Permission
- 検出結果のタイトル(
finding_info.title)※「次を含む」で指定AWSCloudFormationStackSetExecutionRoleAWSControlTowerExecution
ポイントは以下のとおりです。
- 検出結果のクラス名
IAM Analysis Findingを指定することで、IAM Access Analyzer由来のFindingに絞り込みます
- 検出結果のタイプ
- 未使用IAMロールと未使用IAM権限の2種類の検知タイプを指定します
- 抑制対象を広げたい場合は、未使用アクセスキーや未使用パスワードのタイプも追加できます
- 検出結果のタイトル
- 抑制対象のロール名での絞り込みは、ロールARNを含むタイトルの部分一致で行います。
- 検出結果には
resources.nameというフィールドもありますが、執筆時点ではマネジメントコンソールの条件で選択できなかったため、タイトルで代用しています (同じくロールARNを含むfinding_info.descでも代用可能です)
実際にコンソールで設定するとこんな感じです。

なお一つのフィルターに対して複数のプロパティを設定したい場合、設定した条件をクリックするとフィルターを追加する画面が出るので、ここから追加できます。

アクションには「検出結果の詳細を更新してください」を選択し、ステータスに「Suppressed」を指定します。

動作確認
ルール作成後、条件に一致するFindingが生成されると、ステータスが自動的にSuppressedへ更新されます。
なお既存のリソースの再スキャンは定期スキャンのタイミング(24時間ごと)なので、翌日とかに改めて確認してみてください。
(私の環境では自動化ルールの設定の翌日にSuppressedになっていました)
Security Hubのコンソールで検出結果を確認してみると、対象のFindingのステータスがSuppressedになっていることがわかります。

さいごに
以上、Security Hubが自動作成する未使用アクセスアナライザーの検知をSecurity Hubの自動化ルールで抑制する方法でした。
未使用アクセスの検知が追加コストなしで使えるようになったのは嬉しいアップデートですが、サービスリンクアナライザーゆえの制約もあり、抑制の実装方法は少し工夫が必要でした。
アーカイブルールが設定できずに困っていた方の助けになれば幸いです。







