セキュアなデータ・ストアでのプロキシの使用

プロキシの起動

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

  1. セキュアなプロキシ接続がブートストラップされる必要があります。プロキシを起動する前に、プロキシでセキュリティ接続をブートストラップするために、セキュアなデータ・ストアにブートストラップ・ユーザーを作成する必要があります。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. 次のコマンドを使用して、セキュアなデータ・ストアのプロキシを開始します。
    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は、データ・ストア・デプロイメントから取得されたデータ・ストア名です。pingを参照してください。
    • kvstore_helper_hostは、データ・ストア・デプロイメントから取得されたデータ・ストアのヘルパーhost:portリストです。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を使用して変換を実行できます。

Oracle NoSQL Database Javaドライバには、アプリケーションがOracle NoSQL Databaseプロキシと通信できるようにするjarファイルが含まれています。次のステップを使用して、プロキシに接続できます。

  1. プロキシを介してデータ・ストアにアクセスするためにアプリケーションで使用する、ドライバのユーザーを作成します。
    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 \
    -Djavax.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を追加する必要はありません。

オンプレミス構成には、Oracle NoSQLデータベースの実行中インスタンスが必要です。また、実行中のプロキシ・サービスも必要です。

セキュア・ストアを実行する場合は、REQUESTS_CA_BUNDLE環境変数を使用して証明書パスを指定する必要があります。

$ export REQUESTS_CA_BUNDLE=
<path-to-certificate>/certificate.pem:$REQUESTS_CA_BUNDLE
またはborneo.NoSQLHandleConfig.set_ssl_ca_certs()
さらに、アプリケーションの必要な操作(表やデータの操作など)を実行する権限を持つユーザー・アイデンティティをストアに(別々に)作成する必要があります。アイデンティティはborneo.kv.StoreAccessTokenProviderで使用されます。
from borneo import NoSQLHandle, NoSQLHandleConfig
from borneo.kv import StoreAccessTokenProvider
#
# Assume the proxy is secure and running on localhost:443
#
endpoint = 'https://localhost:443'
#
# Create the AuthorizationProvider for a secure store:
#
ap = StoreAccessTokenProvider(user_name, password)
#
# create a configuration object
#
config = NoSQLHandleConfig(endpoint).set_authorization_provider(ap)
#
# set the certificate path if running a secure store
#
config.set_ssl_ca_certs(<ca_certs>)
#
# create a handle from the configuration object
#
handle = NoSQLHandle(config)

オンプレミス構成には、Oracle NoSQLデータベースの実行中インスタンスが必要です。また、実行中のプロキシ・サービスも必要です。この場合、Endpoint構成パラメータは、NoSQLプロキシ・ホストおよびポートの場所を指す必要があります。

セキュア・ストアを実行する場合、表やデータの操作など、アプリケーションの必要な操作を実行する権限を持つユーザー・アイデンティティをストアに(別々に)作成する必要があります。セキュア・サーバーが自己署名されている証明書、またはデフォルトのシステムCAによって信頼されていない証明書をインストールしている場合は、InsecureSkipVerifyを指定して、サーバーの証明書の検証をスキップするようにクライアントに指示するか、サーバーの証明書およびホスト名の検証に使用するCertPathおよびServerNameを指定します。
import (
    "fmt"     
    "github.com/oracle/nosql-go-sdk/nosqldb"
    "github.com/oracle/nosql-go-sdk/nosqldb/httputil"
)
...cfg:= nosqldb.Config{
    Endpoint: "https://nosql.mycompany.com:8080",
    Mode:     "onprem",
    Username: "testUser",
    Password: []byte("F;0s2M0;-Tdr"),
    // Specify InsecureSkipVerify
    HTTPConfig: httputil.HTTPConfig{
        InsecureSkipVerify: true,
    },
    // Alternatively, specify the CertPath and ServerName
    // HTTPConfig: httputil.HTTPConfig{
    //     CertPath: "/path/to/certificate-used-by-server",
    //     ServerName: "nosql.mycompany.com", 
    // set to the "CN" subject value from the certificate
    // },
}
client, err:=nosqldb.NewClient(cfg)
iferr!=nil {
    fmt.Printf("failed to create a NoSQL client: %v\n", err)
    return
}
deferclient.Close()
// Perform database operations using client APIs.
// ...

