KMIP暗号化の構成

リモートKMIP(Key Management Interoperability Protocol)の暗号化キーを使用して機密データを保護します。

KMIP(Key Management Interoperability Protocol)ホストのキーを使用して暗号化を設定し、機密性の高い構成ファイルのプロパティ、システム・リソース、およびテーブルを保護します。
注: DataStaxでは、キーの期限切れ、取り消し、破棄に関連するリスクから、KMIPキー・サーバーのセキュリティ・ポリシーを使用してリモートにキーを管理できるクラスター内のノードの数を制限することを推奨しています。

OpsCenterを使用して、KMIPサーバー・ステータスを監視するアラートを構成します。

KMIPホストの追加

テーブルまたは構成プロパティの暗号化と復号化にリモート・サーバーのキーを使用するよう、KMIPホストを構成します。

DataStax Enterpriseでは、dse.yamlおよびcassandra.yaml構成ファイル内のテーブル・データや機密性の高いプロパティの暗号化/復号化に1つ以上のリモートKMIPホストの暗号化キーを使用できます。KMIPサーバー情報を使用可能なホストのリストに追加するには、以下の手順に従います。

KMIPホストのセキュリティ・ポリシーを使用してKMIPキーをリモートに管理するノードの数は制限することが推奨されます。

手順

クラスター内の各ノードですべての手順を実行します。

  1. KMIPエージェントを設定し、DSEをKMIPサービスに登録します。
    注: 詳細な手順については、KMIPキー・プロバイダーのドキュメントを参照してください。
    1. エージェントをダウンロードしてインストールします。
    2. KMIPホストに接続します。
    3. DSEノードを登録します。
    4. エージェントによって生成されたSSLキー・ペアを見つけます。
  2. キー・ペアをPEMからDSEと互換性のあるJSK形式に変換します。
    1. すべてのユーザーの読み取りアクセス権を削除することによって、エージェントの秘密鍵ファイルのセキュリティを保護します。たとえば、Vormetric DSM KMIPエージェントでは、kmip-key.pemkmip-host_name.pemという名前の2つのファイルが作成されます。
    2. ホーム・ディレクトリーなど、別のディレクトリーに両方のキーをコピーします。
    3. PKCS12形式のファイルをPEMファイルから生成します。
      openssl pkcs12 -export -out kmip_keystore.p12 -inkey kmip-key.pem -in kmip-host_name.pem
      ここで、各変数の意味は以下のとおりです。
      • kmip_keystore.p12は出力ファイル名です。
      • kmip-host_name.pemはエージェントによって作成されるキー・ペアです。
    4. JLSキーストアを作成します。
      keytool -importkeystore -destkeystore kmip_keystore.jks -srcstoretype PKCS12 -srckeystore kmip_keystore.p12
      
      ここで、各変数の意味は以下のとおりです。
      • kmip_keystore.jksは作成されるキーストア・ファイルの名前です。
      • kmip_keystore.p12は前のステップで生成されたPKC12ファイルです。
      注: プロンプトが表示されたらキーストアのパスワードを入力し、ホストに関する情報を入力します。
    5. KMIPルート証明書をJKSトラストストアにインストールします。
      keytool -import -alias kmipCA -file kmip-host_CA.pem -keystore kmip_truststore.jks
      
      注: プロンプトが表示されたらトラストストアのパスワードを入力し、ホストに関する情報を入力します。
    6. DSEがアクセスできるディレクトリーにキーストアとトラストストアを移動して、DSEアカウントに読み取り/書き込みアクセスを許可するようファイルを変更します。
    7. キーストアとトラストストアの作成に使用されるファイルを削除するか、セキュリティを保護します。
  3. ホストの詳細をdse.yamlkmip_hostsセクションに追加します。
    kmip_hosts:  
      kmip_group_name:
        hosts: FQDN[, FQDN , ...] 
        keystore_path: /etc/dse/conf/kmip_keystore.jks
        keystore_type: jks
        keystore_password: password
        truststore_path: /etc/dse/conf/kmip_truststore.jks
        truststore_type: jks
        truststore_password: password
        key_cache_millis: N
        timeout: N
    • 必須の設定は以下のとおりです。
      • kmip_group_name: DSE関連コマンドでKMIPホストを識別するユーザー定義のグループ名。
      • hosts: KMIPホストの完全修飾ドメイン名(FQDN)のコンマ区切りリスト。DSEはこのリスト内の順番でホストを試行します。
      • keystore_path: 2で作成されたキーストアの場所。
      • keystore_type: jks 互換性のあるDSE形式。jksに設定する必要があります。
      • keystore_password2で作成されたキーストア・ファイルのパスワード。
      • truststore_path: 2で作成されたトラストストア・ファイルの場所。
      • truststore_type: jks 互換性のあるDSE形式。jksに設定する必要があります。
      • truststore_password2で作成されたトラストストア・ファイルのパスワード。
    • 任意指定の設定は以下のとおりです。
      • key_cache_millis: N ここで、NはDSEによってノード上のキー・キャッシュが更新される間隔です。デフォルトは300000(5分)です。
      • timeout: N ここで、Nはソケット・タイムアウト(ミリ秒)です。デフォルトは1000です。
  4. リモートKMIPサーバー上の暗号化キーをリストして、ノードがKMIPホストに接続できることを確認します。
    dsetool managekmip list kmip_group_name
    注: dsetoolがdse.yamlの変更内容を検出します。再起動は必要ありません。
    KMIPサーバーとの接続で問題が発生する場合は、「KMIP接続のトラブルシューティング」を参照してください。
    dse.yamlファイルの場所は、インストールのタイプによって異なります。

    パッケージ・インストールInstaller-Servicesインストール

    /etc/dse/dse.yaml

    tarボール・インストールInstaller-No Servicesインストール

    installation_location/resources/dse/conf/dse.yaml
  5. クラスター内のすべてのノードで上記の手順を繰り返します。

