安全攻防技能30讲

本文涉及的产品
访问控制,不限时长
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介:   《安全攻防技能30讲》是极客时间上的一个关于Web安全的专栏,在学习之后特在此做记录和总结。

一、安全基础概念


  先和你聊聊安全本身,以帮你建立整体的大局观。安全的本质就是保护数据被合法地使用。

1)安全原则

  CIA 三元组原则,是安全领域内最基础也最重要的原则。

  (1)机密性(Confidentiality)用一句话来说就是,确保数据只被授权的主体访问,不被任何未授权的主体访问。简单用一个词总结就是“不可见”。

  (2)完整性(Integrity)就是确保数据只被授权的主体进行授权的修改,简单来说,就是“不可改”。

  (3)可用性(Availability)就是确保数据能够被授权的主体访问到 ,简单来说,就是“可读”。

2)黄金法则

  黄金法则主要包含三部分:认证(Authentication)、授权(Authorization)、审计(Audit)。这三部分其实是一种串联的关系,它描述的其实是用户在使用应用过程中的生命周期:先进行登录、再进行操作、最后留下记录。

  (1)认证其实包括两个部分:身份识别和认证。身份识别强调的是主体如何声明自己的身份,而身份认证强调的是,主体如何证明自己所声明的身份是合法的。比如说,当你在使用用户名和密码登录的过程中,用户名起到身份识别的作用,而密码起到身份认证的作用。

  (2)除了对“你能做什么”进行限制,授权机制还会对“你能做多少”进行限制。比如,手机流量授权了你能够使用多少的移动网络数据。最原始和最安全的授权机制,一定是你的每一次操作,都经过了管理人员的审批和确认。

  (3)当你在授权下完成操作后,安全需要检查一下“你做了什么”,这个检查的过程就是审计。当发现你做了某些异常操作时,安全还会提供你做了这些操作的“证据”,让你无法抵赖,这个过程就是问责。

  大部分情况下,事前防御属于认证,事中防御属于授权,事后防御属于审计。

3)密码学

  (1)对称加密,代表加密和解密使用的是同一个密钥。经典的对称加密算法有 DES、IDEA、AES、国密 SM1 和 SM4。

  (2)非对称加密代表加密和解密使用不同的密钥。具体的加解密过程就是,发送方使用公钥对信息进行加密,接收方收到密文后,使用私钥进行解密。经典的非对称加密算法包括:RSA、ECC 和国密 SM2。

  (3)散列算法应该是最常见到的密码学算法了。大量的应用都在使用 MD5 或者 SHA 算法计算一个唯一的 id。

4)身份认证

  身份认证可以分为两个部分:对外认证和对内认证。对外认证,其实就是应用的登录注册模块,它面向用户进行认证。

  除了应用本身需要有登录注册的模块,应用的各种内部系统同样需要涉及登录认证的功能,比如:服务器的登录、数据库的登录、Git 的登录、各种内部管理后台的登录等等。这也就是我所说的对内认证。

  对外认证是单一场景下的认证,对内认证是多场景下的认证。

  当账号体系变得越来越复杂时,如何对这些账号进行统一的管理,是解决身份认证问题的关键。而单点登录(Single Sign On,SSO)就是一个非常有效的解决方案。

  单点登录的概念很简单:用户只需要进行一次认证,就可以访问所有的网页、应用和其他产品了。CAS 是一个开源的单点登录框架,它不属于某一种单点登录的实现方式,而是提供了一整套完整的落地方案。


82.jpg


