基础安全产品相关系统设计的一些思考

Posted 码头工人的一千零一夜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础安全产品相关系统设计的一些思考相关的知识,希望对你有一定的参考价值。

本篇文章会从系统架构设计的角度,分享在对业务安全相关基础安全产品进行系统设计时遇到的问题难点及其解决方案。 内容包括三部分:(1)风控业务架构;(2)基础安全产品的职责;(3)基础安全产品相关系统架构的设计要点。 文章会以总-分的形式进行阐述。懂的不多,做的太少。欢迎批评、指正。

原创文章,转载请标注。https://www.cnblogs.com/boycelee/p/17324600.html

背景

本篇文章会从系统架构设计的角度,分享在对业务安全相关基础安全产品进行系统设计时遇到的问题难点及其解决方案

内容包括三部分:(1)风控业务架构;(2)基础安全产品的职责;(3)基础安全产品相关系统架构的设计要点。

文章会以总-分的形式进行阐述。懂的不多,做的太少。欢迎批评、指正。

风控业务架构

我把风控业务架构的分层分为6层,分别是组件层、业务层、决策层、能力层、计算层、可视层。

以下基建基础安全产品的简称。

组件层

组件层的职责是:数据收集与行为反制

从接口、设备、行为三个维度进行数据收集,接收决策层的指令进行行为反制。为了保证数据的收集数据的可靠性,就衍生出了壳、混淆、反调试等加固策略。

更详细的思考在我的《风控安全产品的探索之路》这篇文章中,感兴趣可跳转阅读,这里就不再赘述。https://www.cnblogs.com/boycelee/p/15948323.html

业务层

业务层的职责是:风控数据透传与风控决策结果处理

将风控所需要的数据透传至决策层,业务层获取到决策层数据后,根据决策层结果选择执行风险反制或业务逻辑。

透传数据一般包括:风控数据和业务补充数据。

决策层

决策层的职责是:风控能力应用

决策层是整个风控业务的核心,将风控能力高效连接起来,有效、合理地应用能力层、计算层所具备的能力。这一层的难点在于工程而非安全领域,例如:如何设计调用链路(降低计算时长)、如何处理超高并发流量、如何保护下游风控内部系统等。

其中包括:风控参数预处理、风控能力应用(组件/名单/模型等)、风险决策(规则引擎)、反制决策(观测/登录/验证码/行为验证/封禁)。

能力层

能力层的职责是:识别基础安全风险

该层包括:设备指纹、环境检测、接口防护、验证码、IP风险、手机号风险、链路风险等。

能力层是风控系统的基石,它的能力决定了一个风控系统识别风险能力的下限。会从资源、接口、设备、链路、行为等维度进行系统性风险扫描。

计算层

能力层的职责是:补充风险识别能力

该层包括:数据引擎、规则引擎、风险名单、识别模型、风险预警。

计算层是对基础安全风险识别能力的补充,它的能力决定了一个风控系统识别风险能力的上限。从频率统计、策略规则、风险名单、模型识别、风险预警等维度对能力层进行能力补充。

可视层

可视层的职责是:提升运维效率

该层包括:运维报表、引擎配置、流量监控、事件追踪。

可视层能够在事前能够分析风险潜在风险,事中有效执行并降低配置错误概率,事后观察风控效果。满足运营策略调整与风险管理的需求。

因为目前主要深入了解与实践的是组件层和能力层的建设,所以文章后续会从基建(基础安全产品)的视角进行系统性总结。

基础安全组件

落地难点

  1. 接入场景多

    拉新激活、账号、反爬(多业务线)、交易(多业务线)、营销(多业务线)。

  2. 接入终端多

    ADR(多技术栈)、IOS(多技术栈)、WX(原生、非原生)、WEB、TOUCH。

  3. 接入组件多

​ 防护组件(指纹、环境检测、接口防护等)、验证码组件、登录组件等。

待解决问题

架构特性

在进行架构设计时,我会重点关注架构的这三大特性,分别是:安全性、易用性、稳定性

安全性

因为是安全组件,其识别能力和组件自身安全性是首先要保证的。

稳定性

组件会应用在各个场景,所以要尽可能降低由安全组件造成故障的概率。

易用性

尽可能降低业务接入的成本。

具体案例

以接口防护组件设计来举例。

问题分析

攻击场景

(以ip138查询网举例,不代表本人对该网站进行过攻击)

攻击还原

思路描述

