Governance, Security and Compliance

This content was generated with the assistance of AI and should be verified against the official documentation before being relied on in production.

See the section bibliography for the reference material consulted while preparing these pages.

Commands and console steps on this page were checked on 2026-10-01 against the AWS CLI v2 command reference (the 2.37 line, which already contains the securityhub v2 commands and the artifact service) and the AWS Config, Security Hub, GuardDuty, Inspector, Macie, WAF and Artifact user guides. Security services are renamed, split and retired faster than most of AWS, so re-verify service names, plan names and flags against aws --version and the linked reference pages before relying on them in a pipeline. Examples use us-east-1 and the placeholder account ID 111122223333; both are stand-ins for your own values.

The earlier pages of this section each covered the security controls of one service: identities on Identity and Access, keys and secrets on Secrets Manager, Parameter Store and KMS, network filtering on VPC Networking, bucket protection on S3 Security and Static Hosting. This page covers what applies across the whole Bookshelf environment: who is responsible for what, how the controls are layered, how configuration is continuously evaluated (AWS Config), how threats and vulnerabilities are detected (GuardDuty, Inspector, Macie, Detective), how findings are consolidated (AWS Security Hub), and how you answer "is this environment compliant" (AWS Artifact, conformance packs and the compliance programs). It closes with a baseline checklist for a new account. The Azure counterpart is Governance and Compliance, where Azure Policy and Microsoft Defender for Cloud play roles that AWS splits across several services.

Shared responsibility

AWS operates under a shared responsibility model: AWS is responsible for the security of the cloud — the facilities, hardware, global network and the software layers it operates — and you are responsible for security in the cloud — your data, identities, configuration and the guest software you run. The conceptual model is introduced on Cloud Concepts; what matters operationally is that the line moves with the service you pick:

Service AWS is responsible for You are responsible for

Amazon EC2 (IaaS)

Physical hosts, hypervisor, network fabric, the facility.

Guest OS patching, software, security groups, IAM roles, disk encryption choices, data.

Amazon RDS / Aurora (managed)

Host and engine patching (within the maintenance windows you set), backups infrastructure, Multi-AZ failover plumbing.

Network exposure (subnet groups, security groups), database users and IAM authentication, encryption settings, parameter choices, the data and its classification.

AWS Lambda / Fargate (serverless)

Runtime and OS patching, isolation between functions or tasks, scaling infrastructure.

Your code and its dependencies, execution/task roles, event source permissions, secrets handling, data.

Amazon S3 (managed storage)

Durability, the service itself, physical security.

Bucket policies, Block Public Access, encryption and key policy choices, object-level data, access logging.

Two practical consequences. First, "managed" never means "nothing to configure": nearly every public data exposure on AWS is a customer-side configuration (a public bucket, an open security group, an over-broad role), which is exactly what the services below detect. Second, responsibilities are inherited or shared for some controls: patching is shared (AWS patches the host, you patch the guest), and compliance is shared (AWS provides audited evidence for its layer through AWS Artifact; you provide evidence for yours). Older tutorials sometimes describe the model as a single diagram with a fixed line; the current documentation stresses that the line depends on the service and on the controls you choose.

Defence in depth

No single control is enough, so AWS security is layered. A request or an attacker has to get through several independent layers, each with its own detective counterpart:

flowchart TB subgraph Edge["Edge: Route 53, CloudFront, Shield, WAF"] E1["DDoS absorption, rate limits,\nmanaged rule groups"] end subgraph Net["Network: VPC, security groups, NACLs, Network Firewall"] N1["Segmentation, stateful filtering,\nprivate subnets, VPC endpoints"] end subgraph Comp["Compute: Inspector, SSM Patch Manager"] C1["Vulnerability scanning,\npatching, IMDSv2, least-privilege roles"] end subgraph Data["Data and identity: IAM, KMS, Secrets Manager, ACM, Macie"] D1["Encryption, key policies, MFA,\nsensitive-data discovery"] end subgraph Detect["Detection and governance: CloudTrail, Config, GuardDuty, Security Hub, Detective"] T1["Audit log, configuration history,\nthreat findings, one findings view"] end Edge --> Net --> Comp --> Data Data -. events and logs .-> Detect Net -. flow and DNS logs .-> Detect Comp -. findings .-> Detect
Layer Services and controls Covered on

