メインコンテンツまでスキップ
適用対象:
DuoKey Cockpit v2Apache Cassandra(SimpleStrategy / NetworkTopologyStrategy)KMIP に支えられたキープロバイダー

概要​

Apache Cassandra は、プラグイン可能なキープロバイダーの拡張ポイント(DataStax Enterprise の Transparent Data Encryption やサードパーティの KMIP キープロバイダー jar が使用するものと同じもの)を通じて、SSTable とコミットログのセグメントを暗号化できます。このアプリは、そのキープロバイダーが KMIP 経由で DuoKey Cockpit からキーを取得するように設定し、キースペースを暗号化下に置くために必要な cassandra.yaml と CQL を生成します。

Cassandra TDE — ノードごとのキープロバイダーチェーン
Cassandra ノードSSTable + コミットログの暗号化をローカルで適用
IKeyProvider — KmipKeyProviderFactory
DKE KMIP キープロバイダーネイティブ KMIP 経由で key_alias を取得
KMIP(TTLV)、ポート 5696
DuoKey Cockpit KMIP サーバークラスター全体のプリンシパルキーを提供
テナント vault / HSM バックエンドプリンシパルキーは保存時にシールされる

すべてのノードが同じ KMIP サーバーから同じ key_alias をロードするため、ストリーミングされたデータとコミットログのリプレイがクラスター全体で復号可能な状態に保たれます。

プロパティ値
暗号化モデルエンジンネイティブな TDE(SSTable + コミットログ、ノードごと)
キーの転送KMIP に支えられたキープロバイダー(プロバイダーは固定 — 常に DuoKey KMIP)
オンボーディングアプリ詳細ページ — ウィザードのエントリなし
実証ステータス生成される成果物(設定、CQL、ローテーションランブック)は実物で、そのまま利用可能。ライブのクラスタードライバーセッションはまだありません — 下記参照

Cassandra が他の TDE エンジンと異なる理由​

このカタログの他のすべての TDE エンジンは、実質的に単一の論理インスタンスとやり取りします。リードレプリカを持つ Percona PostgreSQL でさえ、すべてのレプリカが同じ KMIP プリンシパルキーを同時に取得します。そこでのキーローテーションとは、新しいキーを作成し、エンジンをそれに向けるだけで完了します。

Apache Cassandra はピアツーピアでレプリケーションされたクラスターです。レプリケーションファクターが N の場合、すべての行は N 個のノードに存在し、ノード同士は絶えず生データを交換します。ブートストラップ/デコミッション/リペア時のストリーミング、ヒンテッドハンドオフ、そして再起動時に各ノードが自身のコミットログをリプレイする処理などです。SSTable とコミットログの暗号化は、そのノード自身の cassandra.yaml が現在指しているキーを使って、ノードごとにローカルで行われます。これは KEK でラップされたノードごとのキーではなく同一の共通鍵方式のキーであるため、ストリーミングされたデータとコミットログのリプレイが機能するには、クラスター全体で設定されるキーがバイト単位で同一でなければなりません。

即時ローテーションで何が起こるか

新しいキーを作成して古いキーを直ちに無効化し、その後ノードを 1 台ずつローリングすると、まだ新しい設定を取り込んでいないすべてのノードが取り残されます。そのノードは自身のコミットログも、古いキーのままのノードからストリーミングされたデータも復号できなくなります。ノード A が新しいキーを持ち、ノード B が持たない期間は必ず存在します。そしてリペア、ストリーミング、ヒンテッドハンドオフは、その期間を通じて機能し続けなければなりません。

設定​

フィールド目的
contact_pointsnative_portクラスターへの到達に使用するシードノードとネイティブプロトコルのポート(デフォルトは 9042)。
cluster_name`cassandra.yaml` の `cluster_name` と一致している必要があります。
keyspaceこのエンドポイントが暗号化を管理する対象のキースペース。
replication_strategy`SimpleStrategy`(単一データセンター)または `NetworkTopologyStrategy`(マルチデータセンター)。
replication_factor`SimpleStrategy` のレプリケーションファクター。
datacenter_replication`NetworkTopologyStrategy` 用の、データセンターごとのレプリケーションファクター(dc_name:rf) — 列挙されたすべてのデータセンターのすべてのノードが同じプリンシパルキーを適用する必要があります。
sstable_encryptioncommitlog_encryptionSSTable レベルとコミットログセグメントの暗号化を、それぞれ独立して切り替えます。
linked_key_idクラスター全体のプリンシパルキーを支える DuoKey vault のキー。

デプロイ成果物​

cassandra.yaml — キープロバイダー(すべてのノードで同一)TEXT
# every node in the cluster MUST use the SAME key_alias so
# streamed/replicated data stays decryptable cluster-wide.
transparent_data_encryption_options:
enabled: true
cipher: AES/CBC/PKCS5Padding
key_alias: <app-name>
key_provider:
  - class_name: org.apache.cassandra.security.KmipKeyProviderFactory
    parameters:
      - kmip_host: <dke-cockpit-kmip-host>
        kmip_port: 5696
        key_label: <app-name>
