<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>Thomas Haggath — AWS Security Writing</title>
  <subtitle>Writing on AWS security, threat detection, and cloud defence.</subtitle>
  <link href="https://www.haggath.re/blog/feed.xml" rel="self" />
  <link href="https://www.haggath.re/blog/blog/" />
  <updated>2026-05-22T00:00:00Z</updated>
  <id>https://www.haggath.re/blog/blog/</id>
  <author>
    <name>Thomas Haggath</name>
  </author>
  <entry>
    <title>Leveraging Macie suppression rules to eliminate noise</title>
    <link href="https://www.haggath.re/blog/macie-suppression-rules/" />
    <updated>2026-05-10T00:00:00Z</updated>
    <id>https://www.haggath.re/blog/macie-suppression-rules/</id>
    <content type="html">&lt;h2&gt;What is Amazon Macie?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.aws.amazon.com/macie/latest/user/what-is-macie.html&quot;&gt;Amazon Macie&lt;/a&gt; is a fully managed data security service that uses machine learning to automatically discover, classify, and protect sensitive data in Amazon S3 — covering PII, financial data, credentials, and custom data types you define.&lt;/p&gt;
&lt;p&gt;Amazon Macie is a fully managed data security and data privacy service that uses machine learning and pattern matching to discover, monitor, and protect sensitive data stored in Amazon S3. Where GuardDuty focuses on threats to your infrastructure, Macie focuses on the data itself: what sensitive information exists in your S3 estate, where it lives, and whether it is adequately protected.&lt;/p&gt;
&lt;p&gt;When you enable Macie, it automatically builds and maintains an inventory of your S3 general purpose buckets in the current region, evaluating each one for security and access control issues. Beyond bucket-level monitoring, Macie can inspect the contents of objects inside those buckets to detect sensitive data through two mechanisms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Automated sensitive data discovery&lt;/strong&gt;: Macie continuously and intelligently samples objects across your S3 estate, building a picture of where sensitive data lives without you needing to configure individual jobs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sensitive data discovery jobs&lt;/strong&gt;: targeted jobs you configure to scan specific buckets, prefixes, or object sets on a schedule or on demand&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Macie can detect a broad range of sensitive data types out of the box, including personally identifiable information (PII), personal health information (PHI), financial data such as credit card and bank account numbers, and credentials such as AWS secret access keys. You can also define your own custom data identifiers using regex patterns and keyword lists to catch organisation-specific data formats.&lt;/p&gt;
&lt;p&gt;When Macie detects a potential issue, it generates a &lt;em&gt;finding&lt;/em&gt;: a detailed report describing the affected resource, the type of sensitive data or policy violation involved, and the severity.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Example Macie Finding Types&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.aws.amazon.com/macie/latest/user/findings-types.html&quot;&gt;Macie generates two categories of findings&lt;/a&gt;: &lt;strong&gt;policy findings&lt;/strong&gt; for bucket misconfigurations (public access, disabled encryption), and &lt;strong&gt;sensitive data findings&lt;/strong&gt; for actual sensitive content detected inside S3 objects.&lt;/p&gt;
&lt;p&gt;Macie generates two distinct categories of findings: &lt;strong&gt;policy findings&lt;/strong&gt; and &lt;strong&gt;sensitive data findings&lt;/strong&gt;. They serve different purposes and are generated by different parts of the service.&lt;/p&gt;
&lt;h3&gt;Policy Findings&lt;/h3&gt;
&lt;p&gt;Policy findings report potential security or privacy misconfigurations on your S3 buckets. Macie generates these continuously as part of its ongoing bucket monitoring, independent of any discovery jobs.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Policy:IAMUser/S3BlockPublicAccessDisabled&lt;/code&gt;: block public access settings have been disabled on a bucket, potentially exposing its contents to the internet&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Policy:IAMUser/S3BucketEncryptionDisabled&lt;/code&gt;: default server-side encryption has been disabled on a bucket&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Policy:IAMUser/S3BucketPublic&lt;/code&gt;: a bucket&#39;s ACL or policy grants public read or write access&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Policy:IAMUser/S3BucketReplicatedExternally&lt;/code&gt;: bucket replication is configured to send data to a bucket in a different AWS account&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Policy:IAMUser/S3BucketSharedExternally&lt;/code&gt;: a bucket policy grants access to a principal in a different AWS account or to anonymous users&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Sensitive Data Findings&lt;/h3&gt;
&lt;p&gt;Sensitive data findings report the detection of sensitive content inside S3 objects. These are generated when Macie inspects object contents, either through automated discovery or a discovery job.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SensitiveData:S3Object/Credentials&lt;/code&gt;: the object contains sensitive credentials data, such as AWS secret access keys or private keys&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SensitiveData:S3Object/Financial&lt;/code&gt;: the object contains financial information such as credit card numbers, bank account numbers, or similar data&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SensitiveData:S3Object/Personal&lt;/code&gt;: the object contains personally identifiable information (PII) or personal health information (PHI), such as passport numbers, national insurance numbers, or medical record identifiers&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SensitiveData:S3Object/CustomIdentifier&lt;/code&gt;: the object contains text matching the detection criteria of one or more custom data identifiers you have defined&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SensitiveData:S3Object/Multiple&lt;/code&gt;: the object contains more than one category of sensitive data across any combination of the above types&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Severity Scoring&lt;/h3&gt;
&lt;p&gt;Macie scores findings on a three-tier scale: &lt;strong&gt;Low&lt;/strong&gt;, &lt;strong&gt;Medium&lt;/strong&gt;, and &lt;strong&gt;High&lt;/strong&gt;. The score is influenced by factors including the type of sensitive data detected, the number of occurrences, and the security posture of the bucket containing the object. A &lt;code&gt;SensitiveData:S3Object/Credentials&lt;/code&gt; finding in a publicly accessible bucket will score higher than the same finding type in a private, encrypted bucket.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;What are Suppression Rules?&lt;/h2&gt;
&lt;p&gt;A &lt;a href=&quot;https://docs.aws.amazon.com/macie/latest/user/findings-suppression.html&quot;&gt;Macie suppression rule&lt;/a&gt; is a saved filter that automatically archives matching findings at generation time — removing them from your active queue without deleting them. Suppressed findings are not forwarded to Security Hub or EventBridge.&lt;/p&gt;
&lt;p&gt;A suppression rule in Macie is a saved set of filter criteria that automatically &lt;strong&gt;archives&lt;/strong&gt; any new finding matching those criteria. Like GuardDuty, Macie continues to generate the finding and stores it for 90 days, but it is immediately moved to the archived state and does not appear in your active findings queue.&lt;/p&gt;
&lt;h3&gt;How they work&lt;/h3&gt;
&lt;p&gt;Suppression rules are built on Macie&#39;s finding filter system. You define one or more conditions using finding attributes, and Macie evaluates every new finding against all active suppression rules at generation time. If a finding matches, it is archived immediately.&lt;/p&gt;
&lt;p&gt;Filter conditions can be built using fields across two categories:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field category&lt;/th&gt;
&lt;th&gt;Examples&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Common fields&lt;/td&gt;
&lt;td&gt;Finding type, severity, region, account ID, resource ARN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Classification fields&lt;/td&gt;
&lt;td&gt;Sensitive data category, sensitive data type, job ID, custom identifier name&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;You can combine multiple conditions with AND logic to build precise rules. For example, you could suppress all &lt;code&gt;SensitiveData:S3Object/Personal&lt;/code&gt; findings only from a specific bucket used for anonymised test data, while keeping the finding active for all other buckets.&lt;/p&gt;
&lt;h3&gt;Why use them?&lt;/h3&gt;
&lt;p&gt;In environments with large S3 estates, Macie findings accumulate quickly. Common sources of recurring noise include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Buckets containing known test or synthetic data that intentionally resembles PII&lt;/li&gt;
&lt;li&gt;Internal tooling buckets that store credentials or keys as part of normal operations&lt;/li&gt;
&lt;li&gt;Data science or analytics buckets where financial data is expected and already governed&lt;/li&gt;
&lt;li&gt;Buckets scanned repeatedly by scheduled jobs where the sensitive data is known and accepted&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Without suppression rules, your team spends time reviewing findings they have already triaged, which erodes confidence in the signal Macie produces.&lt;/p&gt;
&lt;p&gt;Suppressed findings are not forwarded to AWS Security Hub or Amazon EventBridge, so your downstream alerting and ticketing systems stay clean.&lt;/p&gt;
&lt;h3&gt;Important consideration&lt;/h3&gt;
&lt;p&gt;Suppression rules archive findings after they are generated. If your automated sensitive data discovery or discovery jobs are generating high volumes of findings from known-good data, suppression rules reduce the noise in your queue but Macie still performs the inspection and counts the data. For data you know is safe and want Macie to ignore entirely at inspection time, allow lists are the more efficient tool.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Macie Allow Lists&lt;/h2&gt;
&lt;p&gt;A &lt;a href=&quot;https://docs.aws.amazon.com/macie/latest/user/allow-lists.html&quot;&gt;Macie allow list&lt;/a&gt; defines text or regex patterns that Macie should ignore during S3 inspection — preventing findings from being generated in the first place, rather than archiving them after the fact.&lt;/p&gt;
&lt;p&gt;An allow list in Macie defines specific text or text patterns that you want Macie to ignore when it inspects S3 objects for sensitive data. Where suppression rules operate after a finding is generated, allow lists operate before: if Macie finds text that matches an entry in an allow list, it does not report that occurrence in findings, statistics, or discovery results at all.&lt;/p&gt;
&lt;p&gt;Macie supports two types of allow list:&lt;/p&gt;
&lt;h3&gt;Predefined Text Lists&lt;/h3&gt;
&lt;p&gt;A predefined text list contains exact strings that Macie should ignore. This is useful for known values that are not actually sensitive in your context but would otherwise match a managed data identifier: sample account numbers used in documentation, anonymised test identifiers, or internal reference codes that follow a format Macie recognises as financial data.&lt;/p&gt;
&lt;p&gt;Each entry in the list must be an exact match. Macie performs a case-sensitive comparison against the text it finds in the object.&lt;/p&gt;
&lt;h3&gt;Regular Expression (Regex) Lists&lt;/h3&gt;
&lt;p&gt;A regex list defines a pattern that Macie should ignore across all inspected objects. This is the more flexible option and suits cases where the exempted data follows a consistent format:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Your organisation&#39;s public phone numbers or email addresses&lt;/li&gt;
&lt;li&gt;Patterned sample data used across test environments&lt;/li&gt;
&lt;li&gt;Internal employee or customer ID formats that follow a proprietary schema&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You store the regex or text list as a file in S3, and Macie reads it from there when performing inspections.&lt;/p&gt;
&lt;h3&gt;Usage&lt;/h3&gt;
&lt;p&gt;After creating an allow list you attach it to one or more sensitive data discovery jobs or to your automated sensitive data discovery settings. Macie then applies the list during every inspection covered by those jobs or that discovery configuration.&lt;/p&gt;
&lt;h4&gt;Limits&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Up to &lt;strong&gt;1,000 allow lists&lt;/strong&gt; per Macie account per region&lt;/li&gt;
&lt;li&gt;Predefined text lists: up to &lt;strong&gt;100,000 entries&lt;/strong&gt; per list&lt;/li&gt;
&lt;li&gt;Regex lists: one pattern per list, stored as a plain-text file in S3&lt;/li&gt;
&lt;li&gt;The Macie service role must have &lt;code&gt;s3:GetObject&lt;/code&gt; permission on the bucket storing the list file&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;The Difference Between Allow Lists and Suppression Rules&lt;/h2&gt;
&lt;p&gt;Allow lists act at inspection time and prevent findings from being created; suppression rules act after generation and archive the finding immediately. Use allow lists for content you never want reported; use suppression rules for context-specific false positives where you still want the audit trail.&lt;/p&gt;
&lt;p&gt;Both allow lists and suppression rules reduce noise in Macie, but they work at different points in the pipeline and have meaningfully different effects.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Allow Lists&lt;/th&gt;
&lt;th&gt;Suppression Rules&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;When it acts&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;At inspection time, before a finding is created&lt;/td&gt;
&lt;td&gt;After finding generation, immediately archives it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Finding created?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No - the occurrence is excluded from results entirely&lt;/td&gt;
&lt;td&gt;Yes - created and then archived, stored for 90 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scope&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Specific text or patterns within object content&lt;/td&gt;
&lt;td&gt;Any finding attribute (type, severity, bucket, account, job, etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Applies to&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sensitive data findings only&lt;/td&gt;
&lt;td&gt;Both policy findings and sensitive data findings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Forwarded downstream?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;N/A - no finding exists to forward&lt;/td&gt;
&lt;td&gt;Suppressed findings are not sent to Security Hub or EventBridge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best used for&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Known-safe data patterns you never want reported&lt;/td&gt;
&lt;td&gt;Known false positives scoped by resource, finding type, or job&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;When to use each&lt;/h4&gt;
&lt;p&gt;Use an &lt;strong&gt;allow list&lt;/strong&gt; when you have specific text or patterns that are genuinely not sensitive in your environment - test data, internal formats, or public contact details that happen to match a Macie managed identifier. Allow lists prevent Macie from ever flagging that content, which keeps your sensitive data statistics clean and avoids generating findings you will only suppress anyway.&lt;/p&gt;
&lt;p&gt;Use a &lt;strong&gt;suppression rule&lt;/strong&gt; when the finding itself is valid but irrelevant to your operations in a specific context: a known-good bucket that stores credentials as part of its design, a replication rule that intentionally sends data to an external account you own, or a policy finding type that your security posture accepts for a defined set of resources.&lt;/p&gt;
&lt;p&gt;In practice, allow lists handle content-level exemptions and suppression rules handle context-level exemptions. Using both together gives you precise control over what Macie surfaces without losing the audit trail that archived findings provide.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Example Finding: Sensitive Credentials Detected in S3&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.aws.amazon.com/macie/latest/user/findings-types.html#sensitive-data-s3object-credentials&quot;&gt;&lt;code&gt;SensitiveData:S3Object/Credentials&lt;/code&gt;&lt;/a&gt; fires when Macie detects AWS secret access keys, private keys, or authentication tokens inside an S3 object — one of Macie&#39;s highest-priority finding types given how commonly exposed credentials lead to account compromise.&lt;/p&gt;
&lt;p&gt;The finding type &lt;code&gt;SensitiveData:S3Object/Credentials&lt;/code&gt; fires when Macie detects content matching credentials patterns (such as AWS secret access keys, private keys, or authentication tokens) inside an S3 object. This is one of Macie&#39;s highest-priority finding types since exposed credentials in S3 are a common and high-impact misconfiguration.&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;schemaVersion&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;1.0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;accountId&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;123456789012&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;region&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;eu-west-1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;partition&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;aws&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;SensitiveData:S3Object/Credentials&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;title&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;The S3 object contains AWS credentials&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;The S3 object contains text that matches detection criteria for AWS secret access keys.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;severity&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;score&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;90&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;High&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;createdAt&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2026-05-10T11:22:10Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;updatedAt&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2026-05-10T11:22:10Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;resourcesAffected&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;s3Bucket&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;arn&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;arn:aws:s3:::my-app-deployment-artifacts&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;my-app-deployment-artifacts&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;publicAccess&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;effectivePermission&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;NOT_PUBLIC&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;defaultServerSideEncryption&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;encryptionType&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;AES256&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;s3Object&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;bucketArn&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;arn:aws:s3:::my-app-deployment-artifacts&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;key&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;configs/production/app-config.env&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;size&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2048&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;serverSideEncryption&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;encryptionType&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;AES256&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;lastModified&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2026-05-09T08:14:00Z&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;classificationDetails&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;jobArn&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;arn:aws:macie2:eu-west-1:123456789012:classification-job/abc123def456&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;result&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;code&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;COMPLETE&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;sensitiveData&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;category&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;CREDENTIALS&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;detections&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;AWS_CREDENTIALS&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;&quot;count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;&quot;occurrences&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token property&quot;&gt;&quot;lineRanges&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
                  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;start&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;14&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;end&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;14&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;start&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;27&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;end&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;27&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
              &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;totalCount&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;sizeClassified&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2048&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Key fields to note:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;type&lt;/code&gt;&lt;/strong&gt;: the finding identifier, your primary filter attribute when writing suppression rules&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;severity.score&lt;/code&gt;&lt;/strong&gt;: Macie uses a numeric score (0-100) mapped to Low, Medium, or High; 90 indicates a high-confidence, high-impact detection&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;resourcesAffected.s3Object.key&lt;/code&gt;&lt;/strong&gt;: the exact object path where the sensitive data was found, critical for triage&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;classificationDetails.result.sensitiveData&lt;/code&gt;&lt;/strong&gt;: the breakdown of what was detected, including category, specific type (&lt;code&gt;AWS_CREDENTIALS&lt;/code&gt;), and occurrence count&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;classificationDetails.result.sensitiveData.detections.occurrences.lineRanges&lt;/code&gt;&lt;/strong&gt;: the line numbers within the object where matches were found, giving you a precise location to investigate&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;resourcesAffected.s3Bucket.publicAccess.effectivePermission&lt;/code&gt;&lt;/strong&gt;: shows &lt;code&gt;NOT_PUBLIC&lt;/code&gt; here, which reduces severity somewhat; the same finding in a public bucket would score higher&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/macie/latest/user/what-is-macie.html&quot;&gt;What is Amazon Macie?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/macie/latest/user/findings-types.html&quot;&gt;Types of Macie findings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/macie/latest/user/findings-suppression.html&quot;&gt;Suppressing Macie findings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/macie/latest/user/findings-filter-overview.html&quot;&gt;Filtering Macie findings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/macie/latest/user/allow-lists.html&quot;&gt;Defining sensitive data exceptions with allow lists&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/macie/latest/user/data-classification.html&quot;&gt;Discovering sensitive data with Macie&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>GuardDuty Suppression Rules: Reduce Alert Noise on AWS</title>
    <link href="https://www.haggath.re/blog/guardduty-suppression-rules/" />
    <updated>2026-05-10T00:00:00Z</updated>
    <id>https://www.haggath.re/blog/guardduty-suppression-rules/</id>
    <content type="html">&lt;h2&gt;What is GuardDuty?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.aws.amazon.com/guardduty/latest/ug/what-is-guardduty.html&quot;&gt;Amazon GuardDuty&lt;/a&gt; is a continuous threat detection service that monitors AWS accounts, workloads, and data by analysing CloudTrail events, VPC Flow Logs, and DNS query logs — with no agents or additional software to deploy.&lt;/p&gt;
&lt;p&gt;Amazon GuardDuty is a continuous threat detection service that monitors, analyses, and processes data sources and logs across your AWS environment. It uses threat intelligence feeds (such as lists of malicious IP addresses, domains, and file hashes) combined with machine learning models to identify suspicious and potentially malicious activity without requiring you to deploy or manage any additional security software.&lt;/p&gt;
&lt;p&gt;When enabled, GuardDuty automatically begins ingesting foundational data sources including AWS CloudTrail management events, VPC Flow Logs, and DNS query logs. Beyond these defaults, GuardDuty offers dedicated protection plans that extend coverage to additional services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;EKS Protection&lt;/strong&gt;: audits Kubernetes API server logs for your EKS clusters&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RDS Protection&lt;/strong&gt;: monitors login activity for Amazon Aurora databases&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;S3 Protection&lt;/strong&gt;: analyses CloudTrail data events for S3 object-level activity&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Malware Protection&lt;/strong&gt;: scans EBS volumes or S3 objects for malicious files&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lambda Protection&lt;/strong&gt;: inspects network activity from Lambda function invocations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Runtime Monitoring&lt;/strong&gt;: captures OS-level, network, and file events from EC2, ECS, and EKS workloads&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When a potential threat is identified, GuardDuty generates a &lt;em&gt;finding&lt;/em&gt;: a detailed security alert containing information about the affected resource, the threat actor, and the severity of the activity.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Example GuardDuty Finding Types&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_finding-types-active.html&quot;&gt;GuardDuty finding types&lt;/a&gt; follow the format &lt;code&gt;ThreatPurpose:ResourceType/ThreatFamilyName&lt;/code&gt;, where the resource type identifies the targeted AWS service and the threat family describes the attack pattern.&lt;/p&gt;
&lt;p&gt;Finding types follow the format &lt;code&gt;ThreatPurpose:ResourceType/ThreatFamilyName&lt;/code&gt;. The resource type in the name tells you which AWS service was targeted. Below are representative examples across the main categories.&lt;/p&gt;
&lt;h3&gt;EC2&lt;/h3&gt;
&lt;p&gt;EC2 findings typically relate to network-level threats observed via VPC Flow Logs and DNS logs.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CryptoCurrency:EC2/BitcoinTool.B!DNS&lt;/code&gt;: an EC2 instance is querying a domain associated with cryptocurrency mining pools&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Trojan:EC2/BlackholeTraffic&lt;/code&gt;: an instance is communicating with an IP address known to be a black-hole used by malware command-and-control infrastructure&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UnauthorizedAccess:EC2/TorIPCaller&lt;/code&gt;: an EC2 instance is being accessed from a Tor exit node&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;IAM&lt;/h3&gt;
&lt;p&gt;IAM findings use GuardDuty&#39;s anomaly detection model to flag unusual API call patterns across CloudTrail management events.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;UnauthorizedAccess:IAMUser/ConsoleLoginSuccess.B&lt;/code&gt;: a successful console login from an unusual geographic location&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CredentialAccess:IAMUser/AnomalousBehavior&lt;/code&gt;: an IAM principal is making API calls in a pattern inconsistent with its historical baseline&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Persistence:IAMUser/UserPermissions&lt;/code&gt;: an IAM entity is modifying policies or creating new users in a manner consistent with persistence techniques&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;S3&lt;/h3&gt;
&lt;p&gt;S3 findings surface data-access threats against your buckets.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Policy:S3/BucketPublicAccessGranted&lt;/code&gt;: an IAM principal has disabled block-public-access settings on a bucket&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Exfiltration:S3/MaliciousIPCaller&lt;/code&gt;: S3 API calls are being made from a known malicious IP address&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Discovery:S3/MaliciousIPCaller.Custom&lt;/code&gt;: a source IP on your custom threat list is enumerating S3 buckets&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;EKS&lt;/h3&gt;
&lt;p&gt;EKS Protection findings come from Kubernetes audit log analysis.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CredentialAccess:Kubernetes/MaliciousIPCaller&lt;/code&gt;: a Kubernetes API call to retrieve secrets was made from a known malicious IP&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Execution:Kubernetes/ExecInKubernetes&lt;/code&gt;: a command was executed inside a running container via &lt;code&gt;kubectl exec&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PrivilegeEscalation:Kubernetes/PrivilegedContainer&lt;/code&gt;: a privileged container was launched, which could allow a breakout to the underlying host&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;RDS&lt;/h3&gt;
&lt;p&gt;RDS Protection findings are generated from login activity to Amazon Aurora clusters.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CredentialAccess:RDS/AnomalousBehavior.SuccessfulLogin&lt;/code&gt;: a successful database login from an unusual user or location&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CredentialAccess:RDS/MaliciousIPCaller.FailedLogin&lt;/code&gt;: failed login attempts originating from a known malicious IP address&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Attack Sequences (Extended Threat Detection)&lt;/h3&gt;
&lt;p&gt;GuardDuty&#39;s Extended Threat Detection correlates findings across multiple services and time windows to surface multi-stage attacks as a single high-severity finding.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AttackSequence:IAM/CompromisedCredentials&lt;/code&gt;: a sequence of IAM events indicating credential compromise and subsequent lateral movement&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AttackSequence:S3/CompromisedData&lt;/code&gt;: a chain of events suggesting S3 data was discovered and then exfiltrated&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AttackSequence:EKS/CompromisedCluster&lt;/code&gt;: correlated signals pointing to a compromised Kubernetes cluster&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;What are Suppression Rules?&lt;/h2&gt;
&lt;p&gt;A &lt;a href=&quot;https://docs.aws.amazon.com/guardduty/latest/ug/findings_suppression-rule.html&quot;&gt;GuardDuty suppression rule&lt;/a&gt; is a filter that automatically archives matching findings — silencing known-good activity without deleting the record. Suppressed findings are stored for 90 days and excluded from Security Hub, EventBridge, and S3 exports.&lt;/p&gt;
&lt;p&gt;A suppression rule is a filter you define in GuardDuty that automatically &lt;strong&gt;archives&lt;/strong&gt; any new finding that matches its criteria. Suppressed findings are never deleted. GuardDuty still generates them and stores them for 90 days, but they are immediately moved to the archived state and do not appear in your active findings queue.&lt;/p&gt;
&lt;h3&gt;How they work&lt;/h3&gt;
&lt;p&gt;You define a suppression rule using one or more filter attributes (finding type, severity, resource tags, EC2 instance ID, S3 bucket name, etc.) combined with match operators:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operator&lt;/th&gt;
&lt;th&gt;Behaviour&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Equals&lt;/code&gt; / &lt;code&gt;NotEquals&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Exact match or exclusion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Matches&lt;/code&gt; / &lt;code&gt;NotMatches&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Wildcard pattern match&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GreaterThan&lt;/code&gt; / &lt;code&gt;LessThan&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Numeric comparison (e.g. severity score)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Rules can be as broad as suppressing an entire finding type (e.g. all &lt;code&gt;CryptoCurrency:EC2/*&lt;/code&gt; findings) or as granular as suppressing a specific finding type only when it fires against a resource tagged &lt;code&gt;Environment: dev&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;Why use them?&lt;/h3&gt;
&lt;p&gt;In a mature AWS environment, certain findings will reliably represent known-good activity: a penetration testing EC2 instance that legitimately communicates over unusual ports, a NAT gateway that generates high-volume DNS findings, or a deployment pipeline that makes bulk S3 API calls. Without suppression rules, these recurring false positives dilute your signal-to-noise ratio and increase alert fatigue.&lt;/p&gt;
&lt;p&gt;Suppressed findings are also &lt;strong&gt;excluded from downstream integrations&lt;/strong&gt; and are not forwarded to AWS Security Hub, Amazon EventBridge, Amazon Detective, or Amazon S3 exports. This means your SIEM, ticketing system, or on-call paging tool stays quiet for findings you have already triaged and accepted.&lt;/p&gt;
&lt;h3&gt;Important caveat&lt;/h3&gt;
&lt;p&gt;GuardDuty&#39;s Extended Threat Detection relies on individual findings as signals when building attack sequences. Broadly suppressing finding types can prevent attack sequence findings from being generated, because the archived signals are excluded from correlation. Suppress at the most specific level you can; prefer resource-scoped rules over type-wide ones.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;GuardDuty IP Sets&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_upload-lists.html&quot;&gt;GuardDuty IP sets and entity lists&lt;/a&gt; let you upload custom IP addresses or domains to either suppress findings from trusted sources or generate findings for known-malicious sources that AWS&#39;s built-in feeds may not yet include.&lt;/p&gt;
&lt;p&gt;GuardDuty lets you upload custom lists of IP addresses (and domains) to fine-tune its detection behaviour. These lists come in two flavours: &lt;strong&gt;Trusted IP lists&lt;/strong&gt; and &lt;strong&gt;Threat Intel lists&lt;/strong&gt; (also called threat lists), described below.&lt;/p&gt;
&lt;p&gt;Both are stored as plain-text files in S3 (one entry per line, supporting CIDR notation for IP ranges) and activated per GuardDuty detector. GuardDuty now recommends using &lt;strong&gt;entity lists&lt;/strong&gt;, which can contain IP addresses, domain names, or both in the same list, over the legacy IP-only format.&lt;/p&gt;
&lt;h3&gt;Trusted IP Lists&lt;/h3&gt;
&lt;p&gt;A trusted IP list contains IP addresses or CIDR ranges that you consider safe sources of traffic, such as your corporate VPN egress IPs, an office network, or a known third-party security scanner you have authorised. GuardDuty &lt;strong&gt;does not generate findings&lt;/strong&gt; for activity originating from entries on a trusted IP list.&lt;/p&gt;
&lt;p&gt;Trusted lists are useful when you have infrastructure that legitimately behaves in ways that would otherwise trigger findings, and you want to suppress an entire source rather than write individual suppression rules per finding type.&lt;/p&gt;
&lt;h3&gt;Threat Intel Lists&lt;/h3&gt;
&lt;p&gt;A threat intel list contains IP addresses or domains you have identified as known malicious sources, such as IP ranges from your own incident response investigations or feeds from a commercial threat intelligence provider. When GuardDuty observes activity involving an entry on a threat list, it &lt;strong&gt;generates a finding&lt;/strong&gt; even if that IP would not otherwise have triggered one.&lt;/p&gt;
&lt;p&gt;Threat lists let you operationalise your own threat intelligence and ensure GuardDuty alerts on adversary infrastructure that AWS&#39;s built-in feeds may not yet include.&lt;/p&gt;
&lt;h4&gt;Limits&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Up to &lt;strong&gt;6 trusted IP lists&lt;/strong&gt; and &lt;strong&gt;6 threat intel lists&lt;/strong&gt; per GuardDuty detector per region&lt;/li&gt;
&lt;li&gt;Maximum &lt;strong&gt;200,000 entries&lt;/strong&gt; per list (IP addresses or CIDRs)&lt;/li&gt;
&lt;li&gt;Lists must be stored in S3 and the GuardDuty service role must have &lt;code&gt;s3:GetObject&lt;/code&gt; permission on the bucket&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;The Difference Between Trusted Lists and Suppression Rules&lt;/h2&gt;
&lt;p&gt;Trusted IP lists prevent findings from being generated at all; suppression rules generate the finding and then immediately archive it. The key practical difference is the audit trail — suppressed findings are stored and queryable for 90 days, while trusted-list activity leaves no finding record.&lt;/p&gt;
&lt;p&gt;Both trusted lists and suppression rules can silence GuardDuty findings for known-good activity, but they operate at different layers and have meaningfully different behaviours.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Trusted IP / Entity Lists&lt;/th&gt;
&lt;th&gt;Suppression Rules&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scope&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Source IP address or domain&lt;/td&gt;
&lt;td&gt;Any finding attribute (type, severity, resource, tags, account, etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mechanism&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Prevents the finding from being &lt;strong&gt;generated&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Generates the finding, then immediately &lt;strong&gt;archives&lt;/strong&gt; it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Finding stored?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No (the finding is never created)&lt;/td&gt;
&lt;td&gt;Yes - archived for 90 days, fully queryable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Attack sequence impact&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No signal created, so no correlation possible&lt;/td&gt;
&lt;td&gt;Archived signals are excluded from correlation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Downstream forwarding&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;N/A (nothing to forward)&lt;/td&gt;
&lt;td&gt;Suppressed findings are not sent to Security Hub, EventBridge, or S3 exports&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Granularity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;IP/domain only&lt;/td&gt;
&lt;td&gt;Fine-grained: combine multiple attributes with AND logic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best used for&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Trusted infrastructure sources you always want to ignore&lt;/td&gt;
&lt;td&gt;Known false positives scoped by resource, tag, region, or finding subtype&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;When to use each&lt;/h4&gt;
&lt;p&gt;Use a &lt;strong&gt;trusted IP list&lt;/strong&gt; when the noise originates from a specific, stable set of IP addresses you fully control or trust: your VPN, a penetration testing host, or an authorised scanner. It is the bluntest instrument but requires no maintenance as new finding types emerge.&lt;/p&gt;
&lt;p&gt;Use a &lt;strong&gt;suppression rule&lt;/strong&gt; when you need more precision: for example, suppressing &lt;code&gt;CryptoCurrency:EC2/BitcoinTool.B&lt;/code&gt; only for instances tagged &lt;code&gt;Purpose: mining-research&lt;/code&gt;, while keeping the finding active for all other EC2 instances. Suppression rules also give you the audit trail of archived findings, which trusted lists do not.&lt;/p&gt;
&lt;p&gt;In practice, most teams use both: trusted lists for known-good source infrastructure, and suppression rules for finding-type-specific or resource-scoped noise reduction.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Example Finding: IAM Credential Use Outside AWS&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_finding-types-iam.html#unauthorizedaccess-iam-instancecredentialexfiltrationoutsideaws&quot;&gt;&lt;code&gt;UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration.OutsideAWS&lt;/code&gt;&lt;/a&gt; is a high-fidelity finding with a low false-positive rate: EC2 instance credentials should never originate from outside AWS infrastructure, so this finding almost always indicates active credential theft.&lt;/p&gt;
&lt;p&gt;The finding type &lt;code&gt;UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration.OutsideAWS&lt;/code&gt; fires when instance profile credentials (issued via the EC2 metadata service) are used from an IP address that does not belong to AWS infrastructure. This is a high-fidelity indicator of credential theft, since legitimate use of instance credentials should never originate outside of AWS.&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;schemaVersion&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2.0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;accountId&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;123456789012&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;region&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;eu-west-1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;partition&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;aws&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;arn&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;arn:aws:guardduty:eu-west-1:123456789012:detector/abc123def456/finding/a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration.OutsideAWS&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;title&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Instance credential used from external IP address not associated with AWS&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Credentials created exclusively for EC2 instance i-0abc123def456789a (via role WebAppInstanceRole) were used from external IP address 185.220.101.47, which is not associated with AWS infrastructure.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;severity&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8.0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;createdAt&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2026-05-10T09:14:32Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;updatedAt&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2026-05-10T09:14:32Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;service&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;serviceName&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;guardduty&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;detectorId&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;abc123def456&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;action&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;actionType&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;AWS_API_CALL&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;awsApiCallAction&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;api&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;GetSecretValue&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;serviceName&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;secretsmanager.amazonaws.com&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;callerType&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Remote IP&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;remoteIpDetails&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;ipAddressV4&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;185.220.101.47&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;organization&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;asn&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4244&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;asnOrg&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Tor Project Exit Node&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;isp&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Quintex Alliance Consulting&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;org&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Quintex Alliance Consulting&quot;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;country&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;countryName&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;United States&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;city&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;cityName&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Atlanta&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;geoLocation&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;lat&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;33.749&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;lon&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;-84.388&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;affectedResources&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;evidence&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;threatIntelligenceDetails&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;threatListName&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ProofPoint ET Intelligence&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;threatNames&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;TorExitNode&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;archived&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;resource&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;resourceType&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;AccessKey&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;accessKeyDetails&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;accessKeyId&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ASIAQRSTUVWXYZ123456&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;principalId&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;AROABC123DEF456GHI789:i-0abc123def456789a&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;userType&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;AssumedRole&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;userName&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;WebAppInstanceRole&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Key fields to note:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;type&lt;/code&gt;&lt;/strong&gt;: the finding identifier, useful as the primary filter attribute in a suppression rule&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;severity&lt;/code&gt;&lt;/strong&gt;: scored 8.0 (High) on GuardDuty&#39;s 1-10 scale; credentials used outside AWS are rarely false positives&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;service.action.awsApiCallAction.api&lt;/code&gt;&lt;/strong&gt;: the specific API call made with the stolen credentials (&lt;code&gt;GetSecretValue&lt;/code&gt; here indicates the attacker was targeting secrets)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;service.action.awsApiCallAction.remoteIpDetails&lt;/code&gt;&lt;/strong&gt;: the external IP and enriched geo/ASN data GuardDuty adds automatically&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;service.evidence.threatIntelligenceDetails&lt;/code&gt;&lt;/strong&gt;: shows the credential was used from a known Tor exit node, corroborating the alert&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;resource.accessKeyDetails.principalId&lt;/code&gt;&lt;/strong&gt;: the &lt;code&gt;AROA...&lt;/code&gt; prefix confirms this is an assumed-role session tied to an EC2 instance, not a long-term IAM user key&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/guardduty/latest/ug/what-is-guardduty.html&quot;&gt;What is Amazon GuardDuty?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_finding-types-ec2.html&quot;&gt;GuardDuty EC2 finding types&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_finding-types-iam.html&quot;&gt;GuardDuty IAM finding types&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_finding-types-s3.html&quot;&gt;GuardDuty S3 finding types&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/guardduty/latest/ug/guardduty-finding-types-eks-audit-logs.html&quot;&gt;GuardDuty EKS finding types&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/guardduty/latest/ug/guardduty-finding-types-rds.html&quot;&gt;GuardDuty RDS finding types&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/guardduty/latest/ug/findings_suppression-rule.html&quot;&gt;Suppression rules in GuardDuty&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_upload-lists.html&quot;&gt;Customizing threat detection with entity lists and IP address lists&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>AWS Security Hub: ASFF, Severity Normalisation and Cross-Account Aggregation</title>
    <link href="https://www.haggath.re/blog/security-hub-aggregation-severity/" />
    <updated>2026-05-16T00:00:00Z</updated>
    <id>https://www.haggath.re/blog/security-hub-aggregation-severity/</id>
    <content type="html">&lt;p&gt;If you&#39;ve enabled GuardDuty and Macie in AWS, you already have two separate consoles generating findings in two different formats with two different severity scales. Add Inspector, Config, and a third-party SIEM integration and the problem compounds quickly. Security Hub exists to solve that.&lt;/p&gt;
&lt;p&gt;AWS Security Hub is a managed service that pulls findings from 30+ integrations into a single place, translates them into a common format, and gives you one API and console to query across all of them. It doesn&#39;t detect threats itself. It aggregates and normalises what other services detect.&lt;/p&gt;
&lt;p&gt;At the centre of that normalisation is the &lt;strong&gt;Amazon Security Finding Format (ASFF)&lt;/strong&gt;: a standardised JSON schema that every integrated service must map its findings to before Security Hub will accept them. Every finding, regardless of source, ends up with the same set of fields: severity, affected resource, finding type, workflow state.&lt;/p&gt;
&lt;p&gt;Beyond aggregation, Security Hub provides two additional capabilities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Security Hub Controls&lt;/strong&gt;: managed compliance checks aligned to standards including CIS AWS Foundations Benchmark, PCI DSS, and AWS Foundational Security Best Practices. Each control is a continuously evaluated rule that generates its own ASFF finding when a resource is non-compliant.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Insights&lt;/strong&gt;: pre-built and custom groupings of findings, useful for surfacing patterns such as &amp;quot;all HIGH findings by affected account&amp;quot; or &amp;quot;all findings for a specific EC2 instance&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Security Hub must be enabled per account and per region. Integrations with GuardDuty, Macie, Inspector, Config, and IAM Access Analyzer are enabled separately within Security Hub after the service is turned on.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Finding Categories&lt;/h2&gt;
&lt;p&gt;Security Hub classifies every finding using the &lt;a href=&quot;https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub-findings-format-type-taxonomy.html&quot;&gt;ASFF &lt;code&gt;Types&lt;/code&gt; field&lt;/a&gt; — a three-level &lt;code&gt;Namespace/Category/Classifier&lt;/code&gt; taxonomy that maps findings from GuardDuty, Macie, Config, and other integrations to a consistent set of threat categories.&lt;/p&gt;
&lt;p&gt;Security Hub classifies every finding using the ASFF &lt;code&gt;Types&lt;/code&gt; field, which follows a three-level namespace taxonomy: &lt;code&gt;Namespace/Category/Classifier&lt;/code&gt;. A finding can carry multiple &lt;code&gt;Types&lt;/code&gt; values when it maps to more than one classification.&lt;/p&gt;
&lt;p&gt;The five namespaces in use across Security Hub integrations:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Namespace&lt;/th&gt;
&lt;th&gt;What it covers&lt;/th&gt;
&lt;th&gt;Example sources&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Software and Configuration Checks&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Compliance controls, configuration drift, patch status&lt;/td&gt;
&lt;td&gt;Security Hub Controls, AWS Config&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TTPs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Threat behaviours aligned to MITRE ATT&amp;amp;CK&lt;/td&gt;
&lt;td&gt;GuardDuty, third-party integrations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Sensitive Data Identifications&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sensitive data discovered in cloud resources&lt;/td&gt;
&lt;td&gt;Amazon Macie&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Effects&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The impact of a finding: data exposure, resource consumption&lt;/td&gt;
&lt;td&gt;GuardDuty, Macie&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Unusual Behaviors&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Anomalous activity relative to an established baseline&lt;/td&gt;
&lt;td&gt;GuardDuty&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;A GuardDuty finding for a console login from an unusual location might carry both &lt;code&gt;TTPs/Initial Access/Valid Accounts&lt;/code&gt; and &lt;code&gt;Unusual Behaviors/User/ConsoleLogin&lt;/code&gt;. Two &lt;code&gt;Types&lt;/code&gt; values reflecting different facets of the same event.&lt;/p&gt;
&lt;p&gt;Security Hub Controls findings always fall under &lt;code&gt;Software and Configuration Checks/Industry and Regulatory Standards&lt;/code&gt; or &lt;code&gt;Software and Configuration Checks/AWS Security Best Practices&lt;/code&gt;, depending on which standard the control belongs to.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;The Amazon Security Finding Format (ASFF)&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub-findings-format.html&quot;&gt;Amazon Security Finding Format (ASFF)&lt;/a&gt; is the standardised JSON schema that every Security Hub integration must map its findings to — giving every finding from every source the same set of fields, including severity, affected resource, finding type, and workflow state.&lt;/p&gt;
&lt;p&gt;ASFF is the JSON schema that all Security Hub findings conform to. Every integrated service must translate its native finding format into ASFF before Security Hub will ingest it. This normalisation is what makes cross-service querying and filtering possible.&lt;/p&gt;
&lt;p&gt;The key fields:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SchemaVersion&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Always &lt;code&gt;2018-10-08&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Unique finding ARN within Security Hub&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ProductArn&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ARN of the service that generated the finding: &lt;code&gt;product/aws/guardduty&lt;/code&gt;, &lt;code&gt;product/aws/macie&lt;/code&gt;, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GeneratorId&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Product-specific identifier: the GuardDuty detector ARN, the Config rule name, the Security Hub control ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AwsAccountId&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The account the finding relates to. In a multi-account setup, this is the member account, not the aggregator&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Types&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Array of &lt;code&gt;Namespace/Category/Classifier&lt;/code&gt; strings classifying the finding&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CreatedAt&lt;/code&gt; / &lt;code&gt;UpdatedAt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ISO 8601 timestamps; &lt;code&gt;UpdatedAt&lt;/code&gt; reflects when the originating service last updated the finding&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Severity.Label&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Normalised severity label: &lt;code&gt;INFORMATIONAL&lt;/code&gt;, &lt;code&gt;LOW&lt;/code&gt;, &lt;code&gt;MEDIUM&lt;/code&gt;, &lt;code&gt;HIGH&lt;/code&gt;, or &lt;code&gt;CRITICAL&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Severity.Normalized&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Integer 0-100; the score Security Hub uses to derive &lt;code&gt;Severity.Label&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;FindingProviderFields.Severity&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The original severity from the source product, preserved alongside the normalised ASFF score&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Resources&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Array of affected AWS resources, each with &lt;code&gt;Type&lt;/code&gt;, &lt;code&gt;Id&lt;/code&gt;, &lt;code&gt;ARN&lt;/code&gt;, &lt;code&gt;Region&lt;/code&gt;, and optional &lt;code&gt;Details&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Compliance&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Present on Security Hub control findings only (contains &lt;code&gt;Status&lt;/code&gt;: &lt;code&gt;PASSED&lt;/code&gt;, &lt;code&gt;FAILED&lt;/code&gt;, &lt;code&gt;WARNING&lt;/code&gt;, &lt;code&gt;NOT_AVAILABLE&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;WorkflowState&lt;/code&gt; / &lt;code&gt;Workflow.Status&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Triage state: &lt;code&gt;NEW&lt;/code&gt;, &lt;code&gt;NOTIFIED&lt;/code&gt;, &lt;code&gt;RESOLVED&lt;/code&gt;, or &lt;code&gt;SUPPRESSED&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RecordState&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ACTIVE&lt;/code&gt; or &lt;code&gt;ARCHIVED&lt;/code&gt;; set by the originating service when a finding is no longer relevant&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The distinction between &lt;code&gt;RecordState&lt;/code&gt; and &lt;code&gt;Workflow.Status&lt;/code&gt; trips people up. &lt;code&gt;RecordState&lt;/code&gt; is controlled by the originating service. GuardDuty sets a finding to &lt;code&gt;ARCHIVED&lt;/code&gt; when it stops observing the behaviour. &lt;code&gt;Workflow.Status&lt;/code&gt; is controlled by your team. It reflects where the finding sits in your triage process and is set manually or via Security Hub automation rules. They are independent of each other.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Severity Normalisation&lt;/h2&gt;
&lt;p&gt;Security Hub &lt;a href=&quot;https://docs.aws.amazon.com/securityhub/latest/userguide/finding-update-batchimportfindings.html#batchimportfindings-severity&quot;&gt;maps every integrated service&#39;s native severity scale&lt;/a&gt; to a &lt;code&gt;Severity.Normalized&lt;/code&gt; integer between 0 and 100, deriving a common &lt;code&gt;Severity.Label&lt;/code&gt; — &lt;code&gt;INFORMATIONAL&lt;/code&gt;, &lt;code&gt;LOW&lt;/code&gt;, &lt;code&gt;MEDIUM&lt;/code&gt;, &lt;code&gt;HIGH&lt;/code&gt;, or &lt;code&gt;CRITICAL&lt;/code&gt; — that can be compared across GuardDuty, Macie, Inspector, and other sources in a single query.&lt;/p&gt;
&lt;p&gt;Every finding ingested by Security Hub is assigned a &lt;code&gt;Severity.Normalized&lt;/code&gt; score between 0 and 100. This score determines the &lt;code&gt;Severity.Label&lt;/code&gt; displayed in the console and returned by the API:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Normalized range&lt;/th&gt;
&lt;th&gt;Severity.Label&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;&lt;code&gt;INFORMATIONAL&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1-39&lt;/td&gt;
&lt;td&gt;&lt;code&gt;LOW&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;40-69&lt;/td&gt;
&lt;td&gt;&lt;code&gt;MEDIUM&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;70-89&lt;/td&gt;
&lt;td&gt;&lt;code&gt;HIGH&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;90-100&lt;/td&gt;
&lt;td&gt;&lt;code&gt;CRITICAL&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Each integrated service maps its own native severity scale to this range. For the three AWS services most commonly used together:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Native severity&lt;/th&gt;
&lt;th&gt;ASFF Normalized&lt;/th&gt;
&lt;th&gt;Label&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GuardDuty&lt;/td&gt;
&lt;td&gt;Low (1.0-3.9)&lt;/td&gt;
&lt;td&gt;1-39&lt;/td&gt;
&lt;td&gt;&lt;code&gt;LOW&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GuardDuty&lt;/td&gt;
&lt;td&gt;Medium (4.0-6.9)&lt;/td&gt;
&lt;td&gt;40-69&lt;/td&gt;
&lt;td&gt;&lt;code&gt;MEDIUM&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GuardDuty&lt;/td&gt;
&lt;td&gt;High (7.0-8.9)&lt;/td&gt;
&lt;td&gt;70-89&lt;/td&gt;
&lt;td&gt;&lt;code&gt;HIGH&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GuardDuty&lt;/td&gt;
&lt;td&gt;Critical (9.0+)&lt;/td&gt;
&lt;td&gt;90-100&lt;/td&gt;
&lt;td&gt;&lt;code&gt;CRITICAL&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Macie&lt;/td&gt;
&lt;td&gt;LOW&lt;/td&gt;
&lt;td&gt;1-39&lt;/td&gt;
&lt;td&gt;&lt;code&gt;LOW&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Macie&lt;/td&gt;
&lt;td&gt;MEDIUM&lt;/td&gt;
&lt;td&gt;40-69&lt;/td&gt;
&lt;td&gt;&lt;code&gt;MEDIUM&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Macie&lt;/td&gt;
&lt;td&gt;HIGH&lt;/td&gt;
&lt;td&gt;70-89&lt;/td&gt;
&lt;td&gt;&lt;code&gt;HIGH&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inspector&lt;/td&gt;
&lt;td&gt;INFORMATIONAL&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;&lt;code&gt;INFORMATIONAL&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inspector&lt;/td&gt;
&lt;td&gt;LOW&lt;/td&gt;
&lt;td&gt;1-39&lt;/td&gt;
&lt;td&gt;&lt;code&gt;LOW&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inspector&lt;/td&gt;
&lt;td&gt;MEDIUM&lt;/td&gt;
&lt;td&gt;40-69&lt;/td&gt;
&lt;td&gt;&lt;code&gt;MEDIUM&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inspector&lt;/td&gt;
&lt;td&gt;HIGH&lt;/td&gt;
&lt;td&gt;70-89&lt;/td&gt;
&lt;td&gt;&lt;code&gt;HIGH&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inspector&lt;/td&gt;
&lt;td&gt;CRITICAL&lt;/td&gt;
&lt;td&gt;90-100&lt;/td&gt;
&lt;td&gt;&lt;code&gt;CRITICAL&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The normalised score gives you a common severity axis across services. What it doesn&#39;t give you is context.&lt;/p&gt;
&lt;p&gt;A GuardDuty &lt;code&gt;HIGH&lt;/code&gt; finding for &lt;code&gt;UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration.OutsideAWS&lt;/code&gt; (Normalized: 80) and a Macie &lt;code&gt;HIGH&lt;/code&gt; finding for &lt;code&gt;SensitiveData:S3Object/Credentials&lt;/code&gt; (Normalized: 70) both show up as &lt;code&gt;HIGH&lt;/code&gt; in Security Hub. The first means someone is actively exfiltrating EC2 instance credentials outside AWS. The second means Macie found AWS credentials embedded in an S3 object. Same label, very different urgency.&lt;/p&gt;
&lt;p&gt;This is why &lt;code&gt;ProductArn&lt;/code&gt; and &lt;code&gt;Types&lt;/code&gt; matter when building filters, suppression rules, or automation. Filtering on &lt;code&gt;Severity.Label = HIGH&lt;/code&gt; alone surfaces both. Filtering on &lt;code&gt;ProductArn = product/aws/guardduty&lt;/code&gt; AND &lt;code&gt;Severity.Label = HIGH&lt;/code&gt; narrows to active threat findings from GuardDuty only.&lt;/p&gt;
&lt;p&gt;The original source severity is always available in &lt;code&gt;FindingProviderFields.Severity.Original&lt;/code&gt;, which preserves the native score (e.g. &lt;code&gt;&amp;quot;5.0&amp;quot;&lt;/code&gt; for a GuardDuty Medium) alongside the normalised value.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Cross-Account Aggregation&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.aws.amazon.com/securityhub/latest/userguide/finding-aggregation.html&quot;&gt;Security Hub cross-account aggregation&lt;/a&gt; centralises findings from all member accounts into a single administrator account view — one API, one console, one place to query across your entire AWS organisation.&lt;/p&gt;
&lt;p&gt;In a multi-account AWS organisation, Security Hub findings are generated locally in each member account. Cross-account aggregation centralises them into a single view without requiring you to log into each account separately.&lt;/p&gt;
&lt;h3&gt;Delegated Administrator&lt;/h3&gt;
&lt;p&gt;One account is designated as the Security Hub delegated administrator via AWS Organizations. Typically this is the security tooling or audit account. Member accounts are enrolled automatically (if auto-enable is configured in Organizations) or manually. Once enrolled, each member account&#39;s findings are visible to the administrator account.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;AwsAccountId&lt;/code&gt; field on each finding identifies the originating member account. In the administrator account&#39;s console and API, findings from all members are queryable alongside findings from the administrator account itself.&lt;/p&gt;
&lt;h3&gt;Aggregation Region&lt;/h3&gt;
&lt;p&gt;Security Hub findings are regional by default. Cross-region aggregation must be explicitly configured: one region is designated as the aggregation region, and linked regions forward their findings into it. This gives you a single-region view across both accounts and regions.&lt;/p&gt;
&lt;p&gt;The aggregation region must be the same region where your delegated administrator is configured. Regions are linked individually.&lt;/p&gt;
&lt;h3&gt;Filtering by Account&lt;/h3&gt;
&lt;p&gt;When querying aggregated findings, the &lt;code&gt;AwsAccountId&lt;/code&gt; filter attribute scopes results to specific member accounts. This is useful when a known-noisy account, such as a development sandbox or penetration testing account, generates volume that would otherwise dilute signal from production. You can build Security Hub automation rules that apply &lt;code&gt;Workflow.Status = SUPPRESSED&lt;/code&gt; to findings from specific accounts matching specific criteria, without affecting the same finding types in other accounts.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Example ASFF Finding&lt;/h2&gt;
&lt;p&gt;The following &lt;a href=&quot;https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_finding-types-iam.html#unauthorizedaccess-iam-consoleloginsuccessb&quot;&gt;&lt;code&gt;UnauthorizedAccess:IAMUser/ConsoleLoginSuccess.B&lt;/code&gt;&lt;/a&gt; finding shows how a GuardDuty alert looks after Security Hub normalises it into ASFF — with the original GuardDuty severity preserved in &lt;code&gt;FindingProviderFields&lt;/code&gt; alongside the normalised score.&lt;/p&gt;
&lt;p&gt;The following is a GuardDuty &lt;code&gt;UnauthorizedAccess:IAMUser/ConsoleLoginSuccess.B&lt;/code&gt; finding as it appears in Security Hub after normalisation, in the format returned by the &lt;code&gt;GetFindings&lt;/code&gt; API.&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;SchemaVersion&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2018-10-08&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;Id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;arn:aws:securityhub:eu-west-1:123456789012:subscription/guardduty/v1/eu-west-1/123456789012/a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;ProductArn&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;arn:aws:securityhub:eu-west-1::product/aws/guardduty&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;GeneratorId&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;arn:aws:guardduty:eu-west-1:123456789012:detector/abc123def456abc123def456abc123de&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;AwsAccountId&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;123456789012&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;Types&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;TTPs/Initial Access/Valid Accounts&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;Unusual Behaviors/User/ConsoleLogin&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;CreatedAt&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2026-05-10T08:42:17Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;UpdatedAt&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2026-05-10T08:42:17Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;Severity&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;Label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;MEDIUM&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;Normalized&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;Original&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;MEDIUM&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;FindingProviderFields&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;Severity&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;Label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;MEDIUM&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;Original&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;5.0&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;Types&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&quot;TTPs/Initial Access/Valid Accounts&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&quot;Unusual Behaviors/User/ConsoleLogin&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;Title&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Successful console login from anomalous location.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;Description&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;AWS Management Console login was observed from an anomalous location. The principal john.doe successfully authenticated from Spain, which is inconsistent with the geographic baseline established for this user.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;Resources&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;Type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;AwsIamUser&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;Id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;arn:aws:iam::123456789012:user/john.doe&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;Partition&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;aws&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;Region&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;eu-west-1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;Details&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;AwsIamUser&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;UserName&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;john.doe&quot;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;WorkflowState&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;NEW&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;Workflow&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;Status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;NEW&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;RecordState&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ACTIVE&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Key fields to note:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ProductArn&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;product/aws/guardduty&lt;/code&gt; identifies the originating service. A Macie finding reads &lt;code&gt;product/aws/macie&lt;/code&gt;; a Security Hub control finding reads &lt;code&gt;product/aws/securityhub&lt;/code&gt;. This is the primary field for filtering by integration.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;GeneratorId&lt;/code&gt;&lt;/strong&gt;: the GuardDuty detector ARN. In multi-account environments with multiple detectors, this identifies which detector fired, which is useful when a specific detector is known to generate noise for a particular finding type.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Types&lt;/code&gt;&lt;/strong&gt;: dual classification. &lt;code&gt;TTPs/Initial Access/Valid Accounts&lt;/code&gt; maps to MITRE ATT&amp;amp;CK; &lt;code&gt;Unusual Behaviors/User/ConsoleLogin&lt;/code&gt; reflects GuardDuty&#39;s anomaly detection model. Both are searchable filter attributes in Security Hub.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Severity.Normalized&lt;/code&gt;&lt;/strong&gt;: 50, placing this in the &lt;code&gt;MEDIUM&lt;/code&gt; band (40-69). GuardDuty&#39;s native severity of 5.0 maps directly to 50. &lt;code&gt;FindingProviderFields.Severity.Original&lt;/code&gt; preserves the native &lt;code&gt;&amp;quot;5.0&amp;quot;&lt;/code&gt; alongside the normalised value.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Compliance&lt;/code&gt;&lt;/strong&gt;: absent on threat findings. The field is omitted entirely from the ASFF document, not set to null. Present only on Security Hub control findings, where it carries &lt;code&gt;Status: PASSED | FAILED | WARNING | NOT_AVAILABLE&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Workflow.Status&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;NEW&lt;/code&gt; means the finding hasn&#39;t been triaged. Your team or automation rules change this to &lt;code&gt;RESOLVED&lt;/code&gt; or &lt;code&gt;SUPPRESSED&lt;/code&gt;. Unlike &lt;code&gt;RecordState&lt;/code&gt;, this field is yours to manage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;RecordState&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;ACTIVE&lt;/code&gt; means the finding is current. GuardDuty sets this to &lt;code&gt;ARCHIVED&lt;/code&gt; when it stops observing the behaviour, independent of your triage state.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/securityhub/latest/userguide/what-is-securityhub.html&quot;&gt;What is AWS Security Hub?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub-findings-format.html&quot;&gt;Amazon Security Finding Format (ASFF) syntax&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub-findings-format-attributes.html&quot;&gt;ASFF field reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/securityhub/latest/userguide/finding-update-batchimportfindings.html#batchimportfindings-severity&quot;&gt;Severity normalisation in Security Hub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub-internal-providers.html&quot;&gt;Available AWS service integrations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub-accounts-orgs-recommend.html&quot;&gt;Designating a Security Hub administrator account&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/securityhub/latest/userguide/finding-aggregation.html&quot;&gt;Configuring finding aggregation across Regions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Leveraging Amazon EventBridge to invoke Security Automation</title>
    <link href="https://www.haggath.re/blog/leveraging-eventbridge-for-security-automation/" />
    <updated>2026-05-22T00:00:00Z</updated>
    <id>https://www.haggath.re/blog/leveraging-eventbridge-for-security-automation/</id>
    <content type="html">&lt;p&gt;GuardDuty identifies threats. Macie surfaces sensitive data exposure. Security Hub aggregates findings across both. None of them act on what they find by default — that part is on you.&lt;/p&gt;
&lt;p&gt;Amazon EventBridge is where detection meets response. It captures events emitted by AWS services and routes them to targets you define: Lambda functions, Step Functions workflows, Systems Manager Automation runbooks, SNS topics. It is the layer between a finding being generated and something actually happening because of it.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;What is Amazon EventBridge?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html&quot;&gt;Amazon EventBridge&lt;/a&gt; is a serverless event bus that receives structured JSON events from AWS services and routes them to targets you define — Lambda functions, Step Functions workflows, SNS topics, and more — based on rules you configure.&lt;/p&gt;
&lt;p&gt;EventBridge is a serverless event bus. AWS services publish structured JSON events to it when things happen: a GuardDuty finding is generated, an EC2 instance changes state, an IAM policy is modified. EventBridge receives those events on the default event bus and evaluates them against rules you define. Matching events get delivered to your targets.&lt;/p&gt;
&lt;p&gt;There are three ways to work with events in EventBridge:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Event buses&lt;/strong&gt;: receive events from many sources and route them to many targets. Every AWS account has a default event bus that AWS services publish to automatically. You can create custom buses for cross-account routing or your own application events.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pipes&lt;/strong&gt;: point-to-point, single source to single target. Useful when you need filtering, enrichment, or transformation in between. Less relevant for security automation at scale.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scheduler&lt;/strong&gt;: time-based invocation using cron or rate expressions. Separate from event-driven rules.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For security automation, you&#39;ll mostly be working with event buses and rules.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Event-Driven Automation in AWS&lt;/h2&gt;
&lt;p&gt;Event-driven automation replaces the manual security operations loop — finding, review, ticket, action — with an immediate, rule-driven response triggered the moment a security service emits an event, collapsing detection-to-response time from hours to seconds.&lt;/p&gt;
&lt;p&gt;The traditional security operations loop — finding appears, analyst reviews it, ticket gets raised, someone performs a manual action — doesn&#39;t hold up in environments with hundreds of accounts and thousands of resources. The volume is too high and the latency is too long.&lt;/p&gt;
&lt;p&gt;Event-driven automation collapses that loop. When GuardDuty generates a HIGH severity finding, EventBridge can invoke a response in seconds, before an analyst has even opened the console. The security service emits an event, a rule matches it, a target runs. Each step is independent. The detecting service doesn&#39;t know or care what happens downstream.&lt;/p&gt;
&lt;p&gt;One rule can have up to five targets. A single event simultaneously notifies an SNS topic, opens a ticket via Lambda, and starts a Step Functions workflow. Each target gets the same event; none of them know about the others.&lt;/p&gt;
&lt;p&gt;The basic flow:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A security service detects something and emits an event&lt;/li&gt;
&lt;li&gt;EventBridge receives it on the default event bus&lt;/li&gt;
&lt;li&gt;A rule evaluates the event against a pattern&lt;/li&gt;
&lt;li&gt;If it matches, EventBridge invokes one or more targets&lt;/li&gt;
&lt;li&gt;The target does something&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Automation does not have to mean remediation&lt;/h3&gt;
&lt;p&gt;Event-driven automation doesn&#39;t have to touch anything. It doesn&#39;t have to isolate an instance or revoke a credential. Those are valid responses, but they&#39;re not always the right first move, and in some environments they&#39;re politically difficult to get approved.&lt;/p&gt;
&lt;p&gt;A finding is what the detecting service observed, not the full picture. Before taking an action that affects a running workload, it&#39;s worth thinking about what you don&#39;t know yet.&lt;/p&gt;
&lt;p&gt;EventBridge targets can be used purely to gather that context and feed it back into your workflow:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A GuardDuty finding identifies an EC2 instance by ID. A Lambda function queries the EC2 API, pulls the instance tags, attached IAM role, VPC, and public IP status, then writes all of it back to the Security Hub finding via &lt;code&gt;BatchUpdateFindings&lt;/code&gt;. The analyst sees a fully enriched finding instead of a raw alert.&lt;/li&gt;
&lt;li&gt;A Macie finding identifies an S3 object containing credentials. Before anything is suppressed or escalated, a Lambda function checks whether the bucket is public, who last modified the object, and whether replication is configured to an external account.&lt;/li&gt;
&lt;li&gt;An IAM Access Analyzer finding flags external access. A Lambda function checks whether the principal being granted access belongs to a known partner account in Parameter Store. If it matches, it&#39;s low priority. If it doesn&#39;t, it escalates.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In each case the automation runs immediately, nothing in production is touched, and the analyst gets a finding with actual context instead of a raw alert. It&#39;s a reasonable place to start if your team isn&#39;t ready to auto-remediate yet, and it stays useful after you are — better context means better triage regardless of what happens next.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;How EventBridge Captures Security Events&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-rules.html&quot;&gt;EventBridge rules&lt;/a&gt; match incoming events using &lt;a href=&quot;https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-event-patterns.html&quot;&gt;event patterns&lt;/a&gt; — JSON filters that specify which fields and values must be present — and route matching events to up to five targets simultaneously.&lt;/p&gt;
&lt;h3&gt;Event Patterns&lt;/h3&gt;
&lt;p&gt;Rules match events using event patterns: JSON filters that specify which fields must be present and what values they must hold. EventBridge evaluates every incoming event against every active rule. If the event matches, the rule fires.&lt;/p&gt;
&lt;p&gt;You only need to include the fields you want to match on. Fields you omit are ignored.&lt;/p&gt;
&lt;p&gt;A rule that captures all GuardDuty findings:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;source&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;aws.guardduty&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;detail-type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;GuardDuty Finding&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A rule scoped to a specific finding type at HIGH severity and above:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;source&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;aws.guardduty&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;detail-type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;GuardDuty Finding&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;detail&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration.OutsideAWS&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;severity&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;numeric&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&gt;=&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A rule that captures Security Hub findings with a FAILED compliance status that haven&#39;t been triaged yet:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;source&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;aws.securityhub&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;detail-type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Security Hub Findings - Imported&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;detail&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;findings&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;Compliance&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;Status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;FAILED&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;Workflow&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;Status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;NEW&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Event Sources&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Event type&lt;/th&gt;
&lt;th&gt;When it fires&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GuardDuty&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GuardDuty Finding&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A new finding is generated or an existing finding is updated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security Hub&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Security Hub Findings - Imported&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A finding is ingested or updated in Security Hub&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Macie&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Macie Finding&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A new Macie finding is generated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CloudTrail&lt;/td&gt;
&lt;td&gt;Via &lt;code&gt;aws.cloudtrail&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;API calls matching a configured data event trail&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IAM Access Analyzer&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Access Analyzer Finding&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A new external access finding is generated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Config&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Config Rules Compliance Change&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A resource transitions to NON_COMPLIANT&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Targets&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Target&lt;/th&gt;
&lt;th&gt;What it&#39;s good for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Lambda&lt;/td&gt;
&lt;td&gt;Arbitrary code: enrich findings, call external APIs, modify resources, make decisions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Step Functions&lt;/td&gt;
&lt;td&gt;Multi-step workflows with branching, retries, and optional human approval&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Systems Manager Automation&lt;/td&gt;
&lt;td&gt;Runbook-based remediation for AWS resource configurations, good for Config compliance findings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SNS&lt;/td&gt;
&lt;td&gt;Fan-out to email, SMS, HTTP endpoints, on-call paging tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQS&lt;/td&gt;
&lt;td&gt;Queue events for downstream processing at controlled throughput, useful during finding bursts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Each rule supports up to five targets, all invoked in parallel with the same event.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Example: Automated Response to Credential Exfiltration&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_finding-types-iam.html#unauthorizedaccess-iam-instancecredentialexfiltrationoutsideaws&quot;&gt;&lt;code&gt;UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration.OutsideAWS&lt;/code&gt;&lt;/a&gt; fires when EC2 instance credentials are used from outside AWS infrastructure — a high-fidelity indicator with a low false-positive rate that warrants an immediate automated response.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration.OutsideAWS&lt;/code&gt; fires when EC2 instance credentials are used from outside AWS infrastructure. Instance credentials should never originate outside AWS, so the false positive rate on this one is low.&lt;/p&gt;
&lt;p&gt;A response workflow for this finding:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;EventBridge rule matches on &lt;code&gt;source: aws.guardduty&lt;/code&gt; and &lt;code&gt;detail.type: UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration.OutsideAWS&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Rule triggers a Step Functions workflow&lt;/li&gt;
&lt;li&gt;Step 1: Lambda extracts the affected role ARN from &lt;code&gt;detail.resource.accessKeyDetails.principalId&lt;/code&gt; and queries the EC2 API for instance tags, environment, and owner&lt;/li&gt;
&lt;li&gt;Step 2: Lambda writes the enriched context back to the Security Hub finding via &lt;code&gt;BatchUpdateFindings&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Step 3: SNS notifies the security team with the finding detail, enriched context, and a link to the finding in Security Hub&lt;/li&gt;
&lt;li&gt;Step 4: Lambda attaches an explicit deny-all inline policy to the role via &lt;code&gt;iam:PutRolePolicy&lt;/code&gt;, blocking further use of any active sessions&lt;/li&gt;
&lt;li&gt;Step 5: Lambda updates &lt;code&gt;Workflow.Status&lt;/code&gt; to &lt;code&gt;NOTIFIED&lt;/code&gt; in Security Hub&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Enrichment and notification happen first. Containment is a downstream step, after context has been gathered. The whole sequence runs in under 30 seconds from finding generation.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html&quot;&gt;What is Amazon EventBridge?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-rules.html&quot;&gt;Amazon EventBridge rules&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-event-patterns.html&quot;&gt;EventBridge event patterns&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-targets.html&quot;&gt;EventBridge targets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_findings_cloudwatch.html&quot;&gt;GuardDuty EventBridge events&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub-cwe-integration-types.html&quot;&gt;Security Hub EventBridge events&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub-cloudwatch-events.html&quot;&gt;Automated response and remediation in Security Hub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
</feed>