在 Docker 容器的 docker inspect 输出中,MaskedPaths 列出了被“屏蔽”的路径,这些路径即使在容器中也无法访问。屏蔽路径的作用是增强安全性,防止容器对宿主机某些关键的系统资源进行不必要或潜在危险的操作。
"MaskedPaths": [
"/proc/asound",
"/proc/acpi",
"/proc/kcore",
--
MaskedPaths 的含义
作用: 屏蔽路径是为了保护宿主机的系统资源。这些路径不会在容器中被挂载,容器对这些路径的访问尝试会被拒绝。
原因: 防止容器访问和修改宿主机的敏感系统资源,如设备配置、内存信息等。
适用场景: 主要用于增强隔离性和安全性,特别是在多租户环境或运行不可信容器时。
MaskedPaths 和容器访问宿主机路径的关系
1、容器启动时的配置:
在 Docker 容器启动时,会根据容器的安全配置(如 MaskedPaths 和 ReadonlyPaths)设置容器的可访问路径。
这些路径通常是通过 Linux 内核的 mount 和 namespace 技术来实现的。
2、在 MaskedPaths 中的路径:
当容器内的进程尝试访问某个文件或目录时,Linux 内核会检查当前进程的文件系统权限。如果路径在 MaskedPaths 中:
系统会返回错误,通常为 权限不足 (Permission denied) 或 路径不存在 (No such file or directory)。
容器中的进程无法继续操作这些路径。
3、不在 MaskedPaths 中的路径:
默认情况下,容器可能访问某些路径(如 /proc 系统信息)。
但访问能力还可能受到其他因素限制:
1)容器运行时配置(如 ReadonlyPaths)。
2)宿主机的挂载策略。
3)SELinux 或 AppArmor 等安全机制。
4、屏蔽的原理:
MaskedPaths 的实现依赖于 mount 的覆盖功能(overlay)。
被屏蔽的路径会被映射为一个空目录(empty directory)或不可访问状态。
常见的屏蔽路径及其作用
1、/proc/asound
作用:与声卡设备相关,包含 ALSA(高级 Linux 声音体系架构)信息。
屏蔽原因:防止容器直接访问或干扰宿主机的音频硬件配置。
2、/proc/acpi
作用:与 ACPI(高级配置与电源接口)相关,存储电源管理和硬件状态信息。
屏蔽原因:避免容器访问电源管理接口,防止意外或恶意修改影响宿主机硬件行为。
3、/proc/kcore
作用:宿主机的虚拟内存映射文件,用于内核调试。
屏蔽原因:暴露给容器后可能泄露宿主机的内存布局或其他敏感数据。
4、/proc/sysrq-trigger
作用:用于触发宿主机的系统级别请求(如立即关机或重启)。
屏蔽原因:防止容器发出危险命令影响宿主机。
5、/sys/firmware
作用:存储与宿主机固件相关的信息(如 BIOS 设置)。
屏蔽原因:防止容器读取或更改硬件固件配置。
案例分析
容器屏蔽路径:
假设容器内尝试访问 /proc/kcore:
$ docker run -it ubuntu
root@container:/# cat /proc/kcore
cat: /proc/kcore: Permission denied
原因:
/proc/kcore 在 Docker 默认的 MaskedPaths 列表中,容器无法访问。
挂载路径冲突:
假设显式尝试挂载 /proc/kcore:
docker run -it --mount type=bind,source=/proc/kcore,target=/mnt/kcore ubuntu
容器内查看 /mnt/kcore:
root@container:/# ls /mnt/kcore
ls: cannot access '/mnt/kcore': Permission denied
原因:
即使通过 Mounts 显式挂载,MaskedPaths 的屏蔽策略依然生效,阻止访问。
为什么 Docker 容器访问路径会被 MaskedPaths 限制?
MaskedPaths 是 Docker 和 Linux 容器化中一种安全机制,用于限制容器对宿主机敏感路径的访问。它通过将指定路径“屏蔽”(mask)为不可访问状态(通常为只读的 empty 目录或完全无法访问)来保护宿主机的重要文件系统部分。
屏蔽的效果:
容器中的进程无法读取、写入甚至列出这些被屏蔽路径的内容。
即使容器进程具有 root 权限,也无法绕过这个限制。
安全性增强机制
这些屏蔽路径通常由 Docker 默认配置,并结合容器运行时(如 runc 或 containerd)实现:
默认屏蔽这些敏感路径,防止不必要的访问。
如果需要更改或解除屏蔽,可以通过 Docker 的自定义配置(–masked-paths)参数调整,但通常不建议这样做,除非明确知道需要访问这些路径。
如何查看或调整 MaskedPaths
1、查看默认屏蔽路径:
检查 Docker 守护进程的配置文件(通常是 /etc/docker/daemon.json)中是否定义了 masked-paths。
{
"masked-paths": ["/proc/asound", "/proc/acpi", "/proc/kcore", ...]
}
2、解除屏蔽(不推荐):
如果确实需要访问某些路径,可以通过 Docker 启动时添加 –masked-paths 参数修改屏蔽列表。
dockerd --masked-paths=""
总结
MaskedPaths 是 Docker 的一种内置安全机制,保护宿主机不被容器干扰或访问关键系统资源。对于大多数使用场景,无需修改这些路径配置,但了解其用途有助于更好地理解容器与宿主机之间的隔离机制。