セキュアなkvstoreでのプロキシの使用

プロキシの起動

次のステップを使用して、Oracle NoSQL Databaseプロキシをセキュアなkvstoreで開始できます。

  1. セキュアなプロキシ接続がブートストラップされる必要があります。プロキシを起動する前に、プロキシでセキュリティ接続をブートストラップするためのブートストラップ・ユーザーをセキュアなkvstoreに作成する必要があります。SQLシェルで次のコマンドを実行すると、プロキシ用のブートストラップ・ユーザーが作成されます。SQLコマンドの使用を開始するには、開発者ガイドを参照してください。
    sql-> CREATE USER <proxy_user> IDENTIFIED BY "<proxy_password>";
    説明
    • proxy_userはユーザー名です。
    • proxy_passwordは、proxy_userのパスワードです。

    ノート:

    ブートストラップ・ユーザーの場合、デフォルトの権限で十分です。管理権限やその他の追加権限をブートストラップ・ユーザーに付与することはお薦めしません。

    ノート:

    ブートストラップ・ユーザーには、ユーザーが任意の名前を指定できます。

  2. プロキシ関連ファイルを格納できるディレクトリ./proxyを作成します。
  3. ブートストラップ・ユーザー用に、次の情報を含むログイン・ファイル./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が正常に機能するには、これらのファイルが存在する必要があります。

  4. プロキシとドライバに対してcertificate.pemファイルおよびkey-pkcs8.pemファイルを作成し、セキュアな通信を構成および確立します。Javaドライバを使用する場合は、driver.trustファイルも生成する必要があります。セキュリティ・ガイドOracle NoSQL Databaseプロキシの証明書と秘密キーの生成を参照してください。
  5. 次のコマンドを使用して、セキュアな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ファイルが含まれています。次のステップを使用して、プロキシに接続できます。

  1. プロキシを介してkvstoreにアクセスするためにアプリケーションで使用する、ドライバ用のユーザーを作成します。
    sql-> CREATE USER <driver_user> IDENTIFIED BY "<driver_password>"
        sql-> GRANT READWRITE TO USER <driver_user>
    ここで、driver_userはユーザー名、driver_passworddriver_userユーザーのパスワードです。この例では、driver_userユーザーにreadwriteロールが付与され、これにより、アプリケーションは読取り操作と書込み操作のみを実行できます。セキュリティ・ガイド認可の構成を参照してください。

    ノート:

    ユーザーが表または索引を作成、削除または変更する必要がある場合は、driver_userdbadminロールが付与されている必要があります。これにより、アプリケーションはDDL操作を実行できます。
    sql-> GRANT DBADMIN TO USER <driver_user>
  2. 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は、ドライバ・ユーザーのパスワードです。
  3. 次のコマンドを使用して、アプリケーション・プログラムを起動し、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で提供されます。

  1. 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
  2. プロキシ関連ファイルを格納できるディレクトリ./proxyを作成します。
  3. ./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"
  4. client.trustファイルをkvstoreから/proxyディレクトリにコピーして、プロキシで使用します。
    cp kvroot/security/client.trust proxy/client.trust
  5. ブートストラップ・ユーザー用に、次の情報を含むログイン・ファイル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
  6. 自己署名証明書と秘密キーを生成します。
    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アルゴリズムを指定することで、OpenSSL pkcs8ユーティリティを介して変換できます。次のコマンドは、キーの暗号化アルゴリズムをPBE-SHA1-3DESに変換します。
    openssl pkcs8 -topk8 -in <PKCS#5v2.0_key_file> -out <new_key_file> -v1 PBE-SHA1-3DES
  7. Javaトラスト・ストアに証明書をインポートします。
    keytool -import -alias example \ 
    -keystore driver.trust -file certificate.pem
  8. 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
  9. driver_userユーザーを作成します。この例では、driver_userreadwriteロールが付与され、これにより、アプリケーションは読取り操作と書込み操作のみを実行できます。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
  10. アプリケーション・プログラムで、次のコードを実行してプロキシに接続します。サンプル・プログラムの起動時に、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);
  11. 必要に応じて、この例でCRUD操作を追加する場合は、「Oracle NoSQL Databaseドライバ」を参照してください。