<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Stratum Archives - Linuxcent</title>
	<atom:link href="https://linuxcent.com/tag/stratum/feed/" rel="self" type="application/rss+xml" />
	<link>https://linuxcent.com/tag/stratum/</link>
	<description>Infrastructure security, from the kernel up.</description>
	<lastBuildDate>Fri, 24 Apr 2026 04:43:39 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://linuxcent.com/wp-content/uploads/2026/04/favicon-512x512-1-150x150.png</url>
	<title>Stratum Archives - Linuxcent</title>
	<link>https://linuxcent.com/tag/stratum/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">211632295</site>	<item>
		<title>Hardening Blueprint as Code — Declare Your OS Baseline in YAML</title>
		<link>https://linuxcent.com/linux-hardening-as-code/</link>
					<comments>https://linuxcent.com/linux-hardening-as-code/#respond</comments>
		
		<dc:creator><![CDATA[Vamshi Krishna Santhapuri]]></dc:creator>
		<pubDate>Fri, 24 Apr 2026 04:43:36 +0000</pubDate>
				<category><![CDATA[OS Image Builder]]></category>
		<category><![CDATA[CIS]]></category>
		<category><![CDATA[DevSecOps]]></category>
		<category><![CDATA[Infrastructure as Code]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[OS Hardening]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Stratum]]></category>
		<guid isPermaLink="false">https://linuxcent.com/linux-hardening-as-code/</guid>

					<description><![CDATA[<p><span class="span-reading-time rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Reading Time: </span> <span class="rt-time"> 6</span> <span class="rt-label rt-postfix">minutes</span></span>Stop relying on hardening runbooks that get skipped at 2am. Declare your Linux OS baseline as a YAML blueprint — and build images where skipping a step is structurally impossible.</p>
<p>The post <a href="https://linuxcent.com/linux-hardening-as-code/">Hardening Blueprint as Code — Declare Your OS Baseline in YAML</a> appeared first on <a href="https://linuxcent.com">Linuxcent</a>.</p>
]]></description>
										<content:encoded><![CDATA[<span class="span-reading-time rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Reading Time: </span> <span class="rt-time"> 6</span> <span class="rt-label rt-postfix">minutes</span></span><style>
pre{position:relative;background:#1e1e1e;color:#d4d4d4;
    padding:16px 16px 16px 20px;border-radius:6px;overflow-x:auto;
    font-family:'JetBrains Mono','Fira Code','Cascadia Code',Consolas,'Courier New',monospace;
    font-size:.88em;line-height:1.6;border-left:4px solid #555}
code{background:#f4f4f4;padding:2px 5px;border-radius:3px;font-size:.9em}
pre code{background:transparent;padding:0;color:inherit}
pre[data-lang="bash"],pre[data-lang="sh"],
pre[data-lang="shell"],pre[data-lang="zsh"]{border-left-color:#4ec9b0}
pre[data-lang="yaml"],pre[data-lang="json"],
pre[data-lang="toml"],pre[data-lang="xml"]{border-left-color:#569cd6}
pre[data-lang="python"],pre[data-lang="go"],pre[data-lang="rust"],
pre[data-lang="java"],pre[data-lang="c"],pre[data-lang="cpp"]{border-left-color:#c586c0}
pre[data-lang="text"],pre[data-lang="output"],
pre[data-lang="console"]{border-left-color:#888}
.lc-copy-btn{position:absolute;top:8px;right:8px;background:#2d2d2d;color:#ccc;
    border:1px solid #444;border-radius:4px;padding:3px 9px;font-size:.75em;
    font-family:system-ui,sans-serif;cursor:pointer;opacity:0;
    transition:opacity .15s,background .15s;line-height:1.6}
pre:hover .lc-copy-btn{opacity:1}
.lc-copy-btn:hover{background:#3a3a3a;color:#fff}
.lc-copy-btn.copied{color:#4ec9b0;border-color:#4ec9b0}
.lc-lang-badge{position:absolute;top:8px;left:20px;font-family:system-ui,sans-serif;
    font-size:.7em;color:#666;text-transform:uppercase;letter-spacing:.04em;
    line-height:1;pointer-events:none;opacity:0;transition:opacity .15s}
pre:hover .lc-lang-badge{opacity:1}
table{border-collapse:collapse;width:100%;margin:16px 0}
th,td{border:1px solid #ddd;padding:10px 14px;text-align:left}
th{background:#f0f0f0;font-weight:600}
tr:nth-child(even){background:#fafafa}
</style>
<p><script>
(function(){
  if(window.__lcCodeEnhanced)return;
  window.__lcCodeEnhanced=true;
  function enhance(){
    document.querySelectorAll('pre').forEach(function(pre){
      var code=pre.querySelector('code');
      var lang='';
      if(code){var m=(code.className||'').match(/language-(\S+)/);if(m)lang=m[1].toLowerCase();}
      if(lang)pre.setAttribute('data-lang',lang);
      if(lang){var badge=document.createElement('span');badge.className='lc-lang-badge';badge.textContent=lang;pre.insertBefore(badge,pre.firstChild);}
      var btn=document.createElement('button');
      btn.className='lc-copy-btn';btn.textContent='Copy';btn.setAttribute('aria-label','Copy code to clipboard');
      pre.appendChild(btn);
      btn.addEventListener('click',function(){
        var text=code?code.innerText:pre.innerText;
        if(navigator.clipboard&&window.isSecureContext){
          navigator.clipboard.writeText(text).then(function(){ok(btn);}).catch(function(){fb(text,btn);});
        }else{fb(text,btn);}
      });
    });
  }
  function ok(btn){btn.textContent='Copied!';btn.classList.add('copied');setTimeout(function(){btn.textContent='Copy';btn.classList.remove('copied');},2000);}
  function fb(text,btn){
    try{var ta=document.createElement('textarea');ta.value=text;ta.style.cssText='position:fixed;left:-9999px;top:-9999px;opacity:0';document.body.appendChild(ta);ta.select();document.execCommand('copy');document.body.removeChild(ta);ok(btn);}
    catch(e){btn.textContent='✗ Failed';setTimeout(function(){btn.textContent='Copy';},2000);}
  }
  if(document.readyState==='loading'){document.addEventListener('DOMContentLoaded',enhance);}else{enhance();}
})();
</script></p>
<p><em>OS Hardening as Code, Episode 2</em><br />
<em><a href="https://linuxcent.com/cloud-ami-security-risks-custom-os-images/">Cloud AMI Security Risks</a> · </em><em>Linux Hardening as Code</em>**</p>
<p><strong>Focus Keyphrase:</strong> Linux hardening as code<br />
<strong>Search Intent:</strong> Informational<br />
<strong>Meta Description:</strong> Stop relying on hardening runbooks that get skipped at 2am. Declare your Linux OS baseline as a YAML blueprint — and build images where skipping a step is structurally impossible. (155 chars)</p>
<hr />
<h2 id="tldr">TL;DR</h2>
<ul>
<li>A hardening runbook is a list of steps someone runs. A HardeningBlueprint YAML is a build artifact — if it wasn&#8217;t applied, the image doesn&#8217;t exist</li>
<li>Linux hardening as code means declaring your entire OS security baseline in a single YAML file and building it reproducibly across any provider</li>
<li><code class="" data-line="">stratum build --blueprint ubuntu22-cis-l1.yaml --provider aws</code> either produces a hardened image or fails — there is no partial state</li>
<li>The blueprint includes: target OS/provider, compliance benchmark, Ansible roles, and per-control overrides with documented reasons</li>
<li>One blueprint file = one source of truth for your hardening posture, version-controlled and reviewable like any other infrastructure code</li>
<li>Post-build OpenSCAP scan runs automatically — the image only snapshots if it passes</li>
</ul>
<hr />
<h2 id="the-problem-a-runbook-that-gets-skipped-once-is-a-runbook-that-gets-skipped">The Problem: A Runbook That Gets Skipped Once Is a Runbook That Gets Skipped</h2>
<pre><code class="" data-line="">Hardening runbook
       │
       ▼
  Human executes
  steps manually
       │
       ├─── 47 deployments: followed correctly
       │
       └─── 1 deployment at 2am: step 12 skipped
                    │
                    ▼
           Instance in production
           without audit logging,
           SSH password auth enabled,
           unnecessary services running
</code></pre>
<p>Linux hardening as code eliminates the human decision point. If the blueprint wasn&#8217;t applied, the image doesn&#8217;t exist.</p>
<p>EP01 showed that default cloud AMIs arrive pre-broken — unnecessary services, no audit logging, weak kernel parameters, SSH configured for convenience not security. The obvious response is a hardening script. But a script run by a human is still a process step. It can be skipped. It can be done halfway. It can drift across different engineers who each interpret &#8220;run the hardening script&#8221; slightly differently.</p>
<hr />
<p>A production deployment last year. The platform team had a solid CIS L1 hardening runbook — 68 steps, well-documented, followed consistently. Then a critical incident at 2am required three new instances to be deployed on short notice. The engineer on call ran the provisioning script and, under pressure, skipped the hardening step with the intention of running it the next morning.</p>
<p>They didn&#8217;t. The three instances stayed in production unhardened for six weeks before an automated scan caught them. Audit logging wasn&#8217;t configured. SSH was accepting password authentication. Two unnecessary services were running that weren&#8217;t in the approved software list.</p>
<p>Nothing was breached. But the finding went into the next compliance report as a gap, the team spent a week remediating, and the post-mortem conclusion was &#8220;we need better runbook discipline.&#8221;</p>
<p>That&#8217;s the wrong conclusion. The runbook isn&#8217;t the problem. The problem is that hardening was a process step instead of a build constraint.</p>
<hr />
<h2 id="what-linux-hardening-as-code-actually-means">What Linux Hardening as Code Actually Means</h2>
<p>Linux hardening as code is the same principle as infrastructure as code applied to OS security posture: the desired state is declared in a file, the file is the source of truth, and the execution is deterministic and repeatable.</p>
<pre><code class="" data-line="">HardeningBlueprint YAML
         │
         ▼
  stratum build
         │
  ┌──────┴──────────────────┐
  │  Provider Layer          │
  │  (cloud-init, disk       │
  │   names, metadata        │
  │   endpoint per provider) │
  └──────┬──────────────────┘
         │
  ┌──────┴──────────────────┐
  │  Ansible-Lockdown        │
  │  (CIS L1/L2, STIG —      │
  │   the hardening steps)   │
  └──────┬──────────────────┘
         │
  ┌──────┴──────────────────┐
  │  OpenSCAP Scanner        │
  │  (post-build verify)     │
  └──────┬──────────────────┘
         │
         ▼
  Golden Image (AMI/GCP image/Azure image)
  + Compliance grade in image metadata
</code></pre>
<p>The YAML file is what you write. Stratum handles the rest.</p>
<hr />
<h2 id="the-hardeningblueprint-yaml">The HardeningBlueprint YAML</h2>
<p>The blueprint is the complete, auditable declaration of your OS security posture:</p>
<pre><code class="" data-line=""># ubuntu22-cis-l1.yaml
name: ubuntu22-cis-l1
description: Ubuntu 22.04 CIS Level 1 baseline for production workloads
version: &quot;1.0&quot;

target:
  os: ubuntu
  version: &quot;22.04&quot;
  provider: aws
  region: ap-south-1
  instance_type: t3.medium

compliance:
  benchmark: cis-l1
  controls: all

hardening:
  - ansible-lockdown/UBUNTU22-CIS
  - role: custom-audit-logging
    vars:
      audit_log_retention_days: 90
      audit_max_log_file: 100

filesystem:
  tmp:
    type: tmpfs
    options: [nodev, nosuid, noexec]
  home:
    options: [nodev]

controls:
  - id: 1.1.2
    override: compliant
    reason: &quot;tmpfs /tmp implemented via systemd unit — equivalent control&quot;
  - id: 5.2.4
    override: compliant
    reason: &quot;SSH timeout managed by session manager policy, not sshd_config&quot;
</code></pre>
<p>Each section is explicit:</p>
<p><strong><code class="" data-line="">target</code></strong> — which OS, which version, which provider. This is the only provider-specific section. The compliance intent below it is portable.</p>
<p><strong><code class="" data-line="">compliance</code></strong> — which benchmark and which controls to apply. <code class="" data-line="">controls: all</code> means every CIS L1 control. You can also specify <code class="" data-line="">controls: [1.x, 2.x]</code> to scope to specific sections.</p>
<p><strong><code class="" data-line="">hardening</code></strong> — which Ansible roles to run. <code class="" data-line="">ansible-lockdown/UBUNTU22-CIS</code> is the community CIS hardening role. You can add custom roles alongside it.</p>
<p><strong><code class="" data-line="">controls</code></strong> — documented exceptions. Not suppressions — overrides with a recorded reason. This is the difference between &#8220;we turned off this control&#8221; and &#8220;this control is satisfied by an equivalent implementation, documented here.&#8221;</p>
<hr />
<h2 id="building-the-image">Building the Image</h2>
<pre><code class="" data-line=""># Validate the blueprint before building
stratum blueprint validate ubuntu22-cis-l1.yaml

# Build — this will take 15-20 minutes
stratum build --blueprint ubuntu22-cis-l1.yaml --provider aws

# Output:
# [15:42:01] Launching build instance...
# [15:42:45] Running ansible-lockdown/UBUNTU22-CIS (144 tasks)...
# [15:51:33] Running custom-audit-logging role...
# [15:52:11] Running post-build OpenSCAP scan (benchmark: cis-l1)...
# [15:54:08] Grade: A (98/100 controls passing)
# [15:54:09] 2 controls overridden (documented in blueprint)
# [15:54:10] Creating AMI snapshot: ami-0a7f3c9e82d1b4c05
# [15:54:47] Done. AMI tagged with compliance grade: cis-l1-A-98
</code></pre>
<p>If the post-build scan comes back below a configurable threshold, the build fails — no AMI is created. The instance is terminated. The image does not exist.</p>
<p>That is the structural guarantee. You cannot skip a build step at 2am because at 2am you&#8217;re calling <code class="" data-line="">stratum build</code>, not running steps manually.</p>
<hr />
<h2 id="the-control-override-mechanism">The Control Override Mechanism</h2>
<p>The override mechanism is what separates this from checkbox compliance.</p>
<p>Every security benchmark has controls that conflict with how production environments actually work. CIS L1 recommends <code class="" data-line="">/tmp</code> on a separate partition. Many cloud instances use tmpfs with equivalent <code class="" data-line="">nodev, nosuid, noexec</code> mount options. The intent of the control is satisfied. The literal implementation differs.</p>
<p>Without an override mechanism, you have two bad options: fail the scan (noisy, meaningless), or configure the scanner to ignore the control (undocumented, invisible to auditors).</p>
<p>The blueprint&#8217;s <code class="" data-line="">controls</code> section gives you a third option: record the override, document the reason, and let the scanner count it as compliant. The SARIF output and the compliance grade both reflect the documented state.</p>
<pre><code class="" data-line="">controls:
  - id: 1.1.2
    override: compliant
    reason: &quot;tmpfs /tmp implemented via systemd unit — equivalent control&quot;
</code></pre>
<p>This appears in the build log, in the SARIF export, and in the image metadata. An auditor reading the output sees: control 1.1.2 — compliant, documented exception, reason recorded. Not: control 1.1.2 — ignored.</p>
<hr />
<h2 id="what-the-blueprint-gives-you-that-a-script-doesnt">What the Blueprint Gives You That a Script Doesn&#8217;t</h2>
<table>
<thead>
<tr>
<th></th>
<th>Hardening script</th>
<th>HardeningBlueprint YAML</th>
</tr>
</thead>
<tbody>
<tr>
<td>Version-controlled</td>
<td>Possible but not enforced</td>
<td>Always — it&#8217;s a file</td>
</tr>
<tr>
<td>Auditable exceptions</td>
<td>Typically not</td>
<td>Built-in override mechanism</td>
</tr>
<tr>
<td>Post-build verification</td>
<td>Manual or none</td>
<td>Automatic OpenSCAP scan</td>
</tr>
<tr>
<td>Image exists only if hardened</td>
<td>No</td>
<td>Yes — build fails if scan fails</td>
</tr>
<tr>
<td>Multi-cloud portability</td>
<td>Requires separate scripts</td>
<td>Provider flag, same YAML</td>
</tr>
<tr>
<td>Drift detection</td>
<td>Not possible</td>
<td>Rescan instance against original grade</td>
</tr>
<tr>
<td>Skippable at 2am</td>
<td>Yes</td>
<td>No — you&#8217;d have to change the build process</td>
</tr>
</tbody>
</table>
<p>The last row is the one that matters. A script is skippable because there&#8217;s a human in the loop. A blueprint is a build artifact — you can&#8217;t deploy the image without the blueprint having been applied, because the image is what the blueprint produces.</p>
<hr />
<h2 id="validating-a-blueprint-before-building">Validating a Blueprint Before Building</h2>
<pre><code class="" data-line=""># Syntax and schema validation
stratum blueprint validate ubuntu22-cis-l1.yaml

# Dry-run — show what Ansible tasks will run, what controls will be checked
stratum build --blueprint ubuntu22-cis-l1.yaml --provider aws --dry-run

# Show all available controls for a benchmark
stratum blueprint controls --benchmark cis-l1 --os ubuntu --version 22.04

# Show what a specific control checks
stratum blueprint controls --id 1.1.2 --benchmark cis-l1
</code></pre>
<p>The dry-run output shows every Ansible task that will run, every OpenSCAP check that will fire, and flags any controls that might conflict with the provider environment before you&#8217;ve launched a build instance.</p>
<hr />
<h2 id="production-gotchas">Production Gotchas</h2>
<p><strong>Build time is 15–25 minutes.</strong> Ansible-Lockdown applies 144+ tasks for CIS L1. Build this into your pipeline timing — don&#8217;t expect golden images in 3 minutes.</p>
<p><strong>Cloud-init ordering matters.</strong> On AWS, certain hardening steps (sysctl tuning, PAM configuration) interact with cloud-init. The Stratum provider layer handles sequencing — but if you add custom hardening roles, test the cloud-init interaction explicitly.</p>
<p><strong>Some CIS controls conflict with managed service requirements.</strong> AWS Systems Manager Session Manager requires specific SSH configuration. RDS requires specific networking settings. Use the <code class="" data-line="">controls</code> override section to document these — don&#8217;t suppress them silently.</p>
<p><strong>Kernel parameter hardening requires a reboot.</strong> Controls in the <code class="" data-line="">3.x</code> (network parameters) and <code class="" data-line="">1.5.x</code> (kernel modules) sections apply sysctl changes that take effect on reboot. The Stratum build process reboots the instance before the OpenSCAP scan — don&#8217;t skip the reboot if you&#8217;re building manually.</p>
<hr />
<h2 id="key-takeaways">Key Takeaways</h2>
<ul>
<li>Linux hardening as code means the blueprint YAML is the build artifact — the image either exists and is hardened, or it doesn&#8217;t exist</li>
<li>The <code class="" data-line="">controls</code> override mechanism is the difference between undocumented suppressions and auditable, reasoned exceptions</li>
<li>Post-build OpenSCAP scan runs automatically — a failing grade blocks image creation</li>
<li>One blueprint file is portable across providers (EP03 covers this): the compliance intent stays in the YAML, the cloud-specific details go in the provider layer</li>
<li>Version-controlling the blueprint gives you a complete history of what your OS security posture was at any point in time — the same way Terraform state tracks infrastructure</li>
</ul>
<hr />
<h2 id="whats-next">What&#8217;s Next</h2>
<p>One blueprint, one provider. EP02 showed that the skip-at-2am problem is solved when hardening is a build artifact rather than a process step.</p>
<p>What it didn&#8217;t address: what happens when you expand to a second cloud. GCP uses different disk names. Azure cloud-init fires in a different order. The AWS metadata endpoint IP is different from every other provider. If you maintain separate hardening scripts per cloud, they drift within a month.</p>
<p>EP03 covers multi-cloud OS hardening: the same blueprint, six providers, no drift.</p>
<p><em>Next: <a href="/linux-hardening-multi-cloud/">multi-cloud OS hardening — one blueprint for AWS, GCP, and Azure</a></em></p>
<p>Get EP03 in your inbox when it publishes → <a href="https://linuxcent.com/subscribe">linuxcent.com/subscribe</a></p>
<p><a class="a2a_button_mastodon" href="https://www.addtoany.com/add_to/mastodon?linkurl=https%3A%2F%2Flinuxcent.com%2Flinux-hardening-as-code%2F&amp;linkname=Hardening%20Blueprint%20as%20Code%20%E2%80%94%20Declare%20Your%20OS%20Baseline%20in%20YAML" title="Mastodon" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Flinuxcent.com%2Flinux-hardening-as-code%2F&amp;linkname=Hardening%20Blueprint%20as%20Code%20%E2%80%94%20Declare%20Your%20OS%20Baseline%20in%20YAML" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Flinuxcent.com%2Flinux-hardening-as-code%2F&amp;linkname=Hardening%20Blueprint%20as%20Code%20%E2%80%94%20Declare%20Your%20OS%20Baseline%20in%20YAML" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_reddit" href="https://www.addtoany.com/add_to/reddit?linkurl=https%3A%2F%2Flinuxcent.com%2Flinux-hardening-as-code%2F&amp;linkname=Hardening%20Blueprint%20as%20Code%20%E2%80%94%20Declare%20Your%20OS%20Baseline%20in%20YAML" title="Reddit" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_x" href="https://www.addtoany.com/add_to/x?linkurl=https%3A%2F%2Flinuxcent.com%2Flinux-hardening-as-code%2F&amp;linkname=Hardening%20Blueprint%20as%20Code%20%E2%80%94%20Declare%20Your%20OS%20Baseline%20in%20YAML" title="X" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Flinuxcent.com%2Flinux-hardening-as-code%2F&amp;linkname=Hardening%20Blueprint%20as%20Code%20%E2%80%94%20Declare%20Your%20OS%20Baseline%20in%20YAML" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_copy_link" href="https://www.addtoany.com/add_to/copy_link?linkurl=https%3A%2F%2Flinuxcent.com%2Flinux-hardening-as-code%2F&amp;linkname=Hardening%20Blueprint%20as%20Code%20%E2%80%94%20Declare%20Your%20OS%20Baseline%20in%20YAML" title="Copy Link" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Flinuxcent.com%2Flinux-hardening-as-code%2F&#038;title=Hardening%20Blueprint%20as%20Code%20%E2%80%94%20Declare%20Your%20OS%20Baseline%20in%20YAML" data-a2a-url="https://linuxcent.com/linux-hardening-as-code/" data-a2a-title="Hardening Blueprint as Code — Declare Your OS Baseline in YAML"></a></p><p>The post <a href="https://linuxcent.com/linux-hardening-as-code/">Hardening Blueprint as Code — Declare Your OS Baseline in YAML</a> appeared first on <a href="https://linuxcent.com">Linuxcent</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://linuxcent.com/linux-hardening-as-code/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1548</post-id>	</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Page Caching using Disk: Enhanced 

Served from: linuxcent.com @ 2026-04-24 20:16:58 by W3 Total Cache
-->