rootless container
rootless container中的”rootless”不仅仅指容器中以非root用户来运行进程,还指以非root用户来创建容器,管理容器。也就是说,启动容器的时候,是以非root用户来执行的。
k8s中使用
- Kubernetes 中要使用的话可以使用
SecurityContext
来进行配置
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
securityContext:
privileged: true
- 准入控制不允许特权模式的 Pod
PodSecurityPolicy
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: example
spec:
privileged: false # 禁止特权模式
默认情况下容器中的root用户拥有不完整的root权限,但如果docker/nerdctl run –privileged 就真正的给这个用户赋予了和host主机root用户的特权,容器ID 0的用户直接映射到主机的ID 0的用户。
docker run -t -i --rm ubuntu bash
root@bc338942ef20:/# mount -t tmpfs none /mnt
mount: permission denied
这是因为默认情况下,Docker会丢弃大多数潜在危险的capabilities
,包括 CAP_SYS_ADMIN
(用于挂载文件系统所需的特权)。然而,--privileged
标志允许容器运行这些操作:
$ docker run -t -i --privileged ubuntu bash
root@50e3f57e16e6:/# mount -t tmpfs none /mnt
root@50e3f57e16e6:/# df -h
Filesystem Size Used Avail Use% Mounted on
none 1.9G 0 1.9G 0% /mnt
--privileged
标志为容器提供了all capabilities
,并且解除了 device
cgroup 控制器所施加的所有限制。换句话说,容器几乎可以执行主机可以执行的所有操作。该标志的存在是为了允许特殊的用例,比如在容器内运行 Docker。
- Linux capabilities(Linux特权)是一种细粒度的权限控制机制,用于在Linux系统中对进程进行权限管理。传统的Unix权限模型中,进程要么以root用户身份运行,拥有完全的系统权限,要么以普通用户身份运行,只能访问受限资源。而Linux capabilities则允许进程以更细粒度的方式获取和管理权限,使得进程可以在不以root用户身份运行的情况下执行一些特定的特权操作。
- Linux capabilities机制通过将权限细分为多个独立的特权集合来实现。每个特权集合被称为一个capability,并赋予了特定的权限。例如,有一个CAP_NET_ADMIN capability用于管理网络配置,一个CAP_SYS_ADMIN capability用于管理系统配置,等等。进程可以通过在其可执行文件上设置相应的capability标志来获取特定的权限。
- 使用Linux capabilities,管理员可以将特定的权限授予某个程序,而无需将其完全提升为root用户。这样可以提高系统的安全性,因为进程只能获取它们真正需要的权限,而不是完全的系统权限。