Linux多用户资源隔离需协同进程、内存、CPU、网络及文件系统:用cgroups v2统一管控资源配额,PAM+limits.conf限制会话基础资源,network namespace或VLAN实现网络硬隔离,user namespace+subuid/subgid隔离UID/GID空间。

Linux 中配置多用户环境下的资源隔离,不能只靠改权限或建用户,得从进程、内存、CPU、网络、文件系统多个层面协同控制。目标不是“不让用户互相看见”,而是“即使同时在线、同时跑任务,彼此也不抢资源、不越权、不干扰”。
用 cgroups v2 统一管控 CPU 与内存
cgroups v2 是当前推荐方式,替代老旧的 cgroups v1,支持层级化、线程级控制,且与 systemd 深度集成。
- 启用 cgroups v2:确认内核启动参数含 systemd.unified_cgroup_hierarchy=1,检查 /proc/sys/fs/cgroup/unified 是否存在
- 为每个用户创建资源控制器:在 /sys/fs/cgroup/user.slice/ 下新建子目录,如 tenant-a.slice,并写入 cpu.max(如 50000 100000 表示最多用 50% CPU 时间)和 memory.max(如 2G)
- 绑定用户会话:通过 logind.conf 设置 UserTasksMax= 和 RuntimeDirectoryMode=,再配合 pam_systemd.so 自动将登录会话归入对应 slice
用 PAM + limits.conf 限制基础会话资源
这是最轻量、最通用的兜底手段,适用于所有 SSH 或本地终端登录场景。
- 编辑 /etc/security/limits.conf,例如:
tenant-a soft nproc 200
tenant-a hard nproc 400
tenant-a soft nofile 1024
tenant-a hard nofile 65536
@developers hard memlock 512000 - 确保 /etc/pam.d/sshd 和 /etc/pam.d/login 含有 session required pam_limits.so
- 注意:这些限制仅对 shell 启动的进程生效,不自动覆盖 systemd 服务或容器内进程
用 network namespace 或 VLAN 实现网络层硬隔离
防止租户间端口冲突、ARP 欺骗、广播风暴,也避免误连或嗅探。
- 若租户运行独立服务(如 Web、数据库),推荐为每人分配独立 netns:
ip netns add tenant-b
ip netns exec tenant-b ip link set lo up
ip netns exec tenant-b python3 -m http.server 8000 - 若租户共用物理网卡但需二层隔离,走 VLAN 子接口(如 ens33.101),再配 firewalld zone 或 nftables mark+drop 禁跨租户转发
- 禁用 IP 转发(net.ipv4.ip_forward=0)除非明确需要路由功能
用 user namespace + subuid/subgid 隔离 UID/GID 空间
这是防止“UID 碰撞”和逃逸的关键——让 tenant-a 在容器里是 root,宿主机上却是 UID 100000,且无法映射到其他租户的 ID 段。
- 在 /etc/subuid 和 /etc/subgid 中为每个租户分配不重叠段:
tenant-a:100000:65536
tenant-b:165536:65536 - 启用 Docker 用户命名空间重映射:{"userns-remap": "tenant-a"} 写入 /etc/docker/daemon.json
- 宿主机数据目录属主必须匹配映射起始 UID,否则容器内无法读写:
chown 100000:100000 /data/tenant-a


















