Docker容器运行时权限和Linux系统功能

简介: Docker容器运行时权限和Linux系统功能相关Docker参数--cap-add: Add Linux capabilities--cap-drop: Drop Linux capabilities--privileged=false: Give extended privileges...

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参数后,容器内的进程默认将获得这些设备的readwritemknod权限。您也可以为每个--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

原文档链接: https://docs.docker.com/engine/reference/run/

相关文章
|
9月前
|
Linux iOS开发 Docker
MyEMS开源系统安装之Linux/macOS上的DOcker
本指南详细介绍了如何在Linux/macOS上使用Docker部署MyEMS系统。主要内容包括:前置条件(如安装Docker、npm和MySQL),以及分步骤部署各个组件(如myems-api、myems-admin、myems-modbus-tcp等)。每个步骤涵盖源代码复制、环境配置、镜像构建、容器运行及日志管理等操作,并提供了多平台构建的支持。最后,指南还说明了默认端口和登录凭据,帮助用户快速启动并访问MyEMS的管理界面和Web界面。
306 1
|
8月前
|
监控 Linux 开发者
理解Linux操作系统内核中物理设备驱动(phy driver)的功能。
综合来看,物理设备驱动在Linux系统中的作用是至关重要的,它通过与硬件设备的紧密配合,为上层应用提供稳定可靠的通信基础设施。开发一款优秀的物理设备驱动需要开发者具备深厚的硬件知识、熟练的编程技能以及对Linux内核架构的深入理解,以确保驱动程序能在不同的硬件平台和网络条件下都能提供最优的性能。
453 0
|
11月前
|
关系型数据库 MySQL Linux
在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾
以上就是在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾的步骤。这个过程就像是一场接力赛,数据从MySQL数据库中接力棒一样传递到备份文件,再从备份文件传递到其他服务器,最后再传递回MySQL数据库。这样,即使在灾难发生时,我们也可以快速恢复数据,保证业务的正常运行。
514 28
|
监控 关系型数据库 MySQL
zabbix7.0.9安装-以宝塔安装形式-非docker容器安装方法-系统采用AlmaLinux9系统-最佳匹配操作系统提供稳定运行环境-安装教程完整版本-优雅草卓伊凡
zabbix7.0.9安装-以宝塔安装形式-非docker容器安装方法-系统采用AlmaLinux9系统-最佳匹配操作系统提供稳定运行环境-安装教程完整版本-优雅草卓伊凡
906 30
|
11月前
|
Ubuntu 关系型数据库 MySQL
在Ubuntu系统的Docker上安装MySQL的方法
以上的步骤就是在Ubuntu系统的Docker上安装MySQL的详细方法,希望对你有所帮助!
1158 12
|
Linux 网络安全 虚拟化
linux怎么把文件传到docker里面
在现代应用开发中,Docker作为流行的虚拟化工具,广泛应用于微服务架构。文件传输到Docker容器是常见需求。常用方法包括:1) `docker cp`命令直接复制文件;2) 使用`-v`选项挂载宿主机目录,实现数据持久化和实时同步;3) 通过SCP/FTP协议传输文件;4) 在Dockerfile中构建镜像时添加文件。选择合适的方法并确保网络安全是关键。
1465 1
|
Linux 虚拟化 Docker
Linux服务器部署docker windows
在当今软件开发中,Docker成为流行的虚拟化技术,支持在Linux服务器上运行Windows容器。流程包括:1) 安装Docker;2) 配置支持Windows容器;3) 获取Windows镜像;4) 运行Windows容器;5) 验证容器状态。通过这些步骤,你可以在Linux环境中顺利部署和管理Windows应用,提高开发和运维效率。
1988 1
|
Ubuntu Linux Docker
如何在Ubuntu 20.04系统中安装Docker
安装 Docker 引擎的步骤如下:首先更新系统包索引 (`sudo apt update`),安装必要依赖包 (`apt-transport-https` 等),添加 Docker 官方 GPG 密钥及 APT 仓库。接着再次更新包索引并安装 Docker 引擎及相关工具 (`docker-ce` 等)。最后启动 Docker 服务并设置开机自启,通过 `docker --version` 和运行测试容器 (`sudo docker run hello-world`) 验证安装是否成功。
4748 0
|
7月前
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
1082 108