セキュア・ストアのデプロイ

『セキュリティ・ガイド』には、セキュア・アクセスに対応するOracle NoSQL Databaseストアのデプロイおよび構成のための複数の方法が示されています。便宜上、この項では、このようなストアをデプロイおよび構成するために実行できるステップの1つについて説明します。ここに示す手法と『セキュリティ・ガイド』に示す別の手法のどちらを使用するにしても、このドキュメントに示すサンプルのセキュア形式を実行するには、セキュア・ストアをデプロイして構成しておく必要があります。次に示す各ステップについては、非セキュア・ケースの前提条件に加えて、次の事項も前提としています。

  • 便宜上、ストアがキーストアとトラストストアへのアクセスに必要なパスワードを格納および取得するために使用するパスワード・マネージャは、Oracle NoSQL DatabaseのEnterprise Editionでのみ使用可能なOracle Walletではなく、パスワード・ファイルとします。
  • わかりやすくするために、すべてのパスワードは値No_Sql_00に設定されています。
  • ストアにアクセスするユーザーの名前はexample-userです。

前述の前提のもとに、セキュア・ストアは次のステップに従ってデプロイできます。この所定の前提による各項目は、対象の環境に固有の相応する値に置き換える必要があります。

各ストレージ・ノード(SN)の構成ファイルの生成

kv-host-1で、次のコマンドを実行し、プロンプトが表示されたときには適切な応答を入力します。

java -jar /opt/oracle/kv-ee/lib/kvstore.jar \
    makebootconfig \
    -root /u01/nosql/sn1/kvroot \
    -config config.xml \
    -port 5000 \
    -host kv-host-1 \
    -harange 5002,5007 \
    -num_cpus 0 \
    -memory_mb 200 \
    -capacity 1 \
    -storagedir /u01/nosql/sn1/data \
    -storagedirsize 10000000 \
    -store-security configure \
    -pwdmgr pwdfile \
    -kspwd No_Sql_00

Enter a password for the Java KeyStore: No_Sql_00<RETURN>
Re-enter the KeyStore password for verification: No_Sql_00<RETURN>

Created files
    /u01/nosql/sn1/kvroot/security/store.trust
    /u01/nosql/sn1/kvroot/security/store.keys
    /u01/nosql/sn1/kvroot/security/store.passwd
    /u01/nosql/sn1/kvroot/security/client.trust
    /u01/nosql/sn1/kvroot/security/security.xml
    /u01/nosql/sn1/kvroot/security/client.security

前述のコマンドの-store-securityパラメータに値configureを指定すると、ストアのノードとストアのクライアントが安全に通信するために必要なセキュリティ・アーティファクト(ファイル)が生成されます。各アーティファクトはストアのその他のノードにインストールする必要がありますが、ストアにアクセスするクライアント・ノードにはclient.trustアーティファクトのみをインストールする必要があります。

前述のすべてのアーティファクトをストアのその他の各ノードにインストールするには、各ノードにログインして、適切なKVROOTディレクトリを作成し、scpなどのユーティリティを使用して、kv-host-1からセキュリティ・ディレクトリを特定のノードのKVROOTディレクトリにコピーします。つまり、次のようにします。

On kv-host-2:
mkdir -p /u02/nosql/sn2/kvroot
cd /u02/nosql/sn2/kvroot
scp -r <username>@kv-host-1:/u01/nosql/sn1/kvroot/security .

On kv-host-3:
mkdir -p /u03/nosql/sn3/kvroot
cd /u03/nosql/sn3/kvroot
scp -r <username>@kv-host-1:/u01/nosql/sn1/kvroot/security .

クライアント・ノードにclient.trustファイルをインストールするには、クライアント・ノードにログインして、kv-host-1ノードから目的のファイルを単にコピーします。つまり、次のようにします。

On client-host:
scp <username>@kv-host-1:\ 
    /u01/nosql/sn1/kvroot/security/client.trust /tmp

kv-host-1で生成したセキュリティ・アーティファクトがストアのその他の各ノードにインストールされると、その他のノードにデプロイするストレージ・ノードの構成ファイルを生成できるようになります。そうするために、それぞれのノードで次のコマンドを実行します。

On kv-host-2:
java -jar /opt/oracle/kv-ee/lib/kvstore.jar \
    makebootconfig \
    -root /u02/nosql/sn2/kvroot \
    -config config.xml \
    -port 5000 \
    -host kv-host-1 \
    -harange 5002,5007 \
    -num_cpus 0 \
    -memory_mb 200 \
    -capacity 1 \
    -storagedir /u02/nosql/sn2/data \
    -storagedirsize 10000000 \
    -store-security enable \
    -pwdmgr pwdfile \
    -kspwd No_Sql_00

