<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Aws-Governance on ZX Cloud Security</title><link>https://zxcloudsecurity.co.uk/tags/aws-governance/</link><description>Recent content in Aws-Governance on ZX Cloud Security</description><generator>Hugo</generator><language>en-GB</language><lastBuildDate>Sat, 20 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://zxcloudsecurity.co.uk/tags/aws-governance/index.xml" rel="self" type="application/rss+xml"/><item><title>AWS Compliance and Governance: A Practitioner's Guide for 2026</title><link>https://zxcloudsecurity.co.uk/guides/aws-compliance-and-governance/</link><pubDate>Sat, 20 Jun 2026 00:00:00 +0000</pubDate><guid>https://zxcloudsecurity.co.uk/guides/aws-compliance-and-governance/</guid><description>Master AWS compliance and governance with SCPs, Control Tower, NCSC alignment, and real-world guardrails. Practical guidance for UK regulated environments.</description><content:encoded><![CDATA[<h1 id="aws-compliance-and-governance-a-practitioners-guide-for-2026">AWS compliance and governance: a practitioner&rsquo;s guide for 2026</h1>
<p>If you run workloads in AWS for a UK-regulated organisation &ndash; FCA-supervised financial services, NHS, central government, or any data-intensive enterprise &ndash; then AWS compliance and governance is not a project you complete once and file away. It is a continuous operational discipline. Most incidents I see investigated stem from the customer side: identity misuse, misconfiguration, exposed workloads. Not platform failures. That matters because it means the controls are largely in your hands.</p>
<p>This guide covers the architectural decisions, policy primitives, and operational habits that actually hold up under audit.</p>
<!-- INTERNAL_LINK: AWS IAM least privilege guide | aws-iam-least-privilege -->
<hr>
<h2 id="what-aws-governance-actually-means-in-practice">What AWS governance actually means in practice</h2>
<p>Before getting into tooling, it helps to be precise about what governance covers. The definition you&rsquo;ll find in most documentation &ndash; managing your AWS environment to ensure security, compliance, and cost-efficiency &ndash; is fine as far as it goes. In practice it breaks into three distinct layers:</p>
<ol>
<li>Preventive controls: policies that make non-compliant actions impossible before resources are provisioned</li>
<li>Detective controls: rules and findings that surface misconfiguration after the fact</li>
<li>Responsive controls: automation that remediates or notifies when a detective control fires</li>
</ol>
<p>Most organisations I encounter lean heavily on detective controls because they&rsquo;re easier to retrofit. The problem is that by the time a Config rule fires on an unencrypted S3 bucket in production, the audit trail exists, the data is potentially exposed, and the remediation is disruptive. Shift left. Invest in preventive controls first.</p>
<!-- INTERNAL_LINK: AWS Security Hub setup and configuration | aws-security-hub-setup -->
<hr>
<h2 id="building-your-governance-foundation-with-aws-organizations-and-scps">Building your governance foundation with AWS Organizations and SCPs</h2>
<p>AWS Organizations is free and gives you a hierarchical structure of Organisational Units (OUs), centralised billing, and Service Control Policies that set permission guardrails across all member accounts.</p>
<p>SCPs are the top-level security guardrails in AWS. They set the maximum permissions for every identity in an account, including the root user. Unlike IAM policies, SCPs only restrict &ndash; they do not grant. That distinction matters: an account administrator cannot grant themselves permissions that an SCP denies, regardless of what their IAM policies say. You can also use SCPs with the full fine-grained control supported in the IAM policy language, so there is no reason to keep them coarse.</p>
<h3 id="a-foundational-scp-for-uk-regulated-workloads">A foundational SCP for UK-regulated workloads</h3>
<p>The following SCP enforces region restriction (keeping data in <code>eu-west-2</code> and <code>eu-west-1</code>), prevents CloudTrail from being disabled, and blocks creation of unencrypted S3 buckets. Apply it at the root OU level, then create targeted exceptions in child OUs where needed.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;Version&#34;</span><span class="p">:</span> <span class="s2">&#34;2012-10-17&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;Statement&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;Sid&#34;</span><span class="p">:</span> <span class="s2">&#34;DenyNonUKRegions&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;Effect&#34;</span><span class="p">:</span> <span class="s2">&#34;Deny&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;NotAction&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;iam:*&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;organizations:*&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;route53:*&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;budgets:*&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;waf:*&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;cloudfront:*&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;sts:AssumeRole&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;support:*&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;trustedadvisor:*&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="p">],</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;Resource&#34;</span><span class="p">:</span> <span class="s2">&#34;*&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;Condition&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;StringNotEquals&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="nt">&#34;aws:RequestedRegion&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">            <span class="s2">&#34;eu-west-2&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="s2">&#34;eu-west-1&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;Sid&#34;</span><span class="p">:</span> <span class="s2">&#34;DenyDisableCloudTrail&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;Effect&#34;</span><span class="p">:</span> <span class="s2">&#34;Deny&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;Action&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;cloudtrail:DeleteTrail&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;cloudtrail:StopLogging&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;cloudtrail:UpdateTrail&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="p">],</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;Resource&#34;</span><span class="p">:</span> <span class="s2">&#34;*&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;Sid&#34;</span><span class="p">:</span> <span class="s2">&#34;DenyUnencryptedS3BucketCreation&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;Effect&#34;</span><span class="p">:</span> <span class="s2">&#34;Deny&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;Action&#34;</span><span class="p">:</span> <span class="s2">&#34;s3:CreateBucket&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;Resource&#34;</span><span class="p">:</span> <span class="s2">&#34;*&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;Condition&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;Null&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="nt">&#34;s3:x-amz-server-side-encryption&#34;</span><span class="p">:</span> <span class="s2">&#34;true&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;Sid&#34;</span><span class="p">:</span> <span class="s2">&#34;DenyLeavingOrganisation&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;Effect&#34;</span><span class="p">:</span> <span class="s2">&#34;Deny&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;Action&#34;</span><span class="p">:</span> <span class="s2">&#34;organizations:LeaveOrganization&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;Resource&#34;</span><span class="p">:</span> <span class="s2">&#34;*&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><blockquote>
<p>Honest trade-off: region-restriction SCPs using <code>NotAction</code> are broad by design. You will inevitably need to expand the <code>NotAction</code> list as you adopt global services like CloudFront, IAM, and Route 53. Keep that list in version control and review it quarterly. I&rsquo;ve seen <code>NotAction</code> lists so large they rendered the region restriction meaningless &ndash; do not let it grow unchecked.</p>
</blockquote>
<h3 id="resource-control-policies-the-missing-piece">Resource Control Policies: the missing piece</h3>
<p>RCPs are a sibling policy type to SCPs, introduced by AWS in November 2024. They cover resource-side governance use cases that SCPs cannot fully handle, particularly for S3, STS, KMS, Secrets Manager, and SQS. SCPs constrain what identities in your accounts can do. RCPs constrain what external principals can do to your resources, even if those principals have valid IAM permissions in their own account. If you are not using RCPs yet, that is the gap in your governance stack that attackers look for.</p>
<!-- INTERNAL_LINK: AWS Resource Control Policies explained | aws-resource-control-policies -->
<hr>
<h2 id="aws-control-tower-and-automated-compliance-at-scale">AWS Control Tower and automated compliance at scale</h2>
<p>Beyond roughly five accounts, hand-rolling SCPs and account vending becomes error-prone. Control Tower handles account provisioning, guardrail application, and OU structure consistently. Its guardrails map directly onto NCSC Cloud Security Principles and FCA PS21/3 cloud outsourcing requirements.</p>
<p>Enable all mandatory guardrails as a minimum, then layer strongly-recommended guardrails based on your risk classification. For FCA-regulated workloads, I treat &ldquo;strongly recommended&rdquo; as mandatory.</p>
<p>Control Tower&rsquo;s Audit account is the right place to centralise your AWS Config aggregator, Security Hub cross-account findings, and CloudTrail organisation-wide logs. All of these will appear in FCA operational resilience submissions, so get the architecture right early rather than retrofitting it during an audit.</p>
<!-- INTERNAL_LINK: AWS Control Tower landing zone setup for UK enterprises | aws-control-tower-landing-zone -->
<hr>
<h2 id="aligning-with-the-ncscs-14-cloud-security-principles">Aligning with the NCSC&rsquo;s 14 cloud security principles</h2>
<p>The NCSC&rsquo;s cloud security principles help you choose a provider that meets your security needs. That is the easy part. The harder part &ndash; and where most UK organisations fall short &ndash; is configuring your cloud services securely once you are there.</p>
<p>AWS publishes a whitepaper mapping its platform controls to the NCSC principles, but the customer-side configuration work still falls on you. AWS also provides a sample mapping between the NCSC Cloud Security Principles and AWS managed Config rules, where each Config rule applies to a specific resource type and relates to one or more principle controls.</p>
<p>Deploy the NCSC conformance pack in AWS Config (<code>Operational-Best-Practices-for-NCSC</code>) as a baseline. It will not cover everything, but it gives you a defensible starting point for accreditation conversations. For G-Cloud procurement, AWS has worked with the NCSC to tailor guidance on how UK public sector customers can use the Landing Zone Accelerator to meet NCSC requirements for using cloud services securely.</p>
<!-- INTERNAL_LINK: NCSC cloud security principles mapped to AWS Config rules | ncsc-aws-config-conformance-pack -->
<hr>
<h2 id="ai-governance-an-emerging-gap-in-most-frameworks">AI governance: an emerging gap in most frameworks</h2>
<p>GenAI workloads introduce governance challenges that traditional cloud security frameworks were not built for: model drift, prompt injection, data exfiltration through inference endpoints, and opaque decision-making that conflicts with GDPR Article 22 on automated processing.</p>
<p>Amazon SageMaker Role Manager lets administrators define minimum permissions for ML-related roles in minutes rather than hand-crafting policies. SageMaker Model Cards give you a consistent place to capture intended uses, risk ratings, and training details from inception through to deployment. SageMaker Model Dashboard then monitors model behaviour in production in one view. These are not optional governance extras for FCA-regulated AI deployments &ndash; PS7/23 on model risk management is explicit about evidencing model monitoring and governance.</p>
<p>SageMaker HyperPod now supports data capture for inference workloads, recording inference request and response payloads from production endpoints to S3. That audit trail feeds evaluation pipelines, fine-tuning jobs, and compliance evidence in a single mechanism.</p>
<p>Amazon SageMaker Unified Studio provides a single permission model with fine-grained access controls for consistent policy enforcement across your AI workloads. Pair this with Amazon Bedrock Guardrails if you are using foundation models &ndash; Bedrock Guardrails can be applied directly to SageMaker-served models to filter outputs and enforce responsible use policies.</p>
<!-- INTERNAL_LINK: Governing AI workloads on AWS for FCA-regulated firms | aws-ai-governance-fca -->
<hr>
<h2 id="network-governance-keeping-traffic-private">Network governance: keeping traffic private</h2>
<p>The shared responsibility model places identity, configuration, and workload protection squarely on customers. Nowhere is this more visible than in network architecture. Two recent AWS releases are directly relevant.</p>
<p>EKS cluster governance via IAM condition keys: teams managing multi-account environments have historically had to rely on manual processes or post-deployment checks to enforce cluster configuration standards. The expansion of EKS IAM condition keys changes that. You can now enforce private-only API endpoints, require customer-managed KMS keys for secrets encryption, restrict clusters to approved Kubernetes versions, and mandate deletion protection for production workloads &ndash; all at the SCP level. Misconfigured EKS clusters become impossible to provision rather than detectable after the fact.</p>
<p>AWS Management Console Private Access: this allows customers to access the AWS Console from VPCs without any internet connectivity. For environments where your security policy prohibits internet access from workstation VPCs &ndash; common in financial services and government &ndash; this removes a significant architectural compromise that teams previously had to accept.</p>
<p>For messaging infrastructure, Amazon MQ encrypts messages at rest and in transit, restricts broker connections to a private endpoint within your VPC, and now supports AWS PrivateLink for the Amazon MQ API itself. Communication between your VPC and the Amazon MQ API stays entirely within the AWS network.</p>
<!-- INTERNAL_LINK: AWS VPC design patterns for regulated workloads | aws-vpc-design-regulated -->
<hr>
<h2 id="common-governance-pitfalls">Common governance pitfalls</h2>
<p>These are the mistakes I see repeatedly across UK enterprise and public sector engagements.</p>
<h3 id="1-treating-aws-config-as-your-only-compliance-tool">1. Treating AWS Config as your only compliance tool</h3>
<p>Config rules are detective controls. They tell you something broke &ndash; they do not stop it from breaking. If your entire governance posture is &ldquo;we have Config rules and Security Hub,&rdquo; you are running reactive governance. Add SCPs and RCPs to shift detection to prevention.</p>
<h3 id="2-not-version-controlling-your-scps">2. Not version-controlling your SCPs</h3>
<p>I have seen production SCPs modified directly in the AWS console with no change history and no review process. Your SCPs are as critical as your application code. Store them in Git, run them through a CI/CD pipeline with policy-as-code validation (AWS CloudFormation Guard or OPA/Rego), and require peer review before merging.</p>
<h3 id="3-ignoring-the-fullawsaccess-scp-problem">3. Ignoring the FullAWSAccess SCP problem</h3>
<p>By default, AWS attaches the <code>FullAWSAccess</code> managed SCP to every OU and account. Many teams assume this is a permissive policy and leave it alongside their deny-list SCPs. SCPs do not grant permissions &ndash; they define the outer boundary of what IAM users and roles in your organisation can do. <code>FullAWSAccess</code> is simply the absence of restrictions. You still need meaningful identity-based or resource-based policies.</p>
<h3 id="4-overlooking-data-residency-for-ai-inference">4. Overlooking data residency for AI inference</h3>
<p>GDPR and UK GDPR require you to know where personal data is processed. If your SageMaker inference endpoints are deployed outside <code>eu-west-2</code> or <code>eu-west-1</code>, personal data in inference requests may be leaving UK/EEA jurisdiction. SageMaker inference recommendations are currently available in seven regions including Europe (Ireland) and Europe (Frankfurt) &ndash; note that <code>eu-west-2</code> (London) is not currently included. Check region availability before deploying regulated inference workloads, and enforce region restrictions at the SCP level.</p>
<h3 id="5-miscounting-your-compliance-boundary">5. Miscounting your compliance boundary</h3>
<p>AWS holds SOC 1/ISAE 3402, SOC 2, SOC 3, PCI DSS Level 1, ISO 27001, ISO 27017, and ISO 27018 certifications &ndash; but these cover the platform, not your workload. AWS manages security of the cloud; you are responsible for security in the cloud, retaining control of the security you choose to implement to protect your own content, applications, systems, and networks. Auditors will ask about your controls, not AWS&rsquo;s certifications.</p>
<h3 id="6-neglecting-the-audit-account">6. Neglecting the Audit account</h3>
<p>Control Tower creates a dedicated Audit account for a reason. I regularly find organisations that have deployed workloads into it or given developers direct access to it. The Audit account should have read-only cross-account roles for security tooling and nothing else. Lock it down with SCPs that deny any resource creation outside the security tooling namespace.</p>
<hr>
<h2 id="key-takeaways">Key takeaways</h2>
<p>Effective AWS compliance and governance is an architecture problem, not a checkbox exercise. Here is what to act on:</p>
<ul>
<li>Preventive before detective: SCPs and RCPs stop misconfigurations before they happen. Do not rely solely on Config rules and Security Hub findings. Invest in policy-as-code validation in your CI/CD pipeline.</li>
<li>NCSC alignment is automatable: deploy the <code>Operational-Best-Practices-for-NCSC</code> conformance pack in AWS Config as a baseline and cross-reference AWS&rsquo;s NCSC whitepaper for the platform controls you inherit.</li>
<li>AI governance needs explicit tooling: use SageMaker Role Manager, Model Cards, and Model Dashboard alongside Bedrock Guardrails. Data capture for inference workloads provides the audit trail GDPR and FCA model risk guidance require.</li>
<li>Network isolation is a governance control: EKS IAM condition keys, Amazon MQ PrivateLink, and AWS Management Console Private Access all reduce your attack surface while satisfying NCSC Principle 1 (data in transit protection) and Principle 11 (external interface protection).</li>
<li>Version-control everything: SCPs, RCPs, Config rules, and Control Tower customisations belong in Git with peer review and automated testing. Treat them as production code, because that is exactly what they are.</li>
<li>Region restrictions require ongoing maintenance: encode permitted regions in your root OU SCP and review the <code>NotAction</code> list quarterly. Validate that AI inference services you adopt are available in your approved regions before deploying regulated workloads.</li>
</ul>
]]></content:encoded></item></channel></rss>