Hacker News 中文摘要

RSS订阅

SystemD 服务强化 -- SystemD Service Hardening

文章摘要

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:防止进程通过 setuidsetgid 提升权限。 - 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 管理员更好地提升系统安全性,尤其是在自托管环境中。不要追求完美,而是根据实际情况应用这些配置,您的实验室和互联网将因此变得更加安全。

评论总结

评论内容总结:

  1. 对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)
  2. 对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)
  3. 对文章质量的评价

    • 有评论认为文章质量较低,缺乏实质性内容。
      • "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)
  4. 对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)
  5. 对安全扫描工具的讨论

    • 有评论指出安全扫描工具的效果可能被过度依赖,用户可能会为了获得高分而做出不合理的调整。
      • "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命名的讨论也较为突出。