レプリケーション付きでキースペースを作成するSQL
CREATE KEYSPACE IF NOT EXISTS "<keyspace>"
WITH replication = {'class': 'NetworkTopologyStrategy', 'dc1': 3, 'dc2': 2};
-- or, for SimpleStrategy:
-- WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3};
SSTable 暗号化を有効にする(テーブルごと)SQL
ALTER TABLE <keyspace>.<table> WITH compression = {
'sstable_compression': 'EncryptingLZ4Compressor',
'cipher_algorithm': 'AES/CBC/PKCS5Padding',
'secret_key_strength': 128,
'key_provider': 'KmipKeyProviderFactory'
};
コミットログ暗号化を有効にする(1 ノードずつのローリング再起動)TEXT
commitlog_compression:
- class_name: EncryptingLZ4Compressor
  parameters:
    cipher_algorithm: AES/CBC/PKCS5Padding
    secret_key_strength: 128

レプリケーションを考慮したキーローテーション​

クラスター全体のキーはローリング展開中もバイト単位で同一である必要があるため、ローテーションは即時の切り替えではなく5 フェーズのランブックになります。これを成り立たせている不変条件は、新しいキーの作成の副作用として古いキーが破棄されることは決してないという点です。古いキーは active のまま残り、その後 deactivated(復号専用)へ移行し、保持期間の経過後に別途明示的に承認されたオペレーター操作によってのみ destroyed になります。

5 フェーズのローテーション概観
1. 新しいキーを作成デュアルアクティブのウィンドウが開く
2. ノードをローリング1 台ずつ
3. クラスター全体で確認すべてのノードが新しい key_alias に
4. 古いキーを無効化復号専用
5. 保持期間後に破棄手動、監査あり

古いキーが破棄されるのはフェーズ 5 のみです — 保持期間の経過後に行われる、明示的で手動かつ監査された操作です。

1

新しいキーを作成する — デュアルアクティブのウィンドウが開く

新しいプリンシパルキーが KMIP サーバー上で作成され、有効化されます。古いキーはアクティブなままです。両方のキーが同時に提供可能なため、あるノードがどちらのキーを設定していても、処理中の復号要求が失敗することはありません。

2

ノードごとのローリング展開

1 台のノードの cassandra.yaml で key_alias を更新し、再起動し、クラスターへの再参加(nodetool status で UN)を待ち、ヘルスチェックのエンドポイントで確認してから、次のノードへ進みます。ラック/データセンターあたり同時に 1 台を超えないようにします。これは他の Cassandra のローリング再起動と同じ、クォーラムを維持するためのルールです。

3

クラスター全体での確認

すべてのコンタクトポイントが新しい key_alias を報告するまで、ヘルスチェック/セルフテストをポーリングします。肯定的なヘルスシグナルがないノードを移行済みとみなすことはありません。

4

古いキーを無効化する

すべてのノードが確認されたら、古いキーは deactivated(復号専用であり、破棄はされません)へ移行します。この時点以降、新しい書き込みは常に新しいキーのみを使用します。古いキーで暗号化されたままの既存の SSTable とコミットログのセグメントは、コンパクションによって新しいキーで書き換えられるまで復号可能なままです。

5

保持期間の経過後に破棄する

min_old_key_retention_days(デフォルトは 90 — 一般的な gc_grace_seconds やメジャーコンパクションのサイクルを十分に上回るように選ばれています)が経過し、かつオペレーターが nodetool/sstablemetadata によって、古い key_alias を参照する SSTable が残っていないことを手動で検証した後にのみ、古いキーが破棄されます。このステップは意図的に手動かつ監査対象であり、自動化されることはありません。

まだ参照されているキーの破棄は復旧不能です

ディスク上のいずれかの SSTable がまだ参照しているキーを破棄すると、恒久的で復旧不能なデータ損失が発生します。フェーズ 5 は、将来フェーズ 2〜3 が自動化されたとしても、意図的に自動化されることはありません。

現時点で実物なもの、ランブックであるもの​

機能ステータス
cassandra.yaml のキープロバイダースニペット、CQL のキースペース/テーブル文、ローテーション計画実際に生成されます — オペレーターはこれらを直接使って作業できます
ノードごとの展開(フェーズ 2〜3): 設定の配布、再起動、nodetool status のポーリングまだ自動化されていません — 現時点ではオペレーター向けのランブックであり、駆動される状態機械ではありません。ローテーション計画は、ノードごとの確認ステータスをでっち上げるのではなく、確認なしとして報告します
キーの破棄(フェーズ 5)設計上、決して自動化されません — 成熟度のギャップではなく安全性の特性です
他の TDE スタブエンジンと同水準

Cassandra TDE の現在の忠実度は、MySQL TDE、MongoDB CSFLE、SQL Always Encrypted と同じ水準です。すなわち、生成されるセットアップ手順と、ライブのデータベースセッションではなくシミュレーションされたヘルス/セルフテストです。ローリング展開をエンドツーエンドで自動化することは自然な次のステップであり、オンホストのエージェントか、クラスター管理者の資格情報を持つネイティブプロトコルのドライバーのいずれかが必要になります。