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

はじめに

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

この記事では、Apigee の新しい代替サービスについて説明します。このサービスでは、外部サービス メッシュを使用せずに、Cassandra にネイティブに用意されている機能を使用して、Edge for Private Cloud のクライアント コンポーネントと Cassandra 間の通信が相互 TLS(双方向 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 ハンドシェイクの一般的な仕組みについては、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 を有効にする大まかな手順は次のとおりです。

  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
    

    また、FIPS 対応のオペレーティング システムの場合は、/opt/apigee/customer/application/cassandra.properties ファイルに次のプロパティを追加します。

    conf_cassandra_client_encryption_protocol=TLSv1.2

    ファイルの所有者が 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 ユーザーであり、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 はクライアントからのプレーンテキスト接続、または双方向 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 ユーザーであり、そのユーザーがファイルを読み取れることを確認する

    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 ユーザーであり、そのユーザーがファイルを読み取れることを確認する

      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. 上記と同様に、リージョンごとに複数のルート証明書と中間証明書のセットを設定できますが、すべてのリージョンのすべてのクライアントとすべてのリージョンのすべてのサーバーが、構成されたトラストストアにすべてのルートチェーンと中間チェーンを追加することで、すべてのルートチェーンと中間チェーンを認識する必要があります。