Windows 使用者可以覆蓋 CIFS/SMB 共享上文件的 NFSv4/Solaris ACL 權限(授予自己完全訪問權限),我該如何防止這種情況?
我在具有 Solaris 核心模組的 OmniOS 伺服器上設置了 SMB/CIFS 文件共享,該核心模組使用 NFSv4 ACL,應該可以與 Windows 客戶端正常工作。
我想創建一個具有以下目標的共享目錄:使用者(假設
alice
)應該能夠創建和修改文件,但不能刪除它們。還應防止創建子目錄。應該允許讀訪問。我嘗試了以下 ACL,它基本上可以工作:
/usr/bin/chmod A=\ user:root:rwxpdDaARWcCos:fd-----:allow,\ # root has full access user:alice:rwx---a-R-c--s:-------:allow,\ # dir: create files, read everything user:alice:rwxp--aARWc--s:f-i----:allow \ # files: wpAW is needed for full file write access, everything is only inherited to files /pool/share
但是,如果在 Windows 資源管理器中查看新添加文件
alice
的安全選項卡,她可以授予自己完全訪問權限並在之後刪除該文件,即使她沒有Co
權限。如何解釋這種行為?以及如何更改它以使 ACL 不能被修改?
編輯: 的輸出
ls
似乎是正常的:# /usr/bin/ls -v total 1 -rwx------+ 1 alice staff 3 2016-03-21 test.txt 0:user:root:read_data/write_data/append_data/read_xattr/write_xattr /execute/delete_child/read_attributes/write_attributes/delete /read_acl/write_acl/write_owner/synchronize:inherited:allow 1:user:alice:read_data/write_data/append_data/read_xattr /write_xattr/execute/read_attributes/write_attributes/read_acl /synchronize:inherited:allow # /usr/bin/ls -V total 1 -rwx------+ 1 alice staff 3 2016-03-21 test.txt user:root:rwxpdDaARWcCos:------I:allow user:alice:rwxp--aARWc--s:------I:allow
ls
目錄本身的輸出:# /usr/bin/ls -Vd drwx------+ 3 root root 4 2016-03-21 . user:root:rwxpdDaARWcCos:fd-----:allow user:alice:rwx---a-R-c--s:-------:allow user:alice:rwxp--aARWc--s:f-i----:allow # /usr/bin/ls -vd drwx------+ 3 root root 4 2016-03-21 . 0:user:root:list_directory/read_data/add_file/write_data /add_subdirectory/append_data/read_xattr/write_xattr/execute /delete_child/read_attributes/write_attributes/delete/read_acl /write_acl/write_owner/synchronize:file_inherit/dir_inherit:allow 1:user:alice:list_directory/read_data/add_file/write_data /read_xattr/execute/read_attributes/read_acl/synchronize:allow 2:user:alice:list_directory/read_data/add_file/write_data /add_subdirectory/append_data/read_xattr/write_xattr/execute /read_attributes/write_attributes/read_acl/synchronize :file_inherit/inherit_only:allow
共享的文件系統是 ZFS。最有趣的非預設屬性如下:
NAME PROPERTY VALUE SOURCE pool/share type filesystem - pool/share compression lz4 inherited from pool pool/share atime off local pool/share aclmode restricted local pool/share aclinherit passthrough local pool/share version 5 - pool/share utf8only on - pool/share normalization formD - pool/share casesensitivity insensitive - pool/share nbmand on local pool/share sharesmb name=testshare local
CIFS 共享權限設置為允許所有人完全訪問,因此應僅應用文件權限。
更新:
該執行緒與我的問題非常相似,儘管在我的情況下減少 ACL 的解決方案
/pool/share/.zfs/shares/testshare
(modify_set
或拒絕使用者特定的刪除權限)似乎不起作用,我不知道為什麼。
在忽略了這個問題一周後,它現在突然起作用了……我不知道是什麼原因造成的,但是它起作用了……我嘗試了此部落格的建議,但將其修改為包含
AW
為權利。然後我再次對其進行了測試,這次只使用了舊的拒絕規則(完全覆蓋新規則),這也有效。最後,我使用了我自己的問題中的第一個設置,這些設置從未奏效,但現在他們做到了。經過更多測試,我認為這是因為之前未重新啟動 SMB 服務,並且無法正確辨識共享 ACL。改變它們是我可以恢復舊的(和錯誤的)行為的唯一方法。
因此,為了將來參考,解決方案是定義文件本身的正常權限,而不是
Co
共享級別的權限:
- 將以下 ACL 規則應用於目錄和(繼承)所有新創建的文件:
/usr/bin/chmod A=\ user:root:rwxpdDaARWcCos:fd-----:allow,\ # root has full access user:alice:rwx---a-R-c--s:-------:allow,\ # dir: create files, read everything user:alice:rwxp--aARWc--s:f-i----:allow \ # files: wpAW is needed for full file write access, everything is only inherited to files /pool/share
- 將以下 ACL 規則應用於 ZFS 數據集的隱藏共享目錄(這是防止所有者修改 ACL 所必需的,有關詳細資訊,請參閱@embedded 的答案和連結的 serverfault 文章):
/usr/bin/chmod A=\ user:root:full_set:-------:allow,\ # root has full access everyone@:modify_set:-------:allow \ # anyone else cannot modify permissions /pool/share/.zfs/shares/testshare
- 重新啟動 SMB 伺服器(需要更新更改的共享 ACL,請參閱此執行緒):
svcadm restart svc:/network/smb/server:default # restart service svcs -xv svc:/network/smb/server:default # check if the startup date has changed
現在可以創建和寫入新文件,但不能刪除,Windows 使用者也不能賦予自己額外的權限。該解決方案適用於我的情況,但我可以看到兩個小缺點:
- 如果將來應該設置其他權限,您必須記住/記錄您更改了共享級別。
- 使用者可能會修改文件的內容。例如,
alice
可以覆蓋文本文件中的字元或行。我認為這是因為我使用的應用程序需要附加和寫入權限,並且沒有 ACL 檢查“僅初始寫入”或類似內容。
恕我直言,如果您刪除使用者、組和每個人的瑣碎 acl,一切都會變得非常混亂。需要考慮的事項:
- 在拒絕權限或缺少文件訪問權限的情況下,權限子系統確定授予文件所有者或超級使用者的訪問請求。這種機制可以防止文件所有者被鎖定在他們的文件之外,並使超級使用者能夠修改文件以進行恢復。
- 基於 POSIX 草案的 ACL 使用單個條目來定義允許哪些權限以及拒絕哪些權限。新的 ACL 模型有兩種影響訪問檢查的 ACE:ALLOW 和 DENY
- 文件的所有者無條件地被授予 write_acl 權限,即使該權限被明確拒絕。
- 如果您更改文件的權限,文件的 ACL 也會相應更新。此外,如果您刪除授予使用者訪問文件或目錄的非普通 ACL,則該使用者仍然可以訪問文件或目錄,因為文件或目錄的權限位授予組或所有人訪問權限
所以我的方法是根據需要修改瑣碎的 acls(使用拒絕模式),而不是為所有特殊案例添加非瑣碎的 acls。請記住這一點:
- 授予允許權限後,不能被同一 ACL 權限集中的後續 ACL 拒絕條目拒絕。
如果不知道 OmniOS 是什麼,但這些文件幫助我了解 NFS ACL。我們使用帶有 ZFS 的 Solaris https://docs.oracle.com/cd/E53394_01/html/E54801/ftyxi.html#scrolltoc