Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Podman 权限问题 #30

Closed
bamboox opened this issue Sep 23, 2024 · 15 comments
Closed

Podman 权限问题 #30

bamboox opened this issue Sep 23, 2024 · 15 comments

Comments

@bamboox
Copy link

bamboox commented Sep 23, 2024

sudo: unable to send audit message: Operation not permitted
sudo: unable to send audit message: Operation not permitted
mknod: /dev/net/tun: Operation not permitted
sudo: unable to send audit message: Operation not permitted
sudo: unable to send audit message: Operation not permitted
mknod: /dev/net/tun: Operation not permitted

@cmj2002
Copy link
Owner

cmj2002 commented Sep 23, 2024

你在什么宿主机上运行的?什么操作系统、docker哪个版本、cpu指令集(amd64或arm)?

@tony-sung
Copy link
Contributor

感觉像是用的podman?podman需要加上--privileged或者--device /dev/net/tun,而且初始化的时候不能运行mknod: /dev/net/tun,因为--privileged权限下或者映射状态下tun是已存在的

@cmj2002
Copy link
Owner

cmj2002 commented Sep 23, 2024

感觉像是用的podman?podman需要加上--privileged或者--device /dev/net/tun,而且初始化的时候不能运行mknod: /dev/net/tun,因为--privileged权限下或者映射状态下tun是已存在的

如果是 podman 的话试试这个解决方案?

pi-hole/docker-pi-hole#1007 (comment)

@tony-sung
Copy link
Contributor

感觉像是用的podman?podman需要加上--privileged或者--device /dev/net/tun,而且初始化的时候不能运行mknod: /dev/net/tun,因为--privileged权限下或者映射状态下tun是已存在的

如果是 podman 的话试试这个解决方案?

pi-hole/docker-pi-hole#1007 (comment)

mknod: /dev/net/tun: Operation not permitted
这个方案不行,加审计日志权限解决不了创建虚拟网卡权限的问题,要么挂载tun,要么--privileged,一般用--privileged能解决,但是安全性不高

@tony-sung
Copy link
Contributor

感觉像是用的podman?podman需要加上--privileged或者--device /dev/net/tun,而且初始化的时候不能运行mknod: /dev/net/tun,因为--privileged权限下或者映射状态下tun是已存在的

如果是 podman 的话试试这个解决方案?
pi-hole/docker-pi-hole#1007 (comment)

mknod: /dev/net/tun: Operation not permitted 这个方案不行,加审计日志权限解决不了创建虚拟网卡权限的问题,要么挂载tun,要么--privileged,一般用--privileged能解决,但是安全性不高

在添加--privileged状态下, 报错变成了mknod: /dev/net/tun: File exists
所以我在提交的PR中加了一个判断以适应podman的规则

@cmj2002
Copy link
Owner

cmj2002 commented Sep 23, 2024

感觉像是用的podman?podman需要加上--privileged或者--device /dev/net/tun,而且初始化的时候不能运行mknod: /dev/net/tun,因为--privileged权限下或者映射状态下tun是已存在的

如果是 podman 的话试试这个解决方案?
pi-hole/docker-pi-hole#1007 (comment)

mknod: /dev/net/tun: Operation not permitted 这个方案不行,加审计日志权限解决不了创建虚拟网卡权限的问题,要么挂载tun,要么--privileged,一般用--privileged能解决,但是安全性不高

在添加--privileged状态下, 报错变成了mknod: /dev/net/tun: File exists 所以我在提交的PR中加了一个判断以适应podman的规则

我还是倾向于找到相应需要的cap,应该可以用strace找到,我明天研究一下。你可以先试试把 NET_RAW 加上。

@cmj2002
Copy link
Owner

cmj2002 commented Sep 23, 2024

如果实在找不到我就 merge 你的 PR

@cmj2002
Copy link
Owner

cmj2002 commented Sep 23, 2024

containers/common#1240 (comment)

应该还需要 MKNOD

@tony-sung
Copy link
Contributor

containers/common#1240 (comment)

应该还需要 MKNOD

这个之前试过了,仍然提示权限不足

@cmj2002
Copy link
Owner

cmj2002 commented Sep 24, 2024

我做了以下的实验:

    cap_drop:
      - ALL
    cap_add:
      # defualt cap of podman 
      - CHOWN
      - DAC_OVERRIDE
      - FOWNER
      - FSETID
      - KILL
      - NET_BIND_SERVICE
      - SETFCAP
      - SETGID
      - SETPCAP
      - SETUID
      - SYS_CHROOT

      # docker have these cap as default additonally
      - MKNOD
      # - NET_RAW
      - AUDIT_WRITE

      # additional required cap for warp
      - NET_ADMIN

是可以跑通的。

总结一下就是 podman 比 Docker 默认少了三个 CAP

其中 MKNOD, AUDIT_WRITE 是 warp-docker 需要的,NET_ADMIN 是两者默认都没有而 warp-docker 也需要。所以 Podman 用户应该使用这样的 CAP:

    cap_add:
      # Docker already have it, these are for podman users
      - MKNOD
      - AUDIT_WRITE
      # additional required cap for warp, both for podman and docker
      - NET_ADMIN

@bamboox @tony-sung 请你们在 docker-compose.yml 中加入 MKNODAUDIT_WRITE 再试一下(NET_ADMIN 也要保留),如果可以我就更新进代码里。

@tony-sung
Copy link
Contributor

