systemd服务安全加固实战:从暴露评分到生产级沙箱配置

从systemd-analyze security安全审计与评分解读,到ProtectSystem、SystemCallFilter等核心加固指令详解,再到Nginx、PostgreSQL和Redis的生产级沙箱配置实战——帮你把服务暴露评分从"危险"降到"安全"。

systemd服务沙箱加固指南2026:暴露评分优化

引言:你的服务到底有多"裸奔"?

如果你管理的Linux服务器上跑着Nginx、PostgreSQL、Redis这些服务,先问你一个扎心的问题——你有没有检查过它们的安全暴露评分?

运行一下 systemd-analyze security,你大概率会看到一堆刺眼的红色数字。说实话,大多数默认安装的服务评分都在8到9之间(满分10分,分数越高越危险)。这意味着什么?简单说,如果其中任何一个服务被攻破,攻击者基本上可以为所欲为——读取整个文件系统、访问其他用户目录、加载内核模块,甚至提升到root权限。想想就后背发凉。

好消息是,systemd很早就内置了一套相当强大的安全沙箱机制。这些机制利用Linux内核的命名空间(namespaces)、能力限制(capabilities)、seccomp系统调用过滤等底层特性,让你可以把每个服务锁在一个精心定义的"笼子"里。更妙的是,你不需要改一行应用代码,也不用装额外的安全工具——这一切都内建在你每天打交道的服务管理器中。

接下来我会带你走一遍systemd服务加固的完整流程:从安全审计和评分解读,到核心加固指令详解,再到Nginx、PostgreSQL和Redis的生产级加固配置,最后聊聊SHH自动化工具。看完之后,你应该能把大部分服务的暴露评分从"危险"降到"安全"级别。

第一章:systemd安全审计——摸清你的暴露面

1.1 用systemd-analyze security做安全评分

systemd自带了一个非常实用的安全审计工具 systemd-analyze security。它会扫描系统中所有运行的服务单元,根据每个服务启用(或没启用)的安全指令,算出一个0到10的暴露评分。

# 查看所有服务的安全评分
sudo systemd-analyze security

# 按暴露分数排序,最危险的排最前面
sudo systemd-analyze security | sort -k 2 -rn

# 查看特定服务的详细安全分析
sudo systemd-analyze security nginx.service

评分含义如下:

  • 0–3分(安全):服务已充分加固,攻击面最小化
  • 4–6分(中等):已有部分加固,但仍有改进空间
  • 7–10分(危险):几乎没有安全限制,被攻破后果很严重

不过要注意,这个评分本质上是个启发式指标,不是安全性的绝对证明。打个比方:如果你用它来扫描你的"房子",它会因为有门有窗而扣分——但你确实需要门窗啊。同理,很多服务必须保留一定的攻击面才能正常工作。重点是确保每个服务只拥有它真正需要的最小权限,而不是追求一个完美的零分。

1.2 详细审计报告解读

对单个服务运行详细分析时,systemd会输出一份逐项检查报告。每一项都标注了当前状态和对应的暴露权重。

# 示例:查看nginx的详细安全分析
sudo systemd-analyze security nginx.service

# 输出类似:
#  NAME                          DESCRIPTION                    EXPOSURE
# ✗ PrivateNetwork=              Service has access to host...   0.5
# ✗ PrivateTmp=                  Service has access to /tmp...   0.1
# ✗ PrivateUsers=                Service has access to other...  0.2
# ✗ ProtectHome=                 Service has access to home...   0.2
# ✗ ProtectSystem=               Service has full access to...   0.2
# ...
# → Overall exposure level for nginx.service: 9.2 UNSAFE 😨

报告中标记为 ✗ 的项目就是你要重点关注的加固目标。每项旁边的数字代表它在总分中的权重——权重越大,修复优先级自然越高。

1.3 确定加固优先级

并非所有服务都需要同等程度的加固。我个人建议按这个优先级来安排:

  1. 直接面向公网的服务(Nginx、Apache、SSH等)——优先级最高,没什么好犹豫的
  2. 处理不可信输入的服务(数据库、消息队列、邮件服务等)
  3. 内部基础设施服务(DNS、NTP、日志收集等)
  4. 系统管理服务(cron、systemd-journald等)——通常已有一定加固

第二章:核心加固指令详解

2.1 文件系统隔离

文件系统隔离是systemd安全加固的基石。通过控制服务能看到和修改文件系统的哪些部分,你可以极大地缩小攻击面。这也是我建议最先着手的加固方向。

