<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>nunogrl.com - secrets-management</title><link href="https://nunogrl.com/" rel="alternate"></link><link href="https://nunogrl.com/categories/secrets-management/atom.xml" rel="self"></link><id>https://nunogrl.com/</id><updated>2024-03-21T00:00:00+00:00</updated><entry><title>Password Store with GPG and Git</title><link href="https://nunogrl.com/articles/password-store-gpg-git/" rel="alternate"></link><published>2024-03-21T00:00:00+00:00</published><updated>2024-03-21T00:00:00+00:00</updated><author><name>Nuno Leitao</name></author><id>tag:nunogrl.com,2024-03-21:/articles/password-store-gpg-git/</id><summary type="html">&lt;p class="first last"&gt;Learn how to set up a secure, Git-based password management system using password-store and GPG encryption&lt;/p&gt;
</summary><content type="html">&lt;div class="section" id="problem-solution"&gt;
&lt;h2&gt;🚀 Problem &amp;amp; Solution&lt;/h2&gt;
&lt;div class="section" id="context-backstory"&gt;
&lt;h3&gt;📌 &lt;strong&gt;Context / Backstory&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;We needed a secure way to manage passwords and secrets across multiple servers and team members. Commercial password managers were either too complex, costly, or required external services we wanted to avoid.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="the-problem"&gt;
&lt;h3&gt;⚠️ &lt;strong&gt;The Problem&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Managing secrets across systems and teams presents several challenges:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Keeping passwords secure yet accessible&lt;/li&gt;
&lt;li&gt;Tracking changes and maintaining history&lt;/li&gt;
&lt;li&gt;Sharing secrets securely between team members&lt;/li&gt;
&lt;li&gt;Avoiding dependency on external services&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="the-solution"&gt;
&lt;h3&gt;💡 &lt;strong&gt;The Solution&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;We implemented &lt;cite&gt;password-store&lt;/cite&gt; with GPG encryption and Git integration, providing:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Secure GPG encryption for all secrets&lt;/li&gt;
&lt;li&gt;Git-based version control and distribution&lt;/li&gt;
&lt;li&gt;Fully local operation with no external dependencies&lt;/li&gt;
&lt;li&gt;Command-line interface for automation&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="who-this-helps"&gt;
&lt;h3&gt;👥 &lt;strong&gt;Who This Helps&lt;/strong&gt;&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;System administrators managing multiple servers&lt;/li&gt;
&lt;li&gt;DevOps teams handling shared credentials&lt;/li&gt;
&lt;li&gt;Security-conscious users wanting local password management&lt;/li&gt;
&lt;li&gt;Teams needing version-controlled secrets&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="technical-implementation"&gt;
&lt;h2&gt;⚙️ Technical Implementation&lt;/h2&gt;
&lt;p&gt;Let's visualize the password-store workflow:&lt;/p&gt;
&lt;div class="mermaid" id="mermaid-diagram-5400457694691543625"&gt;
flowchart LR
   P[Password] --&gt;|Encrypt| G[GPG]
   G --&gt;|Store| PS[password-store]
   PS --&gt;|Version| Git[Git Repository]
   Git --&gt;|Sync| T[Team Members]

   subgraph "Local System"
   P
   G
   PS
   end

   subgraph "Distribution"
   Git
   T
   end&lt;/div&gt;&lt;div class="section" id="generating-gpg-keys-in-batch-mode"&gt;
&lt;h3&gt;1️⃣ Generating GPG Keys in Batch Mode&lt;/h3&gt;
&lt;p&gt;For automated environments:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;gpg-server-key.conf&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;
&lt;span class="s"&gt;%no-protection&lt;/span&gt;
&lt;span class="s"&gt;Key-Type: default&lt;/span&gt;
&lt;span class="s"&gt;Subkey-Type: default&lt;/span&gt;
&lt;span class="s"&gt;Name-Real: Server Automation Key&lt;/span&gt;
&lt;span class="s"&gt;Name-Email: server@example.com&lt;/span&gt;
&lt;span class="s"&gt;Expire-Date: 0&lt;/span&gt;
&lt;span class="s"&gt;%commit&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;

gpg&lt;span class="w"&gt; &lt;/span&gt;--batch&lt;span class="w"&gt; &lt;/span&gt;--generate-key&lt;span class="w"&gt; &lt;/span&gt;gpg-server-key.conf
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="setting-up-the-environment"&gt;
&lt;h3&gt;2️⃣ Setting Up the Environment&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;PASSWORD_STORE_GPG_OPTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;--armor&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;GNUPGHOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/etc/password-store/.gnupg
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;PASSWORD_STORE_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/etc/password-store/store
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="initializing-the-password-store"&gt;
&lt;h3&gt;3️⃣ Initializing the Password Store&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$GNUPGHOME&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$PASSWORD_STORE_DIR&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
chmod&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;700&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$GNUPGHOME&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$PASSWORD_STORE_DIR&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
pass&lt;span class="w"&gt; &lt;/span&gt;init&lt;span class="w"&gt; &lt;/span&gt;server@example.com
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="git-integration"&gt;
&lt;h3&gt;4️⃣ Git Integration&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$PASSWORD_STORE_DIR&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
git&lt;span class="w"&gt; &lt;/span&gt;init
git&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;.
git&lt;span class="w"&gt; &lt;/span&gt;commit&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Initial password store&amp;quot;&lt;/span&gt;
git&lt;span class="w"&gt; &lt;/span&gt;remote&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;origin&lt;span class="w"&gt; &lt;/span&gt;git@example.com:secrets.git
git&lt;span class="w"&gt; &lt;/span&gt;push&lt;span class="w"&gt; &lt;/span&gt;-u&lt;span class="w"&gt; &lt;/span&gt;origin&lt;span class="w"&gt; &lt;/span&gt;main
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="troubleshooting-debugging"&gt;
&lt;h2&gt;🛠️ Troubleshooting &amp;amp; Debugging&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Ensure proper GPG key permissions (700 for directories, 600 for files)&lt;/li&gt;
&lt;li&gt;Verify GPG recipient when encryption fails&lt;/li&gt;
&lt;li&gt;Check Git remote access rights for sync issues&lt;/li&gt;
&lt;li&gt;Monitor Git conflicts when multiple users update simultaneously&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="optimizations-alternatives"&gt;
&lt;h2&gt;🔁 Optimizations &amp;amp; Alternatives&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Consider using GPG agent for improved key handling&lt;/li&gt;
&lt;li&gt;Implement Git hooks for pre-commit validation&lt;/li&gt;
&lt;li&gt;Use Git branches for testing password updates&lt;/li&gt;
&lt;li&gt;Consider &lt;cite&gt;pass&lt;/cite&gt; extensions for additional features&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="conclusion-takeaways"&gt;
&lt;h2&gt;✅ Conclusion &amp;amp; Takeaways&lt;/h2&gt;
&lt;p&gt;Using GPG with password-store provides a &lt;strong&gt;flexible, secure, and lightweight&lt;/strong&gt; method for managing secrets across machines. With Git integration, you get version history, team sharing, and distributed backup—&lt;strong&gt;without compromising security&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="comments-next-steps"&gt;
&lt;h2&gt;💬 Comments &amp;amp; Next Steps&lt;/h2&gt;
&lt;p&gt;How do you manage shared secrets in your infrastructure? Share your experience or ask questions below!&lt;/p&gt;
&lt;/div&gt;
</content><category term="Infrastructure Security"></category><category term="gpg"></category><category term="git"></category><category term="password-management"></category><category term="security"></category><category term="encryption"></category><category term="devops"></category><category term="secrets-management"></category></entry></feed>