安全过滤器
安全过滤器主要分两部分内容:
密钥协商:通信开始前首先通过一次非对称加密协商出对称加密的密钥,之后每次通信使用协商后的对称加密的密钥进行加密。
安全防护:主要是通过对报文进行安全验证达到防止SQL注入,跨站攻击、重放攻击和CC攻击的目的
秘钥交换场景说明:
国际版本:
国际版密钥交换采用RSA进行密钥交换操作,正常通信请求采用AES对称加密对报文进行加解密
session:
values:
- id: session1
type: default
requestUrlExpress: null
urlLoginMatcher: '*loginService'
urlLogoutMatcher: '*logoutService'
sessionType: default
validateLoginMatches: ['${resultCode} -> AAAAAA']
validateLogoutMatches: ['${reply.returnCode.type} -> S']
#国际版密钥交换filter
sessionOperationPreFilter: [sessionCreatePreFilter]
#国际版AES解密filter
sessionValidatePostFilters: [sessionValidatePostFilter,cmbcSessionPostDecryptFilter]
sessionLogoutPreFilters: [sessionLogoutPreFilter]
refuseResponseCode: 'msa.filter.warn.unlogin'
refuseResponseMessage: '您的登录会话超时或该用户已经在别的设备上登录了,请重新登录!'
inbound: true
sessionServiceType: myDbSessionService
sort: 4
datasourceId: sessionDB
国密版本:
国密版密钥交换采用SM2进行密钥交换操作,正常通信请求采用SM4对称加密对报文进行加解密 配置事例
session:
values:
- id: session1
type: default
requestUrlExpress: null
urlLoginMatcher: '*loginService'
urlLogoutMatcher: '*logoutService'
sessionType: default
validateLoginMatches: ['${resultCode} -> AAAAAA']
validateLogoutMatches: ['${reply.returnCode.type} -> S']
#国密版密钥交换filter
sessionOperationPreFilter: [sessionCreateGMPreFilter]
#国密版AES解密filter
sessionValidatePostFilters: [sessionValidatePostFilter,cmbcSessionPostGMDecryptFilter]
sessionLogoutPreFilters: [sessionLogoutPreFilter]
refuseResponseCode: 'msa.filter.warn.unlogin'
refuseResponseMessage: '您的登录会话超时或该用户已经在别的设备上登录了,请重新登录!'
inbound: true
sessionServiceType: myDbSessionService
sort: 4
datasourceId: sessionDB
备注:秘钥协商过程,是基于登录接口之上完成的操作,只有当登录成功,才会进行秘钥协商的过程,
登录接口配置及要求:
urlLoginMatcher:指定登录接口,并支持正则表示
validateLoginMatches:指定返回结果成功的匹配规则,如上配置['${resultCode} -> AAAAAA']:只有当返回结果当中包含resultCode字段,并且返回结果为"AAAAAA时",判定登录成功,否则,判定登录失败
refuseResponseMessage:登录失败提示信息,当判定登录失败时,错误提示信息
秘钥协商过程:当登录成功之后,进行秘钥协商,此时,对登录成功之后的返回结果当中,同时需要包含指定的字段ckey,即秘钥协商字段,其为客户端登录接口中请求字段,登录服务处理登录成功之后,只需将此字段返回网关即可
安全防护配置说明:
#接入渠道
inbound_channel:
values:
#2、json渠道
- id: jsonInboundChannel
channelType: inbound
contentType: json
available: true
inMessagePool: {poolMode: SHARE, corePoolSize: 500, maximumPoolSize: 500, keepAliveTime: 60,
available: true }
outMessagePool: {poolMode: SHARE, corePoolSize: 500, maximumPoolSize: 500, keepAliveTime: 60,
available: true }
values:
- port: 9000
id: jsonChannel
started: true
type: netty
protocolType: http
contentType: json
# 当启用安全过滤规则时,如防重放,xss时 打开ffprePackerFilter和postParseInboundFilter,配合使用
prePackerFilters: ffPrePackerFilter
name: JSONServiceInbound_channel
started: true
#接出渠道
outbound_channel:
values:
- channelType: outbound
available: true
id: jsonChannel
values:
- id: ccc
protocolType: http
started: true
contentType: json
type: netty
uri: http://127.0.0.1:8080
name: aa
started: true
recognizer:
values:
- id: recognizer2
keyMap: { projectName: '${path(/,?,&)[0]}', protocolName: '${path(/,?,&)[1]}', serviceName: '${path(/,?,&)[2]}', pathService: '${path[2..]}'}
type: url
#路由
router:
defaultRouter: jsonChannel
available: true
pipeType: direct
inbound: true
id: mygateway
name: mygateway
started: true
session:
values:
- id: session1
type: default
requestUrlExpress: null
urlLoginMatcher: '*loginService'
urlLogoutMatcher: '*logoutService'
sessionType: default
validateLoginMatches: ['${resultCode} -> AAAAAA']
validateLogoutMatches: ['${reply.returnCode.type} -> S']
sessionOperationPreFilter: [sessionCreatePreFilter]
sessionValidatePostFilters: [sessionValidatePostFilter,postParseInboundFilter]
sessionLogoutPreFilters: [sessionLogoutPreFilter]
refuseResponseCode: 'msa.filter.warn.unlogin'
refuseResponseMessage: '您的登录会话超时或该用户已经在别的设备上登录了,请重新登录!'
inbound: true
localRecognizers:
- id: a
type: url
keyMap:
projectName: ${path(/,?,&)[0]}
serviceName: ${path(/,?,&)[2]}
sessionServiceType: myDbSessionService
sort: 4
datasourceId: sessionDB
跨站防护说明
跨站防护实现了输入特殊字符的过滤以及输出特殊字符的编码,不同交易可以配置不同的防护规则,框架还针对输入过滤提供字段白名单,配置好后该字段不需要进行输入过滤。
SQL注入防护说明
防注入过滤滤器通过对传入报文进行安全验证达到防止SQL注入攻击的目的
重放防护说明
会话建立后由服务端生成一个带自增属性的token串,通过setCookie方式写回客户端,每次客户端请求会随cookie默认上送该token串。服务端在会话期内维护一份token串与交易ID的映射关系表,收到客户端请求后会将上送的token串与该交易本地存储的token串做比较,只有新收到的token串大于本地存储的token串时,交易可通过,否则认为是重放交易。检查通过后更新该交易的token串并生成新token写回客户端,会话建立后由服务端生成一个带自增属性的token串,通过setCookie方式写回客户端,每次客户端请求会随cookie默认上送该token串。服务端在会话期内维护一份token串与交易ID的映射关系表,收到客户端请求后会将上送的token串与该交易本地存储的token串做比较,只有新收到的token串大于本地存储的token串时,交易可通过,否则认为是重放交易。检查通过后更新该交易的token串并生成新token写回客户端
CC攻击防护说明
从Session、IP、手机号和客户号等维度,每个维度又从相邻两次请求的时间间隔和单位时间内的请求次数两个维度对外界恶意请求进行防护
输入输出防护
主要实现了对交易的入参出参的过滤,使得入参出参的key和value都符合预定的格式,降低安全风险。同时对于敏感信息的输出,框架提供7中默认的脱敏方式,包括中文姓名、身份证号、固定电话、手机号码、地址、电子邮箱、银行卡号等信息脱敏,应用系统可以对脱敏方式做扩展