特性
本文介紹NFSv4 ACL和POSIX ACL相關的特性。
NAS NFSv4 ACL特性
ACE類型只支持Allow,不支持Deny、Audit和Alarm。
Deny ACE會極大增加權限設置的復雜性,容易給用戶造成混淆而留下安全問題。業(yè)界已達成共識應盡量避免使用Deny ACE。不支持Deny ACE的詳細介紹,請參見常見問題。
Audit ACE和Alarm ACE在阿里云NAS NFS上不生效。如果需要審計和報警功能,可以在阿里云控制臺上進行配置。
未設置ACL的文件或目錄會呈現(xiàn)與mode對應的默認ACL。示例如下:
執(zhí)行
touch file
命令,進入file文件。執(zhí)行
ls -l file
命令,查看file文件的權限。-rw-r--r--. 1 root root 0 May 6 14:27 file
執(zhí)行
nfs4_getfacl file
命令,查看file文件當前的ACL權限。# file: file A::OWNER@:rwatTnNcCy A::GROUP@:rtncy A::EVERYONE@:rtncy
ACE按照一定順序排列并去重,使ACL顯示結果更清晰易懂。
用戶增加或修改ACE時,如果ACL中已經(jīng)存在繼承類型完全的ACE,則新的ACE會和舊的ACE的Allow bits進行合并。 例如:
排序時owner、group、everyone對應的ACE總是排在最前面。
您可執(zhí)行
nfs4_getfacl file
命令,查看file文件ACL權限順序。# file: file A::OWNER@:rwaxtTnNcCy A::GROUP@:rtncy A::EVERYONE@:rtncy A::1001:rwaxtTNcCy
為用戶1009增加一條讀寫權限的ACE,按照順序排序后排在用戶1001后面。
執(zhí)行命令
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增加執(zhí)行權限的ACE,系統(tǒng)自動將新增的執(zhí)行權限合并到用戶1009已有的ACE中。
執(zhí)行命令
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,系統(tǒng)會將它拆分為只擁有繼承能力的ACE和只對本文件起作用的ACE,并將兩個ACE與ACL中同繼承類型的ACE進行合并。
執(zhí)行命令
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不能訪問。
執(zhí)行命令
nfs4_getfacl dir
返回示例
# file: dir A::OWNER@:rwaDxtTnNcCy A::GROUP@:rxtcy A::EVERYONE@:tncy
給用戶1000增加讀寫權限并且可繼承。
執(zhí)行命令
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下創(chuàng)建的文件或目錄就自動帶有繼承的ACE。
在目錄dir下創(chuàng)建文件
執(zhí)行命令
touch dir/file nfs4_getfacl dir/file
返回示例
# file: dir/file A::OWNER@:rwatTcCy A::GROUP@:rwatcy A::EVERYONE@:rwatcy A::1000:rwx
在目錄dir下創(chuàng)建目錄
執(zhí)行命令
mkdir dir/subdir nfs4_getfacl dir/subdir
返回示例
# file: dir/subdir A::OWNER@:rwaDxtTcCy A::GROUP@:rwaDxtcy A::EVERYONE@:rwaDxtcy A:fdi:1000:rwx
說明建議EVERYONE權限盡量小。在執(zhí)行相應的代碼前請先執(zhí)行
umask 777
,這樣創(chuàng)建文件和目錄時傳入的mode會變成000,可以讓默認的權限最小化,詳情請參見umask與默認mode。Linux文件和目錄的系統(tǒng)調用,默認會傳入mode作為參數(shù)。按照RFC7530協(xié)議標準,需要在繼承ACL之后再疊加上mode操作修改ACL,而按照協(xié)議如果修改了group的mode,需要保證所有群組的ACE都小于等于group mode的權限。而這會導致群組的繼承失效。例如:子文件原本要繼承Group A: RWX,但是默認傳入的mode是GROUPS: R,則子文件的Group A的ACE會變成Group A: R。為了規(guī)避該問題,實際情況下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,以免發(fā)生錯誤。
支持通過Extended Attributes輸出NFSv4 ACL。
執(zhí)行命令
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。
執(zhí)行
nfs4_getfacl file1
命令,查看file1文件的ACL權限。# file: file1 A::OWNER@:rwatTcCy A::GROUP@:rwatcy A::EVERYONE@:rwatcy A::1000:rtncy
執(zhí)行
cp --preserve=xattr file1 file2
命令,拷貝file1 ACL至file2。執(zhí)行
nfs4_getfacl file2
命令,查看file2文件的ACL權限。# file: file2 A::OWNER@:rwatTcCy A::GROUP@:rwatcy A::EVERYONE@:rwatcy A::1000:rtncy
示例二:遷移目錄ACL。
執(zhí)行
nfs4_getfacl dir1
命令,查看dir1目錄的ACL權限。# file: dir1 A::OWNER@:rwaDxtTnNcCy A::GROUP@:rxtncy A::EVERYONE@:rxtncy A::1000:rxtncy
執(zhí)行
cp -ar dir1 dir2
命令,拷貝dir1 ACL至dir2。執(zhí)行
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權限示例如下。
執(zhí)行
ls -l file
命令,查看file文件權限。-rw-rw-rw-. 1 root root 0 May 3 2019 file
執(zhí)行
nfs4_getfacl file
命令,查看file文件的ACL權限。# file: file A::OWNER@:rwatTcCy A::GROUP@:rwatcy A::EVERYONE@:rwatcy
通過設置mode給owner增加執(zhí)行權限,相應ACE也會增加執(zhí)行權限。示例如下:
執(zhí)行
chmod u+x file
命令,給owner增加執(zhí)行權限。執(zhí)行
ls -l file
命令,查看文件權限。-rwxrw-rw-. 1 root root 0 May 3 2019 file
執(zhí)行
nfs4_getfacl file
命令,確認owner已增加執(zhí)行權限。# file: file A::OWNER@:rwaxtTcCy A::GROUP@:rwatcy A::EVERYONE@:rwatcy
通過設置ACE給group增加執(zhí)行權限,相應mode也會增加執(zhí)行權限。
執(zhí)行
nfs4_setfacl -a A::GROUP@:x file
命令,給group增加執(zhí)行權限。執(zhí)行
ls -l file
命令,查看file文件權限。-rwxrwxrw-. 1 root root 0 May 3 2019 file
說明在互操作中ACL的everyone和UNIX mode中的other等價,修改mode other會直接修改ACE EVERYONE,這對權限語義有輕微的影響。例如:當前mode為rw-------,執(zhí)行
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權限的對應關系。
執(zhí)行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
執(zhí)行nfs4_setfacl命令改變NFSv4 ACL時,如果修改的是文件權限,且NFSv4 ACL屬性wa不全都存在,則mode不會顯示w屬性。
執(zhí)行nfs4_setfacl命令改變NFSv4 ACL時,如果修改的是目錄權限,NFSv4 ACL屬性waD不全都存在,則mode不會顯示w屬性。
如果目錄NFSv4 ACL有Dx權限,此時mode顯示沒有w屬性,但是目錄可以進行子文件子目錄創(chuàng)建和刪除動作,相當于有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協(xié)議掛載含有NFSv4 ACL的文件系統(tǒng),掛載后NFSv4 ACL會被轉化為POSIX ACL。也可以用NFSv4協(xié)議掛載含有POSIX ACL的文件系統(tǒng),掛載后POSIX ACL會被轉化為NFSv4 ACL。
說明由于POSIX ACL和NFSv4 ACL的語義不完全相同。例如:POSIX ACL繼承不區(qū)分文件和目錄,POSIX ACL的權限只有rwx而NFSv4 ACL更豐富。強烈建議只使用NFSv4 ACL或者只使用POSIX ACL,盡量避免混用。
假設用NFSv4 ACL設置了dir0,權限如下。
執(zhí)行命令,獲取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權限示例如下。
執(zhí)行命令
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權限如下。
執(zhí)行命令
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權限如下。
執(zhí)行命令
sudo getfacl dir0/file
返回示例
user::--- group::--- group:players:r-x group:adminis:rwx mask::rwx other::---
NFSv4 ACL數(shù)量限制。
默認情況下,阿里云NAS支持每個文件系統(tǒng)里不完全相同的ACL的數(shù)量上限為10萬個,每個ACL中ACE數(shù)量上限為500個。
說明使用時請勿濫用ACL和ACE,減少權限判斷時占用的時間和資源。
NAS POSIX ACL特性
other的權限適用于所有人。
包括user、group和所有在ACE里出現(xiàn)的用戶,等價于NFSv4 ACL的everyone。
說明強烈建議任何情況下只給other賦予最小權限。
例如,myfile文件中有如下ACL。雖然包含alice的ACE中沒有寫權限,但因為other有寫權限,所以用戶alice也擁有寫權限。示例如下:
執(zhí)行命令
getfacl myfile
返回信息
# file: myfile # owner: root # group: root user::rw- user:alice:r-- group::r-- mask::r-- other::rw-
執(zhí)行
chmod
命令不會修改非mode的ACE。說明對于設置了POSIX ACL的文件盡量避免修改mode,請使用修改ACL的方式設置權限。
例如,myfile文件中有一條ACE為群組players賦予讀寫權限。示例如下:
執(zhí)行命令
getfacl myfile
返回信息
# file: myfile # owner: root # group: root user::rw- user:player:rw- group::rw- group:players:rw- mask::rw- other::---
執(zhí)行
chmod g-w myfile
或chmod u-w myfile
后,并不會修改用戶player和群組players的權限。這與POSIX ACL規(guī)范相比有差異,但是可以保證修改mode不會影響POSIX ACL設置的非通用用戶和群組的權限。示例如下:執(zhí)行命令
getfacl myfile
返回信息
# file: myfile # owner: root # group: root user::r-- user:player:rw- group::r-- group:players:rw- mask::rw- other::---
如果文件中的group和other都沒有執(zhí)行權限(x),那么ACE中的執(zhí)行權限也不起作用。
這是由客戶的Linux系統(tǒng)決定的。雖然NAS服務端返回的是允許執(zhí)行,但是NAS客戶端要求group或者other必須帶有執(zhí)行權限才能真正允許執(zhí)行。
例如,myfile文件中的group和other都沒有執(zhí)行權限,則用戶player也不能執(zhí)行該文件。示例如下:
執(zhí)行命令
getfacl myfile
返回信息
# file: myfile # owner: root # group: root user::rw- user:player:r-x group::r-- mask::r-x other::r--
如果group有了執(zhí)行權限,那么用戶player也有執(zhí)行權限。示例如下:
執(zhí)行命令
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,一個文件系統(tǒng)只使用一種NFS版本進行掛載。
不支持修改Mask值。
NAS POSIX ACL的Mask值由所有用戶和群組的權限或操作產(chǎn)生,并無實際意義,也不會被修改。
多個機器間的用戶名與UID和GID的映射需要由您自己維護。
目前阿里云NAS NFS鑒權采用的是IP安全組,不支持用戶名鑒權。您設置的POSIX ACL在后端存儲的是用戶UID和GID的ACE,在POSIX ACL客戶端顯示時會自動加載本地的/etc/passwd將UID和GID轉化成用戶名和群組名。您需要管理多個機器間的用戶名與UID和GID之間的映射,確保同一個用戶名或同一群組名映射到相同的UID和GID,以免發(fā)生錯誤。
支持通過Extended Attributes輸出POSIX ACL。
執(zhí)行命令
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權限。
執(zhí)行
getfacl file1
命令,查看file1文件的ACL權限。# file: file1 # owner: root # group: root user::rw- user:player:r-- group::r-- mask::r-- other::r--
執(zhí)行
cp --preserve=xattr file1 file2
命令,拷貝file1 ACL至file2。執(zhí)行
getfacl file2
命令,查看file2的ACL權限。# file: file2 # owner: root # group: root user::rw- user:player:r-- group::r-- mask::r-- other::r--
示例二:遷移目錄ACL。
執(zhí)行
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
執(zhí)行
cp -ar dir1 dir2
命令,拷貝dir1 ACL至dir2。執(zhí)行
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數(shù)量限制。
默認情況下,阿里云NAS支持每個文件系統(tǒng)里不完全相同的ACL的數(shù)量上限為10萬個,每個ACL中ACE數(shù)量上限為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數(shù)量急劇膨脹。
因為沒有強制進行ACE排序,ACL列表里的ACE難以合并和去重。長期往ACL里加ACE,可能膨脹到幾十上百條ACE,在判斷權限控制結果時需要掃描所有ACE,費時費力。
因為mode沒有Deny功能,如果使用Deny會使ACL與mode的互操作變得更復雜。
在有Deny的情況下,如果mode發(fā)生變化,則可能需要往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可以排序和去重并且不區(qū)分everyone和other;如果mode發(fā)生變化,修改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。