5)访问控制

  “授权”和“访问控制”其实是同一个概念,都是允许或者禁止某个用户做某件事情。

  一个主体请求一个客体,这个请求的授权由访问控制来完成。例如在用户去读取文件的过程中,用户是主体,读取这个操作是请求,文件是客体。

  (1)主体:请求的发起者。主体可以是用户,也可以是进程、应用、设备等任何发起访问请求的来源。

  (2)客体:请求的接收方,一般是某种资源。比如某个文件、数据库,也可以是进程、设备等接受指令的实体。

  (3)请求:主体对客体进行的操作。常规的是读、写和执行,也可以进一步细分为删除、追加等粒度更细的操作。

  常见的访问控制机制有 4 种:DAC、role-BAC、rule-BAC、MAC。

  (1)DAC(Discretionary Access Control,自主访问控制)。DAC 就是让客体的所有者来定义访问控制规则。

  你想要从图书馆中拿走一本书。这个时候,管理员说,“你经过这本书的所有人同意了吗?”这个过程就是 DAC。

  (2)role-BAC(role Based Access Control,基于角色的访问控制)。role-BAC 就是将主体划分为不同的角色,然后对每个角色的权限进行定义。

  当你想借书的时候,管理员说,“你是学生吗?”这个过程就是 role-BAC。

  (3)rule-BAC(rule Based Access Control,基于规则的访问控制)。rule-BAC 就是制定某种规则,将主体、请求和客体的信息结合起来进行判定。

  有一点需要我们注意,需要定义是“默认通过”还是“默认拒绝”。即当某次请求没有命中任何一条规则时,我们是应该让它“通过”还是“拒绝”呢?

  如果你想要在图书馆借书,管理员会说,“根据规定,持有阅览证就可以借书。”

  (4)MAC(Mandatory Access Control,强制访问控制)。MAC 是一种基于安全级别标签的访问控制策略。

  在互联网中,主体和客体被划分为“秘密、私人、敏感、公开”这四个级别。MAC 要求对所有的主体和客体都打上对应的标签,然后根据标签来制定访问控制规则。

  当你在图书馆排队借书的时候,听到管理员说:“初中生不能借阅高中生的书籍。”这就是一种强制访问控制。

  相比较来说,DAC 是所有者对客体制定的访问控制策略,role-BAC 是管理员对主体制定的访问控制策略,而 rule-BAC 可以说是针对请求本身制定的访问控制策略。


image.jpeg


二、Web安全


  在 Web 安全这个模块中,我们所谈论的 Web,是指所有基于 HTTP 或者其他超文本传输协议(RPC 等)开发的应用,包括:网页、App、API 接口等等。这类应用的共同点是:通过 HTTP 等文本协议,在客户端和服务端之间进行数据交换。客户端需要将服务端传出的数据展示渲染出来,服务端需要将客户端传入的数据进行对应的处理。而 Web 安全所涉及的正是这些应用中存在的各类安全问题。

  “Web 安全”涉及的主要内容梳理成了一张表格,你可以利用它来及时回顾。


84.jpg


1)XSS

  通过给定异常的输入,黑客可以在你的浏览器中,插入一段恶意的 JavaScript 脚本,从而窃取你的隐私信息或者仿冒你进行操作。这就是 XSS 攻击(Cross-Site Scripting,跨站脚本攻击)的原理。

2)SQL注入

  黑客会通过构造一些恶意的输入参数,在应用拼接 SQL 语句的时候,去篡改正常的 SQL 语意,从而执行黑客所控制的 SQL 查询功能。这个过程,就相当于黑客“注入”了一段 SQL 代码到应用中。这就是我们常说的 SQL 注入。

3)CSRF/SSRF

  黑客编写带有恶意 JavaScript 脚本的网页,通过“钓鱼”的方式诱导你访问。然后,黑客会通过这些 JavaScript 脚本窃取你保存在网页中的身份信息,通过仿冒你,让你的浏览器发起伪造的请求,最终执行黑客定义的操作。而这一切对于你自己而言都是无感知的。这就是 CSRF(Cross-Site Request Forgery,跨站请求伪造)攻击。

  用户在浏览器中输入一个 URL(比如某个图片资源),然后服务端会向这个 URL 发起请求,通过访问其他的服务端资源来完成正常的页面展示。这个时候,只要黑客在输入中提交一个内网 URL,就能让服务端发起一个黑客定义的内网请求,从而获取到内网数据。这就是 SSRF(Server Side Request Forgery,服务端请求伪造)的原理。

4)反序列化漏洞

  应用在输出某个数据的时候,将对象转化成字符串或者字节流,这就是序列化操作。反序列化操作也就是应用将字符串或者字节流变成对象。

  在数据转换成对象的过程中,应用需要根据数据的内容,去调用特定的方法。而黑客正是利用这个逻辑,在数据中嵌入自定义的代码(比如执行某个系统命令)。应用对数据进行反序列化的时候,会执行这段代码,从而使得黑客能够控制整个应用及服务器。这就是反序列化漏洞攻击的过程。

