《Spring Security 3》 【第一章】 一个不安全应用的剖析

2019-03-13 08:17|来源: 开涛

第一章   一个不安全应用的剖析

毫无疑问,安全是任何一个写于21世纪的web工程中最重要的架构组件之一。在这样一个时代,计算机病毒、犯罪以及不合法的员工一直存在并且持续考验软件的安全性试图有所收益,因此对你负责的项目综合合理地使用安全是至关重要的一个元素。

    本书的写作遵循了这样的一个开发模式,这个模式我们感觉提供了一个有用的前提来解决复杂的话题——即使用一个基于Spring3的web工程作为基础,以理解使用Spring Security3使其保证安全的概念和策略。

    不管你是不是已经使用Spring Security还是只是对这个软件有兴趣,就都会在本书中得到有用的信息。

在本节的内容中,你能够:

  检查一个虚拟安全审计的结果

  讨论web应用通常的一些安全问题

  学习软件安全中的几个核心词汇和概念

如果你已经熟悉基本的安全术语,你可以直接跳到第二章:Spring Security起步,在哪里我们将涉及这个框架的细节。

安全审计

        这是你作为软件开发人员在Jim Bob Circle Pant Online Pet Store(JBCPPets.com)工作的一个清晨,你正在喝你的第一杯咖啡的时候,收到了你主管的以下邮件:

       

        To: Star Developer <stardev@jbcppets.com>

         From: Super Visor <theboss@jbcppets.com>

        Subject: 安全审计

        Star,

        今天,有一个第三方的安全公司要审计我们的电子商务网站。尽管我知道你在设计网站的时候已经把安全考虑在内了,但请随时解决他们可能发现的问题。

                                                                                            Super Visor

什么?你在设计应用的时候并没有过多考虑安全的问题?似乎你有许多的东西要向安全审计人员学习。首先,让我们花一点时间检查一下要审计的应用吧。


关于样例应用

        尽管在本书的后续内容中我们要模拟虚拟的场景,但这个应用的设计以及我们对其进行的改造都是基于现实世界中真实使用Spring的工程。

        这个应用的设计很简单,使得我们能够关注于重要的安全方面而不会过多关注ORM的细节和复杂的UI技术。我们期望你能够参考其他的资料来掌握示例代码中所涉及功能的技术。

        代码是基于Spring和Spring Security3编写而成的,但是它很容易改变为Spring Security2的例子。关于Spring Security 2和3的细节差异,可以参照第十三章:迁移至Spring Security,可以作为将示例代码转换成Spring Security2的帮助材料。

        不要以本应用作为基础去构建真实的Pet Store在线应用。本应用已经有意识的构建地简单并关注于本书所要阐述的概念和配置。


JBCP Pets应用的架构

        本应用遵循标准的三层结构,包括web层、服务层和数据访问层,如下图所示:

web层封装了MVC的代码和功能。在示例代码中,我们使用了Spring MVC框架,但是我们可以一样容易的使用Spring Web Flow,Struts甚至是一个对Spring友好的web stack如Apache Wicket。

在一个典型使用Spring Security的web应用中,大量配置和参数代码位于web层。所以,如果你没有web应用开发,尤其是Spring MVC的经验,在我们进入更复杂的话题前,你最好仔细看一下基础代码并确保你能理解。再次强调,我们已经尽力让我们的应用简单,把它构建成一个pet store只是为了给它一个合理的名字和轻量级的结构。可以将其与复杂的Java EE Pet Clinic示例作为对比,那个示例代码展现了很多技术的使用指导。

服务层封装了应用的业务逻辑。在示例应用中,我们在数据访问层前做了一个很薄的façade用来描述如何在特殊的点周围保护应用的服务方法。

在典型的web工程中,这一层将会包括业务规则校验,组装和分解BO以及交叉的关注点如审计等。

数据访问层封装了操作数据库表的代码。在很多基于Spring的工程中,这将会在这里发现使用了ORM技术如hibernate或JPA。它为服务层暴露了基于对象的API。在示例代码中,我们使用基本的JDBC功能完成到内存数据库HSQL的持久化。