ProtectSystem= 控制对系统目录的写入权限:

  • ProtectSystem=yes:将 /usr/boot 挂载为只读
  • ProtectSystem=full:在 yes 的基础上,把 /etc 也设为只读
  • ProtectSystem=strict:将整个文件系统层次结构挂载为只读(除了 /dev/proc/sys)。这是最推荐的选项

用了 strict 模式之后,你需要通过 ReadWritePaths= 显式授予服务写入权限的目录:

[Service]
ProtectSystem=strict
# 只允许写入服务确实需要的目录
ReadWritePaths=/var/log/nginx /var/cache/nginx /run/nginx

ProtectHome= 控制对用户主目录的访问:

  • ProtectHome=yes:让 /home/root/run/user 对服务完全不可见
  • ProtectHome=read-only:允许读取但禁止写入
  • ProtectHome=tmpfs:将这些路径替换为空的tmpfs文件系统

PrivateTmp= 为服务创建独立的 /tmp/var/tmp 命名空间:

[Service]
PrivateTmp=yes
# 服务看到的/tmp实际上是
# /tmp/systemd-private-*-nginx.service-*/tmp
# 与其他进程完全隔离

这个指令相当重要。共享 /tmp 目录中的可预测文件名是一种经典攻击向量(TOCTOU竞态条件攻击),启用PrivateTmp基本上就堵住了这条路。

PrivateDevices= 限制服务对硬件设备的访问:

[Service]
PrivateDevices=yes
# 服务只能访问 /dev/null、/dev/zero、/dev/random 等伪设备
# 无法访问物理磁盘、USB设备等

2.2 权限与能力限制

Linux内核的能力(capabilities)机制把传统root的"全能"权限拆分成了多个细粒度权限。systemd让你可以精确控制服务拥有哪些能力——这比简单地"用root还是不用root"要灵活得多。

NoNewPrivileges= 大概是最简单也最有效的加固指令之一了:

[Service]
NoNewPrivileges=yes
# 确保服务及其所有子进程永远无法通过
# execve()获得新权限——即使执行了setuid程序也不行

就一行配置,效果却非常显著。强烈建议所有服务都加上。

CapabilityBoundingSet= 限制服务可使用的Linux能力集合:

[Service]
# 只允许绑定特权端口(如80/443),删除所有其他能力
CapabilityBoundingSet=CAP_NET_BIND_SERVICE

# 完全清空能力集(最严格)
CapabilityBoundingSet=

常用的能力及其含义(这个列表值得收藏):

  • CAP_NET_BIND_SERVICE:绑定1024以下端口
  • CAP_CHOWN:改变文件所有者
  • CAP_SETUID / CAP_SETGID:切换用户/组身份
  • CAP_DAC_OVERRIDE:绕过文件权限检查
  • CAP_NET_RAW:创建原始套接字(ping等需要)
  • CAP_SYS_ADMIN:几乎等同于root的"万能钥匙"——绝大多数服务都不该有这个

User= / Group= 以非root用户运行服务。坦白说,这往往比用root运行再通过 CapabilityBoundingSet 削减能力更安全、更简洁:

[Service]
User=www-data
Group=www-data
# 如果非root用户需要绑定特权端口,用AmbientCapabilities授予
AmbientCapabilities=CAP_NET_BIND_SERVICE

2.3 系统调用过滤(Seccomp)

系统调用过滤是另一道强有力的防线。通过限制服务可以调用的内核接口,你能进一步收紧安全边界。

SystemCallFilter= 使用seccomp过滤器限制系统调用:

[Service]
# 允许大多数标准服务需要的系统调用集
SystemCallFilter=@system-service

# 在此基础上,显式禁止危险的系统调用组
SystemCallFilter=~@mount @clock @reboot @swap @raw-io @debug

# 限制系统调用架构,防止通过32位兼容层绕过过滤
SystemCallArchitectures=native

systemd预定义了一些很方便的系统调用组,了解这些能帮你快速配置:

  • @system-service:适合大多数后台服务,包含常用调用,排除危险操作
  • @mount:挂载相关调用——如果启用了文件系统隔离,务必禁止
  • @clock:系统时钟操作
  • @reboot:重启/关机相关
  • @debug:调试相关(ptrace等)
  • @privileged:需要特权的调用
  • @raw-io:原始I/O操作

