功能级可见性和安全性

GeoMesa支持按功能级别的安全性,允许针对不同用户在粒度级别上过滤数据。这是一个更高级的教程;您应该已经熟悉了GeoMesa和Geoserver的基础知识。本教程的目标是Acumulo-GeoMesa也通过相同的机制支持HBase可见性,但这里不介绍所需的HBase配置。看见 HBase可见性 有关HBase的更多信息。

在本教程中,您将学习如何:

  1. 在摄取到GeoMesa期间设置要素的可见性

  2. 通过GeoMesa对您的查询应用授权

有关如何配置可利用功能可见性的安全环境的信息,请参阅 GeoMesa授权

先决条件

在开始之前,您必须具备以下条件:

  • Java JDK 1.8

  • Apache Maven 3.6 or later

  • GitHub客户端

  • 一场积雨 2.0 or 2.1 实例

  • 同时具有CREATE-TABLE和WRITE权限的Acumulo用户

  • 为您的实例安装的GeoMesa分布式运行时

如果您不熟悉Acumulo授权,您应该查看相关的Acumulo documentation

关于本教程

本教程通过插入数千个要素,然后查询这些要素来进行操作。这些功能插入了可见性标签,然后向两个不同的用户查询,以显示授权是如何工作的。

下载并构建教程

在您的计算机上选择一个合理的目录,然后运行:

$ git clone https://github.com/geomesa/geomesa-tutorials.git
$ cd geomesa-tutorials

警告

确保下载或检出与您的GeoMesa版本对应的教程项目版本。看见 关于教程版本 了解更多详细信息。

若要确保快速入门适用于您的环境,请修改 pom.xml 为Acumulo、Hadoop等设置适当的版本。

为了便于使用,该项目构建了一个捆绑的构件,该构件在单个JAR中包含所有必需的依赖项。要构建,请运行:

$ mvn clean install -pl geomesa-tutorials-accumulo/geomesa-tutorials-accumulo-feature-level-vis -am

运行教程

在命令行上,运行:

$ java -cp geomesa-tutorials-accumulo/geomesa-tutorials-accumulo-feature-level-vis/target/geomesa-tutorials-accumulo-feature-level-vis-${geomesa.version}.jar \
    org.geomesa.example.accumulo.vis.FeatureLevelVisibilityTutorial \
    --accumulo.instance.name <instance>                             \
    --accumulo.zookeepers <zookeepers>                              \
    --accumulo.user <user>                                          \
    --accumulo.password <password>                                  \
    --accumulo.catalog <table>

其中,您可以提供以下参数:

  • <instance> 您的Acumulo实例的名称

  • <zookeepers> 您的ZooKeeper节点,用逗号分隔

  • <user> 有权创建、读取和写入表的Acumulo用户的名称

  • <password> 前面提到的Acumulo用户的密码

  • <table> 将接受这些测试记录的目标表的名称。此表不应存在或应为空

警告

如果已将GeoMesa Acumulo分布式运行时设置为在命名空间内隔离(请参见 命名空间安装 )的价值 <table> 应包括命名空间(例如 myNamespace.geomesa )。

您还可以指定教程应在完成后删除其数据。使用 --cleanup 标志,当您运行以启用此行为时。

运行后,您应该会看到以下输出:

Loading datastore

Creating schema: GLOBALEVENTID:String,Actor1Name:String,Actor1CountryCode:String,Actor2Name:String,Actor2CountryCode:String,EventCode:String,NumMentions:Integer,NumSources:Integer,NumArticles:Integer,ActionGeo_Type:Integer,ActionGeo_FullName:String,ActionGeo_CountryCode:String,dtg:Date,geom:Point,visibility:String

Generating test data

Writing test data
Wrote 2356 features

Done

看《守则》

源代码对于本教程来说是可以访问的。主要逻辑包含在 org.geomesa.example.accumulo.vis.FeatureLevelVisibilityTutoriallgeomesa-tutorials-accumulo/geomesa-tutorials-accumulo-feature-level-vis 模块。一些相关的方法包括:

  • getSimpleFeatureType 向基本GDELT要素类型添加额外属性

  • getTestFeatures 设置每个要素的可见性

SimpleFeature feature = features.get(i);
String visibilities;
if (i % 2 == 0) {
    visibilities = "admin";
} else {
    visibilities = "user|admin";
}
// set the visibility as user data in the feature
SecurityUtils.setFeatureVisibility(feature, visibilities);
// also set as an attribute for visualization
feature.setAttribute("visibility", visibilities);

此代码片段显示了如何为每个功能指定可见性。 SecurityUtils.setFeatureVisibility 将可见性字符串设置为要素中的用户数据。在写入Acumulo时,GeoMesa将使用该用户数据将适当的Acumulo可见性字符串应用于记录。

一半的数据被标记为 admin ,这意味着只有具有该授权的用户才能查看它。另一半标记为 user|admin ,这意味着管理员授权和用户授权都足以查看数据。除非明确授予用户具有该授权级别的读取功能的权限,否则我们无法以有意义的方式可视化数据。接下来,我们将添加新的Acumulo用户来执行此操作。

添加新Acumulo用户

在本教程的这一部分中,我们将使用AcumuloShell来添加用户。首先,使用以下命令登录到Acumulo:

