密钥验证模块

这个 authkey GeoServer模块允许为OGC客户端设计一个非常简单的身份验证协议,它不能处理任何类型的安全协议,甚至不能处理HTTP基本身份验证。

对于这些客户机,模块通过在用作唯一身份验证令牌的URL中附加唯一密钥来允许最小形式的身份验证。显然,这种方法对安全令牌嗅探是开放的,必须始终与使用HTTPS连接相关联。

经过身份验证的请求示例如下:

http://localhost:8080/geoserver/topp/wms?service=WMS&version=1.3.0&request=GetCapabilities&authkey=ef18d7e7-963b-470f-9230-c7f9de166888

哪里 authkey=ef18d7e7-963b-470f-9230-c7f9de166888 与特定用户相关联(稍后将详细介绍)。Capability文档包含到服务器本身的反向链接,链接到可用于执行GetMap、GetFeatureInfo等的URL。当 authkey 参数,则反向链接也将包含身份验证密钥,从而允许任何兼容的WMS客户端访问受保护的资源。

局限性

这个 authkey 模块用于OGC服务。它在管理GUI和RESTConfig上都不能正常工作。

这个 authkey 模块替换了默认的基本身份验证提供程序,因此在编辑用户时,启用复选框不会影响 authkey 提供程序,您不能以这种方式禁用用户。

关键提供者

密钥提供商负责将身份验证密钥映射到用户。认证密钥本身是UUID(通用唯一标识符(UUID))。密钥提供者需要用户/组服务,它负责将身份验证密钥与该服务中包含的用户同步。

使用用户属性的密钥提供程序

此密钥提供程序使用用户属性 UUID 将身份验证密钥映射到用户。用户属性存储在用户/组服务中。同步很简单,因为逻辑必须搜索没有属性的用户 UUID 再加上它。属性值是生成的UUID。

UUID=B52D2068-0A9B-45D7-AACC-144D16322018

如果用户/组服务是只读的,则必须从外部添加属性,不可能进行同步。

使用属性文件的密钥提供程序

此密钥提供程序使用名为 authkeys.properties . 默认的用户/组服务名为 default . 这个 authkeys.properties 因为这项服务将位于

$GEOSERVER_DATA_DIR/security/usergroup/default/authkeys.propeties

示例文件如下所示:

# Format is authkey=username
b52d2068-0a9b-45d7-aacc-144d16322018=admin
1825efd3-20e1-4c18-9648-62c97d3ee5cb=sf
ef18d7e7-963b-470f-9230-c7f9de166888=topp

此密钥提供程序也适用于只读用户/组服务。同步将添加在此文件中没有条目的新用户,并删除在用户/组服务中删除的用户条目。

使用外部Web服务的密钥提供程序

此密钥提供程序调用外部URL以将身份验证密钥映射到用户。这允许geoserver集成到现有的安全基础结构中,在该基础结构中,会话令牌在应用程序之间共享,并通过专用Web服务进行管理。

可以指定web服务URL和其他一些参数来详细配置映射器:

Option

Description

Web Service URL, with key placeholder

密钥映射Web服务的完整URL,带有一个特殊的占位符(密钥),将由当前身份验证密钥替换。

Web Service Response User Search Regular Expression

用于从webservice响应中提取用户名的正则表达式;正则表达式中的第一个匹配组(括号中包含的部分)将用作用户名;默认值(^\s (. )\s*$)获取所有响应文本,并在两端修剪空格

Connection Timeout

连接到WebService的超时

Read Timeout

从WebService读取数据超时

映射器将使用HTTP GET请求调用WebService(尚不支持需要发布的WebService),将配置的URL中的键占位符替换为实际的身份验证键。

如果收到响应,则使用配置的正则表达式对其进行解析,以从中提取用户名。将自动从响应中删除新行。可以使用的正则表达式的一些示例如下:

正则表达式

Usage

^\s*(.*)\s*$

两端的所有文本剪裁空间

^.*?\"user\"\s*:\s*\"([^\"]+)\".*$

json响应,其中用户名包含在名为 user

^.*?<username>(.*?)</username>.*$

用户名包含在名为的标记中的XML响应 用户名

此映射器不支持将用户与用户/组服务同步。

Authkey WebService正文响应用户组服务

使用外部Web服务获取身份验证详细信息时,可以定义自定义 GeoServer UserGroup Service 能够从HTTP主体响应获取权限(也称为用户角色)。

基本原理是一样的;那种 GeoServer UserGroup Service 将应用 rolesRegex -角色正则表达式-对主体的响应-可以是XML、JSON或纯文本/HTML-以便获取可用权限列表。

为此,可以配置 AuthKEY WebService主体响应 用户组服务。

首先要做的是:

  1. 以身份登录 Administrator

  2. 移动到 Security > Users, Groups, Roles 并选择 Add newUser Group Services

    ../../_images/001_user_group_service.png
  3. 点击 AuthKEY WebService Body Response

    ../../_images/002_user_group_service.png
  4. 提供一个 Name 从中选择任何你想要的 Passwords -这些服务不会使用,但对于GeoServer它们仍然是必需的-

    ../../_images/003_user_group_service.png
  5. 提供合适的 Roles Regex 应用于Web服务响应

    备注

    这是唯一需要提供的实际强制值。其他选项是可选的,允许您自定义用户组服务行为(见下文)

    ../../_images/004_user_group_service.png

一旦新的 GeoServer UserGroup Service 已配置,它可以轻松链接到 Key Provider Web Service Mapper .

  1. Authentication > Authentication Filters ,选择-或添加新- AuthKEY 使用 Web Service 作为关键映射程序

  2. 选择新定义的 UserGroup Service 并保存

    ../../_images/005_user_group_service.png