2.4 网络访问限制

对于不需要网络的服务,直接断网就完事了:

[Service]
# 完全禁止网络访问
PrivateNetwork=yes

# 或者只限制网络地址族
RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6

# 或者使用IP地址白名单
IPAddressAllow=localhost 10.0.0.0/8
IPAddressDeny=any

2.5 内存与执行保护

这一组指令覆盖面比较广,每个都不复杂但加在一起效果很好:

[Service]
# 禁止同时可写可执行的内存区域(防止JIT攻击)
MemoryDenyWriteExecute=yes

# 限制可用的命名空间
RestrictNamespaces=yes

# 锁定进程执行域
LockPersonality=yes

# 禁止访问内核日志
ProtectKernelLogs=yes

# 禁止修改内核调优参数
ProtectKernelTunables=yes

# 禁止加载内核模块
ProtectKernelModules=yes

# 禁止修改控制组
ProtectControlGroups=yes

# 禁止创建SUID/SGID文件
RestrictSUIDSGID=yes

第三章:Drop-in覆盖文件——加固的正确姿势

3.1 为什么不能直接改服务文件

永远不要直接编辑 /usr/lib/systemd/system/ 下的原始服务文件。原因很简单:每次软件包更新,这些文件都会被覆盖,你辛辛苦苦写的加固配置全没了。(我早年吃过这个亏,升级一次Nginx配置就白做了。)

正确的做法是使用systemd的drop-in覆盖机制:

# 方法一:使用systemctl edit创建覆盖文件
sudo systemctl edit nginx.service
# 这会打开编辑器,保存后自动创建
# /etc/systemd/system/nginx.service.d/override.conf

# 方法二:手动创建覆盖文件
sudo mkdir -p /etc/systemd/system/nginx.service.d/
sudo nano /etc/systemd/system/nginx.service.d/hardening.conf

3.2 覆盖文件的优先级

systemd服务文件的加载优先级从低到高:

  1. /usr/lib/systemd/system/——软件包安装的原始文件(最低优先级)
  2. /run/systemd/system/——运行时临时文件
  3. /etc/systemd/system/——管理员创建的覆盖文件(最高优先级)

覆盖文件中的指令会追加到(或替换)原始文件中的同名指令。改完之后别忘了重新加载:

# 重新加载systemd配置
sudo systemctl daemon-reload

# 重启服务使加固配置生效
sudo systemctl restart nginx.service

# 验证加固效果
sudo systemd-analyze security nginx.service

第四章:实战加固——Nginx、PostgreSQL与Redis

理论讲够了,下面进入实战环节。我会给出三个最常见服务的生产级加固配置,你可以直接拿去用(当然,根据你的实际环境微调一下路径和能力总是好的)。

4.1 Nginx Web服务器加固

Nginx是最常见的面向公网的服务之一,加固优先级自然最高。以下配置可以将典型的Nginx服务暴露评分从大约9.2降到2.5左右——效果还是相当明显的。

创建文件 /etc/systemd/system/nginx.service.d/hardening.conf

[Service]
# === 文件系统隔离 ===
ProtectSystem=strict
ProtectHome=yes
PrivateTmp=yes
PrivateDevices=yes
ReadWritePaths=/var/log/nginx /var/cache/nginx /run/nginx
ReadOnlyPaths=/etc/nginx /etc/ssl
InaccessiblePaths=/root /boot /mnt /media

# === 权限限制 ===
NoNewPrivileges=yes
CapabilityBoundingSet=CAP_NET_BIND_SERVICE CAP_SETUID CAP_SETGID CAP_KILL CAP_CHOWN CAP_DAC_OVERRIDE
AmbientCapabilities=CAP_NET_BIND_SERVICE

# === 系统调用过滤 ===
SystemCallFilter=@system-service
SystemCallFilter=~@mount @reboot @swap @clock @debug @raw-io
SystemCallFilter=~memfd_create
SystemCallArchitectures=native

# === 网络限制 ===
RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6

# === 内存与执行保护 ===
MemoryDenyWriteExecute=yes
LockPersonality=yes
ProtectKernelTunables=yes
ProtectKernelModules=yes
ProtectKernelLogs=yes
ProtectControlGroups=yes
RestrictNamespaces=yes
RestrictSUIDSGID=yes
ProtectHostname=yes
ProtectClock=yes
ProtectProc=invisible
ProcSubset=pid

应用配置并验证:

