文档参考:
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
可读写 意味这容器可以获取主机以下权限:
- 读取系统信息:用户空间程序可以读取 /sys 中的文件来获取关于系统硬件、驱动程序状态、内核参数等信息。
- 修改系统设置:用户空间程序可以写入 /sys 中的文件来改变系统的运行时参数,例如调整 CPU 频率、设置电源管理策略、配置网络设备等。
- 设备控制:对于某些设备,/sys 文件系统提供了控制接口,允许用户空间程序直接控制硬件设备的行为。
使 cgroups
挂载可读写意味着赋予容器对宿主机 cgroups 文件系统的访问权限,这将允许容器内的进程对 cgroups 进行读取和修改操作。具体来说,这可能包括:
- 读取系统信息:容器可以读取 cgroups 中的文件来获取关于系统资源使用情况的信息,例如 CPU、内存、磁盘 I/O 等。
- 修改系统设置:容器可以写入 cgroups 中的文件来改变系统的运行时参数,例如调整 CPU 频率、设置内存限制、配置网络设备等
- 设备控制:对于某些设备,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-add
和cap-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 | 触发某个将唤醒系统的事件。 |