Couchbase Lite機能解説：Couchbase Serverとの同期③〜セキュリティ設定



本記事は、Couchbase Mobile 3.0リリース以前に執筆されました。新しい記事を発表し、本記事を削除するのが最善ですが、差し当たり、気づいた点は、元の記述を打ち消し線を使って残したまま、注釈を加えてあります（時間の許す範囲内であり網羅的ではありませんが）。最新の情報はドキュメントを参照ください。

## はじめに

ここでは、Couchbase Liteにおけるレプリケーションに関するセキュリティ設定について解説します。

なお、Couchbase Mobileについては、[Couchbase Mobileアプリケーション開発へのロードマップ](https://qiita.com/yoshiyuki_kono/items/6a5bbad1b02196a25417)に記事をまとめている他、（これらの記事を元に構成した）以下の電子書籍を無償で頒布しています。

https://techbookfest.org/product/5074954942939136?productVariantID=5042865933647872

また、Couchbase Mobileは、Couchbase LiteとCouchbase Serverとのデータ同期機能を提供します。Couchbase Serverの存在意義、機能詳細、利用方法等については、拙著[NoSQLドキュメント指向データベースCouchbase Serverファーストステップガイド(インプレスR&D刊)](https://www.amazon.co.jp/-/en/%E6%B2%B3%E9%87%8E-%E6%B3%B0%E5%B9%B8/dp/429560030X/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=1636588872&sr=1-1)や、[NoSQL/JSONデータベースCouchbase Server理解・活用へのロードマップ](https://qiita.com/yoshiyuki_kono/items/4c9cd1115efc5807b49f)にまとめてある記事をご参考ください。


# セキュリティ設定


### ユーザー認証

以下の記述は、3.0より前のバージョンを元にしていました。

~~デフォルトでは、Sync Gatewayはユーザー認証を有効にしません。これは、同期を簡単に開始して実行できるようにするためです。構成ファイルで次のようにGUESTアカウントを無効にすることによって認証を有効化します。~~

```JSON
{
  "databases": {
    "mydatabase": {
      "users": {
        "GUEST": {"disabled": true}
      }
    }
  }
}
```

3.0以降のSync Gatewayでは、デフォルトでは匿名アクセスまたはゲストアクセスを許可しませんが、構成ファイルを編集するか、管理REST APIを使用して有効にすることができます。

https://docs.couchbase.com/sync-gateway/current/authentication-users.html

Sync Gatewayで認証するには、最初にユーザーを作成しておく必要があります。


### クライアント認証
Couchbase Liteクライアントから認証するには、基本認証またはセッション認証の2つの方法があります。

#### 基本認証
基本的なオーセンティケータークラスメソッドにユーザー名とパスワードを指定できます。内部的には、レプリケーターは最初のリクエストでクレデンシャルを送信してSync Gateway Session Cookieを取得し、レプリケーション中の後続のすべてのリクエストに使用します。これは、基本認証を使用するための推奨される方法です。 

次の例は、ユーザーユーザー名とパスワードパスワードとしてワンショットレプリケーションを開始する方法を示しています。


```JAVA
URLEndpoint target = new URLEndpoint(new URI("ws://localhost:4984/mydatabase"));

ReplicatorConfiguration config = new ReplicatorConfiguration(database, target);
config.setAuthenticator(new BasicAuthenticator("username", "password"));

// Create replicator (be sure to hold a reference somewhere that will prevent the Replicator from being GCed)
replicator = new Replicator(config);
replicator.start();
```

#### セッション認証
セッション認証は、Sync Gatewayで認証するもう1つの方法です。ユーザーセッションは、最初にPOST `/{tkn-db}/_session`パブリックREST APIのエンドポイントを介して作成する必要があります。HTTP応答には、作成されたユーザーとして認証するために使用できるセッションIDが含まれています。

次の例は、あらかじめREST APIエンドポイントから取得したセッションIDを使用してワンショットレプリケーションを開始する方法を示しています。

```JAVA
URLEndpoint target = new URLEndpoint(new URI("ws://localhost:4984/mydatabase"));

ReplicatorConfiguration config = new ReplicatorConfiguration(database, target);
config.setAuthenticator(new SessionAuthenticator("904ac010862f37c8dd99015a33ab5a3565fd8447"));

// Create replicator (be sure to hold a reference somewhere that will prevent the Replicator from being GCed)
replicator = new Replicator(config);
replicator.start();
```

### サーバー認証



Sync Gatewayは、デフォルトでTLSが有効になっており、クライアントはサーバーを認証する必要があります。サーバーが受け入れ可能な資格情報を提供できない場合、接続は失敗します。
TLSがオフになっている場合、クライアントはサーバーを認証しません。

同期を続行する準備ができていることを確認するために、アプリがSync Gatewayから受け取ることを期待している資格情報を定義します。


- `setAcceptOnlySelfSignedServerCertificate`が`true`の場合、自己署名証明書のみが受け入れられます。自己署名されていない証明書は、誰が署名したかに関係なく拒否されます。

- `setAcceptOnlySelfSignedServerCertificate`が`false`（デフォルト）の場合、クライアントはサーバーの証明書をシステムCA証明書に対して検証します。サーバーは、ルートがシステムCAバンドル内の証明書の1つによって署名されている証明書のチェーンを提供する必要があります。


##### CA証明書

CAで証明された証明書のみを期待して受け入れるようにクライアントを設定します。

```JAVA:Java
// Configure Server Security
// -- only accept CA attested certs
thisConfig.setAcceptOnlySelfSignedServerCertificate(false); 
```

```Kotlin:Kotlin
// Configure Server Security
// -- only accept CA attested certs
acceptOnlySelfSignedServerCertificate = false, 
```
デフォルトでは、信頼できるCAによって署名されたルートを持つ証明書チェーンのみが許可されます。自己署名証明書は許可されていません。

適切なSSL証明書を提供するようにSync Gatewayを構成し、アプリバンドルに適切な証明書が含まれていることを前提としています。

##### 自己署名証明書

自己署名された証明書のみを期待して受け入れるようにクライアントを設定します。

```Java:Java
// Configure Server Authentication --
// only accept self-signed certs
thisConfig.setAcceptOnlySelfSignedServerCertificate(true); 
```

```Kotlin:Kotlin
// Configure Server Authentication --
// only accept self-signed certs
acceptOnlySelfSignedServerCertificate = true, 
```

自己署名証明書を受け入れるには、これをtrueに設定します。自己署名されていない証明書はすべて拒否されます。



##  関連情報

https://docs.couchbase.com/couchbase-lite/3.0/android/replication.html