Lake Formation の使い方的な②(データカタログへの権限制御)

# データカタログへの権限制御する

Lake Formationは、データカタログにきめ細かな権限制御ができます。
ユーザーごとに、データカタログのDatabaseへのテーブル追加を禁止したり、あるカラムを非表示にしたり、実行できるSQLを制限したりできます。やってみます。

#### S3パス
s3://test-lf01/in00

#### Database名
lf01

#### テーブル名
test1

#### テスト用IAMユーザー

test_user1

# CSVファイルをS3にアップ

ファイル名:person.csv
s3://test-lf01/in00 に以下のCSVファイルをアップ

```csv:
taro, 20190101, 101, 00001
jiro, 20190202, 102, 00001
ojiro, 20190303, 101, 00002
hanako, 20190404, 103, 00004
```

<img width="1125" alt="スクリーンショット 0001-08-09 10.06.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/efdf275d-31e7-fe7a-3e72-e309b45b64a8.png">

スキーマは以下を想定
name(string)
date(string)
storeid(string)
accountnumber(string)

# データカタログ作成

### Database作成

Lake Formationの画面で左側メニューから"Database"をクリックし、右上の[Create database]をクリック

<img width="1222" alt="スクリーンショット 0001-08-09 10.07.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/4a99c528-7c80-8453-b6e8-623ee7fe59e7.png">

Nameに"lf01"と入れて、"Grant All to Everyone for new tables in this database"のチェックを外し、右下の[Create database]をクリック
※"Everyone"はLake Formationのユーザーグループの要素です。パブリックなユーザーという意味ではなく、Lake FormationのIAMアクセス許可を持つ全員という意味です。

"Grant All to Everyone for new tables in this database"はこのデータベースで作成される新しいテーブルに"Everyone"に対して全権限を与えるという設定。デフォルトはチェックが入っている。

<img width="748" alt="スクリーンショット 0001-08-10 8.27.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/a8dcac1b-c54b-e687-566c-0ae927c252d9.png">

Databaseできた

<img width="1249" alt="スクリーンショット 0001-08-09 10.10.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/1b4d34f2-eb07-ed82-e9a0-9f6c98344fde.png">

### テーブル作成

Lake Formationの画面で左側メニューから"Tables"をクリックし、右上の[Create table]をクリック(今回は手動でテーブル作成)

<img width="1215" alt="スクリーンショット 0001-08-09 10.11.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/37b462e5-1c0b-4b5a-6898-7486e2ba478b.png">

以下を入力(あとに続く)

Name: "test1"
Database: "lf01"

<img width="747" alt="スクリーンショット 0001-08-09 10.13.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/4beb5ee7-e06f-a579-c08f-5d003282416c.png">

Include path に s3://lf01/in00/
※別リージョンのバケットは選択できないっぽい
CSVにチェック

<img width="721" alt="スクリーンショット 0001-08-09 10.14.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/e5b00a58-fa35-6b56-321e-02fb72c6cc6a.png">

右上の[Add column]をクリック

<img width="749" alt="スクリーンショット 0001-08-09 10.16.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/7356968f-4a65-a565-4d47-e2548b11ef03.png">

カラムを追加していく。追加するカラムは↓
name(string)
date(string)
storeid(string)
accountnumber(string)

<img width="541" alt="スクリーンショット 0001-08-09 10.16.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/26c502c7-57c9-c42b-eb89-ff98f88f896b.png">

追加し終わったら右下の[Submit]をクリック

<img width="747" alt="スクリーンショット 0001-08-09 10.17.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/9db56e58-c486-feb2-3367-67bfc9cdfbf6.png">

テーブル出来た。

<img width="1233" alt="スクリーンショット 0001-08-09 10.18.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/9ebf0333-01f9-ae70-f946-e89cedfdffb3.png">

### 権限確認

Databaseに対しては、管理者はフル権限、"Everyone"もフル権限(デフォルトではDatabase作成時に"Everyone"へのフル権限が付与される設定になってる)

<img width="978" alt="スクリーンショット 0001-08-10 8.40.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/4fe34e01-8d1c-f81b-e3e1-b12bf6de88c6.png">

テーブルに対しては、管理者はフル権限、"Everyone"はいない(前述のように、今回Database作成時の設定で新規作成テーブルに"Everyone"へのフル権限を付与しない設定にした)。なので管理者以外は操作できない。

<img width="988" alt="スクリーンショット 0001-08-10 8.41.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/60b26092-80ab-faec-5f29-df7945335b34.png">

## Athenaで確認

