数据安全性是指保护数据以防止非法的使用避免造成数据有意或无意的丢失洩露或破坏由于数据库系统中集中存放有大量的数据这些数据又为众多用户所共享所以安全约束是一个极为突出的问题
Oracle数据库系统在实现数据库安全性管理方面采取的基本措施有
通过验证用户名称和口令防止非Oracle用户注册到Oracle数据库对数据库进行非法存取操作
授予用户一定的权限例如connectresource等限制用户操纵数据库的权力
授予用户对数据库实体(如表表空间过程等)的存取执行权限阻止用户访问非授权数据
提供数据库实体存取审计机制使数据库管理员可以监视数据库中数据的存取情况和系统资源的使用情况
采用视图机制限制存取基表的行和列集合
在实际应用中许多系统往往采用假用户(即非数据库用户)身份来管理而真实用户的身份和登录口令就隐藏在应用系统中或经过各种压缩加密等处理的配置文件中但这样往往留下隐患只要从分析应用程序入手最终会分析出系统使用的数据库用户和口令那么其安全性也就消失了另一方面系统代码是程序员写出来的如果程序员有破坏意图这种模式没有一丝的安全因为他通过自己掌握的代码不经分析就轻而易举的获得登录用的数据库用户和口令
而采用真实数据库用户存在着权限分配上的难度特别是用户数和应用表数都很多时这时必然要使用角色来管理应用权限的分配当然不能直接将权限或角色直接分配给用户否则用户可以不同过应用系统而采用SQL*PLUS等前端工具进入系统进行一些没有经过应用系统检查的操作产生的结果可能不符合应用逻辑
我们在实践中发现可以采用另一种方式利用角色功能来防止上面出现的安全漏洞在这种方式下用户采用自己的标识和口令注册但在未得到授权的角色前是没有操纵数据库的任何权限而授权用户使用的角色是埋在应用程序中的只有应用程序才知道角色的名称和口令从而激活角色使用户拥有相应的权限在应用系统之外用户可以连接到Oracle但没有激活相应的角色他是不能做任何事情的而开发人员不知道用户的标识和口令他没有办法登录到Oracle即使他能够推算出角色的标识和口令
下面根据一个例子给出具体的实现过程
我们假设用户xiaoli在工作中能够对工资表accountpaytable(account是表paytable的拥有者)有查询和更新的权限而这些权限我们不直接授予xiaoli而是构造一个角色(比如考勤员checkerrole)这个角色恰好适合于xiaoli再将角色授予xiaoli但角色在激活时需要口令该口令不对xiaoli公开每个用户需要一个缺省的角色是用户连接到Oracle时的缺省角色这个角色只有connect权限我们假为defaultrole
下面给出具体的操作SQL
()设定各种角色及其权限
CREATE ROLE checkerrole IDENTIFIEDBYxm; CREATE ROLE defaultrole IDENTIFIEDBYdefaultrole; GRANTSELECTUPDATEONaccountpaytableTOcheckerrole; GRANTCONNECTTOdefaultrole;
()创建用户
CREATEUSERxiaoliIDENTIFIEDBYxiaoli;
()授权
GRANTcheckerroleTOxiaoli; GRANTdefaultroleTOxiaoli;
()设定用户缺省的角色
ALTERUSERxiaoliDEFAULTROLEdefaultrole;
()注册过程
CONNECTxiaoli/xiaoli@Oracle
此时用户只有其缺省角色的权限
()激活角色
SETROLEcheckerroleIDENTIFIEDBYxm;
操作成功后xiaoli拥有checkerrole的权限
这里的角色和口令是固定的在应用系统中可以由应用管理人员自行设置则更为方便安全