权限是一个广泛的概念,有面向资源管理人员的,也有面向开发人员的。这里所指的权限,主要是指在对某个资源进行某种操作时,对操作者的身份要进行的限制。在一般的系统中,操作者的身份是以用户的形式表达的。因此,权限控制是针对各种非法操作所提出的一种安全保护措施。
在软件开发的过程中,使不同的用户对资源具有不同的使用权限,是一项非常重要的功能,特别是在某些安全性要求比较高的软件中,为软件加入权限控制功能,可以说成为一个安全性能的重要保障。在数据库管理软件、资源管理软件中,这项功能更为重要。
从软件安全的角度来讲,需要通过编程来控制的,就是用户、功能权限、数据权限这3个权限。
●用户:具备对资源进行操作的人的身份。
●功能权限:用户能否执行某项操作,如此用户是否能进行商品查询等。功能权限是一类比较基础的权限,赋予的值,不是Y(Yes)就是N(No),又叫做Y/N权限。
●数据权限:在用户具有了某一功能权限的基础上,规定用户可以访问的数据范围。例如,用户能够进行商品查询,也就是说有了查询商品的功能权限,但是可能只能查询
出某一种类型的商品,或者只能查询某一个时段的商品,这些都属于数据权限。
权限控制,首先是对用户进行认证,即确定什么样的用户是合法的。只有合法的用户才具有判断其权限的资格,才能被授予访问的权限。用户认证有很多方法,按照认证的形式分,主要有以下几种:
(1)用户名/密码
用户名/密码是最简单,也是最常用的用户认证方法。大量的系统都是采用这种方法。该方法是一种单因素的认证,从安全性上讲,用户名/密码方式是一种不安全的身份认证方式。其不安全性主要体现在:
●安全性依赖于密码,许多用户为了防止忘记密码,经常采用很简单的密码或者将密码简单存放,造成密码容易猜测或泄露。
●密码是静态的数据,而大量的密码验证是远程的,在验证过程中要在计算机内存和网络中传输,容易被攻击者通过各种手段截获。
●密码保存在数据库中,可能被管理员得知等。
(2)智能卡认证
智能卡是一种内置集成电路的芯片,由专门的厂商通过专门的设备生产,芯片中存储与用户身份相关的数据。和用户名/密码方式类似,由于存储于智能卡中的数据是静态的,在验证过程中也可能要在计算机内存和网络中传输,所以攻击者也可以通过各种手段(如木马程序或网络监听程序)截获,存在一定的安全隐患。
(3)动态密码技术
动态密码技术采用专门硬件,每次根据一定的密码算法生成不同的密码,每个密码只能使用一次。用户使用时,将显示的当前密码提交给服务器,当密码传输到服务器端后,认证服务器采用相同的算法计算当前的有效密码,判断两个密码是否吻合,即可实现身份认证。由于每次使用的密码动态产生,所以用户每次使用的密码不相同,即使黑客通过一定手段截获了一次密码,也无法利用这个密码来仿冒合法用户的身份。不过,如果客户端与服务器端的密码不能保持良好的同步,就可能发生合法用户无法登录的情况。因此,此方法对技术要求较高。
对于每一种认证方法,没有办法避免其缺点。当然,站在软件安全的角度,主要关心的是权限控制怎样通过编程来实现。
1.单点登录
单点登录(Single Sign-On,SSO)是权限控制开发中的一个创新。单点登录是一种身份认证管理方法。
单点登录在一些包含子系统的项目中具有广泛的应用。例如,在一个成为有机整体的部门中,网站建设的过程往往具有如下特点:
●由于历史原因,一个网站中往往有多个应用子系统,如办公自动化系统、档案管理系统、财务管理系统等,它们不是一次性开发完毕,而是在不同的时期开发完成的。
●各应用系统由于功能侧重、设计方法和开发技术有所不同,如语言、服务器环境不同等,各自的用户保存在各自的数据库中,具有自己独立的用户认证体系。用户在每个应用系统中都有独立的账号。
●随着子系统的应用整合,网站的用户可能要使用多个子系统。在这种情况下,就会造成一些问题:
●由于用户在每个应用系统中有独立的账号,进入每一个应用系统前都需要以该应用系统的账号来登录,同一个用户在多个系统中要记住多个账号和密码,登录过程烦琐。(www.xing528.com)
●一个用户离职或者账号信息改变,需要维护所有子系统中关于他的账号,如变更5个人员,一共有6个应用系统,需要重复维护30个人员信息,十分不方便。
对于应用系统和用户数目较多的企业,需要建立一个统一的登录平台。使用SSO技术可以解决以上这些问题。在单点登录系统中,每个用户只需记住一个账号和密码,登录一个平台后即可实现各应用系统的透明跳转,即企业实行统一的用户信息管理。
IBM对SSO有一个形象的解释,即“单点登录、全网漫游”。SSO有一种较为通俗的定义,即访问同一服务器不同应用中的同一用户,只需要登录一次,再访问其他应用中的受保护资源时,不再需要重新登录验证。
单点登录的应用场合很多,不过,一般情况下,和C/S应用相比,单点登录在B/S模式下用得比较多。单点登录的目的是让用户登录一次,然后可以访问各个子系统。用户登录用的账号和密码就只能有一个,但是在各个子系统中都有自己的账号和密码,怎样实现统一呢?方法有以下3种。
(1)各个子系统账号同步
该方法中,对于同一个用户而言,每个子系统账号和密码相同。如用户A需要使用X系统与Y系统,就必须在X系统与Y系统中都创建帐号,并且每个账号和密码一致,这样,用户A可以使用这个账号,保证一个账号能够登录到两个系统,如图3-6所示。但是,这种方法的代价是X、Y任一系统中用户A的信息更改,必须同步至另一系统,否则会引起数据的不一致。用户信息同步会增加系统的复杂性和管理的成本。
(2)统一存储
该方法中,各个子系统并不存储相应的用户名,所有用户的用户名存储一份,单独存放,如图3-7所示。该方法不会遇到同步问题,维护方便。但是不太现实,因为每个子系统可能本来就有自己的账号,除非将所有的账号和密码进行一次大的整理,否则无法实现统一存储,但是这样带来的代价又比较大。
图3-6 子系统账号同步
图3-7 统一存储
(3)用户映射
该方法中,保留原有系统中用户的账号,将其和新账号进行一个映射。实际操作的过程中,用户首先注册一个单点登录账号,然后针对每个应用系统映射一个该应用系统中原有的账号,并维护这些注册和绑定信息。
用户统一使用新的账号。用新账号登录子系统,在底层还是相当于用原有的账号登录,如图3-8所示。该方法既不破坏原有用户的存储,也不存在同步的问题,是一种可行性比较高的方法。
图3-8 用户映射
用户统一管理后,接下来就是单点登录的实现。一般情况下,SSO的实现机制不尽相同,大体分为session机制和Cookie机制两大类。目前大部分SSO产品采用的是Cookie机制,例如,在商用软件中,WebSphere通过Cookie记录认证信息。在Java系列中,目前能够找到的较好的开源单点登录产品CAS也采用Cookie机制。
Cookie是服务器存储在客户端的一个文件,存储的内容主要包括Cookie名、Cookie值、Cookie过期时间和Cookie所在的域等。Cookie机制的工作过程如下:
1)客户端访问任意一个子系统,服务器端读取Cookie。
2)如果Cookie中无法得到账号和密码或者其他登录信息,则服务器将页面跳转到单点登录页面。
3)客户在单点登录页面中登录,成功后,服务器端将登录信息保存在客户端Cookie中。
4)客户访问另一个子系统,服务器读取Cookie,此时服务器端可以得到相应的登录信息,取出并到数据库验证,如果成功,则视为登录成功,无需客户输入密码。
注意,由于Cookie的不安全性(如可能被禁用等),这里Cookie可能要进行一定程度的加密。另外,Cookie中保存了关于域的一些信息,因此用Cookie方式可实现SSO,域名必须相同。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。