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

プロキシの起動

Oracle NoSQL Databaseプロキシの構成と起動は、データ・ストア管理の一部です。次のステップを使用して、セキュアなデータ・ストアでこのプロキシを起動できます。

  1. プロキシを起動する前に、ユーザー(proxy_user)を作成する必要があります。これは、プロキシで、セキュアなデータ・ストアへの接続にアイデンティティが必要になるためです。このプロキシ・ユーザー・アイデンティティ(proxy_user)は、実際のデータ操作には使用されません。これは、ストアへの初期接続にのみ必要です。

    SQLシェルで次のコマンドを実行すると、プロキシ用のブートストラップ・ユーザーが作成されます。SQLコマンドの使用を開始するには、開発者ガイドを参照してください。

    次に示すようにproxy_userを作成します:
    sql-> CREATE USER proxy_user IDENTIFIED BY "<proxyuser_password>"
  2. 新しいパスワード・ファイルを作成し、データベース・ユーザー(proxy_user)としてログインするために必要な資格証明を格納します。
    java -Xmx64m -Xms64m -jar lib/kvstore.jar securityconfig pwdfile \
    create -file $KVROOT/security/login.passwd
    
    java  -Xmx64m -Xms64m -jar lib/kvstore.jar securityconfig pwdfile \
    secret  -file $KVROOT/security/login.passwd -set -alias proxy_user

    ノート:

    格納するシークレット値(前述のステップで入力した値)は、前のステップで設定した<proxyuser_password>の値と一致している必要があります。
  3. ブートストラップ・ユーザー用に、次の情報を含むログイン・ファイルproxy.loginを作成します。
    oracle.kv.auth.username=<proxy_user>
    oracle.kv.auth.pwdfile.file=login.passwd
    oracle.kv.transport=ssl
    oracle.kv.ssl.trustStore=client.trust
    説明
    • login.passwdは、proxy_userユーザーのパスワード値を格納するファイルです。
    • client.trustは、データ・ストア・デプロイメントから取得した証明書信頼ファイルです。
  4. 自己署名証明書を使用すると、Oracle NoSQL Databaseプロキシにセキュアに接続できます。このopenSSLコマンドを使用して自己署名証明書と秘密キーを生成します。プロンプトが表示されたら、証明書ファイル用に任意のセキュアなパスフレーズを入力します。
    openssl req -x509 -days 365 -newkey rsa:4096 -keyout key.pem -out certificate.pem \
    -subj "/C=US/ST=CA/L=San/CN=${HOSTNAME}/emailAddress=xxxx.xxxx@oracle.com"
    秘密キーをPKCS#8形式に変換します。プロンプトが表示されたら、まず、前のステップで設定したパスフレーズを入力し、次に、暗号化用に任意のセキュアなパスワードを指定します。プロキシの起動中に、次のステップで設定した暗号化パスワードを使用することになります。
    openssl pkcs8 -topk8 -inform PEM -outform PEM -in key.pem \
    -out key-pkcs8.pem -v1 PBE-SHA1-3DES 
    また、Javaドライバを使用している場合は、driver.trustファイルも必要となります。このdriver.trustファイルは、その他の言語ドライバには必要ありません。driver.trustファイルを生成するには、証明書をJavaキーストアにインポートします。プロンプトが表示されたら、キーストア・パスワードを入力します。
    keytool -import -alias example -keystore driver.trust -file certificate.pem
  5. 次のコマンドを使用して、セキュアなデータ・ストアのプロキシを開始します。
    java -jar lib/httpproxy.jar \ 
    -storeName <kvstore_name> \ 
    -helperHosts <kvstore_helper_host> \ 
    [-hostname <proxy_host>] \ 
    [-httpsPort <proxy_https_port>] \ 
    -storeSecurityFile $KVROOT/security/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です。

      ノート:

      ポート443を使用するには、root権限が必要です。root権限がない場合は、ポート8443を使用できます。
    • 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を使用して変換を実行できます。

セキュアなデータ・ストアへのアプリケーションの接続


proxy_arch.pngの説明が続きます
図proxy_arch.pngの説明

Oracle NoSQL Databaseドライバは、クライアント・アプリケーションで使用される様々なプログラミング言語で使用できます。現在は、Java、Python、Go、Node.js、C#がサポートされています。Oracle NoSQL Databaseプロキシは、クライアント・アプリケーションからのリクエストを受け入れ、Oracle NoSQL Databaseを使用してそれらを処理するサーバーです。

