Spring Security3.docx

上传人:b****8 文档编号:11445713 上传时间:2023-03-01 格式:DOCX 页数:45 大小:661.28KB
下载 相关 举报
Spring Security3.docx_第1页
第1页 / 共45页
Spring Security3.docx_第2页
第2页 / 共45页
Spring Security3.docx_第3页
第3页 / 共45页
Spring Security3.docx_第4页
第4页 / 共45页
Spring Security3.docx_第5页
第5页 / 共45页
点击查看更多>>
下载资源
资源描述

Spring Security3.docx

《Spring Security3.docx》由会员分享,可在线阅读,更多相关《Spring Security3.docx(45页珍藏版)》请在冰豆网上搜索。

Spring Security3.docx

SpringSecurity3

 

SpringSecurity3

 

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

毫无疑问,安全是任何一个写于21世纪的web工程中最重要的架构组件之一。

在这样一个时代,计算机病毒、犯罪以及不合法的员工一直存在并且持续考验软件的安全性试图有所收益,因此对你负责的项目综合合理地使用安全是至关重要的一个元素。

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

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

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

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

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

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

如果你已经熟悉基本的安全术语,你可以直接跳到第二章:

SpringSecurity起步,在哪里我们将涉及这个框架的细节。

 

安全审计

这是你作为软件开发人员在JimBobCirclePantOnlinePetStore(JBCPP)工作的一个清晨,你正在喝你的第一杯咖啡的时候,收到了你主管的以下邮件:

To:

StarDeveloper

From:

SuperVisor

Subject:

安全审计

Star,

今天,有一个第三方的安全公司要审计我们的电子商务网站。

尽管我知道你在设计网站的时候已经把安全考虑在内了,但请随时解决他们可能发现的问题。

SuperVisor

什么?

你在设计应用的时候并没有过多考虑安全的问题?

似乎你有许多的东西要向安全审计人员学习。

首先,让我们花一点时间检查一下要审计的应用吧。

关于样例应用

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

这个应用的设计很简单,使得我们能够关注于重要的安全方面而不会过多关注ORM的细节和复杂的UI技术。

我们期望你能够参考其他的资料来掌握示例代码中所涉及功能的技术。

代码是基于Spring和SpringSecurity3编写而成的,但是它很容易改变为SpringSecurity2的例子。

关于SpringSecurity2和3的细节差异,可以参照第十三章:

迁移至SpringSecurity,可以作为将示例代码转换成SpringSecurity2的帮助材料。

不要以本应用作为基础去构建真实的PetStore在线应用。

本应用已经有意识的构建地简单并关注于本书所要阐述的概念和配置。

JBCPPets应用的架构

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

web层封装了MVC的代码和功能。

在示例代码中,我们使用了SpringMVC框架,但是我们可以一样容易的使用SpringWebFlow,Struts甚至是一个对Spring友好的webstack如ApacheWicket。

在一个典型使用SpringSecurity的web应用中,大量配置和参数代码位于web层。

所以,如果你没有web应用开发,尤其是SpringMVC的经验,在我们进入更复杂的话题前,你最好仔细看一下基础代码并确保你能理解。

再次强调,我们已经尽力让我们的应用简单,把它构建成一个petstore只是为了给它一个合理的名字和轻量级的结构。

可以将其与复杂的JavaEEPetClinic示例作为对比,那个示例代码展现了很多技术的使用指导。

服务层封装了应用的业务逻辑。

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

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

数据访问层封装了操作数据库表的代码。

在很多基于Spring的工程中,这将会在这里发现使用了ORM技术如hibernate或JPA。

它为服务层暴露了基于对象的API。

在示例代码中,我们使用基本的JDBC功能完成到内存数据库HSQL的持久化。

在典型的web工程中,将会使用更为复杂的数据访问方式。

因为ORM,即数据访问,开发人员对其很迷惑。

所以为了更清晰,这一部分我们尽可能的对其进行了简化。

应用所使用的技术

我们使用了一些每个Spring程序员都会遇到的技术和工具,以使得示例应用很容易的运行起来。

尽管如此,我们还是提供了补充的起步资料信息在附录:

参考资料。

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

●Eclipse3.4或3.5JavaEE版本可以在以下地址获得:

http:

//www.eclipse.org/downloads/

●SpringIDE2.2(2.2.2或更高)可以在以下地址获得:

http:

//springide.org/blog

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

