linux中为服务账号禁锢home目录的核心是通过systemd沙箱机制(如protecthome=true、rootdirectory=)或chroot隔离文件系统可见范围,并严格控制权限与归属,防止越权访问。

Linux中为服务账号禁锢Home目录,核心是通过chroot或systemd沙箱机制限制其文件系统可见范围,同时配合严格权限控制,防止越权访问。关键不在于单纯设置HOME路径,而在于切断该账号对系统其他区域的遍历能力。
使用systemd服务单元限制(推荐)
现代Linux发行版(如RHEL 8+/CentOS 8+、Ubuntu 20.04+)默认使用systemd管理服务,应优先利用其内置沙箱选项:
-
设置
RootDirectory=或RootImage=:将服务运行在完全隔离的根文件系统中,其Home目录自然被限定在该环境内; -
启用
ProtectHome=true:自动挂载/home、/root、/run/user为只读+不可访问(mask),服务进程无法进入任何用户Home目录; -
搭配
ReadWritePaths=和ReadOnlyPaths=:显式声明该服务仅可读写哪些路径(例如/var/lib/myservice),其余一律拒绝; -
禁用
NoNewPrivileges=true:防止服务通过setuid等方式提权突破限制。
传统chroot方式(兼容旧环境)
若服务必须以传统方式启动(如SysV init或独立守护进程),可手动构建chroot jail:
- 创建专用目录(如
/srv/jail/myapp),复制必要库(ldd检查依赖)、配置文件及最小设备节点(/dev/null,/dev/zero等); - 将服务账号的
HOME设为/srv/jail/myapp/home/myuser,并确保该路径在chroot内且属主正确; - 使用
chroot /srv/jail/myapp /bin/bash -c 'exec myservice'启动,或封装为systemd服务时用ExecStart=/usr/bin/chroot /srv/jail/myapp /usr/local/bin/myservice; - 注意:chroot本身不提供完整安全隔离,需额外配合
chroot + seccomp + capabilities增强防护。
权限与归属硬性约束
无论采用哪种隔离方式,都必须同步收紧文件系统权限:
- 服务账号的Home目录(如
/var/lib/myapp)属主应为该账号,属组建议为root,权限设为750或更严(如700); - 禁止该账号拥有
sudo、ssh等交互式登录能力,shell设为/usr/sbin/nologin或/bin/false; - 检查
/etc/passwd中该账号的Home字段是否指向真实隔离路径,且/etc/shadow中密码字段非空(避免被意外启用); - 使用
auditctl -w /var/lib/myapp -p rwxa监控异常访问行为。
验证与日常维护要点
配置完成后必须实测隔离效果:
- 切换至服务账号:
sudo -u myapp-user sh,尝试cd /、ls /etc、cat /proc/self/cgroup,确认无权访问或看到空/受限内容; - 检查
systemctl show myapp.service | grep -E "(RootDirectory|ProtectHome|NoNewPrivileges)",确认参数已生效; - 定期更新chroot环境中的库文件(如glibc升级后需重新拷贝),或改用
RootImage=配合容器镜像自动化管理; - 避免在Home目录中存放私钥、密码等敏感信息,应交由
systemd-creds或外部密钥管理服务托管。










