最后更新于
最后更新于
当您将容器以特权模式运行时,您将禁用以下保护措施:
在特权容器中,所有设备都可以在/dev/
中访问。 因此,您可以通过挂载主机的磁盘来逃逸。
内核文件系统提供了一个机制,允许进程修改内核的行为。然而,对于容器进程,我们希望阻止它们对内核进行任何更改。因此,我们在容器内将内核文件系统挂载为只读,确保容器进程无法修改内核。
/proc 文件系统是可选择性可写的,但为了安全起见,某些部分被用 tmpfs 遮蔽,确保容器进程无法访问敏感区域。
tmpfs 是一个将所有文件存储在虚拟内存中的文件系统。tmpfs 不会在硬盘上创建任何文件。因此,如果卸载 tmpfs 文件系统,其中存储的所有文件将永远丢失。
容器引擎默认以有限数量的功能启动容器,以控制容器内部的操作。特权容器具有所有可访问的功能。要了解有关功能的信息,请阅读:
此外,请注意,当Docker(或其他CRIs)在Kubernetes集群中使用时,默认情况下会禁用seccomp过滤器。
AppArmor是一个内核增强功能,用于将容器限制在一组有限的资源上,并使用每个程序的配置文件。当您使用--privileged
标志运行时,此保护将被禁用。
使用 --privileged
标志运行容器会禁用 SELinux 标签,导致容器继承容器引擎的标签,通常为 unconfined
,从而获得类似容器引擎的完全访问权限。在非 root 模式下,使用 container_runtime_t
,而在 root 模式下,则应用 spc_t
。
命名空间不受--privileged
标志的影响。尽管它们没有启用安全约束,例如,它们不会看到系统上的所有进程或主机网络。用户可以通过使用**--pid=host
、--net=host
、--ipc=host
、--uts=host
**容器引擎标志来禁用单个命名空间。
```bash # docker run --rm --privileged --pid=host -it alpine sh ps -ef PID USER TIME COMMAND 1 root 0:03 /sbin/init 2 root 0:00 [kthreadd] 3 root 0:00 [rcu_gp]ount | grep /proc.*tmpfs [...] ``` ### 用户命名空间
默认情况下,容器引擎不使用用户命名空间,除非是用于无根容器,后者需要它们来进行文件系统挂载和使用多个UID。用户命名空间对于无根容器至关重要,无法禁用,并通过限制特权显著增强安全性。