Common Data Service セキュリティモデル : ユーザーとチーム、セキュリティロール

Common Data Service (CDS) のセキュリティは複数の仕組みがあります。このシリーズではそれぞれの概要について説明します。

[参照: Common Data Service のセキュリティ概念](https://docs.microsoft.com/ja-jp/power-platform/admin/wp-security-cds)

# セキュリティモデル

CDS では以下のようなセキュリティモデルが使われます。

- ユーザーおよびチームを基本とするセキュリティロール
- レコードの共有
- ユーザーのプロパティによる階層セキュリティ
- フィールドレベルセキュリティ

この記事では一番基本となるセキュリティロールによるセキュリティについて説明します。

# 設定画面

CDS のセキュリティは [Power Platform 管理センター](https://admin.powerplatform.microsoft.com)より行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/831b1a09-6773-27f8-0ed1-e61b3451cdaa.png)

# 部署

ユーザーは部署 (Business Unit) に所属し、環境は既定でルート部署が作成されます。管理センターの「User + permissions」より「Business Units」をクリックすると部署画面に移動します。ここで既定のルート部署が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/29193c62-3330-e93f-878e-8f4c08709412.png)

部署は階層構造にできます。またユーザーは 1 部署にのみ所属します。以下はいくつか部署を追加した例です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/588d02bd-93bc-e1e7-1a53-e543d74e7ea0.png)

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/5303605e-2cb9-f324-7735-404ab889323c.png"/>

## ユーザーを部署に追加

各ユーザーは部署から追加することも、ユーザーから部署を指定することもできます。

[ユーザーレコードから]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/07adeabf-bb21-50b8-d77a-928d1389e913.png)

[一覧から]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/f4457be9-dbcb-6abb-3d17-7b16c9d8cc2d.png)

# セキュリティロール

既定で複数のセキュリティロールが用意されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/34450213-2e34-6fc7-cf8f-0251e7246835.png)

セキュリティロールは「エンティティの権限」と「その他の特権」に分かれています。

## エンティティの権限

セキュリティはエンティティ毎および権限毎に設定できます。

### 権限の種類

- 作成 : レコードの作成権限
- 読み込み : レコードの読み取り権限
- 書き込み : レコードの更新権限
- 削除 : レコードの削除権限
- 追加 : 他レコードに紐づける権限
- 追加先 : 他のレコードを紐づける権限
- 割り当て : レコードの所有者を変更する権限
- 共有 : レコードを共有する権限

追加と追加先は、例えば「取引先担当者」を「取引先企業」に紐づける場合、「取引先担当者の追加」と「取引先企業の追加先」権限が必要です。

### 権限の範囲

- 組織全体 : すべてのレコードに対する権限
- 部署配下 : 所属する部署およびその配下の部署に所属するレコードに対する権限
- 部署 : 所属する部署に所属するレコードに対する権限
- ユーザー : 自身が所有するレコードに対する権限
- 選択なし : どのレコードにも権限がない

例えば上記部署構成で「営業部」に所属するユーザーが、以下のセキュリティ設定をもつセキュリティロールがある場合、取引先企業エンティティについて :
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/44862f13-c7c3-0601-ba46-33b3de86f89a.png)

- レコードの作成が可能
- 営業部、第1営業部、第2営業部のレコードは読み込めるが、ルート部署、サービス部のレコードは見れない
- 営業部のレコードは更新できるが、他部署のレコードは更新できない
- 自分が所有するレコードは削除できるが、他のレコードは削除できない

となります。

## その他の特権

アプリケーションの操作に関わる権限のオン/オフができます。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/5dc640d5-b747-544c-0d61-efd80fd14206.png"/>

## 拒否権限

セキュリティロールには「拒否」の権限がないため、それを前提に設計する必要があります。

## 複数のセキュリティを持つ場合

ユーザーに割り当てられたそれぞれのセキュリティの最大権限が付与されます。

## ロールの割り当て

