<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Permissions on Matty Spangler</title>
    <link>https://mattyspangler.codeberg.page/tags/permissions/</link>
    <description>Recent content in Permissions on Matty Spangler</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Mon, 09 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://mattyspangler.codeberg.page/tags/permissions/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Podman Permissions on Kicksecure</title>
      <link>https://mattyspangler.codeberg.page/posts/kicksecure-podman-permissions/</link>
      <pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate>
      
      <guid>https://mattyspangler.codeberg.page/posts/kicksecure-podman-permissions/</guid>
      <description>&lt;p&gt;This article is part of my &lt;a href=&#34;../kicksecure-self-hosting/&#34;&gt;Self-Hosting with Kicksecure&lt;/a&gt; series.&lt;/p&gt;
&lt;h2 id=&#34;1-introduction&#34;&gt;1. Introduction&lt;/h2&gt;
&lt;p&gt;When I first tried running rootless Podman on Kicksecure, containers wouldn&amp;rsquo;t start. The errors looked like:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Error: command required for rootless mode with multiple IDs: exec: &amp;#34;newuidmap&amp;#34;: executable file not found in $PATH
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Or:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;zsh: permission denied: /usr/bin/newuidmap
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Rootless Podman requires &lt;code&gt;newuidmap&lt;/code&gt; and &lt;code&gt;newgidmap&lt;/code&gt; to map a single user ID to the thousands of IDs needed inside containers. The issue? &lt;strong&gt;Kicksecure restricts access to these binaries by default&lt;/strong&gt; as a security measure. This article documents how I solved this properly.&lt;/p&gt;</description>
      <content>&lt;p&gt;This article is part of my &lt;a href=&#34;../kicksecure-self-hosting/&#34;&gt;Self-Hosting with Kicksecure&lt;/a&gt; series.&lt;/p&gt;
