7.15. 数据安全

GeoMesa支持每个数据上的可见性标签的概念,这可以用来管理哪些用户可以看到哪些记录。可见性最初是ApacheAcumulo的一部分,后来被ApacheHBase采用。GeoMesa支持所有提供的数据存储的可见性,在可能的情况下使用本机方法,或者在不受本机支持的情况下使用隐式过滤。

请参阅 Apache Accumulo documentation 以获取所涉及概念的概述。

7.15.1. 写入可见性标签

可见性标签是基于一组任意标记的简单布尔表达式。例如,您可以定义两个标记, adminuser 。表达式可以是 adminuseradmin&user ,或 admin|user ,具体取决于您想要授予数据访问权限的方式。对于更复杂的表达式,可以使用括号作为运算顺序。

备注

看见 配置所需的可见性 在所有写入上强制使用可见性标签。

可见性标签可以通过两种不同的方式写入,一种是在每个要素的级别,另一种是在要素中每个属性的级别。

7.15.1.1. 要素级别可见性

可以使用简单功能用户数据在各个功能上设置可见性:

import org.locationtech.geomesa.security.SecurityUtils;

SecurityUtils.setFeatureVisibility(feature, "admin&user")
// or, equivalently:
feature.getUserData().put("geomesa.feature.visibility", "admin&user");

7.15.1.2. 属性级可见性

备注

属性级可见性当前仅针对Acumulo数据存储实现。

对于更高级的用例,可以在属性级别设置可见性。通过设置适当的用户数据值创建简单要素类型时,必须启用属性级可见性:

sft.getUserData().put("geomesa.visibility.level", "attribute");
dataStore.createSchema(sft);

编写每个功能时,必须在用户数据中的逗号分隔字符串中设置每个属性的可见性。每个属性在分隔的字符串中必须有相应的值,否则将引发错误。

例如,如果您的要素类型有四个属性:

import org.locationtech.geomesa.security.SecurityUtils;

SecurityUtils.setFeatureVisibility(feature, "admin,user,admin,user")
// or, equivalently:
feature.getUserData().put("geomesa.feature.visibility", "admin,user,admin,user");

7.15.2. 正在阅读可见性标签

在回读数据时,GeoMesa支持授权的概念,以确定谁可以看到什么。授权是与正在使用的可见性标签标签相对应的标签列表。例如,常规用户可能具有以下授权 user ,而管理员用户可能拥有 admin,user 。授权是简单的字符串匹配。他们可以被认为是角色,尽管没有等级制度。

在运行查询时,GeoMesa支持一个可插拔的服务提供者接口,用于确定使用哪些授权。由于不同的环境具有不同的安全体系结构,因此没有可用的默认实现;用户必须提供自己的服务提供商。

提供程序必须实现以下接口:

package org.locationtech.geomesa.security;

public interface AuthorizationsProvider {

    /**
     * Gets the authorizations for the current context. This may change over time
     * (e.g. in a multi-user environment), so the result should not be cached.
     *
     * @return authorizations
     */
    List<String> getAuthorizations();

    /**
     * Configures this instance with parameters passed into the DataStoreFinder
     *
     * @param params parameters
     */
    void configure(Map<String, ?> params);
}

当实例化GeoMesa数据存储时,它将通过Java SPI扫描可用的服务提供商。第三方实现可以通过将它们放在类路径上并包括一个特殊的服务描述符文件来启用。请参阅 Oracle Javadoc 有关实施服务提供商的详细信息,请参阅。

GeoMesa数据存储将调用 configure()AuthorizationsProvider 实现,将参数映射从调用传递到 DataStoreFinder.getDataStore(Map params) 。这允许 AuthorizationsProvider 根据环境进行自我配置。

以确保正确的 AuthorizationsProvider 如果在类路径上发现多个第三方服务提供商,则GeoMesa将抛出异常。在此方案中,要使用的特定服务提供程序类可由以下系统属性指定:

// equivalent to "geomesa.auth.provider.impl"
org.locationtech.geomesa.security.AuthorizationsProvider.AUTH_PROVIDER_SYS_PROPERTY

对于简单的场景,可以在使用创建GeoMesa数据存储时指定要应用于所有查询的授权集 geomesa.security.auths 配置参数。这将使用默认设置 AuthorizationsProvider 由GeoMesa提供的实现。

// create a map containing initialization data for the GeoMesa data store
Map<String, String> configuration = ...
configuration.put("geomesa.security.auths", "user,admin");
DataStore dataStore = DataStoreFinder.getDataStore(configuration);

警告

对于支持原生可见性的HBase和Acumulo,如果没有配置其他权限,则使用底层连接的授权。这对于测试很方便,但不是生产系统的推荐方法。

另外,请注意,任何场景下使用的授权都不能超过底层Acumulo或HBase连接的授权。

有关实现 AuthorizationsProvider安防 教程。