CLOVER🍀

That was when it all began.

Elasticsearchクラスタで、SSL/TLSの設定をする

これは、なにをしたくて書いたもの?

以前、ElasticsearchのシングルノードでX-Pack Securityの簡単な設定をしてみました。

Elasticsearch(シングルノード)で、認証・認可設定をする - CLOVER🍀

今度は、クラスタとして構成したElasticsearchで行ってみたいと思います。

無料の暗号化とユーザー認証で、Elasticsearchクラスターを安全に保つ | Elastic Blog

SSL、TLS、HTTPSを設定してElasticsearch/Kibana/Beats/Logstashを安全に保つ | Elastic Blog

セキュリティ機能のはじめ方 | Elastic Blog

こちらの情報から、シングルノードで使っているか、クラスタで使っているかには差がありそうです。

This requirement applies to clusters with more than one node and to clusters with a single node that listens on an external interface. Single-node clusters that use a loopback interface do not have this requirement. For more information, see Encrypting communications.

Configuring security in Elasticsearch | Elasticsearch Reference [7.6] | Elastic

今回は、クラスタ構成のElasticsearchでX-Pack Securityの設定をしてみましょう。

環境

今回の環境は、こちら。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.3 LTS
Release:    18.04
Codename:   bionic


$ java --version
openjdk 11.0.6 2020-01-14
OpenJDK Runtime Environment (build 11.0.6+10-post-Ubuntu-1ubuntu118.04.1)
OpenJDK 64-Bit Server VM (build 11.0.6+10-post-Ubuntu-1ubuntu118.04.1, mixed mode, sharing)


