安全過濾器
安全過濾器主要(yào / yāo)分兩部分内容:
密鑰協商:通信開始前首先通過一(yī / yì /yí)次非對稱加密協商出(chū)對稱加密的(de)密鑰,之(zhī)後每次通信使用協商後的(de)對稱加密的(de)密鑰進行加密。
安全防護:主要(yào / yāo)是(shì)通過對報文進行安全驗證達到(dào)防止SQL注入,跨站攻擊、重放攻擊和(hé / huò)CC攻擊的(de)目的(de)
秘鑰交換場景說(shuō)明:
国際版本:
国際版密鑰交換采用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: '您的(de)登錄會話超時(shí)或該用戶已經在(zài)别的(de)設備上(shàng)登錄了(le/liǎo),請重新登錄!'
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: '您的(de)登錄會話超時(shí)或該用戶已經在(zài)别的(de)設備上(shàng)登錄了(le/liǎo),請重新登錄!'
inbound: true
sessionServiceType: myDbSessionService
sort: 4
datasourceId: sessionDB
備注:秘鑰協商過程,是(shì)基于(yú)登錄接口之(zhī)上(shàng)完成的(de)操作,隻有當登錄成功,才會進行秘鑰協商的(de)過程,
登錄接口配置及要(yào / yāo)求:
urlLoginMatcher:指定登錄接口,并支持正則表示
validateLoginMatches:指定返回結果成功的(de)匹配規則,如上(shàng)配置['${resultCode} -> AAAAAA']:隻有當返回結果當中包含resultCode字段,并且返回結果爲(wéi / wèi)"AAAAAA時(shí)",判定登錄成功,否則,判定登錄失敗
refuseResponseMessage:登錄失敗提示信息,當判定登錄失敗時(shí),錯誤提示信息
秘鑰協商過程:當登錄成功之(zhī)後,進行秘鑰協商,此時(shí),對登錄成功之(zhī)後的(de)返回結果當中,同時(shí)需要(yào / yāo)包含指定的(de)字段ckey,即秘鑰協商字段,其爲(wéi / wèi)客戶端登錄接口中請求字段,登錄服務處理登錄成功之(zhī)後,隻需将此字段返回網關即可
安全防護配置說(shuō)明:
#接入渠道(dào)
inbound_channel:
values:
#2、json渠道(dào)
- 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
# 當啓用安全過濾規則時(shí),如防重放,xss時(shí) 打開ffprePackerFilter和(hé / huò)postParseInboundFilter,配合使用
prePackerFilters: ffPrePackerFilter
name: JSONServiceInbound_channel
started: true
#接出(chū)渠道(dào)
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: '您的(de)登錄會話超時(shí)或該用戶已經在(zài)别的(de)設備上(shàng)登錄了(le/liǎo),請重新登錄!'
inbound: true
localRecognizers:
- id: a
type: url
keyMap:
projectName: ${path(/,?,&)[0]}
serviceName: ${path(/,?,&)[2]}
sessionServiceType: myDbSessionService
sort: 4
datasourceId: sessionDB
跨站防護說(shuō)明
跨站防護實現了(le/liǎo)輸入特殊字符的(de)過濾以(yǐ)及輸出(chū)特殊字符的(de)編碼,不(bù)同交易可以(yǐ)配置不(bù)同的(de)防護規則,框架還針對輸入過濾提供字段白名單,配置好後該字段不(bù)需要(yào / yāo)進行輸入過濾。
SQL注入防護說(shuō)明
防注入過濾濾器通過對傳入報文進行安全驗證達到(dào)防止SQL注入攻擊的(de)目的(de)
重放防護說(shuō)明
會話建立後由服務端生成一(yī / yì /yí)個(gè)帶自增屬性的(de)token串,通過setCookie方式寫回客戶端,每次客戶端請求會随cookie默認上(shàng)送該token串。服務端在(zài)會話期内維護一(yī / yì /yí)份token串與交易ID的(de)映射關系表,收到(dào)客戶端請求後會将上(shàng)送的(de)token串與該交易本地(dì / de)存儲的(de)token串做比較,隻有新收到(dào)的(de)token串大(dà)于(yú)本地(dì / de)存儲的(de)token串時(shí),交易可通過,否則認爲(wéi / wèi)是(shì)重放交易。檢查通過後更新該交易的(de)token串并生成新token寫回客戶端,會話建立後由服務端生成一(yī / yì /yí)個(gè)帶自增屬性的(de)token串,通過setCookie方式寫回客戶端,每次客戶端請求會随cookie默認上(shàng)送該token串。服務端在(zài)會話期内維護一(yī / yì /yí)份token串與交易ID的(de)映射關系表,收到(dào)客戶端請求後會将上(shàng)送的(de)token串與該交易本地(dì / de)存儲的(de)token串做比較,隻有新收到(dào)的(de)token串大(dà)于(yú)本地(dì / de)存儲的(de)token串時(shí),交易可通過,否則認爲(wéi / wèi)是(shì)重放交易。檢查通過後更新該交易的(de)token串并生成新token寫回客戶端
CC攻擊防護說(shuō)明
從Session、IP、手機号和(hé / huò)客戶号等維度,每個(gè)維度又從相鄰兩次請求的(de)時(shí)間間隔和(hé / huò)單位時(shí)間内的(de)請求次數兩個(gè)維度對外界惡意請求進行防護
輸入輸出(chū)防護
主要(yào / yāo)實現了(le/liǎo)對交易的(de)入參出(chū)參的(de)過濾,使得入參出(chū)參的(de)key和(hé / huò)value都符合預定的(de)格式,降低安全風險。同時(shí)對于(yú)敏感信息的(de)輸出(chū),框架提供7中默認的(de)脫敏方式,包括中文姓名、身份證号、固定電話、手機号碼、地(dì / de)址、電子(zǐ)郵箱、銀行卡号等信息脫敏,應用系統可以(yǐ)對脫敏方式做擴展