# 应用配置
sudo systemctl daemon-reload
sudo systemctl restart nginx

# 确认Nginx正常运行
curl -I http://localhost

# 检查加固后的安全评分
sudo systemd-analyze security nginx.service
# 预期结果:暴露评分从 ~9.2 降到 ~2.5

4.2 PostgreSQL数据库加固

数据库服务需要写入数据目录,但绝对不该访问大部分系统资源。PostgreSQL的加固有个坑需要特别注意——后面会说到。

创建文件 /etc/systemd/system/postgresql.service.d/hardening.conf

[Service]
# === 文件系统隔离 ===
ProtectSystem=strict
ProtectHome=yes
PrivateTmp=yes
PrivateDevices=yes
# PostgreSQL需要写入数据目录和日志
ReadWritePaths=/var/lib/postgresql /var/log/postgresql /var/run/postgresql
ReadOnlyPaths=/etc/postgresql

# === 权限限制 ===
NoNewPrivileges=yes
CapabilityBoundingSet=CAP_CHOWN CAP_SETUID CAP_SETGID CAP_FOWNER CAP_DAC_OVERRIDE
RestrictSUIDSGID=yes

# === 系统调用过滤 ===
SystemCallFilter=@system-service
SystemCallFilter=~@mount @reboot @swap @debug
SystemCallArchitectures=native

# === 网络限制(仅允许TCP/Unix Socket) ===
RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6

# === 内核与内存保护 ===
ProtectKernelTunables=yes
ProtectKernelModules=yes
ProtectKernelLogs=yes
ProtectControlGroups=yes
LockPersonality=yes
RestrictNamespaces=yes
ProtectHostname=yes
ProtectClock=yes

# === 注意:PostgreSQL使用共享内存,不能启用MemoryDenyWriteExecute ===
# MemoryDenyWriteExecute=yes  # 不要启用!会导致PG崩溃

这里划重点:MemoryDenyWriteExecute=yes 千万不能用在PostgreSQL上。PG依赖动态共享内存(DSM)来实现并行查询和其他高级功能,启用这个选项会导致PG无法启动,或者在执行某些查询时直接崩掉。我见过不少人在这里踩坑,排查半天才发现是这个配置的问题。

4.3 Redis缓存服务加固

Redis相对简单,只需要网络访问和有限的文件系统写入。加固起来也比较顺畅。

创建文件 /etc/systemd/system/redis.service.d/hardening.conf

[Service]
# === 文件系统隔离 ===
ProtectSystem=strict
ProtectHome=yes
PrivateTmp=yes
PrivateDevices=yes
ReadWritePaths=/var/lib/redis /var/log/redis /run/redis
ReadOnlyPaths=/etc/redis

# === 权限限制 ===
NoNewPrivileges=yes
CapabilityBoundingSet=CAP_SETUID CAP_SETGID CAP_SYS_RESOURCE
RestrictSUIDSGID=yes

# === 系统调用过滤 ===
SystemCallFilter=@system-service
SystemCallFilter=~@mount @reboot @swap @clock @debug @raw-io
SystemCallArchitectures=native

# === 网络限制 ===
RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6

# === 内核与内存保护 ===
MemoryDenyWriteExecute=yes
ProtectKernelTunables=yes
ProtectKernelModules=yes
ProtectKernelLogs=yes
ProtectControlGroups=yes
LockPersonality=yes
RestrictNamespaces=yes
ProtectHostname=yes
ProtectClock=yes
ProtectProc=invisible
ProcSubset=pid

顺便提一句,Redis通常需要 CAP_SYS_RESOURCE 来调整打开文件数限制(跟maxclients配置相关)。如果你已经在系统层面用ulimit设好了,这个能力其实可以去掉。

4.4 通用基线模板

如果你管的服务比较多,不想逐个分析,下面这个基线模板适用于大多数后台服务:

[Service]
# === 最小安全基线 ===
ProtectSystem=strict
ProtectHome=yes
PrivateTmp=yes
PrivateDevices=yes
NoNewPrivileges=yes
ProtectKernelTunables=yes
ProtectKernelModules=yes
ProtectControlGroups=yes
RestrictSUIDSGID=yes
SystemCallFilter=@system-service
SystemCallArchitectures=native

# === 按需添加写入路径 ===
# ReadWritePaths=/var/lib/myservice /var/log/myservice /run/myservice

