Elasticsearch:运用 API 创建 roles 及 users

在我之前的文章:

我介绍了如何使用 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

如果大家多 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 的详细情况。

 

创建 user

接下来,我们来创建一个叫做 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" : "liuxg@mycompany.com"
}

就像我之前介绍的那样,一个用户可以拥有多个 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 权限

在上面我们已经成功地创建了一个叫做 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

实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值