服务器进程权限沙箱化本质是让服务以最小必要权限运行,核心通过systemd原生选项组合实现:ProtectSystem=strict、ProtectHome=read-only、PrivateTmp=yes、NoNewPrivileges=yes、PrivateNetwork=yes、RestrictAddressFamilies、CapabilityBoundingSet及PrivateUsers=yes等,无需容器工具即可达成强隔离。

服务器进程权限沙箱化不是给 root “打补丁”,而是让服务**以最小必要权限运行**,即使被攻破也难以逃逸或破坏系统。核心是组合使用 systemd 原生沙箱选项、能力控制和命名空间隔离,不依赖额外容器工具也能达成强防护。
用 systemd 单元文件启用基础沙箱保护
在 /etc/systemd/system/myservice.service 的 [Service] 段中加入以下通用防护项:
- ProtectSystem=strict:把 /usr、/boot、/etc 挂为只读,防篡改系统二进制和配置
- ProtectHome=read-only:隐藏或只读 /home、/root、/run/user,避免读取用户密钥或凭证
- PrivateTmp=yes:为服务分配独立的 /tmp 和 /var/tmp,防止临时文件被其他进程窥探或污染
- NoNewPrivileges=yes:禁止通过 execve 获得新权限(如运行 setuid 程序),堵住提权路径
- RestrictSUIDSGID=true:阻止创建 SUID/SGID 文件,减少本地提权面
按需收紧网络与内核访问
网络暴露是多数服务的主要攻击入口,应主动收缩而非事后拦截:
- PrivateNetwork=yes:服务启动即进入独立网络命名空间,仅可见 lo 接口;真实网卡、主机端口、其他服务全不可见
- RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6:显式允许协议族,禁用 AF_NETLINK、AF_PACKET 等高风险类型,防路由劫持或抓包
-
IPAddressAllow=127.0.0.1 或 IPAddressAllow=192.168.1.0/24:白名单指定可连接的 IP 段,
IPAddressDeny=any配合使用更安全 - ProtectKernelTunables=yes 和 ProtectKernelModules=yes:禁止写 /proc/sys、/sys,禁止加载/卸载模块
精细化控制权限能力(Capabilities)
避免直接给 CAP_SYS_ADMIN 这类“万能钥匙”,只放行真正需要的能力:
- 若服务需绑定 80/443 端口:CapabilityBoundingSet=CAP_NET_BIND_SERVICE,并确保
ExecStart不带 setuid - 若需挂载临时文件系统:CapabilityBoundingSet=CAP_SYS_ADMIN —— 但必须配合 MountFlags=slave 和 ReadWriteDirectories=/mnt/myvol 限定挂载点
- 用 DropCapability=CAP_SYS_CHROOT CAP_AUDIT_WRITE CAP_SYS_MODULE 显式剔除高危能力,比默认放行更可靠
启用用户命名空间增强隔离深度
即使进程 UID 是 0,也要让它对宿主机“无感”:
-
PrivateUsers=yes:自动映射 UID/GID 到高位范围(如容器内 0 → 宿主机 100000),需提前在
/etc/subuid和/etc/subgid中为 root 预留范围 - 搭配 NoNewPrivileges=yes 和 RestrictNamespaces=yes,彻底禁用新建 user/net/pid 等 namespace,防逃逸
- 若服务无需持久状态,可加 DynamicUser=yes,每次启动分配随机 UID,连 /etc/passwd 都不用改
完成配置后运行 sudo systemctl daemon-reload && sudo systemctl restart myservice,再用 systemctl show myservice | grep -E "(Protect|Private|Capability|Restrict)" 核对生效项。遇到启动失败时,先关掉 ProtectSystem 和 PrivateNetwork 定位问题路径,再逐步加回——沙箱是渐进过程,不是全有或全无。

















