基于x-pack的ES用户管理(认证)
Elasticsearch安全管理插件通过用户认证、用户授权、加密通信、审计日志、IP过滤等多种手段来保证集群的安全。
领域(realms)和 领域链(realms chain)
- 领域(realms)
x-pack的安全插件可以通过用户名密码、证书、令牌和其他多种方法实现用户认证。
Elasticsearch支持通过多种后台服务实现用户认证,这些后台服务方式通称为“领域”(realms),常见的realms有:native、ldap、active_directory、file、pki、file、saml、oidc。 - 领域链(realms chain)
不同的realms可以组成认证链,前一个realms没有认证通过时,使用后面的realms进行认证,直到所有的realms都没认证通过时才返回失败,只要一个返回成功就属于认证成功。默认的认证链中有native和file。
realms分为两类:内部的realm和外部的realm,native和file都是es自带的内部realms,不需要和外部交互就能完成用户认证。
内部的realms只能在认证链中配置一次,比如一个认证链中最多有一个native relams和file relams,但是可以有多个ldap realms配置。- native realm:
通过native realm管理的用户数据,存储在集群的.secutrity-7索引中,可以通过user api和kibana UI进行人员的管理操作,人员数据在整个集群有效。 - file realm:
通过file realm 管理的用户数据存储在ES_HOME/config/users和users_roles的配置文件中,可以通过ES_HOME/bin/elasticsearch-users命令维护,人员数据在node级别有效,需要人为保证集群中每个节点数据都一致。
users_roles中的人员角色数据需要角色在前,人员在后,如:
- native realm:
[wangzhen@hellow-pc config]$ cat users_roles
superuser:admin,sa
[wangzhen@hellow-pc config]$ ../bin/elasticsearch-users list
admin : superuser
sa : superuser
支持安全管理的ES版本
Elasticsearch 从6.8.0/7.1.0后xpack 开源,基础版不需要授权免费使用,支持用户认证、授权、监控等功能
Elasticsearch 5.X的版本无法免费使用xpack提供的安全功能
内建用户和系统用户
Elasticsearch在打开安全配置后,会有系统自带的管理帐号,称为内建用户。同时也有自带的系统用户。
系统用户和内建用户的区别是:内建用户可以用来登陆,系统用户是es集群内部通信使用的,不能用来登陆,但是可以在审计日志中看到这些用户产生的事件。
- 内建用户
- elastic
- kibana
- beats_system
- apm_system
- remote_monitoring_user
- 系统用户
- _system
- _xpack
- _xpack_security
用户数据的存储
当使用Elasticsearch默认的native服务做用户认证授权时,用户数据存储在.security-7 所引中,索引数据可查看、修改、删除
curl -X GET -i 'http://localhost:9200/.security-7/_search'
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 5,
"relation": "eq"
},
"max_score": 1.0,
"hits": [{
"_index": ".security-7",
"_type": "_doc",
"_id": "reserved-user-kibana",
"_score": 1.0,
"_source": {
"password": "$2a$10$EthtJnnPL9BXDnG2iH8LVedy5s4tOIPrvpZyRSJALw2IIR1ge/jl.",
"enabled": true,
"type": "reserved-user"
}
},...
}]
}
}
如何开启用户认证和授权功能
-
第一步,打开安全开关
修改 ES_HOME/config/elasticsearch.yml,添加
xpack.security.enabled: true
-
第二步,初始化内建用户的密码
执行 ES_HOME/bin/elasticsearch-set-passwords.sh interactive,通过交互的方式依次设置内建用户的密码
-
第三步,登陆
curl -XGET "http://localhost:9200" -u elastic:6789@jkl { "name" : "node-1", "cluster_name" : "my-application", "cluster_uuid" : "gZRcq4pUTFOdZSRy-JHrFQ", "version" : { "number" : "7.2.0", "build_flavor" : "default", "build_type" : "tar", "build_hash" : "508c38a", "build_date" : "2019-06-20T15:54:18.811730Z", "build_snapshot" : false, "lucene_version" : "8.0.0", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search" }
如何进行用户增删改(native realm)
用户管理操作可以通过两种方式进行:
第一种,使用kibana通过图形化界面完成,模块路径:Management-->Security-->Users/Roles
第二中,通过x-pack的API操作,如:
-
新增用户
PUT /_security/user/wangzhen { "password": "123456", "roles": ["superuser"], "full_name": "wangzhen", "email":"wangzhen@126.com", "metadata": { "age":21, "sex":"男" } }
-
修改用户
和新增API一样,但是不能修改用户名和密码
PUT /_security/user/wangzhen { "roles": ["superuser"], "full_name": "wangzhen", "email":"wangzhen@126.com", "metadata": { "age":21, "sex":"男" } }
-
修改用户密码
返回空json结构{ } 代表成功
PUT /_security/user/wangzhen/_password { "password":"test" }
-
删除用户
DELETE /_security/user/wangzhen
-
禁用/激活用户
PUT /_security/user/wangzhen/_enable PUT /_security/user/wangzhen/_disable