QuickSight でユーザーによって表示するデータを動的に制限する行レベルセキュリティ(RLS)

# はじめに

QuickSight を利用しているときに、ログインするユーザーによって表示するデータに制限を掛けたいときがあります。たとえば営業売上金額のように、各営業部署の評価に直接的につながるものを、他の部署に共有をしたくないシチュエーションがあります。(といつつ、データを全社共有して、データの民主化を進めた方が良い面もあったります。)

この時に表示を制限できる機能が、QuickSight の行レベルセキュリティです。QuickSight にログインするユーザーによって、表示するデータをコントロールできます。

この記事は、行レベルセキュリティの設定方法を紹介します。



# 概要図

まず、行レベルセキュリティの設定概要図を紹介します。

![image-20230325173006683.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/05f772e0-58ba-99d5-837a-765d09deb94e.png)

行レベルセキュリティを利用するとき、「誰」が「どのデータ」を表示できるか定義する必要があります。csv で定義しても良いですし、Athena や RDS など、QuickSight が連携できるデータストアで定義しても良いです。

概要図を簡単に説明します。

`busyo1-qa` というグループに参加しているユーザーは、`bysyo1` のデータが閲覧できます。対して、これ以外の`busyo2`  `busyo3` のデータが表示できません。「行レベルセキュリティの制御ルールデータセット」に定義されているように、`busyoid` が `busyo1` のデータのみ表示できるようになります。

各部署ごとに QuickSight のグループを用意することで、適切に表示データの管理が可能です。

それでは具体的な設定方法を見ていきましょう。





# 行レベルセキュリティのルール定義を CSV で作成

行レベルセキュリティで、「誰」に「どのデータ」を見れるか定義する csv ファイルを作成します。この記事では、次の csv ファイルを作成します。

```
GroupName,busyoid
busyo1-qs,busyo1
busyo2-qs,busyo2
manager-qs,"busyo1,busyo2"
keieisou-qs,""
```



作成した csv ファイルを QuickSight にアップロードしていきます。行レベルセキュリティの定義は、QucikSight のデータセットで定義が必要です。New dataset を押します。

![image-20230325162439772.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/cd9fe2fb-745c-5b10-e749-a9e222773a30.png)





Upload a file を押します。

![image-20230325162653750.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/25c7ddd5-9b7a-0c78-c520-1d11d0d14c20.png)



ローカルにある csv を選択して、Next を押します。

![image-20230325162812326.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/fc669ebe-ee37-c210-e9fc-bc382de20171.png)



登録できたので、Edit/Preview data を押します。

![image-20230325162831847.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/0c7847df-9912-0eb1-146e-e0d72d8772f6.png)



データセットの中身が正しいことを確認しました。このまま CANCEL を押して画面を戻します。

![image-20230325162944968.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/c9963f81-df61-963b-9fdf-b3d9af54034e.png)



# 売上管理テーブルを Athena で作成

行レベルセキュリティを使うために、売上管理テーブルを作成していきます。テーブル定義は Athena を使っていきます。

まず、S3 にアップロードする csv ファイルを作成します。3 つの部署が含まれているデータになっています。

```
eigyoid,syouhinid,kosuu,busyoid
eigyo1,syouhin1,1,busyo1
eigyo2,syouhin2,2,busyo1
eigyo3,syouhin1,3,busyo2
eigyo4,syouhin2,4,busyo2
eigyo5,syouhin1,5,busyo3
eigyo6,syouhin2,6,busyo3
```



適当な S3 Bucket にアップロードします。

![image-20230325164643875.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/56103577-d6f7-ccad-3644-8adbf4ef17bc.png)



Athena でテーブルの定義をします。アップロードした csv ファイルを参照しています。

```
CREATE EXTERNAL TABLE IF NOT EXISTS quicksight_rls.sales_revenue (
  eigyoid string,
  syouhinid string,
  kosuu int,
  busyoid string
)
ROW FORMAT SerDe 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' 
WITH SerDeProperties ("field.delim" = ",", "escapeChar"="\\",  "quoteChar"="\"")
STORED AS TEXTFILE
LOCATION 's3://quicksight-rls-test-sugi01/' 
TBLPROPERTIES ('has_encrypted_data'='false',  'skip.header.line.count'='1', 'serialization.encoding'='SJIS')
```

