问题描述
我们正在尝试在正在运行的容器中挂载 luster 文件系统,并且已经通过以特权模式运行的容器成功地做到了这一点。
然而,对于那些在非特权模式下运行的容器,即使 linux 提供的所有功能 -- tens of capabilities -- 都包括在内,安装 luster 失败了!
然后
- “priviledged: True”和“cap_add: all capabilites”有什么区别?
- 为什么将所有功能都添加到容器中后,安装 luster 仍然失败?
非特权模式容器:
version: "3"
services:
aiart:
cap_add:
- AUDIT_CONTROL
- AUDIT_READ
- AUDIT_WRITE
- BLOCK_SUSPEND
- CHOWN
- DAC_OVERRIDE
- DAC_READ_SEARCH
- FOWNER
- FSETID
- IPC_LOCK
- IPC_OWNER
- KILL
- LEASE
- LINUX_IMMUTABLE
- MAC_ADMIN
- MAC_OVERRIDE
- MKNOD
- NET_ADMIN
- NET_BIND_SERVICE
- NET_BROADCAST
- NET_RAW
- SETGID
- SETFCAP
- SETPCAP
- SETUID
- SYS_ADMIN
- SYS_BOOT
- SYS_CHROOT
- SYS_MODULE
- SYS_NICE
- SYS_PACCT
- SYS_PTRACE
- SYS_RAWIO
- SYS_RESOURCE
- SYS_TIME
- SYS_TTY_CONFIG
- SYSLOG
- WAKE_ALARM
image: test_lustre:1.1
#privileged: true
ports:
- "12345:12345"
volumes:
- /home/wallace/test-lustre/docker/lustre-client:/lustre/lustre-client
解决方法
你试过 apparmor:unconfined 吗?
version: "3"
services:
aiart:
cap_add:
- SYS_ADMIN
image: test_lustre:1.1
security_opt:
- apparmor:unconfined
ports:
- "12345:12345"
volumes:
- /home/wallace/test-lustre/docker/lustre-client:/lustre/lustre-client
如果这可行,那么尝试编写适合您需求的自定义 apparmor 配置文件,因为我猜 unconfined 的安全性较低:https://docs.docker.com/engine/security/apparmor/
,--privileged
和 all-capabilities
的不同之处在于,--privileged
参数消除了 cgroup 控制器强制执行的所有限制,并在为所有设备提供访问权限的同时禁用了安全附魔。特权容器真正成为主机操作系统的一部分,甚至可以访问可能不应用的 AppArmor 和 SELinux 配置,例如 SELinux 标签。
当使用 --privileged
标志时,它不会对底层容器强制实施任何额外的安全性,并且内核文件系统不会以只读方式挂载到容器中。 SECCOMP 过滤也被禁用。尽管如此,您无法获得比当前命名空间允许的更多功能,例如,如果您正在运行无根守护进程。
Capabilities 是调整 root 权限的一种方式,但在执行容器时仍然会应用一些安全附魔。
中提供了 Red Hat 的一篇精彩博文正如其他答案中所指出的,在这种情况下,AppArmor 可能是问题所在,通过在运行容器时使用 --security-opt apparmor:unconfined
标志,可能会进行挂载。但是,这应该只是暂时使用。