TLS証明書認証を使用してリモートクラスターを追加する

TLS証明書認証を使用してリモートクラスターを追加するには:

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

前提条件

  • 1. Elasticsearchのセキュリティ機能は、両方のクラスターのすべてのノードで有効にする必要があります。セキュリティはデフォルトで有効です。無効になっている場合は、xpack.security.enabledtrueに設定してください。 一般的なセキュリティ設定を参照してください。
  • 2. ローカルクラスターとリモートクラスターのバージョンは互換性がある必要があります。
    • 同じメジャーバージョンのノードは、他のノードと通信できます。たとえば、7.0は任意の7.xノードと通信できます。
    • 特定のメジャーバージョンの最後のマイナーバージョンのノードのみが、次のメジャーバージョンのノードと通信できます。6.xシリーズでは、6.8は任意の7.xノードと通信できますが、6.7は7.0としか通信できません。
    • バージョンの互換性は対称的であり、6.7が7.0と通信できる場合、7.0も6.7と通信できます。以下の表は、ローカルノードとリモートノード間のバージョン互換性を示しています。
      バージョン互換性表
      | | | | | | | | | | |
      | —- | —- | —- | —- | —- | —- | —- | —- | —- | —- |
      | | ローカルクラスター |
      | リモートクラスター | 5.0–5.5 | 5.6 | 6.0–6.6 | 6.7 | 6.8 | 7.0 | 7.1–7.16 | 7.17 | 8.0–8.15 |
      | 5.0–5.5 | はい | はい | いいえ | いいえ | いいえ | いいえ | いいえ | いいえ | いいえ |
      | 5.6 | はい | はい | はい | はい | はい | いいえ | いいえ | いいえ | いいえ |
      | 6.0–6.6 | いいえ | はい | はい | はい | はい | いいえ | いいえ | いいえ | いいえ |
      | 6.7 | いいえ | はい | はい | はい | はい | はい | いいえ | いいえ | いいえ |
      | 6.8 | いいえ | はい | はい | はい | はい | はい | はい | はい | いいえ |
      | 7.0 | いいえ | いいえ | いいえ | はい | はい | はい | はい | はい | いいえ |
      | 7.1–7.16 | いいえ | いいえ | いいえ | いいえ | はい | はい | はい | はい | いいえ |
      | 7.17 | いいえ | いいえ | いいえ | いいえ | はい | はい | はい | はい | はい |
      | 8.0–8.15 | いいえ | いいえ | いいえ | いいえ | いいえ | いいえ | いいえ | はい | はい |

Elasticは、これらの構成の一部でのみクロスクラスター検索をサポートしています。サポートされているクロスクラスター検索構成を参照してください。

リモートクラスターとの信頼関係を確立する

リモートクラスターとのクロスクラスター複製またはクロスクラスター検索を安全に使用するには、すべての接続されたクラスターでセキュリティを有効にし、すべてのノードでトランスポート層セキュリティ(TLS)を構成する必要があります。リモートクラスターには、トランスポートインターフェースでTLSセキュリティを構成することが最小限必要です。追加のセキュリティのために、HTTPインターフェースでもTLSを構成してください。

すべての接続されたクラスターは互いに信頼し合い、トランスポートインターフェースでTLSによって相互認証される必要があります。これは、ローカルクラスターがリモートクラスターの証明書機関(CA)を信頼し、リモートクラスターがローカルクラスターのCAを信頼することを意味します。接続を確立する際、すべてのノードは他の側のノードからの証明書を検証します。この相互信頼は、リモートクラスターを安全に接続するために必要です。接続されたすべてのノードは、実質的に単一のセキュリティドメインを形成します。

ユーザー認証はローカルクラスターで行われ、ユーザーとユーザーのロール名はリモートクラスターに渡されます。リモートクラスターは、ユーザーのロール名をローカルロール定義と照合して、ユーザーがアクセスできるインデックスを決定します。