構成ファイル・プロパティの暗号化

リモート・ホストのKMIPキーを使用して、dse.yamlファイル内のLDAP検索とトラストストアのパスワードと、cassandra.yamlファイル内のSSLトラストストア・パスワードを保護します。

KMIP暗号化キーを使用して機密性の高い構成プロパティを復号化するよう、DSEを構成します。KMIPキーで暗号化されたパスワードを以下のプロパティに使用します。
  • dse.yamlのLDAP値:
    ldap_options.search_password
    ldap_options.truststore_password
    制約事項: KMIPキーストアまたはトラストストアのパスワードにプレーン・テキストを使用します。
  • cassandra.yamlのSSL値:

    server_encryption_options.keystore_password
    server_encryption_options.truststore_password
    client_encryption_options.keystore_password 
    client_encryption_options.truststore_password 
dse.yamlファイルの場所は、インストールのタイプによって異なります。

パッケージ・インストールInstaller-Servicesインストール

/etc/dse/dse.yaml

tarボール・インストールInstaller-No Servicesインストール

installation_location/resources/dse/conf/dse.yaml
cassandra.yamlファイルの場所は、インストールのタイプによって異なります。

パッケージ・インストールInstaller-Servicesインストール

/etc/dse/cassandra/cassandra.yaml

tarボール・インストールInstaller-No Servicesインストール

installation_location/resources/cassandra/conf/cassandra.yaml
注: DataStax Enterpriseは、key_cache_millisプロパティで設定された間隔で、KMIPホストから暗号化キーをキャッシュし、そのキャッシュを更新します。デフォルト設定は5分です。

始める前に

KMIPホストの追加」の手順を完了します。
警告: 定義されたKMIPグループの中に使用できないグループがあると、DSEの起動は失敗します。

