Kerberizedクラスターを構築しSentryの挙動を確認する

# HDFSのパーミッション, HDFS-ACL, Sentryの違い

- HDFSのパーミッション
  - いわゆるLinuxのパーミッション的なもの。ファイル、ディレクトリに対してユーザ/グループ単位でオーナーを付与する。
- HDFS-ACL
  - HDFSのファイルやディレクトリに対してユーザ/グループ単位で権限を付与する。POSIX ACLやActive Directory的なもの。一つのファイル/ディレクトリに対して複数のユーザ/グループの権限を細かく設定できる
- Sentry
  - Hive,ImpalaなどSQL on Hadoop向けののDB/テーブルの権限管理のためのもの。role groupベースで権限を管理する

HDFSでややこしいのが、たまたまHiveのテーブルもHDFSのディレクトリで表現されるため、Sentryの権限とHDFS-ACLの権限が混乱しやすいです。（僕は色々勘違いをしていました）

HDFS-ACLは明示的に有効にしてはじめて使えるものです。詳しくはドキュメントを参照ください。
http://www.cloudera.com/documentation/enterprise/latest/topics/cdh_sg_hdfs_ext_acls.html


# Kerberosの設定

まず、これらを読みます。

- [HDFSでアクセス制御リスト（ACL）を設定する | Tech Blog](http://linux.wwing.net/WordPress/?p=1485)

Kerberosの設定の仕方は、[Cloudera Manager によるクラスタのKerberos化 - Qiita](http://qiita.com/azurecube/items/771de2814115338eed71)も参考にします。

今回はAWS上のCloudera Directorでクラスタを作ります。
Directorのインストールは[Cloudera Director のインストール方法 - Qiita](http://qiita.com/shiumachi/items/90649830cb9b45726d99)を参考にするといいでしょう。

Directorの入っているインスタンスに、KDCを入れて設定します。便利な[krb-bootstrap](https://github.com/daisukebe/krb-bootstrap)というスクリプトがあるので、今回はそれで試してみます。

なお、krb-bootstrapはテスト用にKDCの環境を作るものですので、本番環境には利用しないでください。


```sh
$ yum -y install git
$ git clone https://github.com/daisukebe/krb-bootstrap.git
$ cd krb-bootstrap
$ ./configure_krb5.sh
```

そうすると、以下のprincipalがスクリプトによって作られます。

- hive@HADOOP
- hdfs@HADOOP

# Clouder DirectorによるKerberized Clusterの作成

次にCloudera DirectorのWeb UIでクラスタを作成します。
[ドキュメント](https://www.cloudera.com/documentation/director/latest/topics/director_create_kerberized_cluster.html)にはCloudera Director clientを使ったconfiguration fileを使った設定方法があります。

こちらに従いKerberos環境を構築します。

krb-bootstrapを使ってKDCを設定している場合、[conf file](https://github.com/cloudera/director-scripts/blob/master/kerberos/aws.kerberos.sample.conf)の変更点としては、以下の通りになります。

```diff
-krbAdminUsername: "REPLACE-ME"
+krbAdminUsername: "cloudera-scm/admin"
-krbAdminPassword: "REPLACE-ME"
+krbAdminPassword: "cloudera"

-            KDC_TYPE: "Active Directory"
+            KDC_TYPE: "MIT KDC"
-            KDC_HOST: "REPLACE-ME"
+            KDC_HOST: "自分のdirector serverのhost名"
-            SECURITY_REALM: "REPLACE-ME"
+            SECURITY_REALM: "HADOOP"
-            KRB_ENC_TYPES: "aes256-cts aes128-cts des3-hmac-sha1 arcfour-hmac des-hmac-sha1 des-cbc-md5 des-cbc-crc"
+            KRB_ENC_TYPES: "rc4-hmac"
```

なお、暗号化の方式は今回はテスト用なのでrc4-hmacを使っていますが、本番環境ではAES-256をお使いください。
http://www.cloudera.com/documentation/enterprise/latest/topics/cdh_sg_jce_policy_file_install.html

以降は通常通り、Director Clientからクラスタを起動すればOKです。
今回はテスト用にgatewayサーバは立てず、workerノードも1インスタンスのみにしています。
Sentryはクラスタ起動後にCloudera Managerから入れます。

# Sentryの導入

[Yet Another HDIF? — Apache Sentryで始めるアクセス制御 (Hive編)](http://hdif.tumblr.com/post/104400949099/apache-sentry%E3%81%A7%E5%A7%8B%E3%82%81%E3%82%8B%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E5%88%B6%E5%BE%A1-hive%E7%B7%A8)を参考にしながら、CMで頑張ります。

Hive Server2のimpersonationの無効化と、HiveでのSentryの有効化をお忘れなく...。

![image](https://qiita-image-store.s3.amazonaws.com/0/11143/582798ef-9b10-beb1-8cac-7e7c6e11f975.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/11143/5fea045e-955e-0876-9d1b-3ce8c42e66ce.png)


## principalの作成

Sentryはroleベースで権限を管理します。SentryはACLのgroupに対してパーミッションを管理するものですが、今回は簡略化のためにhiveとcentosをgroupだと思って進めていきます。

Cloudera DirectorのインスタンスでKDCの管理コンソールにログインし、`centos@HADOOP`というprincipalを作ります

```sh
$ sudo kadmin.local
 ...snip...
kadmin.local: addprinc centos
 ...snip...
kadmin.local: exit
```

正しく設定できていれば、`kinit`でチケットの発行ができます。

```sh
$ kinit centos
```

## Sentryの権限の付与

続いて、クラスタのmasterサーバでbeelineを用いて、Sentryの権限を付与します
Sentryの権限付与の詳細については[ドキュメント](https://www.cloudera.com/documentation/enterprise/latest/topics/sg_hive_sql.html)を参照してください。


今回は`admin`と`common`というroleを作ります。`admin`には`hive` groupを、`common`には`centos` groupを追加します。

```sh
$ beeline
beeline> !connect jdbc:hive2://ip-10-0-1-111.ap-northeast-1.compute.internal:10000/default;principal=hive/ip-10-0-1-111.ap-northeast-1.compute.internal@HADOOP
```

GRANTのSQLは以下の通り

```sql
create role admin;
grant ALL on database default to role admin;
grant role admin to group hive;

create role common;
grant select on database default to role common;
grant role common to group centos;
```

きちんとGRANTされていれば、`hdfs` groupの権限ではtableも見れません。

```sh
$ kinit hdfs
Password for hdfs@HADOOP:
$ beeline
beeline> !connect jdbc:hive2://ip-10-0-1-111.ap-northeast-1.compute.internal:10000/default;principal=hive/ip-10-0-1-111.ap-northeast-1.compute.internal@HADOOP
0: jdbc:hive2://ip-10-0-1-111.ap-northeast-1.> show tables;
...snip...
+-----------+--+
| tab_name  |
+-----------+--+
+-----------+--+
```

`centos` groupだとtableを見ることができます。

```
$ kinit centos
Password for centos@HADOOP:
$ beeline
beeline> !connect jdbc:hive2://ip-10-0-1-111.ap-northeast-1.compute.internal:10000/default;principal=hive/ip-10-0-1-111.ap-northeast-1.compute.internal@HADOOP
...snip...
0: jdbc:hive2://ip-10-0-1-111.ap-northeast-1.> show tables;
...snip...
+------------+--+
|  tab_name  |
+------------+--+
| customers  |
| sample_07  |
| sample_08  |
| web_logs   |
+------------+--+
4 rows selected (0.272 seconds)
```



## Sentry HDFS-ACL syncを有効にする

Sentry HDFS-ACL syncはSentryの権限の設定をHDFS ACLに対して同期するものです。
これは、指定したディレクトリ以下のHiveで管理されているデータに対してACLが設定されます。

詳しくはドキュメントを参照ください。
http://www.cloudera.com/documentation/enterprise/latest/topics/sg_hdfs_sentry_sync.html

CMのHDFSの設定で「Sentry同期の有効化」のチェックをONにします。

![image](https://qiita-image-store.s3.amazonaws.com/0/11143/67a7e00f-3725-2854-f954-cdb4ba38ee26.png)

# HDFS-ACL sync利用時のSentryの挙動
## 外部テーブルのHDFS-ACL syncの挙動を確認する

HDFS-ACL syncは通常、`/user/hive/warehouse`以下に作られるDB/テーブルのACL連携を使うことが多いと思います。
それでは、外部テーブルや別の場所にあるDBはどういう挙動をするのでしょうか？
確認してみたいと思います。

今回は、外部テーブルに使うデータを
https://catalog.data.gov/dataset/consumer-complaint-database からCSVをダウンロードし、
`/user/centos/data/consumer_complaints/row.csv` に置きました

```sh
$ wget -O raw.csv https://data.consumerfinance.gov/api/views/s6ew-h6mp/rows.csv?accessType=DOWNLOAD
$ kinit hdfs
$ hdfs dfs -mkdir /user/centos
$ hdfs dfs -chown centos:centos /user/centos
$ kinit centos
$ hdfs dfs -mkdir -p /user/centos/data/consumer_complaints
$ hdfs dfs -put rows.csv /user/centos/data/consumer_complaints/rows.csv
```

`hive` groupでチケットを発行して、beelineから外部テーブルを作ります。

```sh
$ kinit hive
$ beeline
!connect ...
```

```sql
create external table customer_complaints(
  date_received DATE, product STRING, subproduct STRING, 
  issue STRING, subissue STRING, consumer_complaint_narrative STRING,
  company_public_response STRING,
  company STRING, state STRING, zipcode STRING, tags STRING, consumer_consent_provided DATE, submitted_via STRING, date_sent_to_company DATE, company_response_to_consumer STRING,
  timely_response STRING, consumer_disputed STRING, complaint_id BIGINT 
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
stored as textfile
location '/user/centos/data/consumer_complaints/'
tblproperties ("skip.header.line.count"="1")
;
```

```
0: jdbc:hive2://ip-10-0-1-111.ap-northeast-1.> show tables;
 ...snip...
+----------------------+--+
|       tab_name       |
+----------------------+--+
| customer_complaints  |
| customers            |
| sample_07            |
| sample_08            |
| web_logs             |
+----------------------+--+
5 rows selected (0.162 seconds)
0: jdbc:hive2://ip-10-0-1-111.ap-northeast-1.> select complaint_id from customer_complaints limit 10;
 ...snip...
+---------------+--+
| complaint_id  |
+---------------+--+
| 468882        |
| 468889        |
| 468879        |
| 468949        |
| 475823        |
| 468981        |
| 467801        |
| 475728        |
| 469026        |
| 469035        |
+---------------+--+
10 rows selected (0.187 seconds)
```

外部テーブルがある場所をCMからHDFS-ACL syncのターゲットに追加します。
今回は、`/user/centos/data`を追加します。

![image](https://qiita-image-store.s3.amazonaws.com/0/11143/1f4ce64e-d41b-487b-f73b-928bd0865b2f.png)


HUEでACLを確認してみたところ、きちんと`customer_complaints`のACLが設定されていることがわかります。ファイルやディレクトリのアイコンが青くなっているのがACLがセットされたものになります。（なお、`hoge`というファイルは別途ACLをテストでセットしたものです。）

![image](https://qiita-image-store.s3.amazonaws.com/0/11143/873192d1-96ca-70a8-c8cf-26903130b688.png)


## HDFS-ACL syncのwarehouseディレクトリ以外のDBの挙動を確認する

今度は、HDFS-ACL syncを`/user/hive/warehouse`以外のDBに対して設定した場合の挙動を確認しましょう。
先程まで設定した `/user/centos/data` は何かしらのingestしたデータが入ってくる場所と考えて、
今回は`/user/centos/db`をDB用のディレクトリにします。
なお、多くの場合個別ユーザの下にDBを作る必要はないと思いますが、今回は検証目的に作成してみます。

```
$ kinit centos
$ hdfs dfs -mkdir /user/centos/db
```

HDFS-ACL syncの設定をする前に、先に手動でACLを設定します。
`/user/centos/db`に対してhiveが書き込みできるようにACLを設定します。

```sh
$ hdfs dfs -setfacl -m group:hive:rwx /user/centos/db
# file: /user/centos/db
# owner: centos
# group: centos
user:hive:rwx
group::r-x
```

`/user/centos/db`にデータベースを作成します。

```
0: jdbc:hive2://ip-10-0-1-111.ap-northeast-1.> create database centos
. . . . . . . . . . . . . . . . . . . . . . .> location '/user/centos/db'
. . . . . . . . . . . . . . . . . . . . . . .> ;
0: jdbc:hive2://ip-10-0-1-111.ap-northeast-1.> show databases;
+----------------+--+
| database_name  |
+----------------+--+
| centos         |
| default        |
+----------------+--+
2 rows selected (0.238 seconds)
```

`kinit hive`をしたあと、`beeline`で権限を`centos`に付与します。
今回は`centos`groupには`centos`DBに対してすべての権限を付与します。

```sql
create role centos;
grant all on database centos to role centos;
grant role centos to group centos;
```

`kinit centos`をしたあと、DBの様子を確認してみましょう。

```
0: jdbc:hive2://ip-10-0-1-111.ap-northeast-1.> show databases;
..snip..
+----------------+--+
| database_name  |
+----------------+--+
| centos         |
| default        |
+----------------+--+
2 rows selected (0.267 seconds)
```

次に`centos`DBにテーブルを作成します。
`customer_complaints`のParquet形式のテーブルを作成してみます。

```sql
use centos;
create table customer_complaints_pq(
  date_received TIMESTAMP, product STRING, subproduct STRING, 
  issue STRING, subissue STRING, consumer_complaint_narrative STRING,
  company_public_response STRING,
  company STRING, state STRING, zipcode STRING, tags STRING, consumer_consent_provided TIMESTAMP, submitted_via STRING, date_sent_to_company TIMESTAMP, company_response_to_consumer STRING,
  timely_response STRING, consumer_disputed STRING, complaint_id BIGINT 
)
stored as parquet
;
```

```
0: jdbc:hive2://ip-10-0-1-111.ap-northeast-1.> show tables;
...snip...
+-------------------------+--+
|        tab_name         |
+-------------------------+--+
| customer_complaints_pq  |
+-------------------------+--+
1 row selected (0.169 seconds)
```

テーブルができていますね。
そこに`customer_complaints`テーブルからデータを流し込みます。

```sql
insert overwrite table customer_complaints_pq select * from default.customer_complaints;
```

```
0: jdbc:hive2://ip-10-0-1-111.ap-northeast-1.> select complaint_id, company from customer_complaints_pq limit 10;
...snip...
+---------------+-----------------------------+--+
| complaint_id  |           company           |
+---------------+-----------------------------+--+
| 468882        | Wells Fargo & Company       |
| 468889        | Wells Fargo & Company       |
| 468879        | Santander Bank US           |
| 468949        | Wells Fargo & Company       |
| 475823        | Franklin Credit Management  |
| 468981        | Bank of America             |
| 467801        | NRA Group, LLC              |
| 475728        | SunTrust Banks, Inc.        |
| 469026        | Citibank                    |
| 469035        | Wells Fargo & Company       |
+---------------+-----------------------------+--+
10 rows selected (0.257 seconds)
```

一通り設定したので、CMからACL syncのディレクトリに`/user/centos/db`を追加します。

## ACLの確認

最終的にできたACLはこんな感じになります。

![image](https://qiita-image-store.s3.amazonaws.com/0/11143/0183da44-145c-302a-6c46-447d39de29a9.png)


`/user/centos` 以下のACLはこのような形になっています。
（`/user/centos`に関しては手動で設定したものが残っています）

```sh
$ hdfs dfs -getfacl -R /user/centos
# file: /user/centos
# owner: centos
# group: centos
user::rwx
user:centos:rwx
group::r-x
mask::rwx
other::r-x

..snip..

# file: /user/centos/data
# owner: centos
# group: centos
user::rwx
group::r-x
other::r-x

# file: /user/centos/data/consumer_complaints
# owner: hive
# group: hive
user::rwx
group:centos:r-x
user:hive:rwx
group::---
group:hive:rwx
mask::rwx
other::--x

# file: /user/centos/data/consumer_complaints/rows.csv
# owner: hive
# group: hive
user::rwx
group:centos:r-x
user:hive:rwx
group::---
group:hive:rwx
mask::rwx
other::--x

# file: /user/centos/db
# owner: hive
# group: hive
user::rwx
group:centos:rwx
user:hive:rwx
group::---
group:hive:rwx
mask::rwx
other::--x

# file: /user/centos/db/customer_complaints_pq
# owner: hive
# group: hive
user::rwx
group:centos:rwx
user:hive:rwx
group::---
group:hive:rwx
mask::rwx
other::--x

# file: /user/centos/db/customer_complaints_pq/000000_0
# owner: hive
# group: hive
user::rwx
group:centos:rwx
user:hive:rwx
group::---
group:hive:rwx
mask::rwx
other::--x

# file: /user/centos/db/customer_complaints_pq/000001_0
# owner: hive
# group: hive
user::rwx
group:centos:rwx
user:hive:rwx
group::---
group:hive:rwx
mask::rwx
other::--x
```

/user/hive/warehouse 以下のACLはこのような形になっています。

```
$ hdfs dfs -getfacl -R /user/hive/warehouse
# file: /user/hive/warehouse
# owner: hive
# group: hive
user::rwx
group:centos:r-x
user:hive:rwx
group::---
group:hive:rwx
mask::rwx
other::--x

# file: /user/hive/warehouse/customers
# owner: hive
# group: hive
user::rwx
group:centos:r-x
user:hive:rwx
group::---
group:hive:rwx
mask::rwx
other::--x

# file: /user/hive/warehouse/customers/customers
# owner: hive
# group: hive
user::rwx
group:centos:r-x
user:hive:rwx
group::---
group:hive:rwx
mask::rwx
other::--x

# file: /user/hive/warehouse/sample_07
# owner: hive
# group: hive
user::rwx
group:centos:r-x
user:hive:rwx
group::---
group:hive:rwx
mask::rwx
other::--x

# file: /user/hive/warehouse/sample_07/sample_07
# owner: hive
# group: hive
user::rwx
group:centos:r-x
user:hive:rwx
group::---
group:hive:rwx
mask::rwx
other::--x

# file: /user/hive/warehouse/sample_08
# owner: hive
# group: hive
user::rwx
group:centos:r-x
user:hive:rwx
group::---
group:hive:rwx
mask::rwx
other::--x

# file: /user/hive/warehouse/sample_08/sample_08
# owner: hive
# group: hive
user::rwx
group:centos:r-x
user:hive:rwx
group::---
group:hive:rwx
mask::rwx
other::--x

# file: /user/hive/warehouse/web_logs
# owner: hive
# group: hive
user::rwx
group:centos:r-x
user:hive:rwx
group::---
group:hive:rwx
mask::rwx
other::--x
```

というわけで、Hive管理下のデータに関してSentryの権限ベースのものがHDFS-ACLに設定されているのがわかります。

一点気をつけてほしいのが、[HDFS ACLのエントリ数は32](http://www.slideshare.net/aircastle/hadoop-webui/18)までという制約があるため([HDFS-7447](https://issues.apache.org/jira/browse/HDFS-7447))、Sentryベースで管理するにしても権限を作りすぎるのは難しいので注意してください。

## ACLの読み込み権限がない外部テーブルに対するhiveクエリ

`customer_complaints` テーブルについてACL権限を外した場合、どう挙動するかを調べてみます。

まずは確認のため、今までの挙動を見ておきます。

```sh
$ kinit hive
$ beeline
..snip..
0: jdbc:hive2://ip-10-0-1-111.ap-northeast-1.> select * from customer_complaints limit 10;
INFO  : Compiling command(queryId=hive_20170123052323_aa3dffda-03fe-42f8-91c9-5779a5e9c58f): select * from customer_complaints limit 10
..snip..
Time taken: 0.004 seconds
INFO  : OK
+------------------------------------+------------------------------+----------------------------------------+-------------------------------------------+-------------------------------+---------------------------------------------------+----------------------------------------------+------------------------------+----------------------------+------------------------------+---------------------------+------------------------------------------------+------------------------------------+-------------------------------------------+---------------------------------------------------+--------------------------------------+----------------------------------------+-----------------------------------+--+
| customer_complaints.date_received  | customer_complaints.product  |     customer_complaints.subproduct     |         customer_complaints.issue         | customer_complaints.subissue  | customer_complaints.consumer_complaint_narrative  | customer_complaints.company_public_response  | customer_complaints.company  | customer_complaints.state  | customer_complaints.zipcode  | customer_complaints.tags  | customer_complaints.consumer_consent_provided  | customer_complaints.submitted_via  | customer_complaints.date_sent_to_company  | customer_complaints.company_response_to_consumer  | customer_complaints.timely_response  | customer_complaints.consumer_disputed  | customer_complaints.complaint_id  |
+------------------------------------+------------------------------+----------------------------------------+-------------------------------------------+-------------------------------+---------------------------------------------------+----------------------------------------------+------------------------------+----------------------------+------------------------------+---------------------------+------------------------------------------------+------------------------------------+-------------------------------------------+---------------------------------------------------+--------------------------------------+----------------------------------------+-----------------------------------+--+
| 07/29/2013                         | Consumer Loan                | Vehicle loan                           | Managing the loan or lease                |                               |                                                   |                                              | Wells Fargo & Company        | VA                         | 24540                        |                           | N/A                                            | Phone                              | 07/30/2013                                | Closed with explanation                           | Yes                                  | No                                     | 468882                            |
| 07/29/2013                         | Bank account or service      | Checking account                       | Using a debit or ATM card                 |                               |                                                   |                                              | Wells Fargo & Company        | CA                         | 95992                        | Older American            | N/A                                            | Web                                | 07/31/2013                                | Closed with explanation                           | Yes                                  | No                                     | 468889                            |
| 07/29/2013                         | Bank account or service      | Checking account                       | Account opening, closing, or management   |                               |                                                   |                                              | Santander Bank US            | NY                         | 10065                        |                           | N/A                                            | Fax                                | 07/31/2013                                | Closed                                            | Yes                                  | No                                     | 468879                            |
| 07/29/2013                         | Bank account or service      | Checking account                       | Deposits and withdrawals                  |                               |                                                   |                                              | Wells Fargo & Company        | GA                         | 30084                        |                           | N/A                                            | Web                                | 07/30/2013                                | Closed with explanation                           | Yes                                  | No                                     | 468949                            |
| 07/29/2013                         | Mortgage                     | Conventional fixed mortgage            | Loan servicing, payments, escrow account  |                               |                                                   |                                              | Franklin Credit Management   | CT                         | 06106                        |                           | N/A                                            | Web                                | 07/30/2013                                | Closed with explanation                           | Yes                                  | No                                     | 475823                            |
| 07/29/2013                         | Bank account or service      | Checking account                       | Deposits and withdrawals                  |                               |                                                   |                                              | Bank of America              | TX                         | 75025                        |                           | N/A                                            | Web                                | 07/30/2013                                | Closed with explanation                           | Yes                                  | No                                     | 468981                            |
| 07/29/2013                         | Debt collection              | Other (i.e. phone, health club, etc.)  | Cont'd attempts collect debt not owed     | Debt is not mine              |                                                   |                                              | NRA Group, LLC               | VA                         | 20147                        |                           | N/A                                            | Web                                | 08/07/2013                                | Closed with non-monetary relief                   | Yes                                  | No                                     | 467801                            |
| 07/29/2013                         | Debt collection              | I do not know                          | Cont'd attempts collect debt not owed     | Debt was paid                 |                                                   |                                              | SunTrust Banks, Inc.         | FL                         | 32818                        |                           | N/A                                            | Referral                           | 08/01/2013                                | Closed with explanation                           | Yes                                  | Yes                                    | 475728                            |
| 07/29/2013                         | Credit card                  |                                        | Billing statement                         |                               |                                                   |                                              | Citibank                     | OH                         | 45247                        |                           | N/A                                            | Referral                           | 07/30/2013                                | Closed with explanation                           | Yes                                  | Yes                                    | 469026                            |
| 07/29/2013                         | Mortgage                     | Other mortgage                         | Loan servicing, payments, escrow account  |                               |                                                   |                                              | Wells Fargo & Company        | NV                         | 89511                        |                           | N/A                                            | Referral                           | 07/30/2013                                | Closed with explanation                           | Yes                                  | Yes                                    | 469035                            |
+------------------------------------+------------------------------+----------------------------------------+-------------------------------------------+-------------------------------+---------------------------------------------------+----------------------------------------------+------------------------------+----------------------------+------------------------------+---------------------------+------------------------------------------------+------------------------------------+-------------------------------------------+---------------------------------------------------+--------------------------------------+----------------------------------------+-----------------------------------+--+
10 rows selected (0.261 seconds)
```

別コンソールでACLを設定変更します。

```sh
$ kinit centos
$ hdfs dfs -setfacl -m other::--- /user/centos/data/consumer_complaints
$ hdfs dfs -getfacl  /user/centos/data/consumer_complaints
# file: /user/centos/data/consumer_complaints
# owner: centos
# group: centos
user::rwx
group::---
group:centos:rwx
mask::rwx
other::---
```

beelineで同じクエリを発行すると、Permission deniedがでてアクセスできません。

```
0: jdbc:hive2://ip-10-0-1-111.ap-northeast-1.> select * from customer_complaints limit 10;
Error: Error while compiling statement: FAILED: SemanticException Unable to determine if hdfs://ip-10-0-1-111.ap-northeast-1.compute.internal:8020/user/centos/data/consumer_complaints is encrypted: org.apache.hadoop.security.AccessControlException: Permission denied: user=hive, access=READ, inode="/user/centos/data/consumer_complaints":centos:centos:drwxrwx---
	at org.apache.hadoop.hdfs.server.namenode.DefaultAuthorizationProvider.checkAccessAcl(DefaultAuthorizationProvider.java:365)
	at org.apache.hadoop.hdfs.server.namenode.DefaultAuthorizationProvider.check(DefaultAuthorizationProvider.java:258)
	at org.apache.hadoop.hdfs.server.namenode.DefaultAuthorizationProvider.checkPermission(DefaultAuthorizationProvider.java:175)
	at org.apache.sentry.hdfs.SentryAuthorizationProvider.checkPermission(SentryAuthorizationProvider.java:178)
	at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:152)
	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkPermission(FSNamesystem.java:6632)
	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkPermission(FSNamesystem.java:6614)
	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkPathAccess(FSNamesystem.java:6539)
	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getEZForPath(FSNamesystem.java:9221)
	at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.getEZForPath(NameNodeRpcServer.java:1632)
	at org.apache.hadoop.hdfs.server.namenode.AuthorizationProviderProxyClientProtocol.getEZForPath(AuthorizationProviderProxyClientProtocol.java:928)
	at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.getEZForPath(ClientNamenodeProtocolServerSideTranslatorPB.java:1350)
	at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
	at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:617)
	at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:1073)
	at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2086)
	at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2082)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:415)
	at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1698)
	at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2080) (state=42000,code=40000)
```

なお、`show tables`をした場合には、ACLのみの設定ではtableは見えてしまいます。

```
0: jdbc:hive2://ip-10-0-1-111.ap-northeast-1.> show tables;
...snip...
INFO  : OK
+----------------------+--+
|       tab_name       |
+----------------------+--+
| customer_complaints  |
| customers            |
| sample_07            |
| sample_08            |
| web_logs             |
+----------------------+--+
5 rows selected (0.264 seconds)
```