请求离开容器后,通过抓包的方式,获取并解析数据,然后进行数据篡改、伪造鉴权,最后重新构造数据并发送请求。

攻击步骤

(1)抓包;(2)解析数据;(3)数据篡改;(4)伪造鉴权;(5)构造数据;(6)发送请求。

攻击步骤防御可行性分析

防止抓包

(1)抓包在应用外进行;

(2)除App,其他端防抓包基本不可防;

(3)防御性价比不高。

防止解析

解决方案是加密。

(1)入侵性较强、强依赖;

(2)加解密服务稳定性要求高;

(3)业务响应时长上升。

系统设计

系统架构

描述系统分层、职责、关系以及运行规则。

组件层

提供接口防护组件、验证组码件和登录组件。

透传层

通过数据共享或业务系统透传方式透传风控参数。

决策层

进行入参校验、版控、能力使用以及反制决策等。

能力层

提供接口检测能力等。

架构特性

安全性

关于安全性另一篇文章《业务安全相关安全产品的反思》中已经详细阐述,这篇文章就不过多赘述。https://www.cnblogs.com/boycelee/p/16223114.html

安全性的难点除了风险识别上的难点,还有就是面对多个终端(Android、iOS、小程序、PC、Touch),其底层逻辑完全不一样。我们如何总结出统一的设计思想(方法论)这样的类工程问题。

如防容器脱离,我总结的思想就是:上层与业务逻辑建立联系,中层多个组件间建立联系,下层与操作系统(WX容器、浏览器)建立联系。

稳定性

易用性

(1)组件化

关于前端组件的易用性,不能与业务过于耦合,需要根据业务特性进行适当地解耦。如果与业务系统过于耦合,首先是在对防护逻辑进行升级时势必会影响业务,就需要投入测试人力进行业务逻辑回归,其次是防护能力往其他场景迁移也会有代码重复冗余的问题。

(2)易用性提升

如何在组件化的前提下进行易用性提升?我坚持的原则是尽量在不入侵业务的前提下,降低接入成本

我的解决方案是,结合项目前端技术栈特点进行如下选择:

a)方式一:是否有统一的网络框架?

​ 如使用安卓原生技术开发苹果原生技术开发一般企业都有统一的网络框架进行网络出口管理,这时组件就可以从中找一个切面进行组件接入

b)方式二:是否有统一组件?

​ 如小程序(或Android Hybird等)没有封装统一的网络库,而是页面直接使用HTTP协议发送请求,但有统一的工具库,此时可以帮业务提前做好组件引入工 作,业务使用时 直接本地调用即可。这也可以一定程度地提升易用性。

c)方式三:是否可以引入三方组件?

​ 如网页端(WWW、TOUCH)提供好完整的风控.js文件,业务方使用时直接调用即可,虽然不如以上a、b两种方式更友好,但要强于代码拷贝的方案。

最后

软件工程没有银弹,逆向工程永远胜利。

懂的不多,做的太少。欢迎批评、指正。

20155312 《信息安全系统设计基础》课程总结

