概述

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. 地理服务器安全子系统

    2. geoserver oauth2安全插件简介

    3. 的配置 GeoNode REST Role Service

    4. 的配置 GeoNode OAuth2 Authentication Filter

    5. geoserver身份验证筛选器链

    6. GeoFence插件介绍,GeoServer的高级安全框架

  • 故障排除和高级功能

    1. 常见问题及解决方法

    2. 如何设置 HTTPS 安全终结点

    3. 地理围栏高级功能

介绍

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

geoserver支持多种身份验证和授权机制。这些系统是可插入的,geoserver可以使用 Filter Chain 是的。简而言之,这种机制允许geoserver逐个检查不同的a&a协议。geoserver使用第一个匹配项来授权用户。

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

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

在GeoServer和GeoServer之间如何快速正确地配置GeoServer和GeoServer之间的差异 AuthenticationAuthorization 概念。

认证

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

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

授权

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

geonode安全后端

Django身份验证

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

认证系统包括:

  1. 用户

  2. 权限:二进制(是/否)标志,指示用户是否可以执行某项任务。

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

  4. 可配置密码哈希系统

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

  6. 可插拔后端系统

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

  1. 密码强度检查

  2. 限制登录尝试

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

注解

有关django身份验证系统安装和配置的详细信息,请参阅官方指南https://docs.djangoproject.com/en/1.10/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 和A password 编码的 Base64 在http请求头上,并将其与内部数据库(默认情况下是geoserver data dir上的加密xml文件)进行比较。如果用户的凭据匹配,则geoserver将通过其 Role Services (我们将在 GeoServer(安全后端) 以下章节)。

    注解

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

  2. OAuth2身份验证 ;此模块允许geoserver根据 OAuth2 Protocol 是的。如果基本身份验证失败,geoserver会返回到这个位置,默认情况下使用geonode作为oauth2提供程序。

注解

有关更多详细信息,请直接在geoserver官方文档中的“authentication chain<http://docs.geoserver.org/latest/en/user/security/auth/chain.html security auth chain>`”

geonode后端(服务器)端 ,服务器将利用 基本身份验证 使用管理员凭据配置geoserver目录。当然,geonode必须能够访问geoserver,geonode必须知道geoserver的内部管理凭据。

geonode前端(浏览器和gui)端 , the 认证 目标是允许geoserver将已经登录geonode的用户识别为有效用户,提供 SSO 两个应用程序之间的机制。

geoserver必须知道并且必须能够通过http/https访问geonode。换句话说,连接到geonode的外部用户必须使用相同的权限通过geoserver的身份验证。这可以通过 OAuth2身份验证 协议。

GeoNode / GeoServer Authentication Mechanism

geonode作为oauth2提供程序(op)

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

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

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

GeoServer作为OAuth2依赖方(RP)

多亏了 OAuth2身份验证 geoserver能够直接从oauth2提供者(op)检索最终用户的身份。

当geonode充当op时,该机制将避免使用依赖于oauth2安全协议的cookies。

OAuth2协议的工作原理:

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

  2. OAuth2提供程序验证用户

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

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

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

GeoNode / GeoServer Authorization Mechanism

但是,允许geoserver使用oauth2作为oauth2 rp并不足以将用户标识映射到其角色。

在geoserver端,我们仍然需要 RoleService 它将能够与geonode对话,并将令牌转换为用户主体,以便在geoserver安全子系统中使用。

换句话说,在成功的身份验证之后,geoserver需要对用户进行授权,以便了解他是否能够访问哪些资源。一个 REST based RoleService 在geonode端,允许geoserver通过 REST 获取当前用户及其角色列表。

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

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

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

  2. 与地理服务器资源关联的访问权限

上面的身份验证机制允许geoserver获取有关用户及其角色的信息,这些信息寻址点1。

关于点2,geoserver使用 GeoFence Embedded Server 插件。GeoFence是一个Java Web应用程序,它使用 here 是的。GeoFence有自己的用于管理授权规则的规则数据库,并通过实现复杂的资源访问管理器来覆盖标准GeoServer安全管理系统。至少,但不是最后,地理围栏实现并暴露了 REST API 允许远程授权客户端读/写/修改安全规则。

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

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

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

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

土工格栅与土工节点的相互作用

geonode本身能够通过geofence向geoserver推送/管理授权规则。 REST API ,作为geoserver的管理员。geonode可以在需要时正确配置geofeen规则,即更新资源/层的权限。

geoserver必须知道并且必须能够通过http/https访问geonode。换句话说,连接到geonode的外部用户必须使用相同的权限通过geoserver的身份验证。这可以通过 GeoNodeCoockieProcessingFiler .

总结一下,我们将有不同的方法来访问地理节点层:

  1. 通过geonode通过django身份验证和 GeoNodeCoockieProcessingFiler ;基本上,geonode中可用的用户也适用于geoserver或任何其他后端。

    警告

    如果geonode用户具有“管理员”权限,他也可以管理geonode服务器。

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

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

django oauth工具包的设置和配置