ユーザー画面または一覧画面からも割り当てができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/08f72abd-ece8-c9d3-291a-95420f1b51d7.png)

## Common Data Service User

既定のロールでユーザーが一番よく使うものが「Common Data Service User」です。多くのエンティティについて「ユーザー」レベルの権限を保持します。

# チーム

チームには以下の 2 種類があります。

- 所有者またはグループ
- アクセスチーム

幾つか違いがありますが、最大の違いは「所有者またはグループチーム」は CDS 内でユーザーのように扱われ、セキュリティロールの割り当てが行える他、レコードを所有することができます。
違いについては [所有者/グループ チームまたはアクセス チームか](https://docs.microsoft.com/ja-jp/power-platform/admin/manage-teams#ownergroup-team-or-access-team) を参照してください。

ここではセキュリティロールを割り当てられる「所有者またはグループチーム」について説明します。

## 所有者またはグループチーム

部署内、または部署を超えてレコードの共有や共同作業が必要な場合、チームを使う事ができます。
例えば「営業部」に所属するユーザー A と、「サービス部」に所属するユーザー B が同じプロジェクトでレコードを見る必要がある場合、以下のようにします。

- 所有者またはグループチームを作成
- セキュリティロールをチームに割り当て
- ユーザー A と B をチームに割り当て

この場合、ユーザー A と B はチームが持つ権限を自動的に引き継ぎ、チームが所有するレコードにアクセスできるため、各ユーザーに組織レベルの権限を割り当てる必要がありません。

[チーム作成画面]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/4e76128e-295d-659f-7b60-00ab407d19d8.png)

# 動作確認

では最後に実際に試してみましょう。

## 事前準備

### セキュリティロールの作成

Common Data Service User は「ユーザー」レベルの権限しかないため、新しくいくつかロールを作成します。

1\. セキュリティロールから「新規」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/fa33a356-df62-782c-a00e-a0b62df82941.png)

2\. 名前を「顧客 - 部署配下」とする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/9adfcbc2-f7cf-90da-3d60-6751ac8cf0d1.png)

3\.「コアレコード」より「取引先企業」と「取引先担当者」の全操作に「部署配下」を設定。
※エンティティ名をクリックすると全権限まとめて設定可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/0c2eb39c-59c6-f8ec-0fce-e26100188096.png)

4\.「保存して閉じる」をクリック。

5\. 同様に「部署」レベルの権限がある「顧客 - 部署」を作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/8ceb1ac9-4499-43de-b8e3-5ceb2c0e248a.png)

### チームの作成

チームも作成します。

- 任意のチーム名
- 所有者タイプのチーム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/cab7a724-46fc-5d08-c848-e0f3b71aebdc.png)

### ユーザーの設定

この環境ではテストのために以下ユーザーを作りました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/618f9639-55fe-dca8-a9c0-81db55016292.png)

1\. 各ユーザーに「Common Data Service User」ロールも付与し、以下のロールも付与。

- 担当者 : 顧客 - 部署
- 部長 : 顧客 - 部署配下

2\. 作成したチームに以下ユーザーを追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/aff6b67b-80ad-5f0e-d7f6-9a3dd095bb7c.png)

3\. チームに「Common Data Service User」ロールを追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/96510f7a-9113-9f20-dd7a-a3bd28b5ae08.png)

### データの準備

既定でサンプルデータが無い場合、以下手順でデータを作成します。

1\. 設定より「詳細設定」を開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/df835091-bc5a-ba08-e9a6-72c6808d4746.png)

2\. 設定 | データ管理を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/127f20d6-7c67-5039-f4c3-ed702f079b35.png)

3\. サンプルデータをクリックして、「サンプルデータのインストール」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/6bc764f6-b72c-3f15-7c43-64ace6f26c88.png)

4\. 作業が完了したらデータができていることを確認。※少し時間がかかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/6cf25909-f0ba-b8a3-73d5-eeff2659d500.png)

## 所有者の設定

