<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Security on homelab</title>
    <link>https://homelab.nbkelley.com/tags/security/</link>
    <description>Recent content in Security on homelab</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Fri, 01 May 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://homelab.nbkelley.com/tags/security/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Cloudflare Access Setup for Protected Sections</title>
      <link>https://homelab.nbkelley.com/docs/security/cloudflare-access-setup/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/security/cloudflare-access-setup/</guid>
      <description>&lt;h1 id=&#34;cloudflare-access-setup-for-protected-sections&#34;&gt;Cloudflare Access Setup for Protected Sections&lt;a class=&#34;anchor&#34; href=&#34;#cloudflare-access-setup-for-protected-sections&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Methodology for securing specific website paths or subdomains using Cloudflare Zero Trust Access.&lt;/li&gt;&#xA;&lt;li&gt;Authentication bypasses traditional &lt;code&gt;.htaccess&lt;/code&gt; or server-side auth; Cloudflare handles it at the edge.&lt;/li&gt;&#xA;&lt;li&gt;Prerequisites: Cloudflare domain, Paid/Zero Trust plan (free tier supports up to 50 users).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Identity Provider Choice&lt;/strong&gt;: One-time PIN (OTP) recommended for simplicity and shared access without managing user lists. Alternatives include Google/GitHub or specific email allowlists.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Policy Structure&lt;/strong&gt;: &amp;ldquo;Allow Authenticated Users&amp;rdquo; policy with wildcard email matching (&lt;code&gt;*&lt;/code&gt;) or specific domain matching (&lt;code&gt;*@domain.com&lt;/code&gt;).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Edge-Based Protection&lt;/strong&gt;: No server-side configuration changes required; protection occurs before requests hit the origin server.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Pattern established but not yet applied to specific homelab services.&lt;/li&gt;&#xA;&lt;li&gt;Relevant to Nginx Proxy Manager (192.168.1.222) or Proxmox (192.168.1.69) admin interfaces if routed through Cloudflare.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;historical-notes&#34;&gt;Historical Notes&lt;a class=&#34;anchor&#34; href=&#34;#historical-notes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Conversation date: 2025-11-24.&lt;/li&gt;&#xA;&lt;li&gt;Focuses on the Cloudflare Zero Trust dashboard workflow for self-hosted applications.&lt;/li&gt;&#xA;&lt;li&gt;No changes to existing Cloudflare SSL/DNS integration patterns.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;open-questions&#34;&gt;Open Questions&lt;a class=&#34;anchor&#34; href=&#34;#open-questions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Which homelab services will leverage Cloudflare Access for admin/protected paths?&lt;/li&gt;&#xA;&lt;li&gt;Will static IP bypass policies be implemented for homelab admin access?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;related-pages&#34;&gt;Related Pages&lt;a class=&#34;anchor&#34; href=&#34;#related-pages&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/security/cloudflare_integration/&#34;&gt;Cloudflare Integration: SSL &amp;amp; DNS&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/services/hinterflix-help-site/&#34;&gt;Hinterflix Help Site - Cloudflare Deployment&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/networking/proxy-management/&#34;&gt;Proxy Management &amp;amp; Cloudflare Tunnels&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;sources&#34;&gt;Sources&lt;a class=&#34;anchor&#34; href=&#34;#sources&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;ingested/chats/117-Setting Up Cloudflare Access for Website Protection.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;DeepSeek conversation: 2025-11-24 (Setting Up Cloudflare Access for Website Protection)&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>SSH Host Key Management &amp; Troubleshooting</title>
      <link>https://homelab.nbkelley.com/docs/infrastructure/ssh_host_key_management/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/infrastructure/ssh_host_key_management/</guid>
      <description>&lt;h1 id=&#34;ssh-host-key-management--troubleshooting&#34;&gt;SSH Host Key Management &amp;amp; Troubleshooting&lt;a class=&#34;anchor&#34; href=&#34;#ssh-host-key-management--troubleshooting&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Standard procedures for resolving SSH &lt;code&gt;REMOTE HOST IDENTIFICATION HAS CHANGED&lt;/code&gt; warnings, which occur when a host&amp;rsquo;s SSH fingerprint differs from the locally stored &lt;code&gt;known_hosts&lt;/code&gt; entry. This typically happens after a server reinstall, OS upgrade, or SSH key regeneration.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions--commands&#34;&gt;Key Decisions &amp;amp; Commands&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions--commands&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Verify Legitimacy&lt;/strong&gt;: Always confirm with a system administrator or check server logs if a key change is unexpected, as it could indicate a man-in-the-middle attack.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Remove Stale Keys&lt;/strong&gt;: Use &lt;code&gt;ssh-keygen -R &amp;lt;hostname&amp;gt;&lt;/code&gt; to safely remove the outdated entry from &lt;code&gt;~/.ssh/known_hosts&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Targeted Removal&lt;/strong&gt;: If the error specifies a line number (e.g., line 9), you can remove it via &lt;code&gt;sed -i &#39;&#39; &#39;9d&#39; ~/.ssh/known_hosts&lt;/code&gt; or manually edit the file.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Pre-populate Keys&lt;/strong&gt;: In managed environments, use &lt;code&gt;ssh-keyscan &amp;lt;host&amp;gt; &amp;gt;&amp;gt; ~/.ssh/known_hosts&lt;/code&gt; to automate key acceptance.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Security Best Practice&lt;/strong&gt;: Prefer certificate-based authentication in sensitive environments to bypass host key checking entirely.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Host Encountered&lt;/strong&gt;: &lt;code&gt;proxy&lt;/code&gt; (192.168.1.222, Nginx Proxy Manager)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;User Context&lt;/strong&gt;: Commands executed from macOS (&lt;code&gt;NK---Galadriel&lt;/code&gt;) as user &lt;code&gt;natekelley&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Fingerprint Example&lt;/strong&gt;: &lt;code&gt;SHA256:k5j8V356rpQXapznIs12MeBEWHfZYwfeicXdNNWFyOI&lt;/code&gt; (ED25519)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;historical-notes&#34;&gt;Historical Notes&lt;a class=&#34;anchor&#34; href=&#34;#historical-notes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Initial troubleshooting documented on 2025-11-17. The &lt;code&gt;proxy&lt;/code&gt; host likely had its underlying VM/container rebuilt or its SSH configuration reset, triggering the warning.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;open-questions&#34;&gt;Open Questions&lt;a class=&#34;anchor&#34; href=&#34;#open-questions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Should SSH host keys be version-controlled or managed via a configuration management tool (e.g., Ansible) to prevent future mismatches?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;related-pages&#34;&gt;Related Pages&lt;a class=&#34;anchor&#34; href=&#34;#related-pages&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/networking/proxy-management/&#34;&gt;Proxy Management &amp;amp; Cloudflare Tunnels&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/infrastructure/network_troubleshooting/&#34;&gt;Troubleshooting Network Interface Changes&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;sources&#34;&gt;Sources&lt;a class=&#34;anchor&#34; href=&#34;#sources&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;ingested/chats/111-Check and Install Git, Go, Dart Sass on Ubuntu.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;ingested/chats/104-SSH Host Key Change Warning and Fix.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Historical DeepSeek conversation: SSH Host Key Change Warning and Fix (2025-11-17)&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>OPNsense DMZ Firewall Rules for IoT</title>
      <link>https://homelab.nbkelley.com/docs/networking/opnsense_dmz_iot_firewall/</link>
      <pubDate>Thu, 30 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/networking/opnsense_dmz_iot_firewall/</guid>
      <description>&lt;h1 id=&#34;opnsense-dmz-firewall-rules-for-iot&#34;&gt;OPNsense DMZ Firewall Rules for IoT&lt;a class=&#34;anchor&#34; href=&#34;#opnsense-dmz-firewall-rules-for-iot&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;A structured firewall rule set for isolating IoT devices in a DMZ zone. The rules enforce a &amp;ldquo;high-to-low trust&amp;rdquo; flow, ensuring IoT devices can reach the internet for cloud services while preventing them from initiating connections to the trusted LAN. This pattern is critical for preventing lateral movement from compromised IoT devices.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Explicit Allow / Implicit Deny&lt;/strong&gt;: Only allow necessary outbound traffic (HTTP/HTTPS, DNS, NTP) from DMZ to WAN.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Strict Containment&lt;/strong&gt;: Explicitly block all DMZ-initiated traffic to the LAN zone.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Controlled LAN Access&lt;/strong&gt;: Default deny for LAN-to-DMZ, with specific allow rules only for administration or required services.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;WAN Isolation&lt;/strong&gt;: Block all unsolicited inbound traffic from WAN to DMZ.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;em&gt;Note: The homelab currently uses VLANs (Gandalf 192.168.1.x, Mithrandir 192.168.2.x, Tharkûn 192.168.3.x, Rivendell 192.168.4.x) managed by a UniFi Express gateway (&amp;ldquo;Olorín&amp;rdquo;, 192.168.1.1). These OPNsense zone-based rules should be adapted to the homelab&amp;rsquo;s VLAN structure or applied to a dedicated IoT VLAN (e.g., 192.168.50.x).&lt;/em&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cloudflare Integration: SSL &amp; DNS</title>
      <link>https://homelab.nbkelley.com/docs/security/cloudflare_integration/</link>
      <pubDate>Tue, 25 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/security/cloudflare_integration/</guid>
      <description>&lt;h1 id=&#34;cloudflare-integration-ssl--dns&#34;&gt;Cloudflare Integration: SSL &amp;amp; DNS&lt;a class=&#34;anchor&#34; href=&#34;#cloudflare-integration-ssl--dns&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Methodology for securing OPNsense and Proxmox web interfaces using Cloudflare&amp;rsquo;s Origin CA certificates and protecting the WAN via Cloudflare-specific firewall rules.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;SSL Mode&lt;/strong&gt;: Cloudflare SSL/TLS setting must be set to &lt;strong&gt;Full (Strict)&lt;/strong&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Security Pattern&lt;/strong&gt;: Use &lt;strong&gt;Cloudflare IP Aliases&lt;/strong&gt; on OPNsense to restrict WAN HTTPS (Port 443) access exclusively to Cloudflare&amp;rsquo;s IP ranges.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;DNS Strategy&lt;/strong&gt;: Use A records with &lt;strong&gt;Proxy (Orange Cloud)&lt;/strong&gt; enabled for web services to leverage DDoS protection.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;cloudflare-origin-ssl-opnsense&#34;&gt;Cloudflare Origin SSL (OPNsense)&lt;a class=&#34;anchor&#34; href=&#34;#cloudflare-origin-ssl-opnsense&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Generate Cert&lt;/strong&gt;: In Cloudflare, go to &lt;code&gt;SSL/TLS → Origin Server&lt;/code&gt; and create a certificate for the domain.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Import to OPNsense&lt;/strong&gt;:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;System → Trust → Certificates&lt;/code&gt; → &lt;strong&gt;Import existing Certificate&lt;/strong&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Paste PEM (Cert) and Private Key.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Assign to WebUI&lt;/strong&gt;:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;System → Settings → Administration&lt;/code&gt; → Set &lt;strong&gt;SSL Certificate&lt;/strong&gt; to the imported Cloudflare cert.&lt;/li&gt;&#xA;&lt;li&gt;Restart WebGUI: &lt;code&gt;configctl webgui restart&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;wan-hardening-opnsense&#34;&gt;WAN Hardening (OPNsense)&lt;a class=&#34;anchor&#34; href=&#34;#wan-hardening-opnsense&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Create Alias&lt;/strong&gt;: &lt;code&gt;Firewall → Aliases&lt;/code&gt; → &lt;strong&gt;URL Table Alias&lt;/strong&gt;.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Name: &lt;code&gt;Cloudflare_IPs&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;URL: &lt;code&gt;https://www.cloudflare.com/ips-v4&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Firewall Rule&lt;/strong&gt;: &lt;code&gt;Firewall → Rules → WAN&lt;/code&gt;.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Action&lt;/strong&gt;: &lt;code&gt;Pass&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Source&lt;/strong&gt;: &lt;code&gt;Cloudflare_IPs&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Destination Port&lt;/strong&gt;: &lt;code&gt;443&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Block Rule&lt;/strong&gt;: Add a block rule for port 443 from all other sources at the bottom of the WAN list.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;historical-notes&#34;&gt;Historical Notes&lt;a class=&#34;anchor&#34; href=&#34;#historical-notes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Note: If the browser shows &amp;ldquo;Not Secure&amp;rdquo; after import, ensure the &lt;strong&gt;Cloudflare Origin CA Root Certificate&lt;/strong&gt; is also imported into OPNsense &lt;code&gt;System → Trust → Authorities&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
