概述

TODO *

姜戈

TODO

WebServers

TODO

阿帕奇

TODO

NGINX

TODO

GeoServer

TODO

数据库

TODO

OAuth2安全性:身份验证和授权

GeoNode通过基于OAuth2协议和GeoFence的高级安全机制与Geoserver交互。本节将逐步介绍GeoNode和Geoserver高级安全性的配置和设置。

我们将在本节中看到的内容是:

  • Introduction

  • GeoNode (安全后台):

    1. Django身份验证

    2. Django OAuth工具包设置和配置

    3. 有关以下内容的详细信息 settings.py 安全设置

  • GeoServer (安全后台):

    1. Geoserver安全子系统

    2. Geoserver OAuth2安全插件简介

    3. 配置 GeoNode REST Role Service

    4. 配置 GeoNode OAuth2 Authentication Filter

    5. Geoserver认证过滤连锁店

    6. Geoserver高级安全框架GeoFence插件简介

  • 故障排除和高级功能

    1. 常见问题和修复

    2. 如何设置 HTTPS 安全终端

    3. GeoFence高级功能

引言

Geoserver,即GeoNode的地理空间后端服务器,是一个空间服务器,需要经过身份验证的用户才能访问受保护的资源或管理功能。

Geoserver支持多种身份验证和授权机制。这些系统是可插拔的,Geoserver可以通过使用 Filter Chain 。简而言之,此机制允许Geoserver逐个检查不同的A&A协议。Geoserver使用第一个匹配对用户进行授权。

GeoNode身份验证默认基于Django安全子系统。Django身份验证允许GeoNode管理其内部用户、组、角色和会话。

GeoNode有一些外部组件,如Geoserver或QGIS Server,它们是可插拔的独立服务,专门用于管理地理空间数据。这些外部服务有自己的身份验证和授权机制,必须以某种方式与GeoNode同步。此外,在大多数情况下,除非特定配置没有禁用,否则这些外部服务维护替代安全访问,例如允许GeoNode在幕后修改地理空间目录,或者系统管理员具有对服务器的独立和特权访问。

在深入了解Geoserver/GeoNode A&A的工作方式以及如何对其进行配置以正确使用GeoNode之前,让我们快速澄清一下 AuthenticationAuthorization 概念。

身份验证

身份验证是通过使用某种凭证和握手协议来验证某人身份的过程。如果凭据有效,则开始授权过程。身份验证过程始终前进到授权过程(尽管它们通常看起来可能是组合在一起的)。这两个术语通常是同义词,但它们是两个不同的过程。

有关身份验证概念的更多详细信息和说明,请查看 here

授权

授权是通过对照某种安全规则、机制或协议检查受保护资源的角色和权限来允许经过身份验证的用户访问受保护资源的过程。换句话说,它允许通过向特定授权用户授予或拒绝特定权限来控制访问权限。

GeoNode安全后端

Django身份验证

Django身份验证系统同时处理身份验证和授权。

身份验证系统包括:

  1. 用户

  2. 权限:指定用户是否可以执行特定任务的二进制(是/否)标志。

  3. 组:将标签和权限应用于多个用户的通用方式。

  4. 一种可配置的口令散列系统

  5. 用于登录用户或限制内容的表单和视图工具

  6. 可插拔的后端系统

Django中的身份验证系统旨在非常通用,并且不提供Web身份验证系统中常见的一些功能。其中一些常见问题的解决方案已在第三方软件包中实施:

  1. 密码强度检查

  2. 限制登录尝试

  3. 针对第三方的身份验证(例如,OAuth)

注解

有关django认证系统安装和配置的更多详细信息,请参考官方指南https://docs.djangoproject.com/en/3.2/topics/auth/.

GeoNode通过幕后的基本身份验证与Geoserver通信,以便配置数据和Geoserver目录。

要执行此操作,您必须确保GeoNode知道 内部 Geoserver的管理员用户和密码。

警告

这必须是具有管理员权限的内部Geoserver用户,而不是GeoNode用户。

确保将凭据正确配置到文件中 settings.py

OGC_SERVER

确保 OGC_SERVER 设置配置正确。

请注意,这两个属性 LOGIN_ENDPOINTLOGOUT_ENDPOINT 必须指定Geoserver OAuth2终结点(请参见下面的详细信息)。默认值 'j_spring_oauth2_geonode_login''j_spring_oauth2_geonode_logout' 在大多数情况下都可以使用,除非您需要一些与后一种情况不同的特定端点。在任何情况下,这些值 must 与Geoserver OAuth2插件配置一致。

如果有疑问,请使用下面的默认值。

默认值为:

...
# OGC (WMS/WFS/WCS) Server Settings
# OGC (WMS/WFS/WCS) Server Settings
OGC_SERVER = {
    'default': {
        'BACKEND': 'geonode.geoserver',
        'LOCATION': GEOSERVER_LOCATION,
        'LOGIN_ENDPOINT': 'j_spring_oauth2_geonode_login',
        'LOGOUT_ENDPOINT': 'j_spring_oauth2_geonode_logout',
        # PUBLIC_LOCATION needs to be kept like this because in dev mode
        # the proxy won't work and the integration tests will fail
        # the entire block has to be overridden in the local_settings
        'PUBLIC_LOCATION': GEOSERVER_PUBLIC_LOCATION,
        'USER': 'admin',
        'PASSWORD': 'geoserver',
        'MAPFISH_PRINT_ENABLED': True,
        'PRINT_NG_ENABLED': True,
        'GEONODE_SECURITY_ENABLED': True,
        'WMST_ENABLED': False,
        'BACKEND_WRITE_ENABLED': True,
        'WPS_ENABLED': False,
        'LOG_FILE': '%s/geoserver/data/logs/geoserver.log' % os.path.abspath(os.path.join(PROJECT_ROOT, os.pardir)),
        # Set to name of database in DATABASES dictionary to enable
        'DATASTORE': '',  # 'datastore',
        'TIMEOUT': 10  # number of seconds to allow for HTTP requests
    }
}
...

GeoNode和Geoserver A&A交互

GeoNode使用的Geoserver实例有一个特殊的设置,允许两个框架正确交互并交换有关用户凭据和权限的信息。

特别是,Geoserver配置了 Filter Chain 对于使用以下两个协议的授权:

  1. 基本身份验证 ;这是默认的Geoserver身份验证机制。这利用了 rfc2617 - Basic and Digest Access Authentication 以便检查用户的凭据。

    换句话说,Geoserver需要一个 username 和一个 password 已编码 Base64 并将其与其内部数据库(默认情况下是Geoserver数据目录上的加密XML文件)进行比较。如果用户的凭据匹配,则Geoserver将通过其 Role Services (我们将在 Geoserver(安全后端) 部分)。

    注解

    默认情况下,Geoserver附带 admingeoserver 作为默认管理员用户名和密码。在将Geoserver联机之前,必须至少更改管理员密码。

  2. OAuth2身份验证 ;此模块允许Geoserver根据 OAuth2 Protocol 。如果基本身份验证失败,Geoserver默认使用GeoNode作为OAuth2提供程序。

注解

更多详细信息可直接在地理服务器官方文档的“`Authentication Chain<http://docs.geoserver.org/latest/en/user/security/auth/chain.html#security-auth-chain>`_”“部分找到

GeoNode后端(服务器)端 ,服务器将利用 基本身份验证 使用管理员凭据配置Geoserver目录。当然,GeoNode必须可以访问Geoserver,并且GeoNode必须知道内部Geoserver管理员凭据。

GeoNode前端(浏览器和GUI)端 ,即 身份验证 目标是允许Geoserver将已经登录到GeoNode的用户识别为有效用户,从而提供一种 SSO 这两个应用程序之间的。

Geoserver必须知道并且必须能够通过HTTP/HTTPS访问GeoNode。换句话说,连接到GeoNode的外部用户必须使用相同的权限向Geoserver进行身份验证。这可以通过 OAuth2身份验证 协议。

GeoNode / GeoServer Authentication Mechanism

作为OAuth2提供程序的GeoNode(OP)

OpenID Connect是一个建立在OAuth 2.0协议之上的身份框架,它扩展了OAuth 2.0进程的授权以实现其认证机制。OpenID Connect添加了一个发现机制,允许用户使用外部可信机构作为身份提供者。从另一个角度看,这可以看作是单点登录(SSO)系统。

OAuth 2.0是一个授权框架,它能够为客户端提供代表资源所有者访问受限访问资源的方式。OpenID Connect允许客户端使用基于授权服务器的身份验证来验证用户。

作为一项操作,GeoNode将能够充当受信任的身份提供者,从而允许系统在隔离环境中工作和/或允许GeoNode对由本地Django身份验证子系统管理的私人用户进行身份验证。

作为OAuth2依赖方(RP)的Geoserver

多亏了 OAuth2身份验证 Geoserver能够直接从OAuth2提供程序(OP)检索最终用户的身份。

使用GeoNode作为OP,该机制将避免使用依赖于OAuth2安全协议的cookie。

OAuth2协议的工作原理:

../../_images/oauth001.png
  1. 依赖方将请求发送到OAuth2提供程序以对最终用户进行身份验证

  2. OAuth2提供程序对用户进行身份验证

  3. OAuth2提供程序将ID令牌和访问令牌发送给依赖方

  4. 依赖方使用从OAuth2提供程序接收的访问令牌向用户信息端点发送请求

  5. 用户信息端点返回声明。

GeoNode / GeoServer Authorization Mechanism

但是,允许Geoserver使用OAuth2来充当OAuth2RP并不足以将用户标识映射到其角色。

在Geoserver端,我们仍需要 RoleService 它将能够与GeoNode对话,并将令牌转换为要在Geoserver安全子系统自身内使用的用户主体。

换句话说,身份验证成功后,Geoserver需要授权用户,以便了解他是否能够访问哪些资源。一个 REST based RoleService 在GeoNode端,允许Geoserver通过以下方式与GeoNode通信 REST 以获取当前用户及其角色列表。

然而,仅知道与用户相关联的角色是不够的。完整的Geoserver授权需要捕获一组 Access Rules 与角色相关联,以便确定用户可以访问哪些资源和数据。

Geoserver授权仅基于角色,因此对于每个经过身份验证的用户,我们还需要知道:

  1. 与有效用户会话关联的角色

  2. 与Geoserver资源关联的访问权限

上面的身份验证机制允许Geoserver获取有关用户及其角色的信息,这解决了第1点。