1\.「越安 辰夫 (サンプル)」を選択して「レコードの編集」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/ef43a988-71f3-6572-c617-c6e69e50bbb1.png)

2\.「割り当て」をクリックして、「第1営業部 営業担当」を選択し、「割り当て」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/0a8b357c-6713-7a16-dcda-51e744c78101.png)

3\. 同様に「加須 紀夫 (サンプル)」の所有者を「プロジェクト X」チームに設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/e054a672-2886-1bc0-0f53-7884e5839daf.png)

4\. 取引先企業の「ファブリカム (サンプル)」の所有者を「プロジェクト X」チームに設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/ea19a61a-3966-60a8-18fc-a94ca74c74f6.png)

5\. 取引先担当者「山元 憲次 (サンプル)」を「第1営業部 部長」に割り当て。

6\. 同様に「小原 すみ江 (サンプル)」を「第2営業部 営業担当」に割り当て。

### アプリの作成

取引先企業と取引先担当者エンティティを含む「モデル駆動型アプリ」を作成し、すべてのセキュリティロールに公開します。

## 動作の確認

1\. アプリに「第1営業部 営業担当者」でログインして「取引先担当者」を確認。所有しているレコードが「自分のアクティブな取引先担当者」に表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/6fbec7b5-446e-5293-cda5-f2f1ed8d049a.png)

2\. 「アクティブな取引先担当者」にビューを変えてレコードを確認。

- 越安 辰夫 (サンプル): 所有しているから見える
- 加須 紀夫 (サンプル): プロジェクト X チームが所有していて、チームに参加しているから見える
- 佐々木 理恵 (サンプル): プロジェクト X チームが「ファブリカム (サンプル)」の所有者に割り当てられた際、担当者の所有者に伝播でなったため、上記レコードと同じ理由で見える
- 山元 憲次 (サンプル): 同じ部署にいる「第1営業部 部長」が所有しているため、部署レベルの権限で見える

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/3120f0a7-f3b3-a6a5-9055-b0aa526e5e26.png)

3\.「取引先企業」もそれぞれのビューで確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/12cb34a3-078e-a7f7-9543-d61d664e87b5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/50ce908a-e0f1-a05c-103e-fcb4836da53a.png)

4\. アプリからサインアウトして「第2営業部 営業担当者」でログイン。「アクティブな取引先担当者」に自分の所有するレコードしかないことを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/5d2e6437-c1f6-f1d8-067f-cfc0284b1134.png)

5\. アプリからサインアウトして「第1営業部 部長」でログイン。「アクティブな取引先担当者」を確認。

- 山元 憲次 (サンプル): 自分が所有しているレコードのため見える
- 越安 辰夫 (サンプル): 同じ部署にいる「第1営業部 営業担当」が所有しているため、部署レベルの権限で見える

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/2aa5290f-8aa8-4637-61b7-bd9f6698d393.png)

6\. アプリからサインアウトして「営業部 部長」でログイン。「アクティブな取引先担当者」を確認。

- 山元 憲次 (サンプル): 配下部署である「第1営業部」のユーザーが所有しているため見える
- 越安 辰夫 (サンプル): 配下部署である「第1営業部」のユーザーが所有しているため見える
- 小原 すみ江 (サンプル): 配下部署である「第2営業部」のユーザーが所有しているため見える

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/dd723ad0-5109-a4c1-c9f8-e610ccd676ac.png)

7\. アプリからサインアウトして「サービス部 サービス担当」でログイン。「アクティブな取引先担当者」を確認。どちらも「プロジェクト X」チームが所有しているため見える。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/adec06d7-6335-b63b-f7da-ee172e909e8b.png)

# まとめ

普段 Power Apps から CDS を使う場合はあまり意識することが無いかもしれませんが、CDS では柔軟なセキュリティが可能です。まずは基本となるセキュリティロールについて試してみてください。

次回はレコードの共有について説明します。

[次の記事へ](https://qiita.com/kenakamu/items/4eb4b55b52ccc4617bf4)