geoserver

lishihuan大约 11 分钟

geoserver

下载:https://geoserver.org/release/2.21.x/open in new window

1. geoserver安装

http://geoserver.org/open in new window

本机安装记录

D:\Program Files\GeoServer\bin
admin/geoserver  Ahsbd@2022_222
http://localhost:18080/geoserver/web/

端口设置:D:\Program Files\GeoServer\start.ini

jetty.http.port=18080

2.Geoserver采用内置的GeoWebCache发布Arcgis切片

水经注下载的地图瓦片,发布wmts服务

参考;https://blog.csdn.net/GIS_fly/article/details/125018429open in new window

https://blog.csdn.net/weixin_42066016/article/details/125315174open in new window

2.1 需要用到 GeoWebCache 1.21.0。下载地址:https://sourceforge.net/projects/geowebcache/files/geowebcache/1.21.0/open in new window

geowebcache-1.22.0-war.zip

需要用到 这个war中的2个文件

  • geowebcache/WEB-INF/geowebcache-arcgiscache-context.xml --> 拷贝到geoserver/WEB-INF/lib/gs-gwc-2.12.0.jar/WEB-INF/里
  • gwc-arcgiscache-1.12.2.jar --> 放到 geoserver/WEB-INF/lib/目录下去

2.2 修改 gs-gwc-2.12.0.jar

使用 压缩软件打开可以直接修改,前提是Geoserver服务关闭了,否则是无法修改

修改过的 gs-gwc-2.21.1.jar --> 直接去替换 geoserver/WEB-INF/lib/

gwc-arcgiscache-1.12.2.jar --> geoserver/WEB-INF/lib/gwc-arcgiscache-1.12.2.jar

然后重启即可

修改 geoserver/WEB-INF/lib/gs-gwc-2.12.0.jar/WEB-INF/ 下的3个xml文件

  • geowebcache-servlet.xml 文件里面 增加 <import resource="geowebcache-arcgiscache-context.xml"/>

  • geowebcache-core-context.xml 文件里面增加

<bean id="gwcArcGISGridsetConfiguration" class="org.geowebcache.arcgis.layer.ArcGISCacheGridsetConfiguration"/>

注:核心是对 gs-gwc-2.12.0.jar 的修改

​ 新增:geowebcache-arcgiscache-context.xml

​ 修改:geowebcache-servlet.xml

​ geowebcache-core-context.xml

image-20221127225351078
image-20221127225351078

2.3准备arcgis切片数据

解压arcgisopen in new window切片包(test.tpk),作为切片数据。解压后test文件夹内容如下:

img
img

打开geoserver/data/gwc/geowebcache.xml文件,layers节点下添加arcgisLayer节点。

<arcgisLayer>
  <name>test</name>
  <tilingScheme>E:\\data\\arcgiscache\\cachedata\\test\\conf.xml</tilingScheme>
  <tileCachePath>E:\\data\\arcgiscache\\cachedata\\test\\_alllayers</tileCachePath>
  <hexZoom>false</hexZoom>
</arcgisLayer>

D:\ProgramData\GeoServer\gwc\geowebcache.xml

瓦片底图数据

<?xml version="1.0" encoding="utf-8"?>
<gwcConfiguration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://geowebcache.org/schema/1.8.0"
  xsi:schemaLocation="http://geowebcache.org/schema/1.8.0 http://geowebcache.org/schema/1.8.0/geowebcache.xsd">
  <version>1.8.0</version>
  <backendTimeout>120</backendTimeout>
 
  <gridSets>
   
  </gridSets>

  <layers>
	<arcgisLayer>
	  <name>ah16</name>
	  <tilingScheme>E:\\mapdownload\\ah16\\conf.xml</tilingScheme>
	  <tileCachePath>E:\\mapdownload\\ah16\\_alllayers</tileCachePath>
	  <hexZoom>false</hexZoom>
	</arcgisLayer>
	
	<arcgisLayer>
	  <name>ah16-2</name>
	  <tilingScheme>E:\\mapdownload\\ah16-2\\conf.xml</tilingScheme>
	  <tileCachePath>E:\\mapdownload\\ah16-2\\_alllayers</tileCachePath>
	  <hexZoom>false</hexZoom>
	</arcgisLayer>
  </layers>
  
</gwcConfiguration>

(2)重启tomcat服务(即重启geoserver),登录geoserver image-20221127230014251

2.4 访问服务

image-20221127225533388
image-20221127225557946
image-20221127225557946
image-20221127225625682
image-20221127225625682

