Cassandra ネイティブ mTLS を構成する

はじめに

Edge for Private Cloud のさまざまな Message Processor、管理サーバー、ルーターなどのコンポーネントは、デフォルトで平文チャネルを介して Cassandra ノードに接続します。このようなチャネルでは、Cassandra との間で送受信されるデータはクリアで通信されます。Apigee mTLS は、Edge for Private Cloud クラスタ内のコンポーネント間の通信にセキュリティを追加する consul サービス メッシュ ベースの機能です。Apigee のこのサービスでは、クライアント コンポーネントと Cassandra 間の通信チャネルに TLS セキュリティも追加されます。

この記事では、Apigee が提供する新しい代替手段について説明します。この方法では、外部サービス メッシュを使用せずに、Cassandra でネイティブに利用可能な機能を使用して、Edge for Private Cloud のクライアント コンポーネントと Cassandra 間の通信を相互 TLS(別名 2 方向 TLS)で保護します。

ネイティブ mTLS 機能

この記事で説明する Cassandra とクライアント コンポーネント間の mTLS の有効化は、Apache Cassandra によってネイティブに提供される TLS 機能に依存しています。有効にすると、Cassandra(CQL ネイティブ トランスポート ポート 9042)へのクライアント接続は、接続の確立を許可する前に、クライアントとの間で双方向 TLS ハンドシェイクを実行します。この双方向 TLS 接続では、Cassandra がサーバーとして機能し、Cassandra に接続するさまざまなクライアント(edge-message-processor、cqlsh ツールなど)がクライアントとして機能します。

双方向 TLS(相互 TLS または mTLS)の場合、Cassandra とクライアントの両方を独自のキーストアで設定する必要があります。各 Cassandra ノードのキーストアには、独自の鍵と証明書が含まれている必要があります。各クライアント アプリケーションのキーストアには、その特定のクライアントの鍵と証明書が含まれている必要があります。証明書と関連する相手側のチェーンを含むトラストストアを Cassandra とクライアントの両方に追加する必要があります。各 Cassandra ノードのトラストストアにはクライアントの証明書が含まれ、各クライアントのトラストストアにはすべての Cassandra ノードの証明書が含まれている必要があります。双方向 TLS handshake の一般的な仕組みについては、Apigee の双方向 TLS/SSL に関する記事をご覧ください。

証明書チェーン

一般に、双方向 TLS では、サーバー証明書、クライアント証明書、証明書チェーン、キーストア、トラストストアはさまざまな方法で作成できます。Cassandra とクライアント ネイティブの mTLS についても同様です。組織が通常 Edge for Private Cloud クラスタを運用する方法と、確立できる一意のクライアントと Cassandra 接続ペアの数を考慮して、Apigee では、この機能の鍵と証明書を構成する際に、次の一般的なアプローチを採用することをおすすめします。他にも有効な方法はありますが、以下の方法はセキュリティとメンテナンスのオーバーヘッドのバランスが取れていると考えられます。

  1. ルート証明書と、ルートによって署名された中間鍵/証明書のペアを調達します。このような鍵と証明書をすでに所有している場合もあります。ない場合は、付録 1 の手順に沿って、自己署名ルート証明書、中間証明書、鍵を作成できます。

  2. 上記の共通の中間鍵/証明書を使用して、すべてのアプリケーション固有の(リーフ)鍵と証明書に署名します。

1 つのクラスタで共通の中間鍵/証明書を使用すると、すべての Cassandra ノードとクライアント ノードで共通のトラストストア(同じルート証明書と中間証明書のチェーンを含む)が構成されます。すべての Cassandra ノードとクライアント アプリケーションは、共通の中間鍵/証明書で署名された独自のリーフ鍵と証明書を取得します。

  1. Cassandra ノードまたはクライアント アプリケーションのリーフ証明書のローテーションは簡単です。
  2. 中間証明書またはルート証明書のローテーションは、依然としてかなり複雑なオペレーションですが、このようなローテーションの頻度はリーフ証明書のローテーションの頻度よりもはるかに低くなります。

