Qlik Senseのセキュリティルール:ストリーム/アプリ/オブジェクトの階層構造のアクセス制御
目次
はじめに
このエントリでは、Qlik Sense Enterpriseで「ストリーム」、「アプリ」、「アプリオブジェクト(シートなど)」の3つのレベルでアクセス制御を行うためのセキュリティルール設定例をご紹介します。ここではセキュリティルールとカスタムプロパティを活用し、アクセス許可を付与する部署やユーザーをセキュリティルールにハードコードすることを避けて管理性を高めつつ、部署ごとにストリーム単位でアクセス制御を行って、あるアプリやアプリに含まれるシート・ストーリーは部署の特定のユーザーのみが参照可能とするといった階層的なアクセス制御を行います。
今回は以下の形で「マーケティング部(Marketing)」と「営業部(Sales)」の部署と、「マネージャ(Manager)」と「スタッフ(Staff)」の役職の2軸でアクセス制御を行うシナリオを例にとってご説明します。「営業部」と「マーケティング部」のストリームをそれぞれ対応する部署のメンバーのみがアクセス可能とし、各部署の中の「マネジャー」は全てのアプリ、「スタッフ」はアクセスが許可された特定のアプリのみアクセスが可能とします。このようなストリームとアプリレベルでのアクセス制御を行った後に、より詳細レベルのアプリオブジェクト(シート、ストーリーなど)でのアクセス制御の設定方法をご説明します。
また、ここでご説明する「部署」や「役職」などで「どのリソースにアクセスできるか?」という制御に加えて、ユーザータイプ(「Developer」、「Contributor」、「Consumer」)やロール(「ルート管理者(RootAdmin)」、「コンテンツ管理者(ContentsAdmin)」など)をユーザーに付与することで、それぞれのユーザーがどのようなアクションを行えるか(アプリの開発や公開、シートやブックマークの作成など)をさらに設定することもできます。その設定方法は、「Qlik Senseのセキュリティルール:ユーザータイプの定義」でご説明していますので、そちらをご参照ください。
事前準備
では、まず事前準備を行います。ここでの説明は以下のユーザー、ストリーム、アプリが作成済みとなっていることを前提としますので、ドキュメント等を参考に以下の作成作業を行います。
ユーザーの作成
以下のユーザーの作成を行い、トークンのライセンスを付与してQlik Senseへアクセスが可能とします。
- marketing_staff (マーケティング部スタッフ)
- marketing_mgr (マーケティング部マネージャ)
- sales_staff (営業部スタッフ)
- sales_mgr (営業部マネージャ)
ストリームの作成
以下の2つのストリームを作成します。 (ストリームのセキュリティルールは後段で設定しますので、任意の設定で構いません)
- Marketing
- Sales
アプリの作成と公開
以下の4個のアプリを作成し、それぞれストリームに公開(Publish)します。
Marketingストリームへ公開
- マーケティング部アプリ(マネージャ向け)
- マーケティング部アプリ(全員)
Salesストリームへ公開
- 営業部アプリ(マネージャ向け)
- 営業部アプリ(全員)
カスタムプロパティの作成
ユーザーが参照できるストリームやアプリなどを制御するためのグループ属性として、Qlik Sense上で設定するカスタムプロパティを利用します。カスタムプロパティとして、ここでは「Department(部署)」と「Position(役職)」の2つを作成します。
QMCを開き、「Custom properties」をクリックします。
「Create new」をクリックします。
以下の入力を行い、「Apply」をクリックしてカスタムプロパティの作成を行います。
- Name: 「Department」と入力
- Resource Types: 「Streams」と「Users」にチェック
- Values: 「Create new」をクリックして「Sales」と「Marketing」を追加
「Add another」をクリックして同様の手順で以下の入力を行い、「Apply」をクリックして2つ目のカスタムプロパティの作成を行います。
- Name: 「Position」と入力
- Resource Types: 「Apps」と「Users」にチェック
- Values: 「Create new」をクリックして「Manager」と「Staff」を追加
リソースへのカスタムプロパティの設定
次に作成したカスタムプロパティをそれぞれのリソースに設定します。
ストリーム
QMCのトップ画面から、「Streams」を選択します。
「Marketing」をダブルクリックして編集画面を開きます。
「Custom properties」をクリックしてプロパティを展開し、「Department」のカスタムプロパティから「Marketing」を選択して「Apply」をクリックします。
「Security rules」をクリックしてこのストリームに紐づくセキュリティルールの一覧を表示させ、このストリームのセキュリティルール(標準では「Security rule for access to “ストリーム名”」となっています)をダブルクリックして開きます。
以下の形で「user@Department = #Stream.@Department」のルールを設定し、「Apply」をクリックしてセキュリティルールとストリームの編集を完了します。このルールの設定により、ストリームに設定されている「Department」のカスタムプロパティの値と同じ値が設定されているユーザーはこのストリームに対してアクセスすることができます。
同様の手順で「Sales」ストリームの編集画面を開き、「Department」のカスタムプロパティに「Sales」を追加します。
「Sales」ストリームのセキュリティルールを開き、先ほどと同様に「user@Department = #Stream.@Department」のルールを設定し、「Apply」をクリックしてセキュリティルールとストリームの編集を完了します。
ユーザー
QMCのトップ画面から、「Users」を選択します。
一覧から「marketing_staff (マーケティング部スタッフ)」をダブルクリックします。
カスタムプロパティの「Department」に「Marketing」、「Position」に「Staff」を追加して「Apply」をクリックします。
その他のユーザーにも同様の手順で以下のカスタムプロパティを設定します。
- marketing_mgr (マーケティング部マネージャ):「Department」 = 「Marketing」、「Position」 = 「Manager」
- sales_staff (営業部スタッフ):「Department」 = 「Sales」、「Position」 = 「Staff」
- sales_mgr (営業部マネージャ):「Department」 = 「Sales」、「Position」 = 「Manager」
アプリ
QMCのトップ画面から、「Apps」を選択します。
「マーケティング部(マネージャ向け)」のアプリをダブルクリックして編集画面を開きます。
「Position」のカスタムプロパティに「Manager」を追加して「Apply」をクリックします。
その他のアプリにも同様の手順で以下のカスタムプロパティを設定します。
- マーケティング部アプリ(全員) : 「Position」 = 「Manager」、「Staff」 (両方追加します)
- 営業部アプリ(マネージャ向け): 「Position」 = 「Staff」
- 営業部アプリ(全員): 「Position」 = 「Manager」、「Staff」 (両方追加します)
セキュリティルールの設定
既存のセキュリティルールの無効化
QMCのトップ画面から、「Security rules」を選択します。
「Stream」のセキュリティルールをダブルクリックして編集画面を開きます。
「Diabled」のチェックをONにして、「Apply」をクリックします。
新規のセキュリティルールの作成
セキュリティルールの一覧画面に戻り、「Create new」をクリックします。
以下を入力して「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 |
※ この設定はresource.@Position.empty()の指定が入っており、アプリのCustom Propertyの「Position」に指定がない場合はストリームにアクセスできるユーザー全員が参照可能となります。
設定の確認
Hubから「marketing_mgr (マーケティング部マネージャ)」のユーザーでアクセスすると、「Marketing」ストリームのみが表示され、その中に両方のアプリが参照可能となっています。
「marketing_staff (マーケティング部スタッフ)」のユーザーでアクセスすると、「Marketing」ストリームのみが表示され、その中に「マーケティング部アプリ(全員)」のアプリのみが参照可能となっています。
その他のユーザーでもアクセスを確認し、対象のストリームとアプリのみが表示されることを確認します。
アプリオブジェクトレベルでのアクセス制御の有効化
Qlik Senseの現在のリリースではオブジェクトレベルでのアクセス制御に特化した機能はユーザーインターフェース上では用意されていません。ただし、ここでご説明するセキュリティルールの設定を行うと、以下の形でアプリ内のシートの「説明」欄にアクセス許可を与える役職を入力すると、その役職のユーザーのみがこのシートを参照できるといったシートレベルでのアクセス制御を設定ことができます。
カスタムプロパティの作成
新たに「SheetLevelSecurity」の名称のカスタムプロパティを作成します。全てのアプリでオブジェクトレベルでのアクセス制御を行うと管理が煩雑となる可能性があるため、この「SheetLevelSecurity」のカスタムプロパティが「Yes」に設定されているアプリのみ、シートレベルでのアクセス制御を行う設定とします。以下の入力を行い、「Apply」をクリックしてカスタムプロパティの作成を行います。
- Name: 「SheetLevelSecurity」と入力
- Resource Types: 「Apps」にチェック
- Values: 「Create new」をクリックして「Yes」と「No」を追加
既存のセキュリティルールの修正
先ほど作成した「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"))
|
新規のセキュリティルールの作成
以下を入力して「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 |
※ この設定はresource.description = “”の指定が入っており、「説明(Description)」が空白のシートはアプリにアクセスできるユーザー全員が参照可能となります。
アプリの作成と公開
シートレベルのアクセス制御を確認するために「マーケティング部アプリ(シートレベル)」という名称のアプリを新たに作成します。このアプリの中には以下の3つのシートを作成します。
- 全員共有
- マネージャ向け
- スタッフ向け
シートを作成後、「全員共有」のシートのプロパティを確認します。「説明」欄は初期状態の空白となっており、このシートはこのアプリにアクセスできる全てのユーザーが参照可能となります。
次に「マネージャ向け」のシートを開き、「説明」欄に「Manager」と入力します。この設定のより、このシートは「Position」のカスタムプロパティが「Manager」のみのユーザーが参照可能となります。
次に「スタッフ向け」のシートを開き、「説明」欄に「Staff」と入力します。この設定のより、このシートは「Position」のカスタムプロパティが「Staff」のみのユーザーが参照可能となります。
QMCから「Apps」を選択してアプリ一覧を開き、このアプリの編集画面を開いてカスタムプロパティに以下の設定を行って「Apply」をクリックします。
- 「Position」:「Manager」、「Staff」
- 「SheetLevelSecurity」:「Yes」
アプリ一覧からこのアプリを「Marketing」ストリームに公開(Publish)します。
設定の確認
marketing_staff (マーケティング部スタッフ)でログインして作成したアプリを開くと「全員共有」と「スタッフ向け」のシートが表示されます。
次に、marketing_mgr (マーケティング部マネージャ)でログインして作成したアプリを開くと「全員共有」と「マネージャ向け」のシートが表示されます。
marketing_mgr (マーケティング部マネージャ)でログインしたまま、以下の設定でマイシートを作成します。
- タイトル:My sheet for Manager
- 説明: Manager
作成したマイシートを右クリックし、「公開」を選択します。
同様に、以下の設定でマイシートを作成します。
- タイトル:My sheet for Staff
- 説明: Staff
作成したマイシートを右クリックし、「公開」を選択します。
marketing_staff (マーケティング部スタッフ)でログインして作成したアプリを開くと、コミュニティのシートとして「My sheet for Staff」のみが参照できることを確認します。
ストーリーレベルのアクセス制御の追加
同様の制御をストーリにも適用するには、「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つのレベルで階層的にアクセス制御を行うための設定方法をご紹介しました。