关于第2点,Geoserver利用 GeoFence Embedded Server 插件。GeoFence是一个Java Web应用程序,它使用中介绍的接口为Geoserver提供高级身份验证/授权引擎 here 。GeoFence拥有自己的规则数据库,用于管理授权规则,并通过实施复杂的资源访问管理器来覆盖标准的Geoserver安全管理系统。最不重要的是,GeoFence实现并公开了 REST API 允许远程授权客户端读/写/修改安全规则。

使用这种插件的好处是多方面的:

  1. 授权规则具有细粒度。GeoFence以类似于iptables的方式处理安全规则,甚至允许对子区域和层的属性定义安全约束。

  2. GeoFence向其内部规则数据库公开了一个睡觉接口,允许外部管理员以编程方式更新安全约束

  3. GeoFence实现了内部缓存机制,大大提高了负载下的性能。

GeoNode与GeoFence的交互

GeoNode本身能够通过GeoFence向Geoserver推送/管理授权规则 REST API ,充当Geoserver的管理员。GeoNode会在需要时正确配置GeoFence规则,即更新资源/层的权限。

Geoserver必须知道并且必须能够通过HTTP/HTTPS访问GeoNode。换句话说,连接到GeoNode的外部用户必须使用相同的权限向Geoserver进行身份验证。这可以通过 GeoNodeCoockieProcessingFiler

总而言之,我们将有不同的方式访问GeoNode图层:

  1. 通过地理节点通过Django身份验证和 GeoNodeCoockieProcessingFiler ;GeoNode中提供的用户基本上对Geoserver或任何其他后台都有效。

    警告

    如果GeoNode用户拥有“管理员”权限,他也可以管理Geoserver。

  2. 通过Geoserver安全子系统;除非明确禁用,否则始终可以使用其内部安全系统和用户访问Geoserver( 警告 这很危险,你必须知道你在做什么)。

现在让我们详细了解如何配置单个部分以及如何配置它们。

Django OAuth工具包设置和配置

如上所述,GeoNode使用OAuth2协议与Geoserver进行所有前端交互。GeoNode必须配置为OAuth2提供程序并提供 Client ID 和一个 Client Sercret 地球伺服器的钥匙。这可以通过启用和配置 Django OAuth Toolkit Plugin

警告

如果在第一次安装时不执行以下步骤,GeoNode和Geoserver将完全无法工作。

默认设置 settings.py OAuth2的安全设置

仔细检查是否启用了OAuth2提供程序和安全插件,以及是否正确配置了以下设置。

AUTH_IP_WHITELIST

AUTH_IP_WHITELIST property limits access to users/groups REST Role Service endpoints to the only whitelisted IP addresses. Empty list means 'allow all'. If you need to limit 'api' REST calls to only some specific IPs fill the list like this: AUTH_IP_WHITELIST = ['192.168.1.158', '192.168.1.159']

默认值为:

...
AUTH_IP_WHITELIST = []
...

INSTALLED_APPS

为了允许GeoNode充当OAuth2提供程序,我们需要启用 oauth2_provider Django应用程序由“Django OAuth工具包”提供。

默认值为:

...
INSTALLED_APPS = (

    'modeltranslation',

    ...
    'guardian',
    'oauth2_provider',
    ...

) + GEONODE_APPS
...

MIDDLEWARE_CLASSES

