Security

如何在 systemd 中將 Units 的目錄列入白名單

  • December 5, 2020

systemd中有許多可用於 Units 的選項(如服務)。其中三個稱為ReadWriteDirectories和。我在虛擬機上使用 Debian 8.5。在一些(較新的?)systemd 版本中,它們被稱為,和. 我可以使用此選項將應該可以訪問的目錄列入白名單嗎?ReadOnlyDirectories``InaccessibleDirectories``ReadWritePaths``ReadOnlyPaths``InaccessiblePaths

我有一個已知只能訪問某些目錄的應用程序。我想限制對這個目錄的訪問。ReadWritePaths但是如果我用來指定這個目錄,它似乎沒有任何效果。手冊

ReadWriteDirectories= 中列出的目錄可以從命名空間內訪問,具有與外部相同的訪問權限。

但是此選項中未指定的目錄似乎可以以相同的方式訪問。如何拒絕訪問未指定的所有內容?還是我的系統無法正常工作?InaccessibleDirectories=/有人可能會認為,除了新版本的聯機幫助頁(該選項被呼叫的地方)之外,它可能會用於將其他所有內容列入黑名單InaccessiblePaths,說

InaccessiblePaths= 中列出的條目將無法被命名空間內的程序訪問,並且可能不包括任何其他掛載點,包括由 ReadWritePaths= 或 ReadOnlyPaths= 指定的那些。

那麼,是否有可能使用ReadWriteDirectoriesReadOnlyDirectories設置目錄白名單?如果不可能,為什麼ReadWriteDirectories它似乎什麼都不做?

根據最近的文件(連結 1連結 2),自 2018 年以來:

InaccessiblePaths=命名空間內的程序以及文件系統層次結構中它們下面的所有內容都將無法訪問其中列出的路徑。這可能比期望的限制更多,因為不可能嵌套ReadWritePaths=, ReadOnlyPaths=, BindPaths=, 或BindReadOnlyPaths=在其中。有關更靈活的選項,請參閱TemporaryFileSystem=

[ TemporaryFileSystem=] 用於隱藏與單元呼叫的程序無關的文件或目錄,而必要的文件或目錄仍然可以通過組合訪問BindPaths=或訪問BindReadOnlyPaths=

因此可以實現所需的行為:

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

ReadWritePaths及其同類僅在與將某些路徑*列入黑名單的選項一起使用時才真正有用。*如果您知道您的應用程序應該只能訪問某些路徑,則可以執行以下組合:

  • 設置ProtectSystem=strict特定目錄並將其列入白名單以使用ReadWritePaths.
  • 使用設置ReadOnlyPaths特定目錄並將其列入白名單ReadWritePaths。如果使用 執行此/操作,它會執行操作的超集ProtectSystem(它還限制您可能不想要的 /dev、/proc 和 /sys)。您還可以使用PrivateDevicesProtectKernelTunablesProtectControlGroups來保護這些目錄。

引用自:https://unix.stackexchange.com/questions/305586