組織のセキュリティ プラクティスに基づいて、異なるプライベート クラウド クラスタ間で共通のルート証明書と中間証明書を使用するかどうかを決定します。別の証明書設定については、付録 2 を参照してください。

この記事の残りの手順では、上記の鍵と証明書の設計方法について詳しく説明します。

制限事項と注意事項

この機能には、次の制限が適用されます。

  • クライアント コンポーネントと Cassandra 間のネイティブ mTLS のこのサービスは、apigee-mtls と互換性がありません。この機能を使用している場合は、apigee-mtls を使用できません。その逆も同様です。
  • クライアント コンポーネントと Cassandra の間で mTLS を有効にすると、クライアントと Cassandra の間で確立される接続のパフォーマンスに影響します。Cassandra とクライアントは通信を開始する前に TLS をネゴシエートする必要があるため、クライアントの起動や Cassandra 接続のスケーリングなどのオペレーションが遅くなる可能性があります。影響は軽微であり、通常は目立ちません。
  • Cassandra では、インバウンド クライアント接続に mTLS を適用できます。適用を有効にすることはできますが、Apigee ソフトウェアのアップグレード、TLS 機能の有効化/無効化、特定の種類の証明書のローテーションなどの運用タスク中は無効にする必要があります。詳しくは、オペレーションと構成のセクションをご覧ください。
  • 証明書の管理とメンテナンスはお客様の責任となります。
  • 証明書のローテーションにはさまざまなニュアンスがあります。詳しくは、証明書のローテーションのセクションをご覧ください。

ネイティブ mTLS を有効にする

大まかに言うと、ネイティブ mTLS の有効化は次の 3 つの手順で行います。

  1. ルート証明書と中間鍵/証明書のペアを取得します。
  2. 1 つの Cassandra ノードのリーフ鍵/証明書のペアを作成して署名し、キーストアに保存して、オプションの mTLS 用に Cassandra を構成します。Cassandra ノードごとに手順を 1 つずつ繰り返します。
  3. 1 つのクライアント アプリケーションのリーフ鍵/証明書ペアを作成して署名し、キーストアに保存して、mTLS 用にクライアント アプリケーションを構成します。各クライアント アプリケーションで、この手順を 1 つずつ繰り返します。クライアント アプリケーション:
    1. edge-management-server
    2. edge-message-processor
    3. edge-router

手順は次のとおりです。

ルート証明書と中間証明書を調達する

ルート証明書と、ルートによって署名された中間鍵/証明書のペアを入手します。組織の CA 署名付きルート証明書と中間証明書を使用するか、自己署名証明書を作成します。ルート証明書と中間証明書のチェーンをトラストストアに保存します。便利なコマンドについては、付録 1 を参照してください。以降のコマンドは、次のファイルにアクセスできることを前提としています。

  • intermediate.key - リーフ証明書に署名する中間証明書の鍵ファイル
  • intermediate-cert.pem - 中間証明書

