Elasticsearch + KibanaをインストールしてNginxからリバースプロキシ

前に時間切れで進めてなかったDMARCレポートを再開しているときの覚書。
前回はローカルの仮想マシンで試したけど、今回は公開サーバー上でやってみる。

環境: CentOS Stream 9, nginx 1.22.1, Elasticsearch 8.11.2, Kibana 8.11.2


1. Elasticsearch + Kibanaをインストール

公式サイトはこちら。

それぞれのインストール作業は前の記事を参考に。
参考: DMARCレポートツール「parsedmarc」をインストール

topコマンドで見るとElasticsearchがメモリを60%近く使っているので、メモリ使用量を2GBに設定する。
参考: Elasticsearchのメモリーの管理とトラブルシューティング | Elastic Blog
# less /etc/elasticsearch/jvm.options

-Xms2g
-Xmx2g

Elasticsearch再起動。
# systemctl restart elasticsearch

確認。
# top


2.nginxからKibanaへリバースプロキシ設定

http経由で参照できるようにnginxのconf設定。
# cd /etc/nginx/conf.d/
# vi 12_kibana.conf

server {
    listen       80;
   #listen       [::]:80;
    server_name  analytics.hoge.com;

    # Accept for Let's Encrypt(certbot)
    location /.well-known/acme-challenge {
        access_log off;
        allow all;
        root /var/www/html/;
    }

    location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://localhost:5601;
    }
}

IPv6の設定をいれたらアクセスが失敗したのでコメントアウトした。
タイミングの問題かもしれない。

nginx再読み込み。
# nginx -t
# systemctl reload nginx

ブラウザでアクセス。

トークンを生成して張り付ける。
# /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana

自動で設定してくれる。
自動設定された値を確認。
# less /etc/kibana/kibana.yml

ファイルの最後に挿入されている。


セキュリティのためにSSL+IPアドレス制限を入れる。
まずはSSL証明書の取得。
# certbot certonly --webroot -w /var/www/html/ -d analytics.hoge.com

nginxの設定でIPv6の設定を有効にしないとダメだった。

nginxのconf設定変更。
# less 12_kibana.conf

server {
    listen       80; 
    listen       [::]:80;
    server_name  analytics.hoge.com;
    return 301 https://analytics.hoge.com$request_uri;
}

server {
    listen       443 ssl;
    listen       [::]:443 ssl http2;
    server_name  analytics.hoge.com;

    # IP Limitation
    allow 123.456.78.90;
    deny all;

    location /.well-known/acme-challenge {
        access_log off;
        allow all;
        root /var/www/html/;
    }

    location = /robots.txt  { access_log off; log_not_found off; }
    location = /favicon.ico { access_log off; log_not_found off; }

    location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://localhost:5601;
    }

    include conf.d/global/gzip.conf;
    include conf.d/global/ssl.conf;
    ssl_certificate         /etc/letsencrypt/live/analytics.hoge.com/fullchain.pem;
    ssl_certificate_key     /etc/letsencrypt/live/analytics.hoge.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/analytics.hoge.com/chain.pem;
}

nginx再読み込み。
# nginx -t
# systemctl reload nginx

ブラウザでアクセスして確認。


3.kibana起動エラー

次の日にアクセスしようとするとブラウザでエラー表示。

{"statusCode":503,"error":"Service Unavailable","message":"License is not available."}

ログを確認。
# journalctl -f

Dec 13 09:20:46 hoge.jp kibana[13384]: [2023-12-13T09:20:46.471+09:00][WARN ][plugins.licensing] License information could not be obtained from Elasticsearch due to ConnectionError: connect ECONNREFUSED **.**.**.**:9200 error

下記サイトを参考に設定変更。
参考: Unable to access Kibana with “License is not available.” - Elastic Stack / Kibana - Discuss the Elastic Stack

# less /etc/kibana/kibana.yml

elasticsearch.username: "elastic"
elasticsearch.password: "password"

Kibana再起動。
# systemctl restart kibana

下記エラーログ。

Dec 13 09:22:21 hoge.jp kibana[50361]:  FATAL  Error: [config validation of [elasticsearch].username]: value of "elastic" is forbidden. This is a superuser account that cannot write to system indices that Kibana needs to function. Use a service account token instead. Learn more: https://www.elastic.co/guide/en/elasticsearch/reference/8.0/service-accounts.html

ElasticsearchにKibana用ユーザーを追加が必要らしい。
公式サイトを参考にkibana_systemユーザーを追加する。
参考: Set up minimal security for Elasticsearch | Elasticsearch Guide [7.17] | Elastic

すでにkibana.keystoreは/etc/kibanaにある。
なので、パスワードを追加する。
# cd /usr/share/kibana/
# bin/kibana-keystore add elasticsearch.password

確認
# bin/kibana-keystore list

設定ファイル編集。
# less /etc/kibana/kibana.yml

elasticsearch.username: "kibana_system"
elasticsearch.password: "password"

Kibana再起動。
# systemctl restart kibana

エラー。

Dec 13 13:46:54 hoge.jp kibana[64069]:  FATAL  Error: [config validation of [elasticsearch].serviceAccountToken]: serviceAccountToken cannot be specified when "username" is also set.

設定ファイル編集。
インストールしたときに自動設定したトークンをコメントアウト。
# less /etc/kibana/kibana.yml

#elasticsearch.serviceAccountToken: AAEAAW...c1dTd2o5UQ

Kibana再起動。
# systemctl restart kibana

ブラウザでアクセスすると「Kibana server is not ready yet.」というメッセージ。
「server.publicBaseUrl」を設定しろというポップアップが出たので設定してみる。
# less /etc/kibana/kibana.yml

server.publicBaseUrl: "https://analytics.hoge.jp"

Kibana再起動。
# systemctl restart kibana

kibana 8.11.3が配信されたのでアップデート。
# dnf update

ログにはそれらしいエラー。

Dec 13 14:06:48 hoge.jp kibana[64994]: [2023-12-13T14:06:48.521+09:00][ERROR][elasticsearch-service] Unable to retrieve version information from Elasticsearch nodes. security_exception
Dec 13 14:06:48 hoge.jp kibana[64994]:         Root causes:
Dec 13 14:06:48 hoge.jp kibana[64994]:                 security_exception: unable to authenticate user [kibana_system] for REST request [/_nodes?filter_path=nodes.*.version%2Cnodes.*.http.publish_address%2Cnodes.*.ip]

Elasticsearchにもkibana_systemユーザーを追加してみる。
# cd /usr/share/elasticsearch

コマンドのヘルプを確認。
# bin/elasticsearch-users -h

ユーザー追加。
# bin/elasticsearch-users useradd kibana_system

ERROR: Invalid username [kibana_system]... Username [kibana_system] is reserved and may not be used., with exit code 65

ならkibana_systemのパスワードを変更。
-iでパスワードをユーザーが指定できる。
# bin/elasticsearch-reset-password -h
# bin/elasticsearch-reset-password -i -u kibana_system

Elasticsearch再起動して確認。
# systemctl restart elasticsearch
# systemctl status elasticsearch

ブラウザでアクセスして確認。

elasticユーザーでログインする。


【関連記事】