Elasticsearch 7.1.0 on DockerでSecurityを確認する
概要
Elasticsearch7.1.0では、BasicライセンスでSecurityの一部機能が無料で使えるようになったという記事が出ていました。
Security for Elasticsearch is now free | Elastic Blog
開発用、検証用と様々な用途で使われるDockerで簡易にこの内容を確認してみよう、というときのStep by Stepをメモ代わりに残します。
まじめに設定をymlに書く
これはDockerだろうが、オンプレだろうが変わらないですが公式ドキュメントに従って、手順を行います。
事前確認
上記のマニュアルでは、大事なことが書かれています。
Verify that the xpack.security.enabled setting is true on each node in your cluster. If you are using basic or trial licenses, the default value is false.
xpack.security,enabled
をtrue
にすると良いとありますが、Basicやトライアルライセンスではデフォルトはfalse
ですとあります。
つまり、何もせずにいたのではSecurityは有効になってないということです。
設定ファイルの変更
すべての設定項目は以下にありますが、認証をかけよう、ログインしないと使えないようにしたい、ということであれば、xpack.security.enabledをtrueにするだけです。
Security settings in Elasticsearch | Elasticsearch Reference [7.1] | Elastic
/usr/share/elasticsearch/config にある elasticsearch.ymlに設定を追加しましょう。
cluster.name: "docker-cluster" network.host: 0.0.0.0 # 次の1行をadd xpack.security.enabled: true
注意! xpack.security,enable: true
などと誤った設定としてしまうと、コンテナが起動しなくなってしまいます。編集は慎重に。
パスワードの設定
デフォルトパスワードであるchangeme
は、xpack.security.authc.accept_default_password
がデフォルトでfalseとなっているため、自分でパスワードを設定することにしましょう。
/usr/share/elasticsearch/binにパスワード設定のコマンドがあります。
[root@3ad469374865 bin]# ./elasticsearch-setup-passwords -h Sets the passwords for reserved users Commands -------- auto - Uses randomly generated passwords interactive - Uses passwords entered by a user Non-option arguments: command Option Description ------ ----------- -h, --help show help -s, --silent show minimal output -v, --verbose show verbose output
明示的に設定したいので、interactiveを指定することにします。
パスワードを入力、確認用でもう1回入力し、パスワードの変更を行います。
[root@3355edc468f8 bin]# ./elasticsearch-setup-passwords interactive Initiating the setup of passwords for reserved users elastic,apm_system,kibana,logstash_system,beats_system,remote_monitoring_user. You will be prompted to enter passwords as the process progresses. Please confirm that you would like to continue [y/N]y Enter password for [elastic]: Reenter password for [elastic]: Enter password for [apm_system]: Reenter password for [apm_system]: Enter password for [kibana]: Reenter password for [kibana]: Enter password for [logstash_system]: Reenter password for [logstash_system]: Enter password for [beats_system]: Reenter password for [beats_system]: Enter password for [remote_monitoring_user]: Reenter password for [remote_monitoring_user]: Changed password for user [apm_system] Changed password for user [kibana] Changed password for user [logstash_system] Changed password for user [beats_system] Changed password for user [remote_monitoring_user] Changed password for user [elastic] [root@3355edc468f8 bin]#
ここで設定したkibanaユーザのパスワードは、kibanaの設定のときに使うので覚えておきます。
ログイン画面が出ることを確認
http://xxx.xxx.xxx.xxx:9200/ にアクセスして、ログイン画面が表示されることを確認しましょう。
kibana用の設定ファイルも変更する
/usr/share/kibana/config/kibana.ymlにElasticsearchへの接続ユーザ、パスワードを設定しましょう。
SecurityはElasticsearchの方で有効にしているので、kibanaでは、接続ユーザ、パスワードの部分を設定します。
kibana.yml内で xpack.security.enabled: true とわざわざ書く必要はありません。
# # ** THIS IS AN AUTO-GENERATED FILE ** # # Default Kibana configuration for docker target server.name: kibana server.host: "0" elasticsearch.hosts: [ "http://elasticsearch:9200" ] xpack.monitoring.ui.container.elasticsearch.enabled: true # この2行を追加する elasticsearch.username: kibana elasticsearch.password: 設定したパスワード
ファイルを保存して、コンテナを再起動しましょう。
kibanaのログイン画面
http://xxx.xxx.xx.xxx:5601/ にアクセスすると、ログイン画面が出るようになっています。
ここで指定するログインユーザは、kibanaユーザではなく、elasticユーザを指定します。kibanaユーザでログイン画面で入力すると、403エラーとなります。
{ statusCode: 403, error: "Forbidden", message: "Forbidden" }
kibanaマネジメント画面で確認
Basicライセンスでセキュリティが使えるようになっていることをkibanaの管理画面から確認できます。
とりあえず動かしたい人向け
elasticsearch.ymlを変更するなど、dockerコンテナの中身を操作する必要があったり、volumeマウントでファイルを渡すのも手間だという人向けに、さらに手抜き方法です。
環境変数で指定する
たとえば、docker-composeの設定ファイルですが、環境変数を渡すことで設定ファイルに書かなくてもSecurityを有効にすることができます。
下の例では、Seruciryを有効にし、elasticユーザのパスワードをasdf1234に設定するものです。
Elasticsearchの部分だけでも認証ってどんなものかな? と動きを確認するぐらいの用途では使えるかと思います。
version: '2' services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:7.1.0 container_name: elasticsearch environment: - cluster.name=docker-cluster - discovery.type=single-node - bootstrap.memory_lock=true # ↓ xpack.seruciry用の設定 - ELASTIC_PASSWORD=asdf1234 - xpack.security.enabled=true ulimits: memlock: soft: -1 hard: -1 ports: - 9200:9200
他にどんなものが設定できるのか? については、以下が参考になります。
- ELASTIC_PASSWORD=$ELASTIC_PASSWORD - xpack.license.self_generated.type=trial - xpack.security.enabled=true - xpack.security.http.ssl.enabled=true - xpack.security.http.ssl.key=$CERTS_DIR/es01/es01.key - xpack.security.http.ssl.certificate_authorities=$CERTS_DIR/ca/ca.crt - xpack.security.http.ssl.certificate=$CERTS_DIR/es01/es01.crt - xpack.security.transport.ssl.enabled=true - xpack.security.transport.ssl.verification_mode=certificate - xpack.security.transport.ssl.certificate_authorities=$CERTS_DIR/ca/ca.crt - xpack.security.transport.ssl.certificate=$CERTS_DIR/es01/es01.crt - xpack.security.transport.ssl.key=$CERTS_DIR/es01/es01.key
おわりに
elasticsearchのコンテナ起動時に、環境変数でxpack.license.self_generated.type=trial
をつけるだけで、トライアルが開始された状態で起動します。
機能の検証などを行う環境がすぐにできるという点ではうれしいですね。
もっとも、Elastic Cloudで小さいインスタンスを使うというのが一番確実な気もしますが・・・
今回はSecurityの機能部分について注目しましたが、今後もドキュメントやkibanaのUIの日本語化もこれからなされる予定だとかで今年も変更が多そうです。 今後のロードマップも気になるところですな。
折しも5月30日には今半弁当elastic{ON}があるので、参加したら何か情報を書きたいと思います。