Debian 自从 Debian10 后开始默认启用了 AppArmor,这是另外一个和
SELinux 类似的 MAC(Mandatory Access Control)
实现,但他有更容易被人类所接受的配置颗粒度,并且由社区开发,而且很容易关掉(不推荐你关掉)
在默认情况下 Debian 的 AppArmor
运行情况是不会干扰用户的正常操作的,但是在有些时候他会突然给你一拳告诉你你不能这样做,这样违反了约束。
好吧,我遇到了。在 Debian13 上如果不去新增 AppArmor 配置就会无法运行
Dockge 这个还挺不错的 Compose 管理器。
除此之外,还有 lscr.io/linuxserver/qbittorrent
这个容器也受到了影响——可能更多,但我没有继续测试。
初探
我们通过命令 dmesg | rg apparmor | rg denied
得到了输出
1 2 3 4 5 6
| [ 2661.149627] audit: type=1400 audit(1759760495.520:84): apparmor="DENIED" operation="create" class="net" info="failed protocol match" error=-13 profile="docker-default" pid=15527 comm="node" family="unix" sock_type="stream" protocol=0 requested="create" denied="create" addr=none [ 2674.109757] audit: type=1400 audit(1759760508.479:85): apparmor="DENIED" operation="create" class="net" info="failed protocol match" error=-13 profile="docker-default" pid=15712 comm="node" family="unix" sock_type="stream" protocol=0 requested="create" denied="create" addr=none [ 2699.872327] audit: type=1400 audit(1759760534.241:86): apparmor="DENIED" operation="create" class="net" info="failed protocol match" error=-13 profile="docker-default" pid=15897 comm="node" family="unix" sock_type="stream" protocol=0 requested="create" denied="create" addr=none [ 2751.237225] audit: type=1400 audit(1759760585.607:87): apparmor="DENIED" operation="create" class="net" info="failed protocol match" error=-13 profile="docker-default" pid=16081 comm="node" family="unix" sock_type="stream" protocol=0 requested="create" denied="create" addr=none [ 2811.399220] audit: type=1400 audit(1759760645.767:88): apparmor="DENIED" operation="create" class="net" info="failed protocol match" error=-13 profile="docker-default" pid=16269 comm="node" family="unix" sock_type="stream" protocol=0 requested="create" denied="create" addr=none [ 2871.560585] audit: type=1400 audit(1759760705.928:89): apparmor="DENIED" operation="create" class="net" info="failed protocol match" error=-13 profile="docker-default" pid=16472 comm="node" family="unix" sock_type="stream" protocol=0 requested="create" denied="create" addr=none
|
接下来诡异的事情来了:我没有在任何地方发现任何一个叫作
docker-default
的配置文件,完全不存在于标准的
/etc/apparmor.d/
中:
1 2
| ➜ dockge ls /etc/apparmor.d/ | rg docker ➜ dockge
|
怎么办?
再探
我觉得这个问题的关键词应该是 Docker
,
AppArmor
。于是我的第一反应是像 GPT
求助——很可惜它没有给我预期响应。
于是我直接使用搜索引擎进行搜索,第一项便是如下链接:
很好,这就是我想要的。但也不完全是,因为这里面没有说解决方案,相反给了个巨复杂的文件
再做搜寻,我看到了这个
他的解决方案是想办法让 Docker 不再动态生成
docker-default
这个配置。我觉得这个已经很接近我想要的答案了,但我觉得不够完美
终曲
我们现在得到了两个方案:
- 调整 Docker 的安全配置
- 关闭 AppArmor 对于 Docker 的管控
调整 Docker 的安全配置
我这里列出 compose.yml (也就是 docker-compose.yml
的高版本别名)中如何调整相关设定:
在修改之前:
1 2 3 4 5 6 7 8 9 10 11 12 13
| services: dockge: image: louislam/dockge:nightly restart: unless-stopped ports: - 5001:5001 volumes: - ./data:/app/data - /pool/striping/dockge/stacks:/pool/striping/dockge/stacks - /var/run/docker.sock:/var/run/docker.sock environment: - DOCKGE_ENABLE_CONSOLE=true - DOCKGE_STACKS_DIR=/pool/striping/dockge/stacks
|
在修改之后,请注意新添加的 security_opt
字段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| services: dockge: image: louislam/dockge:nightly restart: unless-stopped ports: - 5001:5001 volumes: - ./data:/app/data - /pool/striping/dockge/stacks:/pool/striping/dockge/stacks - /var/run/docker.sock:/var/run/docker.sock environment: - DOCKGE_ENABLE_CONSOLE=true - DOCKGE_STACKS_DIR=/pool/striping/dockge/stacks security_opt: - apparmor:unconfined
|
关闭 AppArmor 对于 Docker
的管控
TODO