QuickSight でリーダーセッションキャパシティで使えるタグベースの RLS を使ってみた

2022.07.03

いわさです。

QuickSight の Enterprise Edition では RLS(行レベルセキュリティ) 機能があります。
QuickSight の RLS にはユーザー毎設定と、匿名ユーザー向けのタグベース設定の2つが利用出来ます。

匿名ユーザー向けのタグベース設定については以前に機能だけ紹介したのですが、リーダーセッションキャパシティが前提として必要になるため試せませんでした。
しかし、先日リーダーセッションキャパシティを有効化してみたので、ついでにタグベースのRLSを試すことが出来ましたので、どんな感じになるのかをご紹介します。

データセットごとにRLSを有効化する

まずは以下のようなCSVファイルをアップロードしデータセットを作成します。
表示対象のcityを制御したいと思います。

city,item,price
city1,1,100
city1,2,200
city1,3,300
city2,1,400
city2,2,500
city2,3,600
city3,1,700
city3,2,800
city3,3,900

そして、データセット毎に行レベルのセキュリティを設定していきます。
データセットの項目には「列レベルのセキュリティ」機能もありますが、こちらはタグベースでの制御には本日時点では対応していません。

行レベルのセキュリティ設定では、前述のとおりユーザーベースのルールとタグベースのルールがあります。
今回はタグベースのルールを使って、リーダーセッションキャパシティを利用した際のRLS機能を有効にします。

タグベースのルールとしては、hogecityタグを指定したときに、そのタグ値に一致するcityを許可するように設定します。

RLSを有効化すると、データセットを使っている分析やダッシュボードに即時反映されます。
そのため、匿名パブリックアクセス以外で閲覧する場合のためにユーザーベースのRLSも併用すると良いようです。
以下のように作成者も明示的に権限が割り当てられていないと閲覧出来なくなることを知りました。

埋め込む

ではここからダッシュボードの埋め込みを行います。
ポイントとしては、リーダーセッションキャパシティを有効化している場合、APIから一時的なリーダーセッションを払い出します。

前回の記事ではリーダーセッションキャパシティ有効化後に1クリック埋め込みURLを使いましたがこちらは利用出来ません。

例えば、AWS CLIの場合だとgenerate-embed-url-for-anonymous-userを使うことで、埋め込み用のURLを取得することが出来ます。
その際に、「セッションタグ」を指定することで、払い出したセッションに対してタグを指定することが出来ます。

セッションタグでhogecity:city1を指定しています。
払い出し時の共通項目として、authorized-resource-arnsにはアクセスを許可するダッシュボードをARNのリストで指定します。
また、experience-configurationは最初に表示するダッシュボードのIDを指定します。

$ aws quicksight generate-embed-url-for-anonymous-user \
--aws-account-id 123456789012 \
--namespace default \
--session-lifetime-in-minutes 15 \
--authorized-resource-arns '["arn:aws:quicksight:ap-northeast-1:123456789012:dashboard/bae41127-701b-45c0-a33f-6ff5ba5483c9"]' \
--experience-configuration '{"Dashboard": {"InitialDashboardId": "bae41127-701b-45c0-a33f-6ff5ba5483c9"}}' \
--session-tags '[{"Key": "hogecity", "Value": "city1"}]' \
--profile hoge
{
    "Status": 200,
    "EmbedUrl": "https://ap-northeast-1.quicksight.aws.amazon.com/embed/0a0d5208f1b84c4b992cf163fe2680ee/dashboards/bae41127-701b-45c0-a33f-6ff5ba5483c9?code=AYABeBu6iQDnwRsGg42dJobzDLIAAAABAAdhd3Mta21zAFBhcm46YXdzOmttczphcC1ub3J0aGVhc3QtMTozNjcwOTQ1NjE4OTQ6a2V5LzkyZDU3MjEzLTc0MjItNGNhOC1iYWZiLTg2MDFjNGZkODgyNwC4AQIBAHh19lpIdHJLvWmpW7433A8711o_o_2vfnBuxyXbJJdfkwGtDyhhvrUUMNcRM85eZC-oAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMSDdQ-FEAs7dXhT4pAgEQgDvz8oidi-A0LpdHgEOEtbDeKbAH_nHwW_wqe_cmoTgt0La8SmvN1VI6xW5bHyr6F2p7DY73WxzxSwbfWQIAAAAADAAAEAAAAAAAAAAAAAAAAABIwntf8oaykSZr2_nM81ZP_____wAAAAEAAAAAAAAAAAAAAAEAAACbddx37UPlJRBADa8g1HqIEOUxjhDlU2GgjswUVaUrli2kFA8-dSUv2EG_0yetgkJm6ib-CTpCgSumw6Lz1R-aIJVoWQ23_vr-5lBY_K56TZ9rV3NXJ-e6SwEdIbKKi71ur2D3kU6D4uN81RK9hCSiB6kmWRrfkK4WRwu_RAPeqGBUEYpwb3Yrxh3hItfhaHpxBgVl1auoVAXfNr6XkVH6LaZgPIOzb8F-8b3G&identityprovider=quicksight&isauthcode=true",
    "RequestId": "be72c47c-301c-4b66-ab01-c0e12cc5167f"
}

上記から得られたEmbedUrlを適当なHTMLコンテンツへ埋め込んで外部ホスティングさせました。
事前にドメインはホワイトリストへ追加済みです。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <p>
        <h1>hoge quicksight 3</h1>
    </p>
    <iframe
        width="960"
        height="720"
        src="https://ap-northeast-1.quicksight.aws.amazon.com/embed/...&isauthcode=true">
    </iframe>
</body>
</html>

期待どおりcity1のレコードのみが表示されています。

同様に、セッションタグにcity2を指定して別の埋め込みURLを発行してみましょう。

この場合は、city2のレコードだけ表示することが出来ました。

複数のタグ値を対象にする

city1city3など複数のタグ値を対象としたい場合は、タグルールで区切り文字を使うことが出来ます。
カンマを区切り文字に設定し、カンマ区切りでセッションタグを指定してみます。

$ aws quicksight generate-embed-url-for-anonymous-user \
--aws-account-id 123456789012 \
--namespace default \
--session-lifetime-in-minutes 15 \
--authorized-resource-arns '["arn:aws:quicksight:ap-northeast-1:123456789012:dashboard/bae41127-701b-45c0-a33f-6ff5ba5483c9"]' \
--experience-configuration '{"Dashboard": {"InitialDashboardId": "bae41127-701b-45c0-a33f-6ff5ba5483c9"}}' \
--session-tags '[{"Key": "hogecity", "Value": "city1,city3"}]' \
--profile hoge

city1city3どちらのデータも表示されるようになりました。
city2は表示対象外となっています。

セッションタグなしや、1クリック埋め込みURLの場合

セッションタグを指定せずに組み込みURLを発行した場合や、ダッシュボード共有画面から取得した1クリック埋め込みURLの場合は以下のように権限がない旨表示されました。

さいごに

本日は、タグベースのRLSを使ってみました。

外部のWebシステムなどに埋め込むダッシュボードにて、QuickSight側でリーダー管理をせずにリーダーセッションキャパシティを使いたい際は、外部システム側でタグを使って動的に埋め込みURLを発行することでアクセス可能なデータを制御させることが出来ます。
ルールの管理と、URL発行処理と、いくつかの要素を組み合わせる必要があるのでちょっとコントロールが大変そうですが、リーダーセッションキャパシティでもセキュリティコントロールする方法があるという点を知っておくと良いと思います。