リモートクラスターを証明書からAPIキー認証に移行する

リモートクラスターのAPIキーベースのセキュリティモデルは、TLS証明書ベースのセキュリティモデルに比べて、管理者により細かいアクセス制御を提供します。そのため、証明書ベースのセキュリティモデルからAPIキーベースのモデルに移行したい場合があります。

新しいエイリアスを使用して新しいリモートクラスター接続を定義することで移行することは可能ですが、いくつかの欠点があります:

  • クロスクラスター複製の場合、既存のタスクのリーダークラスターエイリアスを変更することはできません。その結果、新しいリモートクラスターでは、フォロワーインデックスを最初から再作成する必要があります。
  • クロスクラスター検索の場合、変換および異常検出ジョブはリモートクラスターエイリアスの更新を許可します。ただし、たとえば*:source_indexおよびsuperuserのようにワイルドカードで作成されたジョブの場合、新しいリモートクラスターを追加すると、ジョブが二重の作業を行い、結果が重複して歪む可能性があります。

これらの理由から、次の手順に従ってリモートクラスターをインプレースで移行することをお勧めします:

問題が発生した場合は、トラブルシューティングを参照してください。

前提条件

  • ローカルおよびリモートクラスターのノードは、バージョン8.10以上である必要があります。
  • ローカルおよびリモートクラスターは、適切なライセンスを持っている必要があります。詳細については、https://www.elastic.co/subscriptionsを参照してください。

リモートクラスターを再構成し、クロスクラスターAPIキーを生成する

リモートクラスターで:

  • 1. リモートクラスターサーバーをリモートクラスターのすべてのノードで有効にします。elasticsearch.ymlで:
    • 1.1. remote_cluster_server.enabledtrueに設定します。
    • 1.2. リモートクラスターサーバートラフィックのバインドおよび公開アドレスを設定します。たとえば、remote_cluster.hostを使用します。アドレスを設定しないと、リモートクラスターのトラフィックがローカルインターフェースにバインドされ、他のマシンで実行されているリモートクラスターに接続できなくなります。
    • 1.3. オプションで、remote_cluster.portを使用してリモートサーバーポートを設定します(デフォルトは9443です)。
  • 2. 次に、証明書機関(CA)とサーバー証明書/キーのペアを生成します。リモートクラスターのノードの1つで、Elasticsearchがインストールされているディレクトリから:
    • 2.1. CAがまだない場合は、CAを作成します:
      1. ./bin/elasticsearch-certutil ca --pem --out=cross-cluster-ca.zip --pass CA_PASSWORD
      CA_PASSWORDをCAに使用したいパスワードに置き換えます。プロダクション環境にデプロイしない場合は、--passオプションとその引数を削除できます。
    • 2.2. 生成されたcross-cluster-ca.zipファイルを解凍します。この圧縮ファイルには、次の内容が含まれています:

Txt

  1. /ca
  2. |_ ca.crt
  3. |_ ca.key
  • 2.3. リモートクラスターのノード用に証明書と秘密鍵のペアを生成します:
    1. ./bin/elasticsearch-certutil cert --out=cross-cluster.p12 --pass=CERT_PASSWORD --ca-cert=ca/ca.crt --ca-key=ca/ca.key --ca-pass=CA_PASSWORD --dns=example.com --ip=127.0.0.1
  • CA_PASSWORDを前のステップのCAパスワードに置き換えます。
    • CERT_PASSWORDを生成された秘密鍵に使用したいパスワードに置き換えます。
    • --dnsオプションを使用して、証明書の関連DNS名を指定します。複数のDNSに対して複数回指定できます。
    • --ipオプションを使用して、証明書の関連IPアドレスを指定します。複数のIPアドレスに対して複数回指定できます。
      • 2.4. リモートクラスターに複数のノードがある場合、次のいずれかを選択できます:
    • すべてのノード用に単一のワイルドカード証明書を作成する。
    • または、手動またはサイレントモードで各ノード用に別々の証明書を作成する。
  • 3. リモートクラスターのすべてのノードで:
    • 3.1. 前のステップで生成されたcross-cluster.p12ファイルをconfigディレクトリにコピーします。ワイルドカード証明書を作成しなかった場合は、正しいノード固有のp12ファイルをコピーしてください。
    • 3.2. elasticsearch.ymlに次の設定を追加します:

Yaml

  1. xpack.security.remote_cluster_server.ssl.enabled: true
  2. xpack.security.remote_cluster_server.ssl.keystore.path: cross-cluster.p12
  • 3.3. SSLキーストアパスワードをElasticsearchキーストアに追加します:
    1. ./bin/elasticsearch-keystore add xpack.security.remote_cluster_server.ssl.keystore.secure_password
    プロンプトが表示されたら、前のステップのCERT_PASSWORDを入力します。
  • 4. リモートクラスターを再起動します。
  • 5. リモートクラスターで、クロスクラスター検索またはクロスクラスター複製に使用したいインデックスへのアクセスを提供するクロスクラスターAPIキーを生成します。クロスクラスターAPIキーを作成するAPIまたはKibanaを使用できます。
  • 6. エンコードされたキー(応答のencoded)を安全な場所にコピーします。後でリモートクラスターに接続するために必要です。

