服务器进程沙箱化部署的核心是让服务以最小必要权限运行,systemd可通过protectsystem、privatetmp、nonewprivileges等原生选项实现基础沙箱,配合网络隔离、能力限制与用户命名空间增强安全性。

服务器进程沙箱化部署,核心是让服务以最小必要权限运行,而不是给 root 打补丁。哪怕进程 UID 是 0,也要让它对宿主机“无感”——这是现代 Linux 安全加固的底层逻辑。
用 systemd 原生选项实现基础沙箱
无需 Docker 或 Podman,systemd 本身已提供成熟、稳定的沙箱能力。在服务单元文件(如 /etc/systemd/system/myapp.service)的 [Service] 段中加入以下配置:
- ProtectSystem=strict:将 /usr、/boot、/etc 全部挂为只读,防止配置或二进制被篡改
- ProtectHome=read-only:隐藏或只读 /home、/root、/run/user,避免密钥、token 泄露
- 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,禁止加载/卸载内核模块
精细化控制 Linux capabilities
不给 CAP_SYS_ADMIN 这类“万能钥匙”,只放行真正需要的能力:
- 若需绑定 80/443 端口:CapabilityBoundingSet=CAP_NET_BIND_SERVICE,并确保 ExecStart 不含 setuid 调用
- 若需挂载文件系统:CapabilityBoundingSet=CAP_SYS_ADMIN,但必须配合 MountFlags=slave 和 RWDirectories=/mnt/myvol 限定作用范围
- 用 DropCapability=CAP_SYS_CHROOT CAP_AUDIT_WRITE CAP_SYS_MODULE 显式剔除高危能力,比默认放行更可控
启用用户命名空间增强隔离深度
即使服务以 root 启动,也能通过用户命名空间将其映射为非特权用户视角:
- 添加 PrivateUsers=yes:启用 user namespace 隔离,使进程无法感知宿主机真实 UID/GID 分配
- 配合 DynamicUser=yes 可进一步动态分配 UID,避免硬编码用户依赖
- 注意检查内核参数:/proc/sys/user/max_user_namespaces 应 ≥ 100,否则可能启动失败











