エッジコンピューティングを実現するCouchbase Mobile紹介：Sync Gatewayによるデータ同期におけるアクセス制御モデル

## はじめに

Couchbase Mobileは、エッジコンピューティングを実現するデータプラットフォームであり、Androidをはじめとしたスマートフォンや、エッジデバイス用の組込データベースである、Couchbase Liteと、Couchbase Server、そしてそれらの間のデータの同期を実現する、Sync Gatewayから構成されます。

Sync Gatewayによるデータの同期を理解するには、まず、アクセス制御モデルを理解することから始まるといってよいでしょう。


## アクセス制御モデル

### コンセプト
ドキュメントへのアクセスを制御するには、ドキュメントをチャネルにルーティングし、そのタイプのドキュメントにアクセスできるようにするユーザーまたはロールがそのチャネルにアクセスできるようにします。

### モデル
Couchbase Mobileでは、ドキュメントへのアクセスは、ユーザー、ロール、チャネルという、3つのエンティティによって管理されます。

#### アクセス制御モデル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/492cef7c-9c74-bee3-aa81-f1f021958851.png)

チャネルはドキュメントに関連付けられたタグと見なすことができます。Sync Gatewayによって処理されるすべてのドキュメントは、チャネルに割り当てられます。チャネルは、ドキュメントを分類し、アクセス制御を実施するための基本になります。
チャネルには、ユーザーによって定義されるものと、システムによって定義されるものがあります。

ユーザーに対して、チャネルへのアクセスが許可されることによって、ユーザーがアクセスできるドキュメントが決定されます。

ロールは、ユーザーを論理的にグループ化します。ユーザーと同様に、ロールに対しても、チャンネルへのアクセスが許可されます。

ユーザーは、直接にまたはロールを介して割り当てられたチャネルにあるドキュメントのみにアクセスすることができます。

このアクセス制御モデルは、アクセスの種類（読み込み、または書き込み）を付与も制約もしません。書き込み権限を制御する際には、Sync関数内に書き込みアクセス制御を明示的に実装することができます。

## チャンネル
### コンセプト
Sync Gatewayはチャネルを使用して、効果的なアクセス制御を維持しながら、大規模なユーザーベース間でデータベースのドキュメントを簡単に共有できるようにします。これらは、ドキュメントとユーザーの間のセキュリティコントロールのために機能します。

### 概要
チャネルには、（データベース内の）ドキュメントのリストが割り当てられます。すべてのユーザー（またはロール）には、チャネル（のリスト）へのアクセスが許可されます。この二重のリストは、チャネルの使用方法に反映されています。

- ユーザーにチャネルへのアクセスを許可することにより、アクセス制御を課します
- ドキュメントをチャネルに割り当てることにより、ドキュメントルーティングを課します

チャネルを使用して次のことが実現されます。

- 誰がどのドキュメントにアクセスできるかを制御する
- データセットを分割する
- ユーザーが必要なドキュメントだけにアクセスできるようにする
- モバイルデバイスに同期されるデータの量を最小限に抑える


### 使用事例
2人のユーザーがドキュメントのプライベートセットと1人の共有ドキュメント共有へのアクセスを必要とし、許可されている場合を考えてみます。次の図を参照してください。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/0f754ef3-1c5d-385b-4c1a-62e0df7f7117.png)



この場合、各ユーザーは、ユーザーのみがアクセスできるドキュメントのサブセットと、共通のドキュメントを含む共有チャネルを持つプライベートチャネルに割り当てられます。この例のユーザーは、ロールに置き換えることができます。

このモデルの例として、各店舗がSync　Gatewayユーザーに対応する小売チェーンが考えられます。各店舗には、価格設定、プロモーション、在庫などの店舗固有のドキュメントを含む店舗固有のチャネルがあります。さらに、すべての店舗は、製品カタログなどの共通のドキュメントセットにアクセスする必要があります。

#### チャネル構成情報
エンティティとしてのチャネルは、名前とドキュメントのリストで構成されます。

## ユーザー
### コンセプト
ユーザーは、アクセス制御の基本概念の1つです。ドキュメントへのアクセスを特定のユーザーや特定の役割を持つユーザーに制限できます。

チャネルへのアクセスを許可されたユーザーは、そのチャネルに割り当てられたすべてのドキュメントにアクセスできます。

ユーザーは、ロールに割り当てることもできます。ユーザーは、所属するすべてのロールのチャネルアクセスを継承します。

#### ユーザー構成情報
エンティティとして、ユーザーは名前、パスワード、ロールのリスト、およびチャネルのリストで構成されます。

## ロール
### コンセプト
ロールにより、同様の特性を持つユーザーをグループ化できるため、ユーザーの管理が容易になります。

ロールにはチャネルへのアクセスが許可されます。ロールが割り当てられたすべてのユーザーは、ロールにアクセスが許可されているすべてのチャネル（およびそれらのチャネル内のドキュメント）にアクセスできます。

ロールに関連付けられているすべてのユーザーは、ロールのリスト内の任意のチャネルにアクセスする権利を継承します。これは、複数のチャネルを複数のユーザーに関連付ける方法を提供します。

#### ロール構成情報
エンティティとしてのロールは、名前とチャネルのリストで構成されます。

#### 備考
ロールにはユーザーとは別の名前空間があるため、同じ名前のユーザーとロールを持つことができます。

## クライアントの挙動

ユーザーに新しいチャネルへのアクセスが許可されると同期が開始され、次のレプリケーションプルリクエストの際に、ユーザーが現在アクセスできるすべてのドキュメントが取得されます。

クライアントは、デフォルトでは、ユーザーがアクセスできるすべてのチャネルを取得します。オプションとして、「プル」レプリケーション時に、ドキュメントを受信するチャネル名のコンマ区切りリストを指定することもできます。この場合、レプリケーションは、それらのチャネルでタグ付けされたドキュメントのみをプルします。

Couchbase 3.0ベータから、自動パージ機能が導入され、自動パージが有効（デフォルト）の場合、ユーザーがチャネルにアクセスできなくなった後の挙動は、同期の各モードで、以下の通りです。

#### プルオンリー

以前に同期されたドキュメントはローカルで自動パージされます。

#### プッシュオンリー


自動パージの影響なし。

ドキュメントはプッシュされますが、Sync Gatewayによって拒否されます。

#### プッシュアンドプル


以前に同期されたドキュメントは、Couchbase Liteで自動パージされます。

ローカルの変更は引き続きリモートにプッシュされますが、Sync Gatewayによって拒否されます。

## Admin/Metrics APIユーザー
Admin/Metrics APIへのアクセスを認証および承認するには、Couchbase ServerのRBACユーザー資格情報が必要になります。


# 関連情報
https://docs.couchbase.com/sync-gateway/3.0/access-control-concepts.html