20 KiB
20 KiB
福建水务营收系统安全设计文档
文档信息
| 项目信息 | 详情 |
|---|---|
| 项目名称 | 福建水务营收系统 |
| 文档类型 | 安全设计文档 |
| 技术框架 | RuoYi-Vue-Pro + OpenGauss |
| 文档版本 | v1.0 |
| 编写日期 | 2024-12-19 |
| 文档状态 | ✅ 已完成 |
目录
一、安全设计概述
福建水务营收系统安全设计严格按照《网络安全等级保护基本要求》第三级标准,结合水务行业特点和国产化要求,构建全方位、多层次的安全防护体系。
1.1 安全目标
- 机密性:确保敏感数据不被未授权访问
- 完整性:防止数据被恶意篡改或损坏
- 可用性:保障系统7×24小时稳定运行
- 可审计性:完整记录系统操作审计轨迹
- 合规性:满足等保三级和行业监管要求
1.2 安全原则
- 纵深防御:多层安全防护,避免单点故障
- 最小权限:用户和应用仅具备必要的最小权限
- 默认安全:系统默认采用最严格的安全配置
- 持续监控:7×24小时安全监控和威胁检测
- 国产化优先:优先采用国产安全产品和技术
1.3 总体安全架构
二、等级保护三级安全设计
2.1 技术安全要求
2.1.1 安全通信网络
网络架构安全
- 网络边界部署防火墙,实现网络访问控制
- 重要网络设备和服务器前端部署网络入侵检测设备
- 网络分段部署,DMZ区、应用区、数据区物理隔离
- 关键网络设备提供双机热备功能
- 网络设备登录实现身份标识和鉴别
2.1.2 安全区域边界
区域边界防护
- 在网络边界部署防火墙设备,设置访问控制策略
- 在网络边界部署入侵检测设备,监控网络攻击行为
- 在应用层部署Web应用防火墙,防护Web应用攻击
- 对进出网络的数据流进行过滤和监控
- 建立网络访问控制策略,限制不必要的网络连接
2.1.3 安全计算环境
身份鉴别
- 实现基于角色的访问控制(RBAC)
- 支持基于属性的访问控制(ABAC)
- 实现最小权限原则
- 支持权限的动态调整和审批流程
2.2 管理安全要求
2.2.1 安全管理中心
- 建立安全管理中心,统一管理安全策略
- 配置安全管理员角色,负责安全策略制定
- 建立安全事件响应机制
- 定期进行安全评估和风险分析
2.2.2 安全管理制度
- 制定信息安全管理制度和操作规程
- 建立人员安全管理制度
- 制定系统建设管理制度
- 建立系统运维管理制度
三、OpenGauss数据库安全
3.1 数据库安全架构
3.2 国产密码算法应用
3.2.1 传输加密
-- 配置国密SSL连接
ALTER SYSTEM SET ssl = on;
ALTER SYSTEM SET ssl_ciphers = 'SM4-GCM-SM3:SM4-CCM-SM3';
ALTER SYSTEM SET ssl_cert_file = 'server-sm2.crt';
ALTER SYSTEM SET ssl_key_file = 'server-sm2.key';
3.2.2 透明数据加密
-- 启用TDE透明数据加密,使用SM4算法
CREATE KEY ENCRYPTION KEY water_biz_kek
WITH ALGORITHM = 'SM4-CTR', KEY_STORE = 'localkms';
-- 为敏感表启用加密
CREATE TABLE water_customer (
id SERIAL PRIMARY KEY,
customer_name VARCHAR(100) ENCRYPTED WITH (
COLUMN_ENCRYPTION_KEY = water_biz_kek,
ENCRYPTION_TYPE = DETERMINISTIC,
ALGORITHM = 'SM4-CTR'
),
id_card VARCHAR(18) ENCRYPTED WITH (
COLUMN_ENCRYPTION_KEY = water_biz_kek,
ENCRYPTION_TYPE = RANDOMIZED,
ALGORITHM = 'SM4-CTR'
)
);
3.3 行级安全策略
-- 创建多租户行级安全策略
CREATE ROW LEVEL SECURITY POLICY tenant_isolation_policy
ON water_customer
USING (tenant_id = current_setting('app.current_tenant_id')::bigint);
-- 启用行级安全
ALTER TABLE water_customer ENABLE ROW LEVEL SECURITY;
-- 创建数据访问角色
CREATE ROLE water_data_reader;
CREATE ROLE water_data_writer;
-- 配置列级权限
GRANT SELECT (id, customer_name, phone) ON water_customer TO water_data_reader;
GRANT ALL ON water_customer TO water_data_writer;
3.4 数据脱敏策略
-- 创建数据脱敏函数
CREATE OR REPLACE FUNCTION mask_phone(phone_num TEXT)
RETURNS TEXT AS $$
BEGIN
RETURN SUBSTRING(phone_num, 1, 3) || '****' || SUBSTRING(phone_num, 8, 4);
END;
$$ LANGUAGE plpgsql;
-- 创建脱敏视图
CREATE VIEW water_customer_masked AS
SELECT
id,
customer_name,
mask_phone(phone) as phone,
LEFT(id_card, 6) || '********' || RIGHT(id_card, 4) as id_card_masked
FROM water_customer;
-- 授权普通用户只能访问脱敏视图
GRANT SELECT ON water_customer_masked TO water_normal_user;
四、应用系统安全
4.1 Spring Security安全配置
4.1.1 认证配置
@Configuration
@EnableWebSecurity
@EnableMethodSecurity(prePostEnabled = true)
public class SecurityConfig {
@Bean
public PasswordEncoder passwordEncoder() {
// 使用国密SM3哈希算法
return new SM3PasswordEncoder();
}
@Bean
public JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter() {
return new JwtAuthenticationTokenFilter();
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
return http
// CSRF防护
.csrf(csrf -> csrf.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()))
// 请求授权
.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/login", "/api/register").permitAll()
.requestMatchers("/api/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
)
// JWT过滤器
.addFilterBefore(jwtAuthenticationTokenFilter(), UsernamePasswordAuthenticationFilter.class)
// 会话管理
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.build();
}
}
4.1.2 多因素认证
@Service
public class MFAService {
@Autowired
private SmsService smsService;
@Autowired
private RedisTemplate<String, String> redisTemplate;
public boolean sendSmsCode(String phone) {
String code = generateRandomCode();
String key = "mfa:sms:" + phone;
// 存储验证码,5分钟过期
redisTemplate.opsForValue().set(key, code, Duration.ofMinutes(5));
// 发送短信
return smsService.send(phone, "您的验证码是:" + code + ",5分钟内有效。");
}
public boolean verifySmsCode(String phone, String code) {
String key = "mfa:sms:" + phone;
String storedCode = redisTemplate.opsForValue().get(key);
if (storedCode != null && storedCode.equals(code)) {
redisTemplate.delete(key);
return true;
}
return false;
}
}
4.2 数据传输安全
4.2.1 HTTPS配置
server:
port: 8443
ssl:
enabled: true
key-store: classpath:keystore/server.p12
key-store-password: ${SSL_KEYSTORE_PASSWORD}
key-store-type: PKCS12
# 支持国密算法
ciphers: SM4-GCM-SM3,SM4-CCM-SM3,ECDHE-SM2-WITH-SM4-SM3
protocols: TLSv1.2,TLSv1.3
4.2.2 敏感数据加密
@Component
public class DataEncryptionService {
private final SM4Cipher sm4Cipher = new SM4Cipher();
public String encryptSensitiveData(String plaintext) {
try {
return sm4Cipher.encrypt(plaintext);
} catch (Exception e) {
throw new SecurityException("数据加密失败", e);
}
}
public String decryptSensitiveData(String ciphertext) {
try {
return sm4Cipher.decrypt(ciphertext);
} catch (Exception e) {
throw new SecurityException("数据解密失败", e);
}
}
}
4.3 接口安全防护
4.3.1 接口签名验证
@Component
public class ApiSignatureValidator {
public boolean validateSignature(HttpServletRequest request) {
String timestamp = request.getHeader("X-Timestamp");
String nonce = request.getHeader("X-Nonce");
String signature = request.getHeader("X-Signature");
String body = getRequestBody(request);
// 检查时间戳,防止重放攻击
if (isTimestampExpired(timestamp)) {
return false;
}
// 生成签名
String expectedSignature = generateSignature(timestamp, nonce, body);
// 验证签名
return signature.equals(expectedSignature);
}
private String generateSignature(String timestamp, String nonce, String body) {
String message = timestamp + nonce + body;
return SM3Utils.hash(message);
}
}
4.3.2 接口限流防护
@Component
public class RateLimitService {
@Autowired
private RedisTemplate<String, String> redisTemplate;
public boolean isAllowed(String key, int limit, Duration window) {
String redisKey = "rate_limit:" + key;
String current = redisTemplate.opsForValue().get(redisKey);
if (current == null) {
redisTemplate.opsForValue().set(redisKey, "1", window);
return true;
}
int count = Integer.parseInt(current);
if (count < limit) {
redisTemplate.opsForValue().increment(redisKey);
return true;
}
return false;
}
}
五、网络安全设计
5.1 网络拓扑安全
5.2 防火墙策略配置
5.2.1 边界防火墙策略
# 允许HTTPS访问
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 允许HTTP重定向到HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 禁止直接数据库访问
iptables -A INPUT -p tcp --dport 5432 -s ! 192.168.1.0/24 -j DROP
# 允许内网SSH管理
iptables -A INPUT -p tcp --dport 22 -s 192.168.100.0/24 -j ACCEPT
# 拒绝其他所有入站连接
iptables -A INPUT -j DROP
5.2.2 应用层防火墙策略
# 只允许来自DMZ区的连接
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
# 允许访问数据库
iptables -A OUTPUT -d 192.168.2.0/24 -p tcp --dport 5432 -j ACCEPT
# 允许访问Redis
iptables -A OUTPUT -d 192.168.2.0/24 -p tcp --dport 6379 -j ACCEPT
# 允许DNS查询
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
# 拒绝其他出站连接
iptables -A OUTPUT -j DROP
5.3 入侵检测与防护
5.3.1 IDS/IPS规则配置
# Suricata规则示例
alert tcp any any -> $HOME_NET 443 (msg:"Suspicious HTTPS traffic"; \
content:"POST"; http_method; content:"/api/admin"; http_uri; \
threshold:type limit, track by_src, count 10, seconds 60; \
sid:10001; rev:1;)
alert tcp any any -> $HOME_NET 5432 (msg:"Direct database access attempt"; \
content:"SELECT"; content:"FROM"; distance:0; \
sid:10002; rev:1;)
alert tcp any any -> $HOME_NET any (msg:"Brute force attack detected"; \
flags:S; threshold:type threshold, track by_src, count 100, seconds 60; \
sid:10003; rev:1;)
六、数据安全设计
6.1 数据分类分级
6.1.1 数据分类标准
6.1.2 数据保护策略
-- 客户敏感信息表(机密级)
CREATE TABLE water_customer_sensitive (
id SERIAL PRIMARY KEY,
customer_id BIGINT NOT NULL,
-- 身份证号:强加密存储
id_card_encrypted VARCHAR(200) ENCRYPTED WITH (
COLUMN_ENCRYPTION_KEY = customer_sensitive_key,
ENCRYPTION_TYPE = RANDOMIZED,
ALGORITHM = 'SM4-CTR'
),
-- 银行卡号:强加密存储
bank_account_encrypted VARCHAR(200) ENCRYPTED WITH (
COLUMN_ENCRYPTION_KEY = customer_sensitive_key,
ENCRYPTION_TYPE = RANDOMIZED,
ALGORITHM = 'SM4-CTR'
),
-- 手机号:确定性加密,支持查询
phone_encrypted VARCHAR(200) ENCRYPTED WITH (
COLUMN_ENCRYPTION_KEY = customer_sensitive_key,
ENCRYPTION_TYPE = DETERMINISTIC,
ALGORITHM = 'SM4-CTR'
),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 创建行级安全策略
CREATE POLICY customer_sensitive_policy ON water_customer_sensitive
FOR ALL TO water_customer_service_role
USING (
customer_id IN (
SELECT customer_id FROM water_customer
WHERE tenant_id = current_setting('app.current_tenant_id')::bigint
)
);
6.2 数据备份与恢复安全
6.2.1 备份加密策略
#!/bin/bash
# OpenGauss安全备份脚本
# 设置备份参数
BACKUP_DIR="/backup/opengauss"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="water_biz_backup_${DATE}.tar.gz"
ENCRYPT_KEY="/etc/opengauss/backup_key.key"
# 创建加密备份
gs_backup -D $GAUSSDATA -U gaussdb \
--encrypt --encrypt-key-file=$ENCRYPT_KEY \
--backup-format=tar \
--backup-path=$BACKUP_DIR/$BACKUP_FILE
# 验证备份完整性
openssl dgst -sm3 $BACKUP_DIR/$BACKUP_FILE > $BACKUP_DIR/$BACKUP_FILE.sm3
# 安全传输到异地备份中心
rsync -avz --delete $BACKUP_DIR/ backup-server:/backup/remote/
6.2.2 数据恢复流程
-- 恢复前验证备份完整性
-- 1. 验证SM3摘要
-- 2. 解密备份文件
-- 3. 验证数据库结构
-- 4. 执行恢复操作
-- 创建恢复测试环境
CREATE DATABASE water_biz_recovery_test;
-- 恢复数据到测试环境
\c water_biz_recovery_test;
-- 执行恢复SQL脚本
\i /backup/water_biz_recovery.sql;
-- 验证数据完整性
SELECT COUNT(*) FROM water_customer;
SELECT COUNT(*) FROM water_meter_reading;
SELECT COUNT(*) FROM water_billing;
-- 验证加密数据
SELECT id,
pgp_sym_decrypt(id_card_encrypted, 'encryption_key') as id_card
FROM water_customer_sensitive LIMIT 1;
6.3 数据销毁与清理
6.3.1 安全数据销毁
-- 创建安全数据销毁函数
CREATE OR REPLACE FUNCTION secure_data_destroy(table_name TEXT, where_clause TEXT)
RETURNS BOOLEAN AS $$
DECLARE
sql_cmd TEXT;
affected_rows INTEGER;
BEGIN
-- 构建删除SQL
sql_cmd := 'DELETE FROM ' || table_name || ' WHERE ' || where_clause;
-- 执行删除
EXECUTE sql_cmd;
GET DIAGNOSTICS affected_rows = ROW_COUNT;
-- 记录审计日志
INSERT INTO data_destroy_audit (
table_name, where_clause, affected_rows,
operator, operation_time
) VALUES (
table_name, where_clause, affected_rows,
current_user, current_timestamp
);
-- 执行VACUUM清理物理空间
EXECUTE 'VACUUM FULL ' || table_name;
RETURN TRUE;
EXCEPTION
WHEN OTHERS THEN
RAISE EXCEPTION '数据销毁失败: %', SQLERRM;
RETURN FALSE;
END;
$$ LANGUAGE plpgsql;
-- 示例:销毁3年前的历史数据
SELECT secure_data_destroy(
'water_meter_reading_history',
'reading_date < CURRENT_DATE - INTERVAL ''3 years'''
);
七、运维安全设计
7.1 安全监控体系
7.1.1 安全监控架构
7.1.2 安全事件检测规则
# 安全事件检测规则配置
security_rules:
- name: "暴力破解检测"
type: "authentication"
condition: "failed_login_count > 5 in 5 minutes"
severity: "high"
action: ["block_ip", "send_alert"]
- name: "异常数据访问"
type: "data_access"
condition: "query_count > 1000 in 1 minute"
severity: "medium"
action: ["rate_limit", "send_alert"]
- name: "权限提升检测"
type: "privilege_escalation"
condition: "role_change to admin"
severity: "critical"
action: ["block_user", "send_alert", "create_incident"]
- name: "异常时间访问"
type: "abnormal_access"
condition: "access_time between 22:00 and 06:00"
severity: "medium"
action: ["log_event", "send_alert"]
7.2 漏洞管理
7.2.1 漏洞扫描策略
#!/bin/bash
# 系统漏洞扫描脚本
# 扫描操作系统漏洞
nmap -sV --script vulners localhost
# 扫描Web应用漏洞
nikto -h https://water.example.com -ssl
# 扫描数据库漏洞
nmap -p 5432 --script pgsql-brute,pgsql-databases localhost
# 生成漏洞报告
cat > vulnerability_report.html << EOF
<!DOCTYPE html>
<html>
<head>
<title>安全漏洞扫描报告</title>
</head>
<body>
<h1>福建水务营收系统漏洞扫描报告</h1>
<p>扫描时间:$(date)</p>
<h2>高危漏洞</h2>
<pre>$(grep -i "high\|critical" scan_results.txt)</pre>
<h2>中危漏洞</h2>
<pre>$(grep -i "medium" scan_results.txt)</pre>
</body>
</html>
EOF
7.2.2 补丁管理流程
7.3 应急响应预案
7.3.1 安全事件分级
| 级别 | 描述 | 响应时间 | 处理措施 |
|---|---|---|---|
| P0 | 系统完全不可用,数据泄露 | 15分钟 | 立即启动应急预案,通知管理层 |
| P1 | 核心功能受影响,安全风险高 | 30分钟 | 启动应急预案,组建应急小组 |
| P2 | 部分功能受影响,安全风险中等 | 2小时 | 安排专人处理,定期汇报 |
| P3 | 轻微影响,安全风险较低 | 8小时 | 正常工作时间处理 |
7.3.2 应急响应流程
八、安全管理制度
8.1 安全组织架构
8.1.1 安全管理组织
8.2 安全管理制度
8.2.1 人员安全管理
- 入职安全审查:对关键岗位人员进行背景调查
- 安全培训:定期进行信息安全意识培训
- 权限管理:建立权限申请、审批、回收流程
- 离职管理:离职人员权限及时回收,签署保密协议
8.2.2 系统建设安全管理
- 安全需求分析:项目立项阶段进行安全需求分析
- 安全设计评审:设计阶段进行安全架构评审
- 安全测试:上线前进行安全渗透测试
- 安全验收:系统上线前进行安全验收
8.2.3 系统运维安全管理
- 变更管理:所有系统变更都需要安全评估
- 备份管理:定期备份,异地存储,加密保护
- 监控管理:7×24小时安全监控
- 应急管理:建立应急响应机制
8.3 合规管理
8.3.1 法律法规合规
- 《中华人民共和国网络安全法》
- 《中华人民共和国数据安全法》
- 《中华人民共和国个人信息保护法》
- 《关键信息基础设施安全保护条例》
8.3.2 行业标准合规
- GB/T 22239-2019《信息安全技术 网络安全等级保护基本要求》
- GB/T 25070-2019《信息安全技术 网络安全等级保护安全设计技术要求》
- GB/T 32918《信息安全技术 SM2椭圆曲线公钥密码算法》
- GB/T 32905《信息安全技术 SM3密码杂凑算法》
8.3.3 合规检查清单
- 等级保护三级备案完成
- 年度安全评估报告
- 安全管理制度建立
- 安全技术措施落实
- 安全培训记录完整
- 应急预案演练记录
- 安全事件处置记录
- 第三方安全服务合同
总结
福建水务营收系统安全设计严格按照等级保护三级要求,结合OpenGauss数据库的安全特性,建立了全方位、多层次的安全防护体系。通过技术防护、管理制度、人员培训等多重措施,确保系统安全稳定运行,满足水务行业的安全合规要求。
本安全设计方案的核心特点:
- 国产化安全:采用OpenGauss数据库和国密算法
- 纵深防御:网络、应用、数据多层安全防护
- 合规导向:严格按照等保三级标准设计
- 持续改进:建立安全监控和应急响应机制









