3.3.7. 运营决策

风控决策引擎是一堆风控规则的集合, 通过不同的分支, 层层规则的递进关系进行运算.而既然是组合的概念, 则在这些规则中, 以什么样的顺序与优先级执行便额外重要.

自有规则运行优先于外部规则

举例说明: 自有本地的黑名单库优先于外部的黑名单数据源运行, 如果触发自有本地的黑名单则风控结果可直接终止及输出“拒绝”结论.

策略调整以及优化

  • 前期可参考系统本身自带策略进行参考, 然后应用开启本地已有风控策略.
  • 后期不同的业务场景, 对应不同的策略以及规则, 具体优化需要风控运营人员后期持续跟进, 对现有策略进行优化调整, 以及新增相应规则.

回溯

  1. 可利用日志查询功能, 对某些疑问点进行批量数据查询以及导出, 随后进行相应的数据分析, 从而优化已有策略以及新增策略.

日志导出如下

23.运营决策.png

拉黑阻断机制

针对业务系统拉黑阻断,系统提供以下两种风险数据获取方法:

请求api方式获取风险

/checkRisk 风险检测接口, 业务方主动发起风险检测请求, 判定USER, IP, DID,ORDER ID是否有风险.

参数:
query: 需要查询的具体内容, 格式如下(需url编码):

  1. {
  2. "check_item": [
  3. {
  4. "k": "USER", //检测类型
  5. "v": "threathunter_test" //值
  6. },
  7. {
  8. "k": "USER",
  9. "v": "threathunter"
  10. }
  11. ],
  12. "full_respond": true, //获取全部有效事件
  13. "scene_type": "ORDER" //指定场景
  14. }

备注:

检测类型: IP , DEVICE ID, USER, ORDERID
场景: OTHER, VISITOR, ACCOUNT, MARKETING, ORDER, TRANSACTION

auth: 鉴权用,在nebula_websetting.py中配置:

示例:

  1. http://127.0.0.1:9001/checkRisk?auth=7a7c4182f1bef7504a1d3d5eaa51a242&query=%7b>"check_item"%3a%5b%7b"k"%3a"USER"%2c"v"%3a"threathunter_test"%7d%2c%7b"k"%3a"USER"%2c"v"%3a"threathunter"%7d%5d%2c"full_respond"%3atrue%2c"scene_type"%3a"ORDER"%7d

auth.png

直接读取redis获取数据

推荐方式:
采用redis的发布与订阅(publish/subscribe)模式,业务方订阅channel nebula.realtime.notice 获取实时通知即可

数据示例:

  1. {
  2. "remark": ">100, avg < 0.8, in 5m, web", //风险备注
  3. "geo_city": "深圳市", //市
  4. "checkpoints": "",
  5. "timestamp": 1552635533123, //触发时间
  6. "decision": "review", //风险决策,跟策略的配置有关
  7. "tip": "IP页面停留时间过短Web",
  8. "variable_values": "",
  9. "risk_score": 0, //风险分值
  10. "test": 0, //是否是测试策略
  11. "strategy_name": "IP页面停留时间过短Web", //触发策略名
  12. "expire": 1552635833123, //过期时间,跟策略的配置有关
  13. "key": "183.15.177.209", //风险值
  14. "scene_name": "VISITOR", //风险场景: `OTHER`, `VISITOR`, `ACCOUNT`, `MARKETING`, `ORDER`, `TRANSACTION`
  15. "uri_stem": "112.74.58.210/user", //关联页面
  16. "trigger_event": "{\"s_ip\": \"172.18.16.169\", \"app\": \"nebula\", \"pid\": \"000000000000000000000000\", \"s_type\": \"text/html; charset=utf-8\", \"uri_stem\": \"112.74.58.210/user\", \"c_bytes\": 0, \"id\": \"5c8b568c12a3650017e176e4\", \"uid\": \"\", \"request_time\": 3, \"platform\": \"\", \"s_body\": \"\", \"sid\": \"\", \"s_port\": 9001, \"method\": \"GET\", \"status\": 200, \"is_static\": false, \"geo_city\": \"\深\圳\市\", \"c_body\": \"\", \"timestamp\": 1552635532701, \"geo_province\": \"\广\东\省\", \"host\": \"112.74.58.210\", \"referer\": \"\", \"c_ip\": \"183.15.177.209\", \"key\": \"183.15.177.209\", \"useragent\": \"python-requests/2.11.1\", \"c_port\": 18311, \"xforward\": \"\", \"c_type\": \"\", \"name\": \"HTTP_DYNAMIC\", \"did\": \"\", \"s_bytes\": 648, \"request_type\": \"\", \"value\": 1.0, \"cookie\": \"group_id=2|1:0|10:1540368603|8:group_id|4:Mg==|30789028a7e8399f5f5ef115fc050e1b3424df25b966755be7554e0048dd29a4; user_id=2|1:0|10:1540368603|7:user_id|4:Mg==|141555b29c711f95ddebea3987820fb90c30a48f506eae9f8cee9b334372ae79; user=attack_test; auth=2|1:0|10:1540368603|4:auth|44:NGJlZTQwMDI0NTExYjM2NDVkNjkzOTM1ZTJmMDllMWY=|34718dcbcac603ee1a38daaa0a05fbafc524873af0fafb0013077a53a28b2d4b\", \"page\": \"112.74.58.210/user\", \"uri_query\": \"\", \"referer_hit\": \"F\"}", //触发事件
  17. "geo_province": "广东省", //省
  18. "check_type": "IP" //值类型, 如:` IP` , `DEVICE ID`, `USER`, `ORDERID`
  19. }

image

备用方法:
键名: {metrics.db.write}db.write.notice_*

数据过期时间: 30分钟

获取方法: 通过读取键名为{metrics.db.write}db.write.notice (zset, 通过时间戳排序) 中的数据db.write.notice_*, 与{metrics.db.write}进行拼接得到风险数据键名{metrics.db.write}db.write.notice_* (hash) , 然后获取键值即可获取单条风险数据.

示例:

redis.png

注意:
>

  • 这种方式获取的数据时效性极高, 但是得到的数据不是聚合数据.
  • 若当前没有风险数据, 上面提到数据键均有可能不存在.