Elasticsearch:如何让匿名的用户访问受限的资源

我们都知道安全是一个非常重要的话题。没有安全,就像我们的家里没有锁一样,任何人可以随意进出。近一些年来,我们也看到很多 Elasticsearch 数据泄露的情况。如果你想给你的 Elasticsearch 配置上安全,那么请阅读我之前的文章 “Elasticsearch:设置 Elastic 账户安全”。

但是在实际的使用中,我们有时候也希望有一些匿名的访问,这个就像我们去一个公司开会,我们有时也想得到免费的 guest WiFi 进行访问一些。我们也学希望我们的一些数据能够被一些人进行访问,具有只读的权限,从而进行数据的展示。在今天的文章中,我将介绍如何使得一个已经配置安全的 Elasticsearch 集群来开发一个资源让匿名的用户来进行访问。

 

启用匿名访问

如果无法从传入请求中提取身份验证令牌,则传入请求被视为匿名。 默认情况下,匿名请求将被拒绝,并返回身份验证错误(状态码401)。

要启用匿名访问,你可以在 config/elasticsearch.yml 配置文件中为匿名用户分配一个或多个角色。 例如,以下配置为匿名用户分配 role1 和 role2:

xpack.security.authc:
  anonymous:
    username: anonymous_user  (1)
    roles: role1, role2       (2)
    authz_exception: true     (3)

在这里:

    (1) 处定义了匿名用户的 username/principal。默认值为 _es_anonymous_user

    (2) 与匿名用户关联的角色。 如果未指定任何角色,则会禁用匿名访问-匿名请求将被拒绝并返回身份验证错误。在上面,我定义了 role1 以及 role2 两个角色

 (3)设置为 true 时,如果匿名用户不具有执行请求的操作所需的权限,并且不会提示用户提供访问请求的资源的凭据,则返回 403 HTTP 状态代码。 设置为 false 时,如果匿名用户没有必要的权限,并且提示用户输入访问所需资源的凭据,则返回 401 HTTP 状态代码。 如果将匿名访问与 HTTP 结合使用,并且如果客户端不支持抢占式基本身份验证,则可能需要将 authz_exception 设置为 false。 默认为 true。

 

动手实践

为Elasticsearch 配置安全

在今天的动手实践中,我们首先需要参考我之前的文章 “Elasticsearch:设置 Elastic 账户安全” 为自己的 Elasticsearch 配置好安全。等我们配置好安全后,我们需要使用用户名及密码登录 Kibana。

准备数据

接下来,我们来准备数据:

点击上面的 Add data:

这样我们就把 kibana_sample_data_logs 索引导入到 Elasticsearch 中了。

 

创建 role

接下来,我们在 Kibana 中创建一个 kibana_data_analyst 这样的一个 role。

点击 Create role。这样我们就创建了一个叫做 kibana_data_analyst 的角色。请注意上面的配置:它只可以操作于 kibana_sample_data_logs,并只有 read 的权限。

从上面,我们看出来 kibana_data_analyst 角色已经创建好了。

 

配置 Elasticsearch

我们接下来配置 Elasticsearch。打开 config/elasticsearch.yml 文件:

我们添加在上面红色框中显示的内容:

xpack.security.authc:
  anonymous:
    username: anonymous_user
    roles: kibana_data_analyst
    authz_exception: true

配置完毕后,我们需要重新启动 Elasticsearch。

 

测试

接下来我们来测试一下是否成功。打开 Kibana:

我们在 Kibana 中打入命令:

GET kibana_sample_data_logs/_search?pretty&size=1

然后,如上所示选择 Copy as cURL,然后粘贴到一个 terminal 中:

如上图所示,我们可以看到即使我们在没有使用密码的情况下,我们也可以访问这个索引,并进行搜索。

我们接下来做另外一个实验:

上面的命令是想索引 kibana_sample_data_logs 添加一个文档。从上面的输出可以看出来在 Kibana 中是成功的,这是因为我们是以 elastic 这个超级用户登录的。我们把拷贝的内容粘贴到 terminal 中:

从上面的输出中,我们可以看到这种访问不被允许,这是因为我们只为 anonymous 用户配置了 read 的权限。

我们接下来创建一个新的 索引 twitter:

按照同样的方法,我们来在 terminal 中访问 twitter:

curl -XGET "http://localhost:9200/twitter/_search"

从上面的输出中,我们可以看到 twitter 不能被访问,这是因为我们的 kibana_data_analyst 只配置了对于 kibana_sample_data_logs 的访问。其它的任何索引都不能被访问。

好了。今天的分享就到这里了。希望小伙伴们学到东西了。