20155312 《信息安全系统设计基础》课程总结

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

  • 代码托管链接和二维码:
    • 截图 git log --pretty=format:"%h - %an, %ar : %s" 的结果:
      技术分享图片

    • 代码量汇总提交statistics.sh的支持截图
      技术分享图片

    • 代码驱动的学习做到没有?
    • 答:感觉与上学期java课程相比,这学期自己编写的代码量一般,没有完全做到代码驱动的学习。
    • 加点代码,改点代码是理解的最好方式,参考编程的智慧,谈谈你的心得
    • 答:利用代码学习知识,在改写代码的过程中加深对知识点的理解,是一种很好的方法,但前提不是一味的复制粘贴,而是要理解每个语句的意思,经过自身的思考,其实改写代码只是一个检验我们对知识点理解程度的方式。
    • 实践上有什么经验教训
    • 答:要看老师在实验楼上资源,课下根据每章学习重点有侧重性的学习,课上进行实践时掌握好时间。
  • 整体评价一下第1周作业中自己提出的问题是不是抓住了学习重点:感觉个别章节抓住了重点,但整体上还是与各章重点内容有所偏颇。
  • 回答一下第1周作业中自己提出的问题
    • 第一章:数据和控制信息以不同的方式存储在栈上为什么会引发安全漏洞?
    • 如果应用程序试图将超过缓冲区容量的数据存放在其中时,就产生了缓冲区溢出漏洞的条件。从外部写入到缓冲区可以使攻击者覆盖邻近内存块的内容,从而导致数据遭到破坏,程序崩溃,甚至可以执行任何恶意代码。在典型的攻击中,攻击者将数据发送给一个应用程序,而后者是一个将数据存储在小容量的堆栈缓冲区的程序,这会导致覆盖调用堆栈上的信息,其中包括函数的返回指针。通过这种方法,在合法的功能完成之后,攻击者就可以运行自己的恶意代码,并且可以将控制交给包含攻击者数据的漏洞利用代码。
    • 第二章:无符号数和数的补码表示有哪些特性?
    • 在计算机中无符号数用原码表示,有符号数用补码表示。w位的补码表示的数值范围是[-2w-1, 2w-1-1],如4位的补码表示的最小值是-8(1000),最大值是7(0111)。w位补码表示的值为:
      技术分享图片

    • 第三章:寄存器的使用惯例提出依据是什么?
    • 答:在多任务系统中,给定的时刻只能有一个过程是活动的,它占使用CPU的程序寄存器组.程序寄存器组作为一个单个资源被所有的函数过程共享. 所以,我们必须保证:一个过程(调用者)调用另一个(被调用者)时,被调用者不会覆盖某个调用者稍后会使用到的寄存器的值.为此, IA32(x86)采用了一组统一的寄存器使用惯例., 所有的过程调用都必须遵守, 包括程序库中的过程.
    • 第四章:组合和时序逻辑元素如何在数据通路中组合到一起?
    • 答:组合逻辑不许奥任何时序或控制,只要输入变化,值就通过逻辑门网络传播,而程序计数器、条件码寄存器、数据内存和寄存器文件这些硬件单元需要对其时序进行明确的控制,具体实现:通过一个时钟信号来控制,它出发将新值装载到寄存器以及将值写到随机访问存储器。
    • 第五章:如何减少程序需要做的工作的变换?
    • 答:编写出编译器能够有效优化以转换成高效可执行代码的源代码。
    • 第六章:RAM、ROM、磁盘和固态硬盘是如何放置在层次结构中的?
    • 答:RAM分一下两类:1.静态RAM(SRAM):用来作为高速缓存存储器,每个位存储在一个双稳态的存储器单元里。双稳态:电路可以无限期的保持在两个不同的电压配置或者状态之一。只要供电,就会保持不变。2.动态RAM(DRAM):用来作为主存以及图形系统的帧缓冲区。将每个位存储为对一个电容的充电,当电容的电压被扰乱之后,就永远都不会再恢复了。暴露在光线下会导致电容电压改变。如果断电,DRAM和SRAM都会丢失信息,非易失性存储器——只读存储器:ROM。ROM是以他们能够被重编程的次数和对他们重编程的机制来区分的。磁盘由盘片构成,表面覆盖着磁性记录材料,中央有一个可以旋转的主轴 ,旋转速率大约为5400-15000每分钟。磁盘的每个表面是一组称为磁道的同心圆组成,每个磁道被划分为一组扇区,扇区之间由一些间隙隔开,间隙存储用来标识扇区的格式化位。固态硬盘是一种基于闪存的存储技术。一个硬盘包由一个或者多个闪存芯片和内存翻译层组成,闪存芯片替代旋转磁盘中的机械驱动器,而闪存翻译层将对逻辑块的请求翻译成对底层物理设备的访问
    • 第七章:位置无关代码主要应用于什么情况?
    • 答:位置无关代码可以用于以下场合:
    1. 程序在运行期间动态加载到内存;
    2. 程序在不同场合与不同程序组合后加载到内存(共享的动态链接库);
    3. 在运行期间不同地址相互之间的映射(如bootloader)
    • 第八章:应用程序是如何与操作系统交互的?
    • 答:。当一个高级语言写的程序要想能被处理器执行,那它首先要被编译系统的编译器编译为二进制形式的文件,即可重定位目标文件,其次编译系统的链接器还必须将这些可重定位目标文件链接成一个可执行文件。
    • 第九章:应用程序如何使用和管理虚拟内存?
    • 答: 操作系统利用体系结构提供的VA到PA的转换机制实现虚拟内存管理。
    • 第十章:内核用什么数据结构来表示打开的文件?
    • 答:文件描述符表、文件表和 V 节点表。
    • 第十一章:getaddrinfo函数和getnameinfo函数有什么区别或联系?
    • 答:getaddrinfo函数能够处理名字到地址以及服务到端口这两种转换,返回的是一个sockaddr结构而不是一个地址列表,这些sockaddr结构随后可由套接字函数直使用