天地图使用 wmts 案例

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
    <meta name="keywords" content="天地图"/>
    <title>天地图-地图API-范例-叠加其它WMS服务图层</title>
    <script type="text/javascript" src="http://api.tianditu.gov.cn/api?v=4.0&tk="></script>
    <style type="text/css">
        body, html {
            width: 100%;
            height: 100%;
            margin: 0;
            font-family: "Microsoft YaHei"
        }

        #mapDiv {
            width: 100%;
            height: 400px
        }

        input, b, p {
            margin-left: 15px;
            font-size: 14px
        }
    </style>
    <script type="text/javascript">
        var map;
        var zoom = 6;
        var wmsLayer;

        function onLoad() {
            // 初始化地图对象
            map = new T.Map("mapDiv");
            // 设置显示地图的中心点和级别
            map.centerAndZoom(new T.LngLat(116.40969, 39.89945), zoom);
            // 允许鼠标滚轮缩放地图
            map.enableScrollWheelZoom();

            // WMTS 图层 URL
            var imageURL = "http://localhost:18080/geoserver/gwc/service/wmts?" +
                "layer=lyq&style=&tilematrixset=EPSG:3857_lyq&Service=WMTS&Request=GetTile&Version=1.0.0&Format=image/png&TileMatrix=EPSG:3857_lyq:{z}" +
                "&TileRow={y}&TileCol={x}";

            // 创建自定义图层对象
            var lay = new T.TileLayer(imageURL, {minZoom: 1, maxZoom: 18});
            // 将图层增加到地图上
            map.addLayer(lay);
        }
    </script>
</head>
<body onLoad="onLoad()">
    <div id="mapDiv"></div>
</body>
</html>

3.geoserver+shp矢量数据的发布

参考:https://blog.csdn.net/guo45682/article/details/117792157open in new window

查询字符集:生成的shp文件通常会有一个后缀名.cpg文件,此文件记录着shp文件的编码格式,可用文本编辑器打开该文件查看

https://blog.csdn.net/qq_23856901/article/details/126499078open in new window

3.1 内容概述

通过geoserver对shp矢量数据进行发布,并使用wms服务进行数据浏览查看。

3.2 shp数据介绍

shape文件由ESRI开发,一个ESRI(Environmental Systems Research Institute)的shape文件包括一个主文件,一个索引文件,和一个dBASE表。其中主文件的后缀就是.shp。     一般来说,一个完成的shp矢量数据需要包含,xx.shp用于记录各要素的坐标信息,xx.dbf用于记录各要素的属性信息,xx.prj用于记录本文件的坐标系,xx.sbn和ss.sbx是空间索引文件,xx.shx是要素的几何特征的索引文件等数据,另外常见的还有xx.cpg文件,用于数据中文的解译文件。

3.3 发布数据

3.3.1 登录GeoServer ,添加数据

GeoService_发布shp服务

  • 点击 左侧数据—数据存储
  • 点击添加新的数据
  • 进入数据类型选择界面,在此界面需要选择正确的数据类型,本次主要是对shp矢量数据,因此点击Shapefile 这个选项。
image-20220920112413833
image-20220920112413833
image-20220920112516081
image-20220920112516081
image-20220920112846416
image-20220920112846416

3.3.2 选择数据源,配置数据参数及注意事项

3.3.3 选择数据源,配置数据参数及注意事项

4.QGIS安装

参考open in new window

官网下载open in new window

4.1 安装

下载 安装包 QGIS-OSGeo4W-xx.msi ,双击运行

安装完成后桌面点击 QGIS Desktop 3.26.3 打开服务

4.2 将QGIS界面设置为简体中文

菜单【Settings】->【Options…】打开Options对话框,选择【General】选项卡,找到“Override system locale”前面的复选框并打勾,在“User Interface Translation”下拉框中找到并选择“简体中文”,点击【OK】按钮。退出并重新启动QGIS,看到的即是简体中文界面。 image-20220920193150880

4.3 编辑shp 文件样式,同时获取sld文件

选择shp文件,然后双击图层管理中的对于图层,或者右击--> 属性,进入图层属性修改

通过QGIS 生成sld文件

image-20220920193502433
image-20220920193502433
image-20220920193642236
image-20220920193642236

geoservice 发布服务后修改style 可以通过QGIS获取 https://blog.csdn.net/huamh/article/details/109219301open in new window

  • sld 文件,用于设置geoservice发布的图层样式