Cassandra ノードを構成する

  1. Cassandra ノードを 1 つ選択する
  2. リーフ鍵と証明書のペアを生成し、中間証明書で署名します。鍵と署名付き証明書をキーストアに保存します。たとえば次のようになります。
    
    # Generate Leaf key and csr
    openssl req -newkey rsa:2048 -keyout cass-node1.key -out cass-node1-req.pem -sha256 -days 365 -nodes -subj "/C=yourc/ST=yourst/L=yourl/O=youro/OU=yourou/CN=yourip/emailAddress=cassnode1@yourorg.com"
    
    # leaf cert signed by intermediate
    openssl x509 -req -in cass-node1-req.pem -CAkey intermediate.key -CA intermediate-cert.pem -days 365 -CAcreateserial -out cass-node1-cert.pem
    
    # keystore packaging leaf key and cert
    openssl pkcs12 -export -clcerts -in cass-node1-cert.pem -inkey cass-node1.key -out cass-node1-keystore.pfx -name nativemtls -password pass:keystorepass

    キーストア ファイルとトラストストア ファイルをノードの特定の場所に配置し、apigee ユーザーがアクセスできるようにします。

    cp cass-node1-keystore.pfx /opt/apigee/customer/application/
    cp truststore.pfx /opt/apigee/customer/application/
    
    chown apigee:apigee /opt/apigee/customer/application/cass-node1-keystore.pfx
    chown apigee:apigee /opt/apigee/customer/application/truststore.pfx

  3. /opt/apigee/customer/application/cassandra.properties ファイルを作成または編集します。このファイルに次の内容を追加します。
    ### Enable Cassandra TLS on CQL connections
    conf_cassandra_client_encryption_enabled=true
    
    ### Optional TLS - true or false
    conf_cassandra_client_encryption_optional=true
    
    ### Keystore details
    conf_cassandra_client_encryption_keystore=/opt/apigee/customer/application/cass-node1-keystore.pfx
    conf_cassandra_client_encryption_keystore_password=keystorepass
    conf_cassandra_server_encryption_store_type=PKCS12
    
    ### Whether to enable 2-way TLS (or mTLS) - true or false
    conf_cassandra_client_encryption_require_client_auth=true
    
    ### When 2-way TLS is enabled, client certificate details need to be provided via a truststore
    conf_cassandra_client_encryption_truststore=/opt/apigee/customer/application/truststore.pfx
    conf_cassandra_client_encryption_truststore_password=trustpass
    conf_cassandra_client_encryption_store_type=PKCS12
    

    ファイルが apigee ユーザーによって所有され、読み取り可能であることを確認します。

    chown apigee:apigee /opt/apigee/customer/application/cassandra.properties
  4. Cassandra ノードを構成して再起動する
    apigee-service apigee-cassandra configure
    apigee-service apigee-cassandra restart
    
  5. 各 Cassandra ノードで上記の手順を 1 つずつ繰り返します。

クライアント アプリケーションを構成する

このセクションは、Cassandra に接続する次のクライアント コンポーネントに適用されます。

  • edge-management-server
  • edge-message-processor
  • edge-router

  1. クライアント コンポーネントを 1 つ選択する
  2. リーフ鍵と証明書のペアを生成し、中間証明書で署名します。鍵と署名付き証明書をキーストアに保存します。以下に例を示します。
    
    # Generate Leaf key and csr
    openssl req -newkey rsa:2048 -keyout mgmt-node1.key -out mgmt-node1-req.pem -sha256 -days 365 -nodes -subj "/C=yourc/ST=yourst/L=yourl/O=youro/OU=yourou/CN=yourip/emailAddress=mgmtnode1@yourorg.com"
    
    # leaf cert signed by intermediate
    openssl x509 -req -in mgmt-node1-req.pem -CAkey intermediate.key -CA intermediate-cert.pem -days 365 -CAcreateserial -out mgmt-node1-cert.pem
    
    # keystore packaging leaf key and cert
    openssl pkcs12 -export -clcerts -in mgmt-node1-cert.pem -inkey mgmt-node1.key -out mgmt-node1-keystore.pfx -name nativemtls -password pass:keystorepass
    

    キーストア ファイルとトラストストア ファイルをノードの特定の場所に配置し、apigee ユーザーがアクセスできるようにします。

    cp mgmt-node1-keystore.pfx /opt/apigee/customer/application/
    cp truststore.pfx /opt/apigee/customer/application/
    
    chown apigee:apigee /opt/apigee/customer/application/mgmt-node1-keystore.pfx
    chown apigee:apigee /opt/apigee/customer/application/truststore.pfx

  3. 構成するアプリケーションに基づいて構成ファイルを作成して編集する
    アプリケーション 構成ファイル
    管理サーバー /opt/apigee/customer/application/management-server.properties
    管理プロセッサ /opt/apigee/customer/application/message-processor.properties
    ルーター /opt/apigee/customer/application/router.properties

    ファイルに次の構成を追加します。

    ### Enable TLS on CQL connections
    conf_cassandra_sslconfig.enable.tls=true
    conf_cassandra_sslconfig.enable.mtls=true
    
    ### Keystore Details
    conf_cassandra_sslconfig.keystore.path=/opt/apigee/customer/application/mgmt-node1-keystore.pfx
    conf_cassandra_sslconfig.keystore.password=keystorepass
    conf_cassandra_sslconfig.keystore.type=PKCS12
    
    ### Truststore Details
    conf_cassandra_sslconfig.truststore.path=/opt/apigee/customer/application/truststore.pfx
    conf_cassandra_sslconfig.truststore.password=trustpass
    conf_cassandra_sslconfig.truststore.type=PKCS12
    

    構成ファイルが apigee ユーザーによって所有され、読み取り可能であることを確認します。

    chown apigee:apigee configuration file
    
    ### Example:
    chown apigee:apigee /opt/apigee/customer/application/management-server.properties
    

  4. クライアント アプリケーションを再起動する
    # Configure and restart service:
    apigee-service component configure
    apigee-service component restart
    # Example, to configure and restart message processor application
    apigee-service edge-message-processor configure
    apigee-service edge-message-processor restart
    
  5. クライアント アプリケーションで SSL が正しく構成されていることを確認するには、適切なアプリケーションのシステムログで次の行を探します。

    Cassandra 接続に SSL オプションを追加

  6. 各クライアント アプリケーションで上記の手順を 1 つずつ繰り返します。

オペレーションと構成

mTLS の適用

Cassandra で mTLS が適用されていない場合、Cassandra はクライアントからの平文接続、または 2 方向の TLS handshake を正常に実行できるクライアントを受け入れます。mTLS の適用を機能させるには、最初に Cassandra で mTLS を構成する必要があります。Cassandra で mTLS の適用を設定するには、次の手順を行います。

  1. Cassandra ノードを 1 つ選択する
  2. /opt/apigee/customer/application/cassandra.properties ファイルを作成または編集します。このファイルで次のプロパティを追加または編集します。
    ### Optional TLS - true or false
    conf_cassandra_client_encryption_optional=false
    

    ファイルが apigee ユーザーによって所有され、読み取り可能であることを確認する

    chown apigee:apigee /opt/apigee/customer/application/cassandra.properties
    
  3. Cassandra ノードを構成して再起動する
    apigee-service apigee-cassandra configure
    apigee-service apigee-cassandra restart
    
  4. 各 Cassandra ノードで上記の手順を 1 つずつ繰り返します。

Cassandra で mTLS が適用されると、標準の Cassandra クエリツール cqlsh は Cassandra に直接接続できなくなります。SSL 用に cqlsh を構成するには、新しいリーフ鍵と証明書(クライアント アプリケーションのリーフ鍵と証明書と同様)を生成し、次の操作を行います。

  1. $HOME/.cassandra/cqlshrc ファイルを作成または編集する
  2. ファイルに次の内容を追加します。
    [ssl]
    certfile = /home/admin-user/certs/inter-root.pem
    validate = false
    userkey = /home/admin-user/certs/cqlsh1.key
    usercert = /home/admin-user/certs/cqlsh1-cert.pem
    
    • certfile - ルート証明書と中間証明書チェーンを含む証明書ファイル
    • userkey - cqlsh で使用されるクライアント キー。これは、中間証明書を使用して生成して署名できるリーフ鍵と証明書のペアである必要があります。
    • usercert - cqlsh で使用されるクライアント証明書。これは、中間証明書を使用して生成して署名できるリーフ鍵/証明書である必要があります。
  3. --ssl 引数を指定して、通常どおり cqlsh コマンドを実行します。次に例を示します。
    $  /opt/apigee/apigee-cassandra/bin/cqlsh --ssl X.X.X.X
    Connected to Apigee at X.X.X.X:9042
    [cqlsh 6.0.0 | Cassandra 4.0.13 | CQL spec 3.4.5 | Native protocol v5]
    Use HELP for help.
    cqlsh>
    

Cassandra で mTLS の適用を無効にする

Cassandra で mTLS の適用を無効にする手順は次のとおりです。

  1. Cassandra ノードを 1 つ選択する
  2. /opt/apigee/customer/application/cassandra.properties ファイルを作成または編集します。このファイルに次のプロパティを追加または編集します。
    ### Optional TLS - true or false
    conf_cassandra_client_encryption_optional=true
    

    ファイルの所有者が apigee ユーザーであり、apigee ユーザーがファイルを読み取れることを確認します。

    chown apigee:apigee /opt/apigee/customer/application/cassandra.properties
    
  3. Cassandra ノードを構成して再起動する
    apigee-service apigee-cassandra configure
    apigee-service apigee-cassandra restart
    
  4. 各 Cassandra ノードで上記の手順を 1 つずつ繰り返します。

ネイティブ mTLS を無効にする

ネイティブ mTLS の無効化は、ネイティブ mTLS の有効化と同様の複数のステップからなるプロセスです。大まかな手順は次のとおりです。

  1. Cassandra で mTLS の適用を無効にする(適用されている場合)
  2. 次のクライアント アプリケーションのすべてのノードで、mTLS を 1 つずつ無効にします。
    • edge-management-server
    • edge-message-processor
    • edge-router
    1. 構成するアプリケーションに基づいて構成ファイルを作成して編集します。
      アプリケーション 構成ファイル
      管理サーバー /opt/apigee/customer/application/management-server.properties
      管理プロセッサ /opt/apigee/customer/application/message-processor.properties
      ルーター /opt/apigee/customer/application/router.properties
    2. 構成ファイルに次のプロパティを追加するか、編集します。
      ### TLS on CQL connections
      conf_cassandra_sslconfig.enable.tls=false
      conf_cassandra_sslconfig.enable.mtls=false
      
    3. 構成ファイルが apigee ユーザーによって所有され、読み取り可能であることを確認します。
      chown apigee:apigee configuration file
      
      ### Example:
      chown apigee:apigee /opt/apigee/customer/application/management-server.properties
    4. クライアント アプリケーションを再起動します。
      
      # Configure and restart service:
      apigee-service component configure
      apigee-service component restart
      
      # Example, to configure and restart message processor application
      apigee-service edge-message-processor configure
      apigee-service edge-message-processor restart
      
    5. 各クライアント アプリケーションで、手順 #a ~ #d を 1 つずつ繰り返します。
  3. すべての Cassandra ノードで mTLS を 1 つずつ無効にします。
    1. Cassandra ノードを 1 つ選択します。
    2. /opt/apigee/customer/application/cassandra.properties ファイルを作成または編集します。このファイルに次のプロパティを追加または編集します。
      ### Cassandra TLS on CQL connections
      conf_cassandra_client_encryption_enabled=false
      

      ファイルの所有者が apigee ユーザーであり、apigee ユーザーがファイルを読み取れることを確認します。

      chown apigee:apigee /opt/apigee/customer/application/cassandra.properties
      
    3. Cassandra ノードを構成して再起動する
    4. apigee-service apigee-cassandra configure
      apigee-service apigee-cassandra restart
      
    5. 各 Cassandra ノードで、ステップ #a ~ #c を 1 つずつ繰り返します。

証明書のローテーション

リーフ証明書のみのローテーション(中間証明書とルート証明書は同じまま)

クライアント アプリケーションを構成すると同様の手順に沿って操作します。

  1. 同じ中間鍵/証明書を使用して、アプリケーションの新しいリーフ鍵/証明書を生成する
  2. アプリケーションで、新しいリーフ鍵/証明書のパス、パスワード、キーストア タイプを構成します。
  3. アプリケーションを再起動する
ルート証明書または中間証明書のローテーション

中間証明書またはルート証明書のローテーションを計画している場合は、次のマルチステップ プロセスで行うことをおすすめします。

  1. クラスタ全体で Cassandra ネイティブ mTLS を無効にします。
  2. 新しいルート証明書と中間証明書を使用して、新しいリーフ証明書またはアプリケーション証明書を生成します。
  3. 新しい鍵と証明書のセットを使用して、Cassandra ネイティブ mTLS を有効にする手順に沿って操作します。

一般的な Apigee オペレーション

Apigee ソフトウェアのアップグレード、Cassandra ノードの追加または削除、データセンターの追加または削除、Cassandra 認証の有効化または無効化など、一般的な Apigee オペレーションを実行するには、Cassandra で mTLS が適用されていないことを確認します。mTLS を適用している場合は、これらのオペレーションに進む前に適用を無効にします。

付録 1

この付録の手順に沿って、自己署名ルートと中間鍵/証明書のペアを生成し、この証明書チェーンをトラストストアに追加できます。

自己署名ルート証明書と中間証明書を生成する

# Create self-signed root key and cert
openssl req -x509 -newkey rsa:2048 -keyout root.key -out root-cert.pem -sha256 -days 3650 -nodes -subj "/C=yourc/ST=yourst/L=yourl/O=youro/OU=yourou/CN=root.yourorg.com/emailAddress=apigeeroot@yourorg.com"

# Create intermediate key and cert (signed by root)
openssl req -newkey rsa:2048 -keyout intermediate.key -out intermediate-req.pem -sha256 -days 3650 -nodes -subj "/C=yourc/ST=yourst/L=yourl/O=youro/OU=yourou/CN=inter.yourorg.com/emailAddress=apigeeinter@yourorg.com"

openssl x509 -req -in intermediate-req.pem -CAkey root.key -CA root-cert.pem -days 3650 -CAcreateserial -out intermediate-cert.pem

トラストストアを生成する

# Merge root and intermediate cert into 1 file
cat intermediate-cert.pem > inter-root.pem
cat root-cert.pem >> inter-root.pem

# Create truststore to be used everywhere
keytool -keystore truststore.pfx -storetype PKCS12 -importcert -file inter-root.pem -keypass trustpass -storepass trustpass -alias nativemtls -noprompt

付録 2: 代替の証明書チェーンの設定

この記事では、セキュリティと運用の容易さのバランスが取れた特定の証明書チェーンの設定を推奨していますが、代替手段も存在します。以下に説明します。一般的な原則のほとんどは、次のような他の手法にも適用されます。

  1. すべての Cassandra ノードまたはクライアント アプリケーションに直接リーフ鍵と証明書がある(署名ルート証明書または中間証明書がない)。これにより、証明書のローテーションが複雑になる可能性があります。
  2. さまざまなユースケースに対応する複数のルートと中間セットがある。たとえば、Cassandra ノードには 1 つのルート/中間証明書セットがあり、これを使用して Cassandra のすべてのリーフ証明書が署名されます。同様に、すべてのクライアント アプリケーションに、アプリケーション リーフ証明書の署名用に個別のルート/中間セットを 1 つ設定できます。このような設定は可能ですが、ルート/中間証明書チェーンを適切なトラストストアに追加する必要があります。この例では、Cassandra のトラストストアにクライアントのルート証明書/中間証明書が含まれている必要があります。また、クライアント アプリケーションのトラストストアに Cassandra ノードのルート/中間チェーンが含まれている必要があります。
  3. 上記と同様に、リージョンごとに複数のルート証明書と中間証明書のセットを設定できますが、すべてのリージョンのすべてのクライアントとすべてのリージョンのすべてのサーバーが、構成されたトラストストアにすべてのルートチェーンと中間チェーンを追加することで、すべてのルートチェーンと中間チェーンを認識する必要があります。