在典型的web工程中,将会使用更为复杂的数据访问方式。因为ORM,即数据访问,开发人员对其很迷惑。所以为了更清晰,这一部分我们尽可能的对其进行了简化。

应用所使用的技术

我们使用了一些每个Spring程序员都会遇到的技术和工具,以使得示例应用很容易的运行起来。尽管如此,我们还是提供了补充的起步资料信息在附录:参考资料。

我们建立使用如下的IDE以提高开发的效率并使用本书的示例代码:

Eclipse 3.4或3.5 Java EE版本可以在以下地址获得:

http://www.eclipse.org/downloads/

Spring IDE2.2(2.2.2或更高)可以在以下地址获得:http://springide.org/blog

在本书的示例和截图中,你会看到Eclipse和Spring IDE,所以我们建议你使用它们。

你可能希望使用免费的Spring Tool Suite(STS)Eclipse插件,它作为Eclipse的一个插件由Spring Source开发,其包含了下一代的Spring IDE功能(可以在以下地址下载:http://www.springsource.com/products/springsource-tool-suite-download)。一些用户不喜欢它的侵入性和SpringSource的标示,但是你如果从事Spring相关的开发,它提供了很多有用的功能。

我们提供了Eclipse3.4兼容的工程以允许你在Eclipse中构建和部署代码到Tomcat6.x的服务器上。鉴于大多数开发人员熟悉Eclipse,所以我们觉得这是最直接的方式来打包示例代码。我们为这些例子提供了Apache Ant的脚本以及Apache Maven的modules。不管你熟悉开发环境,我们希望你能够在阅读本书的时候能够运行示例代码。

另外,在阅读过程中,你可能会愿意去下载Spring 3和Spring Security 3的源码版本。如果你有不明白的地方或想获取更多的信息,他们的JavaDoc和源码是最好的参考资料,他们提供的示例也能够提供额外的帮助并消除你的疑惑。

查看审计结果

        让我们回到e-mail并看一下审计的进展。哦,结果貌似并不好啊:

              To: Star Developer <stardev@jbcppets.com>

              From: Super Visor <theboss@jbcppets.com>

              Subject: FW: Security Audit Results

              Star,

        看一下审计结果并制定一个计划来解决这些问题。

                                                                                                                                           Super Visor

审计结果:

本应用存在如下的不安全隐患:

 缺少URL保护和统一的认证造成的权限扩散;

 授权不合理甚至缺失;

 数据库认证信息不安全且很容易获取;

 个人的识别信息和敏感数据很容易获取或没有加密;

 不安全的传输层保护,没有使用SSL加密;

 危险等级:高

我们希望本应用在解决这些问题前能够下线。

哦,这些结果看起来对我们公司很不利,我们最好尽快将这些问题解决。

公司(或他们的合作伙伴、顾客)会雇佣第三方的安全专家来审计他们软件的安全性。审计过程会联合使用破解,代码检查以及与开发人员和架构师的正式或非正式交流。

安全审计的通常目标是保证基本的安全开发措施被遵守以实现客户数据和系统功能的完整性和安全性。依靠软件业所追求的工业化目标,审计人员可能会使用工业化的标准或特定的方式来进行这些测试。

收到这样的安全审计结果可能是一件令人很吃惊的事情,但是,如果你按照被要求去做,这将会是一个绝佳的机会来学习和提升软件质量,同时,这将会引领你去实现一些常规的策略来保证软件的安全性。

让我们来看一下审计人员发现的问题并制定一个计划去解决他们。

认证

缺少URL保护和统一的认证造成的权限扩散

认证是在开发安全应用中,你必须记住的两个关键词之一(另外一个是授权)。认证识别系统中的某一个用户,并将其与一个可信任的(即安全的)实体关联。一般来讲,软件系统会被分为两个层次的访问范围,如未认证通过的(或匿名的)和认证通过的,如下图所示:



匿名可访问的应用功能是用户无关的(如一个在线商店的产品列表)。

匿名区域不会:

 要求用户登录系统;

 展示敏感信息如人名、地址、信用卡号、订单等;

 提供管理系统全局的状态或数据。

未认证的系统区域可供任何人使用,即使该用户没有被系统所识别。但是,有可能对于已认证的用户会看到更多的信息(如随处可见的欢迎{名字}文本)。Spring Security的标签库可以完全支持对登录用户进行有区别的显示,这部分内容将在第五章:精确的访问控制中介绍。

我们将在第二章中解决这个发现的问题并使用Spring Security的自动配置功能实现一个基于表单的认证。更复杂的表单认证(通常用来用在与企业系统集成或外部的认证存储)将在本书的第二部分进行讲解,这部分从第八章:对OpenID开放开始。

授权

授权不合理甚至缺失

授权是两个重要安全概念中的第二个,它对实现和理解应用安全很重要。授权保证授权过的用户能够对功能和数据进行恰当的访问。构建应用的安全模块的主要任务是拆分应用的功能和数据并将权限、功能和数据、用户结合起来,以实现对这些内容的访问能够被很好的控制。在审计中,我们的应用在这一点的失败表明应用的功能没有按照用户角色进行限制。试想一下,你正在运行一个在线购物系统,查看、取消或修改订单以及用户的信息对所有的用户可见!(这将是多么恐怖的事情)

我们将会在第二章通过使用Spring Security的授权模块解决基本的授权问题,接着会有关于授权更高级的知识介绍,其中在第五章介绍web层,在第六章:高级配置和扩展中介绍业务层。

数据库认证安全

数据库认证信息不安全且很容易获取

通过检查应用的源码和配置文件,审计人员指出用户的密码在配置文件中以明文的显示存储,这会导致恶意的用户很容易通过访问到服务器进而访问应用。

因为应用中包含了个人和财务的信息,一个恶意的用户如果能够非法访问任何数据都会导致公司信息的泄露。保护能够进入系统的凭证信息对我们来时是最重要的事情,最重要的第一步是保证在安全上一个点的失败不会连累整个系统。

我们将会在第四章:凭证安全存储中检查Spring Security的数据访问层以实现凭证存储的安全配置,那里将会用到JDBC连接。在第四章中,我们同时也会学习一些内置的技术以增强保存在数据库中密码的安全。

敏感信息

个人的识别信息和敏感数据很容易获取或没有加密

                  审计人员指出一些重要和敏感的数据,包括信用卡号,在系统中的任何地方都没有加密或混淆。这除了是缺乏数据设计的一种典型表现外,对信用卡号缺少保护也是违反PCI标准的。

                  幸运的是,基于Spring Security的注解式AOP支持,我们可以使用一些简单的设计模式和工具来安全的保护这些信息。我们将会在第五章中阐述在数据访问层保护这种数据的一些技术。

数据传输层保护

不安全的传输层保护,没有使用SSL加密

在现实世界中,很难想象一个在线的商业网站不使用SSL保护;不幸的是,我们的JBCP Pet正是这样。SSL保护能够保证在客户端浏览器和web应用服务器之间的通信是安全的,可以防护多种的信息篡改和窥探。

在第五章中,我们将会介绍如何在应用的安全架构中使用传输层安全配置,包括规划应用的那些部分要使用强制的SSL加密。

使用Spring Security解决安全问题

Spring Security提供了丰富的资源,许多安全的通用问题都可以用非常简单的声明或配置来解决。在接下来的章节中,我们将会通过源代码和应用配置的不断改进来解决安全审计人员提出的所有问题(甚至更多),同时会对我们应用的安全性树立信心。

使用Spring Security 3,我们将会通过以下的变化来提高应用的安全性:

 细分系统的用户类别;

 为用户的角色授予不同级别的权限;

为不同的用户类别授予不同的角色;

为应用全局的资源使用认证规则;

为应用所有层的结构使用授权规则;

阻止常用的攻击手段以控制或窃取一个用户的session。

为什么使用Spring Security?

Spring Security的存在填补了众多java第三方类库的一个空白,正如Spring框架第一次出现时那样。一些业界的标注如JAAS或Java EE Security确实提供了一些方式来解决认证和授权问题,但是Spring Security是一个胜出者,因为它以一种简明和合理的方式封装了各个层的安全解决方案。

除此以外,Spring Security提供了与很多通用企业认证系统的内置集成支持。所以,对开发者来说,它通过很少的努力就能适应绝大多数的场景。

因为没有任何一款主流的框架与之匹敌,所以它被广泛的使用。

小结

在本章中,我们:

检查了一个不安全的web工程的风险点;

查看了示例在线商务应用的基本架构;

讨论了使示例工程安全的策略。

在第二章中,我们将会介绍Spring Security的整体架构,主要侧重于其如何扩展和配置以支持我们的应用的需要。

感谢  iteye  lengyun3566

他的博客地址:http://lengyun3566.iteye.com

他的新浪微博:http://weibo.com/1920428940

本书源代码的地址:http://www.packtpub.com/support?nid=4435


本文链接:领悟书生教程网,转自http://sishuok.com



相关问答

更多
  • aopalliance-1.0.jar aspectjrt-1.5.4.jar aspectjweaver.jar commons-codec-1.3.jar commons-collections-3.2.jar commons-logging-1.1.1.jar jstl-1.1.2.jar log4j-1.2.14.jar spring-aop-2.0.8.jar spring-beans-2.0.8.jar spring-context-2.0.8.jar spring-core-2.0.8.jar ...
  • aopalliance-1.0.jar aspectjrt-1.5.4.jar aspectjweaver.jar commons-codec-1.3.jar commons-collections-3.2.jar commons-logging-1.1.1.jar jstl-1.1.2.jar log4j-1.2.14.jar spring-aop-2.0.8.jar spring-beans-2.0.8.jar spring-context-2.0.8.jar spring-core-2.0.8.jar ...
  • 同学,超星的PDZ格式,是申请过版权专利的。按正常来说,为了版权问题,只能查看没有办法转格式或者下载的。你还是下载一个超星阅读器就行查看吧。
  • spring是一整套应用程序框架,也是一种设计思想,他实现了很多实用工具,开发者直接使用这些工具可以提高开发速度,减少代码编写量,sping最大的用途是进行对象间的解耦操作,可实现设计松散耦合的应用程序系统,以便达到更高的可维护性和可扩展性能。 spring security是基于sping core的一个具体工具实现,主要用来管理应用程序的安全性,并提供了一组用户权限的解决方案。 简单点说,以一个web应用程序举例,sping框架负责整个应用程序的构架,spring seurity负责用户登录和用户权限管 ...
  • spring
  • 以下的题没有图,只能靠题意自己画,不好意思 1.三角形中边长关系的证明 【例1】 如下图所示,∠ACB=∠ADB=90°,AC=AD,E为AB上任意一点,求证:CE=DE. 【分析】 我们仔细观察图形与条件,想到通过证明两个三角形全等来说明两条线段相等,那么证明哪两个三角形全等呢?因为已知了AC=AD,AE是公共边,我们只需知道∠1=∠2就可以了.由于已知条件中还有∠ACB=∠ADB=90°的条件,这样我们马上想到通过证明两个直角三角形全等来证明∠1=∠2. 证明: 在Rt△ABC和Rt△ABD中,AB=A ...
  • spring是一整套应用程序框架,也是一种设计思想,他实现了很多实用工具,开发者直接使用这些工具可以提高开发速度,减少代码编写量,sping最大的用途是进行对象间的解耦操作,可实现设计松散耦合的应用程序系统,以便达到更高的可维护性和可扩展性能。 spring security是基于sping core的一个具体工具实现,主要用来管理应用程序的安全性,并提供了一组用户权限的解决方案。 简单点说,以一个web应用程序举例,sping框架负责整个应用程序的构架,spring seurity负责用户登录和用户权 ...
  • 一种方法是在xml中配置http安全性。 以下是一个样本 您可以尝试的另 ...
  • Java类是状态和行为的描述。 该类的实例是可以表现出行为的国家的持有者。 所以,这个班 public class Foo { private String bar; public Foo(String bar) {this.bar = bar;} public void print() {System.out.println(bar);} public void setBar(String bar) {this.bar = bar;} } 描述了一个数据结构,它具有Str ...