安全过滤器

安全过滤器主要分两部分内容:

  • 密钥协商:通信开始前首先通过一次非对称加密协商出对称加密的密钥,之后每次通信使用协商后的对称加密的密钥进行加密。

  • 安全防护:主要是通过对报文进行安全验证达到防止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中默认的脱敏方式,包括中文姓名、身份证号、固定电话、手机号码、地址、电子邮箱、银行卡号等信息脱敏,应用系统可以对脱敏方式做扩展

Copyright © 民生科技有限公司 2019 all right reserved,powered by Gitbook联系方式: wanglihang@mskj.com
修订时间: 2019-08-02 16:19:33

results matching ""

    No results matching ""