安装 oauth2_provider `Django应用程序不足以启用全部功能。我们还需要GeoNode在其内部模型中包含其他实体。

默认值为:

...
MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',

    # The setting below makes it possible to serve different languages per
    # user depending on things like headers in HTTP requests.
    'django.middleware.locale.LocaleMiddleware',
    'pagination.middleware.PaginationMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',

    # If you use SessionAuthenticationMiddleware, be sure it appears before OAuth2TokenMiddleware.
    # SessionAuthenticationMiddleware is NOT required for using django-oauth-toolkit.
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'oauth2_provider.middleware.OAuth2TokenMiddleware',
)
...

AUTHENTICATION_BACKENDS

为了允许GeoNode充当OAuth2提供程序,我们需要启用 oauth2_provider.backends.OAuth2Backend Django后端由“Django OAuth工具包”提供。还要注意,我们需要指定OAuth2提供程序作用域,并声明 generator 为了创造而使用 OAuth2 Client IDs

默认值为:

...
# Replacement of default authentication backend in order to support
# permissions per object.
AUTHENTICATION_BACKENDS = (
    'oauth2_provider.backends.OAuth2Backend',
    'django.contrib.auth.backends.ModelBackend',
    'guardian.backends.ObjectPermissionBackend',
)

OAUTH2_PROVIDER = {
    'SCOPES': {
        'read': 'Read scope',
        'write': 'Write scope',
        'groups': 'Access to your groups'
    },

    'CLIENT_ID_GENERATOR_CLASS': 'oauth2_provider.generators.ClientIdGenerator',
}
...

Django OAuth工具包管理安装程序

一旦 settings.pylocal_settings.py 已为您的系统正确配置:

  1. 完成GeoNode设置步骤

    • 准备模型

      python manage.py makemigrations
      python manage.py migrate
      python manage.py syncdb
      
    • 准备静电数据

      python manage.py collectstatic
      
    • 确保已使用初始默认数据填充数据库

      警告

      已弃用 此命令将在将来被迁移所取代,因此要小心。

      python manage.py loaddata initial_data.json
      
    • 确保您的环境存在超级用户

      警告

      已弃用 此命令将在将来被迁移所取代,因此要小心。

      python manage.py createsuperuser
      

    注解

    阅读GeoNode Developer文档中的基本教程,了解有关特定命令以及如何使用它们的详细信息。

  2. 启动应用程序

    根据设置的完成情况相应地启动GeoNode;通过运行调试模式 paver 或由诸如Apache2httpd、Nginx等HTTP服务器代理。

  3. 完成OAuth2提供程序的设置

    首先,您需要配置并创建一个名为的新OAuth2应用程序 GeoServer 通过GeoNode管理控制面板

    • 访问GeoNode管理控制面板

      ../../_images/oauth002.png
    • Django OAuth Toolkit > Applications

      ../../_images/oauth003.png
    • 更新或创建名为的应用程序 GeoServer

      警告

      应用程序名称 must BE GeoServer

      ../../_images/oauth004.png
      • Client id ;代表OAuth2客户端ID的字母数字代码。Geoserver OAuth2插件 will 使用 this 价值。

        警告

        在生产环境中,它是 高度 建议修改随GeoNode安装提供的默认值。

      • User ;搜索 admin 用户。它的 ID 将自动更新到表单中。

      • Redirect uris ;可以在此指定多个URI。这些必须与Geoserver实例URI一致。

      • Client type; Choose Confidential

      • Authorization grant type; Choose Authorization code

      • Client secret ;代表OAuth2客户端密码的字母数字代码。Geoserver OAuth2插件 will 使用 this 价值。

        警告

        在生产环境中,它是 高度 建议修改随GeoNode安装提供的默认值。

      • Name; Must be GeoServer

Geoserver安全后端

Geoserver安全子系统

Geoserver有一个健壮的安全子系统,以Spring Security为模型。大多数安全功能都可以通过Web管理界面使用。

有关此功能的工作原理以及如何配置和修改的更多详细信息,请参阅Geoserver官方指南http://docs.geoserver.org/stable/en/user/security/webadmin/index.html

通过使用 GeoServer Data Dir 随GeoNode Build一起提供的以下配置已经可用。您只需根据您的环境相应地更新它们(如IP地址和主机名、OAuth2密钥等)。但是,建议仔细阅读以下所有段落,以便准确了解不同组件是如何配置的,并轻松识别部署过程中可能出现的任何问题。

本节的主要主题包括:

  1. 连接到GeoNode睡觉角色服务

  2. 地理服务器OAuth2认证过滤的设置

  3. 地球服务器过滤链的配置

  4. GeoFence服务器和默认规则的设置和测试

连接到GeoNode睡觉角色服务

初步检查

  • Geoserver已启动并运行,并且您拥有管理员权限

  • Geoserver必须通过HTTP到达GeoNode实例

  • 必须允许Geoserver主机IP地址访问GeoNode角色服务API(请参阅部分 AUTH_IP_WHITELIST (上图)

地理节点睡觉角色服务的设置

  1. 以以下身份登录 admin 到Geoserver GUI

    警告

    在生产系统中,请记住更改默认管理员凭据 admin geoserver

    ../../_images/oauth005.png
  2. 访问 Security > Users, Groups, Roles 部分

    ../../_images/oauth006.png
  3. 如果尚未配置 这项服务 geonode REST role service ,请单击 Role Services > Add new

    注解

    这段话是 not 如果 geonode REST role service 已经创建好了。如果是,它将显示在角色服务列表中

    ../../_images/oauth008.png
    ../../_images/oauth007.png
  4. 如果尚未配置 这项服务 geonode REST role service ,选择 AuthKEY REST - Role service from REST endpoint

    ../../_images/oauth009.png
  5. 创建/更新 geonode REST role service 相应地,

    ../../_images/oauth010.png
    • Name; Must be geonode REST role service

    • Base Server URL ;必须指向GeoNode实例基URL(例如 http://<geonode_host_url> )

    • Roles REST Endpoint; Enter /api/roles

    • Admin Role REST Endpoint; Enter /api/adminRole

    • Users REST Endpoint; Enter /api/users

    • Roles JSON Path; Enter $.groups

    • Admin Role JSON Path; Enter $.adminRole

    • Users JSON Path; Enter $.users[0].groups

    一旦一切都设置好并且工作正常,请选择 Administrator roleGroup administrator role 作为 ROLE_ADMIN

允许GeoFence使用以下内容验证规则 ROLES

警告

以下说明因您当前使用的Geoserver版本而异。

Geoserver 2.9.x和2.10.x

  1. 访问 Security > Settings 部分

    ../../_images/oauth011.png
  2. 选择 geonode REST role service 作为 Active role service

    ../../_images/oauth012.png

Geoserver2.12.x及更高版本

在GeoFence插件的最新更新中,后者不再识别默认设置中的角色服务,而是识别 geofence-server.properties 文件。

也就是说,重要的是 Security > Settings 角色服务将设置为 默认设置 ,以允许Geoserver遵循标准授权链。

另一方面,您需要确保 geofence-server.properties 文件位于 $GEOSERVER_DATA_DIR/geofence 文件夹中包含以下两个附加属性:

gwc.context.suffix=gwc
org.geoserver.rest.DefaultUserGroupServiceName=geonode REST role service

地理服务器OAuth2认证过滤的设置

现在有必要检查Geoserver是否可以连接到OAuth2提供程序(特别是GeoNode OP),并能够通过它对用户进行身份验证。

初步检查

  • Geoserver已启动并运行,并且您拥有管理员权限

  • Geoserver必须通过HTTP到达GeoNode实例

  • OAuth2 Client IDClient Secret 已在GeoNode上生成并已知

GeoNodeOAuth2安全过滤的设置

  1. 访问 Security > Authentication 部分

    ../../_images/oauth013.png
  2. 如果尚未配置 认证过滤 geonode-oauth2 - Authentication using a GeoNode OAuth2 ,请单击 Authentication Filters > Add new

    注解

    这段话是 not 如果 geonode-oauth2 - Authentication using a GeoNode OAuth2 已经创建好了。如果是,它将显示在身份验证筛选器列表中

    ../../_images/oauth015.png
    ../../_images/oauth014.png
  3. 如果尚未配置 认证过滤 geonode-oauth2 - Authentication using a GeoNode OAuth2 ,选择 GeoNode OAuth2 - Authenticates by looking up for a valid GeoNode OAuth2 access_token key sent as URL parameter

    ../../_images/oauth016.png
  4. 创建/更新 geonode-oauth2 - Authentication using a GeoNode OAuth2 相应地,

    ../../_images/oauth017.png
    • Name; Must be geonode-oauth2

    • Enable Redirect Authentication EntryPoint ;建议将此放到 False ,否则Geoserver将不允许您通过 Form 但仅通过GeoNode

    • Login Authentication EndPoint; Unless you have specific needs, keep the default value /j_spring_oauth2_geonode_login

    • Logout Authentication EndPoint; Unless you have specific needs, keep the default value /j_spring_oauth2_geonode_logout

    • Force Access Token URI HTTPS Secured Protocol ;这一定是 False 除非您启用了 Secured Connection 在GeoNode上。在这种情况下,您需要信任GeoNode Certificate 在Geoserver JVM密钥库上。请查看下面的详细信息

    • Access Token URI; Set this to http://<geonode_host_base_url>/o/token/

    • Force User Authorization URI HTTPS Secured Protocol ;这一定是 False 除非您启用了 Secured Connection 在GeoNode上。在这种情况下,您需要信任GeoNode Certificate 在Geoserver JVM密钥库上。请查看下面的详细信息

    • User Authorization URI; Set this to http://<geonode_host_base_url>/o/authorize/

    • Redirect URI ;将其设置为 http://<geoserver_host>/geoserver 。这个地址 must 出席 Redirect uris 地理节点的数量 OAuth2 > Applications > GeoServer (请参阅上文)

    • Check Token Endpoint URL; Set this to http://<geonode_host_base_url>/api/o/v4/tokeninfo/

    • Logout URI; Set this to http://<geonode_host_base_url>/account/logout/

    • Scopes; Unless you have specific needs, keep the default value read,write,groups

    • Client IDClient id 由GeoNode生成的字母数字密钥 OAuth2 > Applications > GeoServer (请参阅上文)

    • Client SecretClient secret 由GeoNode生成的字母数字密钥 OAuth2 > Applications > GeoServer (请参阅上文)

    • Role source; In order to authorize the user against GeoNode, choose Role service > geonode REST role service

地球服务器过滤链的配置

以下步骤确保Geoserver可以采用更多的身份验证方法。如上所述,可以使用不同的协议向Geoserver进行身份验证。

Geoserver扫描与指定路径关联的身份验证筛选器链,并按顺序逐个尝试。第一个与协议匹配并能够授予用户访问权限的应用程序打破了这个循环,方法是创建 User Principal 把它注入地球服务器 SecurityContext 。然后,身份验证过程在这里结束,控制转到授权进程,它将尝试通过与授予访问权限的身份验证过滤相关联的可用地理服务器角色服务来检索经过身份验证的用户的角色。

初步检查

  • Geoserver已启动并运行,并且您拥有管理员权限

  • Geoserver必须通过HTTP到达GeoNode实例

  • 这个 geonode-oauth2 - Authentication using a GeoNode OAuth2 认证过滤和 geonode REST role service 已正确配置

地球服务器过滤连锁店的设置

  1. 访问 Security > Authentication 部分

    ../../_images/oauth013.png
  2. 标识该部分 Filter Chains

    ../../_images/oauth018.png
  3. 请确保 web 过滤链条配置如下所示

    ../../_images/oauth019.png

    警告

    每次你修改过滤连锁店, 别忘了存钱 这个 Authentication 设置。这 must 因……而完蛋了 each 变化。

    ../../_images/oauth020.png
  4. 请确保 rest 过滤链条配置如下所示

    ../../_images/oauth021.png

    警告

    每次你修改过滤连锁店, 别忘了存钱 这个 Authentication 设置。这 must 因……而完蛋了 each 变化。

    ../../_images/oauth020.png
  5. 请确保 gwc 过滤链条配置如下所示

    ../../_images/oauth022.png

    警告

    每次你修改过滤连锁店, 别忘了存钱 这个 Authentication 设置。这 must 因……而完蛋了 each 变化。

    ../../_images/oauth020.png
  6. 请确保 default 过滤链条配置如下所示

    ../../_images/oauth023.png

    警告

    每次你修改过滤连锁店, 别忘了存钱 这个 Authentication 设置。这 must 因……而完蛋了 each 变化。

    ../../_images/oauth020.png
  7. 添加 GeoNode Login Endpoints 添加到逗号分隔的 webLogin 过滤连锁店

    ../../_images/oauth024.png

    警告

    每次你修改过滤连锁店, 别忘了存钱 这个 Authentication 设置。这 must 因……而完蛋了 each 变化。

    ../../_images/oauth020.png
  8. 添加 GeoNode Logout Endpoints 添加到逗号分隔的 webLogout 过滤连锁店

    ../../_images/oauth025.png

    警告

    每次你修改过滤连锁店, 别忘了存钱 这个 Authentication 设置。这 must 因……而完蛋了 each 变化。

    ../../_images/oauth020.png
  9. 添加 GeoNode Logout Endpoints 添加到逗号分隔的 formLogoutChain 中的XML节点 <GEOSERVER_DATA_DIR>/security/filter/formLogout/config.xml

    您需要文本编辑器来修改该文件。

    注解

    如果 <formLogoutChain> XML节点根本不存在,请创建一个 新的一个 如下所述

    <logoutFilter>
      ...
      <redirectURL>/web/</redirectURL>
      <formLogoutChain>/j_spring_security_logout,/j_spring_security_logout/,/j_spring_oauth2_geonode_logout,/j_spring_oauth2_geonode_logout/</formLogoutChain>
    </logoutFilter>
    

    警告

    The value j_spring_oauth2_geonode_logout must be the same specified as Logout Authentication EndPoint in the geonode-oauth2 - Authentication using a GeoNode OAuth2 above.

GeoFence服务器和默认规则的设置和测试

为了正常工作,Geoserver需要 GeoFence Embedded Server 要在系统上安装和配置的插件。

为GeoNode提供的Geoserver配置已经使用默认配置安装了插件。在这种情况下,请按照下面的步骤仔细检查插件是否工作正常,以及是否设置了默认规则。

初步检查

  • Geoserver已启动并运行,并且您拥有管理员权限

  • 这个 GeoFence Embedded Server 已在Geoserver上安装插件

地球服务器过滤连锁店的设置

  1. 访问 Security > Authentication 部分

    ../../_images/oauth013.png
  2. 标识该部分 Authentication Providers 并确保 geofence 身份验证提供程序存在

    ../../_images/oauth032.png
  3. 请确保 Provider Chain 配置如下所示

    ../../_images/oauth033.png

    警告

    每次修改身份验证提供程序时, 别忘了存钱 这个 Authentication 设置。这 must 因……而完蛋了 each 变化。

    ../../_images/oauth020.png

GeoFence服务器和规则的设置

  1. 确保GeoFence服务器工作正常并且默认设置配置正确

    • 访问 Security > GeoFence 部分

      ../../_images/oauth026.png
    • 请确保 Options 配置如下,并且服务器在执行 Test Connection

      ../../_images/oauth027.png
      • Allow remote and inline layers in SLD; Set it to True

      • Allow SLD and SLD_BODY parameters in requests; Set it to True

      • Authenticated users can write; Set it to True

      • Use GeoServer roles to get authorizations; Set it to False

  2. 检查GeoFence默认规则

    • 访问 Security > GeoFence Data Rules 部分

      ../../_images/oauth028.png
    • 请确保 DENY ALL 默认情况下存在规则,否则所有人都可以访问您的数据

      注解

      这条规则是 始终 最后一个

      ../../_images/oauth029.png

      警告

      如果该规则不存在 在最底层 (这条规则是 始终 最后一个),手动添加。

    • 访问 Security > GeoFence Admin Rules 部分

      ../../_images/oauth030.png
    • 这里不需要任何规则

      ../../_images/oauth031.png

故障排除和高级功能

常见问题和修复

  • 即使使用GeoNode,Geoserver/GeoNode OAuth2也不会以管理员身份进行身份验证 admin 用户

    Symptoms

    当尝试使用 admin 使用OAuth2的用户,该过程正确地重定向到Geoserver页面,但我不是Geoserver管理员。

    Cause

    这意味着Geoserver不知何故无法成功完成授权和身份验证过程。

    问题的可能原因可能有以下几个:

    1. 地理服务器端的OAuth2身份验证失败

      这通常是由于尝试完成身份验证过程时出现异常。

      • 一个典型的原因是Geoserver尝试使用HTTPS连接,但GeoNode证书不可信;

        在这种情况下,请参考下面的部分。另请查看日志(特别是Geoserver日志),如中所述 debug_geonode 。Geoserver日志应包含详细的异常,解释问题的原因。如果此处未列出任何异常(即使在将日志级别提高到 DEBUG ),请尝试检查GeoNode角色服务,如下所述。

      • 另一个可能的问题是,不知何故,OAuth2握手无法成功完成;

        1. 通过Geoserver的Web登录表单以管理员身份登录到Geoserver。

        2. 仔细检查所有的 geonode-oauth2 - Authentication using a GeoNode OAuth2 参数正确。如果一切正常,请查看日志(特别是Geoserver日志),如中所述 debug_geonode 。Geoserver日志应包含详细的异常,解释问题的原因。如果此处未列出任何异常(即使在将日志级别提高到 DEBUG ),请尝试检查GeoNode角色服务,如下所述。

    2. Geoserver无法从角色服务检索用户角色

      始终仔细检查HTTP服务器和Geoserver日志,如第节所述 debug_geonode 。这可能会直接引导您找到问题的原因。

      • 检查是否授予地理服务器主机访问中的地理节点角色服务睡觉API的权限 AUTH_IP_WHITELISTsettings.py

      • 检查是否 geonode REST role service 是默认角色服务,并且Geoserver OAuth2插件已配置为默认使用它

      • 检查GeoNode睡觉角色服务API是否正常运行并生成正确的json。

        这可以通过使用简单的 cUrl 接到这样的电话

        curl http://localhost/api/adminRole
        $> {"adminRole": "admin"}
        
        
        curl http://localhost/api/users
        $> {"users": [{"username": "AnonymousUser", "groups": ["anonymous"]}, {"username": "afabiani", "groups": ["anonymous", "test"]}, {"username": "admin", "groups": ["anonymous", "test", "admin"]}]}
        
        curl http://localhost/api/roles
        $> {"groups": ["anonymous", "test", "admin"]}
        
        curl http://localhost/api/users/admin
        $> {"users": [{"username": "admin", "groups": ["anonymous", "test", "admin"]}]}
        

如何设置 HTTPS 安全终端

在生产系统中,加密Geoserver和GeoNode之间的连接是一种很好的做法。这可以通过在GeoNode睡觉角色服务API和OAuth2端点上启用HTTPS协议来实现。

大多数情况下,您将使用生成的证书依赖自签名HTTPS连接。这就把我们之间的联系 不受信任 您需要告诉Geoserver Java虚拟机信任它。

这可以通过执行以下步骤来完成。

对于任何问题,请查看日志(特别是Geoserver日志),如中所述 debug_geonode 。Geoserver日志应包含详细的异常,解释问题的原因。

SSL受信任证书

在使用自定义 Keystore 或者尝试从非SSH连接访问不受信任或自签名的受SSL保护的OAuth2提供程序,您将需要将证书添加到JVM Keystore

要执行此操作,您可以执行以下步骤:

在此示例中,我们将执行以下操作

  1. 从GeoNode域检索SSL证书:

    “访问令牌URI”=https://<geonode_host_base_url>/o/token/,因此我们需要信任 https://<geonode_host_base_url> 或 (<geonode_host_base_url>:443 )

    注解

    您将需要从OAuth2终结点上使用的每个不同HTTPS URL获取并信任证书。

  2. 将SSL证书存储在本地硬盘上

  3. 将SSL证书添加到Java密钥库

  4. 使JVM能够检查来自密钥库的SSL证书

  1. 从GeoNode域检索SSL证书

    使用 openssl 命令,以便转储证书

    https://<geonode_host_base_url>

    openssl s_client -connect <geonode_host_base_url>:443
    
    ../../_images/google_ssl_001.png
  2. 将SSL证书存储在本地硬盘上

    复制并粘贴节 -BEGIN CERTIFICATE--END CERTIFICATE- 并将其保存到 .cert 文件

    注解

    .cert 文件是纯文本文件,包含 -BEGIN CERTIFICATE--END CERTIFICATE- 各节

    geonode.cert (或您想用的任何名称 .cert 分机)

    ../../_images/google_ssl_003.png
  3. 将SSL证书添加到Java密钥库

    您可以使用Java命令 keytool 就像这样

    geonode.cert (或您想用的任何名称 .cert 分机)

    keytool -import -noprompt -trustcacerts -alias geonode -file geonode.cert -keystore ${KEYSTOREFILE} -storepass ${KEYSTOREPASS}
    

    或者,您也可以使用一些图形工具来帮助您管理SSL证书和密钥库,例如 Portecle

    java -jar c:\apps\portecle-1.9\portecle.jar
    
    ../../_images/google_ssl_005.png
    ../../_images/google_ssl_006.png
    ../../_images/google_ssl_007.png
    ../../_images/google_ssl_008.png
    ../../_images/google_ssl_009.png
    ../../_images/google_ssl_010.png
    ../../_images/google_ssl_011.png
    ../../_images/google_ssl_012.png
    ../../_images/google_ssl_013.png
  4. 使JVM能够检查来自密钥库的SSL证书

    要做到这一点,您需要传递一个 JAVA_OPTION 发送到您的JVM:

    -Djavax.net.ssl.trustStore=F:\tmp\keystore.key
    
  5. 重新启动您的服务器

注解

下面您可以找到一个bash脚本,它简化了Keystore SSL证书的导入。方便的时候用吧。

HOST=myhost.example.com
PORT=443
KEYSTOREFILE=dest_keystore
KEYSTOREPASS=changeme

# get the SSL certificate
openssl s_client -connect ${HOST}:${PORT} </dev/null \
        | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ${HOST}.cert

# create a keystore and import certificate
keytool -import -noprompt -trustcacerts \
        -alias ${HOST} -file ${HOST}.cert \
        -keystore ${KEYSTOREFILE} -storepass ${KEYSTOREPASS}

# verify we've got it.
keytool -list -v -keystore ${KEYSTOREFILE} -storepass ${KEYSTOREPASS} -alias ${HOST}

GeoFence高级功能

GeoFence规则管理和教程

  • This tutorial 显示如何安装和配置Geofence内部服务器插件。它展示了如何通过两种方式创建规则:使用图形用户界面和睡觉方法。

  • 可以通过睡觉接口创建/更新/删除GeoFence规则,只有Geoserver管理员用户才能访问该接口。您可以找到有关GeoFence睡觉接口工作方式的更多详细信息 here

GeoFence规则存储配置

默认情况下,GeoFence配置为使用存储在Geoserver数据目录上的基于文件系统的数据库 <GEOSERVER_DATA_DIR/geofence

  • 还可以配置GeoFence以使用外部PostgreSQL/PostGIS数据库。有关更多详细信息,请参阅GeoFence官方文档 here

  1. 添加 Java LibrariesGeoServer

    wget --no-check-certificate "https://www.dropbox.com/s/ilowu1vd27j2cs1/hibernate-spatial-postgis-1.1.3.2.jar?dl=1" -O hibernate-spatial-postgis-1.1.3.2.jar
    wget --no-check-certificate "https://www.dropbox.com/s/psolxleimaft0t7/postgis-jdbc-1.3.3.jar?dl=1" -O postgis-jdbc-1.3.3.jar
    
    cp hibernate-spatial-postgis-1.1.3.2.jar <GEOSERVER_WEBAPP_DIR>/WEB-INF/lib
    cp postgis-jdbc-1.3.3.jar <GEOSERVER_WEBAPP_DIR>/WEB-INF/lib
    
    restart geoserver
    
  2. 在此处使用更新的模式创建数据库https://github.com/geoserver/geofence/blob/master/doc/setup/sql/002_create_schema_postgres.sql,或者通过配置文件启用hbm2ddl自动创建(请参见步骤 3 )

    注解

    请注意,如果表不存在,“UPDATE”也会创建表。然而,在生产中,我建议将其更改为“验证”。

    # If you want to create a new DB for GeoFence
    sudo -u postgres createdb -O geonode geofence; \
    sudo -u postgres psql -d geofence -c 'CREATE EXTENSION postgis;'; \
    sudo -u postgres psql -d geofence -c 'GRANT ALL ON geometry_columns TO PUBLIC;'; \
    sudo -u postgres psql -d geofence -c 'GRANT ALL ON spatial_ref_sys TO PUBLIC;'; \
    sudo -u postgres psql -d geofence -c 'GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO geonode;'
    
  3. 添加类似于的配置 geofence-datasource-ovr.properties 以下示例(如果加载为Geoserver Extension)

    <GEOSERVER_DATA_DIR>/geofence/geofence-datasource-ovr.properties

    # /* (c) 2019 Open Source Geospatial Foundation - all rights reserved
    #  * This code is licensed under the GPL 2.0 license, available at the root
    #  * application directory.
    #  */
    #
    geofenceVendorAdapter.databasePlatform=org.hibernatespatial.postgis.PostgisDialect
    geofenceDataSource.driverClassName=org.postgresql.Driver
    geofenceDataSource.url=jdbc:postgresql://localhost:5432/geofence
    geofenceDataSource.username=postgres
    geofenceDataSource.password=postgres
    geofenceEntityManagerFactory.jpaPropertyMap[hibernate.default_schema]=public
    
    ################################################################################
    ## Other setup entries
    ################################################################################
    ## hbm2ddl.auto may assume one of these values:
    ## - validate: validates the DB schema at startup against the internal model. May fail on oracle spatial.
    ## - update: updates the schema, according to the internal model. Updating automatically the production DB is dangerous.
    ## - create-drop: drop the existing schema and recreates it according to the internal model. REALLY DANGEROUS, YOU WILL LOSE YOUR DATA.
    ## You may want not to redefine the property entirely, in order to leave the default value (no action).
    
    geofenceEntityManagerFactory.jpaPropertyMap[hibernate.hbm2ddl.auto]=update
    geofenceEntityManagerFactory.jpaPropertyMap[javax.persistence.validation.mode]=none
    geofenceEntityManagerFactory.jpaPropertyMap[hibernate.validator.apply_to_ddl]=false
    geofenceEntityManagerFactory.jpaPropertyMap[hibernate.validator.autoregister_listeners]=false
    
    ##
    ## ShowSQL is set to true in the configuration file; putting showsql=false in
    ## this file, you can easily check that this override file has been properly applied.
    
    # geofenceVendorAdapter.generateDdl=false
    # geofenceVendorAdapter.showSql=false
    
    ## Set to "true" in specific use cases
    # workspaceConfigOpts.showDefaultGroups=false
    
    
    
    ################################################################################
    ## Disable second level cache.
    ## This is needed in a geofence-clustered environment.
    
    #geofenceEntityManagerFactory.jpaPropertyMap[hibernate.cache.use_second_level_cache]=false
    
    ################################################################################
    ## Use external ehcache configuration file.
    ## Useful to change cache settings, for example diskStore path.
    #geofenceEntityManagerFactory.jpaPropertyMap[hibernate.cache.provider_configuration_file_resource_path]=file:/path/to/geofence-ehcache-override.xml