你能够运用内置文件域(file realm)办理和验证用户。 运用文件域,用户在集群中每个节点上的本地文件中界说。

重要:作为集群的办理员,你有责任确保在集群中的每个节点上界说相同的用户。 Elastic Stack 安全功能不提供任何机制来确保这一点。 你还应该知道,你不能经过 userAPIs 在文件域中增加或办理用户,也不能在 Management/Security/Users 页面上的 Kibana 中增加或办理它们。

Elasticsearch:基于文件的用户认证

文件域作为回退(fallback)或康复(recovery)域十分有用。 例如,在集群无呼应或安全索引不可用的情况下,或许当你忘掉办理用户的暗码时。 在这种情况下,文件域是一种方便的出路 — 你能够在文件范畴中界说一个新的办理员用户,并运用它来登录和重置所有其他用户的凭证。

重要:当你在 elasticsearch.yml 中装备域时,只有指定的域用于身份验证。 要运用文件域,你有必要明确地将其包含在域链中。 尽管能够界说一些其他域的多个实例,但你只能为每个节点界说一个文件范畴。

文件域(file realm)默许已经增加到域链中。 你不需求显式装备文件域

文件范畴的所有用户数据都存储在集群中每个节点上的两个文件中:users 和 users_roles。 这两个文件都坐落 ES_PATH_CONF 中,并在启动时读取。


1.  $ pwd
2.  /Users/liuxg/elastic/elasticsearch-8.5.2
3.  $ ls config/
4.  certs                             log4j2.properties
5.  elasticsearch-plugins.example.yml role_mapping.yml
6.  elasticsearch.keystore            roles.yml
7.  elasticsearch.yml                 users
8.  jvm.options                       users_roles
9.  jvm.options.d

装备

咱们在 config 下的 user_roles 里装备所需求的 roles,比方:

config/roles.yml

`
1.  admins:
2.    cluster:
3.      - all
4.    indices:
5.      - names:
6.          - "*"
7.        privileges:
8.          - all
11.  devs:
12.    cluster:
13.      - manage
14.    indices:
15.      - names:
16.          - "*"
17.        privileges:
18.          - write
19.          - delete
20.          - create_index
`![]()
`
1.  $ pwd
2.  /Users/liuxg/elastic/elasticsearch-8.5.2
3.  $ cat config/roles.yml 
4.  # The default roles file is empty as the preferred method of defining roles is
5.  # through the API/UI. File based roles are useful in error scenarios when the
6.  # API based roles may not be available.
7.  admins:
8.    cluster:
9.      - all
10.    indices:
11.      - names:
12.          - "*"
13.        privileges:
14.          - all
17.  devs:
18.    cluster:
19.      - manage
20.    indices:
21.      - names:
22.          - "*"
23.        privileges:
24.          - write
25.          - delete
26.          - create_index
`![]()

如上所示,咱们在 roles.yml 里创立了两个 roles: admins 及 devs。这两个 roles 有不同的权限。admins 是超级用户的权限,而 devs role 具有 write, delete 及 create_index 的权限。

装备完后,咱们从头 Elasticsearch。就像文章开头说的那样,咱们经过这样的方法创立的 roles 并不能在Management/Security/Role 中看到:

Elasticsearch:基于文件的用户认证

创立用户

接下来,咱们就要运用 elasticsearch-users 这个东西来创立用户。咱们运用如下的指令来创立一个用户 liuxg 及其暗码 password。它所界说的 roles 为 networking 及 monitoring:

bin/elasticsearch-users useradd liuxg -p password -r network,monitoring

1.  $ pwd
2.  /Users/liuxg/elastic/elasticsearch-8.5.2
3.  $ bin/elasticsearch-users useradd liuxg -p password -r network,monitoring
4.  Warning: The following roles [monitoring,network] are not in the [/Users/liuxg/elastic/elasticsearch-8.5.2/config/roles.yml] file. Make sure the names are correct. If the names are correct and the roles were created using the API please disregard this message. Nonetheless the user will still be associated with all specified roles
5.  Known roles: [apm_system, watcher_admin, viewer, logstash_system, rollup_user, kibana_user, beats_admin, remote_monitoring_agent, rollup_admin, snapshot_user, data_frame_transforms_admin, devs, monitoring_user, enrich_user, kibana_admin, logstash_admin, editor, data_frame_transforms_user, machine_learning_user, machine_learning_admin, watcher_user, apm_user, beats_system, transform_user, reporting_user, kibana_system, transform_admin, remote_monitoring_collector, transport_client, admins, superuser, ingest_admin]

如上所示,它给出了一些正告:monitoring 及 network 并没有在 roles.yml 里被界说。它还列出了能够被运用的 roles 的称号:

Elasticsearch:基于文件的用户认证

尽管如此,它只是一个正告。我接着检查如下的文件:


1.  $ pwd
2.  /Users/liuxg/elastic/elasticsearch-8.5.2
3.  $ cat config/users
4.  liuxg:$2a$10$VJQzQftnxSwvdaxfuLGLx.lX4VGuIfLHV.R38HBySUUr1KJL2hrgW

1.  $ cat config/users
2.  liuxg:$2a$10$VJQzQftnxSwvdaxfuLGLx.lX4VGuIfLHV.R38HBySUUr1KJL2hrgW

咱们能够看到上面的内容。liuxg 便是用户名,而后面是用掩码表示的暗码。咱们再检查 users_role 这个文件:

cat config/users_roles

