保护多承租 SaaS 应用程序

本文介绍了一种在多租户Java SaaS应用中实施安全性的方法,通过整合Spring Security和Apache Directory Server,确保数据和配置的安全隔离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

软件即服务(Software as a Service,SaaS)应用程序多承租的性质决定了安全性是一个关键的问题。本文介绍了一个保护多承租 Java™ 应用程序的可行的、实用的方法,即结合使用开源 Spring Security 框架和 Apache Directory Server。作者通过一个多承租示例 Web 应用程序来展示这个方法。
企业中的 SaaS

这些年 SaaS 开始繁荣起来了。越来越多的公司都转向这个随需应变的解决方案来更快地响应业务需求,降低成本。Forrester Research 于 2007 年进行的一项调查发现,有 16% 的大型企业和 15% 中小型企业都在使用 SaaS。而且每年分别以 33% 和 50% 的速度增长(参见 参考资料)。事实上,根据 Saugatuck Technology,2008 年 5 月 的统计,“到 2012 年时,超过 100 个员工的商业组织会有 70% 以上已经配备了至少一个 SaaS 应用程序”。

SaaS 能够提供宿主的软件应用程序,并且可能向未开发市场领域提供服务,从而使服务供应商实现规模经济。SaaS 的多承租 的最大优点是:它允许服务供应商向多个客户机组织提供服务(参见 参考资料)。在 SaaS 应用程序中有很多用户共享相同的资源,所以保护它的最好的方法就是对数据和配置(基于承租者 ID)进行逻辑分区,从而确保多承租的安全。

本文展示了如何实现第一道有效防线来保护基于 Java 的多承租 SaaS 应用程序。该解决方案结合使用了 Spring Security(一个经久不衰的开源安全框架)和 Apache Directory Server(一个基于 Java 的流行服务器,它是开源的并且遵从 Lightweight Directory Access Protocol v3,即 LDAP v3)。本文提出的解决方案是一个 示例 Java Web 应用程序,它既可以部署到 Apache Tomcat,也可以部署到 Apache Geronimo。

本文重点介绍 SaaS 模型内的身份验证和授权机制。其他有关 SaaS 安全性的概念和技术 — 比如数据保密与隔离、法规、审计和密码等,超出了本文的范围。

多承租的 SaaS 应用程序中的身份验证与授权

身份验证和授权是现实应用程序的安全性概念中主要的两个:

  • 身份验证 允许一个应用程序在连接时验证一个人(或一个应用程序、智能卡等)是否与它声明的一样。

  • 授权 定义一个用户在一个系统上的权利与权限。用户身份验证通过之后,授权会决定该用户在系统上有权做什么。因此,授权应该发生在身份验证之后。

身份验证和授权在 SaaS 应用程序中很复杂。在一个安全性 SaaS 解决方案中,底层的身份验证和授权基础设施有两种设计方法:集中式或联邦式。本文提出的解决方案使用集中式身份验证系统(LDAP 服务器)。集中式的身份验证系统并不排除支持分布式目录的可能性,分布式目录储存了可以分区和复制的信息。本文不考虑采用另一种分散式处理方法,即联邦身份管理。在 SaaS 领域用联邦身份管理会给安全性带来很多新的挑战。(典型的用例会涉及到跨域、基于 Web 的单点登录、跨域用户帐户供应、跨域授权管理和跨域用户属性交换等。详细信息请参见 参考资料,里面的文章链接 “Meeting the SaaS Security Challenge” 有详细的解释)。





回页首


Spring Security 简介

Spring Security:比 Acegi 的功能更强大
Spring Security 从 2003 年开始作为 Spring 的 Acegi Security System,直到 2007 年年末它才成为一个官方的 Spring 项目,并重命名为 Spring Security。我们推荐使用 Spring Security(而不是 Acegi)有以下几点原因:
  • 它具备 Acegi 的所有优点,并且有额外的优点。
  • 它利用自定义 Spring 2.0 配置名称空间。
  • 复杂的安全性细节现在隐藏在更简单的 XML 配置之后。
  • 它具有自动配置的能力。