image-20220920182632349
image-20220920182632349
<?xml version="1.0" encoding="UTF-8"?>
<StyledLayerDescriptor xmlns="http://www.opengis.net/sld" version="1.1.0" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:se="http://www.opengis.net/se" xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/StyledLayerDescriptor.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <NamedLayer>
    <se:Name>wqt_10_bingqu_2019_100</se:Name>
    <UserStyle>
      <se:Name>wqt_10_bingqu_2019_100</se:Name>
      <se:FeatureTypeStyle>
        <se:Rule>
          <se:Name>其他</se:Name>
          <se:Description>
            <se:Title>其他</se:Title>
          </se:Description>
          <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
            <ogc:PropertyIsEqualTo>
              <ogc:PropertyName>冰厚</ogc:PropertyName>
              <ogc:Literal>其他</ogc:Literal>
            </ogc:PropertyIsEqualTo>
          </ogc:Filter>
          <se:PolygonSymbolizer>
            <se:Fill>
              <se:SvgParameter name="fill">#e0dddd</se:SvgParameter>
              <se:SvgParameter name="fill-opacity">0.53</se:SvgParameter>
            </se:Fill>
            <se:Stroke>
              <se:SvgParameter name="stroke">#232323</se:SvgParameter>
              <se:SvgParameter name="stroke-width">1</se:SvgParameter>
              <se:SvgParameter name="stroke-linejoin">bevel</se:SvgParameter>
            </se:Stroke>
          </se:PolygonSymbolizer>
        </se:Rule>
        <se:Rule>
          <se:Name>0~5</se:Name>
          <se:Description>
            <se:Title>0~5</se:Title>
          </se:Description>
          <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
            <ogc:PropertyIsEqualTo>
              <ogc:PropertyName>冰厚</ogc:PropertyName>
              <ogc:Literal>0~5</ogc:Literal>
            </ogc:PropertyIsEqualTo>
          </ogc:Filter>
          <se:PolygonSymbolizer>
            <se:Fill>
              <se:SvgParameter name="fill">#e0dddd</se:SvgParameter>
            </se:Fill>
            <se:Stroke>
              <se:SvgParameter name="stroke">#232323</se:SvgParameter>
              <se:SvgParameter name="stroke-width">1</se:SvgParameter>
              <se:SvgParameter name="stroke-linejoin">bevel</se:SvgParameter>
            </se:Stroke>
          </se:PolygonSymbolizer>
        </se:Rule>
        <se:Rule>
          <se:Name>5~10</se:Name>
          <se:Description>
            <se:Title>5~10</se:Title>
          </se:Description>
          <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
            <ogc:PropertyIsEqualTo>
              <ogc:PropertyName>冰厚</ogc:PropertyName>
              <ogc:Literal>5~10</ogc:Literal>
            </ogc:PropertyIsEqualTo>
          </ogc:Filter>
          <se:PolygonSymbolizer>
            <se:Fill>
              <se:SvgParameter name="fill">#b4b4b4</se:SvgParameter>
            </se:Fill>
            <se:Stroke>
              <se:SvgParameter name="stroke">#232323</se:SvgParameter>
              <se:SvgParameter name="stroke-width">1</se:SvgParameter>
              <se:SvgParameter name="stroke-linejoin">bevel</se:SvgParameter>
            </se:Stroke>
          </se:PolygonSymbolizer>
        </se:Rule>
        <se:Rule>
          <se:Name>10~15</se:Name>
          <se:Description>
            <se:Title>10~15</se:Title>
          </se:Description>
          <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
            <ogc:PropertyIsEqualTo>
              <ogc:PropertyName>冰厚</ogc:PropertyName>
              <ogc:Literal>10~15</ogc:Literal>
            </ogc:PropertyIsEqualTo>
          </ogc:Filter>
          <se:PolygonSymbolizer>
            <se:Fill>
              <se:SvgParameter name="fill">#ffff00</se:SvgParameter>
            </se:Fill>
            <se:Stroke>
              <se:SvgParameter name="stroke">#232323</se:SvgParameter>
              <se:SvgParameter name="stroke-width">1</se:SvgParameter>
              <se:SvgParameter name="stroke-linejoin">bevel</se:SvgParameter>
            </se:Stroke>
          </se:PolygonSymbolizer>
        </se:Rule>
        <se:Rule>
          <se:Name>15~20</se:Name>
          <se:Description>
            <se:Title>15~20</se:Title>
          </se:Description>
          <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
            <ogc:PropertyIsEqualTo>
              <ogc:PropertyName>冰厚</ogc:PropertyName>
              <ogc:Literal>15~20</ogc:Literal>
            </ogc:PropertyIsEqualTo>
          </ogc:Filter>
          <se:PolygonSymbolizer>
            <se:Fill>
              <se:SvgParameter name="fill">#ff9696</se:SvgParameter>
            </se:Fill>
            <se:Stroke>
              <se:SvgParameter name="stroke">#232323</se:SvgParameter>
              <se:SvgParameter name="stroke-width">1</se:SvgParameter>
              <se:SvgParameter name="stroke-linejoin">bevel</se:SvgParameter>
            </se:Stroke>
          </se:PolygonSymbolizer>
        </se:Rule>
        <se:Rule>
          <se:Name>20~30</se:Name>
          <se:Description>
            <se:Title>20~30</se:Title>
          </se:Description>
          <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
            <ogc:PropertyIsEqualTo>
              <ogc:PropertyName>冰厚</ogc:PropertyName>
              <ogc:Literal>20~30</ogc:Literal>
            </ogc:PropertyIsEqualTo>
          </ogc:Filter>
          <se:PolygonSymbolizer>
            <se:Fill>
              <se:SvgParameter name="fill">#c800ff</se:SvgParameter>
            </se:Fill>
            <se:Stroke>
              <se:SvgParameter name="stroke">#232323</se:SvgParameter>
              <se:SvgParameter name="stroke-width">1</se:SvgParameter>
              <se:SvgParameter name="stroke-linejoin">bevel</se:SvgParameter>
            </se:Stroke>
          </se:PolygonSymbolizer>
        </se:Rule>
        <se:Rule>
          <se:Name>30~40</se:Name>
          <se:Description>
            <se:Title>30~40</se:Title>
          </se:Description>
          <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
            <ogc:PropertyIsEqualTo>
              <ogc:PropertyName>冰厚</ogc:PropertyName>
              <ogc:Literal>30~40</ogc:Literal>
            </ogc:PropertyIsEqualTo>
          </ogc:Filter>
          <se:PolygonSymbolizer>
            <se:Fill>
              <se:SvgParameter name="fill">#c86400</se:SvgParameter>
            </se:Fill>
            <se:Stroke>
              <se:SvgParameter name="stroke">#232323</se:SvgParameter>
              <se:SvgParameter name="stroke-width">1</se:SvgParameter>
              <se:SvgParameter name="stroke-linejoin">bevel</se:SvgParameter>
            </se:Stroke>
          </se:PolygonSymbolizer>
        </se:Rule>
        <se:Rule>
          <se:Name>40~50</se:Name>
          <se:Description>
            <se:Title>40~50</se:Title>
          </se:Description>
          <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
            <ogc:PropertyIsEqualTo>
              <ogc:PropertyName>冰厚</ogc:PropertyName>
              <ogc:Literal>40~50</ogc:Literal>
            </ogc:PropertyIsEqualTo>
          </ogc:Filter>
          <se:PolygonSymbolizer>
            <se:Fill>
              <se:SvgParameter name="fill">#00ff00</se:SvgParameter>
            </se:Fill>
            <se:Stroke>
              <se:SvgParameter name="stroke">#232323</se:SvgParameter>
              <se:SvgParameter name="stroke-width">1</se:SvgParameter>
              <se:SvgParameter name="stroke-linejoin">bevel</se:SvgParameter>
            </se:Stroke>
          </se:PolygonSymbolizer>
        </se:Rule>
        <se:Rule>
          <se:Name>>50</se:Name>
          <se:Description>
            <se:Title>>50</se:Title>
          </se:Description>
          <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
            <ogc:PropertyIsEqualTo>
              <ogc:PropertyName>冰厚</ogc:PropertyName>
              <ogc:Literal>>50</ogc:Literal>
            </ogc:PropertyIsEqualTo>
          </ogc:Filter>
          <se:PolygonSymbolizer>
            <se:Fill>
              <se:SvgParameter name="fill">#cb3a49</se:SvgParameter>
            </se:Fill>
            <se:Stroke>
              <se:SvgParameter name="stroke">#232323</se:SvgParameter>
              <se:SvgParameter name="stroke-width">1</se:SvgParameter>
              <se:SvgParameter name="stroke-linejoin">bevel</se:SvgParameter>
            </se:Stroke>
          </se:PolygonSymbolizer>
        </se:Rule>
      </se:FeatureTypeStyle>
    </UserStyle>
  </NamedLayer>
