单位有很多选项(如服务)系统。其中三个称为ReadWriteDirectories
、ReadOnlyDirectories
和InaccessibleDirectories
。我在虚拟机上使用 Debian 8.5。在某些(较新的?)版本的 systemd 中,它们被称为ReadWritePaths
,ReadOnlyPaths
和InaccessiblePaths
。我可以使用此选项将应该可访问的目录列入白名单吗?
我有一个已知只能访问某些目录的应用程序。我想限制对此目录的访问。但如果我用来ReadWritePaths
指定这个目录,它似乎没有任何效果。这联机帮助页说
ReadWriteDirectories= 中列出的目录可以从命名空间内部访问,并且具有与外部相同的访问权限。
但此选项中未指定的目录似乎可以通过相同的方式访问。如何拒绝访问所有未指定的内容?或者是我的系统不起作用?有人可能认为可以将InaccessibleDirectories=/
其他所有内容列入黑名单,但新版本的联机帮助页(该选项被称为)除外,InaccessiblePaths
说
InaccessiblePaths= 中列出的条目将无法被命名空间内的进程访问,并且可能不计算任何其他挂载点,包括由 ReadWritePaths= 或 ReadOnlyPaths= 指定的挂载点。
那么,是否可以使用ReadWriteDirectories
和ReadOnlyDirectories
设置目录白名单?如果不可能,为什么ReadWriteDirectories
它看起来什么也没做却还存在呢?
答案1
ReadWritePaths
及其同类产品只有与以下选项一起使用时才真正有用黑名单某些路径。如果您知道您的应用程序应该只能访问某些路径,您可以执行以下操作的某种组合:
- 设置
ProtectSystem=strict
特定目录并将其列入白名单以使用ReadWritePaths
. - 设置
ReadOnlyPaths
特定目录并将其列入白名单ReadWritePaths
。如果使用 执行此操作/
,它会执行所做操作的超集ProtectSystem
(它还限制 /dev、/proc 和 /sys,您可能不想要这些)。您还可以使用PrivateDevices
、ProtectKernelTunables
、 和ProtectControlGroups
来保护这些目录。
答案2
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