docker 运行时权限和 Linux 能力了解

文档参考:

https://docs.docker.com/engine/containers/run/#runtime-privilege-and-linux-capabilities

https://docs.docker.com/reference/cli/docker/container/run/#privileged

本片主要了解容器在运行时如何赋予的格外的权限,默认情况下,Docker 容器是"非特权"的,无法,对于 示例,在 Docker 容器内运行 Docker 守护进程。这是因为 默认情况下,容器不允许访问任何设备,但可以 特权容器被授予访问所有设备的权限

docker run 选项:

  • --cap-add 添加 Linux 功能
  • --cap-drop 丢弃 Linux 权限
  • --privileged 给此容器赋予扩展权限
  • --device=[] 允许您在容器内运行设备而不需要使用 --privileged 标志。

一、privileged 权限

使用 --privileged 标志将所有权限赋予容器。当操作员执行 docker run --privileged 时,Docker 将启用对主机上所有设备的访问,并重新配置 AppArmor 或 SELinux 以允许容器几乎与主机上运行在容器外的进程相同的访问权限。

--privileged 标志给容器以下权限:

  • 启用所有 Linux 内核功能
  • 禁用默认的 seccomp 配置文件
  • 禁用默认的 AppArmor 配置文件
  • 禁用 SELinux 进程标签
  • 允许访问所有主机设备
  • 使 /sys 可读写
  • 使 cgroups 挂载可读写

seccomp(Secure Computing Mode) 是 Linux 内核的一种安全机制,用于限制进程可以调用的系统调用集,本质上是linux系统调用的防火墙。
AppArmor(Application Armor)是一个 Linux 内核安全模块,它提供强制访问控制(MAC,Mandatory Access Control)功能。AppArmor 通过定义安全策略来限制程序可以访问的资源,从而增强系统的安全性。它是一种轻量级、灵活且易于配置的强制访问控制系统,旨在保护系统免受恶意软件和攻击者的侵害。

使 /sys 可读写 意味这容器可以获取主机以下权限:

  1. 读取系统信息:用户空间程序可以读取 /sys 中的文件来获取关于系统硬件、驱动程序状态、内核参数等信息。
  2. 修改系统设置:用户空间程序可以写入 /sys 中的文件来改变系统的运行时参数,例如调整 CPU 频率、设置电源管理策略、配置网络设备等。
  3. 设备控制:对于某些设备,/sys 文件系统提供了控制接口,允许用户空间程序直接控制硬件设备的行为。

使 cgroups 挂载可读写意味着赋予容器对宿主机 cgroups 文件系统的访问权限,这将允许容器内的进程对 cgroups 进行读取和修改操作。具体来说,这可能包括:

  1. 读取系统信息:容器可以读取 cgroups 中的文件来获取关于系统资源使用情况的信息,例如 CPU、内存、磁盘 I/O 等。
  2. 修改系统设置:容器可以写入 cgroups 中的文件来改变系统的运行时参数,例如调整 CPU 频率、设置内存限制、配置网络设备等
  3. 设备控制:对于某些设备,cgroups 文件系统提供了控制接口,允许用户空间程序直接控制硬件设备的行为

二、device 权限

如果您想限制对特定设备或设备的访问,可以使用 --device 标志。这允许您指定一个或多个,在容器内可访问的设备。

例如:

复制代码
docker run --device=/dev/snd:/dev/snc

这将把宿主机的/dev/snd设备映射到容器/dev/snc,如果不指定容器的设备名,默认会创建跟宿主机一样的设备名。如果想要指定将宿主机多个设备映射到容器中,可以指定多个--device,例如:

复制代码
docker run --device=/dev/snd --device=/dev/snc ...

你还可以指定映射到容器中的设备的权限,权限有 读取、写入和 mknod,可以使用rwm代替。

mknod 权限允许容器内的进程创建新的设备文件。这是一项强大的权限,因为它可以允许容器内的进程创建新的设备节点,这可能会影响宿主机的设备访问和系统安全性。

例如:

复制代码
docker run --device=/dev/snd:/dev/snd:rwm

三、 cap-add 向容器追加权限,cap-drop 删除容器权限。

cap-addcap-drop 可以更加精细的控制容器的权限,如果直接使用privileged 将直接覆盖cap-add=ALL 的所有权限。

默认情况下,Docker 保留了一个默认的能力列表。下表列出了默认允许并可删除的 Linux 能力选项。

支持 docker run --cap-drop=ALL 卸载所有权限或者 docker run --cap-drop=ALL --cap-add=SETFCAP 保留SETFCAP权限。