$ accumulo shell -u <username> -p <password>

然后,您应该会看到类似下面这样的内容:

Shell - Apache Accumulo Interactive Shell
-
- version: 1.8.1
- instance name: xxxxx
- instance id: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
-
- type 'help' for a list of available commands
-
myUser@accumulo>

现在,我们已经准备好使用AcumuloShell向Acumulo添加新用户 createuser 指挥部。在提示符下,运行:

> createuser user
Enter new password for 'user': ***********
Please confirm new password for 'user': ***********
> createuser admin
Enter new password for 'admin': ***********
Please confirm new password for 'admin': ***********

添加了这些新用户后,我们将使用 setauths 命令:

> setauths -s admin,user -u admin
> setauths -s user -u user

这将授予授权 admin,useradmin ,这意味着作为用户 admin ,用户将能够阅读使用可见性编写的这两个要素 user 以及与可见性一起编写的功能 admin 。此外,用户 user 将被批准 user 授权,这意味着他们只能查看可见性要素 user 。他们永远不会看到使用可见性编写的要素 admin

接下来,我们将授予读取相应表的权限 useradmin 。替换 <table> 在下面的命令中使用您在运行教程代码时指定的表。

> grant -u user -p <table>.* Table.READ
> grant -u admin -p <table>.* Table.READ

要验证用户权限,您可以使用以下命令在Acumulo控制台中切换用户:

> user admin
Enter password for user admin: ******

我们现在可以移动到要验证的桌子。在这里我们使用 <table>_z2_v2 但任何有效的表都可以工作。

> table <table>_z2_v2
> scan
\x01\x00\x0C0\xB0Pf\x0A&\x19Observation.99 F: [user|admin]    \x02\x00\x00\x00CAddam\xF3\x01\x00\x00\x00\x00\x00\x00\x00c\x01\x00\x00\x01H\xAC\xB4;\xB0\x01\x08\x03\xC0Sz\x1Ff\x15}H\xC0C(\xC5jq\x08\x8F\x7F\xF8\x00\x00\x00\x00\x00\x00\x80user|admi\xEE\x05\x0B\x14\x1D89
\x01\x00\x0C0\xB22\xB7-\xA4;Observation.585 F: [user|admin]    \x02\x00\x00\x00CAddam\xF3\x01\x00\x00\x00\x00\x00\x00\x02I\x01\x00\x00\x01DUby\xE8\x01\x08\x03\xC0S\x7F\xDF\x0Aw\xD9\x14\xC0C\x19\xA4\xFC{\xE7\xA6\x7F\xF8\x00\x00\x00\x00\x00\x00\x80user|admi\xEE\x05\x0B\x14\x1D89
---------------hit any key to continue or 'q' to quit ------------------

scan 如果一切配置正确,则应返回数据样本。

接下来,我们将使用Geoserver可视化要素级别的可见性。

地理服务器可视化

假设您已经按照《GeoMesa用户手册》中的说明设置了Geoserver,我们将添加一个新的 DataStore 致Geoserver。首先,登录到Geoserver,然后在主页上点击“添加商店”。

接下来,单击链接添加新的“Acumulo(GeoMesa)”商店并将其命名 feature-level-visibility-admin 。填写正确的连接参数以与GeoMesa/Acumulo联系,但请确保使用 admin 用于“User”参数。

具有“admin”用户的GeoMesa数据存储区配置

具有“admin”用户的GeoMesa数据存储区配置

然后,在Geoserver提示时发布您的层。记得点击“添加层”页面上的“根据数据计算”和“从原生边界计算”链接,然后点击“保存”。

再次重复上述步骤以添加额外的 DataStore 使用相同的参数,但这一次,命名它 feature-level-visibility-user 和使用 user 用于“User”参数。

在Geoserver中添加了您的层后,我们几乎准备好可视化数据了。最后一步是添加我们的定制SLD,它将为您的要素设置样式,使数据的可视化更加易于理解。

下载 feature-level-vis.sld ,或复制内容,并将其添加为Geoserver中的样式。它将根据当前的可见性属性设置地图上的点的样式。

最后,点击左手边栏中的“层预览”,找到你新添加的两个层。如果一切正常,您应该会看到在 user 层,而不是 admin 层,这是预期的行为。因为 user 仅被授予使用查看要素的权限 user 可见性,则只返回这一半的记录。然而, admin 用户被授予查看两者的权限 adminuser 能见度。

扩展概念

在这个非常简单的示例中,您编写了两个不同可见性的功能,向Acumulo添加了两个新用户,并为他们授予了能够查看部分数据的单独授权级别。本教程提供了安全和数据完整性方面的实际用例。例如,当存储敏感数据并让不同授权和安全级别的用户查询该数据时,可见性标签可确保敏感数据不会泄露给安全级别较低的用户。

特征级别可见性的概念可以扩展和修改,以具有更多或更少的可见性级别。由于Geoserver具有灵活性和可扩展性,因此编写一个模块来考虑Geoserver中的功能级安全性相对来说比较容易。

GeoMesa还提供了一种在每个用户级别而不是每个数据存储级别应用授权的机制。更多信息,包括与PKI和ldap的集成,可以在下面的授权教程中找到 使用PKIS和LDAP将授权和可见性应用于Geoserver