- 인쇄
- PDF
Ranger 사용
- 인쇄
- PDF
VPC 환경에서 이용 가능합니다.
Data Forest에서 Apache Ranger로 정책을 설정하여 자신의 리소스를 다른 사용자에게 공유하는 방법을 설명합니다. Ranger UI에 접속해서 사용할 수 있습니다.
Ranger 접속
- Ranger UI에 접속해 주십시오. 임의의 Data Forest 앱 상세 정보 내 Quick links 부분에서 [접속정보 상세보기] 버튼을 클릭하여 Ranger UI 접속 주소를 확인할 수 있습니다.
- Username, Password에 Data Forest 계정 생성 시 지정한 사용자명과 패스워드를 입력하고 로그인해 주십시오.
- Ranger 홈 화면에서 권한을 설정할 수 있는 컴포넌트를 확인할 수 있습니다.
- HDFS, Hive에 대한 ACL을 설정할 수 있습니다. 이 설정은 'Policy'라는 단위로 이루어집니다.
- HDFS, Hive에 대한 ACL을 설정할 수 있습니다. 이 설정은 'Policy'라는 단위로 이루어집니다.
YARN 큐에 대한 권한은 수정할 수 없습니다. YARN에 대한 ACL은 전용 큐 기능 도입 이후 제공될 예정입니다.
HDFS ACL 설정
HDFS ACL을 설정하는 방법은 다음과 같습니다.
- Apache Ranger 홈 화면에서 HDFS > df_hadoop_koya 또는 df_hadoop_tata를 클릭해 주십시오.
- df_hadoop_koya: koya 네임스페이스 아래 파일들에 대한 ACL 관리
- df_hadoop_tata: tata 네임스페이스 아래 파일에 대한 ACL 관리
- [Add New Policy] 버튼을 클릭해 주십시오.
- example 사용자가 만든 디렉터리 및 파일 (
/user/example/foo
,/user/example/bar
)에 대한 권한을 example2에게 추가합니다.
- example 사용자가 만든 디렉터리 및 파일 (
- Policy를 설정해 주십시오.
- Policy Name: Policy 이름 설정(이미 사용 중인 Policy 이름은 사용 불가)
- Resource Path: ACL을 설정할 HDFS 경로 입력
- Data Forest 사용자는 HDFS에서 홈 디렉터리
hdfs:///user/$username
경로에만 접근할 수 있고 홈 디렉터리 하위의 파일에 대해서만 ACL을 관리할 수 있음 (hdfs:///tmp
같은 경로는 사용 불가) - 앞에
hdfs://
scheme은 입력하지 않고/user/$username
으로 시작하는 경로 입력 - 여러 개 입력 가능
- 경로의 유효 여부를 확인하지 않으므로 정확하게 입력
- 경로가 '/'로 끝나지 않도록 주의 필요 (예를 들어,
/user/example/foo/
로 경로를 입력하면foo
에는 접근할 수 없고, 하위에 존재하는 서브 디렉터리에만 접근 가능)
- Data Forest 사용자는 HDFS에서 홈 디렉터리
- Select Group: 권한을 부여할 그룹 지정
- 해당 그룹에 속한 모든 사용자에게 권한 부여
- Data Forest에서 모든 사용자는
users
그룹에 속해 있음. 계정 생성 시 별도 그룹 지정 불가
- Select User: 권한을 부여할 사용자 지정
- Permission: 부여할 권한 선택. (권한: Excute, Read, Write)
- 디렉터리일 경우, Execute 권한이 있어야 디렉터리 내 파일 리스트(
ls
명령어)획득 가능
- 디렉터리일 경우, Execute 권한이 있어야 디렉터리 내 파일 리스트(
- Delegate Admin
- 사용자/그룹에 Delegate Admin을 체크하여 관리자 권한을 위임한 경우 그 사용자/ 그룹은 Policy 관리 가능. 불특정 다수에게 관리자 권한을 위임하지 않도록 주의 필요
- Add Validity Period: 특정 기간 동안만 Policy가 적용되도록 설정 가능
- [Add] 버튼을 클릭해 주십시오. Policy 생성이 완료되기까지 약 5분 정도 소요됩니다.
- 새로운 Policy가 생성되었는지 확인해 주십시오.
/user/example
의 구조는 다음과 같습니다.
퍼미션은 'drwx------'
입니다. Policy를 추가하더라도 이 권한 자체는 변경되지 않습니다.
$ hadoop fs -ls /user/example
Found 9 items
...
drwx------ - example services 0 2021-04-14 18:01 /user/example/bar
drwx------ - example services 0 2021-04-14 18:01 /user/example/foo
drwx------ - example services 0 2021-04-14 18:07 /user/example/foobar
Policy에서 권한을 부여한 example2
계정으로 /user/example/foobar
에 접근하려고 시도할 경우, foo
, bar
에만 권한을 주었기 때문에 접근이 불가능한 것을 확인할 수 있습니다
$ hadoop fs -ls /user/example/foobar
s: Permission denied: user=example2, access=READ_EXECUTE, inode="/user/example/foobar":example:services:drwx------
Policy에서 권한을 부여한 foo
, bar
에는 정상적으로 접근이 가능한 것을 확인할 수 있습니다.
$ hadoop fs -ls /user/example/foo
Found 1 items
-rw------- 3 example services 0 2021-04-14 18:13 /user/example/foo/foo.txt
$ hadoop fs -ls /user/example/bar
Found 1 items
-rw------- 3 example services 0 2021-04-14 18:14 /user/example/bar/bar.txt
Read, Write, Execute 권한을 주었으므로 다음과 같이 파일을 복사할 수 있습니다.
$ hadoop fs -copyToLocal /user/example/foo/foo.txt
Hive ACL 설정
Hive 데이터베이스와 테이블을 생성할 경우 소유자만 접근할 수 있습니다. 다른 사용자에게 접근할 수 있도록 하려면 Ranger를 통해 권한을 부여해야 합니다.
Hive ACL을 설정하는 방법은 다음과 같습니다.
- Ranger 홈 화면에서 Hive > df_hive를 클릭해 주십시오.
- [Add New Policy] 버튼을 클릭해 주십시오.
- 정보를 입력해 주십시오.
- example 사용자의 테이블
example__db_foo.bar_table
에 대한 권한을 example2에게 부여하는 예시
- Policy Name: Policy 이름 설정. 이미 사용 중인 Policy 이름은 사용 불가
- Database: ACL을 설정할 데이터베이스 입력. 여러 개를 입력할 수 있으며, 해당 데이터베이스의 존재 여부는 확인하지 않음
- Table: ACL을 설정할 테이블 입력
- 해당 테이블의 존재 여부는 확인하지 않음
*
로 모든 테이블을 지정 가능
- Hive Column: Data Forest는 컬럼 수준의 ACL을 지원하지 않음.
*
입력 - Select Group: 권한을 부여할 그룹 지정
- 해당 그룹에 속한 모든 사용자에게 권한 부여
- Data Forest에서 모든 사용자는
users
그룹에 속하며, 계정 생성 시 별도 그룹 생성은 지정 불가
- Select User: 권한을 부여할 사용자 지정
- Permission: 부여할 권한 선택
- Delegate Admin: 사용자/그룹에 Delegate Admin을 체크하여 관리자 권한을 위임하면 그 사용자/그룹은 해당 Policy 관리 가능. 불특정 다수에게 관리자 권한을 위임하지 않도록 주의 필요
- Add Validity Period: 권한의 적용 기간 설정 가능
- example 사용자의 테이블
- [Add] 버튼을 클릭해 주십시오. Policy 생성이 완료되기까지 약 5분 정도 소요됩니다.
- 새로운 Policy가 생성되었는지 확인해 주십시오.
HDFS ACL 적용
Hive 테이블 데이터는 HDFS에 저장되어 있기 때문에, Hive ACL 설정 뿐만 아니라 HDFS ACL도 적용해주어야 합니다. HDFS ACL을 설정하지 않으면 조회 쿼리가 실패합니다.
bar_table
에만 접근 권한을 부여합니다. bar_table
아래로는 모두 권한이 부여됩니다 (recursive).
Service: df_hadoop_koya
Resource Path: /user/example/warehouse/example__db_foo.db/bar_table (recursive)
Select User: example2
Permissions: Read/Execute
example__db_foo
을 사용하기 위한 권한입니다. 아래 모든 테이블에 권한을 주지 않을 것이므로 non-recursive로 설정합니다.
Service: df_hadoop_koya
Resource Path: /user/example/warehouse/example__db_foo.db (non-recursive)
Select User: example2
Permissions: Read/Execute
DB 또는 테이블이름에 와일드카드(*
, ?
)를 사용할 수 있습니다. example__db_*
으로 적으면 example 유저가 생성한 모든 데이터베이스에 접근 가능합니다.
'example2' 계정으로 example__db_foo.bar_table에 질의를 할 수 있습니다.
권한 에러가 반환됩니다.
0: jdbc:hive2://zk1.kr.df.naverncp.com:2181,z> select * from example__db_foo.bar_table;
Error: Error while compiling statement: FAILED: SemanticException Unable to fetch table bar_table. java.security.AccessControlException: Permission denied: user=example2, access=EXECUTE, inode="/user/example":example:services:drwx------
0: jdbc:hive2://zk1.kr.df.naverncp.com:2181,z> use example__db_foo;
Error: Error while compiling statement: FAILED: SemanticException MetaException(message:java.security.AccessControlException: Permission denied: user=example2, access=EXECUTE, inode="/user/example":example:services:drwx------
권한 설정 이후에 정상적으로 접근되는 것을 확인 할 수 있습니다.
0: jdbc:hive2://zk1.kr.df.naverncp.com:2181,z> select * from example__db_foo.bar_table;
INFO : Compiling command(queryId=hive_20210415150318_9cd21ba3-9862-4310-9a53-69c5af0dd105): select * from example__db_foo.bar_table
INFO : Semantic Analysis Completed (retrial = false)
INFO : Returning Hive schema: Schema(fieldSchemas:[FieldSchema(name:bar_table.id, type:bigint, comment:null)], properties:null)
INFO : Completed compiling command(queryId=hive_20210415150318_9cd21ba3-9862-4310-9a53-69c5af0dd105); Time taken: 0.096 seconds
INFO : Executing command(queryId=hive_20210415150318_9cd21ba3-9862-4310-9a53-69c5af0dd105): select * from example__db_foo.bar_table
INFO : Completed executing command(queryId=hive_20210415150318_9cd21ba3-9862-4310-9a53-69c5af0dd105); Time taken: 0.001 seconds
INFO : OK
+---------------+
| bar_table.id |
+---------------+
+---------------+
No rows selected (0.122 seconds)
0: jdbc:hive2://zk1.kr.df.naverncp.com:2181,z> use example__db_foo;
INFO : Compiling command(queryId=hive_20210415150322_ac4aa103-4ae3-483f-b388-43040cede0b5): use example__db_foo
INFO : Semantic Analysis Completed (retrial = false)
INFO : Returning Hive schema: Schema(fieldSchemas:null, properties:null)
INFO : Completed compiling command(queryId=hive_20210415150322_ac4aa103-4ae3-483f-b388-43040cede0b5); Time taken: 0.02 seconds
INFO : Executing command(queryId=hive_20210415150322_ac4aa103-4ae3-483f-b388-43040cede0b5): use example__db_foo
INFO : Starting task [Stage-0:DDL] in serial mode
INFO : Completed executing command(queryId=hive_20210415150322_ac4aa103-4ae3-483f-b388-43040cede0b5); Time taken: 0.01 seconds
INFO : OK
No rows affected (0.039 seconds)
0: jdbc:hive2://zk1.kr.df.naverncp.com:2181,z> select * from bar_table;
INFO : Compiling command(queryId=hive_20210415150324_448ce1be-b913-4396-8232-92f76feb40e5): select * from bar_table
INFO : Semantic Analysis Completed (retrial = false)
INFO : Returning Hive schema: Schema(fieldSchemas:[FieldSchema(name:bar_table.id, type:bigint, comment:null)], properties:null)
INFO : Completed compiling command(queryId=hive_20210415150324_448ce1be-b913-4396-8232-92f76feb40e5); Time taken: 0.096 seconds
INFO : Executing command(queryId=hive_20210415150324_448ce1be-b913-4396-8232-92f76feb40e5): select * from bar_table
INFO : Completed executing command(queryId=hive_20210415150324_448ce1be-b913-4396-8232-92f76feb40e5); Time taken: 0.001 seconds
INFO : OK
+---------------+
| bar_table.id |
+---------------+
+---------------+