Edge

Route 53, CloudFront, AWS Shield (Standard on by default), AWS WAF, AWS Firewall Manager.

[Edge protection], CloudFront and CDN Delivery, Route 53, DNS and ACM Certificates

Network

Security groups, network ACLs, VPC endpoints, AWS Network Firewall, private subnets.

VPC Networking

Compute

Amazon Inspector, Systems Manager Patch Manager and Session Manager, IMDSv2, task and execution roles.

[Amazon Inspector], Amazon EC2 and Auto Scaling

Data and identity

IAM and MFA, KMS, Secrets Manager, ACM, Macie, S3 Block Public Access.

Identity and Access, Secrets Manager, Parameter Store and KMS, [Amazon Macie]

Detection and governance

CloudTrail, AWS Config, GuardDuty, Security Hub, Detective, Trusted Advisor.

The rest of this page and Monitoring and Observability

AWS Config

AWS Config records the configuration of supported resources over time and evaluates it against rules. Where CloudTrail answers "who called which API", Config answers "what did this resource look like, and was it compliant, at a given moment". Its parts:

Configuration recorder

Records configuration items (CIs) for the resource types you choose — all supported types (the default for new setups), or a selected list — either continuously on every change or daily. One recorder per Region per account.

Delivery channel

Where snapshots and history go: an S3 bucket and, optionally, an SNS topic.

Rules

Evaluations of recorded resources. Managed rules are prebuilt (for example S3_BUCKET_PUBLIC_READ_PROHIBITED, ENCRYPTED_VOLUMES, ROOT_ACCOUNT_MFA_ENABLED, CLOUD_TRAIL_ENABLED); custom rules are written with Lambda or CloudFormation Guard. Rules trigger on configuration changes or periodically.

Remediation

A rule’s non-compliant resources can be fixed by a Systems Manager Automation document, manually or automatically.

Conformance packs

A YAML template bundling rules and remediation actions into one deployable unit, mapped to a framework or best-practice set; AWS publishes sample packs for frameworks such as PCI DSS, HIPAA and NIST. Can be deployed to every account in an organization.

Aggregators

A central account and Region that collects configuration and compliance data from many accounts and Regions (organization-wide when linked to AWS Organizations).

Advanced queries

SQL-like queries over current configuration, for inventory ("which volumes are unencrypted").

Config is also the engine under other services: Security Hub’s CSPM controls and AWS Control Tower’s detective controls are mostly implemented as Config rules, which is why enabling them without a recorder produces no findings. Control Tower sets up Config for every account in a landing zone (see Accounts and Organizations).

In the AWS Management Console

  1. Open AWS Config in the Region you want to record (Config is Regional; use the Region selector).

  2. Choose 1-click setup or Get started: select the resource types (all supported types is the usual choice), an S3 bucket for delivery, and an IAM role (let Config create the service-linked role).

  3. Choose Rules → Add rule, pick AWS managed rule, and search for s3-bucket-public-read-prohibited.

  4. Choose Conformance packs → Deploy conformance pack to start from a sample template.

  5. Use Aggregators to add an organization-wide aggregator from the management or delegated administrator account.

With the AWS CLI

Create the recorder and delivery channel, then start recording. The delivery bucket must already exist and carry a bucket policy that lets config.amazonaws.com write to it (see the Config user guide for the exact policy).

export AWS_REGION=us-east-1
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
CONFIG_BUCKET="bookshelf-config-$ACCOUNT_ID"

aws iam create-service-linked-role --aws-service-name config.amazonaws.com

aws configservice put-configuration-recorder \
  --configuration-recorder "name=default,roleARN=arn:aws:iam::$ACCOUNT_ID:role/aws-service-role/config.amazonaws.com/AWSServiceRoleForConfig" \
  --recording-group "allSupported=true,includeGlobalResourceTypes=false"

aws configservice put-delivery-channel \
  --delivery-channel "name=default,s3BucketName=$CONFIG_BUCKET"

aws configservice start-configuration-recorder --configuration-recorder-name default

Add a managed rule that flags public S3 buckets and read the result:

