赞
踩
Elastic Stack 的组件是不安全的,因为它没有内置的固有安全性。 这意味着任何人都可以访问它。 在生产环境中运行 Elastic Stack 时,这会带来安全风险。 为了防止生产中未经授权的访问,采用了不同的机制来施加安全性,例如在防火墙后运行Elastic Stack并通过反向代理(例如 nginx,HAProxy 等)进行保护。 Elastic提供商业产品来保护 Elastic Stack。 此产品是 X-Pack 的一部分,模块称为安全性。
在今天的文章中,我们来讲述如何为我们的 Elastic 索引设置字段级的安全。这样有的字段对有些用户是可见的,而对另外一些用户是不可见的。我们也可以通过对用户安全的设置,使得不同的用户有不同的权限。
在 X-Pack 安全性中,安全资源是基于用户的安全性的基础。 安全资源是需要访问以执行 Elasticsearch 集群操作的资源,例如索引,文档或字段。 X-Pack 安全性通过分配给用户的角色的权限来实现。 权限是针对受保护资源的一项或多项特权。 特权是一个命名的组,代表用户可以针对安全资源执行的一个或多个操作。 用户可以具有一个或多个角色,并且用户拥有的总权限集定义为其所有角色的权限的并集,如下图所示:
从上面的图上可以看出来:一个用户可以用多个 role,而每个 role 可以对应多个 permission (权限)。在接下来的练习中,我们来展示如何创建用户,role(角色)以及把permission 分配到每个 role。通过这样的组合,我们可以实现对字段级的安全控制。
在先前的文章 “Elasticsearch:设置 Elastic 账户安全” ,我们学会了如何为我们的 Elasticsearch 设置安全用户及密码。在这里,我们不再一一描述如何设置安全账户。请参照那篇文章为我们的 Elastic 创建一个账号。针对我的情况,我创建一个叫做 liuxg 的账号。
当我们设置完我们的安全账户后,最开始我们使用最原始的 elastic 的账号进行登录。请注意这里的密码是我们设置 elastic 账号的密码:
等登录进去之后,现在我们去 Manage/Sercurity/Users 页面:
我们来创建一个新的账号。针对我的情况,我想创建一个叫做 liuxg 的用户名。点击当前页面的 Create User 按钮:
然后填入我们所需要的信息:
点击 Create User 按钮,这样我们就创建了我们的用户。
按照同样的步骤,我们来创建另外一个叫做 user1 的用户。
在我们还没退出 elastic 用户的情况下,我们使用 bulk API 来把如下的文档输入到 Elasticsearch 中。
- POST employee/_bulk
- {"index":{"_index":"employee"}}
- {"name":"user1","email":"user1@packt.com","salary":5000,"gender":"M","address1":"312 Main St","address2":"Walthill","state":"NE"}
- {"index":{"_index":"employee"}}
- {"name":"user2","email":"user2@packt.com","salary":10000,"gender":"F","address1":"5658 N Denver Ave","address2":"Portland","state":"OR"}
- {"index":{"_index":"employee"}}
- {"name":"user3","email":"user3@packt.com","salary":7000,"gender":"F","address1":"300 Quinterra Ln","address2":"Danville","state":"CA"}
这样我们把三个文档存入到 employee 的索引之中。
由于字段级安全是白金版特有的功能,在一下的字段级安全配置中,我们需要启动白金版试用。更多有关关于订阅的信息,请参阅链接 订阅 | Elastic Stack 产品和支持 | Elastic. 对于不想使用字段级安全的用户来说,请忽略下面启动白金版试用的步骤。下面展示如何启动白金版试用:
请注意:如下的操作是在 elastic 用户登录的情况下进行操作的。要创建新用户,请导航到 Stack Management 并在 “Security” 部分中选择 “role”,或者如果你当前在 “Users” 屏幕上,请单击 “Roles” 选项。 角色屏幕显示所有已定义/可用的角色:
当我们点击 roles 后:
我们点击 Create role 按钮。
在这里,我们定义了一个叫做 monitor_role,它具有 monitor 的权限。
我们打开我们的用户列表。针对我的情况,我们打开 liuxg 用户:
我们修改 liuxg 账号的 Roles。把刚才创建的 monitor_role 赋予给 liuxg 用户。点击 Update User 按钮。这样我们的设定就好了。设定好的账号是这样的:
从上面,我们可以看出来liuxg账号是有 monitor_role 的,而 user1 账号是没有的。
下面我们来做一些基本的测试。我们在一个 terminal 中打入如下的命令:
curl -u liuxg:123456 "http://localhost:9200/_cluster/health?pretty"
注意这里的 123456 是 liuxg 的账号密码。执行上面的显示结果是:
我们显然看到了结果。那么我们同样地对 user1 账号来进行实验:
curl -u user1:123456 "http://localhost:9200/_cluster/health?pretty"
显示的结果是:
显然,user1 账号没有得到任何结果。这个根本的原因是因为这个账号没有相应的权限。
现在,我们知道了如何创建新用户,创建新角色以及将角色分配给用户,让我们探讨如何针对给定的索引/文档对文档和字段施加安全性。接下来,我们使用我之前给大家输入进的 employee 索引来展示。
当用户搜索员工详细信息时,该用户不允许包含在属于员工索引的文档中的薪水/地址详细信息。这就是我们所说的字段级安全。首先,让我们来创建一个叫做 employee_read 的role。这个 role 只具有 employee 索引的 read 权限。为了限制字段,我们可以在设置里做相应的配置:
我们只允许这个 employee_read role 访问 gender,state 及 email 字段,而且只有 read 权限。
运用我们刚才设置的 employee_read role,我们赋予给我们的 user1 用户:
设置好的用户界面为:
上面显示我们的 user1 具有 employ_read 的 role。
在我们的一个 terminal 里打入如下的命令:
curl -u user1:123456 "http://localhost:9200/employee/_search?pretty"
请注意:这里的 123456 是 user1 用户的密码。上面命令显示的结果为:
显然,user1 只能访问在 employee_read 中的三个字段。
我们想定义一个 role。这个 role 具有 read 的权限,并且只能访问 state 为 OR 的那些文档。我们做一下的设置:
我们创建了一个叫做 OR_state 的 role。它通过一个 query:
{"match": {"state.keyword":"OR"}}
来匹配项对应的文档。我们接着把这个role赋予给liuxg用户:
在我们设置完后,我们接着在一个 terminal 中打入如下的命令:
curl -u liuxg:123456 "http://localhost:9200/employee/_search?pretty"
显示的结果:
我们可以看出来这次的显示的结果只有一个,而且这个文档的 state 是 OR。
在上面,我们使用了 Kibana 的界面来创建用户及用户的角色。我们可以使用命令来创建用户,比如:
- curl --user elastic:elastic123 -X POST "http://localhost:9200/_security/user/liuxg?pretty" -H 'Content-Type: application/json' -d'
- {
- "password" : "kamisama123",
- "roles" : [ "superuser" ],
- "full_name" : "xiaoguo liu",
- "email" : "xgliu@yahoo.com"
- }
- '
上面的命令使用超级用户 elastic 来生成一个用户 liuxg,并设置它的密码。如果你的集群是含有 HTTPS 的连接,那么你可以使用如下的命令:
- curl -k --user elastic:V_USqc1cWM40W_pIHnni -X POST "https://localhost:9200/_security/user/liuxg?pretty" -H 'Content-Type: application/json' -d'
- {
- "password" : "kamisama123",
- "roles" : [ "superuser" ],
- "full_name" : "xiaoguo liu",
- "email" : "xgliu@yahoo.com"
- }
- '
上面的命令返回的结果是:
- $ curl -k --user elastic:V_USqc1cWM40W_pIHnni -X POST "https://localhost:9200/_security/user/liuxg?pretty" -H 'Content-Type: application/json' -d'
- > {
- > "password" : "kamisama123",
- > "roles" : [ "superuser" ],
- > "full_name" : "xiaoguo liu",
- > "email" : "xgliu@yahoo.com"
- > }
- > '
- {
- "created" : true
- }
在上面,我们创建了另外一个超级用户 liuxg,并设置它的密码为 kamisama123。我们可以通过如下的命令来验证我们创建的用户:
curl -k -u liuxg:kamisama123 https://localhost:9200
- $ curl -k -u liuxg:kamisama123 https://localhost:9200
- {
- "name" : "liuxgm.local",
- "cluster_name" : "elasticsearch",
- "cluster_uuid" : "6ikO418_STeOL_sjYa708w",
- "version" : {
- "number" : "8.4.0",
- "build_flavor" : "default",
- "build_type" : "tar",
- "build_hash" : "f56126089ca4db89b631901ad7cce0a8e10e2fe5",
- "build_date" : "2022-08-19T19:23:42.954591481Z",
- "build_snapshot" : false,
- "lucene_version" : "9.3.0",
- "minimum_wire_compatibility_version" : "7.17.0",
- "minimum_index_compatibility_version" : "7.0.0"
- },
- "tagline" : "You Know, for Search"
- }

