Sentryを導入する

#Apache Sentry
Data Lake の環境では、Authorisationを担当してくれている、見守り役さん。
ホートンワークスでは、Rangerという別の製品がある。
どちらも、役割としては同じで、Rangerのほうが守備範囲が広い。

# Sentryを設定するというのはどういうことなのか
昔ながらのrwxでの管理をやめて、roleベースでの管理に移行をするということ。Hadoopなどでのデータ容量の大きい環境においては、数TBのデータを簡単にchown chmodできないことが多く、isilonなどの特別な環境は除くが、ロールベースで、ロールを切り替えることによって権限を整理することは、とてつもないメリットになる。

ただ、hive コマンドからの脱却をせねばならず、既存アプリケーションの回収が必要になる。様々な部署にまたがって使われる可能性が高いData Lakeのような環境では、これもなかなかの障壁になりそう。

# Sentryの設定
CDH 6.2を用いて設定していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128504/35cde718-f128-34f9-d7b3-8d2718a1ba08.png)

こちらの設定を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  |
+-------+
```

いない:v:

```
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> 

```

あとは、どこまで粒度を細かく行うか。
がキモ。運用はきちんと考えねば。