アプリケーションは、プロキシ・サービスを介して接続して、実行中のNoSQLデータベースを使用します。

セキュア・モードでプロキシに接続するには、通信エンドポイントに加えて、ドライバ・ユーザーのユーザー名とパスワードを指定する必要があります。この情報は、kvstoreプロパティのConfig#authオブジェクトに渡され、次に説明する3つの方法のいずれかで指定できます。

ユーザー名とパスワードを直接指定することもできます。
const NoSQLClient = require('oracle-nosqldb').NoSQLClient;
const client = new NoSQLClient({
    endpoint: 'https://myhost:8081',
    auth: {
        kvstore: {
            user: 'John',
            password: johnsPassword
        }
    }
});
パスワードはメモリーにプレーン・テキストで格納されるため、このオプションは安全性が低下します。
資格証明は、ファイル・システム権限で保護されている別のファイルに格納することを選択できるため、資格証明はメモリーに格納されませんが、ログインが必要な場合にのみこのファイルからアクセスされるため、以前のオプションよりも安全です。資格証明ファイルの形式は次のとおりです。

{
    "user":     "<Driver user name>",
    "password": "<Driver user password>"
}
その後、この資格証明ファイルを次のように参照できます。
const NoSQLClient = require('oracle-nosqldb').NoSQLClient;
const client = new NoSQLClient({
    endpoint: 'https://myhost:8081',
    auth: {
        kvstore: {
            credentials: 'path/to/credentials.json'
        }
    }
});
NoSQLClientインスタンスの作成に使用される構成ファイルでcredentials.jsonを参照することもできます。
{
    "endpoint": "https://myhost:8081",
    "auth": {
        "kvstore": {
            "credentials": "path/to/credentials.json"
        }
    }
}
const NoSQLClient = require('oracle-nosqldb').NoSQLClient;
const client = new NoSQLClient('/path/to/config.json');

アプリケーションは、プロキシ・サービスを介して接続して、実行中のNoSQLデータベースを使用します。

セキュア・モードでプロキシに接続するには、通信エンドポイントに加えて、ドライバ・ユーザーのユーザー名とパスワードを指定する必要があります。この情報はKVStoreAuthorizationProviderのインスタンスで渡され、次に説明するいずれかの方法で指定できます。

ユーザー名とパスワードを直接指定することもできます。
var client = new NoSQLClient(
    new NoSQLConfig
    {
        Endpoint = "https://myhost:8081",
        AuthorizationProvider = new KVStoreAuthorizationProvider(
            userName, // user name as string
            password) // password as char[]
    });
パスワードはNoSQLClientインスタンスの存続期間中、メモリーにプレーン・テキストで格納されるため、このオプションは安全性が低下します。パスワードはchar[]として指定されているため、NoSQLClientの使用終了後に消去できます。
資格証明は、ファイル・システム権限で保護されている別のファイルに格納することを選択できるため、資格証明はメモリーに格納されませんが、ストアへのログインが必要な場合にのみこのファイルからアクセスされるため、前のオプションよりも安全です。資格証明ファイルの形式は次のとおりです。
{
    "UserName": "<Driver user name>",
    "Password": "<Driver user password>"
}
その後、この資格証明ファイルを次のように使用できます。
var client = new NoSQLClient(
    new NoSQLConfig
    {
        Endpoint: 'https://myhost:8081',
        AuthorizationProvider = new KVStoreAuthorizationProvider(
            "path/to/credentials.json")
    });
NoSQLClientインスタンスの作成に使用されるJSON構成ファイルでcredentials.jsonを参照することもできます。
{
    "Endpoint": "https://myhost:8081",
    "AuthorizationProvider": {
        "AuthorizationType": "KVStore",
        "CredentialsFile": "path/to/credentials.json"
    }
}
var client = new NoSQLClient("/path/to/config.json");

config.jsonでは、認可プロバイダはJSONオブジェクトとして表され、KVStoreAuthorizationProviderのプロパティと、認可プロバイダのタイプを示す追加のAuthorizationTypeプロパティ(セキュアなオンプレミス・ストアの場合はKVStore)が示されます。

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は、プロキシがホスト・マシンでリクエストを監視しているポートです。