はじめに

このエントリでは、Qlik Sense Enterpriseで「ストリーム」、「アプリ」、「アプリオブジェクト(シートなど)」の3つのレベルでアクセス制御を行うためのセキュリティルール設定例をご紹介します。ここではセキュリティルールとカスタムプロパティを活用し、アクセス許可を付与する部署やユーザーをセキュリティルールにハードコードすることを避けて管理性を高めつつ、部署ごとにストリーム単位でアクセス制御を行って、あるアプリやアプリに含まれるシート・ストーリーは部署の特定のユーザーのみが参照可能とするといった階層的なアクセス制御を行います。

image

今回は以下の形で「マーケティング部(Marketing)」と「営業部(Sales)」の部署と、「マネージャ(Manager)」と「スタッフ(Staff)」の役職の2軸でアクセス制御を行うシナリオを例にとってご説明します。「営業部」と「マーケティング部」のストリームをそれぞれ対応する部署のメンバーのみがアクセス可能とし、各部署の中の「マネジャー」は全てのアプリ、「スタッフ」はアクセスが許可された特定のアプリのみアクセスが可能とします。このようなストリームとアプリレベルでのアクセス制御を行った後に、より詳細レベルのアプリオブジェクト(シート、ストーリーなど)でのアクセス制御の設定方法をご説明します。

image

また、ここでご説明する「部署」や「役職」などで「どのリソースにアクセスできるか?」という制御に加えて、ユーザータイプ(「Developer」、「Contributor」、「Consumer」)やロール(「ルート管理者(RootAdmin)」、「コンテンツ管理者(ContentsAdmin)」など)をユーザーに付与することで、それぞれのユーザーがどのようなアクションを行えるか(アプリの開発や公開、シートやブックマークの作成など)をさらに設定することもできます。その設定方法は、「Qlik Senseのセキュリティルール:ユーザータイプの定義」でご説明していますので、そちらをご参照ください。

事前準備

では、まず事前準備を行います。ここでの説明は以下のユーザー、ストリーム、アプリが作成済みとなっていることを前提としますので、ドキュメント等を参考に以下の作成作業を行います。

ユーザーの作成

以下のユーザーの作成を行い、トークンのライセンスを付与してQlik Senseへアクセスが可能とします。

  • marketing_staff (マーケティング部スタッフ)
  • marketing_mgr (マーケティング部マネージャ)
  • sales_staff (営業部スタッフ)
  • sales_mgr (営業部マネージャ)

image

ストリームの作成

以下の2つのストリームを作成します。 (ストリームのセキュリティルールは後段で設定しますので、任意の設定で構いません)

  • Marketing
  • Sales

image

アプリの作成と公開

以下の4個のアプリを作成し、それぞれストリームに公開(Publish)します。

Marketingストリームへ公開

  • マーケティング部アプリ(マネージャ向け)
  • マーケティング部アプリ(全員)

Salesストリームへ公開

  • 営業部アプリ(マネージャ向け)
  • 営業部アプリ(全員)

image

カスタムプロパティの作成

ユーザーが参照できるストリームやアプリなどを制御するためのグループ属性として、Qlik Sense上で設定するカスタムプロパティを利用します。カスタムプロパティとして、ここでは「Department(部署)」と「Position(役職)」の2つを作成します。

QMCを開き、「Custom properties」をクリックします。

image

「Create new」をクリックします。

image

以下の入力を行い、「Apply」をクリックしてカスタムプロパティの作成を行います。

  • Name: 「Department」と入力
  • Resource Types: 「Streams」と「Users」にチェック
  • Values: 「Create new」をクリックして「Sales」と「Marketing」を追加

image

「Add another」をクリックして同様の手順で以下の入力を行い、「Apply」をクリックして2つ目のカスタムプロパティの作成を行います。

  • Name: 「Position」と入力
  • Resource Types: 「Apps」と「Users」にチェック
  • Values: 「Create new」をクリックして「Manager」と「Staff」を追加

image

リソースへのカスタムプロパティの設定

次に作成したカスタムプロパティをそれぞれのリソースに設定します。

ストリーム

QMCのトップ画面から、「Streams」を選択します。

image

「Marketing」をダブルクリックして編集画面を開きます。

image

「Custom properties」をクリックしてプロパティを展開し、「Department」のカスタムプロパティから「Marketing」を選択して「Apply」をクリックします。

image

「Security rules」をクリックしてこのストリームに紐づくセキュリティルールの一覧を表示させ、このストリームのセキュリティルール(標準では「Security rule for access to “ストリーム名”」となっています)をダブルクリックして開きます。

image

以下の形で「user@Department = #Stream.@Department」のルールを設定し、「Apply」をクリックしてセキュリティルールとストリームの編集を完了します。このルールの設定により、ストリームに設定されている「Department」のカスタムプロパティの値と同じ値が設定されているユーザーはこのストリームに対してアクセスすることができます。

