论文部分内容阅读
摘 要:随着软件的不断发展,软件的开发技术也在不断地提高,如今的软件开发者所使用的开发技术不再是以前的那种单一整体架构了,更多使用的是分布式的微服务架构。使用微服务架构的方式来开发软件确实降低了软件开发过程中的复杂性,但同时也给软件带来了更多的安全隐患。本文针对微服务架构应用中存在的一些安全漏洞,简单介绍了一些开发者进行软件开发时需要考虑到的攻击方式和应对策略。
关键词:微服务;安全漏洞;应对策略
1 微服务的兴起
什么是微服务?微服务就是将单个应用程序拆分成多个小的服务的集群,每个微服务都围绕具体业务进行实现,相互之间通过轻量级通信机制,有着极少的统一管理。每个微服务可以独立部署,使用不同的编程语言,使用不同的数据存储技术。[1,2]从上面这段话我们可以知道,微服务的思想就是使用一个个独立的微服务来构成整个系统。
为什么我们不再趋向于使用以前的单一整体架构来开发?单体架构在系统规模较小时的效果确实很不错,但随着系统规模的不断扩大,出现的问题就越来越多,举一个简单的例子,技术是在不断发展的,可以说是日新月异,我们通常都会使用新的技术来更新项目,但在使用单体架构实现的项目中,各个功能模块之间是有着复杂的联系,你想用新的技术来更新项目非常困难,你必须更改每一个模块的代码,需要付出的时间和精力实在是太大了。而微服务架构恰好解决了这个问题,每个微服务都是独立的,想用什么技术就用什么技术,并且微服务的体积通常都是很小的,即使需要使用新的技术来更新也不会太过复杂。除此之外,微服务还解决了单体架构中软件扩展困难、维护困难、复杂性高等问题,这就是为什么微服务越来越受欢迎的原因。
2 微服务存在的安全问题
安全问题是每一个应用在开发过程中都不能忽视的问题,尽管微服务架构的使用解决了单体架构中的许多问题,但安全问题也会更加复杂。相比于单体架构,微服务暴露了更多的可攻击面。[3]一个基于微服务的应用中,存在的安全问题可分为两类,一类是传统的安全问题,一类是微服务架构中存在的安全问题。
第一类安全问题并不是微服务架构独有的,它也存在于以前的单体架构中,比较常见的攻击有注入攻击、XSS攻击、文件上传等。[4]但这一类的安全问题现在人们已经提出了许多相对完善的防御方法了,对于开发者来说不足为虑。第二类安全问题才是使用微服务架构时需要重视的问题,这一类的安全问题有很多个方面,本文主要讲微服务系统中微服务之间访问这一方面的问题。
3 安全漏洞的处理
通过前面的分析,我们已经把系统中存在的安全漏洞都分析出来了,下一步,我们就应该“对症下药”了。在下文,我将根据现有的研究简述这两类安全问题产生的原因以及我们应该用什么样的方法来防御。
3.1 传统的安全问题
首先说一下注入攻击,注入攻击有分好几类,其中我们听得比较多的就是SQL注入。SQL注入主要是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,实现无帐号登录,甚至篡改数据库。SQL注入的本质实际上就是对提交数据检查的不充分,将提交的非法数据当成SQL语句来执行。对于这种攻击,我们常使用字符过滤和使用参数化查询(最有效的方法)来预防。
XSS攻击,即跨站脚本攻击,它是一种最普遍的WEB安全漏洞,其原理是嵌入恶意代码到WEB页面里面,用户一旦访问这个页面就会触发这些恶意代码,这时攻击者的特殊目的就可以实现了,他们可以窃取你的cookie、会话等私人信息,严重的话会造成非常大的损失。抵御这种攻击最常用的方式就是通过添加拦截器过滤请求参数来阻止恶意代码的执行。
文件上传与表单数据重复提交也是比较常见的安全问题,前者会导致一些恶意脚本文件被上传到系统中,而后者会增加服务器负载均衡,严重的时候还会造成服务器宕机。文件上传漏洞是开发者在开发过程中仅设置文件后缀检验产生的,一些恶意脚本文件可以通过修改文件后缀名等方式通过文件后缀检验进入到系统中,所以对付文件上传漏洞的最好方式就是同时设置文件后缀校验和文件格式检验。表单数据重复提交的原因有很多,可能是用户的误操作或者网络原因,也可能是攻击者刻意而为,但不管是什么样的可能性我们都要考虑到这个问题。常用的阻止表单重复提交方法有JavaScript屏蔽提交按钮、数据库添加唯一约束、利用session设置提交有效时间和AOP自定义切入,推荐使用后面两种方式。
3.2 微服务之间的访问
不管是什么样的系统,用户访问服务前为了保证系统的安全性都需要对用户进行身份认证,认证通过后才能授权给用户去访问这个服务。在单体架构中,所有的服务都是部署在同一个服务器上的,用户想访问另一个服务服务器可以通过本地方法调用的方式来实现,用户只需要进行一次身份验证。但在微服务架構里,各个微服务通常是部署在不同服务器上的,用户想访问多个微服务就要进行多次认证,非常复杂,而且还会暴露微服务的存在,让攻击者有更多的机会来攻击,安全性不够高。有没有什么方法可以让微服务之间的访问变得更安全和更简单呢?答案是肯定的,人们提出了4种解决方法,分别是单点登录(SSO)、分布式会话(Session)、客户端令牌(Token)和API网关(Gateway)。我们经常用到的解决方法就是微服务系统中使用API网关。
API网关为微服务系统提供了统一入口,起到了客户端和后台微服务应用之间的桥接作用,是微服务架构系统的重要部分。[5]API网关有着很多功能,认证授权、访问控制、负载均衡、动态路由、过滤、日志、监控和熔断等功能都是网关需要做到的。使用API网关就意味着一切的请求都交由网关来处理,用户想访问多个微服务只需要在API网关进行一次身份验证,验证通过后网关会动态地把用户的请求转发给对应的微服务来处理,这就是网关的核心功能之一的动态路由。 API网关的使用可以有效地提高系统的安全性。系统使用API网关后暴露在外部的只有API网关,微服务则被隐藏在内部网络,攻击者能攻击到的地方只有暴露在外部的网关,大大减少了系统的可攻击面,即使网关存在安全漏洞也很容易去把它堵上,不需要像之前一样去修复每一个微服务中存在的安全漏洞。为了进一步提高系统安全性,我们还可以在整个系统中都使用https协议,这样做可以确保消息载体不被纂改,保证了消息在传输过程中的安全性。
现在用于实现API网关的技术有很多,就我所知道的技术来说大体可分为三类,分别是反向代理、网络编程框架和API网关框架,而我们使用得最多的技术就是API网关框架。软件的开发是通常都有着很大的工作量,开发人员肯定是希望开发过程中的工作量越少越好了,这个时候我们就可以考虑框架的使用,API网关框架其实就是一个半成品的API网关,网关的基本功能框架已经给我们实现了,我们不需要从零开始去开发一个网关,API框架的使用可以减少软件开发中的工作量、降低开发成本、提高我们的开发效率。常见的API网关框架有Spring Cloud Gateway、Zuul、Traefik等,这些框架的学习难度、开发成本、协议、配置方式以及安全性等方面各有差异,我们需要根据我们的实际需求去选择使用的框架。
4 结语
不管是什么样的软件都存在着安全漏洞,这一点是每一个开发者都不可避免的事,我们要做到的就是分析可能存在的安全漏洞,结合一些已有的解决方法去思考我们的软件应该使用什么方法去防范,增强软件的安全性,提高攻击的难度,让攻击者们知难而退。
参考文献
[1] Fowler M,Lewis J.Microservices.http://martinfowler.com/articles/microservices.html.2014-03-25.
[2] 張晶,王琰洁,黄小锋.一种微服务框架的实现[J].计算机系统应用.2016-07-21.
[3] Microservices and Security[EB/OL].http://www.infoq.com/cn/news/2016/11/microservices-security.2016-11-15.
[4] 刘杰,葛晓玢.关于Web安全漏洞分析及防范策略[J].信息系统工程.2017-5-10.
[5] 李春阳,刘迪,崔蔚,李晓珍,李春岐.基于微服务架构的统一应用开发平台[J].计算机系统应用.2017-04-26.
项目名称:广东省大学生科技创新培育专项资金资助项目(pdjh2020b0683)
关键词:微服务;安全漏洞;应对策略
1 微服务的兴起
什么是微服务?微服务就是将单个应用程序拆分成多个小的服务的集群,每个微服务都围绕具体业务进行实现,相互之间通过轻量级通信机制,有着极少的统一管理。每个微服务可以独立部署,使用不同的编程语言,使用不同的数据存储技术。[1,2]从上面这段话我们可以知道,微服务的思想就是使用一个个独立的微服务来构成整个系统。
为什么我们不再趋向于使用以前的单一整体架构来开发?单体架构在系统规模较小时的效果确实很不错,但随着系统规模的不断扩大,出现的问题就越来越多,举一个简单的例子,技术是在不断发展的,可以说是日新月异,我们通常都会使用新的技术来更新项目,但在使用单体架构实现的项目中,各个功能模块之间是有着复杂的联系,你想用新的技术来更新项目非常困难,你必须更改每一个模块的代码,需要付出的时间和精力实在是太大了。而微服务架构恰好解决了这个问题,每个微服务都是独立的,想用什么技术就用什么技术,并且微服务的体积通常都是很小的,即使需要使用新的技术来更新也不会太过复杂。除此之外,微服务还解决了单体架构中软件扩展困难、维护困难、复杂性高等问题,这就是为什么微服务越来越受欢迎的原因。
2 微服务存在的安全问题
安全问题是每一个应用在开发过程中都不能忽视的问题,尽管微服务架构的使用解决了单体架构中的许多问题,但安全问题也会更加复杂。相比于单体架构,微服务暴露了更多的可攻击面。[3]一个基于微服务的应用中,存在的安全问题可分为两类,一类是传统的安全问题,一类是微服务架构中存在的安全问题。
第一类安全问题并不是微服务架构独有的,它也存在于以前的单体架构中,比较常见的攻击有注入攻击、XSS攻击、文件上传等。[4]但这一类的安全问题现在人们已经提出了许多相对完善的防御方法了,对于开发者来说不足为虑。第二类安全问题才是使用微服务架构时需要重视的问题,这一类的安全问题有很多个方面,本文主要讲微服务系统中微服务之间访问这一方面的问题。
3 安全漏洞的处理
通过前面的分析,我们已经把系统中存在的安全漏洞都分析出来了,下一步,我们就应该“对症下药”了。在下文,我将根据现有的研究简述这两类安全问题产生的原因以及我们应该用什么样的方法来防御。
3.1 传统的安全问题
首先说一下注入攻击,注入攻击有分好几类,其中我们听得比较多的就是SQL注入。SQL注入主要是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,实现无帐号登录,甚至篡改数据库。SQL注入的本质实际上就是对提交数据检查的不充分,将提交的非法数据当成SQL语句来执行。对于这种攻击,我们常使用字符过滤和使用参数化查询(最有效的方法)来预防。
XSS攻击,即跨站脚本攻击,它是一种最普遍的WEB安全漏洞,其原理是嵌入恶意代码到WEB页面里面,用户一旦访问这个页面就会触发这些恶意代码,这时攻击者的特殊目的就可以实现了,他们可以窃取你的cookie、会话等私人信息,严重的话会造成非常大的损失。抵御这种攻击最常用的方式就是通过添加拦截器过滤请求参数来阻止恶意代码的执行。
文件上传与表单数据重复提交也是比较常见的安全问题,前者会导致一些恶意脚本文件被上传到系统中,而后者会增加服务器负载均衡,严重的时候还会造成服务器宕机。文件上传漏洞是开发者在开发过程中仅设置文件后缀检验产生的,一些恶意脚本文件可以通过修改文件后缀名等方式通过文件后缀检验进入到系统中,所以对付文件上传漏洞的最好方式就是同时设置文件后缀校验和文件格式检验。表单数据重复提交的原因有很多,可能是用户的误操作或者网络原因,也可能是攻击者刻意而为,但不管是什么样的可能性我们都要考虑到这个问题。常用的阻止表单重复提交方法有JavaScript屏蔽提交按钮、数据库添加唯一约束、利用session设置提交有效时间和AOP自定义切入,推荐使用后面两种方式。
3.2 微服务之间的访问
不管是什么样的系统,用户访问服务前为了保证系统的安全性都需要对用户进行身份认证,认证通过后才能授权给用户去访问这个服务。在单体架构中,所有的服务都是部署在同一个服务器上的,用户想访问另一个服务服务器可以通过本地方法调用的方式来实现,用户只需要进行一次身份验证。但在微服务架構里,各个微服务通常是部署在不同服务器上的,用户想访问多个微服务就要进行多次认证,非常复杂,而且还会暴露微服务的存在,让攻击者有更多的机会来攻击,安全性不够高。有没有什么方法可以让微服务之间的访问变得更安全和更简单呢?答案是肯定的,人们提出了4种解决方法,分别是单点登录(SSO)、分布式会话(Session)、客户端令牌(Token)和API网关(Gateway)。我们经常用到的解决方法就是微服务系统中使用API网关。
API网关为微服务系统提供了统一入口,起到了客户端和后台微服务应用之间的桥接作用,是微服务架构系统的重要部分。[5]API网关有着很多功能,认证授权、访问控制、负载均衡、动态路由、过滤、日志、监控和熔断等功能都是网关需要做到的。使用API网关就意味着一切的请求都交由网关来处理,用户想访问多个微服务只需要在API网关进行一次身份验证,验证通过后网关会动态地把用户的请求转发给对应的微服务来处理,这就是网关的核心功能之一的动态路由。 API网关的使用可以有效地提高系统的安全性。系统使用API网关后暴露在外部的只有API网关,微服务则被隐藏在内部网络,攻击者能攻击到的地方只有暴露在外部的网关,大大减少了系统的可攻击面,即使网关存在安全漏洞也很容易去把它堵上,不需要像之前一样去修复每一个微服务中存在的安全漏洞。为了进一步提高系统安全性,我们还可以在整个系统中都使用https协议,这样做可以确保消息载体不被纂改,保证了消息在传输过程中的安全性。
现在用于实现API网关的技术有很多,就我所知道的技术来说大体可分为三类,分别是反向代理、网络编程框架和API网关框架,而我们使用得最多的技术就是API网关框架。软件的开发是通常都有着很大的工作量,开发人员肯定是希望开发过程中的工作量越少越好了,这个时候我们就可以考虑框架的使用,API网关框架其实就是一个半成品的API网关,网关的基本功能框架已经给我们实现了,我们不需要从零开始去开发一个网关,API框架的使用可以减少软件开发中的工作量、降低开发成本、提高我们的开发效率。常见的API网关框架有Spring Cloud Gateway、Zuul、Traefik等,这些框架的学习难度、开发成本、协议、配置方式以及安全性等方面各有差异,我们需要根据我们的实际需求去选择使用的框架。
4 结语
不管是什么样的软件都存在着安全漏洞,这一点是每一个开发者都不可避免的事,我们要做到的就是分析可能存在的安全漏洞,结合一些已有的解决方法去思考我们的软件应该使用什么方法去防范,增强软件的安全性,提高攻击的难度,让攻击者们知难而退。
参考文献
[1] Fowler M,Lewis J.Microservices.http://martinfowler.com/articles/microservices.html.2014-03-25.
[2] 張晶,王琰洁,黄小锋.一种微服务框架的实现[J].计算机系统应用.2016-07-21.
[3] Microservices and Security[EB/OL].http://www.infoq.com/cn/news/2016/11/microservices-security.2016-11-15.
[4] 刘杰,葛晓玢.关于Web安全漏洞分析及防范策略[J].信息系统工程.2017-5-10.
[5] 李春阳,刘迪,崔蔚,李晓珍,李春岐.基于微服务架构的统一应用开发平台[J].计算机系统应用.2017-04-26.
项目名称:广东省大学生科技创新培育专项资金资助项目(pdjh2020b0683)