セキュアなOracle NoSQLストアのデプロイおよび構成

セキュアなアクセスを実現するために、Oracle NoSQLストアをデプロイおよび構成する方法は多数あります。この項では、このようなストアをデプロイおよび構成するために実行できる、特定の一連のステップを1つ示します。その他の方法は、セキュリティ・ガイドセキュリティ構成を参照してください。

さらに、デプロイされたストアは、Sheildを使用したセキュアなElasticsearchからのセキュアなElasticsearchクラスタと通信する必要があるため、この項では、ストアとクラスタで必要な秘密鍵と公開証明書を生成してインストールしてセキュアな通信を実現する方法についても示します。

ここに示された方法を選択するか、セキュリティ・ガイドに記載されている他の方法の1つを選択するかにかかわらず、セキュアなデプロイメントおよびセキュアなElasticsearchクラスタとの通信を実現するためにOracle NoSQLストアを構成する際は次の前提および要件が適用されます。

セキュアなOracle NoSQLストアに関する前提

  • Oracle NoSQL Databaseディストリビューションは、ディレクトリ/opt/ondb/kvにインストールされています。
  • ストアをホストする、それぞれkvhost1kvhost2およびkvhost3という名前の3つのノードがあります。
  • ストアは、3のレプリケーション係数(rf)でデプロイされ、mystoreという名前が付けられます。
  • ポート5000をリスニングする管理サービスが、ストアの各ノードにデプロイされます。
  • 高可用性のサポートに使用されるポートの範囲(harange)は、ポート5002から5007までです。
  • CPUおよびメモリーの数のデフォルト値(num_cpus 0およびmemory_mb 0)で、ストア・ホストごとに1つのストレージ・ノード(SN)がデプロイされます(容量1)。
  • ストアで管理されるシャード(レプリケーション・グループ)のコンテンツは、ストアの各ノードのストレージ・ディレクトリ/disk1/shardにあります。ここで、各ストレージ・ディレクトリに指定されるサイズは、1GB (1,000,000,000バイト)です。
  • 便宜上、ストアのキーストアとトラストストアにアクセスするために、ストアがパスワードを格納および取得するために使用するパスワード・マネージャは、Oracle Wallet (Enterprise Editionのみで使用可能)ではなく、パスワード・ファイル(Oracle NoSQL Databaseのすべてのエディションで使用可能)です。
  • わかりやすくするために、すべてのパスワードはNo_Sql_00に設定されています。
  • ストアによって生成される公開鍵と秘密鍵のペアで使用され、ストアとのセキュアな通信のためにElasticsearchに指定される別名の名前は、FTSです。ElasticsearchがFTS以外の別名を持つ証明書を提示することでストアからのリクエストに応答した場合、セキュアなストアとの通信は失敗するため、このことは必須となります。
  • 管理権限を持つユーザーが、ストアのアクセス制御リストにプロビジョニングされます。このユーザーに指定される名前はFTSで、ストアがElasticsearch用に生成する鍵ペアの別名と同じです。ユーザー名は別名と同じである必要はありませんが、一貫性を保ち、混乱を避けるためにその値が指定されています。

セキュア・デプロイメントおよびElasticsearch通信のためのストア・ブート・ノードのプロビジョニング

この項で示されるコマンドはすべて、ストアの最初の(ブート)ノード(例: kvhost1)に対してのみ実行されます。前に示した前提を使用して、セキュリティを確保してデプロイされるストアのブート・ノードをプロビジョニングするとき、次のコマンドを最初に実行します。

kvhost1の場合

export JAVA_HOME=/opt/java/java8  [if necessary]

java -jar /opt/ondb/kv/lib/kvstore.jar makebootconfig 
  -root /opt/ondb/kvroot 
  -config config.xml 
  -port 5000 
  -host kvhost1 
  -harange 5002,5007 
  -capacity 1 
  -num_cpus 0 
  -memory_mb 0 
  -storagedir /disk1/shard 
  -storagedirsize 1000000000 
  -store-security configure 
  -pwdmgr pwdfile 
  -kspwd No_Sql_00

前述のコマンドでは、ストアのブート・ノードkvhost1にセキュリティ・ディレクトリ/opt/ondb/kvroot/securityが作成され、ストアのキーストア(store.keys)やトラストストア(store.trust)などのセキュリティ・アーティファクトが移入されます。便宜上、ストアへのセキュアなアクセスのために、クライアントに配布可能なアーティファクト(client.trustおよびclient.security)も作成します。前述のコマンドを実行したら、セキュリティ・ディレクトリに次のファイルが表示されます。

ls /opt/ondb/kvroot/security 
  store.trust 
  client.trust 
  client.security 
  security.xml 
  store.keys 
  store.passwd