image

同様の手順で「Sales」ストリームの編集画面を開き、「Department」のカスタムプロパティに「Sales」を追加します。

image

「Sales」ストリームのセキュリティルールを開き、先ほどと同様に「user@Department = #Stream.@Department」のルールを設定し、「Apply」をクリックしてセキュリティルールとストリームの編集を完了します。

image

ユーザー

QMCのトップ画面から、「Users」を選択します。

image

一覧から「marketing_staff (マーケティング部スタッフ)」をダブルクリックします。

image

カスタムプロパティの「Department」に「Marketing」、「Position」に「Staff」を追加して「Apply」をクリックします。

image

その他のユーザーにも同様の手順で以下のカスタムプロパティを設定します。

  • marketing_mgr (マーケティング部マネージャ):「Department」 = 「Marketing」、「Position」 = 「Manager」
  • sales_staff (営業部スタッフ):「Department」 = 「Sales」、「Position」 = 「Staff」
  • sales_mgr (営業部マネージャ):「Department」 = 「Sales」、「Position」 = 「Manager」

アプリ

QMCのトップ画面から、「Apps」を選択します。

image

「マーケティング部(マネージャ向け)」のアプリをダブルクリックして編集画面を開きます。

image

「Position」のカスタムプロパティに「Manager」を追加して「Apply」をクリックします。

image

その他のアプリにも同様の手順で以下のカスタムプロパティを設定します。

  • マーケティング部アプリ(全員) : 「Position」 = 「Manager」、「Staff」 (両方追加します)
  • 営業部アプリ(マネージャ向け): 「Position」 = 「Staff」
  • 営業部アプリ(全員): 「Position」 = 「Manager」、「Staff」 (両方追加します)

セキュリティルールの設定

既存のセキュリティルールの無効化

QMCのトップ画面から、「Security rules」を選択します。

image

「Stream」のセキュリティルールをダブルクリックして編集画面を開きます。

image

「Diabled」のチェックをONにして、「Apply」をクリックします。

image

新規のセキュリティルールの作成

セキュリティルールの一覧画面に戻り、「Create new」をクリックします。

image

以下を入力して「Apply」をクリックし、「ModStream」という名称で新たなルールを作成します。このルールの設定により、アプリに設定されている「Position」のカスタムプロパティの値と同じ値が設定されているユーザーはこのアプリに対してアクセスすることができます。

プロパティ 設定内容
Name ModStream
Resouce filter App*
Actions Read
Advanced Conditions
(resource.resourcetype = "App" and resource.stream.HasPrivilege("read") and (resource.@Position.empty() or resource.@Position=user.@Position)) or ((resource.resourcetype = "App.Object" and resource.published ="true" and resource.objectType != "app_appscript" and resource.objectType != "loadmodel") and resource.app.stream.HasPrivilege("read"))
Context Both in hub and QMC

image

※ この設定はresource.@Position.empty()の指定が入っており、アプリのCustom Propertyの「Position」に指定がない場合はストリームにアクセスできるユーザー全員が参照可能となります。

設定の確認

Hubから「marketing_mgr (マーケティング部マネージャ)」のユーザーでアクセスすると、「Marketing」ストリームのみが表示され、その中に両方のアプリが参照可能となっています。

image

「marketing_staff (マーケティング部スタッフ)」のユーザーでアクセスすると、「Marketing」ストリームのみが表示され、その中に「マーケティング部アプリ(全員)」のアプリのみが参照可能となっています。

image

その他のユーザーでもアクセスを確認し、対象のストリームとアプリのみが表示されることを確認します。

アプリオブジェクトレベルでのアクセス制御の有効化

Qlik Senseの現在のリリースではオブジェクトレベルでのアクセス制御に特化した機能はユーザーインターフェース上では用意されていません。ただし、ここでご説明するセキュリティルールの設定を行うと、以下の形でアプリ内のシートの「説明」欄にアクセス許可を与える役職を入力すると、その役職のユーザーのみがこのシートを参照できるといったシートレベルでのアクセス制御を設定ことができます。

image

カスタムプロパティの作成

新たに「SheetLevelSecurity」の名称のカスタムプロパティを作成します。全てのアプリでオブジェクトレベルでのアクセス制御を行うと管理が煩雑となる可能性があるため、この「SheetLevelSecurity」のカスタムプロパティが「Yes」に設定されているアプリのみ、シートレベルでのアクセス制御を行う設定とします。以下の入力を行い、「Apply」をクリックしてカスタムプロパティの作成を行います。

  • Name: 「SheetLevelSecurity」と入力
  • Resource Types: 「Apps」にチェック
  • Values: 「Create new」をクリックして「Yes」と「No」を追加

