elasticsearch登录权限验证

简介:elasticsearch登录权限验证,Basic authentication授权访问

在之前的文章里我们已经学会了【elasticsearch的安装】到【ElasticSearch基础知识】及其【分页查询优化】等知识,今天我们进一步的来学习一下【ElasticSearch用户认证相关知识。

1. 用户认证授权

用户认证(Authentication)是指验证用户的身份(判断是否登录);用户授权(Authorization)是指授予用户对资源的访问权限(判断用户是否有某类接口的访问权限)。在Elasticsearch中,用户认证和授权是独立的过程。用户认证是在用户访问Elasticsearch时进行验证(就像我们平时做管理后台一样,登录之后就会将用户信息缓存在session中),确保用户是合法的;用户授权是根据用户角色(Role)对用户进行授权,限制用户访问和操作资源的权限

如果需要启用权限验证,可以修改【config/elasticsearch.yml】文件中的配置:

xpack.security.enabled: true

2. 用户

ES中用户分为两种,我们自己创建的用户为普通用户,但是ES还内置了系统用户。常见的内置用户如下:

  • elastic:超级用户。密码在我们安装的时候就生成了
  • kibana_system:Kibana 用来与 Elasticsearch 连接和通信的用户
  • logstash_system:Logstash 在 Elasticsearch 中存储监控信息时使用的用户
  • beats_system:Beats 在 Elasticsearch 中存储监控信息时使用的用户
  • apm_system:APM 服务器在 Elasticsearch 中存储监控信息时使用的用户
  • remote_monitoring_user:Metricbeat 在 Elasticsearch 中收集和存储监控信息时使用的用户。它具有remote_monitoring_agent和 remote_monitoring_collector内置角色

这些内置用户存储在一个特殊的.security索引中,该索引由 Elasticsearch 管理。如果内置用户被禁用或其密码发生更改,更改会自动反映在集群中的每个节点上。但是,如果你的.security索引被删除或从快照恢复,你应用的任何更改都将丢失。

3. 权限列表

在ES中权限有很多种类型,我们最要说一下日常工作中使用的几种权限:

  • monitor:所有集群只读操作,如集群运行状况和状态、热线程、节点信息、节点和集群统计信息以及挂起的集群任务
  • manage:基于monitor并添加更改集群中值的集群操作。这包括快照、更新设置和重新路由。它还包括获取快照和恢复状态。此特权不包括管理安全性的能力
  • all:所有集群管理操作。例如快照、节点关闭/重启、设置更新路由或管理用户和角色

还有很多,具体的大家可以去ElasticSearch官网看看

4. 角色

和用户一样,ES也内置了一些角色供大家使用,常见的内置角色如下:

  • editor:授予对 Kibana 中所有功能的完全访问权限和对数据索引的只读访问权限
  • kibana_admin:授予对 Kibana 中所有功能的访问权限
  • superuser:授予对集群管理和数据索引的完全访问权限
  • viewer:授予对 Kibana 中所有功能(包括解决方案)和数据索引的只读访问权限

内置的角色还有很多,具体的大家可以去ElasticSearch官网看看

5. 自定义角色、用户实现方法

在Elasticsearch中设置访问权限的方式最要有两种,一种通过配置文件设置,还有一种就是通过 Rest API 设置,今天我们就针对这两个来聊聊具体实现方式

5.1 File Realm验证方式

使用文件来进行用户认证和授权。用户和密码信息存储在文件中,并且可以通过访问控制列表(ACL)来授予用户权限。

其实就是可以在ES的配置目录下面的角色配置文件及用户配置文件中设置用户和访问权限。具体的配置步骤如下:

5.1.1 在 config/roles.yml 中配置用户角色相关权限

# admins角色,拥有所有权限(超级管理员)
admins:cluster:- all indices:- names:- "*"privileges:- all

#devs测试角色,只拥有写入、删除文档及创建索引的权限
devs:cluster:- manage indices:- names:- "*"privileges:- write- delete- create_index

5.1.2 使用 elasticsearch-users 工具创建用户并分配角色

ES提供了 elasticsearch-users 工具,用于用户相关操作。这个工具在ES的源码根目录的【bin】目录下。接下来我们以创建用户为例,演示一下该工具的使用方法。我们使用如下命令来创建一个用户【test】 及其密码。并且设置该用户的 roles 为【admins】角色:

bin/elasticsearch-users useradd test -p 123456 -r admins

如果有多个角色可以使用 , 分割,例如:

bin/elasticsearch-users useradd test -p 123456 -r admins,devs

上述命令执行完成后会在【users中生成新增的用户及密码,并在【users-roles】文件中添加用户关联的角色相关信息

如果我们忘记了用户的密码,可以使用【elasticsearch-users】工具重置密码:

bin/elasticsearch-users passwd 用户名

上述命令回车后直接输入新密码即可

此外,如果不清楚有哪些用户的,还可以使用当前工具查看哦:

bin/elasticsearch-users list

 6. API Key访问ElasticSearch

上述通过用户进行访问的方式称为 Basic authentication 授权访问。这种方法不好的地方就是每个用户所有的请求的验证都是一样的:使用的是同样的一个用户名及密码的 Base64 编码。ES还提供 API key 对 Elasticsearch 的访问。通过这个方法,一个用户可以动态生成无数个 API Key 的访问

API Key 由 Elasticsearch API key 服务创建,当您在 HTTP 接口上配置 TLS 时,该服务会自动启用。 请参阅加密 HTTP 客户端通信。 或者,你可以显式启用  xpack.security.authc.api_key.enabled 设置。 在生产模式下运行时,引导检查会阻止您启用 API key 服务,除非你还在 HTTP 接口上启用了 TLS

如果启用权限验证后Kibana无法正常访问ElasticSearch服务,主要是因为账号没有权限或密码不正确的问题。我们可以重置所有用户密码,命令如下:

./bin/elasticsearch-setup-passwords interactive

执行上述命令后,会要求我们输入各个账号的密码。如果不想手动设置密码,可将 interactive 改成 auto ,执行之后就可自动生成密码

我这里简单的给大家介绍一下各个账号的作用:

账号 作用
elastic 超级用户
apm_system APM服务器在ElasticSearch中存储监视信息时使用
kibana 用于负责Kibana连接Elasticsearch
logstash_system logstash将监控信息存储在ElasticSearch中时使用
beats_system Beats在ElasticSearch中存储监视信息时使用
remote_monitoring_user Metricbeat用户在ElasticSearch中收集和存储监视信息时使用

如果重置密码时出现以下错误

You can use the `elasticsearch-reset-password` CLI tool to reset the password of the 'elastic' user

我们可以先关闭权限验证。修改【config/elasticsearch.yml】文件中的【xpack.security.enabled: false】配置项,再通过api接口删除【.security-7

curl -XDELETE 'http://localhost:9200/.security-7'

注意 .security-7 是一个索引。如果不知道是否已删除该索引,可以通过【/_cat/indices】查看所有索引

现在就可以重置所有账号的密码了,重新执行【elasticsearch-setup-passwords】命令即可。重置成功后,我们就可以使用超级管理员账号(elastic)登录管理后台了

创建API key 接口如下:

curl -XPOST 'http://localhost:9200/_security/api_key'
{
    "name":"自定义名称",
    "expiration":"过期时间,如果没有过期时间即永久有效,不设置即可。1d:表示1天",
    "role_descriptors":{
        "role-a":"cluster,这是角色名称"
    }
}

expiration(可选):过期时间字段不存在时,表示永久有效。表示形式:1天=1d,也可以直接使用数字单位为秒(从 1970-01-01 00:00:00 UTC 算起的秒)

role_descriptors(可选):角色描述字段不存在时,表示对所有角色都起作用

返回值如下:

{
  "id": "VuaCfGcBCdbkQm-e5aOx",        
  "name": "my-api-key",
  "expiration": 1544068612110,         
  "api_key": "ui2lp2axTNmsyakw9tvNnw", 
  "encoded": "VnVhQ2ZHY0JDZGJrUW0tZTVhT3g6dWkybHAyYXhUTm1zeWFrdzl0dk5udw=="  
}

其中api_key就是我们接口中权限验证的密钥

 

有遗漏或者不对的可以在我的公众号留言哦

编程经验共享公众号二维码

编程经验共享公众号二维码
更多内容关注公众号
Copyright © 2021 编程经验共享 赣ICP备2021010401号-1