Skip to main content
emnode / learn
Compliance

Set AWS account security contact information

Security Hub Account.1 — when AWS Trust & Safety needs to reach you about a compromise, they need a real address on file. Set it once per account.

9 min·10 sections·AWS

Last reviewed

Remediates AWS Security Hub: Account.1

Account security contact: the basics

What does Security Hub Account.1 actually check?

Every AWS account has a primary root email address, set when the account was created. AWS also lets you register up to three alternate contacts for distinct purposes: Operations (for outage and maintenance notices), Billing (for invoice and payment issues), and Security (for compromise notifications, abuse reports, and incident response). These are configured per-account via the Account API.

Security Hub control Account.1 ("Security contact information should be provided for an AWS account") fails whenever an account has no alternate Security contact registered. The control is straightforward: it reads the account's alternate-contact metadata and passes only if the SECURITY type is populated with a name, title, email, and phone number.

The misconfiguration is almost always benign neglect rather than malice — the account was created in a hurry, the root email points at one person's inbox, and nobody ever circled back to fill in the alternate contacts. Account.1 fires because that single-inbox setup is fragile in exactly the moments you need it most.

In this lesson you'll learn what AWS actually does with the Security contact, why the root-email-only setup quietly fails during real incidents, and how to register a security contact that survives staff turnover and weekends. You'll see the real CLI calls to read, set, and verify the contact across both a single account and an AWS Organization.

Fun fact

60 seconds, $0, fixes one of the most-flagged controls

Account.1 is consistently in the top ten most-failed Security Hub findings across the AWS estate — not because it's hard, but because it's invisible. The remediation is one API call per account, costs nothing, and survives forever. AWS's own Trust & Safety team has published incident write-ups where the difference between a 4-hour and a 4-day breach response was whether the Security contact was reachable on a Saturday. The whole fix takes less time than reading this paragraph.

Setting the security contact in action

Marco runs the platform team at a fintech. A Security Hub scan flags Account.1 across 14 of their 23 member accounts in the organisation. Severity: MEDIUM. He pulls up the management account first to see what's currently registered.

He's not just going to put his own email in — the whole point is that whoever is paged at 3am should reach the same inbox as whoever happens to be on duty during business hours. The company already runs a security@ distribution list backed by their PagerDuty rotation; that's the address that goes in.

He starts by checking what's currently set on the management account.

First, read the current Security alternate contact. A null result is exactly what triggers the Account.1 finding.

$ aws account get-alternate-contact --alternate-contact-type SECURITY
An error occurred (ResourceNotFoundException) when calling the GetAlternateContact operation:
No contact of type SECURITY is registered for this account.
# Empty contact slot — this is exactly what Account.1 flags.

The management account has no Security contact registered.

Now register a contact pointing at the security distribution list and the on-call rotation pager number.

$ aws account put-alternate-contact --alternate-contact-type SECURITY --name "Security Operations" --title "Security Team" --email-address [email protected] --phone-number "+1-555-0142-7700"
# Command returned successfully — no output on success.
$ aws account get-alternate-contact --alternate-contact-type SECURITY
{
"AlternateContact": {
"AlternateContactType": "SECURITY",
"EmailAddress": "[email protected]",
"Name": "Security Operations",
"PhoneNumber": "+1-555-0142-7700",
"Title": "Security Team"
}
}
# Distribution list + pager rotation — survives staff turnover and weekends.

Contact registered. Account.1 will pass on the next Security Hub evaluation.

Alternate contacts under the hooddeep dive

Alternate contacts live on the account itself, not in IAM, not in Organizations, not in any of the data-plane services. They're managed via the AWS Account Management API (the account namespace introduced in 2022), which exposes PutAlternateContact, GetAlternateContact, and DeleteAlternateContact. There are exactly three slots — OPERATIONS, BILLING, SECURITY — and each is independent. Setting Security has no effect on the other two.

AWS uses the Security contact for a specific, narrow set of communications: notifications when their internal monitoring spots credentials leaked on public GitHub repos, abuse reports filed by third parties against your resources, AWS Inspector and GuardDuty escalations that Trust & Safety chooses to action manually, takedown notices, and direct outreach when their Fraud team detects compromised account behaviour. The address is also used by the AWS Security team during coordinated vulnerability disclosure on services you're using.

Security Hub control Account.1 evaluates every 24 hours by default. The check is binary — populated or not — so a placeholder address technically passes the control while still failing the spirit of it. AWS Config also exposes the same data via the account-contact-details-configured rule for organisations that prefer Config to Security Hub for compliance reporting.