我做了以下的实验:

    cap_drop:
      - ALL
    cap_add:
      # defualt cap of podman 
      - CHOWN
      - DAC_OVERRIDE
      - FOWNER
      - FSETID
      - KILL
      - NET_BIND_SERVICE
      - SETFCAP
      - SETGID
      - SETPCAP
      - SETUID
      - SYS_CHROOT

      # docker have these cap as default additonally
      - MKNOD
      # - NET_RAW
      - AUDIT_WRITE

      # additional required cap for warp
      - NET_ADMIN

是可以跑通的。

总结一下就是 podman 比 Docker 默认少了三个 CAP

其中 MKNOD, AUDIT_WRITE 是 warp-docker 需要的,NET_ADMIN 是两者默认都没有而 warp-docker 也需要。所以 Podman 用户应该使用这样的 CAP:

    cap_add:
      # Docker already have it, these are for podman users
      - MKNOD
      - AUDIT_WRITE
      # additional required cap for warp, both for podman and docker
      - NET_ADMIN

@bamboox @tony-sung 请你们在 docker-compose.yml 中加入 MKNODAUDIT_WRITE 再试一下(NET_ADMIN 也要保留),如果可以我就更新进代码里。

你是不是使用的rootful运行的container?我是用rootless仍然提示not permitted

@cmj2002
Copy link
Owner

cmj2002 commented Sep 24, 2024

我做了以下的实验:

    cap_drop:
      - ALL
    cap_add:
      # defualt cap of podman 
      - CHOWN
      - DAC_OVERRIDE
      - FOWNER
      - FSETID
      - KILL
      - NET_BIND_SERVICE
      - SETFCAP
      - SETGID
      - SETPCAP
      - SETUID
      - SYS_CHROOT

      # docker have these cap as default additonally
      - MKNOD
      # - NET_RAW
      - AUDIT_WRITE

      # additional required cap for warp
      - NET_ADMIN

是可以跑通的。
总结一下就是 podman 比 Docker 默认少了三个 CAP

其中 MKNOD, AUDIT_WRITE 是 warp-docker 需要的,NET_ADMIN 是两者默认都没有而 warp-docker 也需要。所以 Podman 用户应该使用这样的 CAP:

    cap_add:
      # Docker already have it, these are for podman users
      - MKNOD
      - AUDIT_WRITE
      # additional required cap for warp, both for podman and docker
      - NET_ADMIN

@bamboox @tony-sung 请你们在 docker-compose.yml 中加入 MKNODAUDIT_WRITE 再试一下(NET_ADMIN 也要保留),如果可以我就更新进代码里。

你是不是使用的rootful运行的container?我是用rootless仍然提示not permitted

啥意思,你的 docker/podman 守护进程是以 rootless mode 运行的?

@tony-sung
Copy link
Contributor

我做了以下的实验:

    cap_drop:
      - ALL
    cap_add:
      # defualt cap of podman 
      - CHOWN
      - DAC_OVERRIDE
      - FOWNER
      - FSETID
      - KILL
      - NET_BIND_SERVICE
      - SETFCAP
      - SETGID
      - SETPCAP
      - SETUID
      - SYS_CHROOT

      # docker have these cap as default additonally
      - MKNOD
      # - NET_RAW
      - AUDIT_WRITE

      # additional required cap for warp
      - NET_ADMIN

是可以跑通的。
总结一下就是 podman 比 Docker 默认少了三个 CAP

其中 MKNOD, AUDIT_WRITE 是 warp-docker 需要的,NET_ADMIN 是两者默认都没有而 warp-docker 也需要。所以 Podman 用户应该使用这样的 CAP:

    cap_add:
      # Docker already have it, these are for podman users
      - MKNOD
      - AUDIT_WRITE
      # additional required cap for warp, both for podman and docker
      - NET_ADMIN

@bamboox @tony-sung 请你们在 docker-compose.yml 中加入 MKNODAUDIT_WRITE 再试一下(NET_ADMIN 也要保留),如果可以我就更新进代码里。

你是不是使用的rootful运行的container?我是用rootless仍然提示not permitted

啥意思,你的 docker/podman 守护进程是以 rootless mode 运行的?

是的, 一般podman用户都是冲着rootless入的坑

@cmj2002 cmj2002 changed the title 启动报错 Podman 权限问题 Sep 24, 2024
@cmj2002
Copy link
Owner

cmj2002 commented Sep 24, 2024

@tony-sung 我已经合并了你的 PR,等 Action 构建完之后应该就可以用了。我之后会写一个关于 Podman 的 guidence,但是要等一个星期左右,我现在在赶一个论文的投稿 DDL。

@tony-sung
Copy link
Contributor

@tony-sung 我已经合并了你的 PR,等 Action 构建完之后应该就可以用了。我之后会写一个关于 Podman 的 guidence,但是要等一个星期左右,我现在在赶一个论文的投稿 DDL。

好的, 感谢, 我刚刚试了一下
在podman rootless 的状态下不使用特权--privileged
需要挂载tun--device=/dev/net/tun,添加cap NET_ADMIN--cap-add=NET_ADMIN
下面的podman rootless配置可供参考

podman run -d \
  --name warp \
  --label "io.containers.autoupdate=image" `# 启用podman自动更新` \
  --restart always \
  -p 1080:1080 \
  -e WARP_SLEEP=2 \
  --cap-add=NET_ADMIN \
  --device=/dev/net/tun \
  --sysctl net.ipv6.conf.all.disable_ipv6=0 \
  --sysctl net.ipv4.conf.all.src_valid_mark=1 \
  -v "$(pwd)"/.config/warp/data:/var/lib/cloudflare-warp \
  docker.io/caomingjun/warp:latest

@bamboox bamboox closed this as completed Sep 24, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants