第1章 Streams for Apache Kafka Proxy の概要
Streams for Apache Kafka Proxy は、Kafka ベースのシステムを強化するために設計された Apache Kafka プロトコル対応プロキシーです。そのフィルターメカニズムにより、アプリケーションや Kafka クラスター自体を変更することなく、Kafka ベースのシステムに追加の動作を導入できます。
Streams for Apache Kafka Proxy は仲介者として機能し、Kafka クラスターとそのクライアント間の通信を仲介します。このプロキシーは、メッセージの受信、フィルタリング、転送を行います。
1.1. Record Encryption フィルター
Streams for Apache Kafka Proxy の Record Encryption は、Kafka メッセージのセキュリティーを強化します。このフィルターは、業界標準の暗号化技術を使用して Kafka メッセージに暗号化を適用し、Kafka クラスターに保存されているデータの機密性を確保します。Streams for Apache Kafka Proxy はトピックレベルの暗号化を集中管理し、Kafka クラスター全体で暗号化が効率的に行われるようにします。
フィルターはエンベロープ暗号化を使用して、対称暗号鍵でレコードを暗号化します。
- エンベロープ暗号化
- エンベロープ暗号化は、大量のデータを効率的に暗号化するのに適した業界標準の技術です。データは Data Encryption Key (DEK) で暗号化されます。DEK は、Key Encryption Key (KEK) を使用して暗号化されます。KEK は Key Management System (KMS) に安全に保存されます。
- 対称暗号鍵
- AES (GCM) 256 ビット暗号化対称暗号鍵は、レコードデータの暗号化と復号化に使用されます。
プロセスは以下のようになります。
- フィルターは、生成アプリケーションからの生成要求をインターセプトし、レコードを暗号化します。
- 生産要求はブローカーに転送されます。
- フィルターは、消費アプリケーションからのフェッチ応答をインターセプトし、レコードを復号化します。
- フェッチ応答は、消費アプリケーションに転送されます。
フィルターはレコード値のみを暗号化します。レコード鍵、ヘッダー、タイムスタンプは暗号化されません。
Kafka クライアントと Kafka ブローカーから見ると、プロセス全体が透過的です。どちらも、レコードが暗号化されていることを認識しておらず、暗号化鍵にアクセスすることも、レコードを保護するための暗号化プロセスに影響を与えることもできません。
フィルターは、鍵マテリアルの安全な保管の最終的な責任を負う Key Management Service (KMS) と統合されます。現在、フィルターは KMS として HashiCorp Vault と統合されていますが、今後 KMS インテグレーションのさらなるサポートが計画されています。
1.1.1. フィルターがレコードを暗号化する方法
フィルターは、次のように生成要求からのレコードを暗号化します。
- フィルターは適用する KEK を選択します。
- KEK の DEK を生成するように KMS に要求します。
- 暗号化された DEK (KEK で暗号化された DEK) を使用してレコードを暗号化します。
- 元のレコードを暗号レコード (暗号化されたレコード、暗号化された DEK、およびメタデータ) に置き換えます。
フィルターは DEK 再利用ストラテジーを使用します。暗号化されたレコードは、タイムアウトまたは暗号化制限に達するまで、同じ DEK を使用して同じトピックに送信されます。
1.1.2. フィルターを使用してレコードを復号化する方法
フィルターは次のようにフェッチ応答からレコードを復号化します。
- フィルターは Kafka ブローカーから暗号レコードを受信します。
- 暗号レコードを構築したプロセスを元に戻します。
- KMS を使用して DEK を復号化します。
- 復号化された DEK を使用して暗号化されたレコードを復号化します。
- 暗号レコードを復号化されたレコードに置き換えます。
フィルターは、復号化されたレコードに対して LRU (最近最も使われていない) ストラテジーを使用します。復号化された DEK は、KMS とのやり取りを減らすためにメモリー内に保持されます。
1.1.3. フィルターで KMS を使用する方法
フィルターをサポートするために、KMS は以下を提供します。
- Key Encryption Key (KEK) を保存するための安全なリポジトリー
- Data Encryption Keys (DEK) を生成および復号化するサービス
KEK は KMS 内に留まります。KMS は、指定された KEK に対して DEK (安全に生成されたランダムデータ) を生成し、DEK と暗号化された DEK を返します。暗号化された DEK には同じデータが含まれますが、KEK で暗号化されています。KMS は DEK を保存しません。DEK はブローカーの暗号レコードの一部として保存されます。
KMS は実行時に使用可能である必要があります。KMS が利用できない場合は、KMS サービスが回復するまで、フィルターを使用した生成と使用は不可能になります。KMS は高可用性 (HA) 設定で使用することを推奨します。
1.1.4. 暗号化されるレコード
Record Encryption フィルターは、レコードの値のみを暗号化し、レコード鍵、ヘッダー、タイムスタンプはそのまま残します。圧縮されたトピック内の削除を表す可能性のある null レコード値は、暗号化されずにブローカーに送信されます。このアプローチにより、圧縮されたトピックが正しく機能することが保証されます。
1.1.5. 暗号化されていないトピック
一部のトピックを暗号化し、他のトピックを暗号化しないようにシステムを設定できます。これにより、機密情報を含むトピックは暗号化し、機密情報を含まない Kafka トピックは暗号化しないシナリオがサポートされます。