在默认情况下,Java Enterprise Edition(Java EE)5 安全机制不支持承租者 ID(tenant ID)等自定义属性,不管它们是什么样的验证者类型(basic,form,digest 或 client certificate)。要支持多承租就必须要实现自定义的解决方案。在本文中,我们将展示如何使用 Spring Security 来构建这样的解决方案。

Spring Security 提供了一个综合的安全解决方案,这个方案大大地简化了在 Java EE 应用程序中开发安全措施的工作。它提供了更高级的摘要,能够让您插入不同的身份验证模型,同时还支持丰富的身份验证功能。此外,它还在不同的应用程序服务器之间提供了高度可移植性。Spring Security 有以下特性:

  • 声明性安全性
  • 支持各种身份验证和授权机制,如 basic、form、digest、JDBC 和 LDAP
  • 支持方法级别的安全性以及 JSR-250 安全性注释
  • 支持单点登录
  • 支持容器集成
  • 支持匿名对话、并行对话、remember-me、通道加强等

本文的重点是直接集成 Spring Security 和 LDAP。其他的部署场景可能会考虑到其他的方法,如 Java 身份验证和授权服务(Java Authentication and Authorization Service,JAAS),或者是由 Spring Security 框架提供的容器适配器进行的容器管理身份验证。





回页首


LDAP 与 Apache Directory 概述

在企业中,管理用户和角色的常见方法是使用 LDAP 服务器。有几个开源的商业 LDAP 解决方案可供选择(参见 参考资料)。考虑到有些读者可能不熟悉 LDAP 或 Apache Directory Server,接下来我们对其进行概述。

LDAP 的核心

LDAP 本质上就是一个数据库。但它趋向于包含更多描述性的、基于属性的信息。由于 LDAP 目录中的信息的读多于写,所以 LDAP 被设计为读最优化。最常见的例子就是电话簿,它里面的每一人都附有地址和电话号码。

作为身份验证和授权源,LDAP 与关系数据库管理系统性相比有以下优点:

  • 有线协议;无需驱动器
  • 灵活的模式
  • 以身份为中心
    • 身份验证、授权和审计
    • 安全性(密码、证书)

Apache Directory Server 的核心

Apache Directory Server 是一个可嵌入的、可扩展的、遵从标准的开源 LDAP 服务器,它由 Java 语言编写而成。我们为本文的解决方案选择 Apache Directory Server 的理由是它的简单性,因为它是一个纯 Java 实现。对于现实中的应用程序,您一定要正确衡量哪一个 LDAP 解决方案最符合您的业务和技术需求。

Apache Directory 项目提供了一个 Apache Directory Server,它遵从 LDAP v3 和 Apache Directory Studio,后者是一组基于 Eclipse 的目录工具(参见 参考资料)。





回页首


在多承租的环境中集成 Spring Security 和 Apache Directory Server

在一般情况下,配置 Spring Security 使其能够协同 LDAP 服务器进行工作很简单。虽然在多承租的环境中集成它们也相对容易,但还是比一般情况复杂些。我们首先论述如何在 Apache Directory Server 中创建一个多承租用户注册表,然后再展示一个动态 LDAP 路由解决方案如何为一个有效的多承租安全性解决方案提供便利。

多承租 Apache Directory Server 用户注册表

本小节描述一个示例多承租用户注册表,它由两个安全性区域组成,名为 tenant1 和 tenant2,每一区域个都有两组不同的用户:管理员和访问者。每一组都链接着许多用户,这些用户共用一个特定角色,而且都属于该组的相应安全区域。

不同区域的用户凭证储存于一个 Apache Directory Server 用户注册表中,位于不同的子树下,如 图 1 所示。将不同的 LDAP 后缀分配给不同的安全区域。例如,tenant1 的基本专有名称(Base Distinguished Name,DN)是 [dc=tenant1, dc=com],tenant2 的基本 DN 为 [dc=tenant2, dc=com]。


