Docker容器运行时权限和Linux系统功能
Docker容器运行时权限和Linux系统功能
相关Docker参数
--cap-add: Add Linux capabilities --cap-drop: Drop Linux capabilities --privileged=false: Give extended privileges to this container --device=[]: Allows you to run devices inside the container without the --privileged flag.
出于容器之间和容器与宿主机的安全隔离保护,在默认的Docker配置下,Docker容器是没有系统权限的。例如不能在一个Docker容器内,再运行一个Dokcer服务(译者注:或者在容器内修改系统时间)。这是因为在默认情况下,容器内的进程不允许访问任何宿主机上的设备。只有获得设备访问授权的容器,才可以访问所有设备(请参阅关于cgroups设备的文档)。
当容器管理员执行docker run --privileged
时,将允许Docker容器访问宿主机上的所有设备,并在AppArmor或SELinux中设置一些配置,使容器内的进程可以与容器外运行的进程几乎一样权限来访问宿主机。(有关运行--privileged
参数的更多信息,请访问Docker博客。)
如果想限制对特定设备的访问,可以使用--device
参数。它允许您指定从容器内访问的一个或多个设备。
$ docker run --device=/dev/snd:/dev/snd ...
开启--device
参数后,容器内的进程默认将获得这些设备的read
、write
和mknod
权限。您也可以为每个--device
参数,附加第三个:rwm
选项来覆盖默认的设置:
$ docker run --device=/dev/sda:/dev/xvdc --rm -it ubuntu fdisk /dev/xvdc Command (m for help): q $ docker run --device=/dev/sda:/dev/xvdc:r --rm -it ubuntu fdisk /dev/xvdc You will not be able to write the partition table. Command (m for help): q $ docker run --device=/dev/sda:/dev/xvdc:w --rm -it ubuntu fdisk /dev/xvdc crash.... $ docker run --device=/dev/sda:/dev/xvdc:m --rm -it ubuntu fdisk /dev/xvdc fdisk: unable to open /dev/xvdc: Operation not permitted
除了 --privileged
之外,操作员还可以使用--cap-add
和--cap-drop
对功能进行细粒度控制。默认情况下,Docker有一个保留的默认功能列表。
下表列出了Linux功能选项,这些选项是默认允许的,可以删除。
功能项 | 功能描述 |
---|---|
SETPCAP | 修改进程的权限 |
MKNOD | 使用mknod(2)创建特殊文件 |
AUDIT_WRITE | 将记录写入内核审计日志 |
CHOWN | 任意更改文件UIDs和GIDs(见chown(2)) |
NET_RAW | 使用 RAW 和 PACKET 套接字 |
DAC_OVERRIDE | 绕过文件的读、写和执行权限检查 |
FOWNER | 绕过对进程的文件系统UID与文件的UID进行权限匹配的检查操作 |
FSETID | 当文件被修改时,不要清除set-user-ID和set-group-ID权限位 |
KILL | 绕过发送信号的权限检查 |
SETGID | 自定义处理进程GID和补充GID列表 |
SETUID | 自定义处理进程UID |
NET_BIND_SERVICE | 将套接字绑定到互联网域名专用端口(端口号小于1024)。 |
SYS_CHROOT | 使用chroot(2),更改根目录 |
SETFCAP | 设置文件功能 |
下表显示了默认情况下未授予的功能,可以手动添加这些功能。
功能项 | 功能描述 |
---|---|
SYS_MODULE | 加载和卸载内核模块 |
SYS_RAWIO | 执行I / O端口操作(iopl(2)和ioperm(2)) |
SYS_PACCT | 使用acct(2),打开或关闭进程计数 |
SYS_ADMIN | 执行一系列系统管理操作 |
SYS_NICE | 提高进程的nice值(nice(2),setpriority(2))并更改任意进程的nice值 |
SYS_RESOURCE | 覆盖资源限制 |
SYS_TIME | 设置系统时钟(settimeofday(2),stime(2),adjtimex(2)); 设置实时(硬件)时钟 |
SYS_TTY_CONFIG | 使用vhangup(2); 在虚拟终端上使用各种特权的ioctl(2)操作 |
AUDIT_CONTROL | 启用和禁用内核审核; 更改审核过滤器规则; 检索审核状态和过滤规则 |
MAC_ADMIN | 允许MAC配置或状态更改。 为Smack LSM而实现的功能 |
MAC_OVERRIDE | 覆盖强制访问控制(MAC)。 为Smack Linux安全模块(LSM)实现 |
NET_ADMIN | 执行各种与网络相关的操作 |
SYSLOG | 执行syslog(2)的权限操作。 |
DAC_READ_SEARCH | 绕过文件读取权限检查以及目录读取和执行权限检查 |
LINUX_IMMUTABLE | 设置FS_APPEND_FL和FS_IMMUTABLE_FL i-node 标志 |
NET_BROADCAST | 使套接字可以实现广播,并监听广播包 |
IPC_LOCK | 锁定内存(mlock(2),mlockall(2),mmap(2),shmctl(2)) |
IPC_OWNER | 绕过对System V IPC对象操作的权限检查 |
SYS_PTRACE | 使用ptrace(2)跟踪任意进程 |
SYS_BOOT | 使用reboot(2)和kexec_load(2),重新引导并加载新内核以供程序执行 |
LEASE | 在任意文件上建立Lease租约(请参阅fcntl(2)) |
WAKE_ALARM | 触发唤醒系统的操作 |
BLOCK_SUSPEND | 开启可以阻止系统挂起的功能 |
更多的参考信息可以在 capabilities(7) - Linux man page Linux手册页中找到
--cap-add --cap-drop
两个参数都支持值ALL
,所以如果Docker管理员想要获得除了MKNOD
以外的所有Linux功能,可以使用:
$ docker run --cap-add=ALL --cap-drop=MKNOD ...
如果想与系统的网络堆栈进行交互,应该使用--cap-add=NET_ADMIN
来修改网络接口,而不是使用--privileged
。
$ docker run -it --rm ubuntu:14.04 ip link add dummy0 type dummy RTNETLINK answers: Operation not permitted $ docker run -it --rm --cap-add=NET_ADMIN ubuntu:14.04 ip link add dummy0 type dummy
要安装一个基于FUSE的文件系统,您需要结合--cap-add
和--device
:
$ docker run --rm -it --cap-add SYS_ADMIN sshfs sshfs sven@10.10.10.20:/home/sven /mnt fuse: failed to open /dev/fuse: Operation not permitted $ docker run --rm -it --device /dev/fuse sshfs sshfs sven@10.10.10.20:/home/sven /mnt fusermount: mount failed: Operation not permitted $ docker run --rm -it --cap-add SYS_ADMIN --device /dev/fuse sshfs # sshfs sven@10.10.10.20:/home/sven /mnt The authenticity of host '10.10.10.20 (10.10.10.20)' can't be established. ECDSA key fingerprint is 25:34:85:75:25:b0:17:46:05:19:04:93:b5:dd:5f:c6. Are you sure you want to continue connecting (yes/no)? yes sven@10.10.10.20's password: root@30aa0cfaf1b5:/# ls -la /mnt/src/docker total 1516 drwxrwxr-x 1 1000 1000 4096 Dec 4 06:08 . drwxrwxr-x 1 1000 1000 4096 Dec 4 11:46 .. -rw-rw-r-- 1 1000 1000 16 Oct 8 00:09 .dockerignore -rwxrwxr-x 1 1000 1000 464 Oct 8 00:09 .drone.yml drwxrwxr-x 1 1000 1000 4096 Dec 4 06:11 .git -rw-rw-r-- 1 1000 1000 461 Dec 4 06:08 .gitignore ....
默认的seccomp配置文件将根据所选的功能进行调整,以允许使用功能所允许的功能,所以从Docker1.12之后的版本,不应该对此进行调整。在Docker 1.10和1.11中没有这种情况,在添加功能时可能需要使用一个自定义的seccomp配置文件或使用--security-opt seccomp=unconfined
。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
加量不加价的突发实例t5 baseline上手评测
什么是突发实例传统云服务当用户购买ECS之后,拥有CPU 100%的资源使用权,但是对大部分应用场景比如压力测试,嵌入式交叉编译服务器,web应用服务器等应用场景来说,仅在特定的一段时间,CPU占用可能会比较高,这种情况下,就可以选择突发实例。突发实例价格降低很多的同时,将CPU20%左右的资源作为基准,低于的时候计算积分,超过的时候扣分。 突发实例够用吗只要用户购买前评估业务平峰期和高峰期的实例性能需求,至少选择基准性能满足平峰期需求的实例规格,选择得当可以在满足整体性能需求的同时节省非常多的服务器成本。在售的突发性能实例规格族有t5、t6,详细信息请参见突发性能实例规格族t5和突发性能实例规格族t6。 以t5为例评测一下突发实例性能 购买打开阿里云官网进入ECS服务器购买页面,选择入门级(共享)型设备,然后选择突发性能实例t5, 1C2G设备,可以看到基准CPU使用率已经由10%提高到20%安装初始镜像如果选择普通板的系统镜像,需要安装nginx mysql php等web环境时,如果选择源码编译,可以看到CPU占用率持续飙高。凌晨0:47分第一次接近100%大概持续了40分钟,在...
- 下一篇
JAVA架构网站安全漏洞渗透测试检测手法
近期对平台安全渗透测试中遇到有JAVA+mysql架构的网站,针对此架构我们安全渗透工程师整理了下具体的漏洞检测方法和防护修复方法,很多像执行框架漏洞获取到系统权限,以及跨权限写入木马后门等等操作,希望大家在渗透测试的道路中发现更多的知识和经验。 4.2.1. 格式化字符串 在Python中,有两种格式化字符串的方式,在Python2的较低版本中,格式化字符串的方式为 "this is a %s" % "test" ,之后增加了format的方式, 语法为 "this is a {}".format('test') 或者 "this is a {test}".format(test='test') 当格式化字符串由用户输入时,则可能会造成一些问题,下面是一个最简单的例子 'class of {0} is {0.__class__}'.format(42) "class of 42 is " 从上面这个简单的例子不难知道,当我们可以控制要format的字符串时,则可以使用 init / globals 等属性读取一些比较敏感的值,甚至任意执行代码。 4.2.2. 反序列化 4.2.2.1...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS8编译安装MySQL8.0.19
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7