&lt;h2 id=&#34;1-introduction&#34;&gt;1. Introduction&lt;/h2&gt;
&lt;p&gt;When I first tried running rootless Podman on Kicksecure, containers wouldn&amp;rsquo;t start. The errors looked like:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Error: command required for rootless mode with multiple IDs: exec: &amp;#34;newuidmap&amp;#34;: executable file not found in $PATH
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Or:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;zsh: permission denied: /usr/bin/newuidmap
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Rootless Podman requires &lt;code&gt;newuidmap&lt;/code&gt; and &lt;code&gt;newgidmap&lt;/code&gt; to map a single user ID to the thousands of IDs needed inside containers. The issue? &lt;strong&gt;Kicksecure restricts access to these binaries by default&lt;/strong&gt; as a security measure. This article documents how I solved this properly.&lt;/p&gt;
&lt;h2 id=&#34;2-understanding-the-problem&#34;&gt;2. Understanding the Problem&lt;/h2&gt;
&lt;p&gt;I checked Kicksecure&amp;rsquo;s configuration:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dpkg-statoverride --list /usr/bin/newuidmap
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Output:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;root root 744 /usr/bin/newuidmap
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Only root can execute these binaries. For most systems, this is good security. But rootless containers need access.&lt;/p&gt;
&lt;h2 id=&#34;3-first-attempt-dpkg-statoverride&#34;&gt;3. First Attempt: dpkg-statoverride&lt;/h2&gt;
&lt;p&gt;My first approach was to use &lt;code&gt;dpkg-statoverride&lt;/code&gt; to change permissions:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;addgroup podman-users
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;usermod -aG podman-users user
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dpkg-statoverride --remove /usr/bin/newuidmap
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dpkg-statoverride --remove /usr/bin/newgidmap
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dpkg-statoverride --update --add root podman-users &lt;span style=&#34;color:#ae81ff&#34;&gt;4750&lt;/span&gt; /usr/bin/newuidmap
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dpkg-statoverride --update --add root podman-users &lt;span style=&#34;color:#ae81ff&#34;&gt;4750&lt;/span&gt; /usr/bin/newgidmap
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This worked temporarily. But then I ran an apt upgrade, and &lt;code&gt;permission-hardener&lt;/code&gt; reverted my changes. My containers broke after the next update.&lt;/p&gt;
&lt;h2 id=&#34;4-the-correct-solution&#34;&gt;4. The Correct Solution&lt;/h2&gt;
&lt;p&gt;Kicksecure provides a proper way to whitelist binaries through &lt;code&gt;permission-hardener&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;41-create-whitelist-configuration&#34;&gt;4.1. Create Whitelist Configuration&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir /etc/permission-hardener.d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Created &lt;code&gt;/etc/permission-hardener.d/50_podman.conf&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/usr/bin/newuidmap exactwhitelist
/usr/bin/newgidmap exactwhitelist
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The &lt;code&gt;exactwhitelist&lt;/code&gt; directive tells permission-hardener to leave these binaries alone while still applying restrictions to everything else.&lt;/p&gt;
&lt;h3 id=&#34;42-apply-changes&#34;&gt;4.2. Apply Changes&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;permission-hardener enable all
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Verified the permissions changed:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ls -l /usr/bin/newuidmap
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;-rwsr-x--- 1 root podman-users 14976 Jan 10 12:00 /usr/bin/newuidmap
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;5-configuring-podman&#34;&gt;5. Configuring Podman&lt;/h2&gt;
&lt;p&gt;Even with correct permissions, Podman couldn&amp;rsquo;t find these binaries in its path. I created a containers configuration file.&lt;/p&gt;
&lt;p&gt;As the &lt;code&gt;user&lt;/code&gt; account, created &lt;code&gt;~/.config/containers/containers.conf&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;[engine]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;newuidmap_path&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/usr/bin/newuidmap&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;newgidmap_path&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/usr/bin/newgidmap&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;6-verifying-user-id-mappings&#34;&gt;6. Verifying User ID Mappings&lt;/h2&gt;
&lt;p&gt;I confirmed my user had the necessary ID mappings:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;grep &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;whoami&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt; /etc/subuid
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;grep &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;whoami&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt; /etc/subgid
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Output:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;user:100000:65536
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This means &lt;code&gt;user&lt;/code&gt; can map UIDs 100000-165535 inside containers.&lt;/p&gt;
&lt;h2 id=&#34;7-testing&#34;&gt;7. Testing&lt;/h2&gt;
&lt;p&gt;Switched to the container user and tested:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;su - user
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;podman system migrate
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This succeeded without errors. Then I ran a test container:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;podman run --rm hello-world
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;8-why-this-matters&#34;&gt;8. Why This Matters&lt;/h2&gt;
&lt;p&gt;Rootless containers are a significant security improvement:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Container escapes&lt;/strong&gt; are contained to the user account&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kernel exploits&lt;/strong&gt; have limited impact&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;File ownership&lt;/strong&gt; is handled via ID mapping, not root privileges&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kicksecure&amp;rsquo;s default restrictions are correct for most use cases. Podman is an exception that requires explicit whitelisting.&lt;/p&gt;
&lt;h2 id=&#34;9-troubleshooting&#34;&gt;9. Troubleshooting&lt;/h2&gt;
&lt;h3 id=&#34;permission-denied&#34;&gt;Permission Denied&lt;/h3&gt;
&lt;p&gt;Check group membership:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;groups user
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ensure &lt;code&gt;podman-users&lt;/code&gt; appears in the list. A logout/login might be needed.&lt;/p&gt;
&lt;h3 id=&#34;path-not-found&#34;&gt;Path Not Found&lt;/h3&gt;
&lt;p&gt;Ensure the containers.conf file exists:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ls -la ~/.config/containers/containers.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;changes-reverted-after-update&#34;&gt;Changes Reverted After Update&lt;/h3&gt;
&lt;p&gt;Verify the whitelist file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat /etc/permission-hardener.d/50_podman.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then re-run:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;permission-hardener enable all
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;10-tracking-the-change&#34;&gt;10. Tracking the Change&lt;/h2&gt;
&lt;p&gt;This is exactly the kind of configuration change worth tracking:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd /etc
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git add .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;etckeeper commit &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Whitelisted newuidmap/newgidmap for rootless podman&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;More on this in my &lt;a href=&#34;../kicksecure-etckeeper/&#34;&gt;Etckeeper on Kicksecure&lt;/a&gt; article.&lt;/p&gt;
&lt;h2 id=&#34;10-whats-next&#34;&gt;10. What&amp;rsquo;s Next&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;../kicksecure-podman-quadlets/&#34;&gt;Podman Quadlets on Kicksecure&lt;/a&gt;&lt;/p&gt;
</content>
    </item>
    
  </channel>
</rss>
