在啟用 root_squash 的情況下存取 NFSv4 上 Overlayfs2 上的僅群組資料夾?

在啟用 root_squash 的情況下存取 NFSv4 上 Overlayfs2 上的僅群組資料夾?

背景

對於 NFSv4 匯出/共享,預設啟用的 root_squash 選項將強制 NFS 將客戶端的根變更為匿名 ID。實際上,這將透過防止一個系統上的 root 帳戶所有權遷移到另一個系統來提高安全性。

Overlayfs 允許將本機、透明的檔案系統安裝在另一個檔案系統之上。不幸的是,它似乎使用 root 使用者而不是實際使用者存取底層檔案系統。至少這是我從下面的實驗中得出的結論。

為什麼要在 NFS 共享上掛載 Overlayfs?允許不太受信任的機器假裝它可以寫入共享檔案系統。

測試設定

首先安裝適合您的發行版的 NFS 核心伺服器。然後確保僅導出 NFSv4。 (雖然對於這個問題可能並不重要,但這是一個很好的安全預防措施。)

$ sudo cat /proc/fs/nfsd/versions
-2 -3 +4 +4.1 +4.2

如果沒有,請查看/etc/nfs.conf並設定vers3=n

然後在稀疏檔案中建立 Ext4 檔案系統並將其掛載到本機檔案系統上。這將是支撐我們的 NFS 共享的檔案系統。

$ truncate -s 512M 512BM-ext4.img
$ mkfs.ext4 512BM-ext4.img
$ sudo mkdir /mnt/ext4-file
$ sudo mount -o loop,noacl 512BM-ext4.img /mnt/ext4-file

然後使用 NFSv4 透過網路將此檔案系統共用/匯出到適當的電腦。在此範例中,我將使用 localhost,但它可以是本機網路上的任何電腦。透過編輯/etc/exports如下行來完成此操作。

/mnt/ext4-file/ localhost(ro,fsid=123123)

然後在您的電腦上重新啟動 NFS 伺服器,服務檔案在您的作業系統上可能會有所不同。

$ sudo systemctl restart nfs-server.service nfs-mountd.service
$ sudo exportfs -v
/mnt/ext4-file  localhost(sync,wdelay,hide,no_subtree_check,fsid=123123,sec=sys,ro,secure,root_squash,no_all_squash)

確保root_squashro已啟用。

現在應該可以在您的目標用戶端上掛載 NFSv4 共享了。

$ sudo mount -t nfs -o ro localhost:/mnt/ext4-file /mnt/nfs-share/
$ findmnt /mnt/nfs-share 
TARGET         SOURCE                   FSTYPE OPTIONS
/mnt/nfs-share localhost:/mnt/ext4-file nfs4   rw,relatime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255

然後我們將overlayfs2掛載到這個共享之上。

$ mkdir -p /tmp/overlay/{work,upper}
$ sudo mkdir /mnt/overlay
$ sudo mount -t overlay overlay -o lowerdir=/mnt/nfs-share/,upperdir=/tmp/overlay/upper/,workdir=/tmp/overlay/work/ /mnt/overlay/

在我們的實驗中,我們將在檔案系統中建立一個只能由使用者讀寫和群組讀取的資料夾。我選擇了屬於我的用戶的群組。

$ sudo mkdir /mnt/ext4-file/rovanion
$ sudo chown rovanion:rovanion /mnt/ext4-file/rovanion
$ sudo chmod 2750 /mnt/ext4-file/rovanion
$ touch /mnt/ext4-file/rovanion/hi-from-ext4
$ ls -la /mnt/nfs-share/rovanion/
totalt 8,0K
drwxr-s--- 2 rovanion rovanion 4,0K sep  6 14:14 .
drwxr-xr-x 4 root     root     4,0K sep  6 14:12 ..
-rw-rw-r-- 1 rovanion rovanion    0 sep  6 14:14 hi-from-ext4
$ touch /mnt/nfs-share/rovanion/hi-from-nfs
touch: cannot touch '/mnt/nfs-share/rovanion/hi-from-nfs': Read-only file system