まずは管理者で、Lake Formationで作ったデータカタログを使い、Athenaで閲覧出来ていることが確認できる。

<img width="1088" alt="スクリーンショット 0001-08-09 10.23.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/58646435-570d-dc96-edaf-42ced95c6744.png">

# Lake Formationによる権限管理

Lake Formationの売りの１つであるカラムレベルでの権限制御を確認する

今回は、あるユーザーに対してはstoreid, accountnumberのカラムは表示させたくない。テーブルのdropもさせたくない。という制御を入れます。

### IAMユーザー作成

手順は割愛しますが、こんな感じでAdministratorのポリシーを持つtest_user1を作りました。

正真正銘administratorです

![スクリーンショット 0001-08-09 10.28.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/57ca8aaa-d946-201f-9de2-55e40e76205e.png)

test_user1でAthenaにアクセスするとDatabaseのlf01は見えますが、まだテーブルへの権限がなにもないためテーブルは表示されません。もちろんクエリもはじかれます。
Lake Formationが登場する以前だったら見えてましたね。本機能はLake Formationのリソースベースポリシーと考えればいいと思います。

<img width="985" alt="スクリーンショット 0001-08-10 8.36.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/a8a292e9-7224-9874-476f-7f1dcb9e5cac.png">

### Lake FormationのData Permissionsで設定。当初やりたかった特定カラムだけ非表示

test_user1ユーザーに対してはstoreid, accountnumberのカラムは表示させたくない。テーブルのdropもさせたくない。という制御を入れます。

LakeFormationの画面で左側メニューの"Data Permissions"をクリックし、右上の[Grant]をクリック

<img width="1096" alt="スクリーンショット 0001-08-09 10.56.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/66879668-1895-7d9f-e1eb-644894cb48ff.png">

以下を入力していきます(あとに続く)
IAM user add roles : test_user1
Database: lf01
Table: test1

<img width="453" alt="スクリーンショット 0001-08-09 10.58.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/90356778-4978-f6c4-fec6-446bfe4d9823.png">

以下を入れ右下の[Grant]をクリック

Columnに"Include columns"を選択
Include columnsに"name"、"date"を選択
Table permissionsに"select"にチェック

<img width="446" alt="スクリーンショット 0001-08-09 12.43.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/828fbbc6-ac73-9991-340a-24fbd92352f1.png">

結果はこんな感じ

<img width="898" alt="スクリーンショット 0001-08-09 12.45.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/de8d4645-1487-f809-31ef-fb1f0327ba28.png">

### Athenaで確認

test_user1の人には、nameとdateの列だけが見える状態になっている。

<img width="991" alt="スクリーンショット 0001-08-10 8.48.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/40fb015d-9c4a-3d0f-7219-cdd390aec6b3.png">

ちゃんとDDLも拒否している
以下のようにパーミッションエラーな感じのメッセージが確認できる
MetaException(message:Insufficient Lake Formation permission(s):...

<img width="1158" alt="スクリーンショット 0001-08-10 8.50.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/b01da879-1467-e6b2-5087-5be1e9d2c084.png">

Lake FormationのRecent Access Activity のログはこんな感じ
※CloudTrailのログなので、だいたい10分くらい遅れて出力される。あとこの画面ではフィルタが相当弱い・・

右上のView eventをクリックで詳細確認可能

<img width="954" alt="スクリーンショット 0001-08-10 9.39.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/4bf0af9f-c7c7-8134-3fb9-52fbfdae117f.png">

### (補足)_DataCatalogのデフォルトセッティング

新しく作成されたデータベースとテーブルのデフォルトのパーミッションとして以下の２つを有効無効にできます(デフォルトは有効)

* 新しく作成されたデータベースに"Everyone"へのAll許可を与える
* 新しく作成されたテーブルに"Everyone"へのALL許可を与える

特に必要がなければチェックを外して右下の[Save]をクリックします。これにより新規で作成されたデータベースやテーブルに自動で"Everyone"への許可(IAMの権限があれば操作できる状態)されることはなくなり、Lake Formation上で明示的なきめ細かい許可を与える運用を行う事ができます。

"Everyone"はGlueDataCatalogからの移行のために存在するEntityで、この辺はまた今度記事にできればと

<img width="1037" alt="スクリーンショット 0001-08-10 16.35.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/5de331bf-9f0f-2fb3-bf41-c07f9da41037.png">

## こちらも是非

LakeFormationの使い方まとめ
https://qiita.com/pioho07/items/76554a7ac4252858b450

Glueの使い方まとめ
https://qiita.com/pioho07/items/32f76a16cbf49f9f712f