Sync Gatewayセキュリティ：TLS証明書認証

ここでは、Sync GatewayにTLS証明書認証を実装する方法について説明します。


## データアクセス
### 認証

Couchbase Mobileでは、管理者は通常、Admin REST APIで操作を実行します。Sync Gatewayが内部ネットワークにデプロイされている場合は、Sync Gatewayの`api.admin_interface`を内部ネットワークにバインドできます。この場合、ファイアウォールを、パブリック`api.public_interface`への外部からの接続を許可するように構成する必要があります。

まったく異なるネットワークまたはリモートデスクトップからAdmin REST APIにアクセスするには、SSHトンネリングを使用することをお勧めします。

### 承認

Admin REST APIに加えて、ユーザーを追加の特権を持つロールに割り当てることができます。ロールとそれに割り当てられたユーザーは、構成ファイルで作成できます。次に、同期関数の`requireRole()`ヘルパー関数を使用して、ユーザーがその役割を持っている場合にのみ特定の操作を許可できます。

### データモデルの検証

NoSQLデータベースでは、システム全体で採用されているデータモデルに従ってドキュメントが作成されていることを確認するのはアプリケーションの責任です。追加のチェックとして、Sync関数の`throw()`メソッドを使用して、事前定義されたデータモデルに従わないドキュメントを拒否できます。

## Sync Gatewayへの接続
NGINXなどのリバースプロキシの背後でSync Gatewayを実行できます。これは、HTTPS接続をサポートし、内部トラフィックをHTTP経由でSync Gatewayにルーティングします。このアプローチの利点は、NGINXがHTTP接続とHTTPS接続の両方を単一のSync Gatewayインスタンスにプロキシできることです。

Sync Gatewayは、SSLを介した接続の提供もサポートしています。SSLを有効にするには、構成ファイルに2つのプロパティを追加する必要があります。

- "SSLCert": X.509証明書または証明書チェーンを含むPEM形式のファイルへのパス

- "SSLKey": 証明書の一致する秘密鍵を含むPEM形式のファイルへのパス

両方のプロパティが存在する場合、サーバーはパブリックポートと管理ポートの両方を介してSSL（およびSSLのみ）に応答します。HTTP接続とHTTPS接続の両方をサポートする場合は、2つの別々のSync Gatewayインスタンスを実行する必要があります。

## SSL証明書を作成する方法
基本的に2つのルートがあります。認証局（CA）に証明書を要求するか、独自の「自己署名」証明書を作成します。

## CAからの証明書の要求
信頼できる認証局（CA）から証明書を取得できます。信頼できるCAの例には、Let's Encrypt、Thawte、GoDaddyなどがあります。これが意味するのは、独自のルート証明書がオペレーティングシステムによって認識され、信頼されているため、署名した証明書もすべて信頼されるということです。

したがって、信頼できるCAから取得した証明書の利点は、SSLクライアントによって信頼されることです。

## 自己署名証明書の作成
CA署名付き証明書とは異なり、自己署名証明書は本質的に信頼できるものではありません。承認された機関がそれを保証していないため、クライアントは証明書を調べてもあなたが誰であるかを知ることができません。ただし、自己署名証明書は引き続き一意であり（秘密鍵の所有者であるあなただけが、その証明書を使用してサーバーを操作できます）、接続を暗号化できます。

opensslコマンドラインツールとこれらの指示を使用して、自己署名証明書を簡単に作成できます。

簡単に言うと、次のコマンドを実行する必要があります。

```BASH
$ openssl genrsa -out privkey.pem 2048
$ openssl req -new -x509 -sha256 -key privkey.pem -out cert.pem -days 1095
```

2番目のコマンドは対話型であり、X.509証明書に含まれる国や都市の名前などの情報を要求します。好きなものをそこに置くことができます。唯一の重要な部分は、クライアントがサーバーに到達するCommon Name (e.g. server FQDN or YOUR name)であり、これは正確なホスト名である必要があるフィールドです。クライアントは、この名前がアクセスしようとしているURLのホスト名と一致することを確認し、一致しない場合は接続を拒否します。

次に、ツールはprivkey.pem（秘密鍵）とcert.pem（公開証明書）の2つのファイルを作成します。

証明書のコピーをバイナリDER形式（多くの場合、「.cer」ファイルに保存されている）で作成するには、次のようにします。

```BASH
$ openssl x509 -inform PEM -in cert.pem -outform DER -out cert.cer
```