</StyledLayerDescriptor>

5. geoserver 被扫描漏洞的处理方案

最小化暴露 的一个非常有效的安全策略,可以减少攻击面并增强系统的安全性。通过 Nginx 进行反向代理,只转发指定 IP 的请求,限制其他 IP 访问,并且只允许 GET 请求,这些措施会显著降低安全风险。

方案:

  1. 防火墙和 IP 白名单:通过配置防火墙,仅允许特定 IP 地址(例如地图前端服务器)访问 GeoServer,其他所有请求都被拒绝。
  2. Nginx 反向代理:使用 Nginx 作为反向代理,将合法请求转发到 GeoServer,且仅暴露瓦片服务接口(/geoserver/gwc/service/wmts),不暴露其他管理接口。
  3. 限制 HTTP 方法:通过 Nginx 配置,确保只有 GET 请求被转发到 GeoServer,防止其他危险的 HTTP 方法(如 POSTDELETE)被滥用。

这种方案的可行性和优点分析

1. 防火墙和 IP 白名单

  • 优点:限制外部 IP 访问,只有特定服务器(如前端地图服务器)能够访问 GeoServer。这确保了只有信任的客户端可以请求地图瓦片服务。
  • 潜在问题:你需要确保防火墙配置没有误漏,也需要根据服务器变更(如负载均衡、云服务变更)定期更新白名单。