如上所述,GeoNode将OAuth2协议用于与GeoServer的所有前端交互。GeoNode必须配置为OAuth2提供程序并提供 Client ID 和A Client Sercret GeoServer的密钥。这可以通过启用和配置 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 oauth工具包”提供的django应用程序。

默认值为:

...
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开发人员文档的基础教程,了解有关特定命令以及如何使用这些命令的详细信息。

  2. 启动应用程序

    根据安装的方式相应地启动geonode;运行调试模式 paver 或由HTTP服务器代理,如Apache E2HTPD、NGIX或其他。

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

    首先,您需要配置并创建一个名为 GeoServer 通过geonode管理仪表板

    • 访问geonode管理仪表板

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

      ../../_images/oauth003.png
    • 更新或创建名为 GeoServer

      警告

      应用程序名称 mustGeoServer

      ../../_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有一个健壮的安全子系统,以spring安全为模型。大多数安全功能都可以通过web管理界面使用。

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

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

本节的主要主题是:

  1. 连接到geonode rest角色服务

  2. geoserver oauth2身份验证筛选器的设置

  3. geoserver筛选器链的配置

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

连接到geonode rest角色服务

初步检查

  • geoserver已启动并正在运行,您具有管理权限

  • geoserver必须通过http访问geonode实例

  • 必须允许geoServer主机IP地址访问geonode角色服务API(请参阅一节 AUTH_IP_WHITELIST 以上)

geonode rest角色服务的设置

  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

GeoServer 2.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

geoserver oauth2身份验证筛选器的设置

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

初步检查

  • geoserver已启动并正在运行,您具有管理权限

  • geoserver必须通过http访问geonode实例

  • 非统组织2 Client IDClient Secret 已经在geonode上生成并且已知

geonode oauth2安全过滤器的设置

  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 ID ;的 Client id 由geonode生成的字母数字键 OAuth2 > Applications > GeoServer (见上文)

    • Client Secret ;的 Client 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进行身份验证。

geoserver扫描与指定路径关联的身份验证筛选器链,并逐个按顺序进行尝试。第一个与协议匹配并且能够授予用户访问权限,通过创建 User Principal 把它注入地球服务器 SecurityContext 是的。然后,身份验证过程在此结束,控件转到授权过程,授权过程将尝试通过与授予访问权限的身份验证筛选器关联的可用地理服务器角色服务检索已验证用户的角色。

初步检查

  • geoserver已启动并正在运行,您具有管理权限

  • geoserver必须通过http访问geonode实例

  • 这个 geonode-oauth2 - Authentication using a GeoNode OAuth2 身份验证筛选器和 geonode REST role service 已正确配置

geoserver筛选器链的设置

  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上安装插件

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

地理围栏服务器和规则的设置

  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

故障排除和高级功能

常见问题及解决方法

  • geoserver/geonode oauth2即使使用geonode也不能作为管理员进行身份验证 admin 用户

    Symptoms

    当尝试使用 admin 用户使用OAuth2时,进程将正确重定向到GeoServer页,但我不是GeoServer管理员。

    Cause

    这意味着geoserver无法成功完成授权和身份验证过程。

    可能的故障原因如下:

    1. 在geoserver端,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 是的。这可能会直接引导您找到问题的原因。

      • 检查geoserver主机是否被授予访问 AUTH_IP_WHITELISTsettings.py

      • 检查一下 geonode REST role service 是默认角色服务,并且geoserver oauth2插件已配置为默认使用它

      • 检查geonode rest角色服务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 rest角色服务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脚本,它简化了密钥库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}

地理围栏高级功能

地理围栏规则管理和教程

  • This tutorial 显示如何安装和配置GeoFence内部服务器插件。它展示了如何以两种方式创建规则:使用gui和rest方法。

  • geofeen规则可以通过rest api创建/更新/删除,只有geoserver管理员用户可以访问。您可以找到关于geofeence rest api如何工作的更多细节 here .

地理围栏规则存储配置

默认情况下,geoFence配置为使用存储在geoserver data dir上的基于文件系统的数据库 <GEOSERVER_DATA_DIR/geofence .

  • 也可以配置geofeen以使用外部postgresql/postgis数据库。有关更多详细信息,请参阅官方地理围栏文档 here .

  1. 添加 Java LibrariesGeoServer

    wget --no-check-certificate https://build.geo-solutions.it/geonode/geoserver/latest/hibernate-spatial-postgis-1.1.3.1/hibernate-spatial-postgis-1.1.3.1.jar
    wget --no-check-certificate https://build.geo-solutions.it/geonode/geoserver/latest/postgis-jdbc-1.3.3/postgis-jdbc-1.3.3.jar
    
    cp hibernate-spatial-postgis-1.1.3.1.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/geofeence/blob/master/doc/setup/sql/002_create_schema_postgres.sql或通过配置文件启用HBM2DDL自动创建(请参阅步骤 3

    注解

    请注意,“更新”还创建表,如果它们不存在。不过,在生产中,我建议将其更改为“验证”

    # 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扩展)

    <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