功能键 功能描述
AUDIT_WRITE 将记录写入内核审计日志。
CHOWN 随意更改文件的所有者和组 ID(参见 chown(2))。
DAC_OVERRIDE 跳过文件读、写、执行权限检查。
FOWNER 跳过对通常需要进程文件系统 UID 与文件 UID 匹配的操作的权限检查。
FSETID 当文件被修改时,不要清除设置用户 ID 和设置组 ID 权限位。
KILL 跳过发送信号的权限检查。
MKNOD 使用 mknod(2)创建特殊文件。
NET_BIND_SERVICE 将套接字绑定到互联网域的特权端口(端口号小于1024)。
NET_RAW 使用 RAW 和 PACKET 套接字。
SETFCAP 设置文件权限。
SETGID 进行进程 GID 和补充 GID 列表的任意操作。
SETPCAP 修改进程能力。
SETUID 对进程 UID 进行任意操作。
SYS_CHROOT 使用 chroot(2),更改根目录。

下表显示了默认未授权且可能添加的功能。

支持 docker run --cap-add=ALL 添加以下所有权限或者 docker run --cap-add=ALL --cap-drop=MKNOD 除了MKNOD

功能键 功能描述
AUDIT_CONTROL 启用和禁用内核审计;更改审计过滤器规则;检索审计状态和过滤规则。
AUDIT_READ 允许通过多播 netlink 套接字读取审计日志。
BLOCK_SUSPEND 允许防止系统挂起。
BPF 允许创建 BPF 映射、加载 BPF 类型格式(BTF)数据、检索 BPF 程序的 JIT 代码等。
CHECKPOINT_RESTORE 允许检查点/恢复相关操作。自内核 5.9 版本引入。
DAC_READ_SEARCH 绕过文件读取权限检查和目录读取执行权限检查。
IPC_LOCK 锁定内存(mlock(2)、mlockall(2)、mmap(2)、shmctl(2))。
IPC_OWNER 绕过对 System V IPC 对象操作的权限检查。
LEASE 在任意文件上建立租约(参见 fcntl(2))。
LINUX_IMMUTABLE 设置 FS_APPEND_FL 和 FS_IMMUTABLE_FL i 节点标志。
MAC_ADMIN 允许 MAC 配置或状态更改。为 Smack LSM 实现。
MAC_OVERRIDE 覆盖强制访问控制(MAC)。为 Smack Linux 安全模块(LSM)实现。
NET_ADMIN 执行各种网络相关操作。
NET_BROADCAST 进行套接字广播,并监听多播。
PERFMON 允许使用 perf_events、i915_perf 和其他内核子系统执行系统性能和可观测性特权操作
SYS_ADMIN 执行一系列系统管理操作。
SYS_BOOT 使用 reboot(2) 和 kexec_load(2),重启并加载新的内核以供后续执行
SYS_MODULE 加载和卸载内核模块。
SYS_NICE 提高进程优先级(nice(2),setpriority(2))并更改任意进程的优先级。
SYS_PACCT 使用 acct(2),开启或关闭进程会计。
SYS_PTRACE 使用 ptrace(2)跟踪任意进程。
SYS_RAWIO 执行 I/O 端口操作(iopl(2)和 ioperm(2))。
SYS_RESOURCE 覆盖资源限制。
SYS_TIME 设置系统时钟(settimeofday(2),stime(2),adjtimex(2));设置实时(硬件)时钟。
SYS_TTY_CONFIG 使用 vhangup(2);在虚拟终端上使用各种特权 ioctl(2)操作。
SYSLOG 执行特权 syslog(2)操作。
WAKE_ALARM 触发某个将唤醒系统的事件。
相关推荐
wb1891 小时前
Linux远程连接服务
linux·运维·服务器·笔记
Jerry&Louis1 小时前
【Ubuntu】Waydroid-Linux安卓模拟器安装
linux·ubuntu
yangpan0111 小时前
ubuntu 24.04安装ros1 noetic
linux·运维·ubuntu
星卯教育tony1 小时前
ubuntu 20.04 更改国内镜像源-阿里源 确保可用
linux·运维·ubuntu
卡戎-caryon2 小时前
【C++】15.并发支持库
java·linux·开发语言·c++·多线程
青春不流名2 小时前
安装nerdctl和buildkitd脚本命令
容器
weixin_434255612 小时前
命令行快速上传文件到SFTP服务器(附参考示例)
linux·运维·服务器
项目題供诗3 小时前
黑马k8s(九)
云原生·容器·kubernetes
麟城Lincoln3 小时前
【Linux笔记】nfs网络文件系统与autofs(nfsdata、autofs、autofs.conf、auto.master)
linux·网络·笔记·nfs·autofs
***似水流年***3 小时前
Linux任务管理与守护进程
linux·运维·服务器