# How AWS evaluates the Account.1 check — a populated Security slot is the only pass condition.
aws account get-alternate-contact \
  --alternate-contact-type SECURITY \
  --query 'AlternateContact.{Email:EmailAddress,Phone:PhoneNumber,Name:Name}'

# Returns a populated object on PASS, or ResourceNotFoundException on FAIL.

What is the impact of running with no Security contact?

The most direct impact is incident response latency. When AWS Trust & Safety detects compromised credentials — for example, an access key leaked on GitHub being scraped by their continuous secret-scanner — they email the Security contact within minutes. With no Security contact set, the notification falls back to the root email. Root email lives in your IT admin's inbox, often unmonitored on evenings and weekends, and has no documented SLA. By the time someone sees it on Monday morning, an attacker has had 60+ hours of unsupervised access.

The second-order impact is regulatory. SOC 2, ISO 27001, PCI DSS, and HIPAA all expect a documented incident-response process with a clearly identified point of contact reachable 24/7. "AWS sent the notification to nobody in particular" is not a defensible answer in front of an auditor — and the Security Hub finding sitting open is the audit evidence that the control was missing.

The third-order impact is the breach itself. AWS's leaked-credential scanner finds keys faster than most organisations' own monitoring; the Security contact is your one direct line into that signal. Customers who've shipped a credential and recovered cleanly typically did so because AWS reached them within minutes; the ones who made the news were usually unreachable.

The fix costs zero dollars. There's no service charge, no usage cost, no per-account fee. The only "cost" is the engineering minute it takes to register the contact — measured against the engineering hours and potential breach cost of leaving it empty, the ROI is roughly infinite.

How do you set a security contact that actually works?

Setting the contact is a four-step loop: inventory existing contacts, set a durable address, propagate across the organisation, and verify the finding clears. Skipping any of them leaves accounts behind.

1. Inventory which accounts are missing the Security contact

Loop across every account in the organisation and call account get-alternate-contact --alternate-contact-type SECURITY. Anything that returns ResourceNotFoundException is failing Account.1 right now. Capture the account IDs into a list — this is your fix-it backlog. Do not skip dormant or sandbox accounts; AWS sends Trust & Safety notifications to them just as much as production accounts.

2. Use a distribution list and a rotation pager, never a person

The Security contact must outlive any individual. Register a group address — [email protected], aws-security@, or similar — backed by a real on-call rotation in PagerDuty/Opsgenie/your incident tool. The phone number should be the rotation pager, not a personal mobile. The single biggest failure mode of this control is "we set it to Marco when he was here in 2022 and he left in 2024" — a distribution list never resigns.

3. Propagate across the organisation from the management account

AWS Organizations lets the management account write alternate contacts on behalf of member accounts via --account-id <member-id>. Run a script: for every account ID in the org, call aws account put-alternate-contact --account-id <id> --alternate-contact-type SECURITY ... with the same payload. This is a one-time bulk fix; new accounts created by Control Tower or Account Factory can have the same call wired into their provisioning pipeline so the contact is registered automatically.

4. Verify the Security Hub finding clears

Security Hub re-evaluates Account.1 within 24 hours. After applying the contact, refresh the finding via aws securityhub get-findings --filters '{"GeneratorId":[{"Value":"security-control/Account.1","Comparison":"EQUALS"}]}'. Status should flip from FAILED to PASSED. If it doesn't, double-check that the contact populated all four fields — Security Hub is strict about complete data.

# Single-account fix — run as the account's own credentials.
aws account put-alternate-contact \
  --alternate-contact-type SECURITY \
  --name "Security Operations" \
  --title "Security Team" \
  --email-address [email protected] \
  --phone-number "+1-555-0142-7700"

# Organisation-wide fix — run from the management account, loop across member IDs.
for account_id in $(aws organizations list-accounts --query 'Accounts[?Status==`ACTIVE`].Id' --output text); do
  aws account put-alternate-contact \
    --account-id "$account_id" \
    --alternate-contact-type SECURITY \
    --name "Security Operations" \
    --title "Security Team" \
    --email-address [email protected] \
    --phone-number "+1-555-0142-7700"
done

# Verify after rollout.
aws account get-alternate-contact --alternate-contact-type SECURITY

Quick quiz

Question 1 of 5

Security Hub fires Account.1 on 14 of your member accounts. What's the most durable fix?

You've completed Set AWS account security contact information. You now know what AWS uses the Security contact for, why a distribution list and a pager rotation are the only durable answer, and how to roll the fix across an entire AWS Organization in a single loop. The next time Account.1 fires — or, more importantly, the next time AWS Trust & Safety needs to reach you about a compromise — your four-step loop has already done the work.

Back to the library