aws configservice put-config-rule --config-rule '{
  "ConfigRuleName": "s3-bucket-public-read-prohibited",
  "Source": {
    "Owner": "AWS",
    "SourceIdentifier": "S3_BUCKET_PUBLIC_READ_PROHIBITED"
  },
  "Scope": { "ComplianceResourceTypes": ["AWS::S3::Bucket"] }
}'

aws configservice describe-compliance-by-config-rule \
  --config-rule-names s3-bucket-public-read-prohibited

aws configservice get-compliance-details-by-config-rule \
  --config-rule-name s3-bucket-public-read-prohibited \
  --compliance-types NON_COMPLIANT \
  --query 'EvaluationResults[].EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId'

Deploy a conformance pack from a local template (sample templates are listed in the Config user guide) and ask an organization-wide aggregator for non-compliant rules:

aws configservice put-conformance-pack \
  --conformance-pack-name bookshelf-best-practices \
  --template-body file://operational-best-practices.yaml

aws configservice describe-conformance-pack-compliance \
  --conformance-pack-name bookshelf-best-practices

aws configservice select-resource-config \
  --expression "SELECT resourceId, resourceType WHERE resourceType = 'AWS::EC2::Volume' AND configuration.encrypted = false"

AWS Security Hub

AWS Security Hub was relaunched in December 2025 as a unified cloud security service: it ingests findings from AWS detection services (GuardDuty, Inspector, Macie and others), from Security Hub CSPM and from partner products, normalizes them into the Open Cybersecurity Schema Framework (OCSF), correlates related signals into prioritized exposure findings and shows potential attack paths, so a team triages a handful of correlated issues instead of thousands of individual alerts. The earlier service is not gone: it continues as AWS Security Hub CSPM (Cloud Security Posture Management), the part that runs continuous configuration checks against security standards and emits findings in the older AWS Security Finding Format (ASFF). Older articles and tutorials that say "Security Hub" almost always mean what is now called Security Hub CSPM; the CLI mirrors the split with the original enable-security-hub, batch-enable-standards, get-findings family (CSPM) and the new enable-security-hub-v2, get-findings-v2 family.

Security Hub CSPM

Security standards (AWS Foundational Security Best Practices, CIS AWS Foundations Benchmark, PCI DSS, NIST SP 800-53) made of controls, most of them evaluated by service-linked AWS Config rules — so AWS Config must be recording in each Region and account. Produces a security score, supports cross-Region finding aggregation, central configuration across an organization, automation rules and EventBridge custom actions. A 30-day free trial starts when you first enable it in an account.

Security Hub (unified)

Enabled per account and Region with one call; works with delegated administration through AWS Organizations; priced in plans (a baseline "Essentials" plan plus add-on capabilities) rather than per ingested finding — check the pricing page for the current plan structure.

In the AWS Management Console

  1. Open AWS Security Hub, choose the Region, and choose Enable Security Hub (the unified service) or, for standards-based checks, Security Hub CSPM → Enable and pick the standards (start with AWS Foundational Security Best Practices).

  2. Under Settings → Configuration (or Organizations for the unified service), designate a delegated administrator account in your security account and enable auto-enrollment of new member accounts.

  3. In CSPM, use Settings → Regions to choose an aggregation Region so findings from all Regions appear in one place.

  4. Open Findings or Exposures and filter by severity; route a finding to a ticket with an automation rule or a custom action.

With the AWS CLI

# Unified Security Hub (v2)
aws securityhub enable-security-hub-v2

# Security Hub CSPM: enable the service with the default standards, then add another
aws securityhub enable-security-hub --enable-default-standards
aws securityhub batch-enable-standards --standards-subscription-requests \
  "StandardsArn=arn:aws:securityhub:$AWS_REGION::standards/cis-aws-foundations-benchmark/v/3.0.0"

# Aggregate findings from all Regions into the current one (CSPM)
aws securityhub create-finding-aggregator --region-linking-mode ALL_REGIONS

# Show critical, active CSPM findings
aws securityhub get-findings \
  --filters '{"SeverityLabel":[{"Value":"CRITICAL","Comparison":"EQUALS"}],"RecordState":[{"Value":"ACTIVE","Comparison":"EQUALS"}]}' \
  --query 'Findings[].[Title,Resources[0].Id]' --output text

