【问题标题】:prevent changing of permissions in mounts with rootless container防止使用无根容器更改挂载中的权限
【发布时间】:2026-02-06 00:20:05
【问题描述】:

在有根容器中,此问题的解决方案是run with --user "$(id -u):$(id -g)",但这不适用于无根包含系统(无根 docker,或者在我的情况下是 podman):

$ mkdir x
$ podman run --user "$(id -u):$(id -g)" -v "$PWD/x:/x:rw" ubuntu:focal bash -c 'echo hi >> /x/test'
bash: /x/test: Permission denied

所以对于无根容器系统,我应该删除--user,因为根用户会自动映射到调用用户:

$ podman run -v "$PWD/x:/x:rw" ubuntu:focal bash -c 'echo hi >> /x/test'
$ ls -al x
total 12
drwxr-xr-x  2 asottile asottile 4096 Sep  3 10:02 .
drwxrwxrwt 18 root     root     4096 Sep  3 10:01 ..
-rw-r--r--  1 asottile asottile    3 Sep  3 10:02 test

但是,因为现在是 root 用户,他们可以将所有权更改为在容器外不可删除的用户:

$ podman run -v "$PWD/x:/x:rw" ubuntu:focal bash -c 'mkdir -p /x/1/2/3 && chown -R nobody /x/1'
$ ls -al x/
total 16
drwxr-xr-x  3 asottile asottile 4096 Sep  3 10:03 .
drwxrwxrwt 18 root     root     4096 Sep  3 10:01 ..
drwxr-xr-x  3   165533 asottile 4096 Sep  3 10:03 1
-rw-r--r--  1 asottile asottile    3 Sep  3 10:02 test
$ rm -rf x/
rm: cannot remove 'x/1/2/3': Permission denied

所以我的问题是:我如何允许写入挂载,但防止更改无根容器的所有权?

【问题讨论】:

    标签: docker podman rootless


    【解决方案1】:

    我认为--user $(id -u):$(id -g) --userns=keep-id 会得到你想要的。

    $ id -un                                                                                                                                                                                                                                      
    erik                                                                                                                                                                                                                                          
    $ id -gn                                                                                                                                                                                                                                      
    erik                                                                                                                                                                                                                                          
    $ mkdir x                                                                                                                                                                                                                                     
    $ podman run -v "$PWD/x:/x:Z" --user $(id -u):$(id -g) --userns=keep-id docker.io/library/ubuntu:focal bash -c 'mkdir -p /x/1/2/3 && chown -R nobody /x/1'                                                                                    
    chown: changing ownership of '/x/1/2/3': Operation not permitted                                                                                                                                                                              
    chown: changing ownership of '/x/1/2': Operation not permitted                                                                                                                                                                                
    chown: changing ownership of '/x/1': Operation not permitted                                                                                                                                                                                  
    $ ls x                                                                                                                                                                                                                                        
    1                                                                                                                                                                                                                                             
    $ ls -l x                                                                                                                                                                                                                                     
    total 0                                                                                                                                                                                                                                       
    drwxr-xr-x. 3 erik erik 15 Sep  6 19:34 1                                                                                                                                                                                                     
    $ ls -l x/1                                                                                                                                                                                                                                   
    total 0                                                                                                                                                                                                                                       
    drwxr-xr-x. 3 erik erik 15 Sep  6 19:34 2                                                                                                                                                                                                     
    $ ls -l x/1/2                                                                                                                                                                                                                                 
    total 0                                                                                                                                                                                                                                       
    drwxr-xr-x. 2 erik erik 6 Sep  6 19:34 3                                                                                                                                                                                                      
    $ 
    

    关于删除不属于您的正常 UID 和 GID 的文件和目录(但来自 /etc/subuid/etc/subgid 中的额外范围),你可以 使用podman unshare rm filepath

    podman unshare rm -rf directorypath

    【讨论】:

    • 完美!我还发现--cap-drop CHOWN 也有效,但这要好得多!
    最近更新 更多