06-安全管理与访问控制

第6章 安全管理与访问控制

6.1 GeoServer安全架构

6.1.1 安全架构概述

GeoServer的安全系统基于Spring Security框架构建,提供了完整的身份认证和访问授权功能。安全架构的核心组件包括:

  • 认证(Authentication):验证用户身份
  • 授权(Authorization):控制用户的访问权限
  • 数据安全:控制对特定数据的访问
  • 服务安全:控制对OGC服务的访问

6.1.2 安全子系统

GeoServer安全系统由多个子系统组成:

认证子系统:

  • 用户/组/角色服务:管理用户账户和角色
  • 认证提供者:验证用户凭据
  • 认证过滤器:处理不同的认证方式

授权子系统:

  • 服务访问规则:控制OGC服务访问
  • 数据访问规则:控制图层数据访问
  • REST访问规则:控制REST API访问

6.1.3 安全配置文件

GeoServer的安全配置存储在数据目录的security文件夹下:

security/
├── config.xml              # 主安全配置
├── masterpw.info          # 主密码信息
├── masterpw/              # 主密码配置
│   └── default/
├── auth/                  # 认证配置
│   ├── default/           # 默认认证提供者
│   └── ...
├── filter/                # 过滤器配置
│   ├── default/
│   └── ...
├── role/                  # 角色服务
│   └── default/
├── usergroup/             # 用户组服务
│   └── default/
├── layers.properties      # 图层访问规则
├── services.properties    # 服务访问规则
└── rest.properties        # REST访问规则

6.1.4 匿名访问

默认情况下,GeoServer允许匿名访问某些公开服务。匿名用户被自动分配ROLE_ANONYMOUS角色。

配置匿名访问:

  1. 进入"安全" > "认证"
  2. 在"认证过滤器"中配置"anonymous"过滤器
  3. 设置是否为匿名用户分配角色

6.2 用户和角色管理

6.2.1 默认用户和角色

GeoServer安装后有以下默认配置:

默认用户:

用户名 默认密码 角色
admin geoserver ADMIN

预定义角色:

角色 说明
ADMIN 管理员,拥有所有权限
GROUP_ADMIN 组管理员
ROLE_AUTHENTICATED 已认证用户
ROLE_ANONYMOUS 匿名用户

6.2.2 创建用户

通过Web界面:

  1. 进入"安全" > "用户、组、角色"
  2. 在"用户/组"标签页点击"添加新用户"
  3. 填写用户信息:
    • 用户名
    • 密码(需确认)
    • 是否启用
    • 所属组
    • 分配角色
  4. 点击"保存"

通过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

6.2.3 创建角色

通过Web界面:

  1. 进入"安全" > "用户、组、角色"
  2. 在"角色"标签页点击"添加新角色"
  3. 填写角色信息:
    • 角色名称(建议使用ROLE_前缀)
    • 父角色(可选,用于角色继承)
  4. 点击"保存"

6.2.4 用户组

用户组用于批量管理用户:

  1. 创建用户组
  2. 将用户添加到组
  3. 为组分配角色
  4. 组内所有用户继承组的角色

6.2.5 用户属性

可以为用户设置自定义属性:

<user name="testuser" password="crypt1:...">
  <property name="email">user@example.com</property>
  <property name="organization">Example Inc</property>
</user>

6.3 服务访问控制

6.3.1 服务访问规则

服务访问规则控制用户对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

6.3.2 配置服务规则

通过Web界面:

  1. 进入"安全" > "服务"
  2. 点击"添加新规则"
  3. 配置规则:
    • 服务类型(WMS、WFS、WCS等)
    • 操作(GetCapabilities、GetMap等)
    • 允许的角色
  4. 点击"保存"

6.3.3 服务操作列表

WMS操作:

  • GetCapabilities
  • GetMap
  • GetFeatureInfo
  • DescribeLayer
  • GetLegendGraphic

WFS操作:

  • GetCapabilities
  • DescribeFeatureType
  • GetFeature
  • GetPropertyValue
  • LockFeature
  • Transaction