其他选项

  1. Optional static comma-separated list of available Groups from the Web Service response

    值得注意的是 UserGroup Service总是 转换表单中获取的角色 ROLE_<ROLENAME>

    作为一个例子,如果 Roles Regular Expression 将匹配如下内容:

    my_user_role1, another_custom_user_role, role_External_Role_X
    

    这将转换为 3 不同的 GeoServer User Roles 命名为:

    ROLE_MY_USER_ROLE1
    ROLE_ANOTHER_CUSTOM_USER_ROLE
    ROLE_EXTERNAL_ROLE_X
    

    当然,角色名只在运行时才知道;但是 静态的 指定关联的 GeoServer User Groups 稍后映射到其他内部 GeoServer User Roles .

    这是什么意思?一个 GeoServer User Group 可以在GeoServer目录上定义,也可以由活动的 Role Services 一个或多个特定的 GeoServer User Roles .

    这主要取决于 GeoServer Role Service 你用的。默认情况下,内部 GeoServer Role Service 可以通过存储在GeoServer Data Dir上的静态配置映射角色和组。这可以通过编辑 GeoServer User Group 详细信息来自 Users, Groups, and Roles 面板

    ../../_images/006_user_group_service.png
    ../../_images/007_user_group_service.png

    现在,这个习俗 UserGroup Service 动态映射 GeoServer User RoleGeoServer User Group 如下:

    ROLE_MY_USER_ROLE1              <> GROUP_MY_USER_ROLE1
    ROLE_ANOTHER_CUSTOM_USER_ROLE   <> GROUP_ANOTHER_CUSTOM_USER_ROLE
    ROLE_EXTERNAL_ROLE_X            <> GROUP_EXTERNAL_ROLE_X
    

    为了能够分配任何 GeoServer User Group 至其他内部 GeoServer User Roles ,因为这些只在运行时才知道 UserGroup Service 允许我们 静态的 指定 GeoServer User Groups Web服务可以使用;这可以通过设置 Optional static comma-separated list of available Groups from the Web Service response 选项:

    ../../_images/008_user_group_service.png

    一旦正确配置,就可以编辑和分配 GeoServer User Roles 以标准的方式

    ../../_images/009_user_group_service.png
  2. 要使用的角色服务

    默认情况下,如果没有 Role Service 指定的 UserGroup Service 将使用 GeoServer Active Role Service 解决 GeoServer User RolesGeoServer User Groups -如上所述-

    ../../_images/010_user_group_service.png

    可以定义 Custom Role Service 取而代之 GeoServer User Roles ;只需选择 Role Service 使用 Role Service to use 选项

    ../../_images/011_user_group_service.png

配置

可以使用管理员GUI进行配置。有一种名为 身份验证密钥 提供以下选项。

  1. URL参数名称。这是客户端HTTP请求中使用的URL参数的名称。默认为 authkey .

  2. 密钥提供程序。GeoServer提供了上述的提供者。

  3. 要使用的用户/组服务。

某些密钥提供程序可能需要其他配置参数。当选择其中一个时,这些将出现在密钥提供程序组合框下。

配置过滤器之后,需要将此过滤器放到身份验证过滤器链上。

备注

此筛选器的管理员GUI具有按钮 使同步 . 单击此按钮可保存当前配置并触发同步。如果从备用用户/组服务添加/删除用户,则应触发同步逻辑。

提供程序可插入性

通过一些Java编程,可以以编程方式创建和注册一个新的密钥,该名称映射器在不同的逻辑下工作。例如,您可以拥有每日令牌、令牌生成器等。

为了提供自定义映射器,必须实现 org.geoserver.security.AuthenticationKeyMapper 接口,然后在Spring应用程序上下文中注册所述bean。或者可以从 org.geoserver.security.AbstractAuthenticationKeyMapper .映射器(密钥提供程序)必须实现

/**
 *
 * Maps a unique authentication key to a username. Since usernames are
 * unique within a {@link GeoServerUserGroupService} an individual mapper
 * is needed for each service offering this feature.
 *
 * @author Andrea Aime - GeoSolution
 */
public interface AuthenticationKeyMapper extends BeanNameAware {

    /**
     * Maps the key provided in the request to the {@link GeoServerUser} object
     * of the corresponding user, or returns null
     * if no corresponding user is found
     *
     * Returns <code>null</code> if the user is disabled
     *
     * @param key
     * @return
     */
    GeoServerUser getUser(String key) throws IOException;

    /**
     * Assures that each user in the corresponding {@link GeoServerUserGroupService} has
     * an authentication key.
     *
     * returns the number of added authentication keys
     *
     * @throws IOException
     */
    int synchronize() throws IOException;

    /**
     * Returns <code>true</code> it the mapper can deal with read only u
     * user/group services
     *
     * @return
     */
    boolean supportsReadOnlyUserGroupService();

    String getBeanName();

    void setUserGroupServiceName(String serviceName);
    String getUserGroupServiceName();

    public GeoServerSecurityManager getSecurityManager();
    public void setSecurityManager(GeoServerSecurityManager securityManager);

 }

映射器必须在Spring应用程序上下文中的 applicationContext.xml 文件在jar的根目录中。名为 com.mycompany.security.SuperpowersMapper

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
  <bean id="superpowersMapper" class="com.mycompany.security.SuperpowersMapper"/>
</beans>

现在你可以放下 authkey jar和自定义映射器jar一起使用,并在身份验证密钥过滤器的管理员GUI中使用它。

Previous: 扩展