GeoServer是一个用Java编写的开源软件服务器,允许用户共享和编辑地理空间数据。
为实现互操作性而设计,它使用开放标准发布来自任何主要空间数据源的数据。作为一个社区驱动的项目,geoserver由来自世界各地的不同个人和组织开发、测试和支持。
GeoServer于2001年由位于纽约的非盈利技术孵化器开放计划项目(Topp)启动。Topp正在创建一套工具,以实现开放的民主,并帮助使政府更加透明。其中第一个是 GeoServer ,它认识到,通过共享空间数据的能力,可以大大提高公民参与政府和城市规划的一套工具。
GeoServer 的创始人设想了一个地理空间网络,类似于万维网。通过万维网,人们可以搜索和下载文本。通过地理空间网络,人们可以搜索和下载空间数据。数据提供者可以直接将他们的数据发布到这个网站,用户可以直接访问它,而不是现在的间接和繁琐的数据共享方法。
GeoTools 项目,一个开源的GIS Java工具包。通过geotools,增加了对shapefiles、Oracle数据库、ArcSDE集成等的支持。
现在,geoserver可以从十几个空间数据源读取数据,并输出到许多不同的格式。现在,在其第二个十年中,GeoServer 正在继续其任务,使所有人都能更容易地访问空间数据。
一、实验环境
操作系统: CentOS7.5 Minimal
GeoServer服务器: 192.168.1.101
二、软件包准备
jre-8u212-linux-x64.tar.gz
https://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html
geoserver-2.14.2-bin.zip
https://versaweb.dl.sourceforge.net/project/geoserver/GeoServer/2.14.2/geoserver-2.14.2-bin.zip
jetty-distribution-9.2.13.v20150730.tar.gz
https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-distribution/9.2.13.v20150730/jetty-distribution-9.2.13.v20150730.tar.gz
三、在构建镜像的服务器
创建项目目录用户
# mkdir /root/GeoServer
# groupadd -g 2020 geoserver
# useradd -u 2020 -g geoserver geoserver
将 准备的软件包上传到 工作目录 /root/GeoServer
# ll /root/GeoServer
geoserver-2.14.2-bin.zip
jetty-distribution-9.2.13.v20150730.tar.gz
jre-8u212-linux-x64.tar.gz
# cd /root/GeoServer
# unzip geoserver-2.14.2-bin.zip
# tar -zxf jetty-distribution-9.2.13.v20150730.tar.gz
# mv geoserver-2.14.2 geoserver
从jetty解压包中拷贝ssl模块配置文件到geoserver目录
# cp jetty-distribution-9.2.13.v20150730/modules/ssl.mod geoserver/modules/
# ll geoserver/modules/
三、修改配置文件
# vim geoserver/modules/ssl.mod
注释或者删除标注的几行,此处配置重复,我们将在其他配置文件中配置。
# vim geoserver/etc/jetty-ssl.xml
将此配置文件中配置,修改为标注所示
#######################################################
#######################################################
① 禁用服务的SSL重协商机制
② 禁用不够安全算密码套件,只启用安全密码套件
③ 只启用TLSv1.2和 TLSv1.3 版本
# vim geoserver/start.ini
将此配置文件中配置,修改为标注所示:
① 禁用http模块
② 启用 https 和ssl 模块
四、重新生成证书文件
GeoServer默认的证书keysize为1024 强度不够,需要重新生成。
# keytool \
-genkeypair \
-keystore keystore \
-alias mykey \
-keypass keypwd \
-storepass storepwd \
-keyalg RSA \
-keysize 2048 \
-validity 3650 \
-dname "CN=Jetty Server,OU=Open Source Development,O=Mort Bay Consulting,L=Unknown,ST=Unknown,C=Unknown"
将新生成的证书拷贝到原证书目录覆盖
# mv keystore geoserver/etc/
这里我们只是更新了默认证书的的强度,没有更改 keypass(默认值为keypwd)和 storepass (默认值为storepwd)
如果要更新keypass和 storepass的值 :
# keytool \
-genkeypair \
-keystore keystore \
-alias mykey \
-keypass Keystore@1234567\
-storepass Keystore@7654321\
-keyalg RSA \
-keysize 2048 \
-validity 3650 \
-dname "CN=Jetty Server,OU=Open Source Development,O=Mort Bay Consulting,L=Unknown,ST=Unknown,C=Unknown"
同步更新配置文件 geoserver/etc/jetty-ssl.xml 中的keypass和storepass,并用GeoServer自带的混淆工具将其混淆。
① KeyStorePassword 对应 storepass
② KeyManagerPassword 对应 keypass
③ TrustStorePassword 对应 storepass
【jetty】关于jetty配置文件中证书密码的混淆和反混淆
https://www.jianshu.com/p/02b6225e96c3
# java -cp geoserver/lib/jetty-util-9.2.13.v20150730.jar org.eclipse.jetty.util.security.Password "Keystore@1234567"
# java -cp geoserver/lib/jetty-util-9.2.13.v20150730.jar org.eclipse.jetty.util.security.Password "Keystore@7654321"
五、GeoServer 安装包的目录文件权限加固
# vim geoserver/bin/startup.sh
设置进程启动的umask,使得服务器启动后生成服务目录文件权限的最小化。
##########################
# Set umask
umask 0077
##########################
删除windows bat脚本
# rm -rf geoserver/bin/*.bat
# find geoserver/ -type d -exec chmod 750 {} \;
# find geoserver/ -type f -exec chmod 640 {} \;
# chmod 550 geoserver/bin/*.sh
# chmod 700 geoserver/etc
# chmod 400 geoserver/etc/keystore
将整改好的geoserver 目录打包,用于下面docker镜像的构建
# tar -zcf geoserver-2.14.2-bin.tar.gz geoserver
六、构建GeoSever镜像
编写Dockerfile
# vim Dockerfile
#############################################################
FROM centos:centos7.5.1804
ADD jre-8u212-linux-x64.tar.gz /usr/local
ADD geoserver-2.14.2-bin.tar.gz /usr/local
ENV JAVA_HOME="/usr/local/jre1.8.0_212" \
PATH="$JAVA_HOEM/bin:$PATH" \
GEOSERVER_VERSION="2.14.2" \
GEOSERVER_HOME="/usr/local/geoserver" \
GEOSERVER_DATA_DIR="/usr/local/geoserver/data_dir"
RUN yum clean all && \
rpm --rebuilddb && \
yum -y install fontpackages-filesystem fontconfig xorg-x11-font-utils && \
groupadd -g 2020 geoserver && \
useradd -u 2020 -g geoserver geoserver && \
chown -R geoserver:geoserver /usr/local/geoserver
#ADD truetype.tar.gz /usr/share/fonts
#RUN cd /usr/share/fonts && \
# mkfontscale && \
# mkfontdir && \
# fc-cache
WORKDIR /home/geoserver
USER geoserver
EXPOSE 8443
CMD ["sh","/usr/local/geoserver/bin/startup.sh"]
#############################################################
① 如果有字体文件需要添加到镜像中,将 ttf字体文件放入 truetype 目录中,打包为 truetype.tar.gz
# docker build -f Dockerfile -t geoserver:2.14.2 .
# docker images
七、用构建的镜像启动一个容器测试
# mkdir -p /opt/geoserver/data_dir
# chown -R geoserver:geoserver /opt/geoserver/data_dir
# chmod 750 /opt/geoserver/data_dir
# docker run -it -d --name geoserver -v /opt/geoserver/data_dir:/usr/local/geoserver/data_dir -p 8443:8443 geoserver:2.14.2
# docker logs -f geoserver
浏览器访问测试:
https://192.168.1.101:8443/
https://192.168.1.101:8443/geoserver
默认WEB管理登录用户名密码:
admin/geoserver
八、安全加固效果验证
目录文件权限
宿主机目录文件权限
# ll /opt/geoserver/data_dir/
# ll /opt/geoserver/data_dir/styles/
容器目录文件权限
# docker exec -it geoserver ls -l /usr/local/geoserver
# docker exec -it geoserver ls -l /usr/local/geoserver/etc
查看进程所有者
# docker exec -it geoserver ps aux
查看自签名证书强度
# docker exec -it geoserver bash
$ /usr/local/jre1.8.0_212/bin/keytool -v -list --keystore /usr/local/geoserver/etc/keystore --storepass "storepwd"
查看服务端是否关闭重协商机制
# openssl s_client -connect 192.168.1.101:8443
查看服务端使用的密码套件
# echo > /dev/tcp/192.168.1.101/8443
# nmap -sV -p 8443 --script ssl* 192.168.1.101
查看服务端支持的TLS版本
# echo > /dev/tcp/192.168.1.101/8443
# openssl s_client -connect 192.168.1.101:8443
九、关于GeoSever安装包和服务启动后数据文件中涉及的明文密码
安装包文件
# cd /root/GeoServer
# grep -rin "password" geoserver/
# grep -rin "password" geoserver/
根据排查,我们可从如下文件中看到明文/混淆/摘要 密码字眼:
geoserver/data_dir/security/usergroup/default/users.xml
geoserver/etc/jdbcRealm.properties
geoserver/etc/jetty-ssl.xml
服务启动后数据文件
# ll /opt/geoserver/data_dir/
# grep -rin "password" /opt/geoserver/data_dir/
根据排查,我们可从如下文件中看到明文/混淆/摘要 密码字眼:
data_dir/security/masterpw.info
注:根据文本内容提示,这个文件在服务启动后可以删除
data_dir/security/usergroup/default/users.xml
注:这个用户名密码明文默认是 admin/geoserver,GeoServer 管理界面的默认登录用户名密码
十、关于对配置文件中几种密码明文加密方式的选择和处理
GeoServer用户手册:密码
密码是任何安全系统的核心。本节介绍GeoServer如何处理密码。
https://www.osgeo.cn/geoserver-user-manual/security/passwd.html#password-encryption
安装包文件
# cd /root/GeoServer
# grep -rin "password" geoserver/
根据排查,我们可从如下文件中看到明文/混淆/摘要 密码字眼:
geoserver/data_dir/security/usergroup/default/users.xml
此处,密码使用的是摘要式加密,不可逆,符合安全要求。
geoserver/etc/jdbcRealm.properties
This is a sample properties file for the org.eclipse.jetty.security.JDBCLoginService。
此文件为示例配置文件,可以清空或者删除:
# echo > geoserver/etc/jdbcRealm.properties
geoserver/etc/jetty-ssl.xml
此处关于 geoserver/etc/keystore 的 keypass 和 storepass,为混淆加密方式。
服务启动后数据文件
# ll /opt/geoserver/data_dir/
# grep -rin "password" /opt/geoserver/data_dir/
根据排查,我们可从如下文件中看到明文/混淆/摘要 密码字眼:
data_dir/security/masterpw.info
注:根据文本内容提示,这个文件在服务启动后将密码保存至别处,然后删除。
# rm -f data_dir/security/masterpw.info
data_dir/security/usergroup/default/users.xml
注:这个用户名密码明文默认是 admin/geoserver,GeoServer 管理界面的默认登录用户名密码
此处为不安全加密方式,我们在启动GeoServer后,需从界面上设置加密方式:
设置完成后,再查看 data_dir/security/usergroup/default/users.xml 文件中的加密方式:
此时,密码使用的是摘要式加密,不可逆,符合安全要求。
综上所述,关于GeoServer 配置文件中密码加密:
1. 配置文件中关于 keypass storepass 用混淆加密
2. 管理界面的用户名密码使用digest摘要加密,不可逆加密
3. 数据库连接或外部OGC服务(如 cascading WMS 和 cascading WFS ,因此geoserver必须能够解码加密的密码并将其传递给外部服务)需要选用 strong PEB ,可逆加密
十一、参考
【GeoServer】CentOS7.x上GeoServer的安装部署
https://www.jianshu.com/p/cfcee37bc71e
【GeoSerer】GeoServer安全加固
https://www.jianshu.com/p/24fa9c218e2e
【GeoServer】How to specify the TLS version and algorithm type of GeoServer?
https://www.jianshu.com/p/01661e8e2a5e
【HTTPS】SSL/TLS协议安全之:不安全的重协商
https://www.anquanke.com/post/id/82989
【jetty】关于jetty配置文件中证书密码的混淆和反混淆
https://www.jianshu.com/p/02b6225e96c3
【Geoserver】CentOS7 war包部署GeoServer
https://blog.csdn.net/junlong750/article/details/104183621
【GeoServer】GeoServer用户手册
https://www.osgeo.cn/geoserver-user-manual/index.html