思路是先应用基线,启动服务,看日志。出错了再根据日志逐个放宽限制。这种"先锁紧再逐步放松"的策略比"默认全开再逐个限制"安全得多——毕竟你总不希望在加固的过程中漏掉什么。

第五章:SHH自动化加固工具

5.1 什么是SHH

手动加固确实有效,但面对大量服务时就有点力不从心了。这时候SHH(Systemd Hardening Helper)就派上用场了。这是安全研究公司Synacktiv用Rust开发的工具,能通过运行时剖析(runtime profiling)自动生成最优的systemd加固配置。

原理其实不复杂:先用strace跟踪服务在正常运行时实际用了哪些系统调用和资源,然后根据"最小权限原则"生成一套只允许已观察到的操作的加固配置。有点像是先偷偷观察服务的日常行为,再据此定制一个刚好够用的"笼子"。

5.2 安装与使用

# 前提条件:安装strace(≥6.4版本推荐)和Rust编译环境
sudo apt install strace
# 安装Rust(如果还没有)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# 从源码安装SHH
cargo install systemd-hardening-helper

# 步骤1:开始服务剖析
# 服务会在strace跟踪下重启
sudo shh service start-profile nginx.service

# 此时正常使用服务一段时间
# 尽量覆盖各种功能和使用场景
# 例如:发送不同类型的HTTP请求、触发日志轮转等

# 步骤2:结束剖析并应用加固
# -a 标志表示自动应用生成的配置
sudo shh service finish-profile nginx.service -a

# 步骤3:验证服务正常运行
sudo systemctl status nginx.service
sudo systemd-analyze security nginx.service

5.3 SHH的局限性

SHH虽然好用,但有几个局限性你得清楚:

  • 配置不可移植:生成的配置高度依赖运行环境(内核版本、系统库、发行版等),不能直接复制到其他机器上用
  • 剖析覆盖率是个问题:生成的配置只反映剖析期间观察到的行为。如果某个功能在剖析时没被触发过,它在生产环境中就可能被阻止——所以剖析期间要尽量覆盖所有使用场景
  • 有性能开销:strace跟踪期间服务性能会明显下降,别在高流量生产环境中直接搞,应该在预发布环境中进行
  • 需要strace ≥6.4:旧版本可能无法正确捕获所有系统调用信息

第六章:systemd 257+新安全特性

6.1 PrivateUsers=managed模式

systemd 257引入了 PrivateUsers=managed 这个新选项,通过 systemd-nsresourced 自动为服务分配动态的UID/GID范围(65536个),实现了更强大的用户命名空间隔离。相比以前的 PrivateUsers=yes,managed模式在用户映射管理上灵活很多。

[Service]
# systemd 257+ 新特性
PrivateUsers=managed
# 自动获得独立的UID/GID范围
# 无需手动配置用户映射

6.2 cgroup v1淘汰与安全影响

从systemd 257起,cgroup v1(包括legacy和hybrid模式)已经被标记为过时,计划在v258中完全移除。所有现代安全加固都应该基于cgroup v2了。如果你的系统还在跑cgroup v1,是时候规划迁移了。cgroup v2提供了更安全的资源控制和更细粒度的权限管理,这对加固工作来说是实打实的好处。

6.3 RefreshOnReload凭证刷新

systemd 258将引入 RefreshOnReload= 选项,允许在服务reload时自动刷新凭证和扩展配置。对于需要定期轮换密钥或证书的安全敏感服务来说,这个功能还是挺值得期待的。

第七章:加固工作流最佳实践

7.1 渐进式加固策略

对生产服务做加固,急不得。建议遵循这个工作流:

  1. 审计现状:运行 systemd-analyze security 获取所有服务的基线评分
  2. 确定优先级:先搞面向公网的高风险服务
  3. 预发布验证:在测试环境中应用加固配置,充分测试所有功能路径
  4. 逐步应用:先从低风险指令开始(ProtectHome、PrivateTmp),确认无误后再加更严格的限制
  5. 监控告警:加固后密切关注 journalctl -u service 中的权限拒绝日志
  6. 定期复审:软件更新后重新跑安全审计,确认加固配置没被破坏或需要调整

7.2 故障排查思路

加固后服务启动不了或者表现异常?别慌,按这个流程排查:

# 1. 查看服务的详细错误日志
sudo journalctl -u nginx.service -n 50 --no-pager

# 2. 如果怀疑是seccomp过滤导致的问题
# 检查审计日志中的SECCOMP条目
sudo journalctl -k | grep SECCOMP

