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 触发某个将唤醒系统的事件。
相关推荐
上天_去_做颗惺星 EVE_BLUE20 分钟前
Docker高效使用指南:从基础到实战模板
开发语言·ubuntu·docker·容器·mac·虚拟环境
Yana.nice1 小时前
openssl将证书从p7b转换为crt格式
java·linux
AI逐月1 小时前
tmux 常用命令总结:从入门到稳定使用的一篇实战博客
linux·服务器·ssh·php
小白跃升坊1 小时前
基于1Panel的AI运维
linux·运维·人工智能·ai大模型·教学·ai agent
跃渊Yuey2 小时前
【Linux】线程同步与互斥
linux·笔记
舰长1152 小时前
linux 实现文件共享的实现方式比较
linux·服务器·网络
好好沉淀2 小时前
Docker开发笔记(详解)
运维·docker·容器
zmjjdank1ng2 小时前
Linux 输出重定向
linux·运维
路由侠内网穿透.2 小时前
本地部署智能家居集成解决方案 ESPHome 并实现外部访问( Linux 版本)
linux·运维·服务器·网络协议·智能家居
VekiSon2 小时前
Linux内核驱动——基础概念与开发环境搭建
linux·运维·服务器·c语言·arm开发