这些内置用户存储在一个特殊的.security索引中,该索引由 Elasticsearch 管理。如果内置用户被禁用或其密码发生更改,更改会自动反映在集群中的每个节点上。但是,如果你的.security索引被删除或从快照恢复,你应用的任何更改都将丢失。
内置角色请查看官网 内置角色
Elastic权限列表请查看官网 权限列表
忘记 elastic 账号的密码,可通过 elasticsearch-reset-password 命令行工具进行修改
bin/elasticsearch-reset-password
[-a, --auto] [-b, --batch] [-E <KeyValuePair]
[-f, --force] [-h, --help] [-i, --interactive]
[-s, --silent] [-u, --username] [--url] [-v, --verbose]
-a, --auto
将指定用户的密码重置为自动生成的强密码。(默认)
-b, --batch
运行重置密码过程而不提示用户进行验证。
-E <KeyValuePair>
配置标准 Elasticsearch 或 X-Pack 设置。
-f, --force
强制命令针对不健康的集群运行。
-h, --help
返回所有命令参数。
-i, --interactive
提示指定用户的密码。使用此选项可以明确设置密码。(交互式输入)
-s --silent
在控制台中显示最少的输出。
-u, --username
本机领域用户或内置用户的用户名。
--url
指定工具用于向 Elasticsearch 提交 API 请求的基本 URL(主机名和本地节点的端口)。默认值由文件中的设置确定 elasticsearch.yml。如果xpack.security.http.ssl.enabled设置为true,则必须指定 HTTPS URL。
-v --verbose
在控制台中显示详细输出。
比如修改 elastic 账号密码
./elasticsearch-reset-password -u elastic
此操作会为elastic账号自动生成强密码,如果需要自定义,可以添加 -i 参数
POST /_security/user/_password
POST /_security/user/<username>/_password
路径参数编辑
username
(可选,字符串)您要更改其密码的用户。如果不指定此参数,则更改当前用户的密码。
请求正文编辑
password
(字符串)新密码值。密码长度必须至少为 6 个字符。
password_hash
(字符串)新密码值的哈希值。这必须使用与为密码存储配置(xpack.security.authc.password_hashing.algorithm)的相同的散列算法来生成。
password和password_hash必须二选一
本文推荐使用命令行的方式来修改密码
通过令牌访问,是 elastic 的一项付费功能…,本人也是研究了半天,接口、配置、请求参数都是正确的,可就是报没有提供认证信息(missing authentication credentials for REST request [/_security/oauth2/token])或者当前的许可证不符合(current license is non-compliant for [security tokens]),所以此接口咱就不纠结了…
点击查看开源与付费支持的功能对比
获取访问令牌是REST API操作,用于获取 Elastic 的访问令牌(access_token),此接口还会返回一个刷新令牌(refresh_token),access_token 默认有效期为20分钟,refresh_token 有效期为 24 小时,refresh_token 可以用于刷新access_token。
通过xpack.security.authc.token.enabled 设置是否可以生成访问令牌,当我们启动 ssl时,此设置是默认启用的。
可以通过 xpack.security.authc.token.timeout 设置 access_token有效期,最长为1小时,默认为 20m
POST /_security/oauth2/token
{
"grant_type":"password",
"username":"用户名",
"password":"密码"
}
如果类型为:password,则username 和 password 则为必须
返回信息包括,access_token、refresh_token、以及失效时间等
使用 Postman 等http请求工具验证 REST API 时,请使用请求头设置添加账号密码来通过认证
GET /_security/role
GET /_security/role/<name>
name:表示角色名称,不传,将返回所有角色的列表。比如我们的 elastic 账号的角色为 superuser,我们查询superuser角色的信息如下
{
"superuser": {
"cluster": [
"all" // 表示拥有所有集群的权限
],
"indices": [
{
"names": [
"*" // * 表示针对所有的索引
],
"privileges": [
"all" // 表示可以针对上面定义的索引列表中的索引,拥有所有权限
],
"allow_restricted_indices": false // 自定义的角色,请将此设置为false。
},
{
"names": [
"*"
],
"privileges": [
"monitor",
"read",
"view_index_metadata",
"read_cross_cluster"
],
"allow_restricted_indices": true
}
],
"applications": [
{
"application": "*", // 可管理的应用程序名称 * 表示所有
"privileges": [
"*" // 赋予的管理权限
],
"resources": [
"*" //
]
}
],
"run_as": [
"*" // 当前用于可以模拟的用户列表,自定义的时候建议不要设置
],
"metadata": {
"_reserved": true
},
"transient_metadata": {}
}
}
allow_restricted_indices:受限索引是一种特殊类别的索引,在内部用于存储配置数据,不应直接访问。通常只有内部系统角色才能授予对受限索引的特权。所以此处强烈建议使用 false。
POST /_security/role/<name>
PUT /_security/role/<name>
{
"cluster": ["monitor"],
"indices": [
{
"names": [ "*" ],
"privileges": ["all"],
"allow_restricted_indices": false
}
],
"applications": [
{
"application": "*",
"privileges": [ "*" ],
"resources": [ "*" ]
}
],
"metadata" : {
"version" : 1
}
}
此角色权限也挺高了,拥有集群的monitor权限、索引的所有权限
{
"role": {
"created": true
}
}
DELETE /_security/role/<name>
这个非常简单,就不做详细说明了
POST /_security/user/<username>
PUT /_security/user/<username>
{
"password" : "test@111%jKL",
"roles" : [ "myrole" ],
"full_name" : "全名",
"email" : "[email protected]",
"metadata" : {
"desc" : "测试账号"
}
}
{
"created": true
}
如果created 为 false,表示当前用户已存在,更新用户
DELETE /_security/user/<username>
{
"found" : true // 成功删除返回true,否则返回false
}
PUT /_security/user/<username>/_disable
PUT /_security/user/<username>/_enable
GET /_security/user
GET /_security/user/<username>
{
"myuser": {
"username": "myuser",
"roles": [
"myrole"
],
"full_name": "全名",
"email": "[email protected]",
"metadata": {
"desc": "测试账号"
},
"enabled": true
}
}
POST /_security/user/_password
POST /_security/user/<username>/_password
username
(可选,字符串)您要更改其密码的用户。如果不指定此参数,则更改当前用户的密码。
以上是基于REST API 来管理用户