我們可以列出 的內容/mnt/nfs-share/rovanion,但即使我們有權限也無法觸及檔案系統,因為 NFS 共享掛載​​為唯讀。一切都如預期。

失敗

但問題來了。

$ ls -la /mnt/overlay/rovanion/
ls: cannot open directory '/mnt/overlay/rovanion/': Permission denied
$ ls -l /mnt/overlay/
total 28K
drwx------ 2 root     root      16K Sep  6 13:04 lost+found
drwxr-s--- 2 rovanion rovanion 4.0K Sep  6 14:14 rovanion
$ whoami
rovanion
$ groups
rovanion sudo

/mnt/overlay/rovanion儘管權限系統應該允許我們這樣做,但我們仍被拒絕存取清單。

我對正在發生的事情的最佳猜測是,Overlayfs 執行對底層文件系統的所有訪問,其中rootNFS 的根南瓜被映射到nobody不允許訪問該文件夾的人,因為nobody不屬於該組rovanion,並且不允許其他人存取該資料夾。

問題

我的問題是:是否可以解決這個問題?允許使用者透過 Overlayfs 存取只有選定群組有權存取的資料夾,而無需在 NFS 匯出/共用上停用 root_squash 或新增o+rx至該資料夾。

答案1

以下部分的關於 Overlayfs 的 Linux 核心文檔描述了權限模型。

覆蓋檔案系統中的權限檢查遵循以下原則:

1) permission check SHOULD return the same result before and after copy up
2) task creating the overlay mount MUST NOT gain additional privileges
3) non-mounting task MAY gain additional privileges through the overlay, compared to direct access on underlying lower or upper filesystems

這是透過對每次訪問執行兩次權限檢查來實現的

a) check if current task is allowed access based on local DAC (owner, group, mode and posix acl), as well as MAC checks
b) check if mounting task would be allowed real operation on lower or upper layer based on underlying filesystem permissions, again including MAC checks

檢查 (a) 確保一致性 (1),因為所有者、群組、模式和 posix acl 被複製。另一方面,它可能會導致伺服器強制執行的權限(例如,由 NFS 使用)被忽略 (3)。

檢查 (b) 確保沒有任務獲得安裝任務沒有 (2) 所沒有的底層權限。這也意味著可以創建不滿足一致性規則 (1) 的設定;但是,通常情況下,安裝任務將具有足夠的權限來執行所有操作。

強調我的。我的讀到的是我已經成功地創造了這樣的情況。其中一種情況是,以 root 身分執行的安裝任務沒有列出資料夾的權限,因此 Overlayfs 不允許使用者存取該資料夾。

如果我們以允許存取檔案的使用者身分掛載 Overlayfs,該使用者不是 root,這樣 UID 就不會被壓縮,那麼也許我們可以列出目錄並在其中建立一個檔案?

$ unshare --mount --map-root-user
# mount -t overlay overlay -o lowerdir=/mnt/nfs-share/,upperdir=/tmp/overlay/upper/,workdir=/tmp/overlay/work/ /mnt/overlay/
# ls -la /mnt/overlay/
totalt 28K
drwxrwxr-x 1 root   root    4,0K sep  6 14:08 .
drwxr-xr-x 7 nobody nogroup 4,0K sep  6 14:09 ..
drwx------ 2 nobody nogroup  16K sep  6 13:04 lost+found
drwxr-s--- 2 root   root    4,0K sep  6 14:14 rovanion
# touch /mnt/overlay/rovanion/hi-from-overlay

我們可以!並且該檔案僅存在於覆蓋層中。

$ ls /mnt/ext4-file/rovanion/
hi-from-ext4
$ ls /tmp/overlay/upper/rovanion/
hi-from-overlay

儘管這個解決方案有它自己有趣的含義。現在,我們必須在並非 100% 受信任的電腦上啟用使用者命名空間,並且我們突然存在於一個 UID 看起來為 0 但映射到外部世界的普通用戶 ID 的空間中。不幸的是unshare --mount,沒有--map-root-user似乎不可能。

相關內容