テーブルの暗号化

ローカル暗号化キーをテーブル単位で使用して、テーブルの暗号化を構成します。

テーブル単位の暗号化を使用する場合と使用しない場合の透過的なデータ暗号化(TDE)を構成します。データの暗号化は、ディスク(SSTable)への書き込み時に行われます。暗号化を使用するよう既存のテーブルを構成した後で、テーブルをディスクに再度書き込んでください。

テーブルの暗号化には、以下の2つのキーが使用されます。
  • ローカル暗号化キー:内部テーブル暗号化キーの値を暗号化/復号化します。

    クラスター内のすべてのノードにすべてのローカル・キーを配布します。DSEアカウントがキー・ファイルの所有者であり、読み取り/書き込みアクセス権があることを確認してください。

  • テーブル暗号化キー:DSEは、テーブルの暗号化用に定義された、暗号アルゴリズム、キー強度、ローカル暗号化キーの組み合わせごとに、単一のキー・エントリーをdse_system.encrypted_keysで作成します。

    すべてのデータ・センターでdse_systemキースペースに最大3までのレプリケーション係数が設定されていることを確認してください。

    注: 同じ暗号化設定を持つテーブルは、同じ暗号化キーを使用します。
アプリケーションは、異なる暗号化アルゴリズムを使用するSSTableに対しても、暗号化を一切使用しないSSTableに対しても、読み取りと書き込みを行うことができます。
警告: パーティション・キーはプレーン・テキストで格納されます。TDE暗号化テーブルのパーティション・キーには機密情報を含めないでください。

テーブル暗号化のオプションと構文

テーブル定義で暗号化クラスが使用されている場合は、パーティション・キーを除くすべてのテーブル・データがdse_system.encrypted_keysテーブルのキー・エントリーで暗号化されます。cipher_algorithmsecret_key_strengthsystem_key_fileの各設定と一致するキーがない場合は、新しいキーが作成され、テーブルに追加されます。
注: 以下の構文は暗号化オプションのみ示しています。chunk_length_kbなど、他のすべての圧縮オプションも使用可能です。
テーブル暗号化の構文:
COMPRESSION = { 
  'class' : 'encryption_class'[,
  'cipher_algorithm' : 'cipher_algorithm_type'] [,
  'secret_key_strength' : length] [,
  'system_key_file': 'key_filename'] };
ここで、
  • 必須。encryption_class:以下の表に示すいずれかのクラス名を使用します。
    名前 暗号化 圧縮
    Encryptor [1] あり なし
    EncryptingLZ4Compressor あり あり
    EncryptingDeflateCompressor あり あり
    EncryptingSnappyCompressor あり あり
    [1] Encryptorクラスを使用する場合は、ガーベージ・コレクション(GC)を向上させるため、若い世代のヒープ(-Xmnパラメーター)に指定する値を大きくしてください。たとえば、cassandra-stressを実行している場合はサイズを-Xmn1600Mに設定します。
  • 任意。cipher_algorithm_type:使用する暗号化キーのタイプを設定します。DSEでは、以下のJCEアルゴリズムとそれに対応するlengthをサポートしています。
    cipher_algorithm[/mode/padding]
    DSEは以下のJCE暗号化アルゴリズムをサポートします。
    • AES/CBC/PKCS5Padding(長さ128、192、または256で有効)
    • AES/ECB/PKCS5Padding(長さ128、192、または256で有効)
    • DES/CBC/PKCS5Padding(長さ56で有効)
    • DESede/CBC/PKCS5Padding(長さ112または168で有効)
    • Blowfish/CBC/PKCS5Padding(長さ32~448で有効)
    • RC2/CBC/PKCS5Padding(長さ40~128で有効)
    デフォルト値:AES/CBC/PKCS5Padding(長さ128で有効)
    デフォルトはAES/CBC/PKCS5Paddingです。
  • 任意。length:使用するキーの長さを指定します。デフォルトは128です。
  • 任意。key_filename:テーブル・キーの暗号化に使用するローカル暗号化キーのファイル名を指定します。ローカル・キーはsystem_key_directoryにあります。デフォルトはsystem_keyです。

始める前に

ローカル暗号化キーの設定」の説明に従ってキー設定を完了します。
注: ローカル暗号化キー・ファイルを使用する場合は、場所をsystem_key_directoryに設定し、DSEを実行しているアカウントがキー・ファイルを所有していることを確認します。

手順

  • 暗号化が有効になっているテーブルの作成(圧縮は無効):

    暗号化が有効で圧縮は行わないテーブルを構成するときは、chunk_length_kbオプションを可能な限り小さい値(1など)に設定します。設定する値が小さいほど、各読み取り操作で復号化する必要のあるデータが制限されるため、読み取りパフォーマンスが向上します。

    CREATE TABLE test.encryption_test_a (a int primary key) WITH 
       COMPRESSION = { 'class': 'Encryptor', 'chunk_length_kb' : 1 };
    注: コマンドによって任意の設定が除外される場合に、デフォルト値を持つキーが既に存在すると(SELECT key_id FROM dse_system.encrypted_keys WHERE key_file = 'system_key' AND cipher = 'AES' AND strength = 128;)、そのキーがテーブルの暗号化に使用されます。キーが存在しない場合は、DSEによってキーが自動的に作成されます。
  • 暗号化と圧縮の両方が有効になっているテーブルの作成:
    キー長が112のDESedeアルゴリズムを使用してテーブルを暗号化し、LZ4圧縮を使用してデータを圧縮します。
    CREATE TABLE test.encryption_test_d (d int primary key) WITH 
       COMPRESSION = {
          'class': 'EncryptingLZ4Compressor', 
          'cipher_algorithm' : 'DESede/CBC/PKCS5Padding', 
          'secret_key_strength' : 112,
          'system_key_file' : 'test-key' };
    
    注: 「test-key」というローカル暗号化キーがsystem_key_directoryに存在している必要があります。DSEアカウントに読み取り/書き込みパーミッションがないか、ファイルが見つからない場合は、エラー・メッセージ「Encryptorの初期化に失敗する」が表示されます。
  • 既に存在するテーブルでの暗号化の設定または変更:
    1. 暗号化設定を変更します。
      以下のコマンドを実行すると、テーブル・データの暗号化に使用されるキーが変更されます。
      ALTER TABLE test.encryption_test_d WITH
         COMPRESSION = { 
            'class': 'EncryptingLZ4Compressor', 
            'cipher_algorithm' : 'AES/ECB/PKCS5Padding', 
            'secret_key_strength' : 128,
            'system_key_file' : 'system_key'  };
      
    2. 新しい暗号化キーを使用してSSTableを再度書き込みます(クラスター内の全ノードで実行します)。
      nodetool upgradesstables -a test encryption_test_d