認証:

セキュアなOracle NoSQL Database内では、データベースへのアクセスは、認証済ユーザーのみに限定されます。アプリケーションのユーザー(appln_user)を作成し、ドライバからプロキシを介してデータ・ストアに接続している間にこのユーザーの資格証明を渡す必要があります。このユーザーは、そのデータ・ストア内に提供されている資格証明(ユーザー名/パスワード)を使用して認証されます。

ドライバ構成において、アプリケーション・ユーザー名およびパスワードが提供されます。セキュア構成からハンドルが作成されると、ドライバにより、ログイン要求がプロキシに送信されます。プロキシにより、このアイデンティティ(appln_user/applnuser_password)でデータ・ストアにログインしてそのユーザーが認証されます。このユーザー・アイデンティティ(appln_user)がストアにすでに存在している必要があります。

アプリケーションでセキュア・データ・ストアにアクセスできるようにするために、次のようにユーザー(appln_user)を作成します。
sql-> CREATE USER <appln_user> IDENTIFIED BY "<applnuser_password>"

認可:

Oracle NoSQL Databaseには、ロールベースの認可の機能があり、ユーザーがkvstoreロールをユーザー・アカウントに割り当てて、アクセス可能なデータを定義でき、データベース管理者はユーザー・アカウントごとに操作することができます。ユーザーはロール付与によって、目的の権限を取得できます。アプリケーションに最小権限のアクセス権に基づいてロールを付与して、アプリケーションのニーズとセキュリティ上の問題とのバランスを慎重に調整する必要があります。詳細は、権限とロールの構成を参照してください。

アプリケーション・ユーザーの認証に成功した後は、作成されたハンドルからのすべてのドライバ・リクエストでそのアイデンティティ(appln_user)が送信されます(これは、表の作成、put、get、問合せなど、どのデータ操作を認可する際にもプロキシとデータ・ストアによって使用されます)。データ・ストアが、認可を実行するエンティティです。認可はアイデンティティと操作に基づいており、データ・ストアにより、appln_userに割り当てられているロールを使用して認可の判断が下されます。