Derived from AWS CLI reference — enable-security-hub-v2, enable-security-hub, batch-enable-standards and What is AWS Security Hub CSPM. The standard version in the ARN changes over time; list the current ones with aws securityhub describe-standards.

Amazon GuardDuty

GuardDuty is a threat-detection service: it analyses CloudTrail management events, VPC flow logs and DNS query logs (the foundational data sources, which it reads itself with nothing to configure) with threat intelligence and machine learning, and produces findings such as credential exfiltration, cryptomining and communication with known malicious hosts. Extended Threat Detection correlates events over time into attack-sequence findings and is on by default at no extra cost. Optional protection plans widen what is watched:

Protection plan What it adds

S3 Protection

CloudTrail S3 data events: exfiltration and destruction attempts on buckets.

EKS Protection and Runtime Monitoring

Kubernetes audit logs, plus OS-level runtime events on EKS, ECS on Fargate and EC2.

Malware Protection (EC2, S3, AWS Backup)

Agentless scans of EBS volumes, newly uploaded S3 objects and backup resources. The S3 variant can be used without enabling the rest of GuardDuty.

RDS Protection

Anomalous login activity on supported Aurora and RDS engines.

Lambda Protection

Network activity of Lambda functions (for example cryptomining callbacks).

AI Protection

CloudTrail events for Amazon Bedrock, Bedrock AgentCore and SageMaker AI workloads (anomalous model invocation).

GuardDuty never blocks anything; it detects. Pair findings with EventBridge to trigger a remediation Lambda or an SNS notification (see Messaging and Integration). It is Regional: enable it in every Region you use, and in unused Regions as well, because attackers like Regions nobody watches. A 30-day free trial applies to a first-time activation.

In the AWS Management Console

  1. Open GuardDuty and choose Get started → Enable GuardDuty.

  2. Under Protection plans, review what was enabled by default and turn on S3 Protection, EKS Protection or Runtime Monitoring as needed.

  3. Under Settings, choose Generate sample findings to see what a finding looks like.

  4. From the management account, open Accounts (or Organizations settings) to delegate an administrator and enable GuardDuty for all current and future members.

With the AWS CLI

DETECTOR_ID=$(aws guardduty create-detector --enable \
  --finding-publishing-frequency FIFTEEN_MINUTES \
  --query DetectorId --output text)

# Turn on S3 data-event protection
aws guardduty update-detector --detector-id "$DETECTOR_ID" \
  --features '[{"Name":"S3_DATA_EVENTS","Status":"ENABLED"}]'

# Generate a harmless sample finding and list findings
aws guardduty create-sample-findings --detector-id "$DETECTOR_ID" \
  --finding-types Recon:EC2/PortProbeUnprotectedPort
aws guardduty list-findings --detector-id "$DETECTOR_ID" \
  --finding-criteria '{"Criterion":{"severity":{"Gte":7}}}'

# From the management account: delegate administration and auto-enable members
aws guardduty enable-organization-admin-account --admin-account-id 111122223333
aws guardduty update-organization-configuration --detector-id "$DETECTOR_ID" \
  --auto-enable-organization-members ALL

Derived from AWS CLI reference — create-detector, update-detector and What is Amazon GuardDuty?. Run enable-organization-admin-account from the organization’s management account and the other commands from the delegated administrator.

[[Amazon Inspector]] == Amazon Inspector

Amazon Inspector is a vulnerability-management service. Once activated it automatically discovers and continuously scans Amazon EC2 instances (through the Systems Manager agent, or agentless), container images in Amazon ECR and AWS Lambda functions (dependencies and, optionally, code) for software vulnerabilities (CVEs) and unintended network exposure. It rescans when a package changes, a patch lands or a new CVE is published, adjusts the CVSS score to your environment (the Inspector risk score), closes findings that are remediated and publishes findings to EventBridge and Security Hub. Bookshelf’s bookshelf/ images in ECR (see Container Registry) are scanned on push and continuously afterwards — this is the *enhanced scanning mode, which replaces the older basic ECR scanning. Inspector Classic, the assessment-template-and-agent service older guides describe, has been shut down; only the current service exists, in the aws inspector2 CLI namespace.

In the AWS Management Console

  1. Open Amazon Inspector and choose Activate Inspector, selecting EC2, ECR, Lambda and Lambda code scanning.

  2. Under General settings → Delegated administrator, set a security account for the organization.

  3. Open Resource coverage to check each instance, repository and function is Scanning, and Findings to review results sorted by Inspector score.

With the AWS CLI

aws inspector2 enable --resource-types EC2 ECR LAMBDA LAMBDA_CODE
aws inspector2 batch-get-account-status

aws inspector2 list-coverage \
  --query 'coveredResources[].[resourceType,resourceId,scanStatus.statusCode]' --output text

aws inspector2 list-findings \
  --filter-criteria '{"severity":[{"comparison":"EQUALS","value":"CRITICAL"}],"findingStatus":[{"comparison":"EQUALS","value":"ACTIVE"}]}' \
  --query 'findings[].[title,severity,resources[0].id]' --output text

[[Amazon Macie]] == Amazon Macie

Amazon Macie discovers sensitive data in Amazon S3 with machine learning and pattern matching (managed data identifiers for personal, financial and credential data, plus your own custom data identifiers as regular expressions) and evaluates S3 general purpose buckets for security posture — public access, sharing and encryption settings. Two findings families result: policy findings (a bucket became public, encryption was disabled) and sensitive data findings (an object contains a card number or a key). Discovery runs two ways: automated sensitive data discovery continually samples objects across the whole estate, and sensitive data discovery jobs analyse chosen buckets once or on a schedule. For Bookshelf, the bookshelf-uploads-<account-id> bucket (user-uploaded covers and documents) is the candidate; the private static site bucket holds no user data. Macie reads objects, so customer managed KMS keys need a key policy that allows Macie’s service-linked role to decrypt, and the cost scales with the volume of data inspected rather than the number of findings.

In the AWS Management Console

  1. Open Amazon Macie and choose Get started → Enable Macie.

  2. Open S3 buckets to see the inventory and each bucket’s public-access and encryption evaluation.

  3. Open Jobs → Create job, select bookshelf-uploads-<account-id>, choose One-time job and the managed data identifiers, and review the estimated cost before submitting.

  4. Open Findings to review results; findings go to EventBridge and, when enabled, to Security Hub.

With the AWS CLI

aws macie2 enable-macie --status ENABLED --finding-publishing-frequency FIFTEEN_MINUTES

aws macie2 update-automated-discovery-configuration --status ENABLED

aws macie2 create-classification-job \
  --job-type ONE_TIME \
  --name bookshelf-uploads-scan \
  --s3-job-definition "{\"bucketDefinitions\":[{\"accountId\":\"$ACCOUNT_ID\",\"buckets\":[\"bookshelf-uploads-$ACCOUNT_ID\"]}]}"

aws macie2 list-findings --finding-criteria '{"criterion":{"severity.description":{"eq":["High"]}}}'

Amazon Detective and other investigation aids

Amazon Detective is the investigation companion: it automatically collects CloudTrail, VPC flow and GuardDuty data into a behaviour graph so that, starting from a GuardDuty or Security Hub finding, you can see which role made which calls from which address over time, instead of querying logs by hand. It does not detect anything by itself, so it is usually enabled after GuardDuty. AWS Trusted Advisor runs checks in cost optimization, performance, resilience, security and service limits; the security checks that matter most (for example an open security group or a publicly accessible snapshot) are available on every support plan, the full set requires a paid one (see Cost Management and Support). AWS Health shows events affecting your resources and is covered with CloudWatch and CloudTrail on Monitoring and Observability.

[[Edge protection]] == Edge protection

AWS WAF is a web application firewall attached to a protected resource: CloudFront, an Application Load Balancer, an API Gateway REST API, AppSync, Cognito user pools, Verified Access and a few others. A web ACL holds ordered rules — AWS managed rule groups (OWASP-style protections, known bad inputs, IP reputation, bot control), your own rate-based rules, geo and IP-set matches — each with an action (allow, block, count, CAPTCHA). Always start new rules in count mode and promote to block after reviewing sampled requests. AWS WAF Classic is the pre-2019 generation; it has been retired and its resources must be migrated to the current AWS WAF (see the migration page in the WAF guide), so ignore any tutorial using aws waf rather than aws wafv2. The WAF web ACL for CloudFront must be created in us-east-1 with scope CLOUDFRONT; Regional resources use scope REGIONAL in the Region of the resource. WAF wiring for each front end is on CloudFront and CDN Delivery, Load Balancers and Gateways and API Gateway.

