文章摘要
SystemD提供了强大的服务控制功能,但其默认配置并非以安全为首要考虑。本文介绍了多种加固SystemD服务单元和Podman Quadlet的方法,以提升整体安全性,减少被攻击的可能性和影响范围。需要注意的是,不同服务需要根据其功能进行个性化配置,加固过程中需不断实验和调整,本文仅作为参考工具而非通用解决方案。
文章总结
SystemD 服务加固指南
尽管存在争议,SystemD 提供了一种非常完整且强大的方法来控制服务(以及其他许多 Linux 功能)。然而,许多默认配置是为了确保服务能够顺利运行,而不是为了安全性。本文旨在提供一系列加固选项,帮助提升 SystemD 服务单元和 Podman Quadlets 的整体安全性,降低被攻击的可能性以及攻击后的影响范围。
警告:本文并非 SystemD 服务安全的规范性指南。不同服务需要根据其功能需求进行不同的配置。在应用这些配置时,可能会遇到服务无法启动的情况,此时需要根据日志进行调整。确保基础设施的安全是您的责任,本文仅作为工具提供参考。
SystemD 安全分析
在决定如何提升 SystemD 单元的安全性之前,首先需要了解当前的安全状况。可以使用 systemd-analyze security 命令来分析所有已部署的单元,或针对特定单元进行详细分析。通过该命令,您可以获得系统整体安全状况的高层次概览。
例如,运行以下命令分析 sshd.service 的安全状况:
bash
sudo systemd-analyze security sshd.service
输出结果将显示多个安全指标,包括:
1. 勾选/叉号:表示是否启用了某项安全措施。
2. 名称:安全功能的名称,用于在单元文件中进行配置。
3. 描述:安全功能的简要说明。
4. 暴露值:量化风险评分,用于优先处理高风险项。
如何修改配置
所有安全配置都应在 SystemD 单元文件的 [Service] 部分或 Podman Quadlet 的 [Container] 部分进行修改。这些文件通常位于 /etc/systemd/system/ 或 /etc/containers/systemd/ 目录下。
提示:SystemD 支持通过 sudo systemctl edit ServiceName.service 命令自动生成覆盖文件。您也可以手动创建 /etc/systemd/system/ServiceName.service.d/override.conf 文件,仅指定需要修改的部分。
SystemD 服务安全选项
以下是一些常用的安全选项:
- ProtectSystem:将整个文件系统挂载为只读,保护系统文件。
- ProtectHome:禁止访问 /home/、/root 和 /run/user 目录。
- PrivateDevices:限制对物理设备的访问,仅允许访问伪设备如 /dev/null。
- NoNewPrivileges:防止进程通过 setuid 或 setgid 提升权限。
- SystemCallFilter:限制服务可以使用的系统调用,防止滥用。
示例配置
以下是一个 Traefik 反向代理的 SystemD 单元文件示例,展示了如何应用安全配置: ```ini [Unit] Description=Traefik Reverse Proxy with Socket Activation Requires=http.socket https.socket
[Container] ContainerName=traefik HostName=traefik Image=docker.io/traefik:v3 Network=traefik.network Volume=traefik-config.volume:/etc/traefik/:Z Volume=/var/log/traefik:/logs/:Z AutoUpdate=registry Notify=true
[Service] Restart=always MemoryMax=512M Sockets=http.socket https.socket
Security Tuning
ProtectHome=yes ProtectClock=yes ProtectKernelLogs=yes ProtectKernelModules=yes ProtectSystem=full RestrictSUIDSGID=yes UMask=0077 SystemCallArchitectures=native SystemCallFilter=@system-service @mount @privileged RestrictRealtime=yes RestrictIPC=yes LockPersonality=yes RestrictAddressFamilies=AFINET AFINET6 AFUNIX AFNETLINK MemoryDenyWriteExecute=yes CapabilityBoundingSet=~CAPSETUID CAPSETPCAP
[Install] WantedBy=default.target ```
结论
虽然可以对所有服务进行加固,但这并非必须。本文提供的工具和方法可以帮助 Linux 管理员更好地提升系统安全性,尤其是在自托管环境中。不要追求完美,而是根据实际情况应用这些配置,您的实验室和互联网将因此变得更加安全。
评论总结
评论内容总结:
对systemd的正面评价:
- 有评论认为systemd提供了强大的隔离和安全性提升,尤其是在容器管理方面。
- "Great write up! [...] this is an exemplary list of awesome ways systemd can easily quickly readily provide a massive boost to isolation & security." (评论3)
- "Another great security feature systemd provides is credential management [...]" (评论12)
- 有评论提到systemd的标准化和统一性优于旧的init脚本。
- "And that's something that's impossible to do with old init scripts, that are all unique in their way and not uniform at all." (评论4)
- 有评论认为systemd提供了强大的隔离和安全性提升,尤其是在容器管理方面。
对systemd的负面评价:
- 有评论认为systemd的硬化措施难以推广,因为责任被推给了终端用户。
- "this will not take off I'm afraid, because locking these unitfiles down is offloaded to the end-user [...]" (评论8)
- 有评论认为systemd的某些功能并不实用,甚至建议使用其他替代方案。
- "Best systemd hardening is switching to OpenRC or runit" (评论6)
- 有评论认为systemd的硬化措施难以推广,因为责任被推给了终端用户。
对文章质量的评价:
- 有评论认为文章质量较低,缺乏实质性内容。
- "this is ... very low quality, and very low density. why did someone feel it was useful to post to HN?" (评论5)
- 有评论认为文章提供了实用的调试建议。
- "Nice tip on debugging syscall issues!" (评论1)
- 有评论认为文章质量较低,缺乏实质性内容。
对systemd命名的讨论:
- 有评论指出systemd的正确拼写应为小写,而非“SystemD”。
- "Yes, it is written systemd, not system D or System D, or even SystemD." (评论2)
- "The proper spelling of systemd is systemd, not SystemD." (评论16)
- 有评论指出systemd的正确拼写应为小写,而非“SystemD”。
对安全扫描工具的讨论:
- 有评论指出安全扫描工具的效果可能被过度依赖,用户可能会为了获得高分而做出不合理的调整。
- "The unreasonable effectiveness of writing a security scanner. People will do anything it takes to make the scanner give a perfect score, regardless of whether it makes sense." (评论15)
- 有评论指出安全扫描工具的效果可能被过度依赖,用户可能会为了获得高分而做出不合理的调整。
总结:评论中对systemd的评价呈现两极分化,既有对其安全性和标准化的高度认可,也有对其硬化措施和实用性的质疑。同时,评论中对文章质量和systemd命名的讨论也较为突出。