Hive 보안 및 인증, 권한 부여
Hive 보안 및 인증, 권한 부여
· Version : Hive
하둡은 보안강화를 위해 커버로스(Kerberos)인증을 지원한다. 커버로스 인증은 서버와 클라이언트 간의 상호 인증을 지원한다. 더이상 hadoop. job.ugi 속성을 설정하여 다른 사용자인척 할 수 없다. 하지만 이렇게 동작하려면 모든 하둡 구성요소는 커버로스 보안을 양쪽 끝에서 지원해야한다. 모든 하둡 에코 시스템이 커버로스 인증을 지원 못하듯이, 하이브 인증도 완전하지 않다. 하이브는 메타스토어에 접속하기 위해서 JDBC 데이터베이스 연결을 사용하거나 사용자를 대신해서 동작을 수행하는 쓰리프트를 사용한다. 쓰리프트 기반의 하이브 서비스 역시 다른 사용자인척 해야한다. 한 소유자와 그룹이 한 파일에 대한 소유권을 갖는 하둡의 파일 소유 모델은 테이블에서 로우나 컬럼 기반 방식으로 접근을 허용하고 금지하도록 구현된 많은 데이터베이스의 방식과 다르다.
앞에 설명한 파일 소유 모델 때문에 파일과 디렉터리의 소유가 서로 다른 사용자라면 파일에 퍼미션(permission)을 부여하는 일이 중요하다. HDFS 퍼미션 시스템은 user, group, others 요소가 있으며 read, write, execute라는 퍼미션이 있다. 하이브는 hive.files.umask.value 속성을 가지고 있는데 이 설정으로 새롭게 생성하는 파일의 기본 퍼미션을 비트 마스크를 통해서 설정한다. Hadoop 및 Hive 사용자의 구성에 따라 664 권한인 0002의 파일 권한 비트 마스크를 만들 수 있다.
<property> <name>hive.files.umask.value</name> <value>0002</value> <description>The dfs.umask value for the hive created folders</description> </property> |
hive.metastore.authorization.storage.checks 속성을 true로 설정하면 테이블 내부에 사용자가 지울 수 있는 퍼미션을 갖지 못한 파일이 있을때 하이브는 해당 테이블을 드롭하는 것을 방지한다. 이 속성의 기본값은 false 이며 true로 설정해야 한다.
<property> <name>hive.metastore.authorization.storage.checks</name> <value>true</value> <description>Should the metastore do authorization checks against the underlying storage for operations like drop-partition (disallow the drop-partition if the user in question doesn't have permissions to delete the corresponding directory on the storage).</description> </property> |
동시에 Hive는 hive.metastore.execute.setugi를 가능한 true로 설정한다. 안전하지 않은 모드에서 이 속성을 true로 설정하면 메타 스토어가 사용자 및 그룹의 권한을 정의하는 DFS 작업을 수행한다.
Hive 인증을 활성화 하는 방법은 hive.security.authorization.enabled를 true로 설정한다. 기본값은 false이다.
<property> <name>hive.security.authorization.enabled</name> <value>true</value> <description>Enable or disable the hive client authorization</description> </property> |
hive.security.authorization.createtable.owner.grants 속성에서는 테이블 생성자가 접근할 수 있는 권한을 구성한다. 기본값은 null이며, ALL로 설정하여 사용자가 자신이 만든 테이블에 액세스 할 수 있도록 한다.
<property> <name>hive.security.authorization.createtable.owner.grants</name> <value>ALL</value> <description>The privileges automatically granted to the owner whenever a table gets created.An example like "select,drop" will grant select and drop privilege to the owner of the table</description> </property> |
아래 스크립트는 Hive명령으로 사용자 인증을 활성화 한다. 권한이 없을 경우 아래 예제 스크립트와 같이 테이블 생성시 오류가 발생한다.
hive> set hive.security.authorization.enabled=true;
hive> CREATE TABLE auth_test (key int, value string);
Authorization failed:No privilege 'Create' found for outputs { database:default}. Use show grant to get more details |
권한을 부여하기 위해서는 아래 스크립트를 사용할수 있다. 사용자(USER), 그룹(GROUP), 역할(ROLES)와 같은 다양한 주제에 권한을 부여할 수 있다.
hive> set system:user.name;
system:user.name=hadoop
hive> GRANT CREATE ON DATABASE default TO USER hadoop;
hive> CREATE TABLE auth_test (key INT, value STRING);
Confirm the permissions we have with the SHOW GRANT command: hive> SHOW GRANT USER hadoop ON DATABASE default; database default principalName hadoop principalType USER privilege Create grantTime Sun May 06 17:18:10 EDT 2018 grantor hadoop |
사용자별로 퍼미션을 부여하는 작업은 사용자와 테이블이 많을수록 관리 부담이 증가한다. 이런경우 그룹 단위로 퍼미션을 부여할 수 있다. 하이브에서 그룹은 사용자의 첫 번째 POSIX 그룹과 동일하다.
hive> CREATE TABLE auth_test_group(a int,b int);
hive> SELECT * FROM auth_test_group;
Authorization failed:No privilege 'Select' found for inputs { database:default, table:auth_test_group, columnName:a}. Use show grant to get more details. hive> GRANT SELECT on table auth_test_group to group hadoop; hive> SELECT * FROM auth_test_group; OK Time taken: 0.119 seconds |
사용자와 그룹 퍼미션이 충분히 유연하지 않은경우 역할(role)을 사용할 수 있다. 사용자에게 역할을 부여하고 특권이 역할에 부여될수 있다. 시스템 외부에서 제어하는 그룹과는 달리 역할은 하이브 내부에서 제어되므로 좀더 유연성을 제공한다.
hive> set system:user.name;
system:user.name=hadoop
hive> GRANT CREATE ON DATABASE default TO USER hadoop;
hive> CREATE TABLE auth_test (key INT, value STRING);
Confirm the permissions we have with the SHOW GRANT command: hive> SHOW GRANT USER hadoop ON DATABASE default; database default principalName hadoop principalType USER privilege Create grantTime Sun May 06 17:18:10 EDT 2018 grantor hadoop |
기본적으로 파티션 테이블의 권한은 테이블의 권한을 따르거나 각 파티션에 대한 권한 메커니즘을 설정할 수 있다. 테이블 속성의 PARTITION_LEVEL_PRIVILEGE를 true로 설정하여 사용할 수 있다.
hive> ALTER TABLE auth_part > SET TBLPROPERTIES ("PARTITION_LEVEL_PRIVILEGE"="TRUE"); Authorization failed:No privilege 'Alter' found for inputs {database:default, table:auth_part}. Use show grant to get more details. |
일반 사용자는 쿼리를 수행하기 위해서 스스로 특권을 부여하는 번거로움 없이 테이블을 생성하고 싶을 것이다. 또는 기본 동작으로 모든 특권을 부여하여 사용하고 싶을 것이다. 아래 스크립트는 SELECT와 DROP 특권을 자신 소유의 테이블에 자동으로 권한을 부여한다.
<property> <name>hive.security.authorization.createtable.owner.grants</name> <value>select,drop</value> </property> |
비슷하게 특정 사용자는 생성한 테이블에 대한 특권을 자동으로 부여받을수 있다. 아래 스크립트는 sungwook, sqlmvp 사용자가 모든 테이블을 읽을수 있는 권한을 부여한다. 그리고 tom은 테이블 생성만 가능하다.
<property> <name>hive.security.authorization.createtable.user.grants</name> <value>sungwook,sqlmvp:select;tom:create</value> </property> |
동일한 구성을 그룹 권한 및 역할 권한에도 적용할 수 있다.
hive.security.authorization.createtable.group.grants hive.security.authorization.createtable.role.grants |
권한을 회수하는 방법은 아래 스크립트를 사용한다.
revoke create on database default from user sungwook; revoke select on database default from group sungwook; |
[참고자료]
· Hive - Authority Management (Authorization) : https://www.programmersought.com/article/1095315821/
2020-10-27 / Sungwook Kang / http://sungwookkang.com
Hadoop, Big Data, 하둡, 빅데이터, 데이터분석, Hive, Hive tunning, 하이브 튜닝, 하이브 보안, 하이브 인증, 하이브 권한, Hive Security, Hive Authorization, Hive Authority Management