
이 글은 하이브 완벽 가이드 책을 읽고 그 중 일부 내용을 정리한 글입니다.
하이브 인증
파일과 디렉터리의 소유가 서로 다른 사용자인 경우에 파일에 퍼미션을 부여하는 일이 중요해집니다. HDFS 퍼미션 시스템은 user, group, others 요소가 있다는 점에서 유닉스 모델과 매우 유사합니다. 또한 read, write, execute라는 세 가지 퍼미션이 있습니다. 하이브는 umask 값을 hive.files.umask.value 속성을 통해 정의합니다.
또한 hive.metastore.authorization.storage.checks 속성을 true로 설정하면 테이블 내부에 사용자가 지울 수 있는 퍼미션을 갖지 못한 파일이 있을 때 하이브는 해당 테이블을 드롭하는 것을 막습니다. 이 속성의 기본값은 false입니다.
하이브가 보안 모드에서 작동 중이라면 하이브 메타스토어는 hive.metastore.execute.setugi를 true로 설정합니다. 안전하지 않은 모드에서 이 속성을 true로 설정하면 메타스토어는 DFS 작업을 클라이언트에서 보고한 사용자나 그룹 퍼미션을 사용해 수행합니다. 이 속성은 클라이언트와 서버 양쪽에 설정해야 하며 클라이언트에서 이 설정이 true이고 서버가 false이면 클라이언트의 설정은 무시됩니다.
하이브 권한
hive.security.authorization.enabled 속성은 하이브 클라이언트 권한을 활성화 또는 비활성화합니다. 기본값은 false입니다. hive.security.authorization.createtable.owner.grants 속성은 테이블이 생성될 때 소유자에게 자동으로 부여할 특권을 설정합니다. 예를 들어 'select,drop'으로 설정하면 select, drop 특권이 테이블 소유자에게 자동으로 부여되고 ALL이면 모두 부여됩니다. 기본값은 null로 설정하여 자신의 테이블에 접근할 수 없게 합니다.
사용자, 그룹, 역할
하이브는 사용자, 그룹, 역할에 특권을 부여하거나 회수할 수 있습니다. 다음은 사용자에 어떻게 특권을 부여하는지에 대한 예제입니다.
SET hive.security.authorization.enabled=true;
-- 권한이 없기 때문에 에러
CREATE TABLE authorization_test (key int, value string);
-- 이름 확인
SET system:user.name;
-- 테이블 생성 권한 부여
GRANT CREATE ON DATABASE default TO USER me;
-- 이제 테이블 생성 가능
CREATE TABLE authorization_test (key int, value string);
-- 특권 확인
SHOW GRANT USER me ON DATABASE default;
사용자별로 퍼미션을 부여하는 일은 사용자와 테이블이 많을수록 관리 부담이 늘어나기 때문에 이 경우 그룹 단위로 퍼미션을 부여하는 것이 더 효율적인 방법입니다.
CREATE TABLE authorization_test_grp (key int, value string);
-- 퍼미션 에러
SELECT * FROM authorization_test_grp;
-- 권한 부여
GRANT SELECT ON TABLE authorization_test_grp TO GROUP grp;
-- 이제 조회 가능
SELECT * FROM authorization_test_grp;
사용자와 그룹 퍼미션이 충분히 유연하지 않은 경우 역할을 사용할 수 있습니다. 사용자에게 역할을 부여하고 특권이 역할에 부여될 수 있습니다. 시스템 외부에서 제어하는 그룹과는 달리 역할은 하이브 내부에서 제어되므로 좀 더 유연성을 제공합니다.
CREATE TABLE auth_test_role (a int, b int);
-- fail
SELECT * FROM auth_test_role;
-- 역할 생성
CREATE ROLE users_auth_role;
-- 역할 부여
GRANT ROLE users_auth_role TO USER me;
-- 권한 부여
GRANT SELECT ON TABLE auth_test_role TO ROLE users_auth_role;
-- success
SELECT * FROM auth_test_role;
특권 부여와 회수
다음은 하이브에서 설정할 수 있는 특권 목록입니다.
| 이름 | 설명 |
| ALL | 모든 특권을 한 번에 부여한다. |
| ALTER | 테이블 변경 가능 |
| CREATE | 테이블 생성 가능 |
| DROP | 테이블이나 테이블 내부의 파티션 삭제 기능 |
| INDEX | 색인 생성 가능 |
| LOCK | 동시성을 활성화할 경우 테이블을 잠그거나 풀 수 있도록 하는 기능 |
| SELECT | 테이블이나 파티션에 쿼리 가능 |
| SHOW_DATABASE | 이용 가능한 데이터베이스 조회 가능 |
| UPDATE | 테이블이나 파티션에 로드 또는 삽입 가능 |
파티션 레벨 특권
하이브 테이블이 파티셔닝 되는 것은 매우 일반적입니다. 기본적으로 특권은 테이블 레벨에서 부여하지만 파티션 단위로 부여할 수도 있습니다. 그렇게 하려면 테이블 속성 PARTITION_LEVEL_PRIVILEGE를 true로 설정해야 합니다.
CREATE TABLE auth_part (key int, value string)
PARTITIONED BY (ds string);
-- 테이블에 권한 부여
GRANT ALTER ON TABLE auth_part TO USER me;
-- 파티션 레벨 특권 설정
ALTER TABLE auth_part SET TBLPROPERTIES ("PARTITION_LEVEL_PRIVILEGE"="TRUE");
-- 파티션 추가
ALTER TABLE auth_part ADD PARTITION (ds='3');
ALTER TABLE auth_part ADD PARTITION (ds='4');
-- 데이터 조회
SELECT * FROM auth_part WHERE ds = '3';
-- 파티션 단위로 권한 회수
REVOKE SELECT ON TABLE auth_part PARTITION (ds='3') FROM USER me;
-- 퍼미션 에러
SELECT * FROM auth_part WHERE ds = '3';
-- success
SELECT * FROM auth_part WHERE ds = '4';
자동 권한 부여
일반 사용자는 쿼리를 수행하기 전에 스스로 특권을 부여하는 번거로움 없이 테이블을 생성하고 싶을 것입니다. hive.security.authorization.createtable.owner.grants 속성은 테이블을 생성하는 사람에게 자동으로 주어지는 특권을 결정합니다.
비슷하게 특정 사용자는 생성한 테이블에 대한 특권을 자동으로 부여받을 수 있습니다. hive.security.authorization.createtable.user.grants 값은 이 동작을 제어합니다. 다음 예제에서는 하이브 관리자 admin1과 사용자 edward는 모든 테이블을 읽을 수 있고 user1은 생성만 할 수 있게 특권을 부여합니다.
SET hive.security.authorization.createtable.user.grants=admin1,edward:select,user1:create;'Hadoop Ecosystem > Hive' 카테고리의 다른 글
| [하이브 완벽 가이드] Ch15. 하이브 파일과 레코드 포맷 사용자화 (0) | 2022.10.29 |
|---|---|
| [하이브 완벽 가이드] Ch11. 기타 파일 포맷과 압축 (0) | 2022.10.24 |
| [하이브 완벽 가이드] Ch10. 튜닝 (0) | 2022.10.10 |
| [하이브 완벽 가이드] Ch9. 스키마 설계 (0) | 2022.10.06 |
| [하이브 완벽 가이드] Ch8. HiveQL : 색인(Index) (0) | 2022.10.04 |