linux命名空间的禁用

由于linux命名空间是默认开启的,所以需要禁用,否则会存在一些漏洞

命名空间的作用
  • 用户命名空间:用户命名空间的功能主要是为了提供进程和用户 ID 的隔离,通常用于安全容器环境。禁用用户命名空间后,普通用户将无法创建这样的隔离环境。
  • 用户命名空间是 Linux 内核的一个特性,它允许非特权用户创建自己的隔离环境,其中的用户和组 ID 可以重新映射,主要用于容器和沙箱环境。禁用用户命名空间后,普通用户将无法创建这些隔离环境。

禁用用户命名空间

用户命名空间允许非特权用户创建隔离的用户和组 ID 映射,从而可以执行一些特权操作。为了增强安全性,你可以禁用它。

添加配置
1
echo “user.max_user_namespaces=0” > /etc/sysctl.d/userns.conf  
使配置立马生效
1
sudo sysctl --system
检查是否关闭

1.使用 sysctl 命令查看当前 user.max_user_namespaces 的值:
如果输出为 user.max_user_namespaces = 0,说明用户命名空间已经被禁用。

1
sysctl user.max_user_namespaces

2.普通用户命名空间的创建
尝试用非特权用户创建用户命名空间。如果命名空间被禁用,应该会报错

1
unshare --user --map-root-user id

如果命令返回类似 unshare: unshare failed: Invalid argument 的错误,表示用户命名空间的创建已被禁用。

  1. 尝试运行容器
    容器技术,如 Docker 或 Podman,通常依赖于用户命名空间。你可以尝试用非特权用户运行一个简单的容器,看看是否会失败。
    例如,使用 Docker 运行一个简单的容器:
    1
    docker run --rm -it busybox

    如果用户命名空间被禁用,Docker 可能会因为无法创建用户命名空间而失败。

  1. 使用 newuidmap 和 newgidmap
    用户命名空间的创建也涉及到 newuidmap 和 newgidmap 工具。这些工具用于映射用户和组 ID
    1
    newuidmap 0 1000 1 1000

    如果你看到错误,例如 newuidmap: write to uid_map failed: Invalid argument,说明用户命名空间已经被禁用。


使用命名空间

命名空间类型
  1. UTS(主机名和域名)命名空间:隔离主机名和域名。
  2. IPC(消息队列、信号量、共享内存)命名空间:隔离消息队列、信号量和共享内存。
  3. PID(进程ID)命名空间:隔离进程ID。
  4. Mount(挂载)命名空间:隔离文件系统挂载点
  5. Network(网络)命名空间:隔离网络设备、IP 地址、端口号等。
  6. User(用户)命名空间:隔离用户和用户组。
  7. Cgroup(资源限制)命名空间:隔离资源限制,如CPU、内存等。
使用unshare创建命名空间

unshare 命令可以分离当前进程或一个新创建的进程进入一个新的命名空间

1
sudo unshare --uts --hostname new_hostname

这会创建一个新的 UTS 命名空间,并将主机名设置为 new_hostname。你可以使用 hostname 命令查看和修改新的主机名。

1
sudo unshare --net

这会创建一个新的网络命名空间。你可以在该命名空间内执行网络配置命令,比如创建新的虚拟网络接口。

1
sudo unshare --mount

这会创建一个新的挂载命名空间。你可以在该命名空间内挂载和卸载文件系统,而不会影响主命名空间

1
sudo unshare --user --map-root-user

这会创建一个新的用户命名空间,并将当前用户映射为命名空间内的根用户

1
sudo unshare --uts --net --mount

可以结合多个选项同时创建多个命名空间。例如,创建一个新的 UTS、网络和挂载命名空间

可以使用 – 选项在新命名空间中运行指定的命令。例如,在一个新的 UTS 和网络命名空间中运行 bash:

1
sudo unshare --uts --net --mount -- bash

对于网络命名空间,可以使用 ip 命令的 netns 子命令来创建和管理:

  1. 创建网络命名空间:
    1
    sudo ip netns add mynetns
  2. 在网络命名空间中执行命令
    1
    sudo ip netns exec mynetns bash
  3. 删除网络命名空间
    1
    sudo ip netns delete mynetns