systemd 提供多种沙盒机制提升服务安全性,具体方法包括:1. 使用 privatenetwork 和 privateusers 实现网络和用户空间隔离;2. 通过 restrictaddressfamilies 限制网络协议栈,控制服务的网络访问能力;3. 利用 readonlypaths 和 inaccessiblepaths 控制文件系统访问权限,防止敏感目录被读写;4. 设置 memorylimit 和 cpuquota 限制资源使用,避免资源过度占用。这些配置可根据服务需求灵活启用,实现轻量级安全隔离。
linux 系统中,systemd 不仅仅是服务管理工具,它还提供了一些沙盒机制来实现服务资源隔离。通过合理配置,可以限制服务的访问权限、网络能力以及资源使用,提升系统安全性。下面是一些实用的配置方法和建议。
1. 使用 PrivateNetwork 和 PrivateUsers 实现基础隔离
这两个选项可以快速为服务创建一个独立的网络空间和用户空间,避免服务直接访问主机资源。
- PrivateNetwork:启用后会为服务分配一个私有网络命名空间,服务无法访问主机的网络接口。
- PrivateUsers:启用后服务运行在一个独立的用户命名空间中,即使以 root 权限启动,也不会拥有主机上的 root 权限。
示例:[Service] PrivateNetwork=yes PrivateUsers=yes
这些设置适合对安全性要求较高但不需要复杂容器化部署的服务。
2. 利用 RestrictAddressFamilies 限制网络协议栈
如果你希望进一步控制服务的网络行为,可以使用这个选项限制服务只能使用某些地址族(如仅允许 IPv4 或禁用所有网络)。
常见用法包括:
- AF_UNIX:只允许本地通信
- AF_INET:仅允许 IPv4
- 完全禁用网络:AF_UNSPEC
示例:
RestrictAddressFamilies=AF_UNIX
这在部署非网络依赖型服务时非常有用,比如定时任务或本地日志处理程序。
3. 控制文件系统访问权限:ReadOnlyPaths 和 InAccessiblePaths
通过限制服务对文件系统的访问,可以有效防止其读写敏感目录。
- ReadOnlyPaths:将指定路径挂载为只读
- InaccessiblePaths:将指定路径设为不可访问(通常挂载为空目录)
示例:
ReadOnlyPaths=/etc /usr InaccessiblePaths=/home /root
这种做法可以防止服务意外或恶意修改系统配置或用户数据。
4. 设置资源限制:MemoryLimit 和 CPUQuota
除了安全隔离,还可以通过 systemd 控制服务使用的系统资源,防止某个服务占用过多内存或 CPU。
- MemoryLimit:限制最大内存使用量
- CPUQuota:限制 CPU 占比(例如限制为 50%)
示例:
MemoryLimit=512M CPUQuota=50%
这对于多服务共存环境尤其重要,可以避免单个服务拖垮整个系统。
基本上就这些常用配置项了。systemd 的沙盒功能虽然不如容器那样全面,但在轻量级场景下已经足够强大。关键是要根据服务的实际需求,按需开启对应的安全限制,既不过度也不遗漏。