显然,我们的超级用户 liuxg 的访问权限是正确的。我们也可以在 Kibana 中对这个用户进行查看:
在这里,我们使用 Ubuntu 上的安装来进行展示。首先我们来安装必要的安装包:
- apt-get update
- apt-get install mlocate
- updtedb
找到名为:elasticsearch-users 的命令:
- liuxg@liuxgu:~$ locate elasticsearch-users
- /usr/share/elasticsearch/bin/elasticsearch-users
我们首先来验证在下面的命令中的 liuxg 用户是不存在的:
- liuxg@liuxgu:~$ curl -k -u liuxg:password https://localhost:9200 | jq
- % Total % Received % Xferd Average Speed Time Time Time Current
- Dload Upload Total Spent Left Speed
- 100 461 100 461 0 0 41909 0 --:--:-- --:--:-- --:--:-- 41909
- {
- "error": {
- "root_cause": [
- {
- "type": "security_exception",
- "reason": "unable to authenticate user [liuxg] for REST request [/]",
- "header": {
- "WWW-Authenticate": [
- "Basic realm=\"security\" charset=\"UTF-8\"",
- "Bearer realm=\"security\"",
- "ApiKey"
- ]
- }
- }
- ],
- "type": "security_exception",
- "reason": "unable to authenticate user [liuxg] for REST request [/]",
- "header": {
- "WWW-Authenticate": [
- "Basic realm=\"security\" charset=\"UTF-8\"",
- "Bearer realm=\"security\"",
- "ApiKey"
- ]
- }
- },
- "status": 401
- }