ドライバからデータ・ストアへのリクエストは、次のようなステップを経ることになります:
  • ドライバにより、リクエストがプロキシに送信されます。そのリクエストに、認証済アイデンティティが含まれています。
  • プロキシにより、その認証済アイデンティティを使用してリクエストがデータ・ストアに送信されます。
  • データ・ストアにより、そのアイデンティティが検証され、そのアイデンティティ用にデータ・ストアで設定されている権限を使用して、目的の操作(put、get、問合せなど)についてそのアイデンティティを認可します。

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

  1. 前述の項で示したように、セキュアなプロキシを介してデータ・ストアにアクセスするための、アプリケーション・ユーザー(appln_user)を作成します。
  2. セキュア・アクセスの場合は、パラメータ化されたコンストラクタを使用して、StoreAccessTokenProviderクラスのインスタンスを作成します。StoreAccessTokenProviderクラスの参照をNoSQLHandleConfigクラスに提供して、適切な接続を確立します。Oracle NoSQL Database Javaドライバをアプリケーションのクラスパスにインストールし、次のコードを使用してデータ・ストアに接続します。
    String endpoint = "https://<proxy_host>:<proxy_https_port>";
    StoreAccessTokenProvider atProvider = 
        new StoreAccessTokenProvider("<appln_user>","<applnuser_password>".toCharArray());
    NoSQLHandleConfig config = new NoSQLHandleConfig(endpoint);
    config.setAuthorizationProvider(atProvider);
    NoSQLHandle handle = NoSQLHandleFactory.createNoSQLHandle(config);
    説明
    • proxy_hostは、プロキシ・サービスを実行しているマシンのホスト名です。これは、以前に構成したプロキシ・ホストと一致する必要があります。
    • proxy_https_portは、プロキシでリクエストをリスニングしているポートです。これは、以前に設定したプロキシhttpsポートと一致する必要があります。
    • appln_userは、セキュアなストアに接続するために作成されたユーザーです。これは、前述の項で作成したユーザーと一致している必要があります。
    • applnuser_passwordは、appln_userのパスワードです。
  3. プロキシのSSL証明書を含むトラスト・ストアの詳細は、次の2つの方法のどちらかで指定できます。
    次に示すように、Javaコードの一部としてそれを設定できます:
    /* the trust store containing SSL cert for the proxy */ 
    System.setProperty("javax.net.ssl.trustStore", trustStore);
    if (trustStorePassword != null) {     
       System.setProperty("javax.net.ssl.trustStorePassword",trustStorePassword); 
    } 
    または、次のコマンドを使用することで、アプリケーション・プログラムを起動し、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 Database Pythonドライバには、アプリケーションにOracle NoSQL Databaseプロキシとの通信を可能にするファイルが含まれています。次のステップを使用してセキュアなデータ・ストアに接続できます。
  1. 前述の項で示したように、セキュアなプロキシを介してデータ・ストアにアクセスするための、アプリケーション・ユーザー(appln_user)を作成します。
  2. セキュア・ストアを実行する場合は、REQUESTS_CA_BUNDLE環境変数を使用して証明書パスを指定する必要があります。
    $ export REQUESTS_CA_BUNDLE=
    <fully_qualified_path_to_certificate>/certificate.pem:$REQUESTS_CA_BUNDLE
    またはborneo.NoSQLHandleConfig.set_ssl_ca_certs()
  3. 次のコードを使用してプロキシに接続します。
    from borneo import NoSQLHandle, NoSQLHandleConfig
    from borneo.kv import StoreAccessTokenProvider
    endpoint = 'https://<proxy_host>:<proxy_https_port>'
    # Create the AuthorizationProvider for a secure store:
    ap = StoreAccessTokenProvider('<appln_user>','<applnuser_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)
    説明
    • proxy_hostは、プロキシ・サービスを実行しているマシンのホスト名です。これは、以前に構成したプロキシ・ホストと一致する必要があります。
    • proxy_https_portは、プロキシでリクエストをリスニングしているポートです。これは、以前に設定したプロキシhttpsポートと一致する必要があります。
    • appln_userは、セキュアなストアに接続するために作成されたユーザーです。これは、前述の項で作成したユーザーと一致している必要があります。
    • applnuser_passwordは、appln_userのパスワードです。
Oracle NoSQL Database Goドライバには、アプリケーションにOracle NoSQL Databaseプロキシとの通信を可能にするファイルが含まれています。次のステップを使用してセキュアなデータ・ストアに接続できます。
  1. 前述の項で示したように、セキュアなプロキシを介してデータ・ストアにアクセスするための、アプリケーション・ユーザー(appln_user)を作成します。
  2. 次のコードを使用してプロキシに接続します。アプリケーションをセキュアなNoSQLデータベースに接続するには、サーバーでの認証に使用されるユーザー資格証明を指定する必要があります。プロキシ・サーバーが自己署名付き証明書またはデフォルトのシステムCAによって信頼されない証明書で構成されている場合は、サーバーの証明書の検証に使用される証明書パスとサーバー名にもCertPathおよびServerNameを指定する必要があります。
    import (
        "fmt"     
        "github.com/oracle/nosql-go-sdk/nosqldb"
        "github.com/oracle/nosql-go-sdk/nosqldb/httputil"
    )
    ...cfg:= nosqldb.Config{
        Endpoint: "https://<proxy_host>:<proxy_https_port>",
        Mode:     "onprem",
        Username: "<appln_user>",
        Password: "<applnuser_password>>",
       },
        // Specify the CertPath and ServerName
        // ServerName is used to verify the hostname for self-signed certificates.
        // This field is set to the "CN" subject value from the certificate specified by CertPath.
        HTTPConfig: httputil.HTTPConfig{
           CertPath: "<fully_qualified_path_to_cert>",
           ServerName: "<server_name>", 
        },
    }
    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.
    // ...
    説明
    • proxy_hostは、プロキシ・サービスを実行しているマシンのホスト名です。これは、以前に構成したプロキシ・ホストと一致する必要があります。
    • proxy_https_portは、プロキシでリクエストをリスニングしているポートです。これは、以前に設定したプロキシhttpsポートと一致する必要があります。
    • appln_userは、セキュアなストアに接続するために作成されたユーザーです。これは、前述の項で作成したユーザーと一致している必要があります。
    • applnuser_passwordは、appln_userのパスワードです。
