Workaround for uid_map error on Ubuntu 24.04

Fri May 31 2024

Workaround for uid_map error on Ubuntu 24.04

更新到 Ubuntu 24.04 LTS 之后,我的 tun2proxy 就不能用了,准确来说,是普通用户无法通过 unshare 模式启动,报错 Operation not permitted

tun2proxy 会调用 unshare,可以用以下命令来测试 unshare 是否可以正常工作,我在容器内外均进行了测试,结果都是 Operation not permitted

unshare --user --map-current-user --net --mount --keep-caps --kill-child --fork cat /proc/self/uid_map

由于我的 tun2proxy 在容器里,我先检查了容器的各种权限

capsh --print

在对比了容器内和容器外的结果之后,我发现 Capabilities 并没有什么问题(想想也是,我的容器可是加了--privileged参数啊),所以容器应该不是导致问题的原因

我在本地的 Fedora 40 测试了一下,以及在 Fedora Toolbox 40 里进行了测试,也都没出现 Operation not permitted 的问题,又找了个 Debian 12 的服务器和 Ubuntu 22.04 LTS 的服务器测试,也都没有问题

检查了这台服务器上的/etc/shadow的权限和/etc/subuid /etc/subuid的权限和内容之后,也并未发现问题,创建新用户也不能解决问题,又发现容器内外的 root 用户都可以正常使用 unshare,于是我猜测是某些内核安全设置阻止了 unshare 调用

然后我就找到了这样一个 maillist

... I have needed this workaround to fix the error "Errno 1 Operation not permitted" when disable_network (from bitbake/lib/bb/utils.py) attempts to write to the file /proc/self/uid_map...

这里给出了原因和一个 workaround,以及 Ubuntu 的 Release Notes,至此已经破案

既然这是作为一个 Feature 发布的,那必然在之后也不会解决(唉,什么叫企业级发行版啊),那就只能关闭这个特性

echo "kernel.apparmor_restrict_unprivileged_userns=0" | sudo tee /etc/sysctl.d/60-apparmor-namespace.conf;
sudo systemctl reboot;

或者临时关闭

echo 0 | sudo tee /proc/sys/kernel/apparmor_restrict_unprivileged_userns;