Couchbase Server 認証 Authentication 解説 （LDAP, PAM, SASL等）

# はじめに

本稿では、Couchbase Serverにおける認証（Authentication）について、解説します。

# 認証 Authentication の基本
Couchbase Serverにアクセスするには、ユーザーが認証されている必要があります。認証（Authentication）は、誰がシステムにアクセスしようとしているのかを識別するためのプロセスです。認証が成功した後、承認（Authorization）を実行できます。これにより、ユーザーの適切なアクセスレベルが決定されます。

# Couchbase Serverにおける認証

Couchbase Serverの認証は通常、ユーザー名とパスワードに依存します。これらの情報は、アクセスを試みるユーザー（つまり、管理者またはアプリケーション）からシステムに渡される必要があります。
ユーザー名とパスワードは、事前に定義されているものと一致する必要があります。事前の定義情報は、Couchbase Serverクラスター自体、または外部システム、のいずれかで管理されます 。
また、クライアントアプリケーションから、x.509証明書を使用してCouchbaseServerに資格情報を渡すこともできます。

## ビルトイン管理者アカウント

まず、Couchbaseクラスターの初期化時に、ユーザーがビルトイン管理者アカウントのユーザ名（デフォルトでは、Administrator）とパスワードを設定します。その後、任意の数のユーザーをクラスターにいつでも追加できます。
追加ユーザーを管理者権限を持つユーザーとして作成することは可能ですが、ビルトイン管理者アカウントと、追加されたユーザーとでは、管理方法が異なります。ビルトイン管理者アカウントのパスワードを変更する際には、サーバー上で下記のコマンド(`reset-admin-password`サブコマンドによる`couchbase-cli`)を実行する必要があります。

```
couchbase-cli reset-admin-password [--regenerate] [--new-password <password>]
    [--port <port>]
```

## 外部アクセシビリティ管理

ユーザーは、パスワードを指定する必要のない外部ユーザーとしてクラスターに追加することもできます。外部ユーザーは外部システムで認証されます。
外部システムによるアクセシビリティ管理としては、次のいずれかが用いられます。これらは、CouchbaseServerのEnterprise Editionでのみ利用可能です。

- LDAP（ライトウェイト・ディレクトリ・アクセス・プロトコル）
- PAM（プラガブル認証モジュール）フレームワーク


## Webコンソールでの認証
Couchbase Webコンソールへのログインがデフォルトのポート8091によるhttpアクセスで実行されている場合、指定されたユーザー名とパスワードが平文で渡されます。

必要に応じて、セキュアなアクセス（ポート18091によるhttpsアクセス）を利用するように構成し、ユーザー名とパスワードが暗号化された形式で渡されるようにすることができます。

## アプリケーションの認証

アプリケーションから資格情報を渡すには、Simple Authentication and Security Layer（SASL）フレームワークによって提供される4つのメカニズムのいずれかを使用する必要があります。SCRAMメカニズムにより、保護された形式でのみパスワードを送信することにより、アプリケーションは安全に認証できます。SHAベースのハッシュ関数をサポートするには、ドライバーの更新が必要になる場合があります。

このパスワード認証メカニズムには、次の方式があります（強度による昇順）。

- PLAIN：クライアントは暗号化されていない形式でパスワードを送信します。すべてのクライアントがこの認証方法をサポートしています。これは安全ではなく、送信中にパスワードが盗まれるのを防ぐことはできません。

- SCRAM-SHA1：160ビットのキーを使用します。

- SCRAM-SHA256：SHA2と呼ばれるハッシュ関数のグループの1つである、256ビットのキーを使用します。

- SCRAM-SHA512：SHA2グループの別のハッシュ関数であるSCRAM-SHA512は、512ビットのキーを使用します。サポートされている最も強力な認証プロトコルです。

最初のクライアントサーバーネゴシエーションでは、クライアント(アプリケーション)とサーバー（Couchbase）のOSの両方のOSでサポートされている最も強力な認証プロトコルが選択されます。たとえば、クライアントがPLAINプロトコルのみをサポートしている場合、PLAINプロトコルが使用されます。ただし、クライアントがSCRAM-SHA1プロトコルもサポートしている場合は、SCRAM-SHA1が使用されます。

チャレンジレスポンス方式は、暗号化されたチャネルと暗号化されていないチャネルの両方を介して送信できます。

SCRAMチャレンジ/レスポンスプロトコルは、パスワード検証のプロセスのみを認証することに注意してください。後続のセッションを保護するには、TLSを使用する必要があります。

## 証明書ベースの認証
Couchbase Serverは、クライアント認証のためのx.509証明書の使用をサポートしています。

証明書ベースの認証は、認証局（CA）に依存してIDを検証し、証明書を発行します。証明書には、識別したエンティティの名前、有効期限、証明書を発行したCAの名前、発行したCAのデジタル署名などの情報が含まれています。

# SASL

SCRAMは、Salted Challenge Response Authentication Mechanismの略称です。
これによって、「burute force」攻撃や、「man in the middle」攻撃を防ぐことができます。

SCRAM SHA 512が、Couchbase SDKの標準の認証方式です。

# LDAP

LDAPの設定は、Web管理コンソールで行うことができます。他の方法として、下記のようにCLIを使って設定することも可能です。

```
couchbase-cli setting-ldap -c 127.0.0.1:8091 -u Administrator -p --hosts ldap.forumsys.com
--encryption startTLS
--server-cert validation 0
--bind-dn "cn=read-only-admin,dc=example,dc=com"
–-bind-password password
--user-dn-query "dc=example,dc=com??one?(uid=%u)"
--authentication-enabled 1
--authorization-enabled 1
--group-query "dc=example,dc=com??one?(uniquemember=%D)"

```
設定の表示。
```
couchbase-cli setting-ldap -c 127.0.0.1:8091 -u Administrator -p --get
```

# パスワードポリシー設定

```
couchbase-cli setting-password-policy
--cluster http://localhost:8091 -u Administrator
–p password --set --min-length 8 --uppercase
--lowercase --digits --special-chars
```
###  デフォルトポリシー
```JSON
{
"enforceDigits ": false ,
"enforceLowercase ": false ,
"enforceSpecialChars ": false ,
"enforceUppercase ": false ,
"minLength ": 6
}
```

# 参考情報

## Couchbase Server

### 証明書概要
[Certificates](https://docs.couchbase.com/server/current/learn/security/certificates.html)

### クライアント/サーバー証明書管理

[Manage Certificates](https://docs.couchbase.com/server/current/manage/manage-security/manage-certificates.html)

### SASL
[Configureing saslauthd](https://docs.couchbase.com/server/current/manage/manage-security/configure-saslauthd.html)

## SASL
[Cyrus SASL Library, version 2](http://www.sendmail.org/~ca/email/cyrus2/)

## PAM
[Linux JF (Japanese FAQ) Projectによる解説](https://linuxjf.osdn.jp/JFdocs/User-Authentication-HOWTO/pam.html)