systemd的DynamicUser、ProtectSystem、ProtectHome、PrivateTmp、NoNewPrivileges和CapabilityBoundingSet有什么区别?
DynamicUser=yes为服务运行期动态分配临时用户和组;ProtectSystem=把系统目录设为只读或不可写;ProtectHome=隐藏或只读挂载用户家目录;PrivateTmp=yes给服务独立的/tmp与/var/tmp视图;NoNewPrivileges=yes阻止进程及子进程通过exec获得新权限;CapabilityBoundingSet=限制进程能够获得的Linux capabilities上限。
直接答案
DynamicUser=yes为服务运行期动态分配临时用户和组;ProtectSystem=把系统目录设为只读或不可写;ProtectHome=隐藏或只读挂载用户家目录;PrivateTmp=yes给服务独立的/tmp与/var/tmp视图;NoNewPrivileges=yes阻止进程及子进程通过exec获得新权限;CapabilityBoundingSet=限制进程能够获得的Linux capabilities上限。
这些指令解决不同攻击面。PrivateTmp不会阻止读取/etc,ProtectSystem=strict不会自动限制网络,DynamicUser也不等于容器。服务加固应以实际读写、设备、网络和系统调用需求为依据,逐项启用并做功能回归。
一、六项指令快速对比
它们可以组合,但组合后的最终权限才是实际安全边界。
二、为什么不能只写User=nobody
使用非root用户能降低直接权限,但该账户可能被多个服务共享,拥有持久文件,仍可读取全局可读数据,也可能保留不必要的能力或命名空间访问。
systemd沙箱指令提供更细粒度的文件系统、身份和内核能力限制,是运行用户之外的纵深防御。
三、DynamicUser是什么
启用DynamicUser=yes后,systemd在服务启动时分配动态用户和组,在服务停止后释放。它适合不需要长期固定系统账户的守护进程。
动态身份减少静态账户管理,但UID以后可能被重用,因此不能把长期数据简单存为某个裸UID拥有的任意路径。
四、DynamicUser如何保存状态
配合StateDirectory=、CacheDirectory=、LogsDirectory=和RuntimeDirectory=,systemd可创建受管理目录并处理动态用户访问。服务应把不同生命周期数据放到对应目录。
不要用ExecStartPre=chown -R在每次启动遍历大型目录,这既慢又可能改变错误路径的权限。
五、DynamicUser适合数据库吗
取决于数据路径和运维方式。若数据库需要外部备份工具、离线修复、共享文件或固定UID容器映射,动态身份会增加复杂度。
它更适合无持久状态或完全使用systemd托管目录的服务。上线前必须验证备份、恢复和升级。
六、ProtectSystem有哪些值
ProtectSystem=yes通常让/usr和启动相关目录只读;full进一步把/etc设为只读;strict把大部分文件系统设为只读,仅保留API文件系统等必要例外。
不同systemd版本的精确行为应以目标主机man page为准,不能从开发机版本直接推断。
七、strict后怎样允许特定写目录
用ReadWritePaths=为确实需要的路径建立可写例外,并优先使用StateDirectory=等托管目录。允许列表应精确到服务数据目录。
若直接放开整个/var或应用根目录,会抵消大部分只读保护。
八、ProtectSystem与文件权限有什么关系
它通过服务的挂载命名空间改变可写性,不会修改主机上原文件的mode位。服务外其他进程仍看到原挂载和权限。
因此停止服务后文件没有被“永久改成只读”;排障应查看服务进程所在命名空间。
九、ProtectHome是什么
ProtectHome=yes可让/home、/root和/run/user对服务不可访问;read-only允许读取但禁止写;其他模式可提供空视图,具体选项依版本而定。
面向网络的守护进程若不需要用户数据,通常应隔离家目录。
十、ProtectHome为何导致SSH密钥读取失败
某些服务以root启动后读取/root中的凭证,启用ProtectHome会使路径不可见。正确修复不是关闭全部保护,而是把服务凭证迁入专用凭证机制或受限配置目录。
密钥不应依赖交互用户的home目录。
十一、PrivateTmp是什么
PrivateTmp=yes为服务设置私有/tmp和/var/tmp视图。服务创建的临时文件不会以相同路径暴露给普通主机进程或其他私有tmp服务。
它降低临时文件名称碰撞、符号链接攻击和意外信息共享风险。
十二、PrivateTmp是不是加密目录
不是。它主要依靠挂载命名空间隔离视图,不代表磁盘加密,也不自动清除应用写入其他路径的敏感文件。
临时数据仍要采用安全权限、随机文件名和及时删除。
十三、为什么启用PrivateTmp后服务协作失败
两个进程原本用/tmp/app.sock或临时文件通信,若只有一个或两者拥有不同私有视图,就看不到同一对象。
跨服务通信应使用RuntimeDirectory=下的受控socket目录,而不是依赖全局tmp。
十四、NoNewPrivileges是什么
NoNewPrivileges=yes设置内核约束,使进程及其后代通过execve不能获得原本没有的新权限。setuid、setgid和文件capability的提权效果会受限制。
它能阻止被入侵服务借助本机提权程序扩大权限,是低成本的重要防线。
十五、NoNewPrivileges会降掉当前权限吗
不会简单地把当前权限全部清空。它主要阻止未来exec获得额外权限。当前UID、已有capabilities和可访问资源仍需用其他指令限制。
所以它不能替代User=或CapabilityBoundingSet=。
十六、CapabilityBoundingSet是什么
Linux把传统root权限拆成多项capability,如绑定低端口、修改网络配置或绕过文件权限。CapabilityBoundingSet=定义服务及子进程能拥有的能力上限。
从bounding set删除的能力不能通过后续exec重新获得,除非服务环境与权限模型另有特殊机制。
十七、空CapabilityBoundingSet代表什么
设置空集合会删除全部capabilities,适合普通非特权服务。若程序需要绑定小于1024的端口,可只保留CAP_NET_BIND_SERVICE,或让反向代理监听外部端口。
不要为了修复一个permission denied恢复全部能力。
十八、AmbientCapabilities是什么
AmbientCapabilities=把指定能力提供给非root程序跨exec使用,但这些能力仍必须受bounding set等限制。它用于精确授予少量必要能力。
授予前应确认应用真的需要,并记录为何不能通过架构方式移除。
十九、PrivateDevices与PrivateNetwork补充什么
PrivateDevices=yes提供受限设备视图,减少访问磁盘、GPU等设备节点;PrivateNetwork=yes给服务独立网络命名空间,通常只保留loopback。
它们不属于本文六项,但常与文件系统和能力限制组合。网络服务若需外部连接,不能盲目启用PrivateNetwork。
二十、ProtectKernel系列有什么用
ProtectKernelTunables、ProtectKernelModules、ProtectKernelLogs和ProtectControlGroups分别限制内核参数、模块、日志和控制组相关访问。
普通Web服务通常无需这些写权限,但监控代理、容器管理器和系统服务可能需要例外。
二十一、RestrictAddressFamilies是什么
它限制服务可创建的socket地址族。例如只需要IPv4、IPv6和UNIX socket的服务,无需保留原始包、Netlink或其他协议族。
依赖DNS、日志socket和本地数据库时要完整测试,避免仅根据监听端口推断。
二十二、SystemCallFilter有什么风险
系统调用过滤可显著缩小内核攻击面,但过严规则会在库升级、线程创建、JIT或文件操作时触发失败。不同架构和内核的系统调用也可能不同。
先用官方分组与审计工具评估,再逐步收紧,保留回滚方案。
二十三、systemd-analyze security做什么
systemd-analyze security 服务名检查多个沙箱设置并给出暴露评分与建议。它适合发现明显缺失项和比较加固前后变化。
评分不是漏洞扫描或功能验证。低分服务仍可能有应用漏洞,高分也可能是因为业务确实需要特权。
二十四、加固后permission denied怎样排查
先查看journalctl -u、服务退出码和内核审计记录,再用systemctl show确认最终属性。区分普通文件mode、SELinux/AppArmor、只读挂载、home隔离与缺失capability。
不要一次删除所有指令。逐项定位哪条安全边界与实际需求冲突。
二十五、Drop-In为何优于直接改vendor unit
使用systemctl edit创建drop-in可避免软件包升级覆盖修改,也能清楚记录本地加固差异。修改后执行systemctl daemon-reload并重启服务才能让新进程生效。
版本控制drop-in内容和验收结果,但不要把秘密写进unit文件。
二十六、一个基础加固示例
[Service]
DynamicUser=yes
StateDirectory=myapp
ProtectSystem=strict
ProtectHome=yes
PrivateTmp=yes
NoNewPrivileges=yes
CapabilityBoundingSet=
这只是无特权守护进程起点。若应用需要网络、写配置、设备或固定身份,必须按实际需求调整。
二十七、为什么不能直接复制高分模板
不同服务需要访问数据库socket、证书、时区、JIT内存、用户文件或设备。复制模板可能让服务表面启动成功,却在定时任务、日志轮转或证书更新时失败。
安全配置必须与数据流和运维流程绑定,而不是追求一个评分数字。
二十八、上线回归清单
测试启动、停止、reload、restart、异常恢复、升级、日志轮转、缓存清理、证书续期、备份恢复、网络访问、端口绑定和所有写路径。重启主机后再验证一次。
同时运行systemd-analyze verify和security检查,保存目标主机systemd版本及最终unit内容。
常见问题
1. DynamicUser每次启动UID都一定变化吗?
不要依赖固定UID。其设计就是动态身份,持久数据应通过systemd管理的目录处理。
2. ProtectSystem=strict后StateDirectory还能写吗?
通常systemd会为受管理目录建立必要访问,但应在目标版本实测最终挂载和权限。
3. PrivateTmp能阻止服务读取/home吗?
不能。它只隔离临时目录;用户目录用ProtectHome限制。
4. NoNewPrivileges等于删除所有capability吗?
不等于。它阻止后续exec提权,现有能力上限还需CapabilityBoundingSet等控制。
5. security评分越低就越安全吗?
评分只反映systemd可检查的暴露面,不覆盖应用逻辑、依赖漏洞和网络策略。
结论
DynamicUser隔离身份,ProtectSystem与ProtectHome收紧文件系统,PrivateTmp隔离临时目录,NoNewPrivileges阻止exec提权,CapabilityBoundingSet削减内核能力。有效加固需要最小权限、托管数据目录、逐项回归、可观测诊断和版本化drop-in共同完成。
参考来源
1. systemd:systemd.exec,https://www.freedesktop.org/software/systemd/man/latest/systemd.exec.html
2. systemd:systemd.resource-control,https://www.freedesktop.org/software/systemd/man/latest/systemd.resource-control.html
3. systemd:systemd-analyze,https://www.freedesktop.org/software/systemd/man/latest/systemd-analyze.html
4. Linux man-pages:capabilities,https://man7.org/linux/man-pages/man7/capabilities.7.html
5. Linux kernel:No New Privileges Flag,https://docs.kernel.org/userspace-api/no_new_privs.html