## 証明書のインストール
どちらの方法で証明書を取得した場合でも、秘密鍵とX.509証明書が得られます。それらが別々のファイルとPEM形式であることを確認し、Sync Gatewayプロセスで読み取り可能なディレクトリに配置します。秘密鍵は非常に機密性が高い（暗号化されていない）ため、許可されていないプロセスがファイルを読み取れないようにしてください。

次に、"SSLCert"と"SSLKey"プロパティをSync Gateway構成ファイルに追加します。

```JAVASCRIPT
{

  "SSLCert": "cert.pem",
  "SSLKey": "privkey.pem",

}
```

Sync Gatewayを起動し、パブリックポート（ https://localhost:4984 ）にアクセスします。



## Couchbase Serverへの接続
Sync GatewayインスタンスをCouchbase Serverクラスターに安全に接続するには2つの方法があります。それぞれの方法について、以下で詳しく説明します。

### ユーザー名とパスワード
RBACユーザーのユーザー名とパスワードは、Sync Gateway構成ファイルで指定されます。

### X.509証明書
Sync Gateway 2.1には、X.509証明書を使用してCouchbase Server5.5以降に対して認証する機能が追加されています。この機能は、構成ファイルでユーザー名とパスワードを指定する既存の認証方法の代わりに、またはそれに加えて使用できます。

Sync GatewayでX.509証明書ベースの認証を使用するには、最初に次の手順を実行する必要があります。

- ルート証明書とノード証明書を作成します。
- クライアント証明書認証を有効にします。

上記のルート証明書とノード証明書の展開によってCouchbase Serverクラスターが保護されると、クライアント証明書をルート証明書で署名して、Sync Gatewayがクラスターにアクセスできるようにすることができます。

クライアント証明書を生成するには、Couchbase Serverクラスターに予期されたバケットとRBACユーザーがあることを確認してください。

次に、「[クライアントアクセス：ルート証明書の承認](https://docs.couchbase.com/server/current/manage/manage-security/configure-client-certificates.html#client-certificate-authorized-by-a-root-certificate)」の手順に従って、クラスターのルート証明書によって承認されるクライアント証明書を作成します。

手順を完了すると、現在のディレクトリに複数のファイルが生成されます。次のファイルを使用して、Sync Gatewayを構成します。

- `servercertfiles/ca.pem`
- `servercertfiles/clientcertfiles/travel-sample.pem`
- `servercertfiles/clientcertfiles/travel-sample.key`

X.509証明書ベースの認証は、構成ファイル内のこれらの各ファイルへの絶対パスまたは相対パスを指定することにより、Sync Gatewayで有効になります。

```JSON
{
  "interface":":4984",
  "logging": {
    "log_file_path": "/var/tmp/sglogs",
    "console": {
      "enabled": true,
      "log_level": "info",
      "log_keys": [
        "*"
      ]
    }
  },
  "databases":{
    "db":{
      "use_views": true,
      "cacertpath": "./ca.pem",
      "certpath": "./clientcertfiles/travel-sample.pem",
      "keypath": "./clientcertfiles/travel-sample.key",
      "server": "couchbases://127.0.0.1:",
      "bucket": "travel-sample",
      "username": "clientuser"
    }
  }
}
```

接続が成功すると、ログに次のように表示されます。

```
[INF] Starting admin server on 127.0.0.1:4985
[INF] Starting server on :4984 ...
[INF] Establishing TLS connection for DCP to destination 127.0.0.1:11207
```

接続できない場合は、[クラスター証明書エラー表(Cluster Certificate Errors)](https://docs.couchbase.com/server/current/manage/manage-security/handle-certificate-errors.html#cluster-certificate-errors)を参照してください。

x.509認証の構成プロパティの詳細については、以下を参照してください。

- [bootstrap.ca_cert_path](https://docs.couchbase.com/sync-gateway/3.0/configuration-schema-bootstrap.html#bootstrap-ca_cert_path)
- [bootstrap.x509_cert_path](https://docs.couchbase.com/sync-gateway/3.0/configuration-schema-bootstrap.html#bootstrap-x509_cert_path)
- [bootstrap.x509_key_path](https://docs.couchbase.com/sync-gateway/3.0/configuration-schema-bootstrap.html#bootstrap-x509_key_path)

ユーザー名/パスワードのプロパティも構成ファイルで指定されている場合、Sync Gatewayはパスワードベースの認証を使用し、TLSハンドシェイクにクライアント証明書も含めます。




## 関連情報

https://docs.couchbase.com/sync-gateway/3.0/authentication-certs.html