
Linux系统中,systemd 是关键服务的核心管理工具。随着安全意识的提高,仅仅运行服务已经不够,我们还需要对它们进行隔离和限制,防止因某个服务被攻破而影响整个系统。给systemd服务配置沙盒机制,是增强安全性的有效手段之一。

下面我们就来看看如何通过 systemd 提供的功能来实现服务沙盒化。
1. 使用 PrivateNetwork 和 PrivateUsers 隔离网络与用户
这两个选项可以为服务创建一个独立的网络命名空间和用户命名空间,从而限制其访问权限。

- PrivateNetwork=yes:启用后,服务将无法访问主机的真实网络,只能使用本地回环接口(lo)或自己创建的虚拟网络。
- PrivateUsers=yes:启用后,服务会在一个私有的用户命名空间中运行,这样即使它以 root 身份运行,也不会拥有主机上的 root 权限。
注意:启用这些功能可能会影响服务的行为,比如某些需要真实网络连接的服务会失效,需要配合 IPAddressAllow= 等选项做细粒度控制。
2. 利用 RestrictAddressFamilies 限制通信协议
有些服务本来只需要使用 IPv4 或者本地 Unix 套接字,但默认情况下它们可能会尝试使用其他协议,比如 IPv6、蓝牙等。这不仅多余,也可能带来潜在风险。

使用:
RestrictAddressFamilies=AF_UNIX AF_INET
上面的例子表示只允许服务使用本地套接字和 IPv4 地址通信,其他协议都会被禁止。
这种限制能有效防止服务试图建立非预期的网络连接,尤其是在暴露在公网的服务器上非常实用。
3. 挂载只读文件系统与限制路径访问
你可以通过设置 ReadOnlyPaths 和 InaccessiblePaths 来限制服务对文件系统的访问。
- ReadOnlyPaths=/etc /usr:指定路径下的内容只能读取,不能修改。
- InaccessiblePaths=/home /root:指定路径对服务不可见,即使它有权限也不能访问。
例如,对于一个只需要读取配置的 Web 服务来说,完全没必要让它访问 /home 目录。
此外,还可以结合 MountFlags=slave 或 MountFlags=private 来控制挂载传播行为,避免服务改变挂载点结构。
4. 启用 AppArmor 或 SELinux 进行更细粒度的控制
虽然 systemd 提供了很多内建的安全限制,但如果你想要更强大的防护能力,可以结合 Linux 安全模块如 AppArmor 或 SELinux。
- AppArmor 更适合新手,配置相对简单,基于路径定义策略;
- SELinux 更强大但也更复杂,适合高级用户或企业级部署。
例如,在 AppArmor 中你可以为某个服务编写如下策略:
/usr/bin/my-service {
/etc/my-service/** r,
/var/log/my-service.log w,
}这样该服务就只能读取配置文件,并写入日志文件,其他操作都会被阻止。
小技巧:用 systemd-analyze security 检查服务安全性评分
systemd 自带了一个小工具可以帮助你快速评估服务的安全性:
systemd-analyze security sshd.service
它会给出一个安全评分(0~100),并列出哪些项目可以改进。这对于排查遗漏项非常有用。
基本上就这些。合理使用 systemd 提供的安全特性,可以在不引入复杂容器环境的前提下,大幅提升服务的安全性。配置时注意逐步测试,避免因权限限制导致服务无法正常启动。