On kv-host-3:
java -jar /opt/oracle/kv-ee/lib/kvstore.jar makebootconfig \
    -root /u03/nosql/sn3/kvroot \
    -config config.xml \
    -port 5000 \
    -host kv-host-1 \
    -harange 5002,5007 \
    -num_cpus 0 \
    -memory_mb 200 \
    -capacity 1 \
    -storagedir /u03/nosql/sn3/data \
    -storagedirsize 10000000 \
    -store-security enable \
    -pwdmgr pwdfile \
    -kspwd No_Sql_00

この両方のコマンドでは、-store-securityパラメータに指定した値が、kv-host-1で構成を生成したときに指定していたconfigureではなく、enableになっている点に注意してください。

ストアを構成する各ホストでのストレージ・ノード・エージェント(SNA)の起動

各ホストのコマンドラインから、次のようなコマンドを入力します。

nohup java -jar /opt/oracle/kv-ee/lib/kvstore.jar start \
    -root /u0<n>/nosql/sn<n>/kvroot -config config.xml &

このトークン<n>は、前述のコマンドを実行した特定のホストに関連付けられた整数に対応します。

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

ホストkv-host-1のコマンドラインから、ブートSNAに接続されている管理CLIを起動します。

java -jar /opt/oracle/kv-ee/lib/kvstore.jar runadmin \
    -helper-hosts kv-host-1:5000,kv-host-2:5000,kv-host-3:5000 \
    -security /u01/nosql/sn1/kvroot/security/client.security

次に、管理CLIのコマンド・プロンプトから、次に示す各コマンドを連続して入力するか、それらと同じコマンドをファイルからロードするload -file <file>コマンドを使用して、ストアをデプロイします。

configure -name example-store
plan deploy-zone -name zn1 -rf 3 -wait

plan deploy-sn -znname zn1 -host kv-host-1 -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 kv-host-2 -port 5000 -wait
plan deploy-admin -sn 2 -wait
pool join -name snpool -sn sn2

plan deploy-sn -znname zn1 -host kv-host-3 -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 store-layout -pool snpool -partitions 120
topology preview -name store-layout
plan deploy-topology -name store-layout -plan-name deploy-plan -wait

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

ノート:

非セキュア・ストアについての付録「非セキュア・ストアの構成およびデプロイ」に示したストアのデプロイメント・コマンドのセットと、ここに示したコマンドでは、最後のコマンドのみが異なっています。ストアのデプロイ後に、その最後のコマンドによって、rootという名前のストア・ユーザーが作成されます。このユーザーには管理権限あり、パスワードはNo_Sql_00の値と同じになります。

セキュア・ストアがデプロイされている場合は、ストアの使用前に初期ユーザーを作成して、そのユーザーにストアの管理を許可するために必要なセキュリティ資格証明をプロビジョニングする必要があります。そのユーザーの作成およびプロビジョニング後に、そのユーザーを使用して、ストアの別のユーザーを作成できます。一般的な本番運用シナリオでは、通常、表の作成とデータの移入は管理権限ではなくユーザー・レベルの権限を持つユーザーが実行します。

前述の最後のコマンドでは、このドキュメントに示したセキュア・バージョンのサンプル・プログラムを実行する2番目のユーザーの作成に使用するだけの初期ユーザーを作成します。ただし、そのrootユーザーがストアの別のユーザーを作成できるようにするには、次の項で説明するように、最初にプロビジョニングしておく必要があります。

セキュア・ストアの管理ユーザー(root)のプロビジョニング

前の項で説明したように、セキュア・ストアのデプロイメント・プロセスの最後のステップでは、ストアの管理ユーザーを作成するだけでプロビジョニングはしていません。ただし、ストアを管理するには、そのストアに対する管理権限を付与する資格証明で新しいユーザーをプロビジョニングする必要があります。前の項で作成したrootユーザーをプロビジョニングするには、ストアのkv-host-1ノードにログインし、ここに示すコマンドを実行して、プロンプトが表示されたら適切な応答を入力します。

java -jar /opt/oracle/kv-ee/lib/kvstore.jar \
    securityconfig pwdfile create \
    -file /u01/nosql/sn1/kvroot/security/root.passwd

Created

java -jar /opt/oracle/kv-ee/lib/kvstore.jar \
    securityconfig pwdfile secret \
    -file /u01/nosql/sn1/kvroot/security/root.passwd \
    -set -alias root

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

Secret created
OK

cp /u01/nosql/sn1/kvroot/security/client.security \
    /u01/nosql/sn1/kvroot/security/root.login

echo oracle.kv.auth.username=root >> \
    /u01/nosql/sn1/kvroot/security/root.login