クロスクラスター操作を停止する

ローカルクラスターで、リモートクラスターを参照するすべての永続タスクを停止します:

リモートクラスターに再接続する

ローカルクラスターで:

  • 1. ローカルクラスターのユーザーによって使用されるすべてのロールに、クロスクラスター複製およびクロスクラスター検索のために必要なリモートインデックス権限を強化します。ロールとユーザーの設定を参照してください。注意:
    • クロスクラスター操作に使用される既存のロールに追加のremote_indices権限を割り当てる必要があります。これらの権限は、リモートクラスターの証明書ベースのセキュリティモデルの下で定義されている元のロールからコピーできます。
    • ローカルクラスターのロールは、クロスクラスターAPIキーによって付与されたaccess権限を超えることはできません。追加のローカル権限は、クロスクラスターAPIキーの権限によって抑制されます。
    • クロスクラスター複製またはクロスクラスター検索タスクがsuperuserロールで構成されている場合、更新は必要ありません。superuserロールは、すべてのリモートインデックスへのアクセスを許可するように自動的に更新されます。
    • 名前付きロールを持つ通常のユーザーとして実行されるタスクは、新しい権限で即座に更新されます。タスクは次回実行されるときに新しい定義を読み込みます。
    • APIキーを使用して実行されるタスクは再起動する必要があります(後のステップで実行されます)。
  • 2. リモートクラスターを動的に構成している場合(クラスタ設定APIを介して):
    • 2.1. 現在のリモートクラスター構成を取得し、安全な場所に保存します。後でロールバックが必要な場合があります。クラスタ設定APIを使用します:

Python

  1. resp = client.cluster.get_settings(
  2. filter_path="persistent.cluster.remote",
  3. )
  4. print(resp)

Ruby

  1. response = client.cluster.get_settings(
  2. filter_path: 'persistent.cluster.remote'
  3. )
  4. puts response

Js

  1. const response = await client.cluster.getSettings({
  2. filter_path: "persistent.cluster.remote",
  3. });
  4. console.log(response);

Console

  1. GET /_cluster/settings?filter_path=persistent.cluster.remote
  • 2.2. 既存のリモートクラスター定義をnullに設定して削除します。
  • 3. リモートクラスターを静的に構成している場合(elasticsearch.ymlを介して)、cluster.remote設定をelasticsearch.ymlからコピーし、安全な場所に保存します。後でロールバックが必要な場合があります。
  • 4. ローカルクラスターのすべてのノードで:
    • 4.1. リモートクラスターで以前に生成されたca.crtファイルをconfigディレクトリにコピーし、ファイル名をremote-cluster-ca.crtに変更します。
    • 4.2. elasticsearch.ymlに次の設定を追加します:

Yaml

  1. xpack.security.remote_cluster_client.ssl.enabled: true
  2. xpack.security.remote_cluster_client.ssl.certificate_authorities: [ "remote-cluster-ca.crt" ]
  • 4.3. リモートクラスターで以前に作成されたクロスクラスターAPIキーをキーストアに追加します:
    1. ./bin/elasticsearch-keystore add cluster.remote.ALIAS.credentials
    ALIASを移行前のクロスクラスター操作に使用されたのと同じエイリアスに置き換えます。プロンプトが表示されたら、リモートクラスターで以前に作成されたエンコードされたクロスクラスターAPIキーを入力します。
  • 5. リモートクラスターを動的に構成している場合(クラスタ設定APIを介して):
    • 5.1. ローカルクラスターを再起動して、キーストアと設定の変更を読み込みます。
    • 5.2. リモートクラスターを再追加します。同じリモートクラスターエイリアスを使用し、リモートクラスターのポートにトランスポートポートを変更します。たとえば:

Python

  1. resp = client.cluster.put_settings(
  2. persistent={
  3. "cluster": {
  4. "remote": {
  5. "my_remote": {
  6. "mode": "proxy",
  7. "proxy_address": "my.remote.cluster.com:9443"
  8. }
  9. }
  10. }
  11. },
  12. )
  13. print(resp)

Ruby

  1. response = client.cluster.put_settings(
  2. body: {
  3. persistent: {
  4. cluster: {
  5. remote: {
  6. my_remote: {
  7. mode: 'proxy',
  8. proxy_address: 'my.remote.cluster.com:9443'
  9. }
  10. }
  11. }
  12. }
  13. }
  14. )
  15. puts response

Js

  1. const response = await client.cluster.putSettings({
  2. persistent: {
  3. cluster: {
  4. remote: {
  5. my_remote: {
  6. mode: "proxy",
  7. proxy_address: "my.remote.cluster.com:9443",
  8. },
  9. },
  10. },
  11. },
  12. });
  13. console.log(response);

