LoginSignup
3
0

More than 1 year has passed since last update.

ASP.NET Coreでセキュリティーを考慮したQuickSightの匿名埋め込みダッシュボード機能を利用する(前編)

Last updated at Posted at 2021-08-31

はじめに

QuickSightにはユーザーごとに参照可能なデータを行レベルで制御するRowLevelSecurityという機能があります。

少し前のQuickSightの更新で追加された匿名ダッシュボードの埋め込み機能でもこの機能が利用できるのですが、AWS CLIを利用する必要があったり、AWSのドキュメントでもあまり触れられていなかったりするので、検証した記録を残しておきます。

少し長くなったので、AWS CLIを使ってデータセットにセキュリティー設定をする前編と、ASP.NET Coreで埋め込みダッシュボードを作成する後編の2つに分割して投稿します。

QuickSightの埋め込みダッシュボード機能

QuickSightで埋め込みダッシュボード機能を利用するコマンドには次の3つがあります。どの機能も、QuickSightのエンタープライズ契約が必要です。
1つ目のget-dashboard-embed-urlは古いコマンドです。これから利用する場合は、2つ目と3つ目のコマンドを利用しましょう。また、今回対象とするgenerate-embed-url-for-anonymous-userはQuickSightのセッションキャパシティープランでのみ利用可能なコマンドになっています。利用できない場合はQuickSightの利用プランを確認してみてください。

詳細はAWSのドキュメントを参照してください。

今回サンプルに利用するデータセット

今回はデータベースに定義された次のテーブルを対象にデータセットを作成します。
このデータセットでは、アプリにログインしたユーザーのロールによって表示できるデータを制御します。
つまり、ダッシュボードを表示するユーザーのロールがuserだった場合は#8, #9,#10のデータは表示されないように制限しますが、ロールがadminだった場合はすべてのデータを表示できるように制御します。

image.png
データソースとなるMySQLのテーブル定義はこうなっています。

bi_sample_dashboard
create table bi_sample_dashboard
(
  id             int primary key auto_increment,
  role           varchar(10),
  string_column1 varchar(100),
  string_column2 varchar(100),
  string_column3 varchar(100),
  int_column1    int,
  int_column2    int
);

データセットに対するRowLevelSecurityの設定

RLS(RowLevelSecurity)を設定する場合、現在のところマネジメントコンソールにUIが用意されていないため、次の手順でAWS CLIでコマンドを実行していく必要があります。

  1. データセット定義の出力
  2. データセットに対するRLSの設定
  3. コンソールユーザー用のパーミッション設定

QuickSightはなにをやるにもAWSのアカウントIDが必要になります。
この頃はSTSから簡単にAWSのアカウントIDが取得できるので変数にとっておきましょう。

AWSAccountIdの確認
$awsAccountId = aws sts get-caller-identity | jq -r '.Account'

データセット定義の出力

AWS CLIを使って定義情報をdataset.jsonファイルに書き出します。

データセット定義の出力
$dataSetId = aws quicksight list-data-sets --aws-account-id $awsAccountId `
    | jq -r '.DataSetSummaries[] | select(.Name==\"bi_sample_dashboard\")'
❯ aws quicksight describe-data-set --aws-account-id $awsAccountId --data-set-id $dataSetId `
    | jq -r '.DataSet' > C:\temp\dataset.json

dataset.json
dataset.json
{
  "Arn": "arn:aws:quicksight:ap-northeast-1:xxxxxxxxxxx:dataset/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "DataSetId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "Name": "bi_sample_dashboard",
  "CreatedTime": "2021-08-30T08:36:52.447000+09:00",
  "LastUpdatedTime": "2021-08-30T08:41:25.692000+09:00",
  "PhysicalTableMap": {
    "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx": {
      "RelationalTable": {
        "DataSourceArn": "arn:aws:quicksight:ap-northeast-1:xxxxxxxxxxx:datasource/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "Name": "bi_sample_dashboard",
        "InputColumns": [
          {
            "Name": "id",
            "Type": "INTEGER"
          },
          {
            "Name": "role",
            "Type": "STRING"
          },
          {
            "Name": "string_column1",
            "Type": "STRING"
          },
          {
            "Name": "string_column2",
            "Type": "STRING"
          },
          {
            "Name": "string_column3",
            "Type": "STRING"
          },
          {
            "Name": "int_column1",
            "Type": "INTEGER"
          },
          {
            "Name": "int_column2",
            "Type": "INTEGER"
          }
        ]
      }
    }
  },
  "LogicalTableMap": {
    "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx": {
      "Alias": "bi_sample_dashboard",
      "DataTransforms": [
        {
          "ProjectOperation": {
            "ProjectedColumns": [
              "id",
              "role",
              "string_column1",
              "string_column2",
              "string_column3",
              "int_column1",
              "int_column2"
            ]
          }
        }
      ],
      "Source": {
        "PhysicalTableId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
      }
    }
  },
  "OutputColumns": [
    {
      "Name": "id",
      "Type": "INTEGER"
    },
    {
      "Name": "role",
      "Type": "STRING"
    },
    {
      "Name": "string_column1",
      "Type": "STRING"
    },
    {
      "Name": "string_column2",
      "Type": "STRING"
    },
    {
      "Name": "string_column3",
      "Type": "STRING"
    },
    {
      "Name": "int_column1",
      "Type": "INTEGER"
    },
    {
      "Name": "int_column2",
      "Type": "INTEGER"
    }
  ],
  "ImportMode": "SPICE",
  "ConsumedSpiceCapacityInBytes": 1513,
  "ColumnGroups": []
}

