Amazon QuickSight の RLS ルールの組み合わせを試してみた

2022.11.03

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

先日 QuickSight の RLS を有効化したデータセットに関するアップデートを紹介しました。

QuickSight の RLS については以前に次のエントリが作成されておりますが、最近はデータセット管理画面が新しくなっていたりで RLS 設定時に少し戸惑いました。

また、QuickSight RLS のドキュメントは以下に記載がありますが「こういうルールのときはどういう挙動になるのだろう」というのを実際に検証したいものがいくつかありました。

そこで本日は、最新の QuickSight データセット管理画面を確認しつつ、いくつかの RLS ルールの組み合わせ結果をご紹介します。

ユーザーとデータを準備

まずは検証用のデータセットを用意します。

HogeGroupName,HogeUserName,HogeString,HogeNum
HogeTenant1,HogeUser1,aaa,111
HogeTenant1,HogeUser2,bbb,222
HogeTenant2,HogeUser3,ccc,333
HogeTenant2,HogeUser4,ddd,444

また、ユーザーとグループを使って RLS の挙動を確認する形となるので、いくつか用意しておきます。

行レベルのセキュリティ (RLS) を設定

最新のユーザーインターフェースだと、RLS はデータセットごとに以下から設定を行います。
旧ユーザーインターフェースとかなり違っていますね。

概念としては以前と同じで、RLS で制御したいデータセットに対して RLS ルールを設定した別のデータセットを割り当てる形です。

ただし、以前は許可ルールと拒否ルールの 2 つが指定出来たようですが、現在のユーザーインターフェースでは許可ルールのみが設定出来るようです。

どういうルールを設定するとどういう挙動になるのか、組み合わせとか確認しておきたいところですね。
では、ここからいくつかの設定パターンを試してみたいと思います!

シンプルにユーザー名ごとにフィルターを指定

まず、RLS ルールに必ず必要なものとして、UserName / GroupName / UserARN / GroupARN は必ず必要です。
フィールド名の変更なども出来ません。

それに加えて、対象のユーザーあるいはグループに該当した場合に、どのフィールドのどの値を許可するかを指定します。

UserName,HogeUserName
HogeUser1,HogeUser1
HogeUser2,HogeUser2
HogeUser3,HogeUser3

例えば、上記の許可ルールの場合は HogeUser1 は対象データセットの HogeUserName フィールドが HogeUser1 の行のみを表示することが出来るようになります。

許可ルールに存在していないユーザーはデータを表示出来ません。

複数条件に該当する列も表示可能

フィルター対象のフィールドはユニーク値でなくても設定出来ます。

UserName,HogeGroupName
HogeUser1,HogeTenant1
HogeUser2,HogeTenant1
HogeUser3,HogeTenant2

例えば、上記ではユーザーごとにグループ名をフィルター対象に設定しているので該当グループの行の参照が許可されるということになります。

グループで絞りこむ

先程は RLS ルール内でユーザーごとの表示対象グループを指定しました。
グループでフィルターしたい場合はもっと管理しやすい方法があります。

先程少し触れましたが、ユーザーではなくてグループを条件に RLS を機能させることも出来ます。
ここで言っているグループというのは QuickSight のグループ機能を指しています。

先程のユーザーを QuickSight のグループに所属させます。

RLS ルールでは以下のように GroupName を指定します。

GroupName,HogeGroupName
Tenant1,HogeTenant1
Tenant2,HogeTenant2

そして各グループに所属しているユーザーは対象グループのフィルター条件に該当した行を表示することが出来るようになります。

許可されたグループに所属していないユーザーはデータを表示することは出来ません。

複数のフィールドを指定

フィルター対象のフィールドは複数の指定が可能です。
先程はログインユーザーが所属する QuickSight グループごとに HogeGroupName で絞り込みをしていました。
ここに絞り込み対象のフィールドを追加します。

GroupName,HogeGroupName,HogeString
Tenant1,HogeTenant1,aaa
Tenant2,HogeTenant2,ddd

上記の場合は Tenat1 に所属しているユーザーは HogeGroupName が HogeTenat1 かつ HogeString が aaa の行のみを表示出来るようになります。

空文字を設定することで広く許可出来る

ルールは制限のみではありません。
フィルター対象のフィールドに空文字を設定した場合は対象フィールドに対して「すべてを許容する」という動きになります。

GroupName,HogeGroupName
Tenant1,HogeTenant1
Tenant2,

例えば上記のルールでは Tenant1 は HogeTnant1 の行のみを表示することが出来ますが、Tenant2 は全ての行を表示することが可能です。

確認してみましょう。
以下は Tenat1 のユーザーが表示したときの状態です。

以下は Tenat2 のユーザーが表示したときの状態です。

ルールに存在していないテナントは変わらず表示が出来ませんが、ルールに存在いる場合は空文字をうまく活用することで広い範囲の参照条件を設定することが出来ます。

対象フィールドで複数値を対象とする

ユーザーあるいはグループに対して対象フィールドが特定の値のみ許容させる挙動ですが、複数の値を設定することで「 OR 」の動きを行うことも出来ます。

GroupName,HogeGroupName,HogeString
Tenant1,HogeTenant1,
Tenant2,,"aaa,ccc"

上記は先程の空文字を使ったルールに追加対象フィールド HogeString を設定しています。
追加フィールドについては「 AND 」となっていましたね。

そのため上記の場合だと、Tenant1 は HogeGroupName が HogeTant1 かつ HogeString は何でも良い。という条件になります。

そして Tenant2 では HogeString にカンマ区切りで複数値設定しています。これが複数値を対象とする設定です。

この設定を行うと HogeString が aaa もしくは ccc という動きになります。

さいごに

本日は Amazon QuickSight の RLS ルールの組み合わせを試してみました。

基本パターンはひととおり確認出来たかなと思っています。
うまくルールの SPICE 更新と組み合わせることで動的 RLS ルール運用が出来そうです。

ちなみに、本日時点でフィルター対象のフィールドは文字列までで、日付や数値には指定できないのでご注意ください。