在我之前的文章:
Elasticsearch:设置Elastic账户安全
Elasticsearch:用户安全设置
我介绍了如何使用 Kibana 来创建安全的 Elasticsearch 访问,已经如何创建 roles 及 users。在那里的介绍我们使用了 Kibana 的界面来完成的。在今天的文章中,我们来介绍如何使用 API 的方式来创建 roles 及 users。这样的好处是,我们可以直接在应用中动态地生成所需要的 roles 及 users。
在做这个练习之前,我们必须首先按照文章 Elasticsearch:设置Elastic账户安全 来对 Elasticsearch 启动安全配置。如果你还不会的话,请参阅我之前的那篇文章。里面有详细的描述。等我们设置好了的话,那么当我们打开 Kibana 时,我们将会提示需要用户名及密码来登录:
如果你已经到了这一步,则表明我们的设置是成功的。我们使用配置好的用户名及密码进行登录即可。
为了做好实验,我们也必须创建一个实验的数据。在 Kibana 中的 Dev Tools 里,我们打入如下的命令:
PUT twitter/_doc/1
{
"user": "GB",
"uid": 1,
"city": "Beijing",
"province": "Beijing",
"country": "China"
}
这样我们就创建了一个叫做 twitter 的索引。
接下来,我们想使用 security API 接口来创建一个 role 及 user,并且这个 user 只能读/查询 twitter 这个索引,但是它不能向 twitter 索引添加或删除任何的内容。
如果大家多 role 和 user 的关系还是不是很理解的话,请参阅我之前的文章 Elasticsearch:用户安全设置。在那篇文章中,我们可以看到:
一个用户可以有一个及以上的 role,而每个 role 是定义一个或一个以上的 previlege 组成的 permission。这种访问方式也称之为 RBAC,也即 Role Based Access Control。用中文的话讲就是基于角色的访问控制。
针对 Elasticsearch 的终点 _security,它含有很多的接口。针对如何创建一个 role,我们需要参考链接 https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-put-role.html。它详述了如果创建一个 role。
针对我们的情况,我们使用如下的方法来创建一个 role:
PUT /_security/role/read_only_twitter
{
"cluster": [],
"indices": [
{
"names": [ "twitter" ],
"privileges": ["read", "view_index_metadata"]
}
]
}
在这里,我们创建了一个叫做 read_only_twitter 的 role。它操作于 twitter 索引之上。针对这个 role 来说,它具有 read 及 view_index_metadata 的 previlege。关于这些 previlege 的描述,我们可以可以在链接 https://www.elastic.co/guide/en/elasticsearch/reference/current/security-privileges.html 找到。这些 previlege 都是已经创建好的。当然你也可以使用 API 接口来创建你自己想要的 previlege https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-put-privileges.html
我们运行上面的命名,并在 Kibana 中查看已经创建的 role:
在 Kibana 的 UI 中,我们已经看到了被创建的叫做 read_only_twitter 的 role。 它的创建和使用 Kibana 界面所生成的是完全一样。
点击上面的 read_only_twitter 的超链接:
我们可以看到这个 role 的详细情况。
接下来,我们来创建一个叫做 twitter_user 的用户。我们可以参阅链接 https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-put-user.html 来了解如何来创建一个 user。我们在 Kibana 中打入如下的命令:
POST /_security/user/twitter_user
{
"password" : "password",
"roles" : [ "read_only_twitter", "kibana_user" ],
"full_name" : "Twitter User",
"email" : "[email protected]"
}
就像我之前介绍的那样,一个用户可以拥有多个 role。针对 twitter_user 用户来说,我们赋予它 read_only_twitter 及 kibana_user 的 role。在 Elastic 中,我们有一些已经定义好的 role 可以直接为我们所使用。你可以通过如下的 API 接口得到所有的 role:
GET /_security/role
你也可以使用如下的 API 接口来得到这个 role 的介绍:
GET /_security/role/kibana_user
{
"kibana_user" : {
"cluster" : [ ],
"indices" : [ ],
"applications" : [
{
"application" : "kibana-.kibana",
"privileges" : [
"all"
],
"resources" : [
"*"
]
}
],
"run_as" : [ ],
"metadata" : {
"_deprecated" : true,
"_deprecated_reason" : "Please use the [kibana_admin] role instead",
"_reserved" : true
},
"transient_metadata" : {
"enabled" : true
}
}
}
关于这些预置的一些 role,我们可以参阅链接 https://www.elastic.co/guide/en/elasticsearch/reference/current/built-in-roles.html
运行上面的指令。并在 Kibana 中进行查看:
在上面,我们可以看到一个新的用户 twitter_user 已经被成功地创建了。我们退出当前的 elastic 用户登录,直接用刚才创建的 twitter_user 用户来重新登录 Kibana。记得我们的用户密码是 password:
在上面我们已经成功地创建了一个叫做 twitter_user 的用户,并已经赋予它相应的权限。我们接下来检验一下它是否是我们的预想的那样。在 Kibana 的 Dev Tools 中输入如下的命令:
GET twitter/_search
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "twitter",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"user" : "GB",
"uid" : 1,
"city" : "Beijing",
"province" : "Beijing",
"country" : "China"
}
}
]
}
}
显然,我们是可以针对 twitter 索引来进行搜索的,说明它具有读的权限。
接下来,我们尝试创建一个新的文档:
PUT twitter/_doc/2
{
"user" : "New",
"uid" : 2,
"city" : "Shanghai",
"province" : "Shanghai",
"country" : "China"
}
上面命令返回的结果是:
{
"error" : {
"root_cause" : [
{
"type" : "security_exception",
"reason" : "action [indices:data/write/index] is unauthorized for user [twitter_user]"
}
],
"type" : "security_exception",
"reason" : "action [indices:data/write/index] is unauthorized for user [twitter_user]"
},
"status" : 403
}
显然,我们的操作是不成功的。这是因为我们没有赋予 twitter_user 这个写入的权限。同样地,我们来尝试删除这个 twitter 的索引:
上面显示,我们的用户 twitter_user 无法删除这个叫做 twitter 的索引。
在今天的练习中,我们尝试使用了 security API 接口的方式来创建一个 role 及一个 user。使用 API 的好处是我们可以随时随地的在软件中动态地创建各种 role 及 user,并为我们自动化创建条件。当然 security 还有更多的 API 接口,请大家去分别尝试。
参考:
【1】https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api.html