以下の投稿の続きです。
マルチテナント型のアプリケーションの場合に、一つのテーブルに登録されているデータを、企業や組織ごとにアクセス制御したいことってありますよね。
QuickSightでこのようなアクセス制御を行う方法として、行レベルのセキュリティ機能があります。参考ドキュメント
QuickSightには匿名埋め込み機能というものがあり、QuickSightにユーザー登録をしなくても、ダッシュボードを表示するための一時URLを発行することができます。
匿名埋め込み機能と行レベルのセキュリティ機能を組み合わせることで、自前アプリケーションにQuickSightのダッシュボードを適切な権限制御を行いながら埋め込むことが可能になります。
前回の投稿(QuickSightでVPC内のAuroraに接続する環境をCDKで構築する手順)で作成したQuickSightとAuroraの構成を使って、行レベルのセキュリティを試してみました。
データセットに行レベルアクセス制御を追加する
1. データセット一覧画面を表示
2. データセットを選択し、行レベルのセキュリティの設定をクリック
3. タグベースのルールを設定
ユーザーベースのルールと、タグベースのルールがありますので、タグベースのルールを選択します。

列は実際のテーブルの列名でタグはAPIで呼び出す際のタグ名です。
すべて一致は、タグの値がこの値の場合にselect *相当の動作となります。(タグの値を*や''にしてもこの動作にはなりません。)

5. ルールを有効化
埋め込みURLを発行する
AWS CLIで匿名アクセス用のURLを発行します。
group1のデータだけが閲覧できるよう--session-tagsを設定しています。
aws quicksight generate-embed-url-for-anonymous-user \
--aws-account-id 754291963749 \
--namespace default \
--authorized-resource-arns arn:aws:quicksight:ap-northeast-1:754291963749:dashboard/bb9902f8-d8eb-4182-a6cb-11a35af05956 \
--experience-configuration '{"Dashboard":{"InitialDashboardId":"bb9902f8-d8eb-4182-a6cb-11a35af05956"}}' \
--session-tags '{"Key":"group_tag", "Value": "group1"}'
レスポンス
{
"Status": 200,
"EmbedUrl": "https://ap-northeast-1.quicksight.aws.amazon.com/embed/a080a360de4f476e8c2be48dd35d0a3f/dashboards/bb9902f8-d8eb-4182-a6cb-11a35af05956?code=AYABeDAfj8Fb0N5iC6JKhyBSZ3gAAAABAAdhd3Mta21zAFBhcm46YXdzOmttczphcC1ub3J0aGVhc3QtMTozNjcwOTQ1NjE4OTQ6a2V5LzkyZDU3MjEzLTc0MjItNGNhOC1iYWZiLTg2MDFjNGZkODgyNwC4AQIBAHgeDGL3XAnX5chwrubXLtqmn-xwPT7Th-AyeZ72nfHdvwGr5O_l6Ygj8thbDymMa0DJAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMmdMA3nNlMVJpvO-eAgEQgDvEtqszA2zLpFveyPxRdBBL_HYma-HJsC0zliKS_JyKIgvS8vSpRGAR6jMm61j-gMxDuFpQPDa3XFC2iQIAAAAADAAAEAAAAAAAAAAAAAAAAABhccQB36YnmgqNelMh0sh2_____wAAAAEAAAAAAAAAAAAAAAEAAACbRj35gF6A5SiKA_Qu3Guj1h6ncVUI5mzBN6YGrUqO3a6EjlnTmi2cIGEogmcv-fgMFIyX6Jq-oHUytRIU03eA9BYo5apu75RyiX2MuyoZJ9DPilgXn_9NBCxkPDgHamKSWtag6w3zxgqSGcH7ZKt_FIHozSBuK3Fm15DSzLQIEWn7Oonm1gC7MyGUgWzsyaIUIObAioZiNP0jMLoiS0n5bFbS2iE8nZrpHBmK&identityprovider=quicksight&isauthcode=true",
"RequestId": "0702dbdb-0145-443e-8891-3a157218f379",
"AnonymousUserArn": "arn:aws:quicksight:ap-northeast-1:754291963749:anonymousUser/default/a2450b6ddc564e1ea1303177c6c72d8a"
}
発行されたURLにブラウザでアクセスします。想定通り、group1の値だけが表示されます。

--session-tags '{"Key":"group_tag", "Value": "All"}'の場合は、すべてのデータにアクセスができます。

- 試しにValueを
*にしてみましたが、この場合はどの行にもアクセスできていません。(アクセスできていないのかデータが無いのかは、判別が付きません)
QuickSight作成者がデータセットにアクセスできるように設定
ここまでの手順でタグベースのルールを有効化すると、QuickSightに管理者や作成者として登録しているユーザーもアクセス制御の対象となり、ダッシュボードを表示してもこの様になってしまいます。
これではダッシュボードを作成できないので困ってしまいますが、ユーザーベースのルールを組み合わせることで、ダッシュボード作成者に表示させるデータの権限制御が可能です。参考ドキュメント
1. アクセス許可データセットを作成
誰がアクセスしていいかの情報はデータセットとして用意します。(CSV形式やデータベースを使うかは問いません)今回は、Aurora内のテーブルとして用意しました。
列名はUserName、GroupNameと、制御したいカラム名です。
CREATE TABLE user_master (
UserName VARCHAR,
GroupName VARCHAR,
group_name VARCHAR
);
データとしては以下を登録します。
| username | groupname | group_name |
|---|---|---|
| NULL | Admin | NULL |
| NULL | Group2 | group2 |
| Group1 | NULL | group1 |
ユーザーベースのルールは、タグベースのルールと異なり、ユーザーまたはグループにルールを追加し、他のすべての列を値なし (NULL) のままにすると、すべてのデータへのアクセスが付与されます。という仕様があるため、Adminグループに所属するユーザーはすべてのデータにアクセスが可能となります。
2. QuickSightのグループを作成
ユーザーごとに制御もできますが、一般的にはグループを使用することになると思います。
3. user_masterテーブルを、データセットとして登録
通常の手順でデータセットを登録します。
4. 行レベルのセキュリティの設定を追加
対象のデータセットの行レベルのセキュリティの設定をクリックします。
ユーザーベースのルールをの中から、user_masterデータセットを選択します。
5. ルールを有効化
動作確認
想定通りの動作ですね。