セキュアなストアをデプロイするには前述のコマンドが必要ですが、Sheildを使用したセキュアなElasticsearchからのElasticsearchクラスタとのセキュアな通信を実現するには、十分ではありません。Elasticsearchとのセキュアな通信を容易にするために、別名FTSを持つ公開鍵と秘密鍵のペアを生成して、ストアのキーストアにインストールする必要があります。たとえば、

kvhost1の場合

keytool -genkeypair 
  -alias FTS 
  -keystore /opt/ondb/kvroot/security/store.keys 
  -keyalg RSA 
  -keysize 2048 
  -validity 1712 
  -storepass No_Sql_00 
  -keypass No_Sql_00 
  -dname CN=FTS,OU=nosql.org,L=nosql.city,S=nosql.state,C=US 
  -ext san=dns:localhost,dns:eshost1,dns:eshost2,dns:eshost3,
          dns:kvhost1,dns:kvhost2,dns:kvhost3

前述の鍵ペアを生成したら、その鍵ペアの公開証明書をキーストアからエクスポートする必要があります。ElasticsearchクラスタのノードがNoSQLストアとセキュアに通信するためには、Elasticsearchノードから、ストアにこの証明書が送信される必要があります。したがって、次のexportコマンドで生成された証明書は、最終的にElasticsearchクラスタの各ノードにインストールされます。Elasticsearchへの全文検索公開証明書のインストールを参照してください。kvhost1で、次を実行します。

keytool -export 
  -alias FTS 
  -keystore /opt/ondb/kvroot/security/store.keys 
  -storepass No_Sql_00 
  -file /opt/ondb/kvroot/security/FTS.crt

このコマンドによって作成されるFTS公開証明書は、ノードがストアとの通信を試みるときに、各ElasticsearchノードによってOracle NoSQLストアに提示する必要がありますが、ストアは、Elasticsearchノードの公開証明書を提示する必要もあります。これは、ElasticsearchとOracle NoSQLの間のセキュアな通信のモデルには、相互認証が必要であるためです。そのため、Sheildを使用したセキュアなElasticsearchの各Elasticsearchノードで作成された公開証明書を取得して、ストアのトラストストアにインストールする必要があります。たとえば、

scp <username>@eshost1:/opt/es/install-xfer/certs/elasticsearch-eshost1.crt /opt/ondb/kvroot/security
scp <username>@eshost2:/opt/es/install-xfer/certs/elasticsearch-eshost2.crt /opt/ondb/kvroot/security
scp <username>@eshost3:/opt/es/install-xfer/certs/elasticsearch-eshost3.crt /opt/ondb/kvroot/security

keytool -importcert 
  -alias elasticsearch-eshost1 
  -file /opt/ondb/kvroot/security/elasticsearch-eshost1.crt 
  -keystore /opt/ondb/kvroot/security/store.trust 
  -storepass No_Sql_00 
  -keypass No_Sql_00 
  -noprompt

keytool -importcert 
  -alias elasticsearch-eshost2 
  -file /opt/ondb/kvroot/security/elasticsearch-eshost2.crt 
  -keystore /opt/ondb/kvroot/security/store.trust 
  -storepass No_Sql_00 
  -keypass No_Sql_00 
  -noprompt

keytool -importcert 
  -alias elasticsearch-eshost3 
  -file /opt/ondb/kvroot/security/elasticsearch-eshost3.crt 
  -keystore /opt/ondb/kvroot/security/store.trust 
  -storepass No_Sql_00 
  -keypass No_Sql_00 
  -noprompt

この時点で、ストアのブート・ノードはセキュア・デプロイメントを実現するために構成され、そのセキュリティ・ディレクトリは、Sheildを使用したセキュアなElasticsearchからのElasticsearchクラスタとの通信を実現するために、必要なセキュリティ・アーティファクトを使用してプロビジョニングされています。

プロビジョニング・プロセスの最後のステップでは、ブート・ノードで作成された同じセキュリティ・アーティファクトを、ストアの残りの各ノードにインストールします。これを行うには、単に、ブート・ノードのセキュリティ・ディレクトリを、これらの他の各ノードにコピーします。たとえば、ブート・ノードがkvhost1の場合、そのノードから次のようなコマンドを実行します。

scp -r /opt/ondb/kvroot/security <username>@kvhost2:/opt/ondb/kvroot
scp -r /opt/ondb/kvroot/security <username>@kvhost3:/opt/ondb/kvroot

セキュリティを確保するためのストアの残りの非ブート・ノードの構成

ストアのブート・ノードのセキュリティが構成され、ストア内のすべてのノードのセキュリティ・ディレクトリが前の項の説明に従って完全にプロビジョニングされたら、ストアの残りの(非ブート)ノードのセキュリティも構成する必要があります。これを行うには、Java 8以上を使用して、残りの各ノードに対して、それぞれ次のコマンドを実行します。