![image-20230325165154813.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/4aad258a-ec30-ae3f-d416-c34ce5a1e043.png)



以下のクエリーで中身を確認します。正しく認識されています。

```
SELECT * FROM "quicksight_rls"."sales_revenue" limit 10;
```

![image-20230325165239518.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/7e5f304b-d932-4f0c-cd45-3bb2cfbd68a8.png)



# 売上管理テーブルに行レベルセキュリティを有効化

Athena で売上管理テーブルを作成できたので、QuickSight 上でデータセットを定義し、行レベルセキュリティを有効化します。

New dataset を押します。

![image-20230325165713377.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/2aef1dd8-d74a-2a1c-247c-754da29e0a75.png)



Athena を選びます。

![image-20230325165731755.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/6f9b75ad-ba95-bda2-e62b-6543307bd008.png)



Create data source を押します。

![image-20230325165802700.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/aeb971d1-cb44-f725-a9a6-79627def654a.png)



Athena で定義した Table を選択して、Edit/Preview data を押します。

![image-20230325165840155.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/0e880e2b-70bd-00c2-ca88-b63d948f5c9b.png)



正常にデータが見えたので、SAVE & PUBLISH を押して CANCEL を押します。

![image-20230325165916186.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/fa541dd6-c5c1-9ee7-250e-2c91279de0a8.png)



データセットの画面から、登録した sales_revenue を選択します。

![image-20230325170145878.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/99abe82c-6f93-ef67-3b11-5102cc0a81b2.png)



Row-level security の Set up を選びます。

![image-20230325170209749.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/616ecb65-85f7-5908-a2d6-0b1f272a07fb.png)



行レベルセキュリティのルールを定義したデータセットを選択します。

![image-20230325170300697.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/0cfa057f-3576-a752-83db-01823ac3006d.png)



Apply dataset を押します。

![image-20230325170536686.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/8e12cec8-a6dd-597b-4c25-adde7f56a431.png)



Apply and activate を押します。

![image-20230325170624474.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/1b8894a6-950c-bc72-d37b-abf681336480.png)



行レベルセキュリティを有効化したことによって、データセットに鍵アイコンが付きました。

![image-20230325170721784.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/2cbba7d1-ad8a-0180-d854-d59000214e87.png)



# QuickSight のグループとユーザーを作成

QuickSight 上でユーザーとグループを作成します。

- IT 管理者が利用する QuickSight のユーザーも行レベルセキュリティの影響を受けます。この手順では、IT 管理者は全部のデータを見ながらダッシュボードを作っていきたいため、IT 管理者 は全部のデータが見える keieisou-qs グループに参加させます。 

![image-20230325180114000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/2fc54f99-3853-b9cd-b46a-13e61d11a104.png)



次の概要図と見比べながら、グループと行レベルセキュリティとの関係性を整理しておくと理解が深まります。

- busyo1-qs : `busyo1` のデータだけ見える
- busyo2-qs : `busyo2` のデータだけ見える
- manager-qs : `busyo1,busyo2` のデータが見える
- keieisou-qs : 空白となっており、全部のデータが見える

![image-20230325173006683.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/5e31fbe8-d5ff-31f2-a5d5-8be02f5ac131.png)



QuickSight の管理画面で、invite users を選びます。

![image-20230325173354614.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/6935b7ab-15d5-5c44-fce3-e510f0491374.png)



4 つの User を定義して、READER として invite します。

![image-20230325173256884.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/b57465f2-bdd3-f892-58d8-aa730a93d29a.png)



指定したメールアドレスにメールが届くにて、accept ボタンを押して承認します。

![image-20230325173456392.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/9ba81ea4-0707-a9cf-184c-e5b2a61ec283.png)



QuickSight の管理画面で、グループを作成します。

![image-20230325173858504.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/a4bed9d9-a006-acc0-564c-efb6ed3ba704.png)



グループ名を指定します。行レベルセキュリティの csv に書かれている `GroupName` のデータを一致させます。

![image-20230325173941704.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/d33b9d87-62c7-3f61-6dfa-f170e26cbbf0.png)



