ElasticsearchV7.11.1开启x-pack用户认证

Scroll Down

1.简介

x-pack是Elasticsearch官方的安全组件,包含安全、告警、权限控制等功能。x-pack的基础版免费,包含了用户认证功能。ElasticsearchV6.3版本开始,内部集成了x-pack组件。

2.修改elasticsearch.yml

在配置文件中添加以下内容

#开启x-pack
xpack.security.enabled: true

集群为单节点时,可以配置以下内容,防止访问到网络上其他节点。如果配置了single-node,需要去除cluster.initial_master_nodes配置,两者互斥。

discovery.type: single-node

指定cluster.initial_master_nodes时,启用x-pack必须开启ssl,否则启动时会出现如下错误。不启用x-pack无需开启。

ERROR: [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]

开启ssl

xpack.security.transport.ssl.enabled: true

3.启动elasticsearch

进入bin目录,使用非root用户启动es服务。

su dd
./elasticsearch -d

日志中会出现如下警告。这是因为还没有初始化默认用户的密码,是正常现象。初始化默认用户需要es服务启动,所以放在后面执行。

[2022-01-17T11:06:56,674][WARN ][o.e.t.TcpTransport       ] [node-1] exception caught on transport layer [Netty4TcpChannel{localAddress=/127.0.0.1:9300, remoteAddress=/127.0.0.1:48861}], closing connection
io.netty.handler.codec.DecoderException: javax.net.ssl.SSLHandshakeException: No available authentication scheme
        at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:471) ~[netty-codec-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:276) ~[netty-codec-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:714) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.nio.NioEventLoop.processSelectedKeysPlain(NioEventLoop.java:615) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:578) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) [netty-common-4.1.49.Final.jar:4.1.49.Final]
        at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) [netty-common-4.1.49.Final.jar:4.1.49.Final]
        at java.lang.Thread.run(Thread.java:831) [?:?]

此时直接对es进行查询或其他操作,请求会返回认证缺失的错误。

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

4.初始化默认用户密码

执行以下脚本,按提示初始化各默认用户密码。

./elasticsearch-setup-passwords interactive
  • interactive:手动指定密码
  • auto:自动生成密码

默认用户:

  • elastic
  • apm_system
  • kibana
  • kibana_system
  • logstash_system
  • beats_system
  • remote_monitoring_user

5.验证

请求获取es服务健康状态

curl -u elastic http://127.0.0.1:9200/_cat/health?v

提示输入elastic用户的密码

Enter host password for user 'elastic':

输入密码后回车,成功获取健康状态,用户认证生效。

epoch      timestamp cluster       status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1642398479 05:47:59  elasticsearch green           1         1      1   1    0    0        0             0                  -                100.0%

6.kibana适配

6.1.设置用户名密码

有两种方法设置用户名和密码,二选一即可。

6.1.1.方法一:配置文件中配置密码

修改kibana.yml,增加以下内容。此处填写的用户,是kibana与elasticsearch进行通信并创建后台任务的用户,而非给用户使用的用户,此用户无法在页面登录。

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

6.1.2.方法二:配置keystore(官方文档)

此方法密码不进行明文存储,更加安全。
修改kibana.yml,配置用户名

elasticsearch.username: "kibana_system"

进入bin目录,执行脚本创建keystore

./kibana-keystore create

kibana_system用户添加到keystore中

./kibana-keystore add elasticsearch.password

6.2.重启kibana服务

6.3.访问kibana

需要输入用户名密码,用户认证生效。
使用elastic超级管理员用户登录。
image.png

7.TLS配置

TLS是传输层安全协议,也就是SSL,保证集群节点间通信安全。如果是单节点,可以不配置TLS。如果是集群,则必须配置TLS,否则集群无法在生产模式启动。