<?xml-stylesheet href="/rss.xsl" type="text/xsl"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Joseph Palacios</title><link>https://josephpalacios.org/</link><description>Recent content on Joseph Palacios</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><managingEditor>email@sample.com (Joseph)</managingEditor><webMaster>email@sample.com (Joseph)</webMaster><lastBuildDate>Mon, 16 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://josephpalacios.org/index.xml" rel="self" type="application/rss+xml"/><item><title>Wazuh Home Lab Setup with Docker</title><link>https://josephpalacios.org/posts/2026-03-16-wazuh-homelab-setup/</link><pubDate>Mon, 16 Mar 2026 00:00:00 +0000</pubDate><author>email@sample.com (Joseph)</author><guid>https://josephpalacios.org/posts/2026-03-16-wazuh-homelab-setup/</guid><description>Joseph Palacios https://josephpalacios.org/posts/2026-03-16-wazuh-homelab-setup/ -&lt;p&gt;Hello,&lt;/p&gt;
&lt;p&gt;This is how I set up Wazuh on a single Debian host using Docker. Wazuh is an open source security platform that handles threat detection, log analysis, and endpoint monitoring. I&amp;rsquo;ll go through the installation, changing the default passwords, and how I deployed a Windows agent.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://josephpalacios.org/images/wazuh/wazuh_homelab_architecture.svg" alt="Wazuh architecture"&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m running three containers on one Debian host. The indexer handles data storage, the manager processes events and applies rules, and the dashboard is the web UI I access on port 443. Agents on other machines report back to the manager on port 1514.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Debian Linux host running as root&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/engine/install/"&gt;Docker and Docker Compose&lt;/a&gt; installed&lt;/li&gt;
&lt;li&gt;At least 4 CPU cores, 8GB RAM, and 50GB of disk&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="1-fix-docker-repo-duplicate-if-needed"&gt;1. Fix Docker Repo Duplicate (if needed)&lt;/h2&gt;
&lt;p&gt;I ran into a duplicate source error with apt. If you hit the same thing, just remove the extra entry:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm /etc/apt/sources.list.d/docker.list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="2-set-kernel-parameter"&gt;2. Set Kernel Parameter&lt;/h2&gt;
&lt;p&gt;Wazuh&amp;rsquo;s indexer (OpenSearch) needs a higher virtual memory limit. I set it and made it persist on reboot:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sysctl -w vm.max_map_count&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;262144&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;vm.max_map_count=262144&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /etc/sysctl.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="https://josephpalacios.org/images/wazuh/Screenshot_20260313_184014.png" alt="Setting kernel parameter"&gt;&lt;/p&gt;
&lt;h2 id="3-clone-the-repo"&gt;3. Clone the Repo&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/wazuh/wazuh-docker.git -b v4.14.3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; wazuh-docker/single-node/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="4-generate-certificates"&gt;4. Generate Certificates&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose -f generate-indexer-certs.yml run --rm generator
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="https://josephpalacios.org/images/wazuh/Screenshot_20260313_184030.png" alt="Generating certificates"&gt;&lt;/p&gt;
&lt;h2 id="5-start-wazuh"&gt;5. Start Wazuh&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="https://josephpalacios.org/images/wazuh/Screenshot_20260313_184038.png" alt="Pulling images"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://josephpalacios.org/images/wazuh/Screenshot_20260313_184105.png" alt="Containers starting"&gt;&lt;/p&gt;
&lt;p&gt;Once it&amp;rsquo;s up, I accessed the dashboard at &lt;code&gt;https://&amp;lt;your-host-ip&amp;gt;&lt;/code&gt;. You&amp;rsquo;ll get a browser SSL warning since it uses a self-signed cert. Click Advanced and proceed.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://josephpalacios.org/images/wazuh/Screenshot_20260313_184251.png" alt="SSL warning"&gt;&lt;/p&gt;
&lt;p&gt;The default credentials are &lt;code&gt;admin&lt;/code&gt; / &lt;code&gt;SecretPassword&lt;/code&gt;. I&amp;rsquo;d strongly recommend changing these before doing anything else.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://josephpalacios.org/images/wazuh/Screenshot_20260313_184305.png" alt="Wazuh login"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://josephpalacios.org/images/wazuh/Screenshot_20260313_184341.png" alt="Wazuh dashboard"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="changing-the-default-password"&gt;Changing the Default Password&lt;/h2&gt;
&lt;h3 id="admin-dashboard-password"&gt;Admin (Dashboard) Password&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; I stopped the stack first:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose down
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="https://josephpalacios.org/images/wazuh/Screenshot_20260313_185303.png" alt="docker compose down"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; Then generated a new password hash:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run --rm -ti wazuh/wazuh-indexer:4.14.3 bash /usr/share/wazuh-indexer/plugins/opensearch-security/tools/hash.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="https://josephpalacios.org/images/wazuh/Screenshot_20260313_214420.png" alt="Generating hash"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt; I pasted the hash into &lt;code&gt;config/wazuh_indexer/internal_users.yml&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;admin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;lt;YOUR_NEW_HASH&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="https://josephpalacios.org/images/wazuh/Screenshot_20260313_214613.png" alt="Editing internal_users.yml"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt; I also updated the plaintext password in &lt;code&gt;docker-compose.yml&lt;/code&gt;. Replace every occurrence of &lt;code&gt;SecretPassword&lt;/code&gt; with your new one. If your password has a &lt;code&gt;$&lt;/code&gt; in it, double it (e.g. &lt;code&gt;My$$Pass&lt;/code&gt;) or it&amp;rsquo;ll break.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://josephpalacios.org/images/wazuh/Screenshot_20260313_214800.png" alt="Editing docker-compose.yml indexer section"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://josephpalacios.org/images/wazuh/Screenshot_20260313_214854.png" alt="Editing docker-compose.yml dashboard section"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5.&lt;/strong&gt; Started it back up:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="https://josephpalacios.org/images/wazuh/Screenshot_20260313_215000.png" alt="Containers restarting"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6.&lt;/strong&gt; Then I exec&amp;rsquo;d into the indexer container to apply the security config:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; -it single-node-wazuh.indexer-1 bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="https://josephpalacios.org/images/wazuh/Screenshot_20260313_215102.png" alt="Exec into container"&gt;&lt;/p&gt;
&lt;p&gt;Inside the container I ran:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;INSTALLATION_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/share/wazuh-indexer
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;CONFIG_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$INSTALLATION_DIR&lt;/span&gt;/config
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;CACERT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$CONFIG_DIR&lt;/span&gt;/certs/root-ca.pem
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$CONFIG_DIR&lt;/span&gt;/certs/admin-key.pem
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;CERT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$CONFIG_DIR&lt;/span&gt;/certs/admin.pem
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;JAVA_HOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/share/wazuh-indexer/jdk
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bash /usr/share/wazuh-indexer/plugins/opensearch-security/tools/securityadmin.sh -cd &lt;span class="nv"&gt;$CONFIG_DIR&lt;/span&gt;/opensearch-security/ -nhnv -cacert &lt;span class="nv"&gt;$CACERT&lt;/span&gt; -cert &lt;span class="nv"&gt;$CERT&lt;/span&gt; -key &lt;span class="nv"&gt;$KEY&lt;/span&gt; -p &lt;span class="m"&gt;9200&lt;/span&gt; -icl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="https://josephpalacios.org/images/wazuh/Screenshot_20260313_215134.png" alt="Setting env vars and running securityadmin"&gt;&lt;/p&gt;
&lt;p&gt;After exiting the container I was able to log in with the new credentials.&lt;/p&gt;
&lt;h3 id="api-user-wazuh-wui-password"&gt;API User (&lt;code&gt;wazuh-wui&lt;/code&gt;) Password&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; I updated &lt;code&gt;config/wazuh_dashboard/wazuh.yml&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;hosts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;1513629884013&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://wazuh.manager&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;55000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;wazuh-wui&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;YourNewPassword&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; I also updated &lt;code&gt;API_PASSWORD&lt;/code&gt; in &lt;code&gt;docker-compose.yml&lt;/code&gt; for both the manager and dashboard sections.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt; Then restarted:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose down
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Keep in mind the API password must be 8-64 characters and include uppercase, lowercase, a number, and a symbol.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="deploying-a-windows-agent"&gt;Deploying a Windows Agent&lt;/h2&gt;
&lt;p&gt;I went to &lt;strong&gt;Server Management → Endpoints Summary → Deploy new agent&lt;/strong&gt; in the dashboard.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://josephpalacios.org/images/wazuh/Screenshot_20260313_231746.png" alt="No agents registered"&gt;&lt;/p&gt;
&lt;p&gt;I opened PowerShell as Administrator by right-clicking the Start menu.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://josephpalacios.org/images/wazuh/Screenshot_20260316_100734.png" alt="Opening Terminal as Admin"&gt;&lt;/p&gt;
&lt;p&gt;I ran &lt;code&gt;ipconfig&lt;/code&gt; first to grab my IP so I knew what to use as the manager address.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://josephpalacios.org/images/wazuh/Screenshot_20260316_100626.png" alt="ipconfig output"&gt;&lt;/p&gt;
&lt;p&gt;I filled in the server address in the deploy wizard and ran the install command:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://josephpalacios.org/images/wazuh/Screenshot_20260316_100657.png" alt="Server address for Windows"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://josephpalacios.org/images/wazuh/Screenshot_20260316_100756.png" alt="PowerShell install command"&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Invoke-WebRequest&lt;/span&gt; &lt;span class="n"&gt;-Uri&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="p"&gt;//&lt;/span&gt;&lt;span class="n"&gt;packages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;wazuh&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;4&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;windows&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;wazuh-agent&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;4.14&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;msi&lt;/span&gt; &lt;span class="n"&gt;-OutFile&lt;/span&gt; &lt;span class="nv"&gt;$env:tmp&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="nb"&gt;wazuh-agent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;msiexec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;exe&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="nv"&gt;$env:tmp&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="nb"&gt;wazuh-agent&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="n"&gt;WAZUH_MANAGER&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;lt;YOUR_HOST_IP&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;WAZUH_AGENT_NAME&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Win-Test&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="https://josephpalacios.org/images/wazuh/Screenshot_20260316_101809.png" alt="Downloading agent"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://josephpalacios.org/images/wazuh/Screenshot_20260316_101820.png" alt="Install complete"&gt;&lt;/p&gt;
&lt;p&gt;Then started the service:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;NET&lt;/span&gt; &lt;span class="nb"&gt;START &lt;/span&gt;&lt;span class="n"&gt;WazuhSvc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="https://josephpalacios.org/images/wazuh/Screenshot_20260316_102428.png" alt="Wazuh service started"&gt;&lt;/p&gt;
&lt;p&gt;It showed up as active in the dashboard within a minute.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://josephpalacios.org/images/wazuh/Screenshot_20260316_102434.png" alt="Agent active"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://josephpalacios.org/images/wazuh/Screenshot_20260316_102449.png" alt="Agents list"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="troubleshooting"&gt;Troubleshooting&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Make sure port &lt;strong&gt;1514&lt;/strong&gt; is open inbound on your Debian host&lt;/li&gt;
&lt;li&gt;On Windows, always run PowerShell as Administrator&lt;/li&gt;
&lt;li&gt;Agents can take a minute or two to appear after starting&lt;/li&gt;
&lt;li&gt;Check Windows agent logs at &lt;code&gt;C:\Program Files (x86)\ossec-agent\ossec.log&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
- https://josephpalacios.org/posts/2026-03-16-wazuh-homelab-setup/ -</description></item><item><title>My Home Network</title><link>https://josephpalacios.org/posts/2026-03-13-my-homelab-network-setup/</link><pubDate>Fri, 13 Mar 2026 00:00:00 +0000</pubDate><author>email@sample.com (Joseph)</author><guid>https://josephpalacios.org/posts/2026-03-13-my-homelab-network-setup/</guid><description>Joseph Palacios https://josephpalacios.org/posts/2026-03-13-my-homelab-network-setup/ -&lt;p&gt;This is an overview of my current home network setup, including the hardware, VLAN layout, and some things I&amp;rsquo;d do differently. A follow-up post will cover the storage and services side.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://josephpalacios.org/images/home_network_vlan_final.svg" alt="Home network topology"&gt;&lt;/p&gt;
&lt;h2 id="topology-overview"&gt;Topology Overview&lt;/h2&gt;
&lt;p&gt;Everything runs through OPNsense, which handles routing, firewalling, and WireGuard for remote access. From there it trunks down to two managed switches over 802.1Q, and each switch powers a TP-Link EAP610 access point via PoE+.&lt;/p&gt;
&lt;p&gt;The two APs are managed through Omada and each broadcasts three SSIDs mapped to different VLANs: Trusted, IoT, and Guest.&lt;/p&gt;
&lt;h2 id="switches"&gt;Switches&lt;/h2&gt;
&lt;p&gt;This is where I&amp;rsquo;d do things differently if I were starting over. My 2.5G PoE switch handles the heavier traffic, specifically my Proxmox cluster and TrueNAS server. I went with a cheap Chinese brand because it had the specs I wanted at the price, but it&amp;rsquo;s been a headache. The interface is confusing, support is basically nonexistent, and it doesn&amp;rsquo;t fit naturally with the rest of my setup.&lt;/p&gt;
&lt;p&gt;My second switch is a TP-Link, and the difference is noticeable. The UI is clean, configuration is straightforward, and it works the way you&amp;rsquo;d expect.&lt;/p&gt;
&lt;p&gt;If I were doing this again, I&amp;rsquo;d just buy two TP-Link switches from the start. Saving money on networking hardware isn&amp;rsquo;t worth the frustration when things don&amp;rsquo;t work the way you expect.&lt;/p&gt;
&lt;h2 id="access-points"&gt;Access Points&lt;/h2&gt;
&lt;p&gt;Both APs are TP-Link EAP610s running Wi-Fi 6 with WPA3. Omada makes managing them easy, especially for VLAN tagging per SSID. Roaming between the two is seamless.&lt;/p&gt;
&lt;h2 id="vlans"&gt;VLANs&lt;/h2&gt;
&lt;p&gt;All VLANs are carved out of a 10.212.0.0/18 block and trunked from OPNsense to both switches.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;VLAN&lt;/th&gt;
&lt;th&gt;Subnet&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LAN&lt;/td&gt;
&lt;td&gt;10.212.1.0/24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Servers&lt;/td&gt;
&lt;td&gt;10.212.10.0/24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trusted&lt;/td&gt;
&lt;td&gt;10.212.20.0/24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IoT&lt;/td&gt;
&lt;td&gt;10.212.30.0/24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Guest&lt;/td&gt;
&lt;td&gt;10.212.40.0/24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Management&lt;/td&gt;
&lt;td&gt;10.212.99.0/24&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The Management VLAN is locked down and only used for accessing network hardware. Servers get their own subnet isolated from the main LAN. IoT and Guest are both restricted from reaching anything internal.&lt;/p&gt;
&lt;h2 id="what-i-learned"&gt;What I Learned&lt;/h2&gt;
&lt;p&gt;Mixing a cheap 2.5G switch into my TP-Link network has caused me some issues. I can&amp;rsquo;t integrate it with Omada (TP-Link&amp;rsquo;s SDN) and the firmware is pretty outdated. I&amp;rsquo;m also worried about reliability, though it&amp;rsquo;s held up for about a year now. Whether that&amp;rsquo;s a sign of decent quality or just luck, I honestly can&amp;rsquo;t tell.&lt;/p&gt;
- https://josephpalacios.org/posts/2026-03-13-my-homelab-network-setup/ -</description></item><item><title>How I Passed Cisco CCNA</title><link>https://josephpalacios.org/posts/2026-02-25-how-i-passed-cisco-ccna/</link><pubDate>Wed, 25 Feb 2026 00:00:00 +0000</pubDate><author>email@sample.com (Joseph)</author><guid>https://josephpalacios.org/posts/2026-02-25-how-i-passed-cisco-ccna/</guid><description>Joseph Palacios https://josephpalacios.org/posts/2026-02-25-how-i-passed-cisco-ccna/ -&lt;h1 id="passing-the-ccna"&gt;Passing the CCNA&lt;/h1&gt;
&lt;p&gt;Hello, I recently passed the CCNA and it was very hard. So far I have taken four certificate exams and this one was the hardest. The questions were harder and the mechanics of the test was more challenging. Here are my tips for passing.&lt;/p&gt;
&lt;h2 id="taking-the-test"&gt;Taking the test&lt;/h2&gt;
&lt;p&gt;Lets start with the mechanics of the test since this is will change the way you take on this exam. You cannot go back to your pervious questions, so no skipping the hard question until the end. Making time management a way more important skill in this exam compared to others. You are given two hours to pass, with differing amount of questions and labs. My only tip for this is to know what questions to its worth taking your time on. Personally I felt like I spent a lot of time overthinking questions, I was worried about getting a trick question. You should always take a doubt take with your answers, does this make sense, are their any other variable questions, do I fully understand this question or should I take a guess. Avoid any overthinking but do take a small double take.&lt;/p&gt;
&lt;h2 id="studying-tips"&gt;Studying tips&lt;/h2&gt;
&lt;p&gt;You can pass the CCNA with buying any additional studying guides, or labs. A lot of the additonal materials is only worth it if your fine learning beyond the CCNA. The offical CCNA book is a great resource but it&amp;rsquo;s abit too much if your just planning to learn the material from the CCNA, unless you learn best from reading. I would personally recommend Jeremy&amp;rsquo;s IT Lab CCNA course. It&amp;rsquo;s free and a amazing resource. It gives you everything you might need for passing. Jermey&amp;rsquo;s course provides flash cards, labs, and a full course.&lt;/p&gt;
- https://josephpalacios.org/posts/2026-02-25-how-i-passed-cisco-ccna/ -</description></item><item><title>Goodbye WordPress, Hello Hugo</title><link>https://josephpalacios.org/posts/2026-02-19-my-first-post/</link><pubDate>Thu, 19 Feb 2026 00:00:00 +0000</pubDate><author>email@sample.com (Joseph)</author><guid>https://josephpalacios.org/posts/2026-02-19-my-first-post/</guid><description>Joseph Palacios https://josephpalacios.org/posts/2026-02-19-my-first-post/ -&lt;p&gt;Hello, this is my first post on my new website. I wanted to get away from WordPress and learn some web dev in the process. The site is still pretty rough around the edges, but it&amp;rsquo;s mine and I&amp;rsquo;m happy with it so far.&lt;/p&gt;
&lt;p&gt;One thing I already like is that blog posts are written in markdown. It&amp;rsquo;s a lot less friction than the WordPress editor, so hopefully I&amp;rsquo;ll actually write more.&lt;/p&gt;
&lt;h2 id="how-i-built-it"&gt;How I Built It&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m using &lt;a href="https://gohugo.io/"&gt;Hugo&lt;/a&gt;, a static site generator. You write your posts in markdown, and Hugo compiles everything into plain HTML and CSS. No database, no plugins, no WordPress updates breaking things at random. The whole site lives in a Git repository, which I also wanted to learn more about.&lt;/p&gt;
&lt;p&gt;The theme is &lt;a href="https://github.com/AmazingRise/hugo-theme-diary"&gt;Diary&lt;/a&gt; by AmazingRise. I customized it with a Catppuccin color scheme and a homepage layout I built myself with some help.&lt;/p&gt;
&lt;h2 id="whats-next"&gt;What&amp;rsquo;s Next&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ll be moving my older posts over from the old site, though most of them will get rewritten. I&amp;rsquo;m not happy with the quality of some of the older ones and I&amp;rsquo;d rather put out something useful than just archive it. More posts coming soon.&lt;/p&gt;
- https://josephpalacios.org/posts/2026-02-19-my-first-post/ -</description></item><item><title>SSH: Concepts and Configuration</title><link>https://josephpalacios.org/posts/2026-03-10-ssh-setup/</link><pubDate>Wed, 17 Dec 2025 00:00:00 +0000</pubDate><author>email@sample.com (Joseph)</author><guid>https://josephpalacios.org/posts/2026-03-10-ssh-setup/</guid><description>Joseph Palacios https://josephpalacios.org/posts/2026-03-10-ssh-setup/ -&lt;p&gt;SSH (Secure Shell) is how you remotely access another machine over a network. This is a basic overview of the concepts and commands you&amp;rsquo;ll use most often.&lt;/p&gt;
&lt;h2 id="ssh-concepts"&gt;SSH Concepts&lt;/h2&gt;
&lt;h3 id="public-and-private-keys"&gt;Public and Private Keys&lt;/h3&gt;
&lt;p&gt;SSH gives you two ways to authenticate: a password or a key pair. We&amp;rsquo;re going to use keys. They&amp;rsquo;re harder to brute force than a password and more convenient once set up, since you don&amp;rsquo;t have to type anything to log in.&lt;/p&gt;
&lt;p&gt;The key pair has two parts.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;private key&lt;/strong&gt; stays on your machine and never leaves it. Think of it as your actual password. Do not share it.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;public key&lt;/strong&gt; goes on the server. It can only be used to verify that you have the matching private key. Sharing it is fine.&lt;/p&gt;
&lt;p&gt;When you connect, the server checks if your private key matches the public key it has on file.&lt;/p&gt;
&lt;p&gt;Public keys are stored on the server at &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt;. Private keys sit on your machine, usually in &lt;code&gt;~/.ssh/&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="ssh-config-file"&gt;SSH Config File&lt;/h3&gt;
&lt;p&gt;Instead of typing out the full connection details every time, you can save them in &lt;code&gt;~/.ssh/config&lt;/code&gt;. This lets you connect with a short alias instead of a full command.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Host my-server
Hostname 192.168.1.20
User joseph
Port 22
IdentityFile ~/.ssh/my_key
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;After saving that, you can just run &lt;code&gt;ssh my-server&lt;/code&gt; instead of &lt;code&gt;ssh -i ~/.ssh/my_key joseph@192.168.1.20&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="common-commands"&gt;Common Commands&lt;/h2&gt;
&lt;h3 id="ssh"&gt;ssh&lt;/h3&gt;
&lt;p&gt;Connect to a remote machine.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh &lt;span class="o"&gt;[&lt;/span&gt;USER&lt;span class="o"&gt;]&lt;/span&gt;@&lt;span class="o"&gt;[&lt;/span&gt;SERVER&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Modifier&lt;/th&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-i&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;path to private key&lt;/td&gt;
&lt;td&gt;Specifies which private key to use&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-p&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;port number&lt;/td&gt;
&lt;td&gt;Connects on a specific port instead of the default 22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-L&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[LOCAL-PORT]:[TARGET-HOST]:[TARGET-PORT]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Forwards a local port to a remote host through the server&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -i &lt;span class="o"&gt;[&lt;/span&gt;PRIVATE-KEY&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;USER&lt;span class="o"&gt;]&lt;/span&gt;@&lt;span class="o"&gt;[&lt;/span&gt;SERVER&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -p &lt;span class="o"&gt;[&lt;/span&gt;PORT&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;USER&lt;span class="o"&gt;]&lt;/span&gt;@&lt;span class="o"&gt;[&lt;/span&gt;SERVER&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -L &lt;span class="o"&gt;[&lt;/span&gt;LOCAL-PORT&lt;span class="o"&gt;]&lt;/span&gt;:&lt;span class="o"&gt;[&lt;/span&gt;TARGET-HOST&lt;span class="o"&gt;]&lt;/span&gt;:&lt;span class="o"&gt;[&lt;/span&gt;TARGET-PORT&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;USER&lt;span class="o"&gt;]&lt;/span&gt;@&lt;span class="o"&gt;[&lt;/span&gt;SERVER&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="example"&gt;Example&lt;/h2&gt;
&lt;p&gt;For this example I want to SSH into my Linux machine at &lt;code&gt;192.168.1.20&lt;/code&gt;. I&amp;rsquo;m logging in as &lt;code&gt;joseph&lt;/code&gt;, which is the local user on that machine.&lt;/p&gt;
&lt;p&gt;The default SSH port is 22, but I changed mine to &lt;code&gt;2222&lt;/code&gt;, so I need to specify it with &lt;code&gt;-p&lt;/code&gt;. I also set up key authentication, so I&amp;rsquo;m pointing to my private key with &lt;code&gt;-i&lt;/code&gt; instead of typing a password.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -i ~/.ssh/my_key -p &lt;span class="m"&gt;2222&lt;/span&gt; joseph@192.168.1.20
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="ssh-keygen"&gt;ssh-keygen&lt;/h3&gt;
&lt;p&gt;Generate a new key pair. The output will be two files: your private key and your public key (&lt;code&gt;.pub&lt;/code&gt;).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh-keygen -t &lt;span class="o"&gt;[&lt;/span&gt;TYPE&lt;span class="o"&gt;]&lt;/span&gt; -f &lt;span class="o"&gt;[&lt;/span&gt;PATH&lt;span class="o"&gt;]&lt;/span&gt; -C &lt;span class="s2"&gt;&amp;#34;[COMMENT]&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Modifier&lt;/th&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;key type&lt;/td&gt;
&lt;td&gt;Sets the encryption type. Use &lt;code&gt;ed25519&lt;/code&gt;, it&amp;rsquo;s faster and more secure than RSA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-f&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;file path&lt;/td&gt;
&lt;td&gt;Where to save the key and what to name it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-C&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;A comment to identify the key later, usually your email or a description&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;number&lt;/td&gt;
&lt;td&gt;Sets the key size in bits. Only needed for RSA, ed25519 ignores this&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh-keygen -t ed25519 -f ~/.ssh/&lt;span class="o"&gt;[&lt;/span&gt;FILENAME&lt;span class="o"&gt;]&lt;/span&gt; -C &lt;span class="s2"&gt;&amp;#34;[COMMENT]&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh-keygen -t rsa -b &lt;span class="m"&gt;4096&lt;/span&gt; -f ~/.ssh/&lt;span class="o"&gt;[&lt;/span&gt;FILENAME&lt;span class="o"&gt;]&lt;/span&gt; -C &lt;span class="s2"&gt;&amp;#34;[COMMENT]&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="example-1"&gt;Example&lt;/h2&gt;
&lt;p&gt;For this example I want to generate a new ed25519 key pair for my Linux server. I&amp;rsquo;m using &lt;code&gt;-t&lt;/code&gt; to set the key type to &lt;code&gt;ed25519&lt;/code&gt;. With &lt;code&gt;-f&lt;/code&gt; I&amp;rsquo;m telling it to save the key to &lt;code&gt;~/.ssh/&lt;/code&gt; and name it &lt;code&gt;my_key&lt;/code&gt;. The &lt;code&gt;-C&lt;/code&gt; is just a label so I know what this key is for later.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh-keygen -t ed25519 -f ~/.ssh/my_key -C &lt;span class="s2"&gt;&amp;#34;joseph linux server&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="ssh-copy-id"&gt;ssh-copy-id&lt;/h3&gt;
&lt;p&gt;Copies your public key to a server so you can log in without a password.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh-copy-id -i &lt;span class="o"&gt;[&lt;/span&gt;PUBLIC-KEY&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;USER&lt;span class="o"&gt;]&lt;/span&gt;@&lt;span class="o"&gt;[&lt;/span&gt;SERVER&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Modifier&lt;/th&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-i&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;path to public key&lt;/td&gt;
&lt;td&gt;Specifies which public key to copy. Use the &lt;code&gt;.pub&lt;/code&gt; file, not the private key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-p&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;port number&lt;/td&gt;
&lt;td&gt;Copies to a server running SSH on a non-default port&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh-copy-id -i &lt;span class="o"&gt;[&lt;/span&gt;PUBLIC-KEY&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;USER&lt;span class="o"&gt;]&lt;/span&gt;@&lt;span class="o"&gt;[&lt;/span&gt;SERVER&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh-copy-id -i &lt;span class="o"&gt;[&lt;/span&gt;PUBLIC-KEY&lt;span class="o"&gt;]&lt;/span&gt; -p &lt;span class="o"&gt;[&lt;/span&gt;PORT&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;USER&lt;span class="o"&gt;]&lt;/span&gt;@&lt;span class="o"&gt;[&lt;/span&gt;SERVER&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This appends your public key to &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt; on the server automatically.&lt;/p&gt;
&lt;h2 id="example-2"&gt;Example&lt;/h2&gt;
&lt;p&gt;For this example I want to copy my public key to my Linux machine at &lt;code&gt;192.168.1.20&lt;/code&gt; so I can log in without a password from now on.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m using &lt;code&gt;-i&lt;/code&gt; to point to my public key. It has to be the &lt;code&gt;.pub&lt;/code&gt; file — not the private key. &lt;code&gt;joseph&lt;/code&gt; is the local user on that machine. My SSH port is set to &lt;code&gt;2222&lt;/code&gt; so I also need &lt;code&gt;-p&lt;/code&gt; to specify it.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh-copy-id -i ~/.ssh/my_key.pub -p &lt;span class="m"&gt;2222&lt;/span&gt; joseph@192.168.1.20
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="scp"&gt;scp&lt;/h3&gt;
&lt;p&gt;Copy files over SSH. Works like &lt;code&gt;cp&lt;/code&gt; but over the network.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;scp &lt;span class="o"&gt;[&lt;/span&gt;FILE&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;USER&lt;span class="o"&gt;]&lt;/span&gt;@&lt;span class="o"&gt;[&lt;/span&gt;SERVER&lt;span class="o"&gt;]&lt;/span&gt;:&lt;span class="o"&gt;[&lt;/span&gt;SERVER-DIRECTORY&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Modifier&lt;/th&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-i&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;path to private key&lt;/td&gt;
&lt;td&gt;Specifies which private key to use&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-P&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;port number&lt;/td&gt;
&lt;td&gt;Connects on a non-default port. Note the capital P, unlike &lt;code&gt;ssh&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-r&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;Copies a directory recursively&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Client to server&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;scp &lt;span class="o"&gt;[&lt;/span&gt;FILE&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;USER&lt;span class="o"&gt;]&lt;/span&gt;@&lt;span class="o"&gt;[&lt;/span&gt;SERVER&lt;span class="o"&gt;]&lt;/span&gt;:&lt;span class="o"&gt;[&lt;/span&gt;SERVER-DIRECTORY&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Server to client&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;scp &lt;span class="o"&gt;[&lt;/span&gt;USER&lt;span class="o"&gt;]&lt;/span&gt;@&lt;span class="o"&gt;[&lt;/span&gt;SERVER&lt;span class="o"&gt;]&lt;/span&gt;:&lt;span class="o"&gt;[&lt;/span&gt;FILE&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;LOCAL-DIRECTORY&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# With modifiers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;scp -i &lt;span class="o"&gt;[&lt;/span&gt;PRIVATE-KEY&lt;span class="o"&gt;]&lt;/span&gt; -P &lt;span class="o"&gt;[&lt;/span&gt;PORT&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;FILE&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;USER&lt;span class="o"&gt;]&lt;/span&gt;@&lt;span class="o"&gt;[&lt;/span&gt;SERVER&lt;span class="o"&gt;]&lt;/span&gt;:&lt;span class="o"&gt;[&lt;/span&gt;SERVER-DIRECTORY&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;scp -r &lt;span class="o"&gt;[&lt;/span&gt;DIRECTORY&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;USER&lt;span class="o"&gt;]&lt;/span&gt;@&lt;span class="o"&gt;[&lt;/span&gt;SERVER&lt;span class="o"&gt;]&lt;/span&gt;:&lt;span class="o"&gt;[&lt;/span&gt;SERVER-DIRECTORY&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="example-3"&gt;Example&lt;/h2&gt;
&lt;p&gt;For this example I want to copy a file from my machine to my Linux server at &lt;code&gt;192.168.1.20&lt;/code&gt;. I&amp;rsquo;m pointing &lt;code&gt;-i&lt;/code&gt; to my private key for authentication. My SSH port is &lt;code&gt;2222&lt;/code&gt; so I need &lt;code&gt;-P&lt;/code&gt; to specify it. Note that &lt;code&gt;scp&lt;/code&gt; uses a capital &lt;code&gt;-P&lt;/code&gt; for the port, unlike &lt;code&gt;ssh&lt;/code&gt; which uses lowercase.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;scp -i ~/.ssh/my_key -P &lt;span class="m"&gt;2222&lt;/span&gt; backup.tar.gz joseph@192.168.1.20:/home/joseph/backups/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For transferring large amounts of files or syncing directories, &lt;code&gt;rsync&lt;/code&gt; is the better option. It only transfers what has changed instead of copying everything every time, which is faster and safer over an unstable connection.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rsync -avz -e &lt;span class="s2"&gt;&amp;#34;ssh -i ~/.ssh/my_key -p 2222&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;DIRECTORY&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;USER&lt;span class="o"&gt;]&lt;/span&gt;@&lt;span class="o"&gt;[&lt;/span&gt;SERVER&lt;span class="o"&gt;]&lt;/span&gt;:&lt;span class="o"&gt;[&lt;/span&gt;SERVER-DIRECTORY&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="additional-notes"&gt;Additional Notes&lt;/h2&gt;
&lt;p&gt;On Debian and some other distros you may run into an issue with an unknown terminal type when trying to clear the screen or run certain commands. To fix this, just add the following to your shell config:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;export TERM=xterm-256color&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; ~/.bashrc &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;- https://josephpalacios.org/posts/2026-03-10-ssh-setup/ -</description></item><item><title>How to Reflash a BIOS Chip Using a CH341A Programmer</title><link>https://josephpalacios.org/posts/2025-10-29-how-to-reflash-a-bios-chip/</link><pubDate>Wed, 29 Oct 2025 00:00:00 +0000</pubDate><author>email@sample.com (Joseph)</author><guid>https://josephpalacios.org/posts/2025-10-29-how-to-reflash-a-bios-chip/</guid><description>Joseph Palacios https://josephpalacios.org/posts/2025-10-29-how-to-reflash-a-bios-chip/ -&lt;h2 id="background"&gt;Background&lt;/h2&gt;
&lt;p&gt;My coworker corrupted the BIOS on an ASUS G301QE laptop. After exhausting standard recovery methods like ASUS BIOS Flashback and battery disconnection, I proposed direct chip flashing using a CH341A programmer — a tool I previously purchased for Libreboot projects.&lt;/p&gt;
&lt;h2 id="requirements"&gt;Requirements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;CH341A USB programmer&lt;/li&gt;
&lt;li&gt;BIOS compatibility verification for your motherboard&lt;/li&gt;
&lt;li&gt;Flashrom application (command-line flashing utility)&lt;/li&gt;
&lt;li&gt;Correct BIOS .bin file matching your exact motherboard model&lt;/li&gt;
&lt;li&gt;SOIC8/SOP8 test clip&lt;/li&gt;
&lt;li&gt;Adapter connecting CH341A to SOP8 clip&lt;/li&gt;
&lt;li&gt;Optional: Bundle kits containing programmer, clip, and adapter together&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Flashrom is standard on most Linux distributions and can be installed via package manager or built from source using Meson.&lt;/p&gt;
&lt;h2 id="setting-up-the-programmer"&gt;Setting Up the Programmer&lt;/h2&gt;
&lt;h3 id="step-1-identify-pin-1"&gt;Step 1: Identify Pin 1&lt;/h3&gt;
&lt;p&gt;On the SOP8 clip, pin 1 is marked by a red cable. On the programmer, look for a dot, notch, or marking indicating pin 1.&lt;/p&gt;
&lt;h3 id="step-2-connect-the-adapter"&gt;Step 2: Connect the Adapter&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Connect adapter to clip first&lt;/li&gt;
&lt;li&gt;Lift the lever on the socket&lt;/li&gt;
&lt;li&gt;Push pins into correct positions&lt;/li&gt;
&lt;li&gt;Pull down lever to lock everything&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-3-attach-the-clip-to-the-bios-chip"&gt;Step 3: Attach the Clip to the BIOS Chip&lt;/h3&gt;
&lt;p&gt;Locate the marking on the chip (dot or notch) showing pin 1&amp;rsquo;s location. Align the clip&amp;rsquo;s red cable with this pin and ensure firm contact across all pins.&lt;/p&gt;
&lt;h3 id="step-4-plug-in-the-programmer"&gt;Step 4: Plug in the Programmer&lt;/h3&gt;
&lt;p&gt;Insert the CH341A into a USB port. A red light should illuminate:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No light:&lt;/strong&gt; Try a different USB port or computer&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dim red light:&lt;/strong&gt; Possible short circuit or incorrect pin connection&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Green light:&lt;/strong&gt; Everything may be functioning correctly&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="verifying-your-setup"&gt;Verifying Your Setup&lt;/h2&gt;
&lt;p&gt;Run flashrom to confirm installation:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;flashrom
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Expected output shows version information and confirmation that flashrom is installed.&lt;/p&gt;
&lt;h2 id="creating-verified-backups"&gt;Creating Verified Backups&lt;/h2&gt;
&lt;p&gt;Before writing, create two separate backups and compare their MD5 checksums to verify consistent, reliable reads:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;flashrom --programmer ch341a_spi -r backupone.bin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;flashrom --programmer ch341a_spi -r backuptwo.bin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;md5sum backupone.bin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;md5sum backuptwo.bin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Matching checksums indicate good reads and readiness to proceed. Mismatched checksums suggest clip connection issues requiring re-seating and retry.&lt;/p&gt;
&lt;h2 id="verifying-file-sizes"&gt;Verifying File Sizes&lt;/h2&gt;
&lt;p&gt;Confirm that your downloaded BIOS file and backup are identical in size:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls -l
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Both files should show the exact same byte count. Size discrepancies indicate a potential wrong BIOS file — do not proceed if they don&amp;rsquo;t match.&lt;/p&gt;
&lt;h2 id="flashing-the-bios"&gt;Flashing the BIOS&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;flashrom --programmer ch341a_spi -w GV301QE.bin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Replace the filename with your actual BIOS file. Flashrom will erase, write, and verify the new BIOS — typically completing in 1-3 minutes. Wait for success confirmation before disconnecting anything.&lt;/p&gt;
&lt;h2 id="troubleshooting-file-size-mismatch"&gt;Troubleshooting: File Size Mismatch&lt;/h2&gt;
&lt;p&gt;Downloaded BIOS files sometimes include headers added by manufacturers for their official flashing tools. Strip unnecessary headers using dd:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dd &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;downloaded_bios.bin &lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;bios_no_header.bin &lt;span class="nv"&gt;bs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="nv"&gt;skip&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4096&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Adjust the skip value based on how many bytes larger the file is. Verify sizes match after stripping.&lt;/p&gt;
- https://josephpalacios.org/posts/2025-10-29-how-to-reflash-a-bios-chip/ -</description></item><item><title>Fixing Windows' Broken USB Support in BitLocker</title><link>https://josephpalacios.org/posts/2025-10-16-fixing-windows-usb-bitlocker/</link><pubDate>Thu, 16 Oct 2025 00:00:00 +0000</pubDate><author>email@sample.com (Joseph)</author><guid>https://josephpalacios.org/posts/2025-10-16-fixing-windows-usb-bitlocker/</guid><description>Joseph Palacios https://josephpalacios.org/posts/2025-10-16-fixing-windows-usb-bitlocker/ -&lt;p&gt;I just recently started dealing with this issue and I see a lot of others doing drastic fixes like reimaging the problem PC. There&amp;rsquo;s a simple fix until Microsoft solves this. Using a recovery drive or my preferred option, Hiren&amp;rsquo;s BootCD PE ISO. If you followed my creating a multitool USB drive guide you will most likely have this ISO already.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.malwarebytes.com/blog/news/2025/10/windows-update-breaks-usb-support-in-recovery-mode"&gt;News article&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hirensbootcd.org/"&gt;Hiren&amp;rsquo;s BootCD PE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rufus.ie/en/"&gt;Rufus&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="requirements"&gt;Requirements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;USB drive with Hiren&amp;rsquo;s BootCD PE installed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you have a blank USB drive just reflash it with Rufus using the Hiren&amp;rsquo;s BootCD PE ISO. Once ready, boot into the problem PC and disable Secure Boot. Then reboot into the temporary boot screen and select the USB drive.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=kjJCrZ4cwDU"&gt;Video guide here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Once booted, open Command Prompt and enter the following:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Check BitLocker status&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;manage-bde -status
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# You&amp;#39;ll see output like this for each drive:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Volume C: [NAME]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Size:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# BitLocker Version:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Conversion Status:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Lock Status:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Key Protectors:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# You can also check via File Explorer — look for the lock symbol under &amp;#34;This PC&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Right-click a locked drive to unlock via GUI if preferred&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Unlock the drive using your recovery key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;manage-bde -unlock C: -rp &lt;span class="s2"&gt;&amp;#34;recovery-key-here&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Turn BitLocker off completely&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;manage-bde -off C:
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That should be it. Turn off the machine then reboot into Windows. Make sure to re-enable Secure Boot.&lt;/p&gt;
&lt;h2 id="backing-up-your-recovery-key"&gt;Backing Up Your Recovery Key&lt;/h2&gt;
&lt;p&gt;Before turning BitLocker back on, back up your recovery key:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Check status and get the Key Protector ID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;manage-bde -status C:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Look for the &amp;#34;Key Protectors&amp;#34; section:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Numerical Password:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ID: {12345678-1234-1234-1234-123456789012}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Backup to your Microsoft account (requires internet)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;manage-bde -protectors -adbackup C: -id &lt;span class="s1"&gt;&amp;#39;{your-id-here}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="turning-bitlocker-back-on"&gt;Turning BitLocker Back On&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Turn on BitLocker&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;manage-bde -on C:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Check encryption progress&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;manage-bde -status C:
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can also re-enable BitLocker through Settings &amp;gt; Privacy &amp;amp; Security &amp;gt; Device Encryption or Control Panel &amp;gt; BitLocker Drive Encryption. You might get an error the first time — try again after a reboot.&lt;/p&gt;
- https://josephpalacios.org/posts/2025-10-16-fixing-windows-usb-bitlocker/ -</description></item><item><title>Transitioning from TrueNAS: Choosing My Next NAS OS</title><link>https://josephpalacios.org/posts/2025-10-12-transitioning-from-truenas/</link><pubDate>Sun, 12 Oct 2025 00:00:00 +0000</pubDate><author>email@sample.com (Joseph)</author><guid>https://josephpalacios.org/posts/2025-10-12-transitioning-from-truenas/</guid><description>Joseph Palacios https://josephpalacios.org/posts/2025-10-12-transitioning-from-truenas/ -&lt;p&gt;I&amp;rsquo;ve decided to migrate away from TrueNAS to a custom-built solution while simultaneously fixing a problematic RAID configuration. This transition is about developing personal skills and moving beyond turnkey solutions.&lt;/p&gt;
&lt;h2 id="why-switch"&gt;Why Switch?&lt;/h2&gt;
&lt;p&gt;I value TrueNAS&amp;rsquo;s straightforward WebUI and Docker support but want greater control than the platform provides. TrueNAS remains excellent for beginners but I feel ready for a more hands-on approach. The transition also gives me a chance to fix some mistakes in my current setup.&lt;/p&gt;
&lt;h2 id="core-requirements"&gt;Core Requirements&lt;/h2&gt;
&lt;p&gt;Must-haves:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Stable OS with strong hardware compatibility&lt;/li&gt;
&lt;li&gt;RAID support with filesystem-level redundancy&lt;/li&gt;
&lt;li&gt;Network file sharing protocols and ZFS ACLs&lt;/li&gt;
&lt;li&gt;Docker support with active community documentation&lt;/li&gt;
&lt;li&gt;Significantly more control than TrueNAS offers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nice-to-haves: reduced WebUI reliance, lighter resource footprint, direct package installation, Linux/Infrastructure as Code experience.&lt;/p&gt;
&lt;h2 id="three-primary-candidates"&gt;Three Primary Candidates&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Proxmox with TrueNAS VM&lt;/strong&gt; — balanced approach, keeps TrueNAS benefits while gaining hypervisor experience. Strong community support.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Debian 12 + ZFS + Ansible&lt;/strong&gt; — emphasizes Infrastructure as Code and Linux proficiency. Practical knowledge for DevOps career advancement.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NixOS&lt;/strong&gt; — declarative configuration via &lt;code&gt;.nix&lt;/code&gt; files. Cutting-edge but steeper learning curve and less portfolio relevance than Debian.&lt;/p&gt;
&lt;h2 id="the-raid-miscalculation"&gt;The RAID Miscalculation&lt;/h2&gt;
&lt;p&gt;I configured four 12TB drives in RAIDZ1 (4-wide), which offers only single-drive redundancy. The rebuild window spans 3-5 days, creating significant failure risk. An unrecoverable read error or second drive failure during reconstruction could result in total data loss. This stemmed from buying drives on sale without enough research.&lt;/p&gt;
&lt;h2 id="solution-paths"&gt;Solution Paths&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Option 1:&lt;/strong&gt; Add one 12TB drive for 5-wide RAIDZ2 (2-drive redundancy, same 31TB usable, ~$90-110).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Option 2:&lt;/strong&gt; Upgrade to a 6-bay chassis with two additional drives for 6-wide RAIDZ2 (2-drive redundancy, 42TB usable, ~$330-470).&lt;/p&gt;
&lt;p&gt;Currently running SMART tests and backing up critical data while I decide. Planning to implement the fix during the OS migration.&lt;/p&gt;
- https://josephpalacios.org/posts/2025-10-12-transitioning-from-truenas/ -</description></item><item><title>Finally Moving Away from Cloudflare Tunnel to an Open-Source Alternative</title><link>https://josephpalacios.org/posts/2025-08-11-cloudflare-tunnel-to-pangolin/</link><pubDate>Mon, 11 Aug 2025 00:00:00 +0000</pubDate><author>email@sample.com (Joseph)</author><guid>https://josephpalacios.org/posts/2025-08-11-cloudflare-tunnel-to-pangolin/</guid><description>Joseph Palacios https://josephpalacios.org/posts/2025-08-11-cloudflare-tunnel-to-pangolin/ -&lt;p&gt;Hello, I just switched my Cloudflare Tunnel container for an open-source alternative, Newt (Pangolin), on my home lab. They are both special reverse proxies that use a secure tunnel to expose your internal services to the internet.&lt;/p&gt;
&lt;p&gt;There are a lot of benefits to setting up Pangolin, but it comes with a cost and requires more setup. The biggest drawback is the cost of purchasing a VPS, compared to Cloudflare Tunnel, where you just need to have a domain name.&lt;/p&gt;
&lt;p&gt;The setup isn&amp;rsquo;t bad at all, and I found an &lt;a href="https://noted.lol/pangolin-local/"&gt;amazing guide from Jeremy&lt;/a&gt; that made it incredibly simple. So while this won&amp;rsquo;t be a setup guide, I did want to bring more attention to this project. It&amp;rsquo;s everything you could love about an open-source project: better performance and better security. While Pangolin itself is amazing, using a cloud service provider comes with inherent risks.&lt;/p&gt;
&lt;h2 id="key-differences"&gt;Key Differences&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s consider the key differences between Cloudflare Tunnel and Pangolin (Newt):&lt;/p&gt;
&lt;p&gt;&lt;img src="images/Screenshot_20260219_002748.png" alt="Cloudflare Tunnel vs Pangolin comparison"&gt;&lt;/p&gt;
- https://josephpalacios.org/posts/2025-08-11-cloudflare-tunnel-to-pangolin/ -</description></item><item><title>Creating a Multitool USB Drive</title><link>https://josephpalacios.org/posts/2025-07-28-creating-a-multitool-usb-drive/</link><pubDate>Mon, 28 Jul 2025 00:00:00 +0000</pubDate><author>email@sample.com (Joseph)</author><guid>https://josephpalacios.org/posts/2025-07-28-creating-a-multitool-usb-drive/</guid><description>Joseph Palacios https://josephpalacios.org/posts/2025-07-28-creating-a-multitool-usb-drive/ -&lt;p&gt;I want to start carrying around a USB drive filled with all the tools I may need. Before, I carried a couple of USB drives — one for imaging and one for storage/tools. Having everything on one drive would be a lifesaver. I could see myself using a GParted ISO to resize partitions or opening notes with portable apps. I&amp;rsquo;m going to use Windows for this one, but you can follow along on Linux if you know your way around.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ventoy&lt;/strong&gt; creates multiboot USBs by copying ISOs directly and auto-generating a boot menu. &lt;strong&gt;PortableApps&lt;/strong&gt; runs apps from a USB without installation, with a menu for easy organization on any PC.&lt;/p&gt;
&lt;h2 id="wiping-the-usb-drive"&gt;Wiping the USB Drive&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;re using a clean or new USB drive you can skip this step. For a used drive with existing partitions, open Terminal as admin (WIN + X, then A) and run:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;diskpart&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="n"&gt;disk&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;select &lt;/span&gt;&lt;span class="n"&gt;disk&lt;/span&gt; &lt;span class="mf"&gt;3&lt;/span&gt; &lt;span class="c"&gt;# replace 3 with your drive number — double check before continuing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;clean&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Common issues if &lt;code&gt;clean&lt;/code&gt; fails:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No admin privileges&lt;/strong&gt; — DiskPart requires elevated access&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Drive in use&lt;/strong&gt; — close File Explorer and any open files on the drive&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Write protection&lt;/strong&gt; — the USB may be set to read-only&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Corrupted drive&lt;/strong&gt; — antivirus or faulty hardware can interfere&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="downloads"&gt;Downloads&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.ventoy.net/en/index.html"&gt;Ventoy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://portableapps.com/"&gt;PortableApps&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="building-the-usb-drive"&gt;Building the USB Drive&lt;/h2&gt;
&lt;p&gt;Run the Ventoy installer:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open Ventoy — select your drive from the dropdown&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Options&lt;/strong&gt; → &lt;strong&gt;Partition Style&lt;/strong&gt; → choose &lt;strong&gt;GPT&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Options&lt;/strong&gt; again → &lt;strong&gt;Partition Configuration&lt;/strong&gt; → toggle &lt;strong&gt;Preserve some space at the end of the disk&lt;/strong&gt; → enter the amount you want for tools → OK&lt;/li&gt;
&lt;li&gt;Confirm the storage shown next to &amp;ldquo;Device&amp;rdquo; then click &lt;strong&gt;Install&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now convert the reserved space into a second partition using Disk Management (WIN + X, K):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Find your Ventoy disk, right-click the unallocated space → &lt;strong&gt;New Simple Volume&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Use the remaining storage for size&lt;/li&gt;
&lt;li&gt;Assign a drive letter&lt;/li&gt;
&lt;li&gt;Format as &lt;strong&gt;exFAT&lt;/strong&gt;, name it &lt;code&gt;Tools&lt;/code&gt; → Finish&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now install PortableApps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Run the PortableApps EXE&lt;/li&gt;
&lt;li&gt;On &amp;ldquo;Install Type&amp;rdquo; select &lt;strong&gt;New Install&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Portable – Install to a portable device&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Choose the &lt;code&gt;Tools&lt;/code&gt; partition you just created&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Install&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="wrap-up"&gt;Wrap Up&lt;/h2&gt;
&lt;p&gt;Drop your ISOs into the Ventoy partition and boot into the menu to start imaging or access tools like GParted. PortableApps will launch on startup with its app store where you can find most tools you need. For anything else, Reddit or the PortableApps development forums are a good resource.&lt;/p&gt;
- https://josephpalacios.org/posts/2025-07-28-creating-a-multitool-usb-drive/ -</description></item></channel></rss>