本文介紹NFSv4 ACL和POSIX ACL相關的特性。
NAS NFSv4 ACL特性
ACE類型只支援Allow,不支援Deny、Audit和Alarm。
Deny ACE會極大增加使用權限設定的複雜性,容易給使用者造成混淆而留下安全問題。業界已達成共識應盡量避免使用Deny ACE。不支援Deny ACE的詳細介紹,請參見常見問題。
Audit ACE和Alarm ACE在阿里雲NAS NFS上不生效。如果需要審計和警示功能,可以在阿里雲控制台上進行配置。
未設定ACL的檔案或目錄會呈現與mode對應的預設ACL。樣本如下:
執行
touch file命令,進入file檔案。執行
ls -l file命令,查看file檔案的許可權。-rw-r--r--. 1 root root 0 May 6 14:27 file執行
nfs4_getfacl file命令,查看file檔案當前的ACL許可權。# file: file A::OWNER@:rwatTnNcCy A::GROUP@:rtncy A::EVERYONE@:rtncy
ACE按照一定順序排列並去重,使ACL顯示結果更清晰易懂。
使用者增加或修改ACE時,如果ACL中已經存在繼承類型完全的ACE,則新的ACE會和舊的ACE的Allow bits進行合并。 例如:
排序時owner、group、everyone對應的ACE總是排在最前面。
您可執行
nfs4_getfacl file命令,查看file檔案ACL許可權順序。# file: file A::OWNER@:rwaxtTnNcCy A::GROUP@:rtncy A::EVERYONE@:rtncy A::1001:rwaxtTNcCy為使用者1009增加一條讀寫權限的ACE,按照順序排序後排在使用者1001後面。
執行命令
nfs4_setfacl -a A::1009:X file nfs4_getfacl file返回樣本
# file: file A::OWNER@:rwaxtTcCy A::GROUP@:rwatcy A::EVERYONE@:tcy A::1001:rwaxtTNcCy A::1009:waxtTncCy
為使用者1009增加執行許可權的ACE,系統自動將新增的執行許可權合并到使用者1009已有的ACE中。
執行命令
nfs4_setfacl -a A::1009:W file nfs4_getfacl file返回樣本
# file: file A::OWNER@:rwaxtTcCy A::GROUP@:rwatcy A::EVERYONE@:tcy A::1001:rwaxtTNcCy A::1009:waxtTncCy
為使用者1009增加fd繼承許可權的ACE,系統會將它拆分為只擁有繼承能力的ACE和只對本檔案起作用的ACE,並將兩個ACE與ACL中同繼承類型的ACE進行合并。
執行命令
nfs4_setfacl -a A:fd:1009:R file nfs4_getfacl file返回樣本
# file: file A::OWNER@:rwaxtTcCy A::GROUP@:rwatcy A::EVERYONE@:tcy A::1001:rwaxtTNcCy A::1009:rwaxtTNcCy A:fdi:1009:r
支援所有繼承特性。
假設目前的目錄dir的許可權是owner可寫,group可讀,everyone不能訪問。
執行命令
nfs4_getfacl dir返回樣本
# file: dir A::OWNER@:rwaDxtTnNcCy A::GROUP@:rxtcy A::EVERYONE@:tncy
給使用者1000增加讀寫權限並且可繼承。
執行命令
nfs4_setfacl -a A:fd:1000:rwx dir nfs4_getfacl dir返回樣本
# file: dir A::OWNER@:rwaDxtTcCy A::GROUP@:rxtcy A::EVERYONE@:tcy A::1000:rwx A:fdi:1000:rwx
在目錄dir下建立的檔案或目錄就自動帶有繼承的ACE。
在目錄dir下建立檔案
執行命令
touch dir/file nfs4_getfacl dir/file返回樣本
# file: dir/file A::OWNER@:rwatTcCy A::GROUP@:rwatcy A::EVERYONE@:rwatcy A::1000:rwx
在目錄dir下建立目錄
執行命令
mkdir dir/subdir nfs4_getfacl dir/subdir返回樣本
# file: dir/subdir A::OWNER@:rwaDxtTcCy A::GROUP@:rwaDxtcy A::EVERYONE@:rwaDxtcy A:fdi:1000:rwx
說明建議EVERYONE許可權盡量小。在執行相應的代碼前請先執行
umask 777,這樣建立檔案和目錄時傳入的mode會變成000,可以讓預設的許可權最小化,詳情請參見umask與預設mode。Linux檔案和目錄的系統調用,預設會傳入mode作為參數。按照RFC7530協議標準,需要在繼承ACL之後再疊加上mode操作修改ACL,而按照協議如果修改了group的mode,需要保證所有群組的ACE都小於等於group mode的許可權。而這會導致群組的繼承失效。例如:子檔案原本要繼承Group A: RWX,但是預設傳入的mode是GROUPS: R,則子檔案的Group A的ACE會變成Group A: R。為了規避該問題,實際情況下mode不會修改ACL除owner、group、everyone之外的其他群組,語義更簡單。需要移除某個群組的許可權可以直接刪除對應的ACE。
多個機器間的使用者名稱與UID和GID的映射需要自我維護。
目前阿里雲NAS NFS鑒權採用的是IP安全性群組,不支援使用者名稱鑒權。使用者佈建的NFSv4 ACL在後端儲存的是UID和GID的ACE,在NFSv4 ACL用戶端顯示時會自動載入本地的/etc/passwd將UID和GID轉化成使用者名稱和群組名。您需要管理多個機器間的使用者名稱與UID和GID之間的映射,確保同一個使用者名稱或同一群組名映射到相同的UID和GID,以免發生錯誤。
支援通過Extended Attributes輸出NFSv4 ACL。
執行命令
getfattr -n system.nfs4_acl file返回樣本
# file: file system.nfs4_acl=0sAAAABgAAAAAAAAAAABYBhwAAAAZPV05FUkAAAAAAAAAAAAAAABIAhwAAAAZHUk9VUEAAAAAAAAAAAAAAABIAhwAAAAlFVkVSWU9ORUAAAAAAAAAAAAAAAAAAAAEAAAAEMTAwMAAAAAAAAAALAAAAAwAAAAQxMDAwAAAAAAAAAEAAFgGQAAAABTEwMDAxAAAA
支援cp等工具遷移NFSv4 ACL。
阿里雲NAS支援使用Redhat NFSv4 ACL遷移工具說明中提到的cp、tar、rsync工具遷移NFSv4 ACL。
下面例子中
cp --preserve=xattr file1 file2拷貝file1到file2時拷貝了ACL。cp -ar dir1 dir2拷貝dir1到dir2時拷貝了ACL。說明rsync工具可能由於版本低於3.1.2而不能遷移NFSv4 ACL。
樣本一:遷移檔案ACL。
執行
nfs4_getfacl file1命令,查看file1檔案的ACL許可權。# file: file1 A::OWNER@:rwatTcCy A::GROUP@:rwatcy A::EVERYONE@:rwatcy A::1000:rtncy執行
cp --preserve=xattr file1 file2命令,拷貝file1 ACL至file2。執行
nfs4_getfacl file2命令,查看file2檔案的ACL許可權。# file: file2 A::OWNER@:rwatTcCy A::GROUP@:rwatcy A::EVERYONE@:rwatcy A::1000:rtncy
樣本二:遷移目錄ACL。
執行
nfs4_getfacl dir1命令,查看dir1目錄的ACL許可權。# file: dir1 A::OWNER@:rwaDxtTnNcCy A::GROUP@:rxtncy A::EVERYONE@:rxtncy A::1000:rxtncy執行
cp -ar dir1 dir2命令,拷貝dir1 ACL至dir2。執行
nfs4_getfacl dir2命令,查看dir2目錄的ACL許可權。# file: dir2 A::OWNER@:rwaDxtTnNcCy A::GROUP@:rxtncy A::EVERYONE@:rxtncy A::1000:rxtncy
支援NFSv4 ACL和mode之間的互操作,修改ACL可能引起mode的改變,反之亦然。
例如,檔案file當前mode為0666,則檔案許可權和ACL許可權樣本如下。
執行
ls -l file命令,查看file檔案許可權。-rw-rw-rw-. 1 root root 0 May 3 2019 file執行
nfs4_getfacl file命令,查看file檔案的ACL許可權。# file: file A::OWNER@:rwatTcCy A::GROUP@:rwatcy A::EVERYONE@:rwatcy
通過設定mode給owner增加執行許可權,相應ACE也會增加執行許可權。樣本如下:
執行
chmod u+x file命令,給owner增加執行許可權。執行
ls -l file命令,查看檔案許可權。-rwxrw-rw-. 1 root root 0 May 3 2019 file執行
nfs4_getfacl file命令,確認owner已增加執行許可權。# file: file A::OWNER@:rwaxtTcCy A::GROUP@:rwatcy A::EVERYONE@:rwatcy
通過設定ACE給group增加執行許可權,相應mode也會增加執行許可權。
執行
nfs4_setfacl -a A::GROUP@:x file命令,給group增加執行許可權。執行
ls -l file命令,查看file檔案許可權。-rwxrwxrw-. 1 root root 0 May 3 2019 file
說明在互操作中ACL的everyone和UNIX mode中的other等價,修改mode other會直接修改ACE EVERYONE,這對許可權語義有輕微的影響。例如:當前mode為rw-------,執行
chmod o+r後,所有人包括owner和group會獲得讀許可權,因為ACE EVERYONE + r;而在純UNIX mode的模式下owner和group仍然沒有讀許可權。在沒有設定過NFSv4 ACL時,mode other仍然保持other的語義。設定過NFSv4 ACL後,mode other將變成everyone的語義並保持everyone語義。強烈建議在使用NFSv4 ACL之後請勿使用mode。
mode與NFSv4 ACL許可權的對應關係。
執行chmod命令改變mode時,NFSv4 ACL就會如下表中的對應改變。
other
mode other
NFSv4 ACL EVERYONE on file
NFSv4 ACL EVERYONE on dir
---
A::EVERYONE@:tncy
A::EVERYONE@:tncy
--x
A::EVERYONE@:xtncy
A::EVERYONE@:xtncy
-w-
A::EVERYONE@:watncy
A::EVERYONE@:waDtncy
-wx
A::EVERYONE@:waxtncy
A::EVERYONE@:waDxtncy
r--
A::EVERYONE@:rtncy
A::EVERYONE@:rtncy
r-x
A::EVERYONE@:rxtncy
A::EVERYONE@:rxtncy
rw-
A::EVERYONE@:rwatncy
A::EVERYONE@:rwaDtncy
rwx
A::EVERYONE@:rwaxtncy
A::EVERYONE@:rwaDxtncy
group
mode group
NFSv4 ACL GROUP on file
NFSv4 ACL GROUP on dir
---
A::GROUP@:tncy
A::GROUP@:tncy
--x
A::GROUP@:xtncy
A::GROUP@:xtncy
-w-
A::GROUP@:watncy
A::GROUP@:waDtncy
-wx
A::GROUP@:waxtncy
A::GROUP@:waDxtncy
r--
A::GROUP@:rtncy
A::GROUP@:rtncy
r-x
A::GROUP@:rxtncy
A::GROUP@:rxtncy
rw-
A::GROUP@:rwatncy
A::GROUP@:rwaDtncy
rwx
A::GROUP@:rwaxtncy
A::GROUP@:rwaDxtncy
owner
mode owner
NFSv4 ACL OWNER on file
NFSv4 ACL OWNER on dir
---
A::OWNER@:tTnNcCy
A::OWNER@:tTnNcCy
--x
A::OWNER@:xtTnNcCy
A::OWNER@:xtTnNcCy
-w-
A::OWNER@:watTnNcCy
A::OWNER@:waDtTnNcCy
-wx
A::OWNER@:waxtTnNcCy
A::OWNER@:waDxtTnNcCy
r--
A::OWNER@:rtTnNcCy
A::OWNER@:rtTnNcCy
r-x
A::OWNER@:rxtTnNcCy
A::OWNER@:rxtTnNcCy
rw-
A::OWNER@:rwatTnNcCy
A::OWNER@:rwaDtTnNcCy
rwx
A::OWNER@:rwaxtTnNcCy
A::OWNER@:rwaDxtTnNcCy
執行nfs4_setfacl命令改變NFSv4 ACL時,如果修改的是檔案許可權,且NFSv4 ACL屬性wa不全都存在,則mode不會顯示w屬性。
執行nfs4_setfacl命令改變NFSv4 ACL時,如果修改的是目錄許可權,NFSv4 ACL屬性waD不全都存在,則mode不會顯示w屬性。
如果目錄NFSv4 ACL有Dx許可權,此時mode顯示沒有w屬性,但是目錄可以進行子檔案子目錄建立和刪除動作,相當於有mode的wx屬性。
nfs4_setfacl時最好使用大寫RWX設定許可權。大寫RWX會自動對應到mode的rwx,避免NFSv4 ACL和mode的相容問題。
NFSv4 ACL支援比mode更豐富的許可權定義,每個許可權位有不同的功能。實際上某些許可權功能需要多個許可權位同時存在才能起效,某些許可權位代表的功能需要其他許可權位來表達。對於檔案和目錄,同樣的許可權位也可能有不同的功能。檔案和目錄的NFSv4 ACL許可權請參見NFSv4 ACL。
說明預設OWNER最小許可權為:tTnNcCy,不允許少於這個許可權。
預設GROUP和EVERYONE最小許可權為:tncy,不允許少於這個許可權。
支援NFSv4 ACL和POSIX ACL的互操作。
可以使用NFSv3協議掛載含有NFSv4 ACL的檔案系統,掛載後NFSv4 ACL會被轉化為POSIX ACL。也可以用NFSv4協議掛載含有POSIX ACL的檔案系統,掛載後POSIX ACL會被轉化為NFSv4 ACL。
說明由於POSIX ACL和NFSv4 ACL的語義不完全相同。例如:POSIX ACL繼承不區分檔案和目錄,POSIX ACL的許可權只有rwx而NFSv4 ACL更豐富。強烈建議只使用NFSv4 ACL或者只使用POSIX ACL,盡量避免混用。
假設用NFSv4 ACL設定了dir0,許可權如下。
執行命令,擷取dir0的許可權。
sudo nfs4_getfacl dir0返回樣本
A::OWNER@:tTnNcCy A::GROUP@:tncy A::EVERYONE@:tncy A:fdi:EVERYONE@:tncy A:fdi:OWNER@:tTnNcCy A:fdi:GROUP@:tncy A:g:19064:rxtncy A:g:19065:rwaDxtTnNcCy A:fdig:19064:rxtncy A:fdig:19065:rwaDxtTnNcCy
POSIX ACL的dir0許可權樣本如下。
執行命令
sudo getfacl dir0返回樣本
user::--- group::--- group:players:r-x group:adminis:rwx mask::rwx other::--- default:user::--- default:group::--- default:group:players:r-x default:group:adminis:rwx default:mask::rwx default:other::---
假設用NFSv4 ACL設定了dir0/file許可權如下。
執行命令
sudo nfs4_getfacl dir0/file返回樣本
A::OWNER@:tTnNcCy A::GROUP@:tncy A::EVERYONE@:tncy A:g:19064:rxtncy A:g:19065:rwaxtTnNcCy
POSIX ACL的dir0/file許可權如下。
執行命令
sudo getfacl dir0/file返回樣本
user::--- group::--- group:players:r-x group:adminis:rwx mask::rwx other::---
NFSv4 ACL數量限制。
預設情況下,阿里雲NAS支援每個檔案系統裡不完全相同的ACL的數量上限為10萬個,每個ACL中ACE數量上限為500個。
說明使用時請勿濫用ACL和ACE,減少許可權判斷時佔用的時間和資源。
NAS POSIX ACL特性
other的許可權適用於所有人。
包括user、group和所有在ACE裡出現的使用者,等價於NFSv4 ACL的everyone。
說明強烈建議任何情況下只給other賦予最小許可權。
例如,myfile檔案中有如下ACL。雖然包含alice的ACE中沒有寫入權限,但因為other有寫入權限,所以使用者alice也擁有寫入權限。樣本如下:
執行命令
getfacl myfile返回資訊
# file: myfile # owner: root # group: root user::rw- user:alice:r-- group::r-- mask::r-- other::rw-
執行
chmod命令不會修改非mode的ACE。說明對於設定了POSIX ACL的檔案盡量避免修改mode,請使用修改ACL的方式設定許可權。
例如,myfile檔案中有一條ACE為賦予群組players讀寫權限。樣本如下:
執行命令
getfacl myfile返回資訊
# file: myfile # owner: root # group: root user::rw- user:player:rw- group::rw- group:players:rw- mask::rw- other::---
執行
chmod g-w myfile或chmod u-w myfile後,並不會修改使用者player和群組players的許可權。這與POSIX ACL規範相比有差異,但是可以保證修改mode不會影響POSIX ACL設定的非通用使用者和群組的許可權。樣本如下:執行命令
getfacl myfile返回資訊
# file: myfile # owner: root # group: root user::r-- user:player:rw- group::r-- group:players:rw- mask::rw- other::---
如果檔案中的group和other都沒有執行許可權(x),那麼ACE中的執行許可權也不起作用。
這是由客戶的Linux系統決定的。雖然NAS服務端返回的是允許執行,但是NAS用戶端要求group或者other必須帶有執行許可權才能真正允許執行。
例如,myfile檔案中的group和other都沒有執行許可權,則使用者player也不能執行該檔案。樣本如下:
執行命令
getfacl myfile返回資訊
# file: myfile # owner: root # group: root user::rw- user:player:r-x group::r-- mask::r-x other::r--
如果group有了執行許可權,那麼使用者player也有執行許可權。樣本如下:
執行命令
getfacl myfile返回資訊
# file: myfile # owner: root # group: root user::rw- user:player:r-x group::r-x mask::r-x other::r--
如果目錄上設定了可繼承的NFSv4 ACL,那麼在NFSv3下此行為可能會不符合POSIX ACL標準。
因為NFSv4 ACL繼承可以分為檔案繼承和目錄繼承,而POSIX ACL是檔案和目錄均繼承。
說明建議您避免混用NFSv4 ACL和POSIX ACL,一個檔案系統只使用一種NFS版本進行掛載。
不支援修改Mask值。
NAS POSIX ACL的Mask值由所有使用者和群組的許可權或操作產生,並無實際意義,也不會被修改。
多個機器間的使用者名稱與UID和GID的映射需要由您自己維護。
目前阿里雲NAS NFS鑒權採用的是IP安全性群組,不支援使用者名稱鑒權。您設定的POSIX ACL在後端儲存的是使用者UID和GID的ACE,在POSIX ACL用戶端顯示時會自動載入本地的/etc/passwd將UID和GID轉化成使用者名稱和群組名。您需要管理多個機器間的使用者名稱與UID和GID之間的映射,確保同一個使用者名稱或同一群組名映射到相同的UID和GID,以免發生錯誤。
支援通過Extended Attributes輸出POSIX ACL。
執行命令
getfattr -n system.posix_acl_access file返回樣本
# file: file system.posix_acl_access=0sAgAAAAEAAAD/////AgAFACAEAAAEAAAA/////xAABQD/////IAABAP////8=
支援cp等工具遷移POSIX ACL。
阿里雲NAS支援使用Redhat NFSV4 ACL遷移工具說明中提到的cp、tar、rsync遷移POSIX ACL。
下面例子中
cp --preserve=xattr file1 file2拷貝file1到file2時拷貝了ACL。cp -ar dir1 dir2拷貝dir1到dir2時拷貝了ACL。說明rsync工具可能由於版本低於3.1.2而不能遷移POSIX ACL。
樣本一:遷移檔案ACL許可權。
執行
getfacl file1命令,查看file1檔案的ACL許可權。# file: file1 # owner: root # group: root user::rw- user:player:r-- group::r-- mask::r-- other::r--執行
cp --preserve=xattr file1 file2命令,拷貝file1 ACL至file2。執行
getfacl file2命令,查看file2的ACL許可權。# file: file2 # owner: root # group: root user::rw- user:player:r-- group::r-- mask::r-- other::r--
樣本二:遷移目錄ACL。
執行
getfacl dir1命令,查看dir1的ACL許可權。# file: dir1 # owner: root # group: root user::rwx user:player:r-x group::r-x mask::r-x other::r-x執行
cp -ar dir1 dir2命令,拷貝dir1 ACL至dir2。執行
getfacl dir2命令,查看dir2的ACL許可權。# file: dir2 # owner: root # group: root user::rwx user:player:r-x group::r-x mask::r-x other::r-x
POSIX ACL數量限制。
預設情況下,阿里雲NAS支援每個檔案系統裡不完全相同的ACL的數量上限為10萬個,每個ACL中ACE數量上限為500個。
說明使用時請勿濫用ACL和ACE,減少許可權判斷時佔用的時間和資源。
常見問題
為什麼ACE類型不支援Deny?
ACE在ACL中的位置起決定性作用。
NFSv4 ACL並不強制進行ACE排序,Deny可能被設定在任何位置。假設ACL有兩個ACE(A::Alice:r和D::Alice:r),兩個ACE的先後順序會直接決定Alice是否具有讀許可權。
說明您在設定ACL時,需要非常注意ACE的位置。
ACL中的ACE數量急劇膨脹。
因為沒有強制進行ACE排序,ACL列表裡的ACE難以合并和去重。長期往ACL裡加ACE,可能膨脹到幾十上百條ACE,在判斷許可權控制結果時需要掃描所有ACE,費時費力。
因為mode沒有Deny功能,如果使用Deny會使ACL與mode的互操作變得更複雜。
在有Deny的情況下,如果mode發生變化,則可能需要往ACL中添加多條ACE。例如:把mode改成-rw-rw-rw,則需要按順序在ACL頭部添加如下內容。
A::OWNER@:rw D::OWNER@:x A::GROUP@:rw D::GROUP@:x A::EVERYONE@:rw D::EVERYONE@:x如果沒有Deny,ACE可以排序和去重並且不區分everyone和other;如果mode發生變化,修改ACL也非常方便,只需找到owner、group、everyone所在ACE並改成如下內容即可。
A::OWNER@:rw A::GROUP@:rw A::EVERYONE@:rw
NFSv4 ACL和POSIX ACL無法互相轉換。
POSIX ACL並不支援Deny,NFSv4 ACL如果包含Deny則無法轉化為POSIX ACL。