セキュリティが有効なElasticsearchクラスターでクロスクラスター複製またはクロスクラスター検索を使用する前に、次の構成タスクを完了してください:

  • 1. 各ノードでトランスポート層セキュリティ(TLS)を構成して、ノード間のトラフィックを暗号化し、ローカルクラスターのノードとすべてのリモートクラスターのノードを認証します。セキュリティを構成するための必要な手順については、Elastic Stackの基本的なセキュリティを設定するを参照してください。
    この手順では、すべてのノードの証明書を生成するために同じCAを使用します。あるいは、ローカルクラスターの証明書を各リモートクラスターの信頼されたCAとして追加することもできます。また、リモートクラスターの証明書をローカルクラスターの信頼されたCAとして追加する必要があります。すべてのノードの証明書を生成するために同じCAを使用すると、この作業が簡素化されます。

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

リモートクラスターに接続するには、manageクラスターの特権が必要です。

ローカルクラスターは、トランスポートインターフェースを使用してリモートクラスターとの通信を確立します。ローカルクラスターのコーディネートノードは、リモートクラスターの特定のノードと長期間のTCP接続を確立します。Elasticsearchは、接続が長時間アイドル状態であっても、これらの接続が開いたままであることを要求します。

KibanaのStack Managementからリモートクラスターを追加するには:

  • 1. サイドナビゲーションからリモートクラスターを選択します。
  • 2. リモートクラスターの名前(クラスターエイリアス)を入力します。
  • 3. ElasticsearchエンドポイントURL、またはリモートクラスターのIPアドレスまたはホスト名の後にトランスポートポート(デフォルトは9300)を指定します。たとえば、cluster.es.eastus2.staging.azure.foundit.no:9300または192.168.1.1:9300です。

または、クラスター更新設定APIを使用してリモートクラスターを追加できます。このAPIを使用して、ローカルクラスターのすべてのノードに対してリモートクラスターを動的に構成することもできます。ローカルクラスターの個々のノードにリモートクラスターを構成するには、elasticsearch.ymlで各ノードの静的設定を定義します。

次のリクエストは、cluster_oneというエイリアスを持つリモートクラスターを追加します。このクラスターエイリアスは、リモートクラスターへの接続を表す一意の識別子であり、ローカルインデックスとリモートインデックスを区別するために使用されます。

Python

  1. resp = client.cluster.put_settings(
  2. persistent={
  3. "cluster": {
  4. "remote": {
  5. "cluster_one": {
  6. "seeds": [
  7. "127.0.0.1:{remote-interface-default-port}"
  8. ]
  9. }
  10. }
  11. }
  12. },
  13. )
  14. print(resp)

Js

  1. const response = await client.cluster.putSettings({
  2. persistent: {
  3. cluster: {
  4. remote: {
  5. cluster_one: {
  6. seeds: ["127.0.0.1:{remote-interface-default-port}"],
  7. },
  8. },
  9. },
  10. },
  11. });
  12. console.log(response);

コンソール

  1. PUT /_cluster/settings
  2. {
  3. "persistent" : {
  4. "cluster" : {
  5. "remote" : {
  6. "cluster_one" : {
  7. "seeds" : [
  8. "127.0.0.1:9300"
  9. ]
  10. }
  11. }
  12. }
  13. }
  14. }
このリモートクラスターのクラスターエイリアスはcluster_oneです。
リモートクラスターのシードノードのホスト名とトランスポートポートを指定します。

リモートクラスター情報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);

コンソール

  1. GET /_remote/info

APIの応答は、ローカルクラスターがクラスターエイリアスcluster_oneを持つリモートクラスターに接続されていることを示しています:

コンソール-結果

  1. {
  2. "cluster_one" : {
  3. "seeds" : [
  4. "127.0.0.1:9300"
  5. ],
  6. "connected" : true,
  7. "num_nodes_connected" : 1,
  8. "max_connections_per_cluster" : 3,
  9. "initial_connect_timeout" : "30s",
  10. "skip_unavailable" : true,
  11. "mode" : "sniff"
  12. }
  13. }
ローカルクラスターが接続されているリモートクラスターのノード数。
クロスクラスター検索を通じて検索された場合、ノードが利用できない場合はリモートクラスターをスキップするかどうかを示します。

リモートクラスターを動的に構成する

