HDFS權限管理指南(HDFS Permissions Guide)


綜述

HDFS實現了一個類似POSIX模型的文件和文件夾權限管理模型。每一個文件盒文件夾都有一個所有者和一個組。文件或者文件夾可以通過權限區分是所有者還是組成員或是其他用戶。對文件來說,r標示可以閱讀文件,w標示可以寫入文件,對於文件夾來說,r標示可以閱讀其下的內容,w可以創建或者刪除文件或文件夾,x標示進入其子節點。

與POSIX 模型相比,沒有可執行文件的概念,對於文件夾來說,沒有setuid或setgid字節也是一個簡化,Sticky bit被設置在文件中防止除了超級用戶和文件所有者的其他用戶刪除或者移動文件夾,一個文件被設置成Sticky bit沒有影響,總的來說,HDFS的權限系統有自己的獨立性。一般來說Unix習慣的顯示模型會被使用,包括使用八進制進行描述。當一個文件或者文件夾被創建時,他的所有者就是被客戶端進程聲明的用戶,他的組四父文件夾的組(BSD規則)

每一個客戶端訪問HDFS都有兩個標示部分包括用戶名和組列表。每此當客戶端進程接入文件或者文件夾時,HDFS必須做一個權限檢查。

如果用戶名和文件的所有者一直那么就可以使用所有者權限,如果組一致,那么可以使用組的權限,否則使用其他權限。

如果權限沒有通過,那么客戶端操作失敗。

用戶識別
Hadoop支持兩種操作用於用戶識別。不同點是通過配置hadoop.security.authentication屬性:

simple

在這種模式下,客戶端進程的身份是由主機操作系統決定的。類似unix系統上,用戶名相當於“whoami”。

kerberos

使用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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM