セキュアなkvstoreでのプロキシの使用
プロキシの起動
次のステップを使用して、Oracle NoSQL Databaseプロキシをセキュアなkvstoreで開始できます。
- セキュアなプロキシ接続がブートストラップされる必要があります。プロキシを起動する前に、プロキシでセキュリティ接続をブートストラップするためのブートストラップ・ユーザーをセキュアなkvstoreに作成する必要があります。SQLシェルで次のコマンドを実行すると、プロキシ用のブートストラップ・ユーザーが作成されます。SQLコマンドの使用を開始するには、開発者ガイドを参照してください。
sql-> CREATE USER <proxy_user> IDENTIFIED BY "<proxy_password>";
説明proxy_user
はユーザー名です。proxy_password
は、proxy_user
のパスワードです。
ノート:
ブートストラップ・ユーザーの場合、デフォルトの権限で十分です。管理権限やその他の追加権限をブートストラップ・ユーザーに付与することはお薦めしません。
ノート:
ブートストラップ・ユーザーには、ユーザーが任意の名前を指定できます。
- プロキシ関連ファイルを格納できるディレクトリ
./proxy
を作成します。 - ブートストラップ・ユーザー用に、次の情報を含むログイン・ファイル
./proxy/proxy.login
を作成します。
説明oracle.kv.auth.username=<proxy_user> oracle.kv.auth.pwdfile.file=proxy.passwd oracle.kv.transport=ssl oracle.kv.ssl.trustStore=client.trust
proxy.passwd
は、proxy_user
ユーザーのパスワード値を格納するファイルです。client.trust
は、kvstoreデプロイメントから取得した証明書信頼ファイルです。
kvstoreクライアント・マシンで
proxy.passwd
ファイルおよびclient.trust
ファイルを生成する方法の詳細は、リモート・アクセスでのセキュリティの構成を参照してください。この場合、プロキシはkvstoreクライアントとして実行されます。proxy.login
が正常に機能するには、これらのファイルが存在する必要があります。 - プロキシとドライバに対して
certificate.pem
ファイルおよびkey-pkcs8.pem
ファイルを作成し、セキュアな通信を構成および確立します。Javaドライバを使用する場合は、driver.trust
ファイルも生成する必要があります。セキュリティ・ガイドのOracle NoSQL Databaseプロキシの証明書と秘密キーの生成を参照してください。 - 次のコマンドを使用して、セキュアなkvstoreのプロキシを開始します。
説明java -jar lib/httpproxy.jar \ -storeName <kvstore_name> \ -helperHosts <kvstore_helper_host> \ [-hostname <proxy_host>] \ [-httpsPort <proxy_https_port>] \ -storeSecurityFile proxy/proxy.login \ -sslCertificate certificate.pem \ -sslPrivateKey key-pkcs8.pem \ -sslPrivateKeyPass <privatekey_password> \ [-verbose true]
kvstore_name
は、kvstoreデプロイメントから取得したkvstoreのストア名です。pingを参照してください。kvstore_helper_host
は、kvstoreデプロイメントから取得したkvstoreのヘルパー・ホスト:ポート・リストです。Javaダイレクト・ドライバ開発者ガイドのKVStoreハンドルの取得。proxy_host
は、プロキシ・サービスをホストするマシンのホスト名です。プロキシが起動されたマシン以外のマシンからプロキシにアクセスする場合は、プロキシを実行しているマシンのホスト名を指定します。このパラメータはオプションで、デフォルトはlocalhost
です。これは、プロキシはそのプロキシを実行しているマシンからのみ使用できることを意味します。proxy_https_port
は、プロキシがホスト・マシンでリクエストを監視しているポートです。これはオプションのパラメータで、デフォルトは443です。ノート:
ポート80を使用するには、マシンによっては追加の権限が必要になる場合があります。proxy.login
は、セキュアなkvstoreにアクセスするために前のステップで生成されたセキュリティ・ログイン・ファイルです。certificate.pem
は、前のステップで生成された証明書ファイルです。key-pkcs8.pem
は、前のステップで生成された秘密キー・ファイルです。privatekey_password
は、暗号化されたkey-pkcs8.pem
ファイルのパスワードです。
ノート:
プロキシ起動は、PKCS#8形式の秘密キー・ファイルのみを受け入れます。秘密キーがすでにPKCS#8にある場合は(-----BEGIN ENCRYPTED PRIVATE KEY-----または-----BEGIN PRIVATE KEY-----で始まる)、追加の変換は必要ありません。それ以外の場合は、OpenSSLを使用して変換を実行できます。
Javaドライバを使用したプロキシへの接続
Oracle NoSQL Database Javaドライバには、アプリケーションがOracle NoSQL Databaseプロキシと通信できるようにするjarファイルが含まれています。次のステップを使用して、プロキシに接続できます。
- プロキシを介してkvstoreにアクセスするためにアプリケーションで使用する、ドライバ用のユーザーを作成します。
ここで、sql-> CREATE USER <driver_user> IDENTIFIED BY "<driver_password>" sql-> GRANT READWRITE TO USER <driver_user>
driver_user
はユーザー名、driver_password
はdriver_user
ユーザーのパスワードです。この例では、driver_user
ユーザーにreadwrite
ロールが付与され、これにより、アプリケーションは読取り操作と書込み操作のみを実行できます。セキュリティ・ガイドの認可の構成を参照してください。ノート:
ユーザーが表または索引を作成、削除または変更する必要がある場合は、driver_user
にdbadmin
ロールが付与されている必要があります。これにより、アプリケーションはDDL操作を実行できます。sql-> GRANT DBADMIN TO USER <driver_user>
- Oracle NoSQL Database Javaドライバをアプリケーションのクラスパスにインストールし、次のコードを使用してプロキシに接続します。
説明String endpoint = "https://<proxy_host>:<proxy_https_port>"; StoreAccessTokenProvider atProvider = new StoreAccessTokenProvider("<driver_user>","<driver_password>".toCharArray()); NoSQLHandleConfig config = new NoSQLHandleConfig(endpoint); config.setAuthorizationProvider(atProvider); NoSQLHandle handle = NoSQLHandleFactory.createNoSQLHandle(config);
proxy_host
は、プロキシ・サービスをホストするマシンのホスト名です。これは、以前に構成したプロキシ・ホストと一致する必要があります。proxy_https_port
は、プロキシがホスト・マシンでリクエストを監視しているポートです。これは、以前に設定したプロキシhttpsポートと一致する必要があります。driver_user
は、ドライバのユーザー名です。これは前のステップで作成したユーザーと一致する必要があります。driver_password
は、ドライバ・ユーザーのパスワードです。
- 次のコマンドを使用して、アプリケーション・プログラムを起動し、
driver.trust
ファイルのパスをJavaトラスト・ストアに設定します。これは、プロキシがcertificate.pem
ファイルおよびkey-pkcs8.pem
ファイルを使用してすでに設定されているため必要となります。java -Djavax.net.ssl.trustStore=driver.trust \ -javax.net.ssl.trustStorePassword=<password of driver.trust> \ -cp .:lib/nosqldriver.jar application_program
driver.trust
には、certificate.pem
またはrootCA.crt
証明書が含まれます。証明書certificate.pem
が、JAVA_HOME/jre/lib/security/cacerts
にリストされている信頼できるCAによって署名されたチェーンに含まれている場合は、JavaコマンドでJava環境パラメータ-Djavax.net.ssl.trustStore
を追加する必要はありません。
Pythonを使用したプロキシへの接続
Oracle NoSQL Database Pythonドライバには、Pythonアプリケーションがプロキシと通信できるようにするファイルが含まれています。
詳細は、Pythonを使用したプロキシへの接続を参照してください。
Goを使用したプロキシへの接続
Oracle NoSQL Database Go SDKには、Goアプリケーションがプロキシと通信できるようにするファイルが含まれています。
詳細は、Goを使用したプロキシへの接続を参照してください。
Node.jsを使用したプロキシへの接続
Oracle NoSQL Database Node.js SDKには、Node.jsアプリケーションがプロキシと通信できるようにするファイルが含まれています。
詳細は、Node.jsを使用したプロキシへの接続を参照してください。
.NETを使用したプロキシへの接続
Oracle NoSQL Database .NET SDKには、.NETアプリケーションがプロキシと通信できるようにするファイルが含まれています。
詳細は、.NETを使用したプロキシへの接続を参照してください。
Spring Dataを使用したプロキシへの接続
Oracle NoSQL Database Spring Data SDKには、Spring Dataアプリケーションがプロキシと通信できるようにするファイルが含まれています。
アプリケーションのクラスパスにJavaドライバをインストールします。次のコードを使用してプロキシに接続します。
configuration
Spring Beanは、NosqlDbConfig
オブジェクトを提供します。StoreAccessTokenProvider
クラスは、Oracle NoSQL Databaseクラスタのユーザー名およびパスワードとともに使用できます。StoreAccessTokenProvider
クラスは、安全なOracle NoSQL Databaseストアに接続して認証するようにSpring Data Frameworkを構成します。
import com.oracle.nosql.spring.data.config.AbstractNosqlConfiguration;
import com.oracle.nosql.spring.data.config.NosqlDbConfig;
import com.oracle.nosql.spring.data.repository.config.EnableNosqlRepositories;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import oracle.nosql.driver.kv.StoreAccessTokenProvider;
@Configuration
@EnableNosqlRepositories
public class AppConfig extends AbstractNosqlConfiguration {
@Bean
public NosqlDbConfig nosqlDbConfig() {
AuthorizationProvider authorizationProvider;
authorizationProvider = new StoreAccessTokenProvider(user, password);
return new NosqlDbConfig("http://<proxy_host:proxy_http_port>", authorizationProvider);
}
}
proxy_host
は、プロキシ・サービスをホストするマシンのホスト名です。proxy_http_port
は、プロキシがホスト・マシンでリクエストを監視しているポートです。
例
Oracle NoSQL Database Javaドライバを実行し、次のステップを使用してプロキシに接続します。この例では、セキュアな1ノードのOracle NoSQL Databaseサーバーをプロキシと同じホスト上にデプロイします。この例では、HTTPSポート443を使用して、ローカル・マシンmyhost
でプロキシ・インスタンスを起動します。ポート5000上の2つのホスト(kvhost1
およびkvhost2
)で実行されているセキュアなOracle NoSQL Databaseインスタンス名kvstore
に接続されます。ユーザーの作成および権限の割当てに必要な管理ステップを実行するには、管理権限を持つアイデンティティへのアクセス権が必要です。この例では、管理権限を持つアイデンティティはファイルKVROOT/security
で提供されます。
- Oracle NoSQL Database SQLシェルで次のコマンドを使用して、
proxy_user
ユーザーを作成します。java -jar lib/sql.jar \ -helper-hosts kvhost1:5000,kvhost2:5000 -store kvstore \ -security kvroot/security/user.security sql-> CREATE USER proxy_user IDENTIFIED BY "ProxyPass@@123"; exit
- プロキシ関連ファイルを格納できるディレクトリ
./proxy
を作成します。 ./proxy/proxy.passwd
ファイルを作成し、proxy.passwd
ファイルでユーザー・プロキシのプロキシ・パスワードを設定します。この例では、プロキシはkvstoreと同じマシン内にあります。このため、プロキシに関連するファイルは./proxy
ディレクトリ内に作成します。java -jar lib/kvstore.jar securityconfig pwdfile create -file proxy/proxy.passwd java -jar lib/kvstore.jar securityconfig pwdfile secret -file proxy/proxy.passwd -set -alias proxy_user -secret "ProxyPass@@123"
client.trust
ファイルをkvstoreから/proxy
ディレクトリにコピーして、プロキシで使用します。cp kvroot/security/client.trust proxy/client.trust
- ブートストラップ・ユーザー用に、次の情報を含むログイン・ファイル
proxy.login
を./proxy
ディレクトリに作成します。oracle.kv.auth.username=proxy_user oracle.kv.auth.pwdfile.file=proxy.passwd oracle.kv.transport=ssl oracle.kv.ssl.trustStore=client.trust
- 自己署名証明書と秘密キーを生成します。
openssl req -x509 -days 365 -newkey rsa:4096 \ -keyout key.pem -out certificate.pem \ -subj "/C=US/ST=CA/L=San/CN=localhost/emailAddress=localhost@oracle.com" # The below conversion can be skipped if openssl by default generate PKCS#8 key. openssl pkcs8 -topk8 \ -inform PEM -outform PEM \ -in key.pem -out key-pkcs8.pem
ノート:
すべてのパスワード・プロンプトに対して123456
を指定します。ノート:
localhostで実行していない場合は、CNパラメータにマシンのホスト名を指定します。ノート:
キーがPKCS#5 v2.0
アルゴリズムで暗号化されている場合は、次の変換を行う必要があります。そうしないと、サポートされていないアルゴリズムが原因でファイルに有効な秘密キーが含まれていないことを示すIllegalArgumentException
例外が発生する可能性があります。暗号化アルゴリズムは、-v1
フラグでPKCS#5 v1.5
またはPKCS#12
アルゴリズムを指定することで、OpenSSLpkcs8
ユーティリティを介して変換できます。次のコマンドは、キーの暗号化アルゴリズムをPBE-SHA1-3DES
に変換します。openssl pkcs8 -topk8 -in <PKCS#5v2.0_key_file> -out <new_key_file> -v1 PBE-SHA1-3DES
- Javaトラスト・ストアに証明書をインポートします。
keytool -import -alias example \ -keystore driver.trust -file certificate.pem
- 443を
httpsPort
として使用して、ローカル・マシンmyhost
でプロキシを起動します。java -jar lib/httpproxy.jar \ -storeName kvstore \ -helperHosts kvhost1:5000,kvhost2:5000 \ -httpsPort 443 \ -storeSecurityFile proxy/proxy.login \ -sslCertificate certificate.pem \ -sslPrivateKey key-pkcs8.pem \ -sslPrivateKeyPass 123456 \ -verbose true
driver_user
ユーザーを作成します。この例では、driver_user
にreadwrite
ロールが付与され、これにより、アプリケーションは読取り操作と書込み操作のみを実行できます。CREATE TABLE
のような表DDLを実行するには、driver_user
に対して、より多くのロールを付与する必要があります。セキュリティ・ガイドの認可の構成を参照してください。java -jar lib/sql.jar \ -helper-hosts kvhost1:5000,kvhost2:5000 -store kvstore \ -security kvroot/security/user.security sql-> CREATE USER driver_user IDENTIFIED BY "DriverPass@@123"; sql-> GRANT READWRITE TO USER driver_user; exit
- アプリケーション・プログラムで、次のコードを実行してプロキシに接続します。サンプル・プログラムの起動時に、JVMパラメータ
-Djavax.net.ssl.trustStore=driver.trust
を追加します。String endpoint = "https://localhost:8089"; StoreAccessTokenProvider atProvider = new StoreAccessTokenProvider("driver_user","DriverPass@@123".toCharArray()); NoSQLHandleConfig config = new NoSQLHandleConfig(endpoint); config.setAuthorizationProvider(atProvider); NoSQLHandle handle = NoSQLHandleFactory.createNoSQLHandle(config);
- 必要に応じて、この例でCRUD操作を追加する場合は、「Oracle NoSQL Databaseドライバ」を参照してください。