以下の投稿の続きです。
マルチテナント型のアプリケーションの場合に、一つのテーブルに登録されているデータを、企業や組織ごとにアクセス制御したいことってありますよね。
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. ルールを有効化
動作確認
想定通りの動作ですね。