MS RFC 90:按IP列表启用/禁用OGC Web服务中的层

日期

2013/02/14

作者

塔玛斯塞克勒斯

联系

gmail.com上的szekerest

状态

接受(2013/03/02),实施

版本

映射服务器6.3-dev

1。概述

此RFC提供按IP列表启用或禁用OWS层的选项。其目的是让管理员定义通过其IP识别的用户列表,以允许或拒绝访问一个或多个特定的WXS层。

2。建议的解决方案

这个添加将在mapfile的web/metadata部分和/或每个单独层的metadata部分提供另外两个参数。

  • ows_allowed_ip_list:

  • ows_denied_ip_list:

这些参数既支持一个文件中的地址列表,也支持直接在映射文件中提供值的能力(在只指定多个IP或范围的情况下)。

在内联设置IP列表时,我们可以使用空格作为分隔符,例如:

LAYER
  METADATA
    "ows_allowed_ip_list" "123.45.67.89 11.22.33.44"
  END
END

或者我们可以指定一个包含IP地址列表的文件(文件中的IP和范围用空格或换行符分隔)

LAYER
  METADATA
    "ows_allowed_ip_list" "file:/path/to/list_of_ips.txt"
  END
END

我们还可以使用 CIDR notation 例如:“192.168.1.0/24”

设置ows_allowed_ip_列表将拒绝列表中未指定的所有其他IP,设置ows_denied_ip_列表将允许列表中未指定的所有其他IP。当我们同时允许和拒绝给定的IP时,将优先拒绝。

设置 ows_enable_request (加入) MS RFC 67 )也将被考虑在内。禁用的请求不能被IP列表重新启用,但是我们可以在启用的OGC Web服务中通过IP列表限制对layes子集的访问。

我们还可以使用相应的特定于服务的设置(如 wms_allowed_ip_list 或 wfs_allowed_ip_list)

此添加将支持同时使用IPv4和IPv6 IP地址。

三。禁用库存CGI操作

我们还需要通过使用stock cgi操作(模式=…)来防止客户端绕过IP限制。因此,我们在mapfile的web部分添加一个新参数(ms_enable_modes),以控制应启用哪些模式。这个 ms_enable_modes 将依赖于启用请求的当前实现,因此可以使用星号“*”指定所有模式和前面的感叹号“!”可用于否定给定条件。

为了保持向后兼容性,如果我们不指定 ms_enable_modes 然后所有模式都被启用和调度。

使用OGC Web服务时,我们不需要通过URL指定模式,因此我们可以使用以下设置阻止所有CGI模式:

WEB
  METADATA
        # Block all CGI modes by default for this mapfile
    "ms_enable_modes"  "!*"
  END
END

这将只分派那些不由URL设置显式模式的请求。如果所有现有用户只想提供OGC Web服务,建议他们在映射文件中包含此设置。

我们还可以有选择地启用模式,如下所示:

WEB
  METADATA
    # Enable Only MAP and LEGEND modes for this mapfile
    "ms_enable_modes" "!* MAP LEGEND"
      END
END

要启用除地图以外的所有模式:

WEB
  METADATA
    # Enable all modes except MAP for this mapfile
    "ms_enable_modes" "!MAP"
      END
END

如果禁用了URL指定的模式,MapServer将提供以下错误消息:

“指定的模式…当前映射配置不支持“

在这个RFC的范围内,我们不打算支持 ms_enable_modes.

4。实施细节

这一变化将利用 MS RFC 67 这使得实现相当简单。大多数功能都是通过向mapows.c添加新的函数(msowsipdisabled、msowsipinmetadata、msowsipinlist、msowsipparse)来提供的,以检查特定的IP是否被禁用。msowsipdisabled函数从msowsrequestisenabled和msowsrequestlayersensabled调用,以防止将禁用的层添加到启用的层列表中。

msowsiparse将把sting表示和子网解析为字节数组。为了测试IP是否匹配,我们确保每个字节位置都符合以下条件

(ip1[i] & mask[i]) == (ip2[i] & mask[i])

字节数组的长度可以是4(IPv4)或16(IPv6)。

对于IPv6,我们支持十六进制数字的上下两种情况,并支持省略每个段的尾随零。我们还将通过使用双冒号“:”例如:2001:0db8::ff00:0042:8329来支持后续包含零的segmens的te速记,在解析ipv6时,我们将ips和掩码的每个段都写为无符号的short,这两种格式都适用于big endian和little endian内存表示。

设置 ms_enable_modes 将直接在mscgisetmode中实现(在mapservutil.c中)。实现将显式调用当前msowsparseRequestMetadata函数:

if (mapserv->Mode >= 0)
{
  int disabled = MS_FALSE;
  const char* enable_modes = msLookupHashTable(&mapserv->map->web.metadata, "ms_enable_modes");

  if (!msOWSParseRequestMetadata(enable_modes, mode, &disabled) && disabled) {
    /* the current mode is disabled */
    msSetError(MS_WEBERR, "The specified mode '%s' is not supported by the current map configuration", "msCGISetMode()", mode);
    return MS_FAILURE;
  }
}

5。受影响的文件

  • mapows.c:实现并调用msowsipdisabled、msowsipinmetadata、msowsipinlist、msowsipparse方法

  • mapservutil.c:实现和 ms_enable_modes 逻辑

6。臭虫识别码

https://github.com/MapServer/MapServer/issues/4588

7。向后兼容性问题

不需要,新功能。

8.文档

在本增补的范围内,我们还将更新以下文件:

  • SOS Server :添加 sos_allowed_ip_listsos_denied_ip_list

  • WCS Server :添加 wcs_allowed_ip_listwcs_denied_ip_list

  • WFS Server :添加 wfs_allowed_ip_listwfs_denied_ip_list

  • WMS Server :添加 wms_allowed_ip_listwms_denied_ip_list

  • MapFile/WEB :添加 ms_enable_modes 在Web元数据部分

9。赞助

在Regione Toscana-Settore Sistema Informativo Territoriale ed Ambientale的资助下为Faunalia开发(http://www.faunalia.it)。项目:“Sviluppo Instrumenti Software per il Trattamento di Dati geografici basati su quantumgis e postgis(CIG 0494241492)”。

10。投票历史

托马斯·邦福特-0汤姆·克莱迪斯+1丹尼尔·莫里塞特+1塔玛斯·齐克雷斯+1斯蒂芬·伍德布里奇+1