セキュアなOracle NoSQLストアのデプロイおよび構成
セキュアなアクセスを実現するために、Oracle NoSQLストアをデプロイおよび構成する方法は多数あります。この項では、このようなストアをデプロイおよび構成するために実行できる、特定の一連のステップを1つ示します。その他の方法は、セキュリティ・ガイドのセキュリティ構成を参照してください。
さらに、デプロイされたストアは、Sheildを使用したセキュアなElasticsearchからのセキュアなElasticsearchクラスタと通信する必要があるため、この項では、ストアとクラスタで必要な秘密鍵と公開証明書を生成してインストールしてセキュアな通信を実現する方法についても示します。
ここに示された方法を選択するか、セキュリティ・ガイドに記載されている他の方法の1つを選択するかにかかわらず、セキュアなデプロイメントおよびセキュアなElasticsearchクラスタとの通信を実現するためにOracle NoSQLストアを構成する際は次の前提および要件が適用されます。
セキュアなOracle NoSQLストアに関する前提
- Oracle NoSQL Databaseディストリビューションは、ディレクトリ
/opt/ondb/kv
にインストールされています。 - ストアをホストする、それぞれkvhost1、kvhost2および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以上を使用して、ストアの各ノードで次のコマンドを実行します。
kvhost1、kvhost2および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
ノート:
kvhost1、kvhost2および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.login、FTS.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への全文検索公開証明書のインストールを参照してください。