WCS操作:

  • GetCapabilities
  • DescribeCoverage
  • GetCoverage

6.3.4 虚拟服务

GeoServer支持为每个工作区创建虚拟服务,可以单独配置访问规则:

# 工作区级别的服务规则
ws1.wms.GetMap=ROLE_USER1
ws2.wms.GetMap=ROLE_USER2

6.4 数据安全设置

6.4.1 图层访问规则

图层访问规则控制用户对特定图层的访问权限。规则存储在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

6.4.2 配置图层规则

通过Web界面:

  1. 进入"安全" > "数据"
  2. 选择"添加新规则"
  3. 配置规则:
    • 工作区(或*表示所有)
    • 图层(或*表示所有)
    • 访问模式(读/写/管理)
    • 允许的角色
  4. 点击"保存"

6.4.3 规则优先级

当存在多个匹配规则时,GeoServer按以下顺序应用:

  1. 具体图层规则 > 工作区通配符规则 > 全局通配符规则
  2. 同级别规则中,最严格的规则生效

示例:

# 全局默认:所有人可读
*.*.r=*

# 工作区级别:private工作区需要认证
private.*.r=ROLE_AUTHENTICATED

# 图层级别:特定图层需要特殊角色
private.classified.r=ROLE_CLASSIFIED

6.4.4 REST安全规则

控制REST API的访问权限,配置在security/rest.properties中:

# 只有管理员可以访问REST API
/**;GET,POST,PUT,DELETE=ADMIN

# 允许认证用户读取
/**;GET=ROLE_AUTHENTICATED

# 允许特定角色管理样式
/styles/**;GET,POST,PUT,DELETE=ROLE_STYLE_ADMIN

6.5 认证方式配置

6.5.1 认证过滤器链

GeoServer使用过滤器链处理认证请求。不同的过滤器处理不同的认证方式:

过滤器 说明
anonymous 匿名访问
basic HTTP Basic认证
form 表单登录
digest HTTP Digest认证
j2ee J2EE容器认证
x509 证书认证

6.5.2 HTTP Basic认证

HTTP Basic认证是最简单的认证方式,凭据通过Base64编码在请求头中传输:

curl -u username:password http://localhost:8080/geoserver/wms?...

启用Basic认证:

  1. 进入"安全" > "认证"
  2. 在"过滤器链"中确保"basic"过滤器已启用
  3. 配置应用到的URL模式

注意: Basic认证的凭据是明文传输的(仅Base64编码),应在HTTPS环境下使用。

6.5.3 表单认证

Web管理界面默认使用表单认证:

  1. 用户访问登录页面
  2. 输入用户名和密码
  3. 服务器验证后创建会话
  4. 后续请求通过会话Cookie识别用户

配置表单认证:

<form>
  <className>org.geoserver.security.filter.GeoServerFormAuthenticationFilter</className>
  <usernameParameterName>username</usernameParameterName>
  <passwordParameterName>password</passwordParameterName>
</form>

6.5.4 LDAP认证

GeoServer支持与LDAP目录服务集成:

  1. 进入"安全" > "用户、组、角色"
  2. 创建新的"LDAP"用户/组服务
  3. 配置LDAP连接参数:
    • 服务器URL:如ldap://ldap.example.com:389
    • 基础DN:如dc=example,dc=com
    • 用户搜索基础:如ou=users
    • 用户搜索过滤器:如(uid={0})
    • 组搜索基础:如ou=groups
  4. 创建LDAP认证提供者
  5. 将提供者添加到认证链

LDAP配置示例:

<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>

6.5.5 CAS单点登录

GeoServer可以与CAS(Central Authentication Service)集成实现单点登录:

  1. 安装CAS扩展
  2. 配置CAS服务器URL
  3. 配置GeoServer的服务URL
  4. 配置用户属性映射

6.5.6 OAuth2/OpenID Connect

GeoServer支持OAuth2和OpenID Connect认证:

  1. 安装OAuth2扩展
  2. 配置认证提供商(如Google、GitHub、Keycloak)
  3. 设置客户端ID和密钥
  4. 配置回调URL
  5. 配置用户属性映射

6.6 HTTPS配置

6.6.1 为什么需要HTTPS

在生产环境中强烈建议使用HTTPS:

  • 保护传输中的凭据
  • 防止中间人攻击
  • 符合安全合规要求
  • 提升用户信任

6.6.2 在Jetty中配置HTTPS

如果使用GeoServer内置的Jetty服务器:

  1. 生成SSL证书:
keytool -genkey -alias geoserver -keyalg RSA \
  -keystore keystore.jks -keysize 2048
  1. 编辑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>

6.6.3 在Tomcat中配置HTTPS

  1. 生成证书或使用CA签发的证书
  2. 编辑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>

6.6.4 使用Let's Encrypt证书

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

6.6.5 配置代理基础URL

使用HTTPS后,需要更新GeoServer的代理基础URL:

  1. 进入"设置" > "全局"
  2. 设置"代理基础URL"为https://geoserver.example.com/geoserver

6.7 安全最佳实践

6.7.1 密码安全

修改默认密码:

  • 首次部署后立即修改admin密码
  • 使用强密码(长度、复杂度)
  • 定期更换密码

密码策略配置:

  1. 进入"安全" > "密码"
  2. 配置密码策略:
    • 最小长度
    • 必须包含数字
    • 必须包含特殊字符
    • 密码历史(防止重复使用)

6.7.2 主密码管理

GeoServer使用主密码加密存储的敏感信息:

  1. 进入"安全" > "密码"
  2. 修改主密码
  3. 安全保存主密码(用于恢复)

6.7.3 最小权限原则

  • 为每个用户分配完成工作所需的最小权限
  • 使用角色而非直接为用户分配权限
  • 定期审计权限配置

6.7.4 日志审计

启用安全相关的日志记录:

  1. 配置日志级别记录认证事件
  2. 定期检查登录失败记录
  3. 监控异常访问模式

日志配置示例:

<logger name="org.geoserver.security" level="INFO"/>
<logger name="org.springframework.security" level="WARN"/>

6.7.5 网络安全

防火墙配置:

  • 只开放必要的端口(如443)
  • 限制管理接口的访问IP
  • 使用反向代理

限制管理访问:

# 只允许特定IP访问管理界面
/web/**;GET,POST=ADMIN
/rest/**;GET,POST,PUT,DELETE=ADMIN

6.7.6 定期更新

  • 及时更新GeoServer到最新版本
  • 关注安全公告
  • 定期进行安全评估

6.7.7 备份和恢复

  • 定期备份安全配置
  • 测试恢复流程
  • 保护备份文件

本章小结

本章详细介绍了GeoServer的安全管理功能:

  1. 安全架构:理解GeoServer安全系统的组成和工作原理
  2. 用户角色管理:学会创建和管理用户、组和角色
  3. 服务访问控制:掌握OGC服务的访问规则配置
  4. 数据安全:学会配置图层级别的访问控制
  5. 认证方式:了解各种认证方式的配置方法
  6. HTTPS配置:掌握SSL/TLS的配置步骤
  7. 安全最佳实践:了解生产环境的安全建议

安全是任何生产系统的关键方面。正确配置GeoServer的安全设置,可以保护敏感数据和防止未授权访问。

在下一章中,我们将学习GeoServer的REST API,实现自动化管理和操作。

思考与练习

  1. 创建一个新用户,并为其分配自定义角色。
  2. 配置一个工作区,使其只允许特定角色访问。
  3. 设置WFS-T只允许管理员使用。
  4. 配置HTTP Basic认证,并使用curl进行测试。
  5. 为GeoServer配置HTTPS,使用自签名证书。
  6. 设计一个多租户场景的安全方案,不同组织访问不同工作区。
posted @ 2025-11-29 13:41  我才是银古  阅读(2)  评论(0)    收藏  举报