#include <netdb.h>
 
int getaddrinfo (const char *hostname, const char *service, const struct addrinfo *hints, struct addrinfo **result) ;
 //返回:若成功为0,出错为非0
  • getnameinfo函数与getaddrinfo互补:它以一个套接口地址为参数,返回一个描述主机的字符串和一个描述服务的字符串。这个函数以一种独立于协议的方式提供这些信息
#include <netdb.h>
 
int getnameinfo (const struct sockaddr *sockaddr, socklen_t addrlen, char *host, socklen_t hostlen, 
                 char *serv, socklen_t servlen, int flags) ;
//成功为0,出错为非0(如gai_strerror函数中的表)
- 第十二章:如何理解互斥锁加锁顺序规则?
- 答:如果对于程序中每队互斥锁(s,t),给出所有的锁分配一个铨叙,每个线程按照这个顺序来申请锁,并且按照逆序来释放,那么这个程序就是无死锁的。一条路有两个方向,一辆车要通过这条路需要同时从一个方向往另一个方向开,如果两辆车相向而行,那就是死锁,如果两辆车同向行驶,那就不会死。
  • 你有什么项目被加分,谈谈你的经验
    • 优秀作业(不太清楚自己有没有被加分)
    • 教程:处理器体系结构,二维码:(15)
  • 你有什么项目被扣分,谈谈你的教训
    • 没有
  • 课程收获与不足
    • 自己的收获(投入,效率,效果等)
    • 答:我最大的收获是能够在忙碌的时候调整好心态,把事情一件一件的完成,学会了如何进行自我调节。
    • 自己需要改进的地方
    • 答:自己的学习效率和学习后的掌握程度还是有待提高。
  • 给开学初的你和学弟学妹们的学习建议
    • 如果重新学习这门课,怎么做才可以学的更好
    • 建议学弟学妹们坚守内心,学习知识的目的是丰富自己、提升自我,博客、蓝墨云班课都是为了达到这一目的的手段,大家不要本末倒置,跟紧娄老师的节奏,只要学了,就要把这个东西学会,如果没用心学,那做什么都只是在浪费时间。
  • 问卷调查
    • 你平均每周投入到本课程多长时间?
    • 答:15小时。
    • 每周的学习效率有提高吗?
    • 答:有所提高。
    • 学习效果自己满意吗?
    • 答:不是十分满意,只有个别几章学的比较透彻,还有很多内容只是大概了解,没有深入研究。
    • 课程结束后会继续一周至少一篇博客吗?(如果能做到,毕业时我把你的博客给你集结成一本书送给你作纪念)
    • 答:我更喜欢用笔和纸这种传统的方式记录自己的学习过程,既可以练字,又很有成就感,所以如果不是课程要求,自己应该不会再主动写博客了。
    • 你觉得这门课老师应该继续做哪一件事情?
    • 答:我觉得老师应该继续让大家提交出门门票,提前给同学们公布实验的具体任务,让大家有充足的时间做好准备(例如实验五)。
    • 你觉得这门课老师应该停止做哪一件事情?
    • 答:①提交出门门票后应该取消随机组队进行互评,因为如果一个人连自己的问题都不愿意去解决,又怎么会用心去解决别人的问题呢?根据我的观察,大家在这个过程中并没有太多收获;②实验中应该取消和交叉编译有关的内容,因为实验室的设备故障率太大,而且实验室的机器每次开机都需要重新装一个虚拟机,很麻烦,强烈建议把实验室的系统好好搞一搞,可以参照信息安全概论这门课中实验的模式。
    • 你觉得这门课老师应该开始做什么新的事情?
    • 答:我觉得老师应该给有不同目标的同学分配不同的任务,只想及格的同学需要至少完成……想要拿满分的同学在此基础上还需要完成……,每周都分配不同的任务。
  • 给出你的总结的链接和二维码

技术分享图片






以上是关于基础安全产品相关系统设计的一些思考的主要内容,如果未能解决你的问题,请参考以下文章

2018-2019-1 20165301 《信息安全系统设计基础》第五周学习总结

20155324 《信息安全系统设计基础》课程总结

20155312 《信息安全系统设计基础》课程总结

2022年2月到5月-关于产品相关的一些思考

2017-2018-1 20155310 《信息安全系统设计基础》课程总结

# 20155310 2017-2018-1 《信息安全系统设计基础》课程总结