Linux多租户SSH隔离需分层拦截:一、用AllowUsers按用户/IP精准控制登录入口;二、通过独立家目录、受限sudo权限和authorized_keys命令前缀隔离操作环境;三、叠加防火墙、netns网络隔离及VERBOSE日志审计;四、避坑如禁用false shell、验证sshd配置、确保shell字段非空。

在 Linux 多租户共享服务器中,SSH 隔离不能只靠“禁止密码登录”或“改 shell”,而要从连接入口、身份识别、会话控制三个层面做分层拦截。核心目标是:每个租户只能通过指定方式登录指定资源,且彼此无法越权访问、干扰或探测。
一、按租户精准限制 SSH 登录入口
用 DenyUsers 或 AllowUsers 在协议层直接控制谁能在哪登录,不依赖系统账户状态:
- 只允许 tenant-a 和 tenant-b 通过 SSH 登录(其他用户一律拒绝):
AllowUsers tenant-a tenant-b - 若需更细粒度,可绑定 IP(如 tenant-a 只能从 192.168.10.0/24 登录):
AllowUsers tenant-a@192.168.10.* tenant-b@192.168.20.* - 避免与
AllowGroups混用——组策略易被绕过,且权限继承逻辑复杂;单用户白名单语义明确、日志可追溯
二、隔离租户的登录后环境与操作边界
登录成功不等于安全。必须防止租户切换身份、读取他人家目录、滥用 sudo 或执行危险命令:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 为每个租户设置独立家目录,并禁用跨目录遍历:
chown -R tenant-a:tenant-a /home/tenant-achmod 700 /home/tenant-a - 禁用租户的交互式 shell 切换能力(如
su、sudo -i):
在/etc/sudoers中明确限制:tenant-a ALL=(ALL:ALL) NOPASSWD: /usr/bin/systemctl status *, /usr/bin/journalctl -u *
不给ALL,只放行必要运维命令 - 启用强制的 SSH 命令限制(适用于仅提供特定服务的租户):
在/home/tenant-a/.ssh/authorized_keys中为公钥加前缀:command="/usr/local/bin/tenant-a-shell",no-port-forwarding,no-X11-forwarding,no-agent-forwarding ssh-rsa AAAA...
三、网络与会话级隔离补强
SSH 层控制之外,叠加网络和进程隔离,防横向移动:
- 配合防火墙封禁租户间互访:
iptables -A OUTPUT -m owner --uid-owner tenant-a -d 192.168.1.100 -j DROP
(阻止 tenant-a 主动连另一租户所在 IP) - 对高敏租户启用独立 network namespace(netns),使其 SSH 会话运行在隔离网络栈中:
ip netns add ns-tenant-aip netns exec ns-tenant-a /usr/sbin/sshd -D -o "Port 2222"
再用sshd_config的ListenAddress绑定到该 netns 的虚拟接口 - 记录完整审计日志:
确保/etc/ssh/sshd_config含有:LogLevel VERBOSEPermitUserEnvironment no
并启用auditd监控execve和setuid系统调用
四、关键避坑提醒
这些细节常被忽略,但直接决定隔离是否真正生效:
-
不要用
usermod -s /bin/false禁用租户:这会同时禁掉scp、sftp和所有基于 SSH 的自动化工具,运维脚本极易中断 -
重启 sshd 前必须验证配置语法:
sshd -t && echo "OK" || echo "FAIL",否则可能锁死远程管理通道 - 租户账号默认 shell 必须为 /bin/bash(或指定受限 shell),且 /etc/passwd 中字段不可为空:OpenSSH 某些版本对空 shell 字段处理异常,导致 DenyUsers 失效
-
禁用 PAM 的
pam_wheel.so或pam_access.so冲突规则:若已启用AllowUsers,就不要在/etc/security/access.conf中再写重复或反向策略,否则以 PAM 实际加载顺序为准,调试困难