AWS Shield defends against DDoS. Shield Standard is automatic and free on every account for network and transport layer attacks against CloudFront and Route 53 and, to a degree, other public endpoints; Shield Advanced is a paid subscription adding larger-event detection and mitigation, the AWS Shield Response Team, cost protection for scaling caused by attacks, and application-layer protection with WAF. AWS Firewall Manager applies WAF web ACLs, Shield Advanced, security-group policies, Network Firewall and Route 53 Resolver DNS Firewall rules across every account of an organization from a delegated administrator, automatically covering new resources and accounts; it depends on AWS Config. AWS Network Firewall is a managed stateful network firewall for VPC traffic, deployed in dedicated firewall subnets (network-layer detail on VPC Networking).

# Regional web ACL with an AWS managed rule group, starting in count mode
aws wafv2 create-web-acl \
  --name bookshelf-alb-acl --scope REGIONAL --region "$AWS_REGION" \
  --default-action Allow={} \
  --visibility-config SampledRequestsEnabled=true,CloudWatchMetricsEnabled=true,MetricName=bookshelf-alb-acl \
  --rules '[{
    "Name": "common",
    "Priority": 0,
    "Statement": { "ManagedRuleGroupStatement": { "VendorName": "AWS", "Name": "AWSManagedRulesCommonRuleSet" } },
    "OverrideAction": { "Count": {} },
    "VisibilityConfig": { "SampledRequestsEnabled": true, "CloudWatchMetricsEnabled": true, "MetricName": "common" }
  }]'

Governance tools in brief

AWS Organizations, service control policies, resource control policies, Control Tower and tag policies are the account-level governance tools and are covered on Accounts and Organizations. Two further services complete the picture and are mentioned only briefly:

AWS Service Catalog

Lets a central team publish approved, parameterized CloudFormation (or Terraform) products in portfolios that other accounts and teams can launch without needing broad IAM permissions — a self-service guardrail alternative to giving every developer the right to create arbitrary stacks (see Infrastructure as Code).

AWS License Manager

Tracks and enforces software license usage (for example bring-your-own-license rules for EC2 and Dedicated Hosts) across accounts, with alerts before a limit is breached.

A preventive guardrail is the strongest governance control because it applies even to administrators of a member account. The following service control policy, attached to the Bookshelf workload OU, stops anyone in the member accounts from switching off the detective services above or leaving the organization (the example is a starting point; test it in a sandbox OU first, as an SCP mistake can lock out your own pipelines):

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ProtectSecurityServices",
      "Effect": "Deny",
      "Action": [
        "guardduty:DeleteDetector",
        "guardduty:DisassociateFromMasterAccount",
        "guardduty:UpdateDetector",
        "config:StopConfigurationRecorder",
        "config:DeleteConfigurationRecorder",
        "config:DeleteDeliveryChannel",
        "cloudtrail:StopLogging",
        "cloudtrail:DeleteTrail",
        "organizations:LeaveOrganization"
      ],
      "Resource": "*",
      "Condition": {
        "ArnNotLike": { "aws:PrincipalArn": "arn:aws:iam::*:role/SecurityAdmin" }
      }
    }
  ]
}

Derived from the SCP examples in the AWS Organizations user guide.

AWS Artifact and the compliance programs

AWS Artifact is the self-service portal for AWS’s own audit evidence: on-demand downloads of third-party audit reports and certifications (SOC 1, 2 and 3, ISO/IEC 27001 and related standards, PCI DSS attestation of compliance, C5, HIPAA-related documents and many more), and a place to review, accept and track agreements with AWS, such as a Business Associate Addendum for HIPAA workloads or a non-disclosure agreement that unlocks restricted reports. Agreements can be accepted for a single account or for all accounts of an organization. Some reports require accepting a confidentiality term before download. Documents and agreements are free of charge; access is controlled with IAM, so give auditors a read-only role. Artifact also offers an Assurance Assistant that drafts answers to compliance and due-diligence questionnaires from the available evidence. Reports say what AWS secured; they do not prove anything about your own workloads, which is where the remaining services come in.