echo oracle.kv.auth.pwdfile.file=\
    /u01/nosql/sn1/kvroot/security/root.passwd >> \
    /u01/nosql/sn1/kvroot/security/root.login

client.securityプロパティ・ファイルは、付録「ストレージ・ノード(SN)ごとの構成ファイルの生成」で生成したセキュリティ・アーティファクトのうちの1つです。このファイルの内容をroot.loginというファイルにコピーします。ここで作成したroot.loginファイルは、セキュア・ストアに接続するクライアントがrootという名前のユーザーとして認証する必要がある場合に使用されます。このドキュメントでは、この認証プロセスをセキュア・ストアへのログインと呼びます。そのため、その認証プロセスで使用されるプロパティ・ファイルは、ログイン・ファイルまたはログイン・プロパティ・ファイルと呼ばれます。

便宜上、システム・プロパティの oracle.kv.auth.usernameoracle.kv.auth.pwdfile.fileは、root.loginファイルに挿入します。これにより、これらのプロパティの値をコマンドラインで指定することなく、クライアントはrootユーザーとしてセキュア・ストアに接続できます。

非管理ユーザーの作成

非管理権限でプロビジョニングされるユーザーを作成するために、ストアのkv-host-1ノードから、新しく作成したrootユーザーとして管理CLIにログインします。

java -jar /opt/oracle/kv-ee/lib/kvstore.jar runadmin \
    -host kv-host-1 \
    -port 5000 \
    -security /u01/nosql/sn1/kvroot/security/root.login

その後で、ユーザーがストア内の表を作成および移入するために必要な権限で構成されるカスタム・ロールをreadwritemodifytablesという名前で作成します(この名前は例です)。目的のロールの作成後に、example-userという名前のユーザーを作成して、そのユーザーにreadwritemodifytablesロールを付与します。そうするには、次に示す各コマンドを連続して入力するか、各コマンドをテキスト・ファイルにコピーして作成したファイルを指定してCLIのloadコマンドを実行します('load -file <file>')。

execute 'CREATE ROLE readwritemodifytables'
execute 'GRANT SYSDBA TO readwritemodifytables'
execute 'GRANT READ_ANY TO readwritemodifytables'
execute 'GRANT WRITE_ANY TO readwritemodifytables'
execute 'CREATE USER example-user IDENTIFIED BY "No_Sql_00"'
execute 'GRANT readwritemodifytables TO USER example-user'

ノート:

前述の手順で作成したユーザーの名前は、サンプルを実行するOSユーザー名と同じにする必要はありません。前述の名前とそれに関連付けられた資格証明は、ストアに対する認証のためにセキュア・ストアに登録されます。そのため、ここで作成するユーザーの名前には任意の値を使用できます。

セキュア・ストアの非管理ユーザー(example-user)のプロビジョニング

example-userというユーザーとそのユーザーのロールを作成したら、KVSecurityCreationコンビニエンス・プログラムを使用して、そのユーザーがセキュア・ストアに接続するために必要になるパブリック資格証明とプライベート資格証明を生成します。そのためには、まず、ストアのkv-host-1から次のコマンドを実行することで、KVSecurityCreationをコンパイルします。

cd /opt/oracle/nosql/apps/kv
javac -classpath \
    /opt/oracle/kv-ee/lib/kvstore.jar:examples \
    examples/hadoop/table/KVSecurityCreation.java

これにより、次のクラス・ファイルがkv-host-1ノードに生成されます。

/opt/oracle/nosql/apps/kv/examples/hadoop/table/
    KVSecurityUtil.class
    KVSecurityCreation.class

KVSecurityCreationはコンパイルの完了後に、非管理ユーザーに必要なセキュリティ・アーティファクトを生成するために実行できます。クリア・テキストのパスワード・ファイルにパスワードを格納する場合は、コマンドラインで次のように入力し、プロンプトが表示されたら適切な応答を入力します。

cd /opt/oracle/nosql/apps/kv
java -classpath \
    /opt/oracle/kv-ee/lib/kvstore.jar:\
    /opt/oracle/kv-ee/lib/sklogger.jar:\
    /opt/oracle/kv-ee/lib/commonutil.jar:examples \
    hadoop.table.KVSecurityCreation \
    -pwdfile example-user.passwd \
    -set -alias example-user

INFO: removed file [/tmp/example-user.passwd]
INFO: removed file [/tmp/example-user-client-pwdfile.login]
created login properties file [/tmp/example-user-client-pwdfile.login]
created login properties file [/tmp/example-user-server.login]
created credentials store [/tmp/example-user.passwd]

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

Secret created
OK

