HDFS檔案許可權及ACL訪問控制
Hdfs檔案許可權及ACL訪問控制
1、許可權相關配置
(1)、hdfs-site.xml設定啟動acl
<property>
<name>dfs.permissions.enabled</name>
<value>true</value> //預設值為true,即啟用許可權檢查。如果為 false,則禁用
</property>
<property>
<name>dfs.namenode.acls.enabled</name>
<value >true</value> //預設值為false,禁用ACL,設定為true則啟用ACL。當ACL被禁用時,NameNode拒絕設定或者獲取ACL的請求
</property>
(2)、core-site.xml設定使用者組預設許可權.
<property>
<name>fs.permissions.umask-mode</name>
<value>022</value>
</property>
PS:建立檔案和目錄時使用的umask,預設值為八進位制022,每位數字對應了擁有者,組和其他使用者。該值既可以使用八進位制數字,如022,也可以使用符號,如u=rwx,g=r-x,o=r-x(對應022)
2、hdfs acl許可權實體類別
(1)、預設ACL必須包含所有最小要求的ACL項,包括檔案擁有者項,檔案所屬的組項和其它使用者項
即:
user::rwx
group::r-x
other::r-x
(2)、每個ACL項由型別,可選的名稱和許可權字串組成,它們之間使用冒號(:)
如:
user::rw-
user:bruce:rwx #effective:r-- //bruce這個使用者實際擁有讀執行許可權 (rwx, r-x(mask) 兩者執行‘相與’操作得到實際許可權)
group::r-x #effective:r--
group:sales:rwx #effective:r--
mask::r--
other::r--
a、這組ACL訪問列表中:檔案的擁有者具有讀寫許可權,檔案所屬的組具有讀和執行的許可權,其他使用者具有讀許可權;除此之外,還有兩個擴充套件的ACL項,分別為使用者bruce和組sales,並都授予了讀寫執行的許可權。
b、最大有效許可權mask:mask項是一個特殊的項,用於過濾授予所有命名使用者,命名組及未命名組的許可權,即過濾除檔案擁有者和其他使用者(other)之外的任何ACL項
(3)、預設訪問控制列表:有目錄可能擁有預設訪問控制列表,當建立新檔案或者子目錄時,自動拷貝父輩的預設訪問控制列表到自己的訪問控制列表中,新的子目錄也拷貝父輩預設的訪問控制列表到自己的預設訪問控制列表中。這樣,當建立子目錄時預設ACL將沿著檔案系統樹被任意深層次地拷貝。
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:bruce:rwx #effective:r-x //有效許可權,‘相與’操作後得到
default:group::r-x
default:group:sales:rwx #effective:r-x
default:mask::r-x
default:other::r-x
3、hdfs acl許可權生效的演算法規則
(1)如果是owner,則取owner的許可權
(2)如果針對使用者設定了ACL,則使用者的ACL生效
(3)如果使用者在組裡,則取各組ACL的並集
(4)其他情況,取other的許可權
(5)default許可權:設定default之後,對新新增的檔案和目錄生效,對於現有的檔案和目錄不生效。
如:目錄A擁有default:user:bruce:rwx許可權,則在目錄A下建立目錄B,則目錄B擁有user:bruce:rwx,default:user:bruce:rwx許可權。
4、hdfs acl shell命令
(1)、顯示某個檔案的許可權
hdfs dfs -getfacl [-R]
如:hdfs dfs -getfacl /test/acl
(2)、賦予許可權:
hdfs dfs -setfacl [-R] -m
如:hdfs dfs -setfacl -R -m user:testUser:rw- /test/acl
(3)、刪除許可權:
hdfs dfs -setfacl [-R] [-b|-k |-x ]|[–set ]
-x 刪除指定的acl許可權
-k 刪除所有預設的許可權
-b 刪除所有的許可權
5、hdfs acl FileSystem 相關API
public void modifyAclEntries(Path path, List<AclEntry> aclSpec) throws IOException;
public void removeAclEntries(Path path, List<AclEntry> aclSpec) throws IOException;
public void public void removeDefaultAcl(Path path) throws IOException;
public void removeAcl(Path path) throws IOException;
public void setAcl(Path path, List<AclEntry> aclSpec) throws IOException;
public AclStatus getAclStatus(Path path) throws IOException;
如:給檔案 /user/test/input/acl 設定 user:bruce:r-x default:user:bruce:r-x許可權
程式碼如下:
@Test
public void testModifyAcl () throws IOException{
List<AclEntry> aclEntries = new ArrayList<AclEntry>();
for (int i = 0; i <= 1; i++) {
AclEntryScope aclEntryScope = (i == 0) ? AclEntryScope.ACCESS : AclEntryScope.DEFAULT;
Builder builder = new AclEntry.Builder();
builder.setName("bruce");
builder.setPermission(FsAction.READ_EXECUTE);
builder.setScope(aclEntryScope);
builder.setType(AclEntryType.USER);
AclEntry aclEntry = builder.build();
aclEntries.add(aclEntry);
}
FileSystem fs = FileSystem.get(HadoopConfiguration.getConf());
Path path = new Path("/user/test/input/acl/");
fs.modifyAclEntries(path, aclEntries);
}