AWS maintains a long list of compliance programs — certifications and attestations such as ISO/IEC 27001, 27017 and 27018, SOC 1/2/3, PCI DSS, HIPAA eligibility, FedRAMP, C5 in Germany, and regional or sector programs — and a published services in scope list per program. A service not in scope of a program must not process regulated data for that program, so check the list before choosing a service for regulated data. The Customer Compliance Center collects whitepapers, auditor-learning paths and per-industry and per-country guidance. AWS Regions also differ in which programs they hold: GovCloud and China are separate partitions (see AWS Global Infrastructure), and the AWS European Sovereign Cloud, generally available since January 2026, is an independently operated infrastructure in the European Union for workloads with strict sovereignty requirements.

In the AWS Management Console

  1. Open AWS Artifact (search for it in the console search bar) and choose Reports.

  2. Search for a report such as SOC 2 or ISO 27001, select it, accept the terms if prompted, and choose Download report.

  3. Choose Agreements to review, accept or manage an agreement for the account or, from the management account, the organization.

With the AWS CLI

The artifact service has its own CLI namespace, which is useful for pulling the latest reports into an audit evidence bucket from a pipeline:

aws artifact list-reports --query 'reports[].[id,name,category]' --output text

REPORT_ID=<report-id-from-list-reports>
aws artifact get-report-metadata --report-id "$REPORT_ID"

TERM_TOKEN=$(aws artifact get-term-for-report --report-id "$REPORT_ID" --query termToken --output text)
aws artifact get-report --report-id "$REPORT_ID" --term-token "$TERM_TOKEN" \
  --query documentPresignedUrl --output text

The last command returns a time-limited presigned URL; fetch it with curl or a browser immediately.

A least-privilege read-only policy for an auditor role:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "artifact:ListReports",
        "artifact:GetReportMetadata",
        "artifact:GetTermForReport",
        "artifact:GetReport"
      ],
      "Resource": "*"
    }
  ]
}

Derived from AWS CLI reference — artifact and What is AWS Artifact?. Verify the exact action names against the Artifact IAM documentation, because the console’s older permission names differ.

Audit Manager and conformance packs

AWS Audit Manager automates evidence collection for audits: you create an assessment from a prebuilt framework (PCI DSS, HIPAA, SOC 2, GDPR, CIS and others), it gathers evidence from API calls, CloudTrail, Config rules and Security Hub checks, and produces an assessment report for the auditor. Its status has changed. AWS is moving Audit Manager to maintenance mode: from 2026-04-30 it can no longer be set up in new accounts, and an account that already uses it can keep creating assessments but cannot extend it to new Regions (organization deployments can still add member accounts). AWS continues to maintain it and does not remove it, and recommends AWS Config conformance packs for new compliance work. The two are not equivalent: a conformance pack evaluates only the technical controls expressible as Config rules and has no audit report, no SOC 2 or GDPR packs and no evidence for procedural controls, so it does not replace the whole audit workflow. For the policies, procedures and documentation an auditor also expects, the availability notice points to partner compliance-automation tools used with Config. Treat the two options as follows: for a new account, deploy conformance packs (and the Security Hub CSPM standards) and keep evidence in an S3 bucket; for an account already using Audit Manager, keep using it, and plan the move.

# Existing Audit Manager customers only: list assessments
aws auditmanager list-assessments --query 'assessmentMetadata[].[name,status]' --output text

A security baseline for a new account

A practical order of work for a fresh account (or a new account in the organization), each item linking to where it is covered. Many are automated by Control Tower for accounts created through Account Factory.

  1. Secure the root user: strong password, MFA, no access keys, or use centralized root access (Accounts and Organizations).

  2. Use IAM Identity Center for people and roles for workloads; no long-lived access keys (Identity and Access).

  3. Create an organization trail in CloudTrail delivered to a protected bucket in a log-archive account (Monitoring and Observability).

  4. Turn on AWS Config recording and deploy a conformance pack or Security Hub CSPM standard.

  5. Enable GuardDuty, Inspector and, where S3 holds personal data, Macie; delegate all three to a security account.

  6. Enable Security Hub (and CSPM if you need standards) with aggregation to one Region.

  7. Keep S3 Block Public Access on at account level, require IMDSv2, enable default EBS encryption (S3 Security and Static Hosting, Block and File Storage on AWS).

  8. Create customer managed KMS keys with explicit key policies for sensitive data (Secrets Manager, Parameter Store and KMS).

  9. Attach preventive SCPs such as the one above and restrict unused Regions.

  10. Put WAF in front of public web endpoints and keep workloads in private subnets ([Edge protection], VPC Networking).

  11. Set a budget and cost-anomaly alert so abuse of the account shows up quickly (Cost Management and Support).

  12. Route findings to a human: EventBridge rules to SNS, a chat tool or a ticketing system.

Pricing, limits and recent changes

Pricing model (no prices here; follow the dated links in the references):

  • Config charges per configuration item recorded (continuous recording costs more than daily, so record only the resource types you need in non-production) and per rule evaluation; conformance pack rules are billed as rule evaluations. Recording every resource in every Region is the usual surprise.

  • Security Hub CSPM charges per security check and per ingested finding after a 30-day trial; the unified Security Hub is priced in plans plus add-on capabilities.

  • GuardDuty charges by volume analysed per data source (events, flow-log and DNS volume, S3 data events, scanned GB, monitored vCPUs and so on), with a 30-day trial.

  • Inspector charges per scanned instance, per image scan and per Lambda function, per month.

  • Macie charges per bucket monitored, per object monitored for automated discovery and per GB inspected by jobs.

  • WAF charges per web ACL, rule and million requests inspected; Shield Standard is free, Shield Advanced is a monthly subscription with a one-year commitment plus data-transfer fees.

  • Artifact is free. Audit Manager charges per evidence item collected (existing customers only).

Limits and quotas: each service has Regional quotas (for example Config rules per Region, conformance packs per Region, GuardDuty member accounts per administrator, WAF web ACL capacity units) listed on its endpoints-and-quotas page; request increases through Service Quotas. GuardDuty, Inspector, Macie, Security Hub and Config are all Regional — coverage in one Region says nothing about another.

Recent changes (verified 2026-10-01, re-check the lifecycle page):

  • AWS Security Hub relaunched as a unified service in December 2025; the previous service continues as Security Hub CSPM.

  • AWS Audit Manager entered maintenance mode and closed to new accounts on 2026-04-30.

  • AWS European Sovereign Cloud generally available in January 2026.

  • Inspector Classic and AWS WAF Classic are retired; guides using aws inspector or aws waf are outdated.

  • GuardDuty gained AI Protection, Malware Protection for S3 and AWS Backup, and Extended Threat Detection.

  • AWS Artifact gained an Assurance Assistant and a dedicated CLI service.

Older guides are also outdated in showing only the original Security Hub (now CSPM), treating shared responsibility as a single fixed diagram, and presenting Audit Manager as the default compliance tool.

Clean up

Security services bill while enabled; disable what you enabled for a throwaway account. Do this only in a test account — turning off detection in a real one is itself a security finding.

aws securityhub disable-security-hub-v2
aws securityhub disable-security-hub

aws guardduty delete-detector --detector-id "$DETECTOR_ID"

aws inspector2 disable --resource-types EC2 ECR LAMBDA LAMBDA_CODE

aws macie2 disable-macie

aws configservice delete-conformance-pack --conformance-pack-name bookshelf-best-practices
aws configservice delete-config-rule --config-rule-name s3-bucket-public-read-prohibited
aws configservice stop-configuration-recorder --configuration-recorder-name default
aws configservice delete-delivery-channel --delivery-channel-name default
aws configservice delete-configuration-recorder --configuration-recorder-name default

aws wafv2 list-web-acls --scope REGIONAL
# then: aws wafv2 delete-web-acl --name bookshelf-alb-acl --scope REGIONAL --id <id> --lock-token <token>

Empty and delete the Config delivery bucket last (versioned buckets need all versions removed; see S3 Object Storage). Evidence retained by Config and Macie in S3 is not deleted automatically.