




















GeoServer的安全系统基于Spring Security框架构建,提供了完整的身份认证和访问授权功能。安全架构的核心组件包括:
GeoServer安全系统由多个子系统组成:
认证子系统:
授权子系统:
GeoServer的安全配置存储在数据目录的security文件夹下:
security/
├── config.xml # 主安全配置
├── masterpw.info # 主密码信息
├── masterpw/ # 主密码配置
│ └── default/
├── auth/ # 认证配置
│ ├── default/ # 默认认证提供者
│ └── ...
├── filter/ # 过滤器配置
│ ├── default/
│ └── ...
├── role/ # 角色服务
│ └── default/
├── usergroup/ # 用户组服务
│ └── default/
├── layers.properties # 图层访问规则
├── services.properties # 服务访问规则
└── rest.properties # REST访问规则
默认情况下,GeoServer允许匿名访问某些公开服务。匿名用户被自动分配ROLE_ANONYMOUS角色。
配置匿名访问:
GeoServer安装后有以下默认配置:
默认用户:
| 用户名 | 默认密码 | 角色 |
|---|---|---|
| admin | geoserver | ADMIN |
预定义角色:
| 角色 | 说明 |
|---|---|
| ADMIN | 管理员,拥有所有权限 |
| GROUP_ADMIN | 组管理员 |
| ROLE_AUTHENTICATED | 已认证用户 |
| ROLE_ANONYMOUS | 匿名用户 |
通过Web界面:
通过REST API:
curl -u admin:geoserver -X POST \
-H "Content-Type: application/json" \
-d '{
"user": {
"userName": "testuser",
"password": "testpassword",
"enabled": true
}
}' \
http://localhost:8080/geoserver/rest/security/usergroup/users
通过Web界面:
用户组用于批量管理用户:
可以为用户设置自定义属性:
<user name="testuser" password="crypt1:...">
<property name="email">user@example.com</property>
<property name="organization">Example Inc</property>
</user>
服务访问规则控制用户对OGC服务的访问权限。规则存储在security/services.properties文件中。
规则格式:
<service>.<operation>=<role1>,<role2>,...
示例配置:
# 所有人可以访问WMS的GetCapabilities
wms.GetCapabilities=*
# 只有认证用户可以访问WMS的GetMap
wms.GetMap=ROLE_AUTHENTICATED
# 只有管理员可以使用WFS-T
wfs.Transaction=ADMIN
# 禁止所有人访问某操作
wms.GetFeatureInfo=
# 允许匿名和认证用户访问
wcs.*=ROLE_ANONYMOUS,ROLE_AUTHENTICATED
通过Web界面:
WMS操作:
WFS操作:
WCS操作:
GeoServer支持为每个工作区创建虚拟服务,可以单独配置访问规则:
# 工作区级别的服务规则
ws1.wms.GetMap=ROLE_USER1
ws2.wms.GetMap=ROLE_USER2
图层访问规则控制用户对特定图层的访问权限。规则存储在security/layers.properties文件中。
规则格式:
<workspace>.<layer>.<permission>=<role1>,<role2>,...
权限类型:
| 权限 | 说明 |
|---|---|
| r | 读取权限 |
| w | 写入权限 |
| a | 管理权限 |
示例配置:
# 所有人可读取topp工作区的所有图层
topp.*.r=*
# 只有认证用户可写入
topp.*.w=ROLE_AUTHENTICATED
# 特定图层只允许特定角色访问
sensitive.secret_data.r=ROLE_SECRET_ACCESS
# 禁止匿名用户访问某工作区
private.*.r=ROLE_AUTHENTICATED,ADMIN
通过Web界面:
当存在多个匹配规则时,GeoServer按以下顺序应用:
示例:
# 全局默认:所有人可读
*.*.r=*
# 工作区级别:private工作区需要认证
private.*.r=ROLE_AUTHENTICATED
# 图层级别:特定图层需要特殊角色
private.classified.r=ROLE_CLASSIFIED
控制REST API的访问权限,配置在security/rest.properties中:
# 只有管理员可以访问REST API
/**;GET,POST,PUT,DELETE=ADMIN
# 允许认证用户读取
/**;GET=ROLE_AUTHENTICATED
# 允许特定角色管理样式
/styles/**;GET,POST,PUT,DELETE=ROLE_STYLE_ADMIN
GeoServer使用过滤器链处理认证请求。不同的过滤器处理不同的认证方式:
| 过滤器 | 说明 |
|---|---|
| anonymous | 匿名访问 |
| basic | HTTP Basic认证 |
| form | 表单登录 |
| digest | HTTP Digest认证 |
| j2ee | J2EE容器认证 |
| x509 | 证书认证 |
HTTP Basic认证是最简单的认证方式,凭据通过Base64编码在请求头中传输:
curl -u username:password http://localhost:8080/geoserver/wms?...
启用Basic认证:
注意: Basic认证的凭据是明文传输的(仅Base64编码),应在HTTPS环境下使用。
Web管理界面默认使用表单认证:
配置表单认证:
<form>
<className>org.geoserver.security.filter.GeoServerFormAuthenticationFilter</className>
<usernameParameterName>username</usernameParameterName>
<passwordParameterName>password</passwordParameterName>
</form>
GeoServer支持与LDAP目录服务集成:
ldap://ldap.example.com:389dc=example,dc=comou=users(uid={0})ou=groupsLDAP配置示例:
<ldap>
<id>ldapAuthProvider</id>
<name>LDAP Auth Provider</name>
<className>org.geoserver.security.ldap.LDAPAuthenticationProvider</className>
<serverURL>ldap://ldap.example.com:389</serverURL>
<groupSearchBase>ou=groups</groupSearchBase>
<groupSearchFilter>(member={0})</groupSearchFilter>
<userDnPattern>uid={0},ou=users</userDnPattern>
</ldap>
GeoServer可以与CAS(Central Authentication Service)集成实现单点登录:
GeoServer支持OAuth2和OpenID Connect认证:
在生产环境中强烈建议使用HTTPS:
如果使用GeoServer内置的Jetty服务器:
keytool -genkey -alias geoserver -keyalg RSA \
-keystore keystore.jks -keysize 2048
etc/jetty.xml,添加HTTPS连接器:<Call name="addConnector">
<Arg>
<New class="org.eclipse.jetty.server.ssl.SslSelectChannelConnector">
<Arg>
<New class="org.eclipse.jetty.http.ssl.SslContextFactory">
<Set name="keyStore">etc/keystore.jks</Set>
<Set name="keyStorePassword">changeit</Set>
<Set name="keyManagerPassword">changeit</Set>
</New>
</Arg>
<Set name="port">8443</Set>
</New>
</Arg>
</Call>
conf/server.xml:<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="conf/keystore.jks"
certificateKeystorePassword="changeit"
type="RSA" />
</SSLHostConfig>
</Connector>
Let's Encrypt提供免费的SSL证书:
# 安装Certbot
sudo apt install certbot
# 获取证书
sudo certbot certonly --standalone -d geoserver.example.com
# 证书位于
/etc/letsencrypt/live/geoserver.example.com/fullchain.pem
/etc/letsencrypt/live/geoserver.example.com/privkey.pem
使用HTTPS后,需要更新GeoServer的代理基础URL:
https://geoserver.example.com/geoserver修改默认密码:
密码策略配置:
GeoServer使用主密码加密存储的敏感信息:
启用安全相关的日志记录:
日志配置示例:
<logger name="org.geoserver.security" level="INFO"/>
<logger name="org.springframework.security" level="WARN"/>
防火墙配置:
限制管理访问:
# 只允许特定IP访问管理界面
/web/**;GET,POST=ADMIN
/rest/**;GET,POST,PUT,DELETE=ADMIN
本章详细介绍了GeoServer的安全管理功能:
安全是任何生产系统的关键方面。正确配置GeoServer的安全设置,可以保护敏感数据和防止未授权访问。
在下一章中,我们将学习GeoServer的REST API,实现自动化管理和操作。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。