Namespace 隔离

Namespace 隔离

什么是 Namespace

Namespace(命名空间)是 Linux 内核提供的一种资源隔离机制,它将全局的系统资源包装在抽象的命名空间中,使得命名空间内的进程只能看到自己空间内的资源。这是 Docker 容器的核心隔离技术。

容器的 6 种 Namespace

Docker 创建容器时为每个容器创建独立的命名空间:

Namespace 隔离的资源 Docker 中用途
PID 进程 ID 容器内只有自己的进程
Network 网络设备、协议栈 每个容器有自己的网络栈
Mount 文件系统挂载点 容器有独立的文件系统视图
UTS 主机名和域名 容器可以设置自己的 hostname
IPC System V IPC 防止跨容器进程通信
User 用户和组 ID 容器内 root 映射到宿主机非特权用户

各 Namespace 详解

PID Namespace

# 宿主机 PID 空间
$ ps aux | grep nginx
root  1234  ... nginx

# 容器内 PID 空间
$ docker exec web ps aux
PID   USER     COMMAND
1     root     nginx: master process
7     101      nginx: worker process

容器内的进程 1(PID=1)在宿主机上是 PID 1234。容器看不到宿主机或其他容器的进程。

Network Namespace

每个容器有自己的网络栈,包括网卡、路由表、iptables 规则等。通过 veth pair(虚拟以太网对)将容器网络连接到 Docker bridge。

Mount Namespace

容器有独立的文件系统挂载点视图。容器无法看到宿主机的文件系统(除了挂载的卷)。

UTS Namespace

每个容器可以有独立的主机名。

IPC Namespace

默认容器间 IPC 隔离。

User Namespace

将容器内的 root(UID 0)映射为宿主机上的非特权用户:

# 配置 Docker 守护进程启用 userns-remap
echo '{"userns-remap": "default"}' >> /etc/docker/daemon.json
systemctl restart docker

# 现在容器内的 root 在宿主机上是普通用户

Namespace 操作

# 查看进程的命名空间
ls -la /proc/$$/ns/

# 比较容器和宿主机的命名空间
docker inspect --format '{{.State.Pid}}' container_name
nsenter -t  -n ip addr  # 进入容器的网络命名空间

共享 Namespace 的场景

# 共享网络 namespace(sidecar 模式)
docker run --net=container:web-app network-debug
# 和 web-app 共享网络栈

# 共享 PID namespace
docker run --pid=container:web-app sidecar
# sidecar 可以看到 web-app 的进程

安全建议

  1. 默认隔离:Docker 默认为所有 6 种 Namespace 创建隔离
  2. 避免 –privileged:会关闭所有 Namespace 隔离
  3. 启用 User Namespace:使用 userns-remap 增强隔离
  4. 谨慎共享 Namespace--net=host 会降低隔离性

Namespace 是容器安全的基石,理解它的工作原理有助于正确配置容器安全策略。

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容