1.  $ cat config/users_roles 
2.  monitoring:liuxg
3.  network:liuxg

它显示了各个人物(role)对应的用户。

咱们现在用刚创立的用户 liuxg:password 来拜访 Elasticsearch:

curl -k -u liuxg:password https://localhost:9200
`
1.  $ curl -k -u liuxg:password https://localhost:9200 | jq
2.    % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
3.                                   Dload  Upload   Total   Spent    Left  Speed
4.  100   541  100   541    0     0   5517      0 --:--:-- --:--:-- --:--:--  5755
5.  {
6.    "error": {
7.      "root_cause": [
8.        {
9.          "type": "security_exception",
10.          "reason": "action [cluster:monitor/main] is unauthorized for user [liuxg] with effective roles [] (assigned roles [monitoring,network] were not found), this action is granted by the cluster privileges [monitor,manage,all]"
11.        }
12.      ],
13.      "type": "security_exception",
14.      "reason": "action [cluster:monitor/main] is unauthorized for user [liuxg] with effective roles [] (assigned roles [monitoring,network] were not found), this action is granted by the cluster privileges [monitor,manage,all]"
15.    },
16.    "status": 403
17.  }
`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

明显,咱们不能进行登录。这是由于用户 liuxg 还没有相应的权限。

咱们接下来运用编辑器来编辑 config/users_roles 文件,使其成为:

config/users_roles


1.  $ pwd
2.  /Users/liuxg/elastic/elasticsearch-8.5.2
3.  $ cat config/users_roles 
4.  monitoring:liuxg
5.  network:liuxg
6.  admins:liuxg

在上面,咱们为 liuxg 这个用户增加了之前咱们在 roles.yml 文件中界说的 admins 权限。这个 admins 是超级用户的权限。咱们再次发送请求:

`
1.  $ curl -k -u liuxg:password https://localhost:9200 | jq
2.    % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
3.                                   Dload  Upload   Total   Spent    Left  Speed
4.  100   535  100   535    0     0  27225      0 --:--:-- --:--:-- --:--:-- 35666
5.  {
6.    "name": "liuxgm.local",
7.    "cluster_name": "elasticsearch",
8.    "cluster_uuid": "NvSlRkrSTaO33lAKdzNcqQ",
9.    "version": {
10.      "number": "8.5.2",
11.      "build_flavor": "default",
12.      "build_type": "tar",
13.      "build_hash": "a846182fa16b4ebfcc89aa3c11a11fd5adf3de04",
14.      "build_date": "2022-11-17T18:56:17.538630285Z",
15.      "build_snapshot": false,
16.      "lucene_version": "9.4.1",
17.      "minimum_wire_compatibility_version": "7.17.0",
18.      "minimum_index_compatibility_version": "7.0.0"
19.    },
20.    "tagline": "You Know, for Search"
21.  }
`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

这次明显咱们的拜访是成功的。咱们的集群有救了。咱们为它设置了一个簇新的账号。

咱们还能够运用如下的指令来列出来在当前节点里的文件域中的用户:

bin/elasticsearch-users list

1.  $ bin/elasticsearch-users list
2.  liuxg          : monitoring*,network*,admins
4.   [*]   Role is not in the [/Users/liuxg/elastic/elasticsearch-8.5.2/config/roles.yml] file. If the role has been created using the API, please disregard this message.

咱们能够运用如下的指令来从头设置用户的暗码:

bin/elasticsearch-users passwd liuxg

上面的指令将为 liuxg 用户重置暗码:

1.  $ bin/elasticsearch-users passwd liuxg
2.  Enter new password: 
3.  Retype new password: 

在上面,咱们为 liuxg 用户的暗码重置为 123456。咱们再次运用如下的指令来进行验证:

`
1.  $ curl -k -u liuxg:123456 https://localhost:9200 | jq
2.    % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
3.                                   Dload  Upload   Total   Spent    Left  Speed
4.  100   535  100   535    0     0   5533      0 --:--:-- --:--:-- --:--:--  5815
5.  {
6.    "name": "liuxgm.local",
7.    "cluster_name": "elasticsearch",
8.    "cluster_uuid": "NvSlRkrSTaO33lAKdzNcqQ",
9.    "version": {
10.      "number": "8.5.2",
11.      "build_flavor": "default",
12.      "build_type": "tar",
13.      "build_hash": "a846182fa16b4ebfcc89aa3c11a11fd5adf3de04",
14.      "build_date": "2022-11-17T18:56:17.538630285Z",
15.      "build_snapshot": false,
16.      "lucene_version": "9.4.1",
17.      "minimum_wire_compatibility_version": "7.17.0",
18.      "minimum_index_compatibility_version": "7.0.0"
19.    },
20.    "tagline": "You Know, for Search"
21.  }
`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

很明显,暗码的修正是成功的。

咱们乃至能够运用如下的指令来移除不需求的 roles:

bin/elasticsearch-users roles liuxg -r network,monitoring -a user

上面的指令为 liuxg 用户移除 network 及 monitoring 人物,并增加 user 人物。

履行上面的指令后,咱们从头检查用户的人物:


1.  $ bin/elasticsearch-users list
2.  liuxg          : user*,admins

明显之前的 network 及 monitoring 已经被移除了。

咱们还能够运用如下的指令来删去一个用户:

bin/elasticsearch-users userdel liuxg

上面的指令将删去 liuxg 用户。咱们再次运用 list 指令来检查:


1.  $ bin/elasticsearch-users list
2.  No users found