2. Nginx 反向代理

  • 优点
    • 转发控制:通过 Nginx,你可以灵活地配置哪些请求被转发到 GeoServer。例如,只转发 /geoserver/gwc/service/wmts 请求,其他请求(如管理接口、WMS、WFS 等)都不转发。
    • 负载均衡:如果将来需要通过多台 GeoServer 实例来分担负载,Nginx 可以轻松地实现负载均衡。
  • 潜在问题
    • 如果 Nginx 配置不当,可能会导致某些请求泄漏。需要确保只暴露瓦片服务相关路径,不让其他路径泄露。
    • Nginx 配置中需要特别注意 URI 路由,确保路径匹配正确,避免误转发。

3. 限制 HTTP 方法

  • 优点:只允许 GET 请求,这减少了潜在的 注入攻击恶意操作,因为 POSTDELETE 等方法通常用于修改数据或执行命令。

  • 配置建议:在 Nginx 中,配置如下:

    location /geoserver/gwc/service/wmts {
        limit_except GET {
            deny all;
        }
    }
    

    这条规则会确保只有 GET 请求能够访问瓦片服务,其他 HTTP 方法会被拒绝。

  • 潜在问题:如果瓦片服务本身需要 POST 或其他方法支持(通常不需要),那么需要相应调整配置。

4. HTTPS 加密通信

  • 优点:确保数据传输的安全性,防止中间人攻击(MITM)。

  • 配置建议:配置 Nginx 强制启用 HTTPS,确保数据传输过程中是加密的。

    server {
        listen 443 ssl;
        server_name example.com;
    
        ssl_certificate /path/to/cert.pem;
        ssl_certificate_key /path/to/key.pem;
    
        location /geoserver/gwc/service/wmts {
            proxy_pass http://localhost:8080;
            limit_except GET {
                deny all;
            }
        }
    }
    

5. 日志监控与安全警告

  • 优点:通过 Nginx 配置日志,可以实时监控 GeoServer 的访问情况。可以发现是否存在异常请求、潜在攻击等。
  • 建议:配置日志详细程度,并及时设置 报警机制,当请求数量急剧增加或出现不正常的访问模式时,能及时反应。

综合分析:

你提出的方案基本上符合 最小化暴露安全性强化 的最佳实践。只暴露 瓦片服务接口,通过防火墙、IP 白名单、Nginx 反向代理和 HTTP 方法限制,能有效防止不必要的安全风险,并且减少攻击面。

推荐的进一步增强措施:

  1. 定期审计和更新配置:定期检查和更新 防火墙规则Nginx 配置,并根据新的安全漏洞及时进行修复。
  2. 启用日志和监控:确保 Nginx 和 GeoServer 的访问日志启用,并将其与 监控系统(如 PrometheusELK Stack)集成,及时捕捉异常流量和请求。
  3. 定期更新组件:确保 GeoServer 和其依赖的 JettyNginx 等软件定期更新,以避免已知的漏洞被利用。

结论:

通过这种方式,你不仅能实现 最小化暴露,而且通过配置限制 HTTP 方法、控制访问、加密通信等方式增强了整体安全性。这种配置是合理的,只要确保 Nginx 配置正确,定期审计和更新,就能够有效地防范潜在的漏洞风险。