Oracle NoSQL Database Node.jsドライバには、アプリケーションにOracle NoSQL Databaseプロキシとの通信を可能にするファイルが含まれています。次のステップを使用してセキュアなデータ・ストアに接続できます。
  1. 前述の項で示したように、セキュアなプロキシを介してデータ・ストアにアクセスするための、アプリケーション・ユーザー(appln_user)を作成します。
  2. セキュア・モードでは、プロキシにSSL証明書と秘密キーが必要になります。プロキシ証明書は、こちらの説明に従ってプロキシを構成するときに作成しました。プロキシ証明書のルート認証局(CA)が信頼できるルートCAのどれでもない場合は、ドライバで、プロキシに接続するために証明書チェーン・ファイル(certificates.pemなど)またはルートCA証明書ファイル(rootCA.crtなど)が必要になります。かわりに自己署名証明書を使用している場合は、ドライバで、接続するためにその自己署名証明書の証明書ファイル(certificate.pemなど)が必要になります。

    証明書または証明書チェーンをドライバに提供するには、2つのオプションがあります。コード内で指定するか、環境変数として設定するかです。

    NoSQLハンドルの作成中にhttpOptプロパティを使用して証明書を指定できます。httpOpt内で、次に示すように、caプロパティを使用してCAを指定できます。
    const client = new NoSQLClient({ .....,     
      httpOpt: {                     
        ca: fs.readFileSync(<caCertFile>)                                    
      },..... 
    });

    ノート:

    ファイル・パスを指定する場合は、そのパスとして、絶対パス、またはアプリケーションの現在の作業ディレクトリからの相対パスを使用できます。
    または、アプリケーションを実行する前に、次のように環境変数NODE_EXTRA_CA_CERTSを設定します。
    export NODE_EXTRA_CA_CERTS="<fully_qualified_path_to_driver.trust>"
    ここで、driver.trustは、CAの証明書チェーン・ファイル(certificates.pem)、ルートCAの証明書(rootCA.crt)または自己署名証明書(certificate.pem)のどれかです。
  3. セキュア・モードでプロキシに接続するには、通信エンドポイントに加えて、ドライバ・ユーザーのユーザー名とパスワードを指定する必要があります。この情報は、kvstoreプロパティのConfig#authオブジェクトに渡され、次に説明する3つの方法のいずれかで指定できます。
    ユーザー名とパスワードを直接指定することもできます。
    const NoSQLClient = require('oracle-nosqldb').NoSQLClient;
    const client = new NoSQLClient({
        endpoint: 'https://<proxy_host>:<proxy_https_port>',
        auth: {
            kvstore: {
                user: '<appln_user>',
                password: '<applnuser_password>'
            }
        }
    });
    説明
    • proxy_hostは、プロキシ・サービスを実行しているマシンのホスト名です。これは、以前に構成したプロキシ・ホストと一致する必要があります。
    • proxy_https_portは、プロキシでリクエストをリスニングしているポートです。これは、以前に設定したプロキシhttpsポートと一致する必要があります。
    • appln_userは、セキュアなストアに接続するために作成されたユーザーです。これは、前述の項で作成したユーザーと一致している必要があります。
    • applnuser_passwordは、appln_userのパスワードです。
    パスワードはメモリーにプレーン・テキストで格納されるため、このオプションは安全性が低下します。
    資格証明は、ファイル・システム権限で保護されている別のファイルに格納することを選択できるため、資格証明はメモリーに格納されませんが、ログインが必要な場合にのみこのファイルからアクセスされるため、以前のオプションよりも安全です。資格証明ファイルの形式は次のとおりです。
    {
        "user":     "<appln_user>",
        "password": "<applnuser_password>"
    }
    その後、この資格証明ファイルを次のように参照できます。
    const NoSQLClient = require('oracle-nosqldb').NoSQLClient;
    const client = new NoSQLClient({
        endpoint: 'https://<proxy_host>:<proxy_https_port>',
        auth: {
            kvstore: {
                credentials: '<path/to/credentials.json>'
            }
        }
    });

    NoSQLClientインスタンスの作成に使用される構成ファイル内でcredentials.jsonを参照することもできます。

    config.jsonの内容
    {
        "endpoint": "https://<proxy_host>:<proxy_https_port>",
        "auth": {
            "kvstore": {
                "credentials": "<path/to/credentials.json>"
            }
        }
    }
    const NoSQLClient = require('oracle-nosqldb').NoSQLClient;
    const client = new NoSQLClient('</path/to/config.json>');

    ノート:

    ファイル・パスを指定する場合は、そのパスとして、絶対パス、またはアプリケーションの現在の作業ディレクトリからの相対パスを使用できます。