手順

  1. 構成ファイルをバックアップします。
  2. KMIP暗号化キーのURLを取得します。
    • 新しいキーを作成してURLを取得するには、以下のように入力します。
      dsetool createsystemkey 'AES/ECB/PKCS5' 128 -k kmip_group_name
      以下の出力例は、dse.yamlに含まれている、IDが02-1655で名前がvormetricgroupのホストのURLを示しています。
      kmip://vormetricgroup/02-1655
    • 既存のKMIPキーを使用するには、URL構文にkmip://kmip_group_name/IDを使用します。キーIDを検索するには、以下のように入力します。
      dsetool managekmip list kmip_group_name
      たとえば、vormetricgroupには以下のキーがあります。
      Keys on vormetricgroup:
          ID                                     Name               Cipher         State                Activation Date   Creation Date              Protect Stop Date   Namespace
      02-449   82413ef3-4fa6-4d4d-9dc8-71370d731fe4_0        AES/CBC/PKCS5   Deactivated   Mon Apr 25 20:25:47 UTC 2016             n/a                            n/a         n/a
      02-540   0eb2277e-0acc-4adb-9241-1dd84dde691c_0                  AES        Active   Tue May 31 12:57:59 UTC 2016             n/a                            n/a`
      リストの2番目のキーのURLはkmip://vormetricgroup/02-540です。
  3. dse.yamlシステム・プロパティ暗号化設定を構成します。
    1. システム・プロパティ暗号化を有効にします。
      config_encryption_active: true
    2. プロパティの復号化に使用されるKMIPキーのURLを設定します。
      config_encryption_key_name: KMIP_key_URL
      ここで、KMIP_key_URLの形式はkmip://kmip_group_name/key-idです(例:kmip://vormetricgroup/02-1655)。
  4. プロパティごとに、プレーン・テキスト・パスワードを、dsetool encryptconfigvalueコマンドを実行して返された暗号化パスワードと置き換えます。
    1. パスワードを暗号化します。
      dsetool encryptconfigvalue
      Using system key system_key
      
      Enter value to encrypt:
      Enter again to confirm:
      
      Your encrypted value is:
      
      +Vj5oHCR/jqfA+OJE2m8zA==
    2. 古い値を、cassandra.yamlのSSLトラストストア・パスワードなど、構成ファイルの新しい値と置き換えます。
      truststore_password: +Vj5oHCR/jqfA+OJE2m8zA==
      警告: 構成ファイル・プロパティの暗号化が有効になると、保護されているプロパティのいずれかが暗号化されていない場合、DSEの起動は失敗します。
  5. 任意。システム・リソース暗号化を設定します。
  6. ローリング再起動を実行します。

システム・リソースの暗号化

KMIPキーを使用して、system.batchlogテーブル、system.paxosテーブル、ヒント・ファイル、およびコミット・ログを暗号化します。

KMIPキーを使用して、system.batchlogテーブル、system.paxosテーブル、ヒント・ファイル、およびコミット・ログを暗号化します。

始める前に

KMIPホストの追加」の手順を完了します。
警告: 定義されたKMIPグループの中に使用できないグループがあると、DSEの起動は失敗します。

手順

  1. dse.yamlファイルで、システム・テーブル、コミット・ログ、ヒント・ファイルの暗号化設定を構成します。
    system_info_encryption:
      enabled: ( true | false )
      cipher_algorithm: cipher_name
      secret_key_strength: length
      key_provider: KmipKeyProviderFactory
      kmip_host: kmip_group_name
      chunk_length_kb: 64
    • 必須のプロパティ:
      • enabledtrueに設定します。次回の起動時に、システム・リソースが暗号化されます。システム・テーブルに既存のデータが含まれている場合は、nodetool upgradesstablesを使用して暗号化を適用します。
      • key_providerKmipKeyProviderFactoryに設定します。
      • kmip_hostkmip_hostsセクションのグループ名を使用します。
    • 任意。KMIPにより、互換性のあるキーを確実に生成するには、使用する暗号化キーのタイプを構成します。
      • cipher_algorithm:サポートされているJCE暗号化アルゴリズムのうち、使用するアルゴリズムの名前を設定します。DSEは以下のアルゴリズムをサポートしています。
        表 1. サポートされている暗号化アルゴリズム名
        cipher_algorithm secret_key_strength
        AES 128、192、または256
        DES 56
        DESede 112または168
        Blowfish 32-448
        RC2 40-128
      • secret_key_strength:キー長を指定します。
      • chunk_length_kb:SSTableのチャンク・サイズを構成します。オプションを指定しない場合は、デフォルト(64)が使用されます。
      これらのプロパティが設定されている場合、DSEはその条件に一致するキーのみを使用します。一致するキーが存在しない場合、起動は失敗します。
  2. ローリング再起動を実行します。
  3. 既存のデータを暗号化するには、クラスター内のすべてのノードでnodetool upgradesstables-a system batchlog paxosを実行します。

テーブル・データの暗号化

KMIPキーを使用して、テーブル・データに格納されたデータを暗号化します。

KMIPキーを使用して、テーブル・データに格納されたデータを暗号化します。

警告: パーティション・キーはプレーン・テキストで格納されます。TDE暗号化テーブルのパーティション・キーには機密情報を含めないでください。
dse.yamlファイルの場所は、インストールのタイプによって異なります。

パッケージ・インストールInstaller-Servicesインストール

/etc/dse/dse.yaml

tarボール・インストールInstaller-No Servicesインストール

installation_location/resources/dse/conf/dse.yaml

始める前に

KMIPホストの追加」の手順を完了します。
警告: 定義されたKMIPグループの中に使用できないグループがあると、DSEの起動は失敗します。

手順

  1. KMIPサーバーのキーを使用して新しい暗号化テーブルを作成するには、以下の手順を実行します。
    • 圧縮なしの暗号化:
      CREATE TABLE customers 
        ...
        WITH COMPRESSION =
        { 'class': 'Encryptor',
        'key_provider': 'KmipKeyProviderFactory',  
        'kmip_host': 'kmip_group_name' 
          ['key_namespace' = 'kmip_namespace'], 
        'cipher_algorithm': 'AES/ECB/PKCS5Padding',
        'secret_key_strength': 128 };
      • 'key_provider': 'KmipKeyProviderFactory'は、KMIPキー・サーバーを使用してその暗号化キーを管理するように暗号化機能に指示します。KMIPキー・サーバーを使用するように指定する場合のみ、‘key provider’エントリーを含めます。それ以外の場合は、このエントリーを省略します。
      • 'kmip_host': 'kmip_group_name'は、dse.yamlファイルのkmip_hostsセクションで定義されているユーザー定義KMIPキー・サーバー・グループ名を指定します。
      • 'kmip_host': 'kmip_group_name' ['key_namespace' = 'kmip_namespace']は、任意のKMIP名前空間を指定します。名前空間を使用すると、テーブルまたはキースペースごとにキーを詳細に管理できます。
    • 圧縮と暗号化:
      CREATE TABLE customers 
        ...
        WITH COMPRESSION =
        { 'class': 'EncryptingDeflateCompressor',
        'key_provider': 'KmipKeyProviderFactory',
        'kmip_host': 'kmip_group_name',
        'cipher_algorithm': 'AES/ECB/PKCS5Padding',
        'secret_key_strength': 128 };
  2. 既存のテーブルを暗号化するには、以下の手順を実行します。
    1. テーブルの圧縮設定を変更します。
      • 圧縮なしの暗号化:
        ALTER TABLE customers 
          ...
          WITH COMPRESSION =
          { 'class': 'Encryptor',
          'key_provider': 'KmipKeyProviderFactory',  
          'kmip_host': 'kmip_group_name' 
            ['key_namespace' = 'kmip_namespace'], 
          'cipher_algorithm': 'AES/ECB/PKCS5Padding',
          'secret_key_strength': 128 };
        • 'key_provider': 'KmipKeyProviderFactory'は、KMIPキー・サーバーを使用してその暗号化キーを管理するように暗号化機能に指示します。KMIPキー・サーバーを使用するように指定する場合のみ、‘key provider’エントリーを含めます。それ以外の場合は、このエントリーを省略します。
        • 'kmip_host': 'kmip_group_name'は、dse.yamlファイルのkmip_hostsセクションで定義されているユーザー定義KMIPキー・サーバー・グループ名を指定します。
        • ['key_namespace' = 'kmip_namespace']は、任意のKMIP名前空間を指定します。名前空間を使用すると、テーブルまたはキースペースごとにキーを詳細に管理できます。
      • 圧縮と暗号化:
        ALTER TABLE customers 
          ...
          WITH COMPRESSION =
          { 'class': 'EncryptingDeflateCompressor',
          'key_provider': 'KmipKeyProviderFactory',
          'kmip_host': 'kmip_group_name',
          'cipher_algorithm': 'AES/ECB/PKCS5Padding',
          'secret_key_strength': 128 };
    2. クラスター内のすべてのノードで既存のデータを暗号化します。
    $ nodetool upgradesstables -a [keyspace_name [table_name[ tablename]...]

暗号化キーの期限の設定

復号化に使用されるキーを変更せずに、データの暗号化に使用されるKMIPキーを変更します。

通常、暗号化キーを使用できる時間はセキュリティ・ポリシーで制限されます。このセクションでは、既存のデータを再暗号化せずに、キーの期限を設定する方法について説明します。キーは期限切れになると、新しいデータの暗号化に使用されなくなりますが、既存のデータの復号化には引き続き使用されます。

注: 暗号化と復号化の両方に使用されるキーを変更するには、「新しいキーを使用したテーブルのキー更新」を参照してください。

手順

  1. 使用可能なキーとその状態のリストをKMIPサーバーから取得します。
    dsetool managekmip list kmip_group_name
    たとえば、vormetricgroupという名前のホストに2つのキーがあるとします。
    Keys on vormetricgroup:
        ID                                     Name               Cipher         State                Activation Date   Creation Date              Protect Stop Date   Namespace
    02-449   82413ef3-4fa6-4d4d-9dc8-71370d731fe4_0        AES/CBC/PKCS5   Deactivated   Mon Apr 25 20:25:47 UTC 2016             n/a                            n/a         n/a
    02-540   0eb2277e-0acc-4adb-9241-1dd84dde691c_0                  AES        Active   Tue May 31 12:57:59 UTC 2016             n/a                            n/a
    注: DSEは、1つ以上のKMIPホストをサポートしています。各KMIPホストは、dse.yamlkmip_hostsセクションのユーザー定義kmip_group_nameで定義されています。
  2. キーの期限を設定します。
    • キーを直ちに期限切れにします。
      dsetool managekmip expirekey kmip_group_name key_id 
    • 有効期日をスケジュールします。
      dsetool managekmip expirekey kmip_group_name key_id datetime
    注: キーの期限が切れると、データベースは、次回キー・キャッシュ(key_cache_millis)が更新されたときに暗号化用の新しいキーを取得します。デフォルト設定は5分です。期限切れになったキーは、データの復号化には引き続き使用できます。
  3. 必要に応じて、ローリング再起動を実行して、DSEキー・キャッシュを強制的に更新します。

新しいキーを使用したテーブルのキー更新

テーブル・データの暗号化に現在使用している侵害されたキーを取り消し、新しいキーを使用して既存のデータを再度暗号化します。

新しいデータの暗号化と既存データの復号化の両方に使用されている暗号化キーを変更します。セキュリティ管理担当者の変更など、暗号化キーが侵害された可能性があるイベントの後でデータの安全性を確保するには、以下の手順を実行します。古いキーを破棄する前に、侵害されたKMIPキーを取り消し、データベース・キー・キャッシュが更新されるのを待ってから、新しいキーで既存のSSTableを再度暗号化します。

データベースは暗号化キーをキャッシュし、key_cache_millisで設定されている間隔でキャッシュを更新します(デフォルト設定は5分間隔)。新しいキーを取得するには、次回のキー・キャッシュの更新を待つか、ローリング再起動を実行します。

注: dsetool managekmipコマンドは、対応するホストにKMIPコマンドをプロキシします。これらのコマンドは以下のように暗号化キーに影響します。
  • dsetool managekmip expirekey:データベースは、指定された時間に暗号化にそのキーを使用することを停止し、既存のデータの復号化には期限切れのキーを引き続き使用します。データのキー更新は不要です。

    このコマンドを使用すると、暗号化キーを定期的に切り替えることを求めるセキュリティ・ポリシーを満たします。

  • dsetool managekmip revoke:KMIPサーバーのキーを恒久的に無効にします。暗号化にはそのキーは使用されなくなりますが、既存のデータの復号化にはそのキーが引き続き使用されます。KMIPサーバーから完全にキーを削除する前に、既存のデータを再度暗号化します。

    侵害されたキーを置き換える場合、最初のステップでこのコマンドを使用します。

  • dsetool managekmip destroy:KMIPサーバーからそのキーを完全に削除します。そのキーは暗号化と復号化に使用されなくなります。既存のデータは再度暗号化するまでアクセスできなくなります。

    キーを取り消して既存のデータを再度暗号化した後にこのコマンドを使用します。

手順

  1. SSTableのバックアップを作成します
  2. dsetoolを使用して、侵害されたキーを取り消します。
    1. KMIPサーバーから取り消すKMIP暗号化キーのIDを確認します。
      dsetool managekmip list kmip_groupname
      アクティブと非アクティブの2つのキーを持つKMIPサーバーの例を以下に示します。
      ID                                     Name          Cipher         State                Activation Date   Creation Date              Protect Stop Date   Namespace
      02-449   82413ef3-4fa6-4d4d-9dc8-71370d731fe4_0   AES/CBC/PKCS5   Deactivated   Mon Apr 25 20:25:47 UTC 2016             n/a                            n/a         n/a
      02-540   0eb2277e-0acc-4adb-9241-1dd84dde691c_0             AES        Active   Tue May 31 12:57:59 UTC 2016             n/a                            n/a         n/a
      注: DSEは、1つ以上のKMIPホストをサポートしています。各KMIPホストは、dse.yamlkmip_hostsセクションのユーザー定義kmip_group_nameで定義されています。
    2. IDを使用して置き換えるキーを取り消します。
      dsetool managekmip expirekey kmip_groupname key_id
      警告: 恒久的に取り消すと、KMIPサーバーでそのキーは非アクティブ化されます。キー・キャッシュが更新されると、暗号化/復号化用の新しいキーが自動的に作成されます。取り消したキーを使用して既存のデータを復号化します。取り消したキーは、既存のデータを再度暗号化するまで破棄しないでください。
    3. キーの状態(State)が非アクティブ(Deactivated)であることを確認します。
      dsetool managekmip list kmip_groupname
      2つのキーを持つKMIPサーバーの例を以下に示します。
      ID                                     Name               Cipher         State                Activation Date   Creation Date              Protect Stop Date   Namespace
      02-449   82413ef3-4fa6-4d4d-9dc8-71370d731fe4_0        AES/CBC/PKCS5   Deactivated   Mon Apr 25 20:25:47 UTC 2016             n/a                            n/a         n/a
      02-540   0eb2277e-0acc-4adb-9241-1dd84dde691c_0                  AES   Deactivated   Tue May 31 12:57:59 UTC 2016             n/a   Thu Jul 27 17:16:38 UTC 2017
      
  3. 以下ののいずれかの方法を使用して、データベース・キー・キャッシュを更新します。
    注: KMIPキーは、DSE ノードでキャッシュされます。キャッシュが更新され、key_cache_millisの経過後、KMIPサーバーによって新しいキーが自動的に生成されます。デフォルト設定は5分です。
  4. (任意)DESCキースペース・コマンドを使用して新しいキーで再度暗号化するため、影響を受けるテーブルのリストを表示します。
    たとえば、KMIPグループを使用するcyclingキースペース内のテーブルをすべて表示するには、以下のように入力します。
    DESC KEYSPACE cycling
  5. nodetool upgradesstablesを使用して、新しいキーを使用する暗号化されたSSTableを再度書き込みます。クラスターのすべてのノードで以下のコマンドを実行します。
    • 対象が特定のテーブルのみの場合:
      nodetool upgradesstables --include-all-sstables keyspace_name table_name [table_name …]
    • 対象が特定のキースペースの場合:
      nodetool upgradesstables --include-all-sstables keyspace_name
    • 対象がすべてのキースペースとテーブルの場合:
      nodetool upgradesstables --include-all-sstables
  6. (任意)それ以降、復号化に使用できないようにするには、暗号化キーを削除します。
    dsetool managekmip destroy key_id
    警告: バックアップされているSSTableのみ、古いキーを使用してアクセスできます。キーを削除する前に、データにアクセスできることを確認してください。

KMIP接続のトラブルシューティング

KMIPホストに接続できないエラーが発生する

DataStax EnterpriseのSSL証明書が自己署名である場合、またはKMIPサーバー上の証明書チェーンに追加されていないCAの証明書である場合は、以下のエラー・メッセージが表示されることがあります。
WARN 14:46:42,928 Unable to connect to KMIP host: 10.120.15.100:9005 
com.cryptsoft.kmip.TTLVReadException: Error reading TTLV ResponseMessage. Got end-of-stream after reading 0 byte(s). Read bytes: (0) []

DSEおよびKMIPホスト間の信頼が正しく構成されていることを確認します。「SSL証明書の設定」を参照してください。