作成したグループに、ユーザーを追加します。

![image-20230325174031869.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/01d3a77e-4b99-3892-c0ba-cbd403bcb2d5.png)



くり返して、4 グループ作成します。(画像に関係ないグループが表示されていますが、別の検証で作った物なので無視してください。)

![image-20230325174306627.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/958263c4-c92b-36ba-9f59-f428dd020878.png)



# ダッシュボードを作成

行レベルセキュリティを有効化したデータセットを使って、ダッシュボードを作っていきます。Create analysis を押します。

![image-20230325171932207.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/3bf000cd-40ff-98a6-2c5f-5bddbeb24b80.png)



Analysis の可視化では、簡単にデータを確認できるように、テーブルで全データを表示するようにします。その後、Publish dashboard を押して、ダッシュボードとして公開します。

![image-20230325180722308.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/625f69dd-5f86-954c-dd5c-15aa4a0441df.png)



Publish dashboard を押します。

![image-20230325180853977.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/d2a4dd58-7b23-bb8d-8b18-fcccd26ae0dc.png)



ダッシュボードが作成されました。

![image-20230325180955783.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/cb766dd4-2596-96de-5155-7599098447de.png)



# ダッシュボードをユーザーに共有

作成したダッシュボードを、他のユーザーに共有します。

![image-20230325181033699.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/33016865-6fc1-0315-df80-a16b4435fca8.png)



4 つの QuickSight グループを選択して View として共有します。

![image-20230325181201360.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/a7f5af05-e6a4-72a9-dd56-43fd6f0672f3.png)



# 動作確認

ここまでで行レベルセキュリティの設定ができました。実際に 4 ユーザーでログインしてダッシュボードを見てみましょう。

eigyo1 ユーザー

- 想定通り `busyo1` に制限されている

![image-20230325181347455.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/f4982d3b-e81c-dbf5-9f25-ac104277d56b.png)



eigyo3 ユーザー

- 想定通り `busyo2` に制限されている

![image-20230325181552581.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/27865f70-048a-0245-a7f8-5466ab574a3d.png)



manager1 ユーザー

- 想定通り `busyo1` と `busyo2` に制限されている

![image-20230325181651841.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/c9c087ef-660b-f0cc-412a-e31af6606996.png)



keieisou1

- 想定通り全データが見えている

![image-20230325181738500.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/707afa11-c0ef-1e65-f234-31fba8f1286b.png)



# 検証をつうじてわかったこと

- QuickSight にログインしてダッシュボードを閲覧するときに、ユーザーごとに表示するデータを制御したいときは行レベルセキュリティが便利に利用できる。
- 閲覧専用の Reader ユーザーがダッシュボードを閲覧するときに、行レベルセキュリティが利用できる。
- 一方、Author 権限を付与している QuickSight ユーザーに、行レベルセキュリティを有効化したデータセットを「Owner」権限を付与すると、全部のデータが見える。基本的に行レベルセキュリティは閲覧専用の Reader ユーザーに利用すると考えると良さそう。



# 付録1 : Row Level Security の定義ファイルを更新

アップロードしたあとに、行レベルセキュリティのルール定義ファイルの更新方法を紹介します。(間違って定義しちゃったのを修正します)

まず、既にアップロードしているファイルを Remove します。

![image-20230325175243868.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/55ff27a6-ad26-2a92-478e-9ad09d166c86.png)



Remove table を押します。

![image-20230325175251642.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/61bfafc9-3da8-e584-25b4-075f7b9a9694.png)



何もデータがなくなったので、Add data で修正後の csv ファイルをアップロードします。

![image-20230325175323813.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/5ecc3094-931d-319b-6410-bc3c0b7a215e.png)



upload a file を押します。

![image-20230325175336297.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/d5aa21e1-0ed8-826a-5264-af424290dd2c.png)



Next を押します。

![image-20230325175427480.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/ddfca778-2c9c-0b42-4d3b-4c83283d33ff.png)



データが更新できたので、SAVE & PUBLISH を押します。

![image-20230325175447696.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/ceb081ea-1985-5008-349c-40ed125ee3f9.png)



# 参考 URL

https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/restrict-access-to-a-data-set-using-row-level-security.html