你可能希望使用免费的SpringToolSuite(STS)Eclipse插件,它作为Eclipse的一个插件由SpringSource开发,其包含了下一代的SpringIDE功能(可以在以下地址下载:

我们提供了Eclipse3.4兼容的工程以允许你在Eclipse中构建和部署代码到Tomcat6.x的服务器上。

鉴于大多数开发人员熟悉Eclipse,所以我们觉得这是最直接的方式来打包示例代码。

我们为这些例子提供了ApacheAnt的脚本以及ApacheMaven的modules。

不管你熟悉开发环境,我们希望你能够在阅读本书的时候能够运行示例代码。

另外,在阅读过程中,你可能会愿意去下载Spring3和SpringSecurity3的源码版本。

如果你有不明白的地方或想获取更多的信息,他们的JavaDoc和源码是最好的参考资料,他们提供的示例也能够提供额外的帮助并消除你的疑惑。

查看审计结果

让我们回到e-mail并看一下审计的进展。

哦,结果貌似并不好啊:

To:

StarDeveloper

From:

SuperVisor

Subject:

FW:

SecurityAuditResults

Star,

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

SuperVisor

审计结果:

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

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

●授权不合理甚至缺失;

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

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

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

●危险等级:

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

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

公司(或他们的合作伙伴、顾客)会雇佣第三方的安全专家来审计他们软件的安全性。

审计过程会联合使用破解,代码检查以及与开发人员和架构师的正式或非正式交流。

安全审计的通常目标是保证基本的安全开发措施被遵守以实现客户数据和系统功能的完整性和安全性。

依靠软件业所追求的工业化目标,审计人员可能会使用工业化的标准或特定的方式来进行这些测试。

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

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

认证

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

认证是在开发安全应用中,你必须记住的两个关键词之一(另外一个是授权)。

认证识别系统中的某一个用户,并将其与一个可信任的(即安全的)实体关联。

一般来讲,软件系统会被分为两个层次的访问范围,如未认证通过的(或匿名的)和认证通过的,如下图所示:

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

匿名区域不会:

●要求用户登录系统;

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

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

未认证的系统区域可供任何人使用,即使该用户没有被系统所识别。

但是,有可能对于已认证的用户会看到更多的信息(如随处可见的欢迎{名字}文本)。

SpringSecurity的标签库可以完全支持对登录用户进行有区别的显示,这部分内容将在第五章:

精确的访问控制中介绍。

我们将在第二章中解决这个发现的问题并使用SpringSecurity的自动配置功能实现一个基于表单的认证。

更复杂的表单认证(通常用来用在与企业系统集成或外部的认证存储)将在本书的第二部分进行讲解,这部分从第八章:

对OpenID开放开始。

授权

授权不合理甚至缺失

授权是两个重要安全概念中的第二个,它对实现和理解应用安全很重要。

授权保证授权过的用户能够对功能和数据进行恰当的访问。

构建应用的安全模块的主要任务是拆分应用的功能和数据并将权限、功能和数据、用户结合起来,以实现对这些内容的访问能够被很好的控制。

在审计中,我们的应用在这一点的失败表明应用的功能没有按照用户角色进行限制。

试想一下,你正在运行一个在线购物系统,查看、取消或修改订单以及用户的信息对所有的用户可见!

(这将是多么恐怖的事情)

我们将会在第二章通过使用SpringSecurity的授权模块解决基本的授权问题,接着会有关于授权更高级的知识介绍,其中在第五章介绍web层,在第六章:

高级配置和扩展中介绍业务层。

数据库认证安全

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

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

因为应用中包含了个人和财务的信息,一个恶意的用户如果能够非法访问任何数据都会导致公司信息的泄露。

保护能够进入系统的凭证信息对我们来时是最重要的事情,最重要的第一步是保证在安全上一个点的失败不会连累整个系统。

我们将会在第四章:

凭证安全存储中检查SpringSecurity的数据访问层以实现凭证存储的安全配置,那里将会用到JDBC连接。

在第四章中,我们同时也会学习一些内置的技术以增强保存在数据库中密码的安全。

敏感信息

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

审计人员指出一些重要和敏感的数据,包括信用卡号,在系统中的任何地方都没有加密或混淆。

这除了是缺乏数据设计的一种典型表现外,对信用卡号缺少保护也是违反PCI标准的。

幸运的是,基于SpringSecurity的注解式AOP支持,我们可以使用一些简单的设计模式和工具来安全的保护这些信息。

我们将会在第五章中阐述在数据访问层保护这种数据的一些技术。

数据传输层保护

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

在现实世界中,很难想象一个在线的商业网站不使用SSL保护;不幸的是,我们的JBCPPet正是这样。

SSL保护能够保证在客户端浏览器和web应用服务器之间的通信是安全的,可以防护多种的信息篡改和窥探。

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

使用SpringSecurity解决安全问题

SpringSecurity提供了丰富的资源,许多安全的通用问题都可以用非常简单的声明或配置来解决。

在接下来的章节中,我们将会通过源代码和应用配置的不断改进来解决安全审计人员提出的所有问题(甚至更多),同时会对我们应用的安全性树立信心。

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

●细分系统的用户类别;

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

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

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

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

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

为什么使用SpringSecurity?

SpringSecurity的存在填补了众多java第三方类库的一个空白,正如Spring框架第一次出现时那样。

一些业界的标注如JAAS或JavaEESecurity确实提供了一些方式来解决认证和授权问题,但是SpringSecurity是一个胜出者,因为它以一种简明和合理的方式封装了各个层的安全解决方案。

除此以外,SpringSecurity提供了与很多通用企业认证系统的内置集成支持。

所以,对开发者来说,它通过很少的努力就能适应绝大多数的场景。

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

小结

在本章中,我们:

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

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

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

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

 

第二章SpringSecurity起步

在本章中,我们将要学习SpringSecurity背后的核心理念,包括重要的术语和产品架构。

我们将会关注配置SpringSecurity的一些方式以及对应用的作用。

最重要的是为了解决工作中的问题,我们要开始使得JBCPPets的在线商店系统变得安全。

我们将会通过分析和理解认证如何保护在线商店的适当区域来解决在第一章:

一个不安全应用的剖析中审计人员发现的第一个问题,即缺少URL保护和统一的认证造成的权限扩散。

在本章的内容中,我们将会涉及:

●了解应用中安全的重要概念;

●使用SpringSecurity的快速配置功能,为JBCPPets在线商店实现基本层次的安全;

●理解SpringSecurity的全貌;

●探讨认证和授权的标准配置和选项;

●在SpringSecurity访问控制中使用Spring的表达式语言(SpringExpressionLanguage)

安全的核心概念

由于安全审计结果的启示作用,你研究了SpringSecurity并确定它能够提供一个坚实的基础,以此可以构建一个安全的系统来解决在安全审计JBCPPet在线商店中发现的问题,而那个系统是基于SpringWebMVC开发的。

为了SpringSecurity的使用更高效,在开始评估和提高我们应用的安全状况之前,先了解一些关键的概念和术语是很重要的。

认证

正如我们在第一章所讨论的那样,认证是鉴别我们应用中的用户是他们所声明的那个人。

你可能在在线或线下的日常生活中,遇到不同场景的认证:

●凭据为基础的认证:

当你登录e-mail账号时,你可能提供你的用户名和密码。

E-mail的提供商会将你的用户名与数据中的记录进行匹配,并验证你提供的密码与对应的记录是不是匹配。

这些凭证(用户名和密码,译者注)就是e-mail系统用来鉴别你是一个合法用户的。

首先,我们将首先使用这种类型的认证来保护我们JBCPPet在线商店的敏感区域。

技术上来说,e-mail系统能够检查凭证信息不一定非要使用数据库而是各种方式,如一个企业级的目录服务器如MicrosoftActiveDirectory。

一些这种类型的集成方式将在本书的第二部分讲解。

●两要素认证:

当你想从自动柜员机取钱的时候,你在被允许取钱和做其他业务前,你必须先插卡并输入你的密码。

这种方式的认证与用户名和密码的认证方式很类似,与之不同的是用户名信息被编码到卡的磁条上了。

联合使用物理磁卡和用户输入密码能是银行确认你可能有使用这个账号的权限。

联合使用密码和物理设备(你的ATM卡)是一种普遍存在的两要素认证形式。

专业来看,在安全领域,这种类型的设备在安全性要求高的系统中很常见,尤其是处理财务或个人识别信息时。

硬件设备如RSA的SecurId联合使用了基于时间的硬件和服务端的认证软件,使得这样的环境极难被破坏。

●硬件认证:

早上当你启动汽车时,你插入钥匙并打火。

尽管和其他的两个例子很类似,但是你的钥匙和打火装置的匹配是一种硬件认证的方式。

其实会有很多种的认证方式来解决硬件和软件的安全问题,它们各自也有其优缺点。

我们将会在本书的后面章节中介绍它们中的一些,因为它们适用于SpringSecurity。

事实上,本书的后半部分基本上都是原来介绍很多通用的认证方式用SpringSecurity的实现。

SpringSecurity扩展了java标准概念中的已认证安全实体(对应单词principal)(java.security.Principal),它被用来唯一标识一个认证过的实体。

尽管一个典型的安全实体通常一对一的指向了系统中的一个用户,但它也可能对应系统的各种客户端,如webservice的客户端、自动运行的feed聚合器(automatedbatchfeed)等等。

在大多数场景下,在你使用SpringSecurity的过程中,一个安全实体(Principal)只是简单地代表一个用户(user),所以我当我们说一个安全实体的时候,你可以将其等同于说用户。

授权

授权通常涉及到两个不同的方面,他们共同描述对安全系统的可访问性。

第一个是已经认证的安全实体与一个或多个权限(authorities)的匹配关系(通常称为角色)。

例如,一个非正式的用户访问你的网站将被视为只有访问的权限而一个网站的管理员将会被分配管理的权限。

第二个是分配权限检查给系统中要进行安全保护的资源。

通常这将会在系统的开发过程中进行,有可能会通过代码进行明确的声明也可能通过参数进行设置。

例如,在我们应用中管理宠物商店详细目录的界面只能对具有管理权限的用户开放。

【要进行安全保护的资源可以是系统的任何内容,它们会根据用户的权限进行有选择的可访问控制。

web应用中的受保护资源可以是单个的页面、网站的一个完整部分或者一部分界面。

相反的,受保护的业务资源可能会是业务对象的一个方法调用或者单个的业务对象。

你可能想象的出对一个安全实体的权限检查过程,查找它的用户账号并确定它是不是真的为一个管理员。

如果权限检查确定这个试图访问受保护区区域的安全实体实际上是管理员,那么这个请求将会成功,否则,这个安全实体的请求将会因为它缺少足够的权限而被拒绝。

我们更近距离的看一个特定的受保护资源——产品目录的编辑界面。

目录的编辑界面需要管理员才能访问(毕竟,我们不希望普通的用户能够调整我们的目录层次),因此当一个安全实体访问它的时候会要求特定等级的权限。

当我们思考一个网站的管理员试图访问受保护的资源时,权限控制决定是如何做出的时候,我们猜想对受保护资源的权限的检查过程可以用集合理论很简明的进行表述。

我们将会使用维恩图来展现对管理用户的这个决策过程:

对这个页面来说,在用户权限(普通用户和管理员)和需要权限(管理员)之间有一个交集,所以在交集中的用户将能够进行访问。

可以与没有授权的访问者进行对比:

权限集合没有交集,没有公共的元素。

所以,用户将会被拒绝访问这个界面。

至此,我们已经介绍了对资源授权的简单原理。

实际上,会有真正的代码来决定用户是允许还是被拒绝访问受保护的资源。

下面的图片在整体上描述了这个过程,正如SpringSecurity所使用的那样:

我们可以看到,有一个名为访问决策管理器(accessdecisionmanager)的组件来负责决定一个安全实体是不是有适当的访问权限,判断基于安全实体具备的权限与被请求资源所要求资源的匹配情况。

安全访问控制器对访问是否被允许的判断过程可能会很简单,就像查看安全实体所拥有的权限集合与被访问资源所要求的资源集合是不是有交集。

让我们在JBCPPets应用中简单使用SpringSecurity,并将会更详细的阐述认证和授权。

三步之内使我们的应用变得安全

尽管SpringSecurity的配置可能会很难,但是它的作者是相当为我们着想的,因为他们为我们提供了一种简单的机制来使用它很多的功能并可以此作为起点。

以这个为起点,额外的配置能够实现应用的分层次详细的安全控制。

我们将从我们不安全的在线商店开始,并且使用三步操作将它变成一个拥有基本用户名和密码安全认证的站点。

这个认证仅仅是为了阐述使用SpringSecurity使我们应用变得安全的步骤,所以你可能会发现这样的方式会有明显不足,这将会引领我们在以后的配置中不断进行改良。

实现SpringSecurity的XML配置文件

起点配置的第一步是创建一个XML的配置文件,用来描述所有需要的SpringSecurity组件,这些组件将会控制标准的web请求。

在WEB-INFO目录下建立一个名为dogstore-security.xml的XML文件。

文件的内容如下所示:

xmlversion="1.0"encoding="UTF-8"?

>

beansxmlns="http:

//www.springframework.org/schema/security"

xmlns:

xsi="http:

//www.w3.org/2001/XMLSchema-instance"

xmlns:

beans="http:

//www.springframework.org/schema/beans"

xsi:

schemaLocation="

http:

//www.springframework.org/schema/beans

http:

//www.springframework.org/schema/beans/spring-beans.xsd

http:

//www.springframework.org/schema/security

http:

//www.springframework.org/schema/security/

spring-security-3.0.xsd">

beans>

这是我们应用中获得最小安全配置的唯一一个SpringSecurity配置文件。

这个配置文件的格式使用了SpringSecurity特定的XML语法,一般称之为security命名空间。

它在XML的命

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 水产渔业

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1