转载自:https://sq.163yun.com/blog/article/178222638887047168

背景

容器运行在宿主机上的时候,很多权限是被控制的,容器原理上是使用cgroup、namespace等对宿主机的资源进行隔离并且调度使用,因此对宿主机有一定的侵入性。权限控制可以一定程度上保证宿主机不被侵入。然而保证安全性的同时也会将用户在容器中的一些权限给屏蔽掉,例如默认的容器权限是不允许做mount操作、swapon操作等。如果想使用这些权限甚至其他更高级别的权限该如何解决呢?linux操作系统中自带的capabilities内的一些功能就可以完成更高的权限赋予。

CAPABILITIES的SYS_ADMIN介绍

CAP_SYS_ADMIN功能,是CAPABILITIES内众多参数中提供系统管理员操作的一个配置项。 官网介绍如下: 它可以提供以下权限:

1.多个系统管理员的命令的权限,例如 quotactl(2), mount(2), umount(2), swapon(2),setdomainname(2)等。
2.特权syslog操作。
3.执行VM86_REQUEST_IRQ vm86命令。
4.对系统的IPC对象执行IPC_SET and IPC_RMID操作。
5.覆盖RLIMIT_NPROC 资源限制。
6.执行XATTR对信任安全模块进行额外的属性操作。
7.使用lookup_dcookie
8.使用ioprio_set给IOPRIO_CLASS_RT赋值。
9.通过socket认证时伪造PID。
10.操作/proc/sys/fs/file-max,修改全系统范围内的打开文件个数限制。例如使用 accept(2), execve(2), open(2), pipe(2)方式打开文件。
11.在创建新namespace的时候应用CLONE_*标签。
12.调用 perf_event_open(2)
13.获取特权perf事件消息。
14.调用 setns(2)。
15.调用fanotify_init(2)。
16.调用bpf。
17.执行特权 KEYCTL_CHOWN和KEYCTL_SETPERM 等操作。
18.使用ptrace做一些跟踪dump的操作。
19.进行madvise操作。
20.应用ioctl来插入字符到终端。
21.应用nfsservctl系统调用。
22.应用bdflush系统调用。
23.执行特权块设备ioctl。
24.执行特权文件系统ioctl。
25.执行对/dev/random设备的特权ioctl。
26.在多个设备驱动上执行管理员操作。

kubenetes给pod赋予SYS_ADMIN权限

linux原生提供的SYS_ADMIN权限如何应用于容器中的,首先需要kubenetes在pod级别带入这个信息,在pod的描述文件中添加securityContext字段的描述,并且将SYS_ADMIN的带入。 例如:

 "securityContext": {
                    "capabilities": {
                        "add": [
                            "SYS_ADMIN"
                               ]
                                    }
                    }

同时容器的描述信息中也需要加入另外一个描述字段CapAdd

容器赋予SYS_ADMIN权限

容器描述文件中CapAdd属性的添加赋值:

          "CapAdd": [
                "SYS_ADMIN"
            ],

这样的话容器在自动被kubelet拉起的时候就会带入一个参数

        docker run --cap-add=SYS_ADMIN

这样容器内部就被赋予linux下的SYS_ADMIN权限了。 对比没有赋权限的容器和赋了SYS_ADMIN权限的容器的操作差别:

无SYS_ADMIN权限下执行mount命令:

有SYS_ADMIN权限下执行mount命令:

可以看出来赋值SYS_ADMIN的就可以执行SYS_ADMIN提供的mount的特权操作。

总结

特权操作有利有弊,安全和权限就像熊掌和鱼一样不可兼得,如何在确保容器与宿主机之间的隔离安全的情况下又给予容器较大的权限,仍然是一个需要不断探索的命题。

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