リモートクラスターを証明書からAPIキー認証に移行する
リモートクラスターのAPIキーベースのセキュリティモデルは、TLS証明書ベースのセキュリティモデルに比べて、管理者により細かいアクセス制御を提供します。そのため、証明書ベースのセキュリティモデルからAPIキーベースのモデルに移行したい場合があります。
新しいエイリアスを使用して新しいリモートクラスター接続を定義することで移行することは可能ですが、いくつかの欠点があります:
- クロスクラスター複製の場合、既存のタスクのリーダークラスターエイリアスを変更することはできません。その結果、新しいリモートクラスターでは、フォロワーインデックスを最初から再作成する必要があります。
- クロスクラスター検索の場合、変換および異常検出ジョブはリモートクラスターエイリアスの更新を許可します。ただし、たとえば
*:source_index
およびsuperuser
のようにワイルドカードで作成されたジョブの場合、新しいリモートクラスターを追加すると、ジョブが二重の作業を行い、結果が重複して歪む可能性があります。
これらの理由から、次の手順に従ってリモートクラスターをインプレースで移行することをお勧めします:
- 1. 前提条件を確認する
- 2. リモートクラスターを再構成し、クロスクラスターAPIキーを生成する
- 3. クロスクラスター操作を停止する
- 4. リモートクラスターに再接続する
- 5. クロスクラスター操作を再開する
- 6. 証明書ベースの認証と認可を無効にする
問題が発生した場合は、トラブルシューティングを参照してください。
前提条件
- ローカルおよびリモートクラスターのノードは、バージョン8.10以上である必要があります。
- ローカルおよびリモートクラスターは、適切なライセンスを持っている必要があります。詳細については、https://www.elastic.co/subscriptionsを参照してください。
リモートクラスターを再構成し、クロスクラスターAPIキーを生成する
リモートクラスターで:
- 1. リモートクラスターサーバーをリモートクラスターのすべてのノードで有効にします。
elasticsearch.yml
で:- 1.1.
remote_cluster_server.enabled
をtrue
に設定します。 - 1.2. リモートクラスターサーバートラフィックのバインドおよび公開アドレスを設定します。たとえば、
remote_cluster.host
を使用します。アドレスを設定しないと、リモートクラスターのトラフィックがローカルインターフェースにバインドされ、他のマシンで実行されているリモートクラスターに接続できなくなります。 - 1.3. オプションで、
remote_cluster.port
を使用してリモートサーバーポートを設定します(デフォルトは9443
です)。
- 1.1.
- 2. 次に、証明書機関(CA)とサーバー証明書/キーのペアを生成します。リモートクラスターのノードの1つで、Elasticsearchがインストールされているディレクトリから:
- 2.1. CAがまだない場合は、CAを作成します:
./bin/elasticsearch-certutil ca --pem --out=cross-cluster-ca.zip --pass CA_PASSWORD
CA_PASSWORD
をCAに使用したいパスワードに置き換えます。プロダクション環境にデプロイしない場合は、--pass
オプションとその引数を削除できます。 - 2.2. 生成された
cross-cluster-ca.zip
ファイルを解凍します。この圧縮ファイルには、次の内容が含まれています:
- 2.1. CAがまだない場合は、CAを作成します:
Txt
/ca
|_ ca.crt
|_ ca.key
- 2.3. リモートクラスターのノード用に証明書と秘密鍵のペアを生成します:
./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
に次の設定を追加します:
- 3.1. 前のステップで生成された
Yaml
xpack.security.remote_cluster_server.ssl.enabled: true
xpack.security.remote_cluster_server.ssl.keystore.path: cross-cluster.p12
- 3.3. SSLキーストアパスワードをElasticsearchキーストアに追加します:
プロンプトが表示されたら、前のステップの./bin/elasticsearch-keystore add xpack.security.remote_cluster_server.ssl.keystore.secure_password
CERT_PASSWORD
を入力します。 - 4. リモートクラスターを再起動します。
- 5. リモートクラスターで、クロスクラスター検索またはクロスクラスター複製に使用したいインデックスへのアクセスを提供するクロスクラスターAPIキーを生成します。クロスクラスターAPIキーを作成するAPIまたはKibanaを使用できます。
- 6. エンコードされたキー(応答の
encoded
)を安全な場所にコピーします。後でリモートクラスターに接続するために必要です。
クロスクラスター操作を停止する
ローカルクラスターで、リモートクラスターを参照するすべての永続タスクを停止します:
- 変換を停止するAPIを使用して、すべての変換を停止します。
- ジョブを閉じるAPIを使用して、すべての異常検出ジョブを閉じます。
- 自動フォローパターンを一時停止するAPIを使用して、自動フォロークロスクラスター複製を一時停止します。
- フォロワーを一時停止するAPIを使用して、手動クロスクラスター複製または自動フォローパターンから作成された既存のインデックスを一時停止します。
リモートクラスターに再接続する
ローカルクラスターで:
- 1. ローカルクラスターのユーザーによって使用されるすべてのロールに、クロスクラスター複製およびクロスクラスター検索のために必要なリモートインデックス権限を強化します。ロールとユーザーの設定を参照してください。注意:
- クロスクラスター操作に使用される既存のロールに追加の
remote_indices
権限を割り当てる必要があります。これらの権限は、リモートクラスターの証明書ベースのセキュリティモデルの下で定義されている元のロールからコピーできます。 - ローカルクラスターのロールは、クロスクラスターAPIキーによって付与された
access
権限を超えることはできません。追加のローカル権限は、クロスクラスターAPIキーの権限によって抑制されます。 - クロスクラスター複製またはクロスクラスター検索タスクが
superuser
ロールで構成されている場合、更新は必要ありません。superuser
ロールは、すべてのリモートインデックスへのアクセスを許可するように自動的に更新されます。 - 名前付きロールを持つ通常のユーザーとして実行されるタスクは、新しい権限で即座に更新されます。タスクは次回実行されるときに新しい定義を読み込みます。
- APIキーを使用して実行されるタスクは再起動する必要があります(後のステップで実行されます)。
- クロスクラスター操作に使用される既存のロールに追加の
- 2. リモートクラスターを動的に構成している場合(クラスタ設定APIを介して):
- 2.1. 現在のリモートクラスター構成を取得し、安全な場所に保存します。後でロールバックが必要な場合があります。クラスタ設定APIを使用します:
Python
resp = client.cluster.get_settings(
filter_path="persistent.cluster.remote",
)
print(resp)
Ruby
response = client.cluster.get_settings(
filter_path: 'persistent.cluster.remote'
)
puts response
Js
const response = await client.cluster.getSettings({
filter_path: "persistent.cluster.remote",
});
console.log(response);
Console
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
に次の設定を追加します:
- 4.1. リモートクラスターで以前に生成された
Yaml
xpack.security.remote_cluster_client.ssl.enabled: true
xpack.security.remote_cluster_client.ssl.certificate_authorities: [ "remote-cluster-ca.crt" ]
- 4.3. リモートクラスターで以前に作成されたクロスクラスターAPIキーをキーストアに追加します:
./bin/elasticsearch-keystore add cluster.remote.ALIAS.credentials
ALIAS
を移行前のクロスクラスター操作に使用されたのと同じエイリアスに置き換えます。プロンプトが表示されたら、リモートクラスターで以前に作成されたエンコードされたクロスクラスターAPIキーを入力します。 - 5. リモートクラスターを動的に構成している場合(クラスタ設定APIを介して):
- 5.1. ローカルクラスターを再起動して、キーストアと設定の変更を読み込みます。
- 5.2. リモートクラスターを再追加します。同じリモートクラスターエイリアスを使用し、リモートクラスターのポートにトランスポートポートを変更します。たとえば:
Python
resp = client.cluster.put_settings(
persistent={
"cluster": {
"remote": {
"my_remote": {
"mode": "proxy",
"proxy_address": "my.remote.cluster.com:9443"
}
}
}
},
)
print(resp)
Ruby
response = client.cluster.put_settings(
body: {
persistent: {
cluster: {
remote: {
my_remote: {
mode: 'proxy',
proxy_address: 'my.remote.cluster.com:9443'
}
}
}
}
}
)
puts response
Js
const response = await client.cluster.putSettings({
persistent: {
cluster: {
remote: {
my_remote: {
mode: "proxy",
proxy_address: "my.remote.cluster.com:9443",
},
},
},
},
});
console.log(response);
Console
PUT /_cluster/settings
{
"persistent" : {
"cluster" : {
"remote" : {
"my_remote" : {
"mode": "proxy",
"proxy_address": "my.remote.cluster.com:9443"
}
}
}
}
}
移行前に使用されたのと同じエイリアスのリモートクラスターエイリアス。 | |
リモートクラスターのアドレスとリモートクラスターのポート。デフォルトは9443 です。 |
- 6. リモートクラスターを静的に構成している場合(
elasticsearch.yml
を介して):- 6.1. ローカルクラスターの各ノードで
cluster.remote
設定をelasticsearch.yml
で更新します。ポートをリモートクラスターのポートに変更します。デフォルトは9443
です。 - 6.2. ローカルクラスターを再起動して、キーストアと設定の変更を読み込みます。
- 6.1. ローカルクラスターの各ノードで
- 7. リモートクラスター情報APIを使用して、ローカルクラスターがリモートクラスターに正常に接続されたことを確認します:
Python
resp = client.cluster.remote_info()
print(resp)
Ruby
response = client.cluster.remote_info
puts response
Js
const response = await client.cluster.remoteInfo();
console.log(response);
Console
GET /_remote/info
APIの応答は、ローカルクラスターがリモートクラスターに接続されたことを示す必要があります:
Console-Result
{
"my_remote": {
"connected": true,
"mode": "proxy",
"proxy_address": "my.remote.cluster.com:9443",
"server_name": "",
"num_proxy_sockets_connected": 0,
"max_proxy_socket_connections": 18,
"initial_connect_timeout": "30s",
"skip_unavailable": false,
"cluster_credentials": "::es_redacted::"
}
}
リモートクラスターが接続されています。 | |
存在する場合、APIキー認証を使用してリモートクラスターが接続されていることを示します。 |
クロスクラスター操作を再開する
以前に停止した永続タスクを再開します。タスクは、移行前にタスクを作成したのと同じユーザーまたはAPIキーによって再起動される必要があります。このユーザーまたはAPIキーのロールが、必要なremote_indices
権限で更新されていることを確認してください。ユーザーの場合、タスクは開始時に呼び出し元の資格情報をキャプチャし、そのユーザーのセキュリティコンテキストで実行されます。APIキーの場合、タスクを再起動すると、タスクが更新されたAPIキーで更新されます。
- 変換を開始するAPIを使用して、すべての変換を開始します。
- ジョブを開くAPIを使用して、すべての異常検出ジョブを開きます。
- フォロワーを再開する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. 以前に停止した永続タスクを再起動します。