image

既存のセキュリティルールの修正

先ほど作成した「ModStream」のセキュリティルールの「Advanced Conditions」を以下の形に修正して保存します。このルールにより、「SheetLevelSecurity」のカスタムプロパティが「Yes」に設定されているアプリは、シートレベルでのアクセス制御を有効する設定が行われます。

プロパティ 設定内容
Advanced Conditions
(resource.resourcetype = "App" and resource.stream.HasPrivilege("read") and (resource.@Position.empty() or resource.@Position=user.@Position)) or ((resource.resourcetype = "App.Object" and resource.published ="true" and resource.objectType != "app_appscript" and resource.objectType != "loadmodel" and resource.app.@SheetLevelSecurity!="Yes") and resource.app.stream.HasPrivilege("read"))

image

新規のセキュリティルールの作成

以下を入力して「Apply」をクリックし、「SheetLevelSecurity」という名称で新たなルールを作成します。ここで、「SheetLevelSecurity」のカスタムプロパティが「Yes」に設定されているアプリのシートレベルでのアクセス制御を定義しています。

プロパティ 設定内容
Name SheetLevelSecurity
Resouce filter App.Object_*
Actions Read
Advanced Conditions
((resource.objectType="sheet" and resource.published ="true" and resource.app.@SheetLevelSecurity="Yes" and (resource.description = "" or user.@Position=resource.description)) or (resource.published ="true" and resource.objectType!="sheet")) and resource.app.stream.HasPrivilege("read")
Context Both in hub and QMC

image

※ この設定はresource.description = “”の指定が入っており、「説明(Description)」が空白のシートはアプリにアクセスできるユーザー全員が参照可能となります。

アプリの作成と公開

シートレベルのアクセス制御を確認するために「マーケティング部アプリ(シートレベル)」という名称のアプリを新たに作成します。このアプリの中には以下の3つのシートを作成します。

  • 全員共有
  • マネージャ向け
  • スタッフ向け

image

シートを作成後、「全員共有」のシートのプロパティを確認します。「説明」欄は初期状態の空白となっており、このシートはこのアプリにアクセスできる全てのユーザーが参照可能となります。

image

次に「マネージャ向け」のシートを開き、「説明」欄に「Manager」と入力します。この設定のより、このシートは「Position」のカスタムプロパティが「Manager」のみのユーザーが参照可能となります。

image

次に「スタッフ向け」のシートを開き、「説明」欄に「Staff」と入力します。この設定のより、このシートは「Position」のカスタムプロパティが「Staff」のみのユーザーが参照可能となります。

image

QMCから「Apps」を選択してアプリ一覧を開き、このアプリの編集画面を開いてカスタムプロパティに以下の設定を行って「Apply」をクリックします。

  • 「Position」:「Manager」、「Staff」
  • 「SheetLevelSecurity」:「Yes」

image

アプリ一覧からこのアプリを「Marketing」ストリームに公開(Publish)します。

image

設定の確認

marketing_staff (マーケティング部スタッフ)でログインして作成したアプリを開くと「全員共有」と「スタッフ向け」のシートが表示されます。

image

次に、marketing_mgr (マーケティング部マネージャ)でログインして作成したアプリを開くと「全員共有」と「マネージャ向け」のシートが表示されます。

image

marketing_mgr (マーケティング部マネージャ)でログインしたまま、以下の設定でマイシートを作成します。

  • タイトル:My sheet for Manager
  • 説明: Manager

image

作成したマイシートを右クリックし、「公開」を選択します。

image

同様に、以下の設定でマイシートを作成します。

  • タイトル:My sheet for Staff
  • 説明: Staff

image

作成したマイシートを右クリックし、「公開」を選択します。

image

marketing_staff (マーケティング部スタッフ)でログインして作成したアプリを開くと、コミュニティのシートとして「My sheet for Staff」のみが参照できることを確認します。

image

ストーリーレベルのアクセス制御の追加

同様の制御をストーリにも適用するには、「SheetLevelSecurity」の「Advanced Condition」の設定を以下の形に修正します。

プロパティ 設定内容
Advanced Conditions
(((resource.objectType="sheet" or resource.objectType="story") and resource.published ="true" and resource.app.@SheetLevelSecurity="Yes" and (resource.description = "" or user.@Position=resource.description)) or (resource.published ="true" and (resource.objectType!="sheet" and resource.objectType!="story"))) and resource.app.stream.HasPrivilege("read")

まとめ

以上、ここではセキュリティルールとカスタムプロパティを活用して、「ストリーム」、「アプリ」、「アプリオブジェクト(シート、ストーリーなど)」の3つのレベルで階層的にアクセス制御を行うための設定方法をご紹介しました。