【Web安全】之【1.0 序章】
1.0 序章
1.1 Web 技术演化
简单网站
静态页面
Web技术在最初阶段,网站的主要内容是静态的,**大多站点托管在ISP上,由文字和图片组成,制作和表现形式也是以表格为主。**当时的用户行为也非常简单,基本只是浏览网页。
多媒体阶段
随着技术的不断发展,音频、视频、Flash等多媒体技术诞生了。多媒体的加入使得网页变得更加生动形象,网页上的交互也给用户带来了更好的体验。
CGI 阶段
渐渐的,多媒体已经不能满足人们的请求,于是CGI (Common Gateway Interface) 应运而生。CGI定义了Web服务器与外部应用程序之间的通信接口标准,因此Web服务器可以通过CGI执行外部程序,让外部程序根据Web请求内容生成动态的内容。
在这个时候,各种编程语言如PHP/ASP/JSP也逐渐加入市场,基于这些语言可以实现更加模块化的、功能更强大的应用程序。
Ajax
在开始的时候,用户提交整个表单后才能获取结果,用户体验极差。于是Ajax (Asynchronous Javascript And XML) 技术逐渐流行起来,它使得应用在不更新整个页面的前提下也可以获得或更新数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变的信息。
MVC
随着Web应用开发越来越标准化,出现了MVC等思想。MVC是Model/View/Control的缩写,Model用于封装数据和数据处理方法,视图View是数据的HTML展现,控制器Controller负责响应请求,协调Model和View。
Model,View和Controller的分开,是一种典型的关注点分离的思想,**使得代码复用性和组织性更好,Web应用的配置性和灵活性也越来越好。**而数据访问也逐渐通过面向对象的方式来替代直接的SQL访问,出现了ORM (Object Relation Mapping) 的概念。
除了MVC,类似的设计思想还有MVP,MVVM等。
数据交互
简单数据交互
在Web技术发展最初,前后端交互大部分都使用Web表单、XML、SOAP等较为简单的方式。
RESTful
在CGI时期,前后端通常是没有做严格区分的,随着解耦和的需求不断增加,前后端的概念开始变得清晰。前端主要指网站前台部分,运行在PC端、移动端等浏览器上展现给用户浏览的网页,由HTML5、CSS3、JavaScript组成。后端主要指网站的逻辑部分,涉及数据的增删改查等。
此时,REST (Representation State Transformation) 逐渐成为一种流行的Web架构风格。
**REST鼓励基于URL来组织系统功能,充分利用HTTP本身的语义,而不是仅仅将HTTP作为一种远程数据传输协议。**一般RESTful有以下的特征:
- 域名和主域名分开
- api.example.com
- example.com/api/
- 带有版本控制
- api.example.com/v1
- api.example.com/v2
- 使用URL定位资源
- GET /users 获取所有用户
- GET /team/:team/users 获取某团队所有用户
- POST /users 创建用户
- PATCH/PUT /users 修改某个用户数据
- DELETE /users 删除某个用户数据
- 用 HTTP 动词描述操作
- GET 获取资源,单个或多个
- POST 创建资源
- PUT/PATCH 更新资源,客户端提供完整的资源数据
- DELETE 删除资源
- 正确使用状态码
- 使用状态码提高返回数据的可读性
- 默认使用 JSON 作为数据响应格式
- 有清晰的文档
GraphQL
部分网络服务场景的数据有复杂的依赖关系,为了应对这些场景,**Facebook 推出了 GraphQL ,以图状数据结构对数据进行查询存储。**部分网站也应用了 GraphQL 作为 API 交互的方式。
二进制
随着业务对性能的要求提高,前后端开始使用HTTP/2、自定义Protocol Buffer等方式来加快数据交互。
中间件
架构复杂化
随着业务的不断发展,业务架构也越来越复杂。传统的功能被拆分成不同的模块,出现了中间件、中台等概念。代理服务、负载均衡、数据库分表、异地容灾、缓存、CDN、消息队列、安全防护等技术应用越来越广泛,增加了Web开发和运维的复杂度。
客户端的形态越来越多,除了Web之外iOS、Android等其他场景也出现在Web服务的客户端场景。
数据库从最开始的轻量数据库,出现了Redis/Memcached缓存数据库等一类满足特定需求的数据库。
为了满足特定的业务需求,出现了Lucene/Solr/Elasticsearch搜索应用服务器,Kafka/RabbitMQ/ZeroMQ消息系统,Spark计算引擎,Hive数据仓库平台等不同的基础架构。
分布式
随着数据量的不断提高,单台设备难以承载这样的访问量,同时不同功能也被拆分到不同的应用中,于是出现了提高业务复用及整合的分布式服务框架(RPC)。
CI/CD
持续集成 (Continuous Integration, CI) 是让开发人员将工作集成到共享分支中的过程。频繁的集成有助于解决隔离,减少每次提交的大小,以降低合并冲突的可能性。
持续交付 (Continuous Deployment, CD) 是持续集成的扩展,它将构建从集成测试套件部署到预生产环境。这使得它可以直接在类生产环境中评估每个构建,因此开发人员可以在无需增加任何工作量的情况下,验证bug修复或者测试新特性。
云服务
云计算诞生之前,大部分计算资源是处于“裸金属”状态的物理机,运维人员选择对应规格的硬件,建设机房的 IDC 网络,完成服务的提供,投入硬件基础建设和维护的成本很高。云服务出现之后,使用者可以直接购买云主机,基础设施由供应商管理,这种方式也被称作 IaaS (Infrastructure-as-a-Service) 。
随着架构的继续发展,应用的运行更加细粒度,部署环境容器化,各个功能拆成微服务或是Serverless的架构。
Serverless
Serverless 架构由两部分组成,即 Faas (Function-as-a-Service) 和 BaaS (Backend-as-a-Service) 。
FaaS是运行平台,用户上传需要执行的逻辑函数如一些定时任务、数据处理任务等到云函数平台,配置执行条件触发器、路由等等,就可以通过云平台完成函数的执行。
BaaS包含了后端服务组件,它基于 API 完成第三方服务,主要是数据库、对象存储、消息队列、日志服务等等。
微服务
微服务起源于2005年Peter Rodgers博士在云端运算博览会提出的微Web服务 (Micro-Web-Service),根本思想类似于Unix的管道设计理念。2014年,由Martin Fowler与 James Lewis共同提出了微服务的概念,定义了微服务架构风格是一种通过一套小型服务来开发单个应用的方法,每个服务运行在自己的进程中,并通过轻量级的机制进行通讯 (HTTP API) 。
微服务是一种应用于组件设计和部署架构的软件架构风格。它利用模块化的方式组合出复杂的大型应用程序:
- 各个服务功能内聚,实现与接口分离。
- 各个服务高度自治、相互解耦,可以独立进行部署、版本控制和容量伸缩。
- 各个服务之间通过 API 的方式进行通信。
- 各个服务拥有独立的状态,并且只能通过服务本身来对其进行访问。
API 网关
API网关是一个服务器,客户端只需要使用简单的访问方式,统一访问API网关,由API网关来代理对后端服务的访问,同时由于服务治理特性统一放到API网关上面,服务治理特性的变更可以做到对客户端透明,一定程度上实现了服务治理等基础特性和业务服务的解耦,服务治理特性的升级也比较容易实现。
1.2 网络攻防技术演化
历史发展
1939年,图灵破解了Enigma,使战争提前结束了两年,这是较早的一次计算机安全开始出现在人们的视野中,这个时候计算机的算力有限,人们使用的攻防方式也相对初级。
1949年,**约翰·冯·诺依曼(John Von Neumann)**提出了一种可自我复制的程序的设计,这被认为是世界上第一种计算机病毒。
1970年到2009年间,随着因特网不断发展,网络安全也开始进入人们的视野。在网络发展的初期,很多系统都是零防护的,安全意识也尚未普及开来。很多系统的设计也只考虑了可用性,对安全性的考虑不多,所以在当时结合搜索引擎与一些集成渗透测试工具,可以很容易的拿到数据或者权限。
1972年,缓冲区溢出攻击被 Computer Security Technology Planning Study 提出。
1984年,Ken Thompson 在 Reflections on Trusting Trust 一文中介绍了自己如何在编译器中增加后门来获取 Unix 权限的,这也是较早的供应链攻击。
1988年,卡耐基梅隆大学(Carnegie Mellon University, CMU)的一位学生以测试的目的编写了Morris Worm,对当时的互联网造成了极大的损害。
同年,CMU的CERT Coordination Center (CERT-CC)为了处理Morris Worm对互联网造成的破坏,组成了第一个计算机紧急响应小组(Computer Emergency Response Team),而后全球多个国家、地区、团体都构建了CERT、SRC等组织。
同样是在1988年,Barton Miller教授在威斯康星大学的 计算机实验课上 ,首次提出Fuzz生成器(Fuzz Generator)的概念,用于测试Unix程序的健壮性,即用随机数据来测试程序直至崩溃。因此,Barton Miller教授也被多数人尊称为"模糊测试之父"。
1989年,C.J.Cherryh 发表了小说 The Cuckoo’s Egg: Tracking a Spy Through the Maze of Computer Espionage ,这本书是作者根据追溯黑客攻击的真实经历改编,在书中提出了蜜罐技术的雏形。
1990年,一些网络防火墙的产品开始出现,此时主要是基于网络的防火墙,可以处理FTP等应用程序。
1993年起,Jeff Moss开始每年在美国内华达州的拉斯维加斯举办 DEFCON (也写做 DEF CON, Defcon, or DC, 全球最大的计算机安全会议之一) 。CTF (Capture The Flag) 比赛的形式也是起源于1996年的 DEFCON 。
1993年7月,Windows NT 3.1发布,引入了身份认证、访问控制和安全审计等安全控制机制,在此之前的 Windows 9x 内核几乎没有任何安全性机制。
1996年,Smashing the Stack For Fun and Profit发表,在堆栈的缓冲区溢出的利用方式上做出了开创性的工作。
1997年起,Jeff Moss开始举办 Black Hat ,以中立的立场进行信息安全研究的交流和培训,到目前为止,Black Hat 也会在欧洲和亚洲举行。
1998年12月,Jeff Forristal在一篇 文章 中提到了使用SQL注入的技巧攻击一个网站的例子,从此SQL注入开始被广泛讨论。
1999年1月21日-22日的第二届 Research with Security Vulnerability Databases 的 WorkShop 上, MITRE 的创始人 David E. Mann 和 Steven M. Christey 发表了一篇名为《Towards a Common Enumeration of Vulnerabilities》的白皮书,提出了CVE (Common Vulnerabilities and Exposures, 通用漏洞披露) 的概念,在当年收录并公开了321个CVE漏洞。
1999年12月,MSRC的一些工程师发现了一些网站被注入代码的例子,他们在整理讨论后公开了这种攻击,并称为 Cross Site Scripting。
2002年1月,Microsoft发起了 “可信赖计算” (Trustworthy Computing) 计划,以帮助确保产品和服务在本质上具有高度安全性,可用性,可靠性以及业务完整性,SDL (Security Development Lifecycle) 也在此时被提出。
2001年9月9日,Mark Curphey启动了OWASP (Open Web Application Security Project) 项目,开始在社区中提供一些Web攻击技术的文章、方法和工具等。
在此之后,Responsible disclosure / Full disclosure 等概念也不断进入人们的视野之中。
2002年10月4日,Kevin Mitnick 编著的 The Art of Deception (欺骗的艺术) 出版,这本书详细的介绍了社会工程学在攻击中是如何应用的,Kevin Mitnick 也被认为是社会工程学的开山鼻祖。
2005年7月25日,Zero Day Initiative (ZDI) 创建,鼓励负责任的漏洞披露。
2005年11月,基于从1941年2月开始的情报收集积累和发展,Director of National Intelligence 宣布成立 Open Source Center (OSC) ,进行开源情报的收集,而后 Open-source intelligence (OSINT) 的概念也不断被人们认知。
2006年,APT(Advanced Persistent Threat, 高级持续威胁) 攻击的概念被正式提出,用来描述从20世纪90年代末到21世纪初在美国军事和政府网络中发现的隐蔽且持续的网络攻击。
2006年起,美国国土安全部(DHS)开始每两年举行一次 “网络风暴” (Cyber Storm) 系列国家级网络事件演习。
随着时代不断的发展,攻防技术有了很大的改变,防御手段、安全意识也随着演化。在攻击发生前有威胁情报、黑名单共享等机制,威胁及时能传播。在攻击发生时有基于各种机制的防火墙如关键字检测、语义分析、深度学习,有的防御机制甚至能一定程度上防御零日攻击。在攻击发生后,一些关键系统系统做了隔离,攻击成果难以扩大,就算拿到了目标也很难做进一步的攻击。也有的目标蜜罐仿真程度很高,有正常的服务和一些难以判断真假的业务数据。
2010年6月,震网 (Stuxnet) 被发现,在这之后供应链攻击事件开始成为网络空间安全的新兴威胁之一。随后的XcodeGhost、CCleaner等供应链攻击事件都造成了重大影响。
在2010年Forrester Research Inc.的分析师提出了“零信任”的概念模型时。
2012年1月,Gartner 公司提出了 IAST (Interactive Application Security Testing) 的概念,提供了结合 DAST 和 SAST 两种技术的解决方案。
2012年9月,Gartner 公司研究员 David Cearley 提出了 DevSecOps 的概念,表示 DevOps 的流程应该包含安全理念。
2013年,MITRE 提出了 ATT&CK™ (Adversarial Tactics, Techniques, and Common Knowledge, ATT&CK) ,这是一个站在攻击者的视角来描述攻击中各阶段用到的技术的模型。
2013年,Michigan 大学开始了 ZMap 项目,在2015年这个项目演化为 Censys ,从这之后网络空间测绘的项目逐渐出现。
2014年,在 Gartner Security and Risk Management Summit 上,Runtime Application Self-protection (RASP) 的概念被提出,在应用层进行安全保护。
2015年,Gartner 首次提出了 SOAR 的概念,最初的定义是 Security Operations, Analytics and Reporting,即安全运维分析与报告。
2017年,Gartner 对 SOAR 概念做了重新定义:Security Orchestration, Automation and Response, 即安全编排、自动化与响应。
1.3 网络安全观
定义
网络安全的一个通用定义指网络信息系统的硬件、软件及其系统中的数据受到保护,不因偶然的或者恶意的破坏、更改、泄露,系统能连续、可靠、正常地运行,服务不中断。网络安全简单的说是在网络环境下能够识别和消除不安全因素的能力。
网络安全在不同环境和应用中有不同的解释,例如系统运行的安全、系统信息内容的安全、信息通信与传播的安全等。
网络安全的基本需求包括可靠性、可用性、保密性、完整性、不可抵赖性、可控性、可审查性、真实性等。其中三个最基本的要素是机密性 (Confidentiality)、完整性 (Integrity)、可用性 (Availability)。
机密性是不将有用信息泄漏给非授权用户的特性。可以通过信息加密、身份认证、访问控制、安全通信协议等技术实现,信息加密是防止信息非法泄露的最基本手段,主要强调有用信息只被授权对象使用的特征。
完整性是指信息在传输、交换、存储和处理过程中,保持信息不被破坏或修改、不丢失和信息未经授权不能改变的特性,也是最基本的安全特征。
可用性指信息资源可被授权实体按要求访问、正常使用或在非正常情况下能恢复使用的特性。在系统运行时正确存取所需信息,当系统遭受意外攻击或破坏时,可以迅速恢复并能投入使用。是衡量网络信息系统面向用户的一种安全性能,以保障为用户提供服务。
网络安全的主体是保护网络上的数据和通信的安全,数据安全性是指软硬件保护措施,用来阻止对数据进行非授权的泄漏、转移、修改和破坏等,通信安全性是通信保护措施,要求在通信中采用保密安全性、传输安全性、辐射安全性等措施。
系统脆弱性
信息系统本身是脆弱的,信息系统的硬件资源、通信资源、软件及信息资源等都可能因为可预见或不可预见甚至恶意的原因而可能导致系统受到破坏、更改、泄露和功能失效,从而使系统处于异常状态,甚至崩溃瘫痪。
硬件资源的脆弱性主要表现为物理安全方面的问题,多源于设计,采用软件程序的方法见效不大。
软件的脆弱性来源于设计和软件工程实施中遗留问题,如设计中的疏忽、内部设计的逻辑混乱,没有遵守信息系统安全原则进行设计等。