クラスター更新設定APIを使用して、クラスター内のすべてのノードでリモート設定を動的に構成します。次のリクエストは、3つのリモートクラスターを追加します:cluster_onecluster_twocluster_three

  1. `````mode`````パラメータは、構成された接続モードを決定し、デフォルトは[`````sniff`````](7781101e63c937c9.md#sniff-mode)です。`````cluster_one`````は`````mode`````を指定していないため、デフォルトを使用します。`````cluster_two`````と`````cluster_three`````は明示的に異なるモードを使用します。
  2. #### Python
  3. ``````python
  4. resp = client.cluster.put_settings(
  5. persistent={
  6. "cluster": {
  7. "remote": {
  8. "cluster_one": {
  9. "seeds": [
  10. "127.0.0.1:{remote-interface-default-port}"
  11. ]
  12. },
  13. "cluster_two": {
  14. "mode": "sniff",
  15. "seeds": [
  16. "127.0.0.1:{remote-interface-default-port-plus1}"
  17. ],
  18. "transport.compress": True,
  19. "skip_unavailable": True
  20. },
  21. "cluster_three": {
  22. "mode": "proxy",
  23. "proxy_address": "127.0.0.1:{remote-interface-default-port-plus2}"
  24. }
  25. }
  26. }
  27. },
  28. )
  29. print(resp)
  30. `

Js

  1. const response = await client.cluster.putSettings({
  2. persistent: {
  3. cluster: {
  4. remote: {
  5. cluster_one: {
  6. seeds: ["127.0.0.1:{remote-interface-default-port}"],
  7. },
  8. cluster_two: {
  9. mode: "sniff",
  10. seeds: ["127.0.0.1:{remote-interface-default-port-plus1}"],
  11. "transport.compress": true,
  12. skip_unavailable: true,
  13. },
  14. cluster_three: {
  15. mode: "proxy",
  16. proxy_address: "127.0.0.1:{remote-interface-default-port-plus2}",
  17. },
  18. },
  19. },
  20. },
  21. });
  22. console.log(response);

コンソール

  1. PUT _cluster/settings
  2. {
  3. "persistent": {
  4. "cluster": {
  5. "remote": {
  6. "cluster_one": {
  7. "seeds": [
  8. "127.0.0.1:9300"
  9. ]
  10. },
  11. "cluster_two": {
  12. "mode": "sniff",
  13. "seeds": [
  14. "127.0.0.1:9301"
  15. ],
  16. "transport.compress": true,
  17. "skip_unavailable": true
  18. },
  19. "cluster_three": {
  20. "mode": "proxy",
  21. "proxy_address": "127.0.0.1:9302"
  22. }
  23. }
  24. }
  25. }
  26. }

リモートクラスターの初期構成後、設定を動的に更新できます。次のリクエストは、cluster_twoの圧縮設定とcluster_threeの圧縮およびピングスケジュール設定を更新します。

圧縮またはピングスケジュール設定が変更されると、すべての既存のノード接続は閉じて再オープンする必要があり、これにより進行中のリクエストが失敗する可能性があります。

Python

  1. resp = client.cluster.put_settings(
  2. persistent={
  3. "cluster": {
  4. "remote": {
  5. "cluster_two": {
  6. "transport.compress": False
  7. },
  8. "cluster_three": {
  9. "transport.compress": True,
  10. "transport.ping_schedule": "60s"
  11. }
  12. }
  13. }
  14. },
  15. )
  16. print(resp)

Ruby

  1. response = client.cluster.put_settings(
  2. body: {
  3. persistent: {
  4. cluster: {
  5. remote: {
  6. cluster_two: {
  7. 'transport.compress' => false
  8. },
  9. cluster_three: {
  10. 'transport.compress' => true,
  11. 'transport.ping_schedule' => '60s'
  12. }
  13. }
  14. }
  15. }
  16. }
  17. )
  18. puts response

Js

  1. const response = await client.cluster.putSettings({
  2. persistent: {
  3. cluster: {
  4. remote: {
  5. cluster_two: {
  6. "transport.compress": false,
  7. },
  8. cluster_three: {
  9. "transport.compress": true,
  10. "transport.ping_schedule": "60s",
  11. },
  12. },
  13. },
  14. },
  15. });
  16. console.log(response);

コンソール

  1. PUT _cluster/settings
  2. {
  3. "persistent": {
  4. "cluster": {
  5. "remote": {
  6. "cluster_two": {
  7. "transport.compress": false
  8. },
  9. "cluster_three": {
  10. "transport.compress": true,
  11. "transport.ping_schedule": "60s"
  12. }
  13. }
  14. }
  15. }
  16. }

クラスター設定からリモートクラスターを削除するには、各リモートクラスター設定にnullの値を渡します。次のリクエストは、cluster_twoをクラスター設定から削除し、cluster_onecluster_threeをそのままにします:

Python

  1. resp = client.cluster.put_settings(
  2. persistent={
  3. "cluster": {
  4. "remote": {
  5. "cluster_two": {
  6. "mode": None,
  7. "seeds": None,
  8. "skip_unavailable": None,
  9. "transport.compress": None
  10. }
  11. }
  12. }
  13. },
  14. )
  15. print(resp)

Ruby

  1. response = client.cluster.put_settings(
  2. body: {
  3. persistent: {
  4. cluster: {
  5. remote: {
  6. cluster_two: {
  7. mode: nil,
  8. seeds: nil,
  9. skip_unavailable: nil,
  10. 'transport.compress' => nil
  11. }
  12. }
  13. }
  14. }
  15. }
  16. )
  17. puts response

Js

  1. const response = await client.cluster.putSettings({
  2. persistent: {
  3. cluster: {
  4. remote: {
  5. cluster_two: {
  6. mode: null,
  7. seeds: null,
  8. skip_unavailable: null,
  9. "transport.compress": null,
  10. },
  11. },
  12. },
  13. },
  14. });
  15. console.log(response);

コンソール

  1. PUT _cluster/settings
  2. {
  3. "persistent": {
  4. "cluster": {
  5. "remote": {
  6. "cluster_two": {
  7. "mode": null,
  8. "seeds": null,
  9. "skip_unavailable": null,
  10. "transport.compress": null
  11. }
  12. }
  13. }
  14. }
  15. }

リモートクラスターを静的に構成する

  1. [クラスター更新設定API](/read/elasticsearch-8-15/a43f4ba05b0b929e.md)を使用して指定されたリモートクラスター設定は、`````elasticsearch.yml`````で個々のノードに指定された設定よりも優先されます。
  2. 次の例では、`````cluster_one``````````cluster_two``````````cluster_three`````は、各クラスターへの接続を表す任意のクラスターエイリアスです。これらの名前は、その後、ローカルインデックスとリモートインデックスを区別するために使用されます。
  3. #### Yaml
  4. ``````yaml
  5. cluster:
  6. remote:
  7. cluster_one:
  8. seeds: 127.0.0.1:9300
  9. cluster_two:
  10. mode: sniff
  11. seeds: 127.0.0.1:9301
  12. transport.compress: true
  13. skip_unavailable: true
  14. cluster_three:
  15. mode: proxy
  16. proxy_address: 127.0.0.1:9302
  17. `
cluster_twoへのリクエストの圧縮が明示的に有効になっています。
切断されたリモートクラスターはcluster_twoに対してオプションです。
cluster_threeに接続するために使用されるプロキシエンドポイントのアドレス。

リモートクラスターのロールとユーザーを構成する

リモートクラスターに接続した後、ローカルクラスターとリモートクラスターの両方でユーザーロールを作成し、必要な特権を割り当てます。これらのロールは、クロスクラスター複製とクロスクラスター検索を使用するために必要です。

ローカルクラスターとリモートクラスターの両方で同じロール名を使用する必要があります。たとえば、クロスクラスター複製のための次の構成では、ローカルクラスターとリモートクラスターの両方でremote-replicationロール名を使用します。ただし、各クラスターで異なるロール定義を指定することもできます。

KibanaのStack Managementからセキュリティ > ロールを選択することで、ユーザーとロールを管理できます。また、ロール管理APIを使用して、ロールを動的に追加、更新、削除、取得できます。native領域でロールを管理するためにAPIを使用すると、ロールは内部Elasticsearchインデックスに保存されます。

次のリクエストは、ロールの作成または更新APIを使用します。このAPIを使用するには、少なくともmanage_securityクラスターの特権が必要です。

クロスクラスター複製の特権を構成する

クロスクラスター複製ユーザーは、リモートクラスターとローカルクラスターで異なるクラスターおよびインデックスの特権を必要とします。次のリクエストを使用して、ローカルクラスターとリモートクラスターで別々のロールを作成し、必要なロールを持つユーザーを作成します。

リモートクラスター

リーダーインデックスを含むリモートクラスターでは、クロスクラスター複製ロールはread_ccrクラスターの特権と、リーダーインデックスに対するmonitorおよびreadの特権を必要とします。

リクエストがAPIキーで認証されている場合、APIキーはローカルクラスターで上記の特権を必要とします。

リクエストが他のユーザーの代理で発行される場合、認証ユーザーはリモートクラスターでrun_asの特権を持っている必要があります。

次のリクエストは、リモートクラスターにremote-replicationロールを作成します:

Python

  1. resp = client.security.put_role(
  2. name="remote-replication",
  3. cluster=[
  4. "read_ccr"
  5. ],
  6. indices=[
  7. {
  8. "names": [
  9. "leader-index-name"
  10. ],
  11. "privileges": [
  12. "monitor",
  13. "read"
  14. ]
  15. }
  16. ],
  17. )
  18. print(resp)

Js

  1. const response = await client.security.putRole({
  2. name: "remote-replication",
  3. cluster: ["read_ccr"],
  4. indices: [
  5. {
  6. names: ["leader-index-name"],
  7. privileges: ["monitor", "read"],
  8. },
  9. ],
  10. });
  11. console.log(response);

コンソール

  1. POST /_security/role/remote-replication
  2. {
  3. "cluster": [
  4. "read_ccr"
  5. ],
  6. "indices": [
  7. {
  8. "names": [
  9. "leader-index-name"
  10. ],
  11. "privileges": [
  12. "monitor",
  13. "read"
  14. ]
  15. }
  16. ]
  17. }

ローカルクラスター

フォロワーインデックスを含むローカルクラスターでは、remote-replicationロールはmanage_ccrクラスターの特権と、フォロワーインデックスに対するmonitorreadwrite、およびmanage_follow_indexの特権を必要とします。

次のリクエストは、ローカルクラスターにremote-replicationロールを作成します:

Python

  1. resp = client.security.put_role(
  2. name="remote-replication",
  3. cluster=[
  4. "manage_ccr"
  5. ],
  6. indices=[
  7. {
  8. "names": [
  9. "follower-index-name"
  10. ],
  11. "privileges": [
  12. "monitor",
  13. "read",
  14. "write",
  15. "manage_follow_index"
  16. ]
  17. }
  18. ],
  19. )
  20. print(resp)

Js

  1. const response = await client.security.putRole({
  2. name: "remote-replication",
  3. cluster: ["manage_ccr"],
  4. indices: [
  5. {
  6. names: ["follower-index-name"],
  7. privileges: ["monitor", "read", "write", "manage_follow_index"],
  8. },
  9. ],
  10. });
  11. console.log(response);

コンソール

  1. POST /_security/role/remote-replication
  2. {
  3. "cluster": [
  4. "manage_ccr"
  5. ],
  6. "indices": [
  7. {
  8. "names": [
  9. "follower-index-name"
  10. ],
  11. "privileges": [
  12. "monitor",
  13. "read",
  14. "write",
  15. "manage_follow_index"
  16. ]
  17. }
  18. ]
  19. }

各クラスターでremote-replicationロールを作成した後、ユーザーの作成または更新APIを使用して、ローカルクラスターにユーザーを作成し、remote-replicationロールを割り当てます。たとえば、次のリクエストは、cross-cluster-userという名前のユーザーにremote-replicationロールを割り当てます:

Python

  1. resp = client.security.put_user(
  2. username="cross-cluster-user",
  3. password="l0ng-r4nd0m-p@ssw0rd",
  4. roles=[
  5. "remote-replication"
  6. ],
  7. )
  8. print(resp)

Js

  1. const response = await client.security.putUser({
  2. username: "cross-cluster-user",
  3. password: "l0ng-r4nd0m-p@ssw0rd",
  4. roles: ["remote-replication"],
  5. });
  6. console.log(response);

コンソール

  1. POST /_security/user/cross-cluster-user
  2. {
  3. "password" : "l0ng-r4nd0m-p@ssw0rd",
  4. "roles" : [ "remote-replication" ]
  5. }

このユーザーはローカルクラスターでのみ作成する必要があります。

その後、クロスクラスター複製を構成することで、データをデータセンター間で複製できます。

クロスクラスター検索の特権を構成する

クロスクラスター検索ユーザーは、リモートクラスターとローカルクラスターで異なるクラスターおよびインデックスの特権を必要とします。次のリクエストを使用して、ローカルクラスターとリモートクラスターで別々のロールを作成し、必要なロールを持つユーザーを作成します。

リモートクラスター

リモートクラスターでは、クロスクラスター検索ロールはターゲットインデックスに対してreadおよびread_cross_clusterの特権を必要とします。

リクエストがAPIキーで認証されている場合、APIキーはローカルクラスターで上記の特権を必要とします。

リクエストが他のユーザーの代理で発行される場合、認証ユーザーはリモートクラスターでrun_asの特権を持っている必要があります。

次のリクエストは、リモートクラスターにremote-searchロールを作成します:

Python

  1. resp = client.security.put_role(
  2. name="remote-search",
  3. indices=[
  4. {
  5. "names": [
  6. "target-indices"
  7. ],
  8. "privileges": [
  9. "read",
  10. "read_cross_cluster"
  11. ]
  12. }
  13. ],
  14. )
  15. print(resp)

Js

  1. const response = await client.security.putRole({
  2. name: "remote-search",
  3. indices: [
  4. {
  5. names: ["target-indices"],
  6. privileges: ["read", "read_cross_cluster"],
  7. },
  8. ],
  9. });
  10. console.log(response);

コンソール

  1. POST /_security/role/remote-search
  2. {
  3. "indices": [
  4. {
  5. "names": [
  6. "target-indices"
  7. ],
  8. "privileges": [
  9. "read",
  10. "read_cross_cluster"
  11. ]
  12. }
  13. ]
  14. }

ローカルクラスター

クロスクラスター検索を開始するために使用されるクラスターであるローカルクラスターでは、ユーザーはremote-searchロールのみが必要です。ロールの特権は空であってもかまいません。

次のリクエストは、ローカルクラスターにremote-searchロールを作成します:

Python

  1. resp = client.security.put_role(
  2. name="remote-search",
  3. )
  4. print(resp)

Js

  1. const response = await client.security.putRole({
  2. name: "remote-search",
  3. });
  4. console.log(response);

コンソール

  1. POST /_security/role/remote-search
  2. {}

各クラスターでremote-searchロールを作成した後、ユーザーの作成または更新APIを使用して、ローカルクラスターにユーザーを作成し、remote-searchロールを割り当てます。たとえば、次のリクエストは、cross-search-userという名前のユーザーにremote-searchロールを割り当てます:

Python

  1. resp = client.security.put_user(
  2. username="cross-search-user",
  3. password="l0ng-r4nd0m-p@ssw0rd",
  4. roles=[
  5. "remote-search"
  6. ],
  7. )
  8. print(resp)

Js

  1. const response = await client.security.putUser({
  2. username: "cross-search-user",
  3. password: "l0ng-r4nd0m-p@ssw0rd",
  4. roles: ["remote-search"],
  5. });
  6. console.log(response);

コンソール

  1. POST /_security/user/cross-search-user
  2. {
  3. "password" : "l0ng-r4nd0m-p@ssw0rd",
  4. "roles" : [ "remote-search" ]
  5. }

このユーザーはローカルクラスターでのみ作成する必要があります。

  1. ### クロスクラスター検索とKibanaの特権を構成する
  2. Kibanaを使用して複数のクラスターを検索する場合、2段階の認可プロセスが、ユーザーがリモートクラスターのデータストリームおよびインデックスにアクセスできるかどうかを決定します:
  3. - 最初に、ローカルクラスターがユーザーがリモートクラスターにアクセスする権限があるかどうかを判断します。ローカルクラスターはKibanaが接続されているクラスターです。
  4. - ユーザーが権限を持っている場合、リモートクラスターは次に、ユーザーが指定されたデータストリームおよびインデックスにアクセスできるかどうかを判断します。
  5. Kibanaユーザーにリモートクラスターへのアクセスを付与するには、リモートクラスターのインデックスに対する読み取り特権を持つローカルロールを割り当てます。リモートクラスターのデータストリームおよびインデックスを`````<remote_cluster_name>:<target>`````として指定します。
  6. リモートデータストリームおよびインデックスに対する読み取りアクセスをユーザーに付与するには、適切なデータストリームおよびインデックスへのアクセスを持つ`````read_cross_cluster`````特権を付与するリモートクラスターで一致するロールを作成する必要があります。
  7. たとえば、ローカルクラスターでLogstashデータを積極的にインデックスし、定期的に古い時間ベースのインデックスをリモートクラスターのアーカイブにオフロードすることがあります。両方のクラスターを検索したい場合は、両方のクラスターでKibanaユーザーを有効にする必要があります。
  8. #### ローカルクラスター
  9. ローカルクラスターで、ローカル`````logstash-*`````インデックスに対して`````read`````および`````view_index_metadata`````の特権を付与する`````logstash-reader`````ロールを作成します。
  10. ローカルクラスターをElasticsearchの別のリモートとして構成する場合、ローカルクラスターの`````logstash-reader`````ロールも`````read_cross_cluster`````特権を付与する必要があります。
  11. #### Python
  12. ``````python
  13. resp = client.security.put_role(
  14. name="logstash-reader",
  15. indices=[
  16. {
  17. "names": [
  18. "logstash-*"
  19. ],
  20. "privileges": [
  21. "read",
  22. "view_index_metadata"
  23. ]
  24. }
  25. ],
  26. )
  27. print(resp)
  28. `

Js

  1. const response = await client.security.putRole({
  2. name: "logstash-reader",
  3. indices: [
  4. {
  5. names: ["logstash-*"],
  6. privileges: ["read", "view_index_metadata"],
  7. },
  8. ],
  9. });
  10. console.log(response);

コンソール

  1. POST /_security/role/logstash-reader
  2. {
  3. "indices": [
  4. {
  5. "names": [
  6. "logstash-*"
  7. ],
  8. "privileges": [
  9. "read",
  10. "view_index_metadata"
  11. ]
  12. }
  13. ]
  14. }

Kibanaユーザーにアクセスを付与するロールを割り当て、logstash_readerロールも割り当てます。たとえば、次のリクエストは、cross-cluster-kibanaユーザーを作成し、kibana-accessおよびlogstash-readerロールを割り当てます。

Python

  1. resp = client.security.put_user(
  2. username="cross-cluster-kibana",
  3. password="l0ng-r4nd0m-p@ssw0rd",
  4. roles=[
  5. "logstash-reader",
  6. "kibana-access"
  7. ],
  8. )
  9. print(resp)

Js

  1. const response = await client.security.putUser({
  2. username: "cross-cluster-kibana",
  3. password: "l0ng-r4nd0m-p@ssw0rd",
  4. roles: ["logstash-reader", "kibana-access"],
  5. });
  6. console.log(response);

コンソール

  1. PUT /_security/user/cross-cluster-kibana
  2. {
  3. "password" : "l0ng-r4nd0m-p@ssw0rd",
  4. "roles" : [
  5. "logstash-reader",
  6. "kibana-access"
  7. ]
  8. }

リモートクラスター

リモートクラスターで、logstash-readerロールを作成し、read_cross_cluster特権とreadおよびview_index_metadata特権をlogstash-*インデックスに付与します。

Python

  1. resp = client.security.put_role(
  2. name="logstash-reader",
  3. indices=[
  4. {
  5. "names": [
  6. "logstash-*"
  7. ],
  8. "privileges": [
  9. "read_cross_cluster",
  10. "read",
  11. "view_index_metadata"
  12. ]
  13. }
  14. ],
  15. )
  16. print(resp)

Js

  1. const response = await client.security.putRole({
  2. name: "logstash-reader",
  3. indices: [
  4. {
  5. names: ["logstash-*"],
  6. privileges: ["read_cross_cluster", "read", "view_index_metadata"],
  7. },
  8. ],
  9. });
  10. console.log(response);

コンソール

  1. POST /_security/role/logstash-reader
  2. {
  3. "indices": [
  4. {
  5. "names": [
  6. "logstash-*"
  7. ],
  8. "privileges": [
  9. "read_cross_cluster",
  10. "read",
  11. "view_index_metadata"
  12. ]
  13. }
  14. ]
  15. }