綜述node
HDFS實現了一個相似POSIX模型的文件和文件夾權限管理模型。每個文件盒文件夾都有一個全部者和一個組。文件或者文件夾能夠經過權限區分是全部者仍是組成員或是其餘用戶。對文件來講,r標示能夠閱讀文件,w標示能夠寫入文件,對於文件夾來講,r標示能夠閱讀其下的內容,w能夠建立或者刪除文件或文件夾,x標示進入其子節點。web
與POSIX 模型相比,沒有可執行文件的概念,對於文件夾來講,沒有setuid或setgid字節也是一個簡化,Sticky bit被設置在文件中防止除了超級用戶和文件全部者的其餘用戶刪除或者移動文件夾,一個文件被設置成Sticky bit沒有影響,總的來講,HDFS的權限系統有本身的獨立性。通常來講Unix習慣的顯示模型會被使用,包括使用八進制進行描述。當一個文件或者文件夾被建立時,他的全部者就是被客戶端進程聲明的用戶,他的組四父文件夾的組(BSD規則)shell
每個客戶端訪問HDFS都有兩個標示部分包括用戶名和組列表。每此當客戶端進程接入文件或者文件夾時,HDFS必須作一個權限檢查。apache
若是用戶名和文件的全部者一直那麼就可使用全部者權限,若是組一致,那麼可使用組的權限,不然使用其餘權限。服務器
若是權限沒有經過,那麼客戶端操做失敗。app
用戶識別
Hadoop支持兩種操做用於用戶識別。不一樣點是經過配置hadoop.security.authentication屬性:函數
simple工具
在這種模式下,客戶端進程的身份是由主機操做系統決定的。相似unix系統上,用戶名至關於「whoami」。oop
kerberosui
使用Kerberized操做,使用客戶端的Kerberos證書來肯定客戶端的進程的身份,好比在Kerberized環境中,用戶使用kinit工具實用程序得到Kerberos ticket-granting-ticket(TGT)和使用klist來肯定當前的用戶。當Kerberos主體映射到一個HDFS用戶名時,其餘一些非必要的組件會被忽略。好比,一個用戶todd/foobar@CORP.COMPANY.COM可使用todd來登陸HDFS。
不管哪一種機制,用戶標示都是HDFS機制外實現的。HDFS本事沒有提供建立用戶標示,組或者處理用戶憑證的機制。
組映射
一旦用戶名被以上的方式肯定下來,組列表也會被配置在hadoop.security.group.mapping的參數group mapping service肯定下來默認實現是org.apache.hadoop.security.ShellBasedUnixGroupsMapping,他是經過Unix的shell中的-c groups命令解決的用戶的組的問題。
若是使用的是LDAP那麼可使用org.apache.Hadoop.security.LdapGroupsMapping。可是這個只能使用在LDAP上不能使用在Unix server上更多的細節能夠參考Javadocs中的配置group mapping service的部分
對於HDFS來講,映射用戶到組在NameNode上已經實現,主機系統配置NameNode的用戶決定了這個組。
注意:HDFS用字符串儲存用戶和文件和文件夾組,他並無想Unix同樣使用一個標示數字來表示用戶和組。
實現
每一個文件或者文件夾傳遞他的全路徑到name node,每次操做的時候都須要檢查權限。客戶端將會隱試的鏈接name node使用用戶標示,減小對於現有的客戶端的API改變。由於路勁的改變或者刪除會引發有一些操做之前成功,可是在運行的時候失敗。好比,當一個客戶端第一次讀取一個文件,他會發送請求到name node發現文件第一個塊的位置。第二個請求去查詢其餘塊可能失敗。另外一方面,客戶端已經知道了文件block使得刪除中的文件不能被撤回。經過添加權限客戶端取得文件時能夠在request之間取消,改變去請您先不會撤銷客戶端一隻的塊。
改動的API
下面的方法添加了一個路徑的參數而且若是權限檢查失敗會拋出一個AccessControlException 的異常:
方法:
public FSDataOutputStream create(Path f, FsPermission permission, boolean overwrite, int bufferSize, short replication, long blockSize, Progressable progress) throws IOException;
public boolean mkdirs(Path f, FsPermission permission) throws IOException;
public void setPermission(Path p, FsPermission permission) throws IOException;
public void setOwner(Path p, String username, String groupname) throws IOException;
public FileStatus getFileStatus(Path f) throws IOException;
將返回用戶組和路徑
該模型創建文件或者文件夾受限於umask的配置參數。當已經存在的方法create(path, …) (沒有權限參數)被調用,新文件的模型是 0666 & ^umask,當新方法create(path, permission, …)(權限參數爲P)被調用,那麼新文件的模型是 P & ^umask & 0666。當建立一個新目錄使用現有 mkdirs(path) 方法(沒有權限參數),新目錄的模式是0777 & ^ umask。當使用mkdirs(path, permission)(權限參數爲P),那麼新文件測模型是 P & ^umask & 0777。
shell的改變
新的操做:
chmod [-R] mode file …
只有文件的全部者或者超級用戶有權限去改變文件的mode
chgrp [-R] group file …
用戶調用chgrp 指定屬於的組,文件全部者或者超級用戶修改。
chown [-R] [owner][:[group]] file …
改變文件的全部者,只能有超級用戶修改
ls file …
lsr file …
輸出文件全部者組和模式
超級用戶
超級用戶是name弄得進程使用的用戶。更確切的說,就是你啓動namenode那麼你就是超級用戶。超級用戶的權限檢查永遠不會失敗,因此能夠幹任何事情。沒有固定的超級用戶,當誰啓動namenode誰就是超級用戶。HDFS的超級用戶不是namenode主機的超級用戶,沒有必要,可是他是全部集羣的超級用戶。此外,HDFS的實驗者在我的工做站,方便就安裝的超級用戶沒有任何配置。
此外管理員能夠經過配置參數肯定一個高級的組,這個組的成員也是超級用戶。
web服務
默認狀況下,web服務器的身份是一個配置參數。name node沒有真實用戶身份的概念,可是web server須要有一個管理員設定的用戶和組的標示。除非選擇的超級用戶不能進入部分的web server。
配置參數
dfs.permissions = true
若是使用yes,標示使用權限系統,若是是no,則關閉權限檢查。可是其餘的行爲不會被改變。切換參數不會改變文件的mode,組和全部者。無論權限是否打開 chmod, chgrp和chown老是檢查權限, 這些函數只對權限上下文有做用因此沒有版本兼容問題。此外這容許管理員設置全部者開啓權限檢查功能
dfs.web.ugi = webuser,webgroup
web server的用戶名,設置超級用戶的名稱能夠容許任何web客戶端看到的一切。逗號分隔。
dfs.permissions.superusergroup = supergroup
超級用戶組的名字
fs.permissions.umask-mode = 0022
建文件或者文件夾時使用的umask 。配置文件可使用十進制的18.
dfs.cluster.administrators = ACL-for-admins
集羣的管理員指定爲ACL。這能夠控制訪問默認的servlet等
轉載:http://blog.csdn.net/duheaven/article/details/17314563