您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)HDFS如何實(shí)現(xiàn)權(quán)限管理的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
HDFS的權(quán)限管理分成2大部分:
類似linux的基本權(quán)限管理(粗粒度)
針對管理對象分三種:user、group、other方式的權(quán)限管理方式
user:即目錄或文件的owner
group:即上述owner所在的組
other:其他用戶的統(tǒng)稱
ACL方式的權(quán)限管理(細(xì)粒度)
可以精確控制到某個user、某個group具有對應(yīng)的權(quán)限
2種方式具體見下圖
基本的權(quán)限方式如同linux中目錄或文件的權(quán)限管理方式,它是一種粗粒度的,不能控制到某一個用戶如t1。ACL的權(quán)限管理方式就可以,如下
user:t1:r-x
表示用戶t1具有讀和可執(zhí)行的權(quán)限(在HDFS中沒有可執(zhí)行的概念,暫且這么叫吧,這里的x權(quán)限就是進(jìn)入目錄和列出目錄下的文件或內(nèi)容的權(quán)限)
創(chuàng)建一個文件或目錄,初始的基本權(quán)限是多少呢?經(jīng)歷如下2過程:
創(chuàng)建文件或目錄的時候可以指定權(quán)限,沒有指定的話,就使用默認(rèn)的權(quán)限,如下
目錄:777
文件:666
注意:這個配置是客戶端可以配置的,即客戶端自己主宰創(chuàng)建文件或目錄的權(quán)限。
umask的作用:
就是對HDFS基本權(quán)限的限制,如022分別表示:0表示對owner沒有限制,2表示對group不允許有寫權(quán)限,2表示對other不允許有寫權(quán)限。
應(yīng)用客戶端配置的umask其實(shí)就是拿用戶設(shè)置的權(quán)限減去上述umask權(quán)限,就得到文件或目錄的最終權(quán)限了。如創(chuàng)建目錄,默認(rèn)777權(quán)限,然后減去umask權(quán)限022就等于755,即默認(rèn)情況下owner擁有讀寫和可執(zhí)行權(quán)限,owner所在group擁有讀和可執(zhí)行權(quán)限,other擁有讀和可執(zhí)行的權(quán)限
下面重點(diǎn)來說下umask的獲取過程:
首先嘗試獲取配置文件中的fs.permissions.umask-mode屬性,如022,然后構(gòu)建出umask權(quán)限對象
如果上述屬性沒有配置的話,獲取dfs.umask屬性(過時了,推薦用第一種方式),這種方式的umask是10進(jìn)制形式,如上述的022=2x8+2=18即這里的umask要配置成18
如果上述屬性也沒有配置的話,默認(rèn)使用18即022來構(gòu)建出umask對象
至此,在沒有ACL設(shè)置的情況下創(chuàng)建文件或目錄的權(quán)限即上述過程了。
AclEntry對象,如
user:t1:r-x、group:g1:rwx、other::--x、mask::r-x
default:user:t1:r-x、default:group:g1:r-x、default:other::r-x、default:mask::r-x
包含4部分內(nèi)容:
public class AclEntry { private final AclEntryType type; private final String name; private final FsAction permission; private final AclEntryScope scope; }
name:即名稱,如上述的t1、g1,也可以為null如上述的mask::r-x
FsAction:權(quán)限信息,總共有如下權(quán)限
NONE("---"), EXECUTE("--x"), WRITE("-w-"), WRITE_EXECUTE("-wx"), READ("r--"), READ_EXECUTE("r-x"), READ_WRITE("rw-"), ALL("rwx");
AclEntryScope:枚舉值,值為ACCESS、DEFAULT
ACCESS:表示該條ACL是針對本目錄或文件的,前綴省略不寫
DEFAULT:只存在于目錄中,前綴是default:,一旦在該目錄中創(chuàng)建子目錄或文件,子目錄或文件的ACL就會繼承該條ACL權(quán)限。即如果父目錄中含有一個default:user:t1:r-x記錄,則在創(chuàng)建子目錄或者文件的時候,都會自動加上一條user:t1:r-x的記錄
AclEntryType:枚舉值,值為USER、GROUP、OTHER、MASK
USER:如上述的user:t1:r-x表示t1是一個用戶
GROUP:如上述的group:g1:rwx表示g1是一個組
OTHER:如上述的other::--x表示剩余的所有用戶的統(tǒng)稱
MASK:如上述的mask::r-x,主要用于過濾,如上述的group:g1:rwx,雖然這里是rwx權(quán)限,但是真正在判定權(quán)限的時候,還是要與mask::r-x進(jìn)行and操作,即過濾了w權(quán)限,所以group:g1:rwx的實(shí)際權(quán)限是group:g1:r-x,如下圖所示
其實(shí)mask只作用在name值不為null的user和所有的group上,這個后面再詳細(xì)說明
基本權(quán)限也可以轉(zhuǎn)化成ACL權(quán)限,例子如基本權(quán)限如drwxr-xr-x,對應(yīng)的ACL權(quán)限如
user::rwx 對應(yīng)user權(quán)限
(group::r-x)對應(yīng)group權(quán)限
mask::r-x 對應(yīng)group權(quán)限
other::r-x 對應(yīng)other權(quán)限
上述修改基本權(quán)限或者修改對應(yīng)的ACL權(quán)限都會相互影響。有一個例外:上述的group::r-x在創(chuàng)建的時候依據(jù)基本權(quán)限中的group權(quán)限,但是直接修改ACL中的group::r-x權(quán)限,并不直接影響基本權(quán)限中的group權(quán)限,這也是比較坑的地方,即group::r-x權(quán)限被造出來之后就像被遺棄了。
ACCESS scope中的mask對應(yīng)的權(quán)限就是HDFS基本權(quán)限中的group權(quán)限。如下所示:
所以如下2種方式都可以更改基本權(quán)限中的group權(quán)限:
hdfs dfs -chmod 751
如修改基本權(quán)限為751,則mask取group權(quán)限則為5,即r-x權(quán)限,如下圖所示
直接修改mask acl中的權(quán)限值
如hdfs dfs -setfacl -m mask::--x /user/lg/acl,修改了mask值,同時也修改了基本權(quán)限中的group權(quán)限
當(dāng)acl新添加或者刪除的時候,都會觸發(fā)mask的重新計(jì)算,計(jì)算方式就是:
所有name不為null的user類型的acl和所有的group類型的acl的權(quán)限取并集
例子如下:
這時候基本權(quán)限中的group權(quán)限也會隨著mask的改變而改變。
目前到這里總結(jié)下mask:
主要設(shè)計(jì)成對其他user和group類型的權(quán)限過濾,你主動去設(shè)置mask,此時會起到一定的過濾作用,
但是一旦重新添加或者刪除acl的時候,mask的值就被重新計(jì)算了,也就是說你之前設(shè)置的沒啥用了,這個就意味著mask沒啥鳥用,當(dāng)你無意間執(zhí)行chmod修改權(quán)限,就可能會造成別人如t1用戶突然少了某些權(quán)限,一旦新增一個t2用戶的acl權(quán)限,t1用戶的權(quán)限又突然回來了,這個也算是個坑吧,不知道為啥這樣設(shè)計(jì),歡迎來討論。
DEFAULT scope中的mask和ACCESS scope中的mask基本類似,都是用于過濾權(quán)限。
上述ACCESS scope中mask值有2種方式,而DEFAULT scope中只有一種方式,就是
直接修改mask acl中的權(quán)限值
如hdfs dfs -setfacl -m default:mask::--x /user/lg/acl
修改之后上述default:user:t1:r-x 的實(shí)際權(quán)限就只是 --x了,即與default mask執(zhí)行and操作的結(jié)果
當(dāng)acl新添加或者刪除的時候,都會觸發(fā)mask的重新計(jì)算,計(jì)算方式就是:
所有name不為null的user類型的acl和所有的group類型的acl的權(quán)限取并集。這里不再說明了,見ACCESS scope中的mask重新計(jì)算。
前面介紹的是一些基本概念和理論,現(xiàn)在來看看下面幾個過程具體會發(fā)生什么操作
例子: 驗(yàn)證用戶u1是否對路徑/user/lg/acl有讀權(quán)限
1 檢查u1是否是該路徑的owner
如果是owner,則直接使用基本權(quán)限中的user權(quán)限來判定,代碼如下
2 遍歷該路徑的所有ACCESS scope的ACL權(quán)限
如果當(dāng)前ACL類型是user,并且用戶名匹配,如user:u1:r-x,在判定時還需要將該r-x權(quán)限和基本權(quán)限中的group權(quán)限(即mask權(quán)限)執(zhí)行and操作來作為實(shí)際的權(quán)限,如果此時mask::--x,執(zhí)行and操作之后實(shí)際權(quán)限變成了--x權(quán)限,即仍然沒有讀權(quán)限
如果當(dāng)前ACL類型是group,并且該u1用戶所屬的groups中包含該group,同上述一樣,仍然需要將該條ACL權(quán)限與基本權(quán)限中的group權(quán)限(即mask權(quán)限)執(zhí)行and操作來判定最終的權(quán)限
代碼如下:
3 一旦該用戶在上述權(quán)限中都沒匹配到,則使用基本權(quán)限中的other權(quán)限來判定
注意這里的沒有匹配到的含義:如果有user:u1:--x權(quán)限,即匹配到了用戶,但是該ACL并沒有讀權(quán)限,此時并不會去執(zhí)行這部分的other權(quán)限
4 以上還未能找到相關(guān)權(quán)限則判定該用戶無權(quán)限
1 如果創(chuàng)建文件或者目錄時沒有指定基本權(quán)限權(quán)限,則使用默認(rèn)的基本權(quán)限權(quán)限
目錄:777
文件:666
2 在上述基本權(quán)限的基礎(chǔ)上應(yīng)用客戶端配置的umask權(quán)限,默認(rèn)是022,則目錄和文件分別變成
目錄:755
文件:644
3 如果父目錄中含有DEFAULT scope的ACL權(quán)限信息
default:user::rwx和上述文件或目錄基本權(quán)限中的user權(quán)限執(zhí)行and操作作為最終的基本權(quán)限中的user權(quán)限 default:mask::r-x和上述文件或目錄基本權(quán)限中的group權(quán)限執(zhí)行and操作作為最終的基本權(quán)限中的group權(quán)限 default:other::--x和上述文件或目錄基本權(quán)限中的other權(quán)限執(zhí)行and操作作為最終的基本權(quán)限中的other權(quán)限
例子如下:
default中的其他權(quán)限直接作為子目錄或文件的ACCESS權(quán)限
代碼見:
4 如果創(chuàng)建的是子目錄,則將全部的default權(quán)限復(fù)制給子目錄作為子目錄的default權(quán)限
5 然后重新計(jì)算子文件或目錄的基本權(quán)限(因?yàn)樯鲜鲞^程可能會修改基本權(quán)限)
代碼見
新增或刪除或修改ACL操作的時候都會重新計(jì)算mask的值
ACCESS scope中的ACL變動會重新計(jì)算ACCESS scope中的mask
DEFAULT scope中的ACL變動會重新計(jì)算DEFAULT scope中的mask
mask的計(jì)算方式上面就說明了。
感謝各位的閱讀!關(guān)于“HDFS如何實(shí)現(xiàn)權(quán)限管理”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。