データセットに対するRLSの設定

今回はroleカラムを使ってRLSを設定したいので次のようなタグ定義追加します。
複数項目の区切り文字に,(カンマ)を、全項目を出力したい場合は*(アスタリスク)を指定するようにしました。

  "RowLevelPermissionTagConfiguration": {
    "Status": "ENABLED",
    "TagRules": [
      {
        "TagKey": "tag_role",
        "ColumnName": "role",
        "TagMultiValueDelimiter": ",",
        "MatchAllValue": "*"
      }
    ]
  }

前項で出力したdataset.jsonを次のように編集します。


{
+  "AwsAccountId": "xxxxxxxxxxxx",
-  "Arn": "arn:aws:quicksight:ap-northeast-1:xxxxxxxxxxx:dataset/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "DataSetId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "Name": "bi_sample_dashboard",
-  "CreatedTime": "2021-08-30T08:36:52.447000+09:00",
-  "LastUpdatedTime": "2021-08-30T08:41:25.692000+09:00",
  "PhysicalTableMap": {
    "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx": {
      "RelationalTable": {
        "DataSourceArn": "arn:aws:quicksight:ap-northeast-1:xxxxxxxxxxx:datasource/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "Name": "bi_sample_dashboard",
        "InputColumns": [
          {
            "Name": "id",
            "Type": "INTEGER"
          },
          {
            "Name": "role",
            "Type": "STRING"
          },
          {
            "Name": "string_column1",
            "Type": "STRING"
          },
          {
            "Name": "string_column2",
            "Type": "STRING"
          },
          {
            "Name": "string_column3",
            "Type": "STRING"
          },
          {
            "Name": "int_column1",
            "Type": "INTEGER"
          },
          {
            "Name": "int_column2",
            "Type": "INTEGER"
          }
        ]
      }
    }
  },
-  "LogicalTableMap": {
-    "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx": {
-      "Alias": "bi_sample_dashboard",
-      "DataTransforms": [
-        {
-          "ProjectOperation": {
-            "ProjectedColumns": [
-              "id",
-              "role",
-              "string_column1",
-              "string_column2",
-              "string_column3",
-              "int_column1",
-              "int_column2"
-            ]
-          }
-        }
-      ],
-      "Source": {
-        "PhysicalTableId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
-      }
-    }
-  },
-  "OutputColumns": [
-    {
-      "Name": "id",
-      "Type": "INTEGER"
-    },
-    {
-      "Name": "role",
-      "Type": "STRING"
-    },
-    {
-      "Name": "string_column1",
-      "Type": "STRING"
-    },
-    {
-      "Name": "string_column2",
-      "Type": "STRING"
-    },
-    {
-      "Name": "string_column3",
-      "Type": "STRING"
-    },
-    {
-      "Name": "int_column1",
-      "Type": "INTEGER"
-    },
-    {
-      "Name": "int_column2",
-      "Type": "INTEGER"
-    }
-  ],
  "ImportMode": "SPICE",
-  "ConsumedSpiceCapacityInBytes": 1513,
-  "ColumnGroups": []
+  "RowLevelPermissionTagConfiguration": {
+    "Status": "ENABLED",
+    "TagRules": [
+      {
+        "TagKey": "tag_role",
+        "ColumnName": "role",
+        "TagMultiValueDelimiter": ",",
+        "MatchAllValue": "*"
+      }
+    ]
+  }
}

JSONファイルを更新したら、CLIで適用します。

❯ aws quicksight update-data-set --cli-input-json file://C:/temp/dataset.json

RLSが適用されたので、QuickSightの分析ではグラフが表示できなくなっています。

image.png

コンソールユーザー用のパーミッション設定

このままだと不便なので、現在のユーザーにパーミッションを設定しましょう。
QuickSightのadminユーザーに対し、useradminロールの行を参照可能となるように設定しています。

bi_sample_dashboard_permission.csv
UserName,role
admin,"user,admin"

新しいデータセットの作成から、bi_sample_dashboard_permission.csvをもとにパーミッション用のデータセットを作成します。

image.png

パーミッションを適用したいデータセットの定義を開き、行レベルセキュリティボタンから先ほど作成したパーミッション用のデータセットを割り当てます。

image.png
image.png

表示できるようになりましたね。

image.png

前編のまとめ

  • QuickSightの匿名ダッシュボードでRLSを利用すると、参照可能なデータを行ごとに制御することができる
  • まだマネジメントコンソールからは設定できないのでAWS CLIで操作する必要がある
  • 匿名ダッシュボード機能はQuickSightのセッションキャパシティープランでのみ利用できる

ASP.NET Coreでセキュリティーを考慮したQuickSightの匿名埋め込みダッシュボード機能を利用する(後編)

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0