HDFS 特殊權限位
標簽(空格分隔): Hadoop
之前對HDFS更或者說是對Linux中文件的權限沒有進行一個完整的學習,只是知道有所有者、所屬組和其它權限,具體到某個人的權限有讀(r)、寫(w)和可執行(x)。
HDFS基於Linux的POSIX model
HDFS的權限雖然是基於Linux的POSIX model,但是HDFS中其實並沒有真正的用戶和組的概念,只是從主機上拿到用戶的信息然后對其存儲的文件權限進行檢查。
HDFS中每個文件和目錄都有一個owner和group,並對owner、owner同一個組的user和其它user的權限進行了分離,權限分為rwx。對於文件來說,有r權限則可對此文件可讀,有w權限則可對文件進行寫和追加,x權限對文件來說沒有實際的意義。對於目錄來說,擁有r權限可以查看目錄中內容,比如此目錄下的文件或者子目錄,擁有w權限可以在此目錄中新建或者刪除文件和子目錄,但不可以改變此目錄的名字,因為改變此目錄的信息是需要其上層目錄的寫權限,對於目錄來說,個人感覺最重要的應該是x權限,擁有x權限,才可以進入當前目錄進行其它操作。
如果沒有目錄的x權限,你擁有的其它權限並不能發揮相應的作用,因為rw權限都是針對目錄中的內容的,當你沒有進入目錄的權限時,其它權限都是虛無。
sticky bit
HDFS中還有一個sticky bit,此功能只針對目錄有效,是一個防刪除位。防止除管理員、目錄或者文件的所有者之外的其它人(即使其它用戶對該文件夾有rwx權限)對當前加了 sticky 位的目錄或者當前加了 sticky 位的目錄下的文件或者目錄進行刪除。
命令如下:
#即在第一位添加數字1
hdfs dfs -chmod 1777 /tmp
hdfs dfs -chmod 1777 /user/hive/warehouse
# 也可以
hdfs dfs -chmod +t /tmp
hdfs dfs -chmod +t /user/hive/warehouse
sticky bit
不同於suid, guid,對於others的execute權限位,則可以設置sticky bit標志,
用t來表示,如果該位置本來就有可執行權限位,即x,則t和x疊加后用大寫的T來表示。
sticky bit只對目錄起作用,如果一個目錄設置了sticky bit,則該目錄下的文件只能被
該文件的owner或者root刪除,其他用戶即使有刪除權限也無法刪除該文件。
例如,/tmp目錄,它的權限為d rwx rwx rwt,該目錄中的文件(或目錄)只能被owner
或root刪除,這樣大家都可以把自己的臨時文件往該目錄里面放,但是你的文件別人是無法
刪除的。
注意:suid, sgid只對文件起作用,而sticky bit只對目錄起作用。
HDFS ACL
HDFS ACL(Access Control Lists)是對POSIX permissions model的一個補充。傳統的權限是針對用戶和組的組織架構來設置的,但當你只想給特定的用戶或者組(而不是只針對文件的所有者和所屬組)來開權限時,我們就可以使用ACL來控制。
默認情況下,HDFS ACL功能是關閉的,因為開啟ACL之后,NN中會對開啟ACL的inode存儲一份額外的數據,會帶來額外的內存開銷,如果有需要可以在hdfs-site.xml中設置dfs.namenode.acls.enabled為true。
新建一個文件或者目錄時,會繼承父目錄的ACL,但改變父目錄的ACL時,在此目錄中已經存在的內容不會發生改變。
一個文件或者目錄的ACL由一組ACL entry組成。每個Entry標識一個用戶或者組的rwx權限,如下一個文件的一個ACL:
user::rw-
user:bruce:rwx #effective:r--
group::r-x #effective:r--
group:sales:rwx #effective:r--
mask::r--
other::r--
文件的所有者具有rw權限,所屬組具有rx權限,其它用戶具有r權限,但是用戶bruce具有該文件的rwx權限,sales組也具有該文件的rwx權限。但是bruce和sales就真的具有rwx權限了?這里還有最后一道防線mask,mask決定了一個用戶或者組能夠得到的最大的權限。上面的例子中,bruce和sales的權限會與mask的權限進行與運算,最終的結果才是bruce和sales的權限,也就是注釋中的內容。
權限檢查流程
當一個文件有ACL時,權限檢查的流程為:
一,判斷該用戶是否為owner
二,判斷該用戶是否包含在ACL entry的user中,如果在,則通過mask過濾權限
三,判斷該用戶的所屬組是否包含在組中,包含則也要通過mask來過濾權限(因為在使用了ACL的情況下,group的權限顯示的就是當前的mask)
四,判斷該用戶的所屬組是否包含在ACL entry的group中,如果在,則通過mask來過濾權限
ACL命令
# 添加用戶acl
hdfs dfs -setfacl -m user:xx:rwx path
# 刪除一個用戶的acl
hdfs dfs -setfacl -x user:xx path
# 刪除所有的acl
hdfs dfs -setfacl -d path
# 查看acl
hdfs dfs -getfacl path
目錄或者文件添加了ACL之后,ll命令查看,會有一個+標識
umask
一個文件或者目錄新建之后就有一個默認的權限,這個默認的權限是怎么控制的呢?是由umask控制的。
文件創建之后的默認權限是0666 & ^umask,目錄創建之后的默認權限是0777 & ^umask,umask在core-site.xml中由fs.permissions.umask-mode設置,默認是022。
HDFS 開啟權限
core-site.xml
core-site中主要是設置umask,由fs.permissions.umask-mode控制,默認是022
hdfs-site.xml
hfds-site中控制着權限的開啟,參數如下:
dfs.permissions.enabled = true
是否開啟權限檢查,默認是true
dfs.permissions.superusergroup = supergroup
設置hdfs管理員的組名稱,模式名字是supergroup,一般改為與管理員相同的名字,如管理員是hdfs,則改為hdfs
dfs.namenode.acls.enabled = true
控制ACL是否開啟,默認為false。
Tips:HDFS權限設置最好是以傳統的權限進行控制,只針對個別權限要求高的文件進行ACL控制。