#Apache Sentry
Data Lake の環境では、Authorisationを担当してくれている、見守り役さん。
ホートンワークスでは、Rangerという別の製品がある。
どちらも、役割としては同じで、Rangerのほうが守備範囲が広い。
Sentryを設定するというのはどういうことなのか
昔ながらのrwxでの管理をやめて、roleベースでの管理に移行をするということ。Hadoopなどでのデータ容量の大きい環境においては、数TBのデータを簡単にchown chmodできないことが多く、isilonなどの特別な環境は除くが、ロールベースで、ロールを切り替えることによって権限を整理することは、とてつもないメリットになる。
ただ、hive コマンドからの脱却をせねばならず、既存アプリケーションの回収が必要になる。様々な部署にまたがって使われる可能性が高いData Lakeのような環境では、これもなかなかの障壁になりそう。
Sentryの設定
CDH 6.2を用いて設定していきます。
こちらの設定をONにすることによって、有効になります。
CDHに従って設定を行っていきます。CDHがエラーを出してくれるので、基本的にはそれに従えばOK
ただ、キーポイントとなるのは、kerbersのimpersonation機能(doas)の無効化でしょうか。
KeberizeされたクラスタではHiveServer2が、接続元のユーザをものまね(impersonation)して実行してくれます。
今回はSentryを設定しますので、ものまねしてしまっては、ロールの意味がありません。ものまねせずロールをありのまま受け入れるためチェックを外します。
初期値では、hiveがadmin roleを持っています。
zakoユーザにてロールを作ってみる
雑魚くんに登場してもらいます。
0: jdbc:hive2://localhost.localdomain:2181/de> select current_user();
+-------+
| _c0 |
+-------+
| zako |
+-------+
0: jdbc:hive2://localhost.localdomain:2181/de> show roles;
INFO : Starting task [Stage-0:DDL] in serial mode
ERROR : FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Access denied to zako. Server Stacktrace: org.apache.sentry.core.common.exception.SentryAccessDeniedException: Access denied to zako
略
0: jdbc:hive2://localhost.localdomain:2181/de> create database zako;
Error: Error while compiling statement: FAILED: SemanticException No valid privileges
User zako does not have privileges for CREATEDATABASE
The required privileges: Server=server1->action=create->grantOption=false; (state=42000,code=40000)
0: jdbc:hive2://localhost.localdomain:2181/de>
雑魚くんには、データベースをみる権限がないようです。
show roles hiveシステム全体でどんなロールがあるのかなぁと言うのを見ています。
次に、現在の雑魚氏に割り当てられている、ロールを見てみます。
0: jdbc:hive2://localhost.localdomain:2181/de> show current roles;
40dd-a3ea-a0c1c18c16bd); Time taken: 0.022 seconds
INFO : OK
+-------+
| role |
+-------+
+-------+
当然ながら何もありませんでした。
#ロールを割り当て
雑魚では埒が明かないのでhiveユーザにて、ロールを作成割り当ててあげます。
0: jdbc:hive2://localhost.localdomain:2181/de> create role zako;
0: jdbc:hive2://localhost.localdomain:2181/de> show roles;
+-------+
| role |
+-------+
| zako |
+-------+
0: jdbc:hive2://localhost.localdomain:2181/de> GRANT ROLE zako TO GROUP datalaker;
雑魚にzakoロールを割り当てました。zakoはdatalakerというグループに属しています。
さいど、権限がどうなったかzakoユーザにて覗いてみます。
: jdbc:hive2://localhost.localdomain:2181/de> select current_user();
INFO : OK
+-------+
| _c0 |
+-------+
| zako |
+-------+
1 row selected (0.549 seconds)
0: jdbc:hive2://localhost.localdomain:2181/de> show current roles;
INFO : OK
+-------+
| role |
+-------+
| zako |
+-------+
zakoが付与されてました!
ただ、ロールをつけただけですので、相変わらず、create databaseなどはできません。
権限を付ける
今度は、このロールに権限を付けていきます。
再びhiveにて
0: jdbc:hive2://localhost.localdomain:2181/de> GRANT ALL ON DATABASE zako TO ROLE zako;
0: jdbc:hive2://localhost.localdomain:2181/de> GRANT ALL ON Server Server1 TO ROLE zako;
zakoデータベースに対して全権限を与えてしまいます!
以下が詳しいです。
https://www.cloudera.com/documentation/enterprise/latest/topics/sg_hive_sql.html
ちなみにserver1というのはhive.serntry.serverのオプション値
#DB作成
zakoユーザにて作成してみます!
0: jdbc:hive2://localhost.localdomain:2181/de> create database zako;
INFO : OK
impersonationをoffにしているので、データはhive hiveで作成されます。
[yuki@localhost ~]$ hadoop fs -ls /user/hive/warehouse/
Found 1 items
drwxrwxrwt - hive hive 0 2019-06-02 23:27 /user/hive/warehouse/zako.db
#他のユーザでの確認
0: jdbc:hive2://localhost.localdomain:2181/de> select current_user();
INFO : OK
+-------+
| _c0 |
+-------+
| yuki |
+-------+
いない
1 row selected (2.641 seconds)
0: jdbc:hive2://localhost.localdomain:2181/de> show databases;
+----------------+
| database_name |
+----------------+
| default |
+----------------+
1 row selected (0.162 seconds)
削除を試みるがだめでした。
0: jdbc:hive2://localhost.localdomain:2181/za> drop database zako;
Error: Error while compiling statement: FAILED: SemanticException No valid privileges
User yuki does not have privileges for DROPDATABASE
The required privileges: Server=server1->Db=zako->action=drop->grantOption=false; (state=42000,code=40000)
0: jdbc:hive2://localhost.localdomain:2181/za>
あとは、どこまで粒度を細かく行うか。
がキモ。運用はきちんと考えねば。