kvhost2の場合

java -jar /opt/ondb/kv/lib/kvstore.jar makebootconfig 
  -root /opt/ondb/kvroot 
  -config config.xml 
  -port 5000 
  -host kvhost2 
  -harange 5002,5007 
  -capacity 1 
  -num_cpus 0 
  -memory_mb 0 
  -storagedir /disk1/shard 
  -storagedirsize 1000000000 
  -store-security enable 
  -pwdmgr pwdfile

kvhost3の場合

java -jar /opt/ondb/kv/lib/kvstore.jar makebootconfig 
  -root /opt/ondb/kvroot 
  -config config.xml 
  -port 5000 
  -host kvhost3 
  -harange 5002,5007 
  -capacity 1 
  -num_cpus 0 
  -memory_mb 0 
  -storagedir /disk1/shard 
  -storagedirsize 1000000000 
  -store-security enable 
  -pwdmgr pwdfile

この時点でストアが構成され、セキュア・デプロイメントを実現するために完全にプロビジョニングされています。次の項で、これがどのように実現するかについて説明します。

NoSQLストアの各ノードの起動

Java 8以上を使用して、ストアの各ノードで次のコマンドを実行します。

kvhost1kvhost2およびkvhost3

java -jar /opt/ondb/kv/lib/kvstore.jar start 
  -root /opt/ondb/kvroot 
  -config config.xml

セキュアなNoSQLストアのデプロイ

前に示した前提に基づいてOracle NoSQLストアをデプロイするには、Oracle NoSQL管理CLIからスクリプトとして実行できる次のOracle NoSQL管理コマンドを含むテキスト・ファイルを最初に作成します。

configure -name mystore
plan deploy-zone -name zn1 -rf 3 -wait

plan deploy-sn -znname zn1 -host kvhost1 -port 5000 -wait
plan deploy-admin -sn 1 -wait
pool create -name snpool
pool join -name snpool -sn sn1

plan deploy-sn -znname zn1 -host kvhost2 -port 5000 -wait
plan deploy-admin -sn 2 -wait
pool join -name snpool -sn sn2

plan deploy-sn -znname zn1 -host kvhost3 -port 5000 -wait
plan deploy-admin -sn 3 -wait
pool join -name snpool -sn sn3

change-policy -params "loggingConfigProps=oracle.kv.level=INFO;"

topology create -name snlayout -pool snpool -partitions 300
plan deploy-topology -name snlayout -plan sndeploy -wait

execute "CREATE USER root IDENTIFIED BY 'No_Sql_00' ADMIN";

ADMIN権限を持つrootという名前のユーザーが、ストアのデプロイ時に作成されることに注意してください。そのユーザーは、ストアのアクセス制御リスト(ACL)に別のユーザーを追加するために使用されます。たとえば、前述のFTSというユーザーを追加します。

前述のコマンド・ファイルを作成したら、管理CLIを起動し、そのファイルをロードしてストアをデプロイします。たとえば、コマンドがファイル/tmp/deploy-secure-store.cmdsに格納されているとします。その場合、次を実行してストアをデプロイします。

kvhost1の場合

java -jar /opt/ondb/kv/lib/kvstore.jar runadmin 
  -host kvhost1 
  -port 5000 
  -security /opt/ondb/kvroot/security/client.security

  Logged in admin as anonymous
  Connected to Admin in read-only mode

kv-> load -file /tmp/deploy-secure-store.cmds

  Connected to Admin in read-only mode
  Store configured: mystore
  ....
  Created: snlayout
  Executed plan 13, waiting for completion...
  Plan 13 ended successfully
  Statement completed successfully

kv-> exit

ノート:

kvhost1kvhost2およびkvhost3のクロックは(デフォルトでは2秒以内の差で)同期化する必要があります。そうでない場合、ストアのデプロイメントは失敗します。同期化されていないクロックが原因でデプロイメントに失敗したかどうかを判断するには、影響を受けるノードの管理ログ/opt/ondb/kvroot/mystore/log/adminN_0.logを確認します。

rootユーザーのプロビジョニング

ストアのデプロイメント中に作成されたrootという名前のユーザーをプロビジョニングするには、次を実行します。

kvhost1の場合

java -jar /opt/ondb/kv/lib/kvstore.jar securityconfig pwdfile create 
  -file /opt/ondb/kvroot/security/root.passwd

java -jar /opt/ondb/kv/lib/kvstore.jar securityconfig pwdfile secret 
  -file /opt/ondb/kvroot/security/root.passwd -set -alias root

  Enter the secret value to store: No_Sql_00
  Re-enter the secret value for verification: No_Sql_00

