技术开发 频道

应用软件系统安全性设计

【IT168技术文档】

引言
        应用程序安全涵盖面很广,它类似于OSI网络分层模型也存在不同的安全层面。上层的安全只有在下层的安全得到保障后才有意义,具有一定的传递性。所以当一个应用系统宣称自己是安全的系统之前,必须在不同层都拥有足够的安全性。
 

                                                                                                 图 1 安全多层模型

        位于安全堆栈最底层的就是传输层和系统认证的安全,考虑不周,将会引入经典的中间人攻击安全问题。再往上,就是借由防火墙,VPN或IP安全等手段保证可信系统或IP进行连接,阻止DoS攻击和过滤某些不受欢迎的IP和数据包。在企业环境下,我们甚至会用DMZ将面向公网的服务器和后端的数据库、支持服务系统隔离。此外,操作系统也扮演着重要的角色,负责进程安全,文件系统安全等安全问题,操作系统一般还会拥有自己的防火墙,也可以在此进行相应的安全配置,此外,还可以部署专业的入侵检测系统用于监测和阻止各种五花八门的攻击,实时地阻止TCP/IP数据包。再往上的安全就是JVM的安全,可以通过各种安全设置限制仅开放足够使用的执行权限。最后,应用程序自身还必须提供特定问题域的安全解决方案。本文就以漫谈的方式聊聊应用系统本身的安全问题。

1  应用系统安全涉及哪些内容
1)系统级安全
如访问IP段的限制,登录时间段的限制,连接数的限制,特定时间段内登录次数的限制等,象是应用系统第一道防护大门。
2)程序资源访问控制安全
对程序资源的访问进行安全控制,在客户端上,为用户提供和其权限相关的用户界面,仅出现和其权限相符的菜单,操作按钮;在服务端则对URL程序资源和业务服务类方法的的调用进行访问控制。
3)功能性安全
功能性安全会对程序流程产生影响,如用户在操作业务记录时,是否需要审核,上传附件不能超过指定大小等。这些安全限制已经不是入口级的限制,而是程序流程内的限制,在一定程度上影响程序流程的运行。
4)数据域安全
数据域安全包括两个层次,其一是行级数据域安全,即用户可以访问哪些业务记录,一般以用户所在单位为条件进行过滤;其二是字段级数据域安全,即用户可以访问业务记录的哪些字段;

        以上四个层次的安全,按粒度从粗到细的排序是:系统级安全、程序资源访问控制安全、功能性安全、数据域安全。不同的应用系统的系统级安全关注点往往差异很大,有很大部分的业务系统甚至不涉及系统级安全问题。无明显组织机构的系统,如论坛,内容发布系统则一般不涉及数据域安全问题,数据对于所有用户一视同仁。

        不同的应用系统数据域安全的需求存在很大的差别,业务相关性比较高。对于行级的数据域安全,大致可以分为以下几种情况:
        大部分业务系统允许用户访问其所在单位及下级管辖单位的数据。此时,组织机构模型在数据域安全控制中扮演中重要的角色;
       也有一些系统,允许用户访问多个单位的业务数据,这些单位可能是同级的,也可能是其他行政分支下的单位。对于这样的应用系统,一般通过数据域配置表配置用户所有有权访问的单位,通过这个配置表对数据进行访问控制;

        在一些保密性要求比较高系统中,只允许用户访问自己录入或参与协办的业务数据,即按用户ID进行数据安全控制。
         还有一种比较特殊情况,除进行按单位过滤之外,数据行本身具有一个安全级别指数,用户本身也拥有一个级别指数,只有用户的级别指数大于等于行级安全级别指数,才能访问到该行数据。如在机场入境应用系统,一些重要人员的出入境数据只有拥有高级别指数的用户才可查看。

        一般业务系统都有行级数据域控制的需求,但只有少数业务系统会涉及字段级数据域控制,后者控制粒度更细。字段级数据域安全一般采用以下两种方式:
        通过配置表指定用户可以访问业务记录哪些字段,在运行期,通过配置表进行过滤。
        业务表的业务字段指定一个安全级别指数,通过和用户级别指数的比较来判断是否开放访问。
程序资源访问控制安全的粒度大小界于系统级安全和功能性安全两者之间,是最常见的应用系统安全问题,几乎所有的应用系统都会涉及到这个安全问题。此外,程序资源访问控制安全的业务相关性很小,容易总结出通用的模型,甚至可以通过的框架解决,如最近开始流行的Acegi安全框架就为解决该问题提供了通用的方案。

2  程序资源访问控制分为客户端和服务端两个层面
        类似于表单数据校验分为服务端和客户端校验两个层面,程序资源访问控制也可分为服务端和客户端访问控制两个层面。
客户端程序资源访问控制是对用户界面操作入口进行控制:即用户的操作界面是否出现某一功能菜单,在具体业务功能页面中,是否包含某一功能按钮等。客户端程序资源访问控制保证用户仅看到有权执行的界面功能组件,或者让无权执行的功能组件呈不可操作状态。简言之,就是为不同权限的用户提供不同的操作界面。

        服务端程序资源访问控制是指会话在调用某一具体的程序资源(如业务接口方法,URL资源等)之前,判断会话用户是否有权执行目标程序资源,若无权,调用被拒绝,请求定向到出错页面,反之,目标程序资源被成功调用。
服务端的控制是最重要和最可靠的保障方式,而客户端的控制仅仅是貌似安全,实则存在隐患,不过它提高了用户界面的清洁度和友好性,否则需要等到用户点击了界面操作组件后,服务端才返回一个“您无权访问该功能”之类的报错信息,未免有“误导犯错”的嫌疑。所以,一个完善而友好的程序资源访问控制最好同时包括服务端和客户端两个层面的控制,如下图所示:
                                                                   
                                                                                 图 2 完善的程序资源访问控制模型
   假设,某一用户直接通过输入URL试图绕过客户端的控制直接发起对目标程序资源的调用,服务端作为最后的防线,将成功阻止用户的越权行为。

0
相关文章