また、Oracle Wallet (Enterprise Editionでのみ使用可能)を使用してユーザーのパスワードを格納する場合は、次のように入力して、プロンプトが表示されたら適切な応答を入力します。

cd /opt/oracle/nosql/apps/kv
java -classpath \
    /opt/oracle/kv-ee/lib/kvstore.jar:\
    /opt/oracle/kv-ee/lib/sklogger.jar:\
    /opt/oracle/kv-ee/lib/commonutil.jar:examples \
    hadoop.table.KVSecurityCreation \
    -wallet example-user-wallet.dir \
    -set -alias example-user

INFO: removed file [/tmp/example-user-wallet.dir/cwallet.sso]
INFO: removed directory [/tmp/example-user-wallet.dir]
INFO: removed file [/tmp/example-user-client-wallet.login]
created login properties file [/tmp/example-user-client-wallet.login]
created login properties file [/tmp/example-user-server.login]
created credentials store [/tmp/example-user-wallet.dir]
   
Enter the secret value to store: No_Sql_00<RETURN>
Re-enter the secret value for verification: No_Sql_00<RETURN>

Secret created
OK

パスワード・ファイルを指定したときに生成されるアーティファクトと、ウォレットを指定したときに生成されるアーティファクトを比較してみます。パスワード・ファイルを指定したときには、次のファイルが示されます。

/tmp
    example-user-client-pwdfile.login
    example-user-server.login
    example-user.passwd

その一方で、ウォレットを指定したときには、次のファイルが示されます。

/tmp
    example-user-client-wallet.login
    example-user-server.login
    /example-user-wallet.dir
        cwallet.sso

ノート:

これはデモ目的の例であるため、KVSecurityCreationによって生成された資格証明ファイルは、システムの/tmpディレクトリに配置されています。目的のアプリケーションでは、生成する資格証明ファイルはパスワードが保護される永続的な場所に配置することが必要になる場合があります。

ノート:

パスワードの場合とウォレットの場合のどちらについても、クライアント側の接続用とサーバー側の接続用に1つずつ、2つのログイン・プロパティ・ファイルが生成されます。クライアント側ログイン・ファイルとサーバー側ログイン・ファイルの唯一の相違点は、クライアント側ログイン・ファイルでは、ユーザー名(別名)とユーザーのパスワードの場所を指定することです。パスワード・ファイルの使用に関連付けられるログイン・プロパティ・ファイルでは、ユーザーのパスワードを格納するファイルの場所を指定するためにプロパティoracle.kv.auth.pwdfileが使用されます。その一方で、パスワードをOracle Walletに格納する場合は、プロパティoracle.kv.auth.wallet.dirが使用されます。オプションではありますが、2つのログイン・ファイルを使用する理由は、サーバー側にプライベート・セキュリティ情報を渡さないようにすることです。詳細は、付録「セキュア・クライアントのビルドおよびパッケージ化のためのモデル」を参照してください。また、どちらの場合も、サーバー側のログイン・ファイル(example-user-server.login)は同じであることがわかります。これは、パスワードの格納にパスワード・ファイルとOracle Walletのどちらを使用するにしても、どちらも同じ公開されている通信トランスポート情報を使用するためです。

この時点で、ストアがデプロイされ、セキュア・アクセス用に構成され、表の作成とデータの移入に必要なユーザーおよび資格証明がプロビジョニングされています。セキュア・ストアに格納されている表データに対してMapReduceジョブを実行する方法を示すために、このドキュメントに示すサンプルは、パスワードがクリア・テキストのパスワード・ファイルまたはOracle Wallet (Enterprise Editionのみ)に格納されているユーザーが実行できるようになりました。

ノート:

最後の要点は、サンプル・アプリケーションのユーザー・パスワードに使用されるストレージのメカニズム(パスワード・ファイルまたはOracle Wallet)が、ストアで使用されるパスワード・ストレージのメカニズムに依存しないことです。つまり、この付録では(便宜上)、ウォレットではなくパスワード・ファイルを使用してセキュア・ストアをデプロイしましたが、ストアが管理するパスワードをパスワード・ファイルに配置しても、そのストアのクライアントの開発者/デプロイヤがクライアントのユーザー・パスワードをOracle Walletに格納することが妨げられることはありません(逆も同様です)。そのため、ユーザー・パスワードを格納して、ウォレットまたはパスワード・ファイルを所有するユーザーのみがアクセスできる安全な場所(安全な値)として、クライアント・アプリケーションによるOracle Walletまたはパスワード・ファイルの使用を評価する必要があります。つまり、パスワード・ストレージのメカニズムの選択は、ストア自体で使用されているメカニズムに関係なく、アプリケーション開発者/デプロイヤの判断に委ねられます。