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超级管理员用户登录。
7.TLS配置
TLS是传输层安全协议,也就是SSL,保证集群节点间通信安全。如果是单节点,可以不配置TLS。如果是集群,则必须配置TLS,否则集群无法在生产模式启动。