linux多租户强隔离需分层实现:通过userns+subuid/subgid实现uid级容器隔离,acl控制文件访问边界,cgroups v2限制资源使用,并禁用ptrace等敏感操作以防止逃逸。

在 Linux 运维中,所谓“完全物理隔离”本身与“多租户共用一台服务器”存在逻辑矛盾——真物理隔离意味着每人独占硬件或完整虚拟机;而“多租户 Linux 服务器”默认指共享内核、共享资源的单机环境。所以实际目标是:在单台 Linux 主机上,让多个租户用户彼此不可见、不可互访、不可干扰,且权限边界严格受控,接近物理隔离的效果。这需要分层组合实现,不能只靠 chmod 或 chown。
用 user namespace + subuid/subgid 实现容器级 UID 隔离
这是最接近“物理感”的隔离方式,核心是让每个租户在容器内以 root 身份运行,但在宿主机上实际映射为一段专属、非特权、不重叠的 UID/GID 区间。
- 为租户分配独立 ID 段:编辑 /etc/subuid 和 /etc/subgid,例如:
tenant-a:100000:65536tenant-b:165536:65536 - 启用 Docker 用户命名空间重映射:在 /etc/docker/daemon.json 中添加
{"userns-remap": "tenant-a"},重启 docker - 挂载目录属主必须对齐:宿主机上的数据目录(如
/data/tenant-a)需执行chown 100000:100000 /data/tenant-a,否则容器内无法访问 - 验证效果:容器内
id显示 uid=0;宿主机ps看到该进程 UID 是 100000;尝试mount或sysctl会直接被拒绝
用 ACL + 默认继承控制文件系统级访问边界
当租户不走容器、而是直接登录 shell 或运行服务时,ACL 是绕过传统 UGO 单组限制的唯一可靠手段,尤其适合共用目录结构但数据必须隔离的场景。
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
- 创建租户专属子目录,如
/srv/tenant-a,设基础权限chmod 755 /srv(保证可遍历) - 用
setfacl单独授权:允许 tenant-a 完全控制自己的目录,同时显式禁止其访问他人目录:setfacl -m u:tenant-a:rwx /srv/tenant-asetfacl -m u:tenant-a:--- /srv/tenant-b - 加默认 ACL 保证新建内容自动继承:
setfacl -d -m u:tenant-a:rwx /srv/tenant-a - 用
getfacl查看是否生效,再用sudo -u tenant-a ls /srv/tenant-b测试是否报 Permission denied
用 cgroups v2 + systemd scope 限制资源使用不越界
权限隔离只是“能访问谁”,资源隔离才是“能用多少”。仅靠 ACL 无法防 CPU、内存耗尽导致的互相拖慢。
- 启用 cgroups v2(现代发行版默认开启),禁用 legacy 混合模式
- 为每个租户创建 systemd scope,例如:
systemd-run --scope -p MemoryMax=2G -p CPUQuota=50% --uid=tenant-a --gid=tenant-a /bin/bash - 或通过 /etc/systemd/system/user-.slice.d/10-limit.conf 统一约束所有租户用户的默认资源上限
- 配合
systemctl show tenant-a.slice和systemd-cgtop实时监控资源占用
补充硬性防护:禁用敏感能力与限制 Shell 行为
即使权限和资源都设好,租户仍可能通过 strace、gdb、ptrace 或加载内核模块等方式穿透隔离。需主动封堵常见逃逸路径。
- 在 /etc/sysctl.conf 中禁用危险能力:
kernel.unprivileged_userns_clone = 0kernel.yama.ptrace_scope = 3(禁止非子进程 trace) - 为租户设置受限 shell,如
rssh或scponly,或用chsh -s /bin/rbash tenant-a并严格配置rbash的 PATH 和禁止 cd 到上级目录 - 移除租户家目录下
.bash_history的 world-writable 权限,防止篡改历史命令记录