$ curl localhost:9200
{
  "name" : "node-1",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "vl9L1QQeQiSUPzrYlFOMFw",
  "version" : {
    "number" : "7.6.0",
    "build_flavor" : "default",
    "build_type" : "deb",
    "build_hash" : "7f634e9f44834fbc12724506cc1da681b0c3b1e3",
    "build_date" : "2020-02-06T00:09:00.449973Z",
    "build_snapshot" : false,
    "lucene_version" : "8.4.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

Ubuntu Linux 18.04 LTS、OpenJDK 11、Elasticsearch 7.6.0です。Elasticsearchは、aptでインストールしました。

Elasticsearchは、以下の3ノードでクラスタを構成済みとしています。

$ curl localhost:9200/_cat/nodes?v
ip            heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.33.12           19          95  10    0.74    1.06     0.58 dilm      -      node-2
192.168.33.11           17          97  10    0.85    1.05     0.57 dilm      -      node-1
192.168.33.13           11          95  12    0.75    1.13     0.62 dilm      *      node-3

ノードは3つで、それぞれ以下とします。

  • node-1 … 192.168.33.11
  • node-2 … 192.168.33.12
  • node-3 … 192.168.33.13

設定は、こんな感じです。
※「node.name」はノードごとに異なります

$ sudo grep -vE '# *' /etc/elasticsearch/elasticsearch.yml
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
node.name: node-1  # 他ノードでは、node-2、node-3
network.host: 0.0.0.0
discovery.seed_hosts:
   - "192.168.33.11"
   - "192.168.33.12"
   - "192.168.33.13"
cluster.initial_master_nodes:
   - "192.168.33.11"
   - "192.168.33.12"
   - "192.168.33.13"

この環境に対して、X-Pack Securityを有効化して、最低限の設定をしていってみましょう。

X-Pack Securityを有効にする

とりあえず、X-Pack Securityを有効化しましょう。

基本的な流れは、こちら。

Configuring security in Elasticsearch | Elasticsearch Reference [7.6] | Elastic

X-Pack Securityに関する設定。

Security settings in Elasticsearch | Elasticsearch Reference [7.6] | Elastic

SSL/TLSに関する話。

Encrypting communications | Elasticsearch Reference [7.6] | Elastic

Setting up TLS on a cluster | Elasticsearch Reference [7.6] | Elastic

Encrypting communications in Elasticsearch | Elasticsearch Reference [7.6] | Elastic

まずは、node-1でelasticsearch.ymlを編集して

xpack.security.enabled: true

再起動してみます。

$ sudo systemctl restart elasticsearch
Job for elasticsearch.service failed because the control process exited with error code.
See "systemctl status elasticsearch.service" and "journalctl -xe" for details.

すると、なんと起動に失敗します。

ログを見てみます。

$ sudo journalctl -u elasticsearch
-- Logs begin at Sat 2020-02-15 09:19:00 UTC, end at Sat 2020-02-15 09:53:18 UTC. --
Feb 15 09:27:23 ubuntu1804.localdomain systemd[1]: Starting Elasticsearch...
Feb 15 09:27:23 ubuntu1804.localdomain elasticsearch[5845]: OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed
Feb 15 09:28:53 ubuntu1804.localdomain systemd[1]: Started Elasticsearch.
Feb 15 09:52:38 ubuntu1804.localdomain systemd[1]: Stopping Elasticsearch...
Feb 15 09:52:38 ubuntu1804.localdomain systemd[1]: Stopped Elasticsearch.
Feb 15 09:52:39 ubuntu1804.localdomain systemd[1]: Starting Elasticsearch...
Feb 15 09:52:40 ubuntu1804.localdomain elasticsearch[6223]: OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed
Feb 15 09:52:55 ubuntu1804.localdomain elasticsearch[6223]: ERROR: [1] bootstrap checks failed
Feb 15 09:52:55 ubuntu1804.localdomain elasticsearch[6223]: [1]: Transport SSL must be enabled if security is enabled on a [basic] license. Please set [xpack.security.transport
Feb 15 09:52:55 ubuntu1804.localdomain elasticsearch[6223]: ERROR: Elasticsearch did not exit normally - check the logs at /var/log/elasticsearch/elasticsearch.log
Feb 15 09:52:55 ubuntu1804.localdomain systemd[1]: elasticsearch.service: Main process exited, code=exited, status=78/n/a
Feb 15 09:52:55 ubuntu1804.localdomain systemd[1]: elasticsearch.service: Failed with result 'exit-code'.
Feb 15 09:52:55 ubuntu1804.localdomain systemd[1]: Failed to start Elasticsearch.
$ sudo cat /var/log/elasticsearch/elasticsearch.log
〜省略〜

[2020-02-15T01:52:46,687][INFO ][o.e.p.PluginsService     ] [node-1] no plugins loaded
[2020-02-15T01:52:51,564][INFO ][o.e.x.s.a.s.FileRolesStore] [node-1] parsed [0] roles from file [/etc/elasticsearch/roles.yml]
[2020-02-15T01:52:52,158][INFO ][o.e.x.m.p.l.CppLogMessageHandler] [node-1] [controller/6335] [Main.cc@110] controller (64 bit): Version 7.6.0 (Build 1c8cca13fa9631) Copyright (c) 2020 Elasticsearch BV
[2020-02-15T01:52:52,772][DEBUG][o.e.a.ActionModule       ] [node-1] Using REST wrapper from plugin org.elasticsearch.xpack.security.Security
[2020-02-15T01:52:52,946][INFO ][o.e.d.DiscoveryModule    ] [node-1] using discovery type [zen] and seed hosts providers [settings]
[2020-02-15T01:52:54,427][INFO ][o.e.n.Node               ] [node-1] initialized
[2020-02-15T01:52:54,427][INFO ][o.e.n.Node               ] [node-1] starting ...
[2020-02-15T01:52:54,639][INFO ][o.e.t.TransportService   ] [node-1] publish_address {192.168.33.11:9300}, bound_addresses {0.0.0.0:9300}
[2020-02-15T01:52:55,513][INFO ][o.e.b.BootstrapChecks    ] [node-1] bound or publishing to a non-loopback address, enforcing bootstrap checks
[2020-02-15T01:52:55,540][ERROR][o.e.b.Bootstrap          ] [node-1] node validation exception
[1] bootstrap checks failed
[1]: Transport SSL must be enabled if security is enabled on a [basic] license. Please set [xpack.security.transport.ssl.enabled] to [true] or disable security by setting [xpack.security.enabled] to [false]
[2020-02-15T01:52:55,549][INFO ][o.e.n.Node               ] [node-1] stopping ...
[2020-02-15T01:52:55,576][INFO ][o.e.n.Node               ] [node-1] stopped
[2020-02-15T01:52:55,577][INFO ][o.e.n.Node               ] [node-1] closing ...
[2020-02-15T01:52:55,597][INFO ][o.e.n.Node               ] [node-1] closed
[2020-02-15T01:52:55,600][INFO ][o.e.x.m.p.NativeController] [node-1] Native controller process has stopped - no new native processes can be starte

「Basicライセンスの場合、SSLを有効にしなさい」と言われていますね。

Transport SSL must be enabled if security is enabled on a [basic] license. Please set [xpack.security.transport.ssl.enabled] to [true] or disable security by setting [xpack.security.enabled] to [false]

というわけで、Basicライセンスでクラスタを構成している時には、SSL/TLSの設定は必須のようです。
※これ以上のライセンス(サブスクリプション)を選択すると、そうでもないみたいですが

とりあえず、各ノードのElasticsearchは停止しておきます。

$ sudo systemctl stop elasticsearch

SSL/TLSを設定する

では、ドキュメントに沿ってSSL/TLSの設定をしていきましょう。

Encrypting communications | Elasticsearch Reference [7.6] | Elastic

Tutorial: Encrypting communications | Elasticsearch Reference [7.6] | Elastic

どういうことをする必要があるかは、こちらに記載があります。

Setting up TLS on a cluster | Elasticsearch Reference [7.6] | Elastic

  • ノードごとに、秘密鍵、X.509証明書を作成する
  • トランスポート層でTLSを有効にする
    • オプションとして、HTTPレイヤーでもTLSを有効にできる(HTTPSを使える)

あとは、監視の設定や、Kibana、Logstash、Beatsなどからの接続設定を行います。このあたりは、上記ドキュメントにリンクがあるので
そちらからたどってください。今回はパスします。

まずは、CA証明書を作成(これはオプションらしいですが)。「/etc/elasticsearch」ディレクトリ配下に作成しましょう。
「--pass」は、CA証明書のパスワードです。

$ sudo /usr/share/elasticsearch/bin/elasticsearch-certutil ca --out /etc/elasticsearch/elastic-stack-ca.p12 --pass capass

「--out」および「--pass」を指定しない場合は、ファイル名とパスワードを聞かれます。

Please enter the desired output file [elastic-stack-ca.p12]: 
Enter password for elastic-stack-ca.p12 :

パスワードを指定したくない場合は、以下のように「--pass」に空文字を指定するか、対話時になにも入力せずにEnterを押します。

$ sudo /usr/share/elasticsearch/bin/elasticsearch-certutil ca --out /etc/elasticsearch/elastic-stack-ca.p12 --pass ''

ちなみに、「--out」で出力先ディレクトリを指定しない場合は、こちらにできます。

$ ls -l /usr/share/elasticsearch
total 544
drwxr-xr-x  2 root root   4096 Feb 15 09:26 bin
-rw-------  1 root root   2527 Feb 15 10:28 elastic-stack-ca.p12
drwxr-xr-x  9 root root   4096 Feb 15 09:26 jdk
drwxr-xr-x  3 root root   4096 Feb 15 09:26 lib
drwxr-xr-x 39 root root   4096 Feb 15 09:25 modules
-rw-rw-r--  1 root root 523209 Feb  6 00:20 NOTICE.txt
drwxr-xr-x  2 root root   4096 Feb  6 00:20 plugins
-rw-r--r--  1 root root   8164 Feb  6 00:19 README.asciidoc

これは微妙な場所なので、やめておこうかなと…。

その他の調整をしたかったら、ヘルプを見てオプションを設定しましょう。

$ sudo /usr/share/elasticsearch/bin/elasticsearch-certutil ca --help
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.bouncycastle.jcajce.provider.drbg.DRBG (file:/usr/share/elasticsearch/lib/tools/security-cli/bcprov-jdk15on-1.61.jar) to constructor sun.security.provider.Sun()
WARNING: Please consider reporting this to the maintainers of org.bouncycastle.jcajce.provider.drbg.DRBG
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
generate a new local certificate authority

Option               Description                                             
------               -----------                                             
-E <KeyValuePair>    Configure a setting                                     
--ca-dn              distinguished name to use for the generated ca. defaults
                       to CN=Elastic Certificate Tool Autogenerated CA       
--days <Integer>     number of days that the generated certificates are valid
-h, --help           Show help                                               
--keysize <Integer>  size in bits of RSA keys                                
--out                path to the output file that should be produced         
--pass               password for generated private keys                     
--pem                output certificates and keys in PEM format instead of   
                       PKCS#12                                               
-s, --silent         Show minimal output                                     
-v, --verbose        Show verbose output

続いて、ノードの証明書と秘密鍵を作成します。先ほど作成したCA証明書を「--ca」オプションで指定します。

$ sudo /usr/share/elasticsearch/bin/elasticsearch-certutil cert \
  --ca /etc/elasticsearch/elastic-stack-ca.p12 \
  --ca-pass capass \
  --out /etc/elasticsearch/elastic-certificates.p12 \
  --pass pass

「--ca-pass」はCA証明書のパスワード、「--out」と「--pass」は、作成する証明書のファイルパスとパスワードです。

CA証明書のパスワードと、作成する証明書の出力先のファイル名、パスワードを指定しない場合は、対話形式で聞かれます。

Enter password for CA (elastic-stack-ca.p12) : 
Please enter the desired output file [elastic-certificates.p12]: 
Enter password for elastic-certificates.p12 :

「--out」を指定しない場合の出力先は、デフォルトではやっぱりこちらです。

$ ls -l /usr/share/elasticsearch
total 548
drwxr-xr-x  2 root root   4096 Feb 15 09:26 bin
-rw-------  1 root root   3443 Feb 15 10:33 elastic-certificates.p12
-rw-------  1 root root   2527 Feb 15 10:28 elastic-stack-ca.p12
drwxr-xr-x  9 root root   4096 Feb 15 09:26 jdk
drwxr-xr-x  3 root root   4096 Feb 15 09:26 lib
drwxr-xr-x 39 root root   4096 Feb 15 09:25 modules
-rw-rw-r--  1 root root 523209 Feb  6 00:20 NOTICE.txt
drwxr-xr-x  2 root root   4096 Feb  6 00:20 plugins
-rw-r--r--  1 root root   8164 Feb  6 00:19 README.asciidoc

パスワードを指定したくない場合は、やっぱりこんな感じです(この例では、CA証明書のパスワードも空ですが)。

$ sudo /usr/share/elasticsearch/bin/elasticsearch-certutil cert \
  --ca /etc/elasticsearch/elastic-stack-ca.p12 \
  --ca-pass '' \
  --out /etc/elasticsearch/elastic-certificates.p12 \
  --pass ''

ヘルプ。

$ sudo /usr/share/elasticsearch/bin/elasticsearch-certutil cert --help
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.bouncycastle.jcajce.provider.drbg.DRBG (file:/usr/share/elasticsearch/lib/tools/security-cli/bcprov-jdk15on-1.61.jar) to constructor sun.security.provider.Sun()
WARNING: Please consider reporting this to the maintainers of org.bouncycastle.jcajce.provider.drbg.DRBG
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
generate X.509 certificates and keys

Option               Description                                             
------               -----------                                             
-E <KeyValuePair>    Configure a setting                                     
--ca                 path to an existing ca key pair (in PKCS#12 format)     
--ca-cert            path to an existing ca certificate                      
--ca-dn              distinguished name to use for the generated ca. defaults
                       to CN=Elastic Certificate Tool Autogenerated CA       
--ca-key             path to an existing ca private key                      
--ca-pass            password for an existing ca private key or the generated
                       ca private key                                        
--days <Integer>     number of days that the generated certificates are valid
--dns                comma separated DNS names                               
-h, --help           Show help                                               
--in                 file containing details of the instances in yaml format 
--ip                 comma separated IP addresses                            
--keep-ca-key        retain the CA private key for future use                
--keysize <Integer>  size in bits of RSA keys                                
--multiple           generate files for multiple instances                   
--name               name of the generated certificate                       
--out                path to the output file that should be produced         
--pass               password for generated private keys                     
--pem                output certificates and keys in PEM format instead of   
                       PKCS#12                                               
-s, --silent         Show minimal output                                     
-v, --verbose        Show verbose output             

このやり方(デフォルト)ではホスト名の情報が入っていないようなので、ホスト名を含めて検証したい場合はノードの数だけ
「--name」、「--dns」、「--ip」オプションを指定して実行するようです。

If you want to use hostname verification within your cluster, run the elasticsearch-certutil cert command once for each of your nodes and provide the --name, --dns and --ip options.

Encrypting communications in Elasticsearch | Elasticsearch Reference [7.6] | Elastic

例は、こちら。

Generate certificates | Elasticsearch Reference [7.6] | Elastic

こちらのブログエントリを見ていると、「instance.yml」というファイルを作成し、「--in」オプションでまとめて指定する方法も
あるみたいですね。

SSL、TLS、HTTPSを設定してElasticsearch/Kibana/Beats/Logstashを安全に保つ | Elastic Blog

こんな感じでファイルができたのですが、このままだとElasticsearchのプロセスから読めないので

$ sudo ls -l /etc/elasticsearch
total 48
-rw------- 1 root elasticsearch  3443 Feb 15 13:20 elastic-certificates.p12
-rw-rw---- 1 root elasticsearch   199 Feb 15 09:27 elasticsearch.keystore
-rw-rw---- 1 root elasticsearch  3338 Feb 15 10:44 elasticsearch.yml
-rw------- 1 root elasticsearch  2527 Feb 15 13:15 elastic-stack-ca.p12
-rw-rw---- 1 root elasticsearch  2373 Feb  6 00:20 jvm.options
-rw-rw---- 1 root elasticsearch 17545 Feb  6 00:20 log4j2.properties
-rw-rw---- 1 root elasticsearch   473 Feb  6 00:20 role_mapping.yml
-rw-rw---- 1 root elasticsearch   197 Feb  6 00:20 roles.yml
-rw-rw---- 1 root elasticsearch     0 Feb  6 00:20 users
-rw-rw---- 1 root elasticsearch     0 Feb  6 00:20 users_roles

読み取り権限くらい与えておきましょう。

$ sudo chmod g+r /etc/elasticsearch/elastic-certificates.p12

CA証明書の方は、Elasticsearchが直接読むことはありません。

この状態で、elasticsearch.ymlには以下のように設定します。

xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.keystore.password: pass
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.password: pass

各設定の意味は、こちら。

Transport TLS/SSL Settings

Transport TLS/SSL Key and Trusted Certificate Settings

verification_modeを「certificate」にしていますが、「certificate」とするとホスト名の検証は行いません。「full」にするとホスト名の
検証まで行うようになるので、その場合は証明書にホスト名を適切に設定しましょう。

General TLS settings

「xpack.security.transport.ssl.keystore.path」とか「xpack.security.transport.ssl.truststore.path」にファイル名だけを書くと、
パッケージインストールだと「/etc/elasticsearch」ディレクトリ配下を指すみたいですね。

keystoreやtruststoreのパスワードは、平文で設定しました。

パスワードをセキュアに設定する場合は、「elasticsearch-keystore」というコマンドを使うようです。

Encrypting communications between nodes in a cluster

なお、パスワードを設定していない場合は、以下の設定自体が不要です。

xpack.security.transport.ssl.keystore.password: pass

xpack.security.transport.ssl.truststore.password: pass

今回は、パスワードを指定するパターンでいきます。

あとは、残りの2ノードの設定をします。先ほど作成した証明書(elastic-certificates.p12)を各ノードに配り、設定ファイルも同じように
設定します。
※CA証明書は不要です

$ sudo ls -l /etc/elasticsearch
total 44
-rw-r----- 1 root elasticsearch  3443 Feb 15 15:43 elastic-certificates.p12
-rw-rw---- 1 root elasticsearch   199 Feb 15 14:54 elasticsearch.keystore
-rw-rw---- 1 root elasticsearch  3446 Feb 15 15:44 elasticsearch.yml
-rw-rw---- 1 root elasticsearch  2373 Feb  6 00:20 jvm.options
-rw-rw---- 1 root elasticsearch 17545 Feb  6 00:20 log4j2.properties
-rw-rw---- 1 root elasticsearch   473 Feb  6 00:20 role_mapping.yml
-rw-rw---- 1 root elasticsearch   197 Feb  6 00:20 roles.yml
-rw-rw---- 1 root elasticsearch     0 Feb  6 00:20 users
-rw-rw---- 1 root elasticsearch     0 Feb  6 00:20 users_roles

で、Elasticsearchを起動。

$ sudo systemctl start elasticsearch

今度は、起動します。

クラスタを構成するノードの情報を見てみましょう。

$ curl localhost:9200/_cat/nodes?v
{"error":{"root_cause":[{"type":"security_exception","reason":"missing authentication credentials for REST request [/_cat/nodes?v]","header":{"WWW-Authenticate":"Basic realm=\"security\" charset=\"UTF-8\""}}],"type":"security_exception","reason":"missing authentication credentials for REST request [/_cat/nodes?v]","header":{"WWW-Authenticate":"Basic realm=\"security\" charset=\"UTF-8\""}},"status":401}

401です…。さて、認証の設定が必要ですね。

HTTPS化する

ところで、認証の設定を行う前に、先にクライアントとの通信もSSL/TLS化しておきましょう。
※こちらは、BasicライセンスでElasticsearchクラスタを構成するのに必須ではありません

基本的には、以下を見ればOKです。

Encrypting HTTP Client communications

設定は、こちら。

HTTP TLS/SSL Settings

これらの情報を元に、今回はelasticsearch.ymlに以下のように設定して
※最初、「xpack.security.http.ssl.verification_mode」を指定するのを忘れて、ホスト名の検証が有効になってしまってハマりました…

xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.verification_mode: certificate
xpack.security.http.ssl.keystore.path: elastic-certificates.p12
xpack.security.http.ssl.keystore.password: pass
xpack.security.http.ssl.truststore.path: elastic-certificates.p12
xpack.security.http.ssl.truststore.password: pass

再起動します。

$ sudo systemctl restart elasticsearch

すると、HTTPでは通信できなくなりました。

$ curl localhost:9200/_cat/nodes?v
curl: (52) Empty reply from server

とりあえず、証明書を無視してHTTPSで確認。
※curlを使う場合は、証明書のフォーマットをPKCSではなくてCERTの方が良かったかも…

$ curl -k https://localhost:9200
{"error":{"root_cause":[{"type":"security_exception","reason":"missing authentication credentials for REST request [/]","header":{"WWW-Authenticate":["Bearer realm=\"security\"","ApiKey","Basic realm=\"security\" charset=\"UTF-8\""]}}],"type":"security_exception","reason":"missing authentication credentials for REST request [/]","header":{"WWW-Authenticate":["Bearer realm=\"security\"","ApiKey","Basic realm=\"security\" charset=\"UTF-8\""]}},"status":401}

Javaのクライアントで使う場合などは、証明書を設定しましょう。

Encrypted communication | Java REST Client [7.6] | Elastic

ビルトインユーザーの認証設定を行う

では、ビルドインユーザーの設定を行います。「elasticsearch-setup-passwords」コマンドを使うのですが、今回はパスワードは
自動生成するようにしてみましょう。

$ sudo /usr/share/elasticsearch/bin/elasticsearch-setup-passwords auto -u https://localhost:9200

「elastic」ユーザーのパスワードは、こんな感じになりました。

Changed password for user elastic
PASSWORD elastic = CgnAS1lSGZ3KmMwVTspZ

このパスワードを使って、elasticユーザーでアクセス。

$ curl -k -u elastic:CgnAS1lSGZ3KmMwVTspZ https://localhost:9200/_cat/nodes?v
ip            heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.33.12            9          95   0    0.16    0.19     0.11 dilm      -      node-2
192.168.33.11            9          92   1    0.23    0.24     0.14 dilm      -      node-1
192.168.33.13            8          96   1    0.22    0.23     0.13 dilm      *      node-3

今度は、アクセスできるようになりましたね。

あとは、このユーザーを使ってElasticsearchへユーザーを追加していったりすればいいので、こちらのロールやユーザーの作成方法に
したがっていけばいいでしょう。

Configuring security in Elasticsearch | Elasticsearch Reference [7.6] | Elastic

これについては、シングルノードの時にも行っています。

Elasticsearch(シングルノード)で、認証・認可設定をする - CLOVER🍀

とりあえず、今回はここまでかな、と。

まとめ

Elasticsearchクラスタに関して、ノード間の通信および、REST APIへアクセスするクライアントに対してSSL/TLSを有効にしてみました。

だいぶてこずったのですが、なんとか設定できるところまでたどりついて良かったです…。