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だろうが、オンプレだろうが変わらないですが公式ドキュメントに従って、手順を行います。

www.elastic.co

事前確認

上記のマニュアルでは、大事なことが書かれています。

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,enabledtrueにすると良いとありますが、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/ にアクセスして、ログイン画面が表示されることを確認しましょう。

f:id:tsgkdt:20190523231636p:plain

kibana用の設定ファイルも変更する

www.elastic.co

/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/ にアクセスすると、ログイン画面が出るようになっています。 f:id:tsgkdt:20190523232903p:plain

ここで指定するログインユーザは、kibanaユーザではなく、elasticユーザを指定します。kibanaユーザでログイン画面で入力すると、403エラーとなります。

{
statusCode: 403,
error: "Forbidden",
message: "Forbidden"
}

kibanaマネジメント画面で確認

Basicライセンスでセキュリティが使えるようになっていることをkibanaの管理画面から確認できます。

f:id:tsgkdt:20190523233659g:plain

とりあえず動かしたい人向け

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

他にどんなものが設定できるのか? については、以下が参考になります。

www.elastic.co

      - 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}があるので、参加したら何か情報を書きたいと思います。

www.elastic.co