在我之前的文章 “Elasticsearch:运用 API 创建 roles 及 users” ,我展示了如何使用 Security API 来创建用户及角色来控制访问 Elasticsearch 中的索引。在今天的文章中,我将展示一个使用 Security API 来创建一个用户及角色来访问一个索引中的特定字段。这个功能属于白金版的功能之一。
更多关于订阅的信息,请在地址 订阅 | Elastic Stack 产品和支持 | Elastic 进行查看。
在如下的展示中,我将使用 Elastic Stack 8.6.1 来进行展示。
准备
首先,我们来创建如下的两个索引:
PUT twitter1/_doc/1
{
"user": "GB",
"uid": 1,
"city": "Beijing",
"province": "Beijing",
"country": "China"
}
PUT twitter2/_doc/1
{
"user": "GB",
"uid": 1,
"city": "Beijing",
"province": "Beijing",
"country": "China"
}
当我们创建上面的两个索引 twitter1 及 twitter2 时,我们可以在超级用户 elastic 登录的情况下创建。在 Kibana 的界面中,会显示该账号:
好了,我们已经创建好上面的两个索引。
创建角色
此时我们将定义我们想要授予访问权限的索引,我们将添加读取权限并选择我们希望用户有权访问的字段。重要的是要说,在角色中,我们可以创建一个查询,该查询将仅返回我们希望用户也可以访问的文档。
POST _security/role/twitter2_read
{
"indices": [
{
"names": ["twitter2"],
"privileges": ["read"],
"field_security": {
"grant":["user", "city"]
}
}
]
}
如上所示,我们看到了一个错误的信息。它告诉我们当前的 license 的级别是不够的。我们需要购买白金版才可以。
在我们没有购买授权的情况下,我们可以在 Kibana 中启动试用功能。
启动白金版试用功能后,我们再次运行上面的命令:
这次显然是成功的。它创建了一个叫做 twitter2_read 的 role。它针对 twitter2,具有 read 权限,并且只能访问它的 user,city 字段。
上述命令运行完后,我们可以在 Kibana 中的界面中进行查看:
创建用户
用户和角色的关系如下:
一个用户可以拥有一个或多个角色,而每个角色可以定义不同的访问权限。
让我们创建一个新用户并分配我们创建的角色。
POST _security/user/liuxg
{
"full_name": "Xiaoguo, Liu",
"password": "password",
"roles": ["kibana_user", "twitter2_read"]
}
在上面,我们创建了一个叫做 liuxg 的用户。它的密码设置为 password,同时它具有 kibana_user 及 twitter2_read 的角色。
运行完上面的命令后,我们可以在 Kibana 中的界面中进行查看:
测试新创建的 role
我们接下来登出之前的 elastic 超级用户,并以最新创建的账号 liuxg:password 来进行登录:
等成功登录之后,我们在 Dev Tools 中使用如下的命令来访问之前创建的 twitter1 索引:
GET twitter1/_search
上面的命令返回:
上面命令返回的结果表明 liuxg 这个用户不能访问 twitter1 这个索引,因为他没有相应的权限。
接下来,我们来尝试访问 twitter2 这个索引:
GET twitter2/_search
从上面的结果中可以看出来,我们只能看到两个字段 city 及 user,而其它的字段比如 uid,provice 和 country 都是不可见的。这个在实际的使用中非常用用。比如我们有同样的一个 employee 索引,可以供一个公司的几个不同的部门来使用。 人事部门可以看到员工的薪水,而一般员工是不可以看到员工的薪水这个字段。
接下来,让我们来尝试写入一个文档到 twitter2 里去:
POST twitter2/_doc
{
"user": "GB",
"uid": 1,
"city": "Beijing",
"province": "Beijing",
"country": "China"
}
很显然,我们的操作是失败的,因为这个用户只有读取的权限,而没有写入的权限。 这个在实际的使用中非常有用,我们有时只希望一部分用户只有读的权限,而不需要他们来修改数据。
希望这篇文档能让你对 Secrurity API 的使用有更多更深的理解。