作成したばかりのrootユーザーとして管理CLIにアクセス(ログイン)するために使用できるプロパティ・ファイルを作成します。このファイルには、ストアに対してセキュリティのためのプロビジョニングが最初に実行されたときに生成されるデフォルトのclient.securityファイルと同じエントリが、rootユーザー固有のユーザー名およびパスワード・ファイルを指定するエントリとともに含まれている必要があります。たとえば、

cp /opt/ondb/kvroot/security/client.security /opt/ondb/kvroot/security/root.login

echo oracle.kv.auth.username=root >> /opt/ondb/kvroot/security/root.login
echo oracle.kv.auth.pwdfile.file= 
/opt/ondb/kvroot/security/root.passwd >> /opt/ondb/kvroot/security/root.login

セキュアなElasticsearchでのデータの索引付けのためのFTSユーザーの作成およびプロビジョニング

本番システムでは、通常、rootユーザーを使用して、Oracle NoSQLストアに表とセカンダリ索引を作成して移入することも、Elasticsearchクラスタにテキスト索引を作成して移入することもありません。かわりに、通常、rootユーザーを使用して、Elasticsearchでデータに索引付けするなどの特定のタスクに固有のロールを持つ、ストアの他のクライアント・ユーザーを作成します。

この例では、FTSという名前のユーザーが作成され、表の作成と移入に必要な権限およびElasticsearchでの表のデータの索引付けに必要な権限が付与されます。これを行うには、最初に、次のようなエントリが含まれた管理CLIコマンド・ファイルを作成する必要があります。

execute 'CREATE ROLE ftsadmin'
execute 'GRANT SYSDBA TO ftsadmin'
execute 'GRANT READ_ANY TO ftsadmin'
execute 'GRANT WRITE_ANY TO ftsadmin'
execute 'CREATE USER FTS IDENTIFIED BY "No_Sql_00"'
execute 'GRANT ftsadmin TO USER FTS'
execute 'GRANT SYSADMIN TO USER FTS'

次に、そのコマンド・ファイルへのパスが/tmp/create-user-FTS.cmdsであると仮定した場合、管理CLIにrootユーザーとしてログインし、コマンド・ファイルをロードすることで、ユーザーを作成します。たとえば、

kvhost1の場合

java -jar /opt/ondb/kv/lib/kvcli.jar runadmin 
  -host kvhost1 
  -port 5000 
  -store mystore 
  -security /opt/ondb/kvroot/security/root.login

  Logged in admin as root

kv-> load -file /tmp/create-user-FTS.cmds

  Statement completed successfully
  Statement completed successfully
  ....

kv-> exit

作成したばかりのFTSユーザーのプロビジョニングを完了するには、そのユーザーのパスワード・ファイルを作成し、データのロードおよび索引付けに使用するクライアント・ノードのディレクトリ(/tmpなど)にインストールする必要があります。完全性(および利便性)のために、rootユーザーの場合と同様の方法で、ユーザーFTSとしての管理CLIへのログインに使用できるプロパティ・ファイルも作成する必要があります。たとえば、

kvhost1の場合

java -jar /opt/ondb/kv/lib/kvstore.jar 
  securityconfig pwdfile create 
  -file /tmp/FTS.passwd

java -jar /opt/ondb/kv/lib/kvstore.jar 
  securityconfig pwdfile secret 
  -file /tmp/FTS.passwd 
  -set 
  -alias FTS

  Enter the secret value to store: No_Sql_00
  Re-enter the secret value for verification: No_Sql_00

cp /opt/ondb/kvroot/security/client.security /tmp/FTS-client.login

echo oracle.kv.auth.username=FTS >> /opt/ondb/kvroot/security/FTS-client.login
echo oracle.kv.auth.pwdfile.file=/tmp/FTS.passwd >> /tmp/FTS-client.login

cp /opt/ondb/kvroot/security/client.trust /tmp

前述の3つのアーティファクト(FTS-client.loginFTS.passwdおよびclient.trust)が作成され、kvhost1/tmpディレクトリにインストールされると、これらを任意のクライアントにインストールできます。たとえば、

scp /tmp/FTS-client.login <username>@clhost1:/tmp
scp /tmp/FTS.passwd <username>@clhost1:/tmp
scp /tmp/client.trust <username>@clhost1:/tmp

この時点で、ストアは完全にデプロイされ、Elasticsearchクラスタと対話する準備ができています。

例を実行する前に残されている唯一のことは、各ElasticsearchノードのトラストストアにOracle NoSQLストアの公開証明書(alias=FTS)をインストールすることです。Elasticsearchへの全文検索公開証明書のインストールを参照してください。