如何将 systemd 中的单元目录列入白名单

如何将 systemd 中的单元目录列入白名单

单位有很多选项(如服务)系统。其中三个称为ReadWriteDirectoriesReadOnlyDirectoriesInaccessibleDirectories。我在虚拟机上使用 Debian 8.5。在某些(较新的?)版本的 systemd 中,它们被称为ReadWritePaths,ReadOnlyPathsInaccessiblePaths。我可以使用此选项将应该可访问的目录列入白名单吗?

我有一个已知只能访问某些目录的应用程序。我想限制对此目录的访问。但如果我用来ReadWritePaths指定这个目录,它似乎没有任何效果。这联机帮助页

ReadWriteDirectories= 中列出的目录可以从命名空间内部访问,并且具有与外部相同的访问权限。

但此选项中未指定的目录似乎可以通过相同的方式访问。如何拒绝访问所有未指定的内容?或者是我的系统不起作用?有人可能认为可以将InaccessibleDirectories=/其他所有内容列入黑名单,但新版本的联机帮助页(该选项被称为)除外,InaccessiblePaths

InaccessiblePaths= 中列出的条目将无法被命名空间内的进程访问,并且可能不计算任何其他挂载点,包括由 ReadWritePaths= 或 ReadOnlyPaths= 指定的挂载点。

那么,是否可以使用ReadWriteDirectoriesReadOnlyDirectories设置目录白名单?如果不可能,为什么ReadWriteDirectories它看起来什么也没做却还存在呢?

答案1

ReadWritePaths及其同类产品只有与以下选项一起使用时才真正有用黑名单某些路径。如果您知道您的应用程序应该只能访问某些路径,您可以执行以下操作的某种组合:

  • 设置ProtectSystem=strict特定目录并将其列入白名单以使用ReadWritePaths.
  • 设置ReadOnlyPaths特定目录并将其列入白名单ReadWritePaths。如果使用 执行此操作/,它会执行所做操作的超集ProtectSystem(它还限制 /dev、/proc 和 /sys,您可能不想要这些)。您还可以使用PrivateDevicesProtectKernelTunables、 和ProtectControlGroups来保护这些目录。

答案2

根据最近的文档(链接1,链接2),自2018年起:

InaccessiblePaths=命名空间内的进程以及文件系统层次结构中位于其下方的所有内容都将无法访问中列出的路径。这可能比预期的限制更多,因为不可能在其中嵌套ReadWritePaths=ReadOnlyPaths=BindPaths=或。BindReadOnlyPaths=有关更灵活的选项,请参阅TemporaryFileSystem=

[ TemporaryFileSystem=] 可用于隐藏与单元调用的进程无关的文件或目录,而必要的文件或目录仍然可以通过与BindPaths=或组合来访问BindReadOnlyPaths=

因此可以实现所需的行为:

[Service]
TemporaryFileSystem=/
BindPaths=/var/readwrite
BindReadOnlyPaths=/var/readonly

答案3

既然你具体问的是将读取权限列入白名单

您也许可以使用 来实现这一点InaccessiblePaths,如下所示:

[Service]
...
InaccessiblePaths=/
ReadOnlyPaths=/etc/myapp.conf

系统执行(5)

相关内容