刘志涛,周 淦
(华北计算机系统工程研究所,北京 100083)
面对着日益严峻的用户数据和应用安全问题,企业如何更加安全[1]有效地保护用户隐私数据越来越受到重视[2]。在程序应用中,当访问用户敏感信息时,都需要经过认证和授权,并且对用户数据加密,禁止明文存储。软件开发者需要一个简单、强大和有效的Web安全框架,从用户的认证、授权和数据加密的各个环节保证企业应用的安全性。
一个功能强大并且容易使用的安全框架,需要具有身份认证、授权、数据加密和会话管理等功能[3-4]。借助其简单高效的框架接口,让软件开发者可以轻松地保护任何应用程序。
Web安全架构需具有的主要功能组件:
(1)身份认证[5]:验证用户是不是拥有相应的身份,通常是验证用户登录应用时提供的用户名和密码是否正确。
(2)权限验证:当用户的身份认证通过后,用户开始访问企业提供的服务或者资源,只有具有相应权限的用户才能访问,即验证用户是否具有相应资源的读写权限[6]。
(3)会话管理:当用户登录应用后,后台应用需要记录用户的访问时间、访问记录和信息修改,方便企业对用户提供个性化的服务,提高用户的满意度,让企业更懂用户,更深层次挖掘用户的需求。
(4)数据加密[7]:企业需要对用户的数据加密,避免明文存储。当安全事件发生后,加密的数据无论是对于破坏者还是具有不良企图的攻击者,都是一层简单有效的数据保护,可以最大程度地减少企业的经济损失。
(5)缓存:企业应用特别是计算密集型的应用,如何有效减少响应延迟,最大程度地提高应用效率,通常的做法会对使用频率高并且计算成本比较高的数据进行缓存。
(6)分布式应用:企业应用通常面对的用户数量比较大,单体应用已经不能满足互联网企业的用户群体,如何更好地利用多核处理器的性能,并且横向扩展更加容易的分布式应用成为越来越多的企业开发的选择。
通过了解Web安全应用需要的功能,可以知道如何解决软件开发者面临的各种问题。外部框架应该提供简单应用的开发接口,内部框架可以使开发者根据企业应用的实际需要灵活地定制自己的认证策略和授权策略。
1.2.1安全应用的访问控制概念
从安全应用的外部框架,主要涉及用户、安全管理器和域三个概念。当应用程序被访问时,自然而然想到谁是当前用户,当前用户允许执行什么操作,因此,应用程序在考虑安全性时首先基于当前用户。
安全框架的用户是一个泛指概念,即“当前正在执行的用户”,在安全领域,不单单指人,也可以是第三方的流程、守护程序或者任何相似概念的访问者。用户的获取需要安全管理器,安全管理器管理所有用户的安全操作,与应用的程序的交互都需要安全管理器管理相应的用户,使得它成为安全框架的核心。通常可根据应用程序的实际需要,在数据库、配置文件中配置相应的用户、权限或者角色,使开发者清楚地知道谁可以访问应用程序以及执行什么样的操作。
1.2.2安全应用的访问控制架构设计
如图1所示,从安全应用的角度,该架构具有很多灵活的组件,相比其他架构具有其他安全架构不具备的优点:
图1 安全应用访问控制框架
(1)架构的每个组件均可插拔,除了有默认的功能组件外,还可以根据实际需要开发定制。
(2)支持一个或多个可插拔的数据源的身份验证,实现多数据源的交叉验证。
(3)每个组件都有缓存支持,在开发实践中可以极大地提高应用程序的性能。
(4)内置的企业会话管理,无论是Web环境还是普通应用程序中,都可以提供单点登录功能[8];如果应用是集群或者分布式环境,组件具有横向良好的扩展性。
(5)异构的客户端访问,常见异构的客户端都可以访问安全架构,而且支持不同客户端的会话共享功能。
(6)功能强大而且需要的配置少,可以保护任何URL或者资源,自动处理登录和注销,执行记住我等功能。
(7)简单的单点登录(SSO)支持搭载企业会话管理。如果会话跨多个应用程序联合,则也可以共享用户的身份验证状态。登录到任何应用程序,其他人都识别登录。
日常开发中,首先需要对用户进行认证,验证用户是否是其声明的身份,当用户访问某项资源时,再查看用户的角色或者权限,以决定是否允许访问。
安全应用进行用户身份认证,可有效地分解成三个不同的步骤:
(1)收集身份和凭证
应用中一般都是使用用户名和密码作为身份和凭证对,相应地使用用户密码令牌来封装用户登录时的用户名和密码。安全框架通过认证接口,存储用户的密钥对,在系统内部实例化认证信息实体。也可以个性化定义和创建需要认证的令牌。
(2)提交身份和凭证
身份和凭证被收集并装载到认证令牌的实例中后,需要把令牌提交给安全应用来进行身份认证,尝试获取到当前交互的用户后,调用登录方法发出登录认证请求,将认证信息实体提交给内部自定义的认证策略,来进行下一步的验证用户流程。
(3)验证身份和凭证
应用程序会从内部定义的安全数据域获取相应用户的认证实体,与用户提交的认证令牌进行比对,如果验证通过,意味着当前用户为声称的实体本身,并返回内部系统的认证实例。然而,如果此时没有系统验证,根据验证策略,可以设置最大的用户登录次数,防止不明用户的恶意攻击,造成系统的瘫痪[9]。
在调用登录方法发起认证请求后,承载着用户登录信息的认证令牌实例就会经由安全管理器转交给认证器。认证器会应用认证策略来完成与单个或多个数据域的校对,每个数据域都会有自己的认证数据的方法来对已提交的令牌进行身份验证尝试。可以对用户的多个维度信息进行验证,若大部分的安全域信息验证通过,就可以认为当前用户通过了安全认证并返回真,否则系统内部会抛出认证错误信息的异常。如图2所示。
图2 访问控制认证流程
如图3所示,应用程序会收集当前用户执行操作的权限标识符,通过授权接口传递给系统内部,授权流程会从相应的安全数据域获取用户的权限信息。授权策略会对系统内部的权限实体与用户执行操作的权限实体进行验证。授权器首先会利用权限解释器把字符串转换成相应的权限实例,然后通过数据域中的授权函数获取数据源中的用户的角色和权限,与传入的角色和权限进行匹配和比较。
图3 访问控制授权流程
数据资源常见的操作是创建、读取、写入和删除,在定义资源权限时,只会对指定资源(文件、客户记录等)上的操作设定访问权限。如何细粒度、多层次地控制用户对资源的访问,还缺少一个有效的权限设计策略。基于通配符权限概念来设计权限系统,可以从资源级别、实例级别和操作级别、指定用户的权限访问标识,更好地保护系统应用和数据安全。
访问控制粒度表示所访问资源的操作的范围大小,按照访问层级的不同,访问控制粒度可以划分为接入级、目录级、角色级和属性级访问控制安全。
3.1.1接入级访问控制
接入级访问控制是网络应用和网络设备的最前端保护。在接入级控制哪些用户可以访问系统应用以及访问哪些资源,另外,可以控制用户的访问时间段和访问次数,在合法用户访问服务器或者工作站等网络设备时,进行相应的安全访问控制,如图4所示。
图4 接入级访问控制流程图
3.1.2目录级访问控制
以目录为控制粒度单位,控制用户的权限访问。例如,具有某种权限的用户才能访问根目录,具有某种权限的用户才能访问二级目录。网络资源通常以目录的形式进行组织,方便对网络资源的分类,使得可以对不同重要级别的资源分配不同的访问策略。
3.1.3角色级访问控制
将用户进行角色分配,同一角色拥有相同的权限,不同的用户可以拥有一个或者多个角色。角色是将网络资源的权限控制进行分组,可以限制用户进入系统应用后资源的访问控制,防止随意操作网络资源,造成系统重要数据的丢失或者破坏。
3.1.4属性级访问控制
资源文件的所属目录和文件本身都具有访问控制属性,比如文件的读取、写入和执行属性,以及用户具有什么操作权限,用户相应的组具有什么操作权限和其他人的操作权限。预先定义的网络资源的访问控制属性表,可以说明用户对于网络资源的使用限制。
权限本质上是访问控制,即控制用户可以在应用程序中访问的内容,例如资源、网页和文件等。大多数的用户可以通过使用角色或者权限概念来执行访问控制,即用户是基于分配给他们的角色来被允许执行哪些操作。基于通配符权限设计方法可以将资源与权限进行抽象并通过组合链的方式逐层验证,使得资源的安全策略非常灵活,甚至支持实例级的访问控制。
3.2.1通配符权限的多层次
通配符权限设计方法支持权限设计的层级化,如何更加细粒度标识用户对于资源的访问权限也是通过层级化来强化的。例如:file:read:file89,权限的层次是通过冒号分隔符表示的,冒号越多代表着权限定义的粒度越细。在上述权限表示符中,第一部分表示被抽象的资源(文件),第二部分标识需要资源进行什么操作(读取),第三部分标识资源的具体实例(文件名),因此通过冒号分隔符可以构建非常复杂的资源访问控制权限。
如果用户具有某个资源的多个访问权限,那么相同层级的权限标识符之间用逗号分隔。例如,file:read,write,即用户具有对于这个文件的读取和写入权限。如果需要表示用户具有对某一类资源的所有权限,可以使用*来表示。例如:file:*,就是将文件资源的所有的实例与所有操作都赋予用户。
3.2.2通配符权限的权限检查
基于通配符的权限设计具有横向扩展性,使得在系统权限设计时,可以在粒度的选择上赋予用户较粗的粒度或者较细的粒度。这使得在Web应用中,权限的授权逻辑不仅仅是比对权限标识符是否相等,而是通过权限标识符的逻辑关系进行判断的。比如,如果用户被赋予file:read:*权限,当前用户也具有file:read:file1,file:read:file2等资源的访问权限,可以很清晰地看出“file:read:*”与“file:read:file1”并不相等,而是通过权限标识符的内部逻辑关系验证用户是否具有某一项权限的操作。
表1 访问权限控制对比
通过简化应用程序安全性的两个方面,即身份认证和权限授权,使得企业应用的安全性更容易理解和实现。基于权限的通配符的设计理念,轻松地将资源、操作和资源实例进行抽象,可以在应用粒度和功能粒度对资源进行访问控制,细粒度和多层级的权限访问使得开发者更容易表达对于资源的权限控制和权限赋予,通过组合也能表达更加复杂的权限。