图 1. 多承租 LDAP 用户注册表示例
多承租 LDAP 用户注册表示例

然后,不同的用户组(在现实中转换成了用户角色)会被分配到对应的每一个安全区域。例如,组 [cn=adm, ou=groups] 和组 [cn=gst, ou=groups](分别转换成管理员和访问者)属于基本 DN 为 [dc=tenant1, dc=com] 的 tenant1 安全区域。

反过来,不同的用户条目与一个特定安全区域下的特定组相关联。例如,用户 [uid=tenant1admin, ou=people] 被赋予管理员的角色 [cn=adm, ou=groups] ,属于安全区域 [dc=tenant1, dc=com]。

一定要在 Apache Directory Server 中的 server.xml 配置文件(Apache Directory Server Install Directory/instances/default/conf/server.xml)中为 图 1 中的每一个安全区域创建一个新的分区和安全上下文条目,如 清单 1 所示:


清单 1. Apache Directory Server 的 server.xml 文件
				<?xml version="1.0" encoding="UTF-8"?>
<spring:beans xmlns:spring="http://xbean.apache.org/schemas/spring/1.0"
xmlns:s="http://www.springframework.org/schema/beans"
xmlns="http://apacheds.org/config/1.0">
...
<jdbmPartition id="tenant1" cacheSize="100" suffix="dc=tenant1,dc=com"
optimizerEnabled="true" syncOnWrite="true">
<indexedAttributes>
<jdbmIndex attributeId="1.3.6.1.4.1.18060.0.4.1.2.1" cacheSize="100"/>
<jdbmIndex attributeId="1.3.6.1.4.1.18060.0.4.1.2.2" cacheSize="100"/>
<jdbmIndex attributeId="1.3.6.1.4.1.18060.0.4.1.2.3" cacheSize="100"/>
<jdbmIndex attributeId="1.3.6.1.4.1.18060.0.4.1.2.4" cacheSize="100"/>
<jdbmIndex attributeId="1.3.6.1.4.1.18060.0.4.1.2.5" cacheSize="10"/>
<jdbmIndex attributeId="1.3.6.1.4.1.18060.0.4.1.2.6" cacheSize="10"/>
<jdbmIndex attributeId="1.3.6.1.4.1.18060.0.4.1.2.7" cacheSize="10"/>
<jdbmIndex attributeId="dc" cacheSize="100"/>
<jdbmIndex attributeId="ou" cacheSize="100"/>
<jdbmIndex attributeId="krb5PrincipalName" cacheSize="100"/>
<jdbmIndex attributeId="uid" cacheSize="100"/>
<jdbmIndex attributeId="objectClass" cacheSize="100"/>
</indexedAttributes>
<contextEntry>#tenant1ContextEntry</contextEntry>
</jdbmPartition>
...
<spring:bean id="tenant1ContextEntry"
class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<spring:property name="targetObject">
<spring:ref local='directoryService'/>
</spring:property>
<spring:property name="targetMethod">
<spring:value>newEntry</spring:value>
</spring:property>
<spring:property name="arguments">
<spring:list>
<spring:value xmlns="http://www.springframework.org/schema/beans">
objectClass: top
objectClass: domain
objectClass: extensibleObject
dc: tenant1
</spring:value>
<spring:value>dc=tenant1,dc=com</spring:value>
</spring:list>
</spring:property>
</spring:bean>
...
</spring:beans>

同样地,要像 tenant1 那样为 tenant2 添加一个新的分区和安全性上下文条目。示例 Web 应用程序 中有一个简单的示例 .server.xml 文件。

创建了安全区域后,就可以使用 LDIF Import Wizard —— Apache Directory Studio Eclipse 插件中的特色工具(参见 参考资料)—— 将类似于 清单 2 中的 LDAP Date Interchange Format(LDIF)文件的内容导入到其相应的安全性区域中。示例 Web 应用程序 提供示例 LDIF 文件。


清单 2. tenant1_users.ldif




本文转自IBM Developerworks中国

      请点击此处查看全文


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值