Elasticsearch 用户管理

文章目录

  • 常见内置用户
  • 常用内置角色
  • 权限列表
    • 集群权限
    • 索引权限
  • 修改账号密码
    • 使用命令行修改密码
    • 使用 REST API 修改密码
  • 获取访问令牌
    • REST API 获取令牌
  • 使用Postman或Apifox等http请求工具认证
    • 设置Auth参数
  • 角色管理
    • 获取角色
      • 请求参数
      • 返回结果如下
    • 新增或修改角色
      • 示例
      • 返回结果
      • 删除角色
  • 用户管理
    • 创建或更新用户
      • 参数说明
      • 示例
      • 返回结果
    • 删除用户
    • 禁用用户
    • 启用用户
    • 获取用户信息
      • /_security/user/myuser 响应
    • 修改密码API
      • 参数

常见内置用户

  • 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索引被删除或从快照恢复,你应用的任何更改都将丢失。

常用内置角色

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

内置角色请查看官网 内置角色

权限列表

集群权限

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

索引权限

  • all 对索引或数据流的任何操作
  • manage 所有monitor权限加上索引和数据流管理(别名、分析、清除缓存、关闭、删除、存在、刷新、映射、打开、字段功能、强制合并、刷新、设置、搜索分片、验证查询)。

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 参数

使用 REST API 修改密码

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

REST API 获取令牌

POST /_security/oauth2/token

{
	"grant_type":"password",
	"username":"用户名",
	"password":"密码"
}
  • grant_type 表示授权类型,可选值为:client_credentials(该授权类型实现了 OAuth2 的客户端凭证授权)、_kerberos(此授权类型在内部受支持并实现基于 SPNEGO 的 Kerberos 支持)、password(用户名密码方式授权)、refresh_token(使用刷新令牌获取新的令牌)
  • username:用户名
  • password:密码
  • kerberos_ticket:如果类型为_kerberos,则必须。base64 编码的 kerberos 票证
  • scope:可选参数,表示令牌的范围

如果类型为:password,则username 和 password 则为必须

返回信息包括,access_token、refresh_token、以及失效时间等

使用Postman或Apifox等http请求工具认证

使用 Postman 等http请求工具验证 REST API 时,请使用请求头设置添加账号密码来通过认证

设置Auth参数

设置时请选择 Basic Auth
Elasticsearch 用户管理_第1张图片
Elasticsearch 用户管理_第2张图片

角色管理

获取角色

GET /_security/role

GET /_security/role/<name>

name:表示角色名称,不传,将返回所有角色的列表。比如我们的 elastic 账号的角色为 superuser,我们查询superuser角色的信息如下

请求参数

  • applications
    (列表)应用程序权限条目的列表。
    • application
      (必需的)(字符串)此条目适用的应用程序的名称
    • privileges
      (列表)字符串列表,其中每个元素都是应用程序权限或操作的名称。
    • resources
      (列表)应用权限的列表资源。
  • cluster
    (列表)集群权限列表。这些权限定义了具有此角色的用户能够执行的集群级别操作。
  • global
    (对象)定义全局权限的对象。全局权限是一种可感知请求的集群权限形式。对全局权限的支持目前仅限于应用程序权限的管理。该字段是可选的。
  • indices
    (列表)索引权限条目列表。
    • field_security
      (对象)角色所有者具有读取权限的文档字段。用于设置字段和文档级别的权限。
    • names(必需的)
      (列表)此条目中的权限适用的索引(或索引名称模式)列表。
    • privileges(必需的)
      (列表)角色所有者对指定索引的索引级别特权。
    • query
      定义角色所有者具有读取访问权限的文档的搜索查询。指定索引中的文档必须匹配此查询,以便角色所有者可以访问它。
  • metadata
    (对象)可选的元数据。在该metadata对象中,以 开头的键_保留供系统使用。
  • run_as
    (列表)此角色的所有者可以模拟的用户列表。有关详细信息,请参阅 代表其他用户提交请求。

返回结果如下

{
    "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>

参数说明

  • enabled
    (布尔值)指定用户是否已启用。默认值为true。
  • email
    (字符串)用户的电子邮件。
  • full_name
    (字符串)用户的全名。
  • metadata
    (对象)您想要与用户关联的任意元数据。
  • password
    (必需*,字符串)用户的密码。密码长度必须至少为 6 个字符。添加用户时,password 和 password_hash 必须二选一。
  • password_hash
    password和password_hash参数不能在同一个请求中同时使用。
  • roles
    (必需,列表)用户拥有的一组角色。角色决定了用户的访问权限。要创建没有任何角色的用户,请指定一个空列表: []。

示例

{
  "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>

/_security/user/myuser 响应

{
    "myuser": {
        "username": "myuser",
        "roles": [
            "myrole"
        ],
        "full_name": "全名",
        "email": "[email protected]",
        "metadata": {
            "desc": "测试账号"
        },
        "enabled": true
    }
}

修改密码API

POST /_security/user/_password

POST /_security/user/<username>/_password

username
(可选,字符串)您要更改其密码的用户。如果不指定此参数,则更改当前用户的密码。

参数

  • password
    (字符串)新密码值。密码长度必须至少为 6 个字符。
  • password_hash
    (字符串)新密码值的哈希值。这必须使用与为密码存储配置的相同的散列算法来生成。

以上是基于REST API 来管理用户

你可能感兴趣的:(elasticsearch,用户管理,elastic,修改密码,权限角色)