# 3. 使用strace手动跟踪服务启动过程
sudo strace -f -p $(systemctl show -p MainPID nginx.service --value) 2>&1 | head -100

# 4. 临时禁用加固配置进行对比测试
sudo systemctl revert nginx.service
sudo systemctl restart nginx.service

根据我的经验,最常见的几类问题和对应的解决方案:

  • 服务无法写入日志/数据:检查 ReadWritePaths= 是否包含了所有需要写入的目录
  • 服务无法绑定端口:确认 CapabilityBoundingSet= 里有 CAP_NET_BIND_SERVICE
  • 服务崩溃或段错误:八成是 MemoryDenyWriteExecute=yes 跟JIT编译或动态共享内存冲突了
  • 网络连接失败:看看 RestrictAddressFamilies= 是不是漏了需要的地址族

7.3 与其他安全机制的协同

systemd加固不是孤立的安全措施,它应该是纵深防御体系的一环。几个值得关注的组合:

  • 与AppArmor/SELinux配合:systemd沙箱做进程级隔离,MAC框架做系统级强制访问控制。两者互补,并不冲突
  • 与auditd配合:在启用systemd加固的同时配置auditd审计规则,可以记录被沙箱阻止的操作尝试,对安全分析很有帮助
  • 与防火墙配合:systemd的 IPAddressAllow/IPAddressDeny 做服务级网络限制,nftables/iptables做主机级网络过滤,各管一层
  • 与CIS基线配合:CIS Benchmark中不少服务加固建议可以直接通过systemd指令实现

常见问题解答(FAQ)

systemd-analyze security评分能降到0吗?

理论上可以,但对大多数服务来说没什么意义。评分0意味着服务几乎不能做任何事——没有网络、没有文件系统写入、没有设备访问。实际目标应该是面向公网的服务降到3分以下,内部服务降到5分以下。关键不是追求分数,而是确保每个服务只拥有完成其功能所需的最小权限。

systemd加固会影响性能吗?

大多数指令对性能的影响可以忽略不计。文件系统隔离(ProtectSystem、ProtectHome)用的是内核挂载命名空间,几乎没有运行时开销。seccomp过滤在首次加载时有微小的设置成本,之后每次系统调用的检查开销极低(纳秒级别)。唯一可能有感知的是 PrivateUsers=,因为它需要做UID/GID映射转换,但一般场景下也不明显。

加固配置会在系统更新后丢失吗?

不会——只要你用了正确的drop-in覆盖文件方式。放在 /etc/systemd/system/service.d/ 目录下的覆盖文件不受软件包更新影响。但要注意,软件更新可能引入新功能,需要额外的系统调用或文件系统权限。所以每次大版本更新后重新测试一下服务是否正常,是个好习惯。

MemoryDenyWriteExecute为什么会让某些服务崩溃?

这个指令禁止进程创建同时可写和可执行的内存映射。有些应用偏偏需要这个能力:PostgreSQL用动态共享内存(DSM),部分Java应用依赖JIT编译器,Python某些C扩展也可能需要。如果服务用了这类特性,就不能开启这个选项。遇到段错误或"Operation not permitted"时,第一个怀疑对象就是它。

容器环境中怎么用systemd加固?

如果容器内跑的是systemd(比如systemd-nspawn或某些Docker镜像),加固指令可以正常用。但在Kubernetes之类的编排平台中,建议优先使用平台原生的安全机制(SecurityContext、Pod Security Standards),把systemd加固当补充手段。另外,PrivateUsers=ProtectKernelModules= 在嵌套命名空间环境中可能会有兼容性问题,部署前最好测试一下。

关于作者 Tobias Lindqvist

Tobias spent six years on Canonical's kernel team in the LTS hardening group, mostly working on Livepatch tooling and the long tail of CVE backports nobody wants to do. He left in 2025 to consult independently with Nordic infrastructure customers running large Ubuntu fleets, where most of the work is AppArmor profiles, unattended-upgrades that don't break things, and explaining what kernel.unprivileged_userns_clone actually does. He co-maintains a small open-source tool for diffing kernel config across distributions and contributes occasionally to the linux-hardening mailing list. His side project is a Yocto-based minimal image for industrial gateways that boots in under four seconds with full secure boot. Tobias writes mostly about kernel-level security primitives - namespaces, seccomp, LSMs - with the assumption that you've already read the man page.