5)信息泄露

  避免错误信息泄露代码逻辑,一方面是要通过正确地配置文件,避免错误信息被展示到前端;另一方面是要对错误信息进行检测,这里就需要用到“黑盒”检测了。

  所谓“黑盒(Black Box Testing,功能测试)”,就是在不获取代码的情况下,直接运行应用,然后对应用的请求和响应进行扫描。比如,在错误信息泄露的场景中,“黑盒”检测可以向应用发起一些必然会导致错误的请求(比如上述例子中的单引号),然后观察应用是返回完整的错误日志,还是返回某些经过处理的页面。

  除了错误信息之外,间接的信息泄露方式还有两种:返回信息泄露和注释信息泄露。

  使用一种叫作“白盒”的代码检测方法,来避免关键的注释信息出现在线上的代码中。

  所谓“白盒(White Box Testing,结构测试)”,即直接获取到线上的源代码,然后对它进行扫描。“白盒”扫描注释信息的原理比较简单,因为每一种语言的注释都会带有特殊的标记(比如 Java 和 PHP 中的 /* 等),可以比较准确地被识别出来。

  返回信息过于明确不算是代码层面的漏洞,更多的是产品层面的漏洞。因此,理论上没有任何技术手段能够对这种漏洞进行检测,只能依靠人为的分析审计来避免。解决方案也比较简单,直接将返回信息模糊化、统一化即可。比如在登录的场景中,我们可以将两种登录失败的返回信息,统一修改为“用户名不存在或密码错误”。

  信息泄露最普遍的方式还是直接泄露 。这里我会讲两种常见的直接泄露方式。

  (1)第一种泄露方式与版本管理工具中的隐藏文件有关。通过版本管理工具(比如 SVN 和 Git),你能够很方便地进行代码回滚、备份等操作。

  (2)除此之外,还有一种最常见、也最不容易注意的泄露方式,那就是上传代码到 GitHub 上。

  我们可以从以下几个方面进行防护:

  (1)屏蔽信息:通过技术手段,将不该被访问的资源进行屏蔽,从而避免信息泄露的产生;

  (2)代码检测:从“白盒”和“黑盒”两个方向,对代码、应用等进行检测,对可能的泄露进行预警;

  (3)人工审计:对于非技术原因造成的泄露,加强人工审计的工作。同时从公司制度上,去提高员工的安全意识。

6)插件漏洞

  我准备了几个问题,你可以看看自己是否对所用的插件了如指掌。

  (1)你所使用的所有插件的版本是什么?(包括前端和后端,直接引用和间接引用)

  (2)你所使用的这些插件,是否存在漏洞,是否不被维护了,是否被废弃了?

  (3)你所使用的这些插件,会在哪些地方发布更新信息和漏洞信息?

  (4)你所使用的这些插件,是否会定期更新?

  (5)你是否会对更新插件进行完整的测试?

  (6)你所使用的这些插件,在安全方面,有哪些配置需要关注?

  “0 day”,即在插件发布修复漏洞的安全补丁之前,黑客就已经知道漏洞细节的漏洞。换一句话说,“0 day”就是只有黑客知晓的未公开漏洞。

  因为只有黑客知道这个漏洞,而我们连这个漏洞是什么都不知道,所以“0 day”几乎无法防御。除此之外,“0 day”还具备极高的攻击有效性,可以说只要应用使用了对应的插件,黑客几乎“战无不胜”。

  建立插件漏洞的防护体系。

  (1)第一步:整理插件,剔除无用插件。

  (2)第二步:管理插件补丁更新。

  (3)第三步:使用公开漏洞库。


三、业务安全


1)业务安全体系

  黑产是基于正常的业务产品逻辑,采取非正常或者批量的操作,来获取利益的行为。业务安全就是通过各类产品策略,来对黑产进行识别和拦截,从而保障业务的正常运行。

  在业务安全中,业内普遍将攻击者称为“黑产”。之所以会改换一个名称,我认为主要有两点原因。

  (1)第一,“黑产”强调的是“产业化”。


85.jpg



  (2)第二,黑客强调的是技术对抗,而“黑产”更看重资源对抗。

  在基础安全中,我们说过应用的本质是数据,安全的本质是数据的 CIA,我们可以通过黄金法则来保护数据。而业务安全的本质就是保障用户价值不受黑产的恶意影响。保障的方法就是提高黑产的资源成本,使得黑产无法获利。

  一般来说,黑产会从四个方面进行资源投入,分别是:用户资源、IP 资源、设备资源和操作资源。

  (1)对于用户资源的对抗,目前主要的方式就是黑名单。

  (2)黑产会利用“秒拨 IP”来获取大量 IP 资源。所谓“秒拨”,就是指每一次拨号上网,都会分配一个新的 IP 给我们。

  (3)很多黑产案件中都会出现由大量手机设备组成的“手机墙”。除此之外,也有上游团队将手机做成云控模式,下游黑产可以直接花钱购入可远程操控的真实手机设备。

  (4)黑产会尝试使用一些自动化的工具,比如按键精灵,让机器来完成游戏的过程。我们和操作资源的对抗,就是在和黑产的自动化工具进行对抗。


86.jpg


2)产品安全方案

  我对业务安全中 IPDRR 内容的重点讲解。

  (1)Identify(识别):和基础安全一样,业务安全的识别阶段主要是进行威胁评估的工作。我们需要找到黑产可能获取到的业务逻辑中的投入成本,比如,应用发放的红包、优惠券等。

  (2)Protect(保护):在业务安全中,我们是通过产品方案来实施认证和授权过程的。比如,对于登录过程增加双因子认证和验证码等,就是加强认证的安全性。

  (3)Detect(检测):检测阶段主要是风控系统发挥作用。

  (4)Respond(响应):发现黑产的攻击后,我们可以通过封禁账号、拦截操作、拒绝提现等方式,来阻止黑产获取利益。

  (5)Recover(恢复):最后就是对整个系统进行恢复了。在业务安全中,黑产可能已经盗取了某些账号,或者已经领取了部分红包。这时,我们就需要通过合适的运营机制,将账号返回给原用户,把红包退回到奖金池中。


87.jpg


  提升应用安全性的产品方案还有很多。例如:

  (1)在邀约活动中,我们可以适当增加用户任务的难度,如必须连续活跃三天用户才能得到收益;

  (2)在抽奖活动中,我们可以增加参与抽奖的门槛,如必须是注册一个月以上的老用户才能参加;

  (3)在排行榜活动中,我们可以将排行榜的计算规则隐藏,让黑产摸不清刷的方式。

3)风控系统

  风控系统就是从业务数据中挖掘出黑产行为的数据分析系统。

  产品方案属于事前的防控,是从根本上提高黑产操作的成本;风控系统属于事中的防控,是在检测到黑产行为时才进行拦截。

  一个完整的风控流程还需要人工进行数据分析、处理用户投诉、监控舆情,并采取应急响应机制。


88.jpg

  (1)前端 SDK 可以采集各类前端数据,如手机型号、硬件类型等。除此之外,前端 SDK 还会计算出一个唯一的设备指纹,通过这个设备指纹,我们就能够实现对设备行为的追踪。

  (2)规则引擎会接收到业务提供的原始数据,而想要从中识别出黑产,我们首先需要通过一些统计手段找到其中有用的特征。比如说,我们可以定义,一个设备在 1 分钟内登录 5 次的行为属于异常行为,应当进行拦截。做好一款规则引擎的关键在两个方面:采用正确的工作模式、设计高效的规则管理功能。

4)机器学习

  机器学习是通过找出未知的规则参数来区分已知的行为。

  在生活中,我们能够快速地分辨一张图片是猫还是狗。那你有没有思考过,我们是怎么进行识别的?根据五官、颜色还是形状?仔细回想一下,你就会发现,我们往往是根据经验来判断的,很难用文字描述出准确的判断依据。

  机器学习实际上是对人为经验的一种总结,并不具备创新的能力,所以最终对抗效果的好坏,还是取决于人的对抗能力。

5)设备指纹

  设备指纹是用来标识手机或者浏览器的唯一 ID,我们能够通过这个 ID 关联到手机或浏览器相关的全部数据。

  对比于传统的 IP、手机号等 ID,设备指纹具有唯一性高、稳定性强和信息丰富这三个优势。

  简单来说,唯一性高是指一人一设备,因为使用者不同,每个智能设备上的使用痕迹和特征也具有唯一性。稳定性强也很好理解,就是智能设备的硬件不常更新,它们对应稳定不变的 ID。智能设备能够收集的信息非常丰富,自下而上包括硬件、操作系统、应用信息等。

  基于这些优势,一方面,设备指纹可以以设备为单位对其相关的行为进行串联,发现诸如使用一个设备进行大规模注册等黑产攻击行为;另一方面,设备指纹可以基于其丰富的设备信息,来识别黑产使用的虚拟设备,帮助风控系统对抗黑产。

  设备指纹面临的主要挑战。

  (1)第一,设备重置之后,保持设备指纹不变。

  (2)第二,设备更新之后,保持设备指纹不变。

  (3)最后,我们还要保证设备指纹的唯一性,避免两个不同的设备产生相同的设备指纹

  想要获得准确且稳定的设备指纹,我们必须从多个维度采集不同的信息。这些信息可以大致分为:软件 ID、软件静态特征、硬件静态特征和硬件动态特征。

  (1)软件 ID 主要包括 iOS 设备的 IDFA、IDFV,Android 设备的 IMEI、MAC 等。这些 ID 本身就是苹果和 Google 为了给 APP 厂商提供追踪能力设计的标识,具备较好的唯一性和稳定性。但是,操作系统为了保障用户隐私,对 APP 的权限做了较多的限制。比如,用户可以自主选择禁止 APP 获取到这些 ID,重置手机也会同时重置这些 ID 等。

  (2)软件静态特征主要是操作系统和 APP 本身的各类基本信息,比如操作系统版本、手机名称、APP 版本等。这些信息基本都可以通过更新或者手动配置的方式修改,因此在稳定性上表现较差。但是,这些信息能够反映出用户的个人特征,因此,它们能够对设备指纹的唯一性产生较大帮助。

  (3)硬件静态特征主要是设备的各类硬件信息,比如,主板、CPU、摄像头等相关型号信息。正常用户基本不会去替换设备上的各个硬件,因此硬件静态特征具备较高的稳定性。但同一型号手机的硬件配置是一致的,所以,硬件静态特征在唯一性上相对欠缺。

  (4)硬件动态特征是目前比较新的研究方向,它的基本原理是基于硬件的一些动态执行层产生的特征(如:加速度传感器的偏差)来识别虚拟设备。

  设备指纹的 ID 计算其实就是计算两组数据的相似度,相似度越高、差异度越低,就越有可能是同一个设备。


相关文章
|
安全 网络协议 物联网
|
云安全 安全 算法
优秀网络安全从业者的五项核心技能
本文讲的是优秀网络安全从业者的五项核心技能,保护现代企业中的数据和系统,需要多个不同领域的技能支撑。
1403 0
|
SQL 安全 NoSQL
|
存储 网络协议 网络安全
|
前端开发 架构师 关系型数据库
架构师速成5.2-如何掌握综合性技能
买菜、洗菜、切菜很多人都会,但是把几种菜混在一起做成一道可口的佳肴就不是一般人能掌握的。 今天就讲解一下如何学会做一道好菜。 举个例子,做网站,其实跟做菜一样。 先看菜谱,看需要哪些配料,做网站,当然需要html,css,js,java,mysql这些菜,当然还需要设计模式、面向对象、框架这些调料,eclipse这样的刀,另外还需要tomcat这样的锅。 磨刀 基本工具
1354 0
|
7月前
|
自然语言处理 测试技术
技术写作者所需的关键技能和知识
成为一名优秀的技术写作者需要以下核心技能:
98 0
|
运维 监控 大数据
运维工程师需要掌握的技能
提起运维,大家都会想到又苦又累,又不被人重视的网管,机房运维,认为这个工种很low,入门门槛低,做的事比较杂,从搬服务器上架到修打印机,修电脑,处理网络小故障等杂七杂八的活,究其原因,多年来小公司都把运维当做一种打杂的小工使。
6812 0

热门文章

最新文章