我们接下来使用如下的命令来创建一个叫做 liuxg 的超级用户,它具有 superuser 的权限:
/usr/share/elasticsearch/bin/elasticsearch-users useradd liuxg -p password -r superuser
在上面的命令中,用户名是 liuxg,密码是 password,而它的 role 是 superuser。运行上面的命令:
- liuxg@liuxgu:~$ sudo /usr/share/elasticsearch/bin/elasticsearch-users useradd liuxg -p password -r superuser
- [sudo] password for liuxg:
我们再次使用上面提到的命令来进行测试:
curl -k -u liuxg:password https://localhost:9200 | jq
- liuxg@liuxgu:~$ curl -k -u liuxg:password https://localhost:9200 | jq
- % Total % Received % Xferd Average Speed Time Time Time Current
- Dload Upload Total Spent Left Speed
- 100 530 100 530 0 0 5353 0 --:--:-- --:--:-- --:--:-- 5353
- {
- "name": "elk-1",
- "cluster_name": "demo-elk",
- "cluster_uuid": "LMNhYMMDSvi8gJKmdTtWlg",
- "version": {
- "number": "7.17.5",
- "build_flavor": "default",
- "build_type": "deb",
- "build_hash": "8d61b4f7ddf931f219e3745f295ed2bbc50c8e84",
- "build_date": "2022-06-23T21:57:28.736740635Z",
- "build_snapshot": false,
- "lucene_version": "8.11.1",
- "minimum_wire_compatibility_version": "6.8.0",
- "minimum_index_compatibility_version": "6.0.0-beta1"
- },
- "tagline": "You Know, for Search"
- }

这次很显然我们的访问是成功的。它已经成功地为我们创建了一个叫做 liuxg 的用户。经过测试,通过这样的方法创建的用户 liuxg 在 Kibana 界面中目前不可见。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。