Oracle NoSQL Database Dotnetドライバには、アプリケーションにOracle NoSQL Databaseプロキシとの通信を可能にするファイルが含まれています。次のステップを使用してセキュアなデータ・ストアに接続できます。
  1. 前述の項で示したように、セキュアなプロキシを介してデータ・ストアにアクセスするための、アプリケーション・ユーザー(appln_user)を作成します。
  2. セキュア・モードでプロキシに接続するには、通信エンドポイントに加えて、セキュア・データ・ストアに接続するユーザーの詳細を指定する必要があります。この情報はKVStoreAuthorizationProviderのインスタンスで渡され、次に説明するいずれかの方法で指定できます。
    ユーザー名とパスワードを直接指定することもできます。
    var client = new NoSQLClient(
        new NoSQLConfig
        {
            Endpoint = "https://<proxy_host>:<proxy_https_port>",
            AuthorizationProvider = new KVStoreAuthorizationProvider(
                <appln_user, // user name as string
                <applnuser_password>) // password as char[]
        });
    説明
    • proxy_hostは、プロキシ・サービスを実行しているマシンのホスト名です。これは、以前に構成したプロキシ・ホストと一致する必要があります。
    • proxy_https_portは、プロキシでリクエストをリスニングしているポートです。これは、以前に設定したプロキシhttpsポートと一致する必要があります。
    • appln_userは、セキュアなストアに接続するために作成されたユーザーです。これは、前述の項で作成したユーザーと一致している必要があります。
    • applnuser_passwordは、appln_userのパスワードです。
    パスワードはNoSQLClientインスタンスの存続期間中、メモリーにプレーン・テキストで格納されるため、このオプションは安全性が低下します。パスワードはchar[]として指定されているため、NoSQLClientの使用終了後に消去できます。
    資格証明は、ファイル・システム権限で保護されている別のファイルに格納することを選択できるため、資格証明はメモリーに格納されませんが、ストアへのログインが必要な場合にのみこのファイルからアクセスされるため、前のオプションよりも安全です。資格証明ファイルの形式は次のとおりです。
    {
        "UserName": "<appln_user>",
        "Password": "<applnuser_password>"
    }
    その後、この資格証明ファイルを次のように使用できます。
    config.jsonの内容
    var client = new NoSQLClient(
        new NoSQLConfig
        {
            Endpoint: 'https://<proxy_host>:<proxy_https_port>',
            AuthorizationProvider = new KVStoreAuthorizationProvider(
                "<path/to/credentials.json>")
        });

    NoSQLClientインスタンスの作成に使用されるJSON構成ファイル内でcredentials.jsonを参照することもできます。

    config.jsonの内容
    {
        "Endpoint": "https://<proxy_host>:<proxy_https_port>",
        "AuthorizationProvider": {
            "AuthorizationType": "KVStore",
            "CredentialsFile": "<path/to/credentials.json>"
        }
    }
    var client = new NoSQLClient("</path/to/config.json>");

    ノート:

    ファイル・パスを指定する場合は、そのパスとして、絶対パス、またはアプリケーションの現在の作業ディレクトリからの相対パスを使用できます。

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

    プロキシ証明書の証明書チェーンが既知のCAのどれかをルートとしていない場合は、信頼できるルート証明書をドライバに提供する必要があります。提供する証明書としては、カスタムCAか自己署名プロキシ証明書のどちらかを使用できます。これは、TrustedRootCertificateFileプロパティを使用して指定する必要があります。これにより、信頼できるルート証明書を1つ以上含むPEMファイルへのファイル・パス(絶対パス、または現在の作業ディレクトリからの相対パス)を設定します(このファイルでは複数のルートが許可されている)。このプロパティは、NoSQLConfig内のConnectionOptionsの一部として指定します。
    var client = new NoSQLClient(
    new NoSQLConfig {
       Endpoint: 'https://<proxy_host>:<proxy_https_port>',
       AuthorizationProvider = new KVStoreAuthorizationProvider( "<path/to/credentials.json>"),
       ConnectionOptions: { "TrustedRootCertificateFile": "<path/to/certificates.pem>" }
    });