Console

  1. PUT /_cluster/settings
  2. {
  3. "persistent" : {
  4. "cluster" : {
  5. "remote" : {
  6. "my_remote" : {
  7. "mode": "proxy",
  8. "proxy_address": "my.remote.cluster.com:9443"
  9. }
  10. }
  11. }
  12. }
  13. }
移行前に使用されたのと同じエイリアスのリモートクラスターエイリアス。
リモートクラスターのアドレスとリモートクラスターのポート。デフォルトは9443です。
  • 6. リモートクラスターを静的に構成している場合(elasticsearch.ymlを介して):
    • 6.1. ローカルクラスターの各ノードでcluster.remote設定をelasticsearch.ymlで更新します。ポートをリモートクラスターのポートに変更します。デフォルトは9443です。
    • 6.2. ローカルクラスターを再起動して、キーストアと設定の変更を読み込みます。
  • 7. リモートクラスター情報APIを使用して、ローカルクラスターがリモートクラスターに正常に接続されたことを確認します:

Python

  1. resp = client.cluster.remote_info()
  2. print(resp)

Ruby

  1. response = client.cluster.remote_info
  2. puts response

Js

  1. const response = await client.cluster.remoteInfo();
  2. console.log(response);

Console

  1. GET /_remote/info

APIの応答は、ローカルクラスターがリモートクラスターに接続されたことを示す必要があります:

Console-Result

  1. {
  2. "my_remote": {
  3. "connected": true,
  4. "mode": "proxy",
  5. "proxy_address": "my.remote.cluster.com:9443",
  6. "server_name": "",
  7. "num_proxy_sockets_connected": 0,
  8. "max_proxy_socket_connections": 18,
  9. "initial_connect_timeout": "30s",
  10. "skip_unavailable": false,
  11. "cluster_credentials": "::es_redacted::"
  12. }
  13. }
リモートクラスターが接続されています。
存在する場合、APIキー認証を使用してリモートクラスターが接続されていることを示します。

クロスクラスター操作を再開する

以前に停止した永続タスクを再開します。タスクは、移行前にタスクを作成したのと同じユーザーまたはAPIキーによって再起動される必要があります。このユーザーまたはAPIキーのロールが、必要なremote_indices権限で更新されていることを確認してください。ユーザーの場合、タスクは開始時に呼び出し元の資格情報をキャプチャし、そのユーザーのセキュリティコンテキストで実行されます。APIキーの場合、タスクを再起動すると、タスクが更新されたAPIキーで更新されます。

証明書ベースの認証と認可を無効にする

移行がローカルクラスターで成功したことが確認された場合のみ、このステップを進めてください。移行が失敗した場合は、問題を特定して修正を試みるか、ロールバックを行ってください。

次に、証明書ベースの接続を無効にします。オプションで、認可を取り消すこともできます。

  • 1. 証明書ベースのクロスクラスター接続を有効または無効にする特定の設定はありません。なぜなら、これはクラスター内のノード間通信と同じトランスポートプロトコルを共有するからです。
    リモートクラスターの管理者が既存のローカルクラスターの接続を停止する方法の1つは、TLS信頼を変更することです。正確な手順は、クラスターの構成によって異なります。一般的な解決策は、リモートトランスポートインターフェースで使用されるCAと証明書/キーを再作成することで、既存の証明書/キーがローカルまたは配布されている場合でも信頼されなくなります。
    別の解決策は、トランスポートインターフェースにIPフィルターを適用し、クラスター外からのトラフィックをブロックすることです。
  • 2. オプションで、クロスクラスター操作のみに使用されていたリモートクラスターのロールを削除します。これらのロールは、APIキーに基づくセキュリティモデルの下ではもはや使用されません。

ロールバック

ロールバックが必要な場合は、ローカルクラスターで次の手順を実行します:

  • 1. リモートクラスターを参照するすべての永続タスクを停止します。
  • 2. リモートクラスター設定をnullに設定して、リモートクラスター定義を削除します。
  • 3. 移行中に更新されたロールからremote_indices権限を削除します。
  • 4. 各ノードで、remote_cluster_client.ssl.*設定をelasticsearch.ymlから削除します。
  • 5. ローカルクラスターを再起動して、キーストアとelasticsearch.ymlへの変更を適用します。
  • 6. ローカルクラスターで、元のリモートクラスター設定を適用します。リモートクラスター接続が静的に構成されている場合(elasticsearch.ymlファイルを使用)、クラスターを再起動します。
  • 7. リモートクラスター情報APIを使用して、ローカルクラスターがリモートクラスターに接続されていることを確認します。応答には"connected": trueが含まれ、"cluster_credentials": "::es_redacted::"は含まれないはずです。
  • 8. 以前に停止した永続タスクを再起動します。