在医院信息系统的日常维护工作中,经常会有这样的需求:
技术人员需要通过SQLPlus、PLSQL Developer等工具连接到数据库来开展工作,拥有最高权限的管理员不得不把应用系统的管理员帐号和密码告诉相关人员,这些人员可能有以下几类:
信息中心的软件维护人员、数据库维护人员
各种应用系统厂商的技术支持人员、实施人员
数据库系统的维保人员
各种接口开发人员
……
这么多人都掌握了同一个数据库管理员帐号和密码,存在较大的安全风险,而且一旦遇到问题,查证责任人也比较困难。
如果加强安全管理,一些临时的技术支持人员或接口开发人员,如果每次他们离开就修改一次密码,也比较麻烦。
有没有一种办法可以达到这种效果:
让这些技术人员即用自己的帐号登录数据库,又可以拥有应用系统的管理员帐号权限但不必知晓管理员密码。
有!
Oracle代理身份认证(Oracle Proxy Authentication)可以达到这样的效果。
下面我们通过一个示例来说明,普通用户以应用系统管理员的身份登录的方法。
1.创建一个普通用户U1118,只授予登录系统的基本权限(CREATE SESSION)
SQL> create user U1118 identified by his;
SQL> grant connect to U1118;
2.通过应用系统的管理员帐户ZLHIS向普通用户U1118授予代理身份权限:
SQL> alter user zlhis grant connect through U1118;
3.普通用户U1118就可以用管理员帐户ZLHIS的名义登录数据库了.
SQL> conn u1118[zlhis]/his@qzyy
Connected to Oracle Database 11gEnterprise Edition Release 11.2.0.4.0
Connected as U1118[zlhis]@qzyy
用法就是在自己的用户名后加中括号并在其中加上管理员帐号。
这样,普通用户不需要知道管理员帐号的密码,用自己的帐号登录后就能以管理员的名义和权限开展各项工作,一但工作完成,管理员可通过下面的命令收回代理权限:
SQL> alter user zlhis revoke connect through U1118;
通过视图Proxy_Users可以查到所有的代理用户
SQL>Select*FromProxy_Users
U1118以这种方式登录后,实际上就是以管理员帐号ZLHIS在使用,拥有它的权限,并且查询USER函数,显示的用户也是管理员帐号。
SQL> select user from dual;
USER
------------------------------
ZLHIS
通过函数sys_context可以查到代理的原始身份:
SQL>selectsys_context('USERENV','PROXY_USER') as TrueUser from dual;
TrueUser
------------------------------
ZLHIS
从V$Session视图中看到该会话的用户名也是ZLHIS,如果要在其中方便的查到代理的原始身份,可以通过登录触发器将代理用户写入到客户端标识中。
dbms_application_info.set_client_info(client_info=>sys_context('USERENV','PROXY_USER'));
查询V$Session视图时就可以在CLIENT_INFO字段中看到代理用户:
AUDSID USERNAME MODULE CLIENT_INFO
---------- ------------------------------ ----------------------------------------------
即使不使用登录触发器,要查证哪些用户通过代理身份认证进入了系统,可以在审计日志中查到,Oracle自动将代理身份认证记录到了审计日志中,Action为208的就是代理身份认证,并且该行数据中记录了代理用户名。
SQL>Select Username, Timestamp, Action, Action_Name,Comment_Text, Sessionid, Proxy_Sessionid
FromSys.Dba_Audit_Trail
Where Timestamp> Trunc(Sysdate)
Order By TimestampDesc
另外,你可能会想到这种需求:
管理员帐号同时也是DBA用户,信息科有两个维护人员,一个维护应用软件,另一个维护数据库,我只想把DBA权限给数据库维护人员,是否可以区别开来授权呢?
当然是可以的,授予指定的角色即可:
SQL>alter user zlhis grant connect through U1118 withrole ZL_门诊医生,ZL_住院医生;
SQL>alter user zlhis grant connect through U2228 withrole DBA;
通过视图Proxy_Roles可以查到代理用户的用色分配。
SQL>Select*FromProxy_Roles
最后,再说明几点:
代理身份认证是从Oracle 8i就开始提供的,但以上SQL命令行代理方式是从Oracle 10 R2才开始提供,如果使用的是Oracle简易客户端8i版是不支持的。
对于ADO连接驱动提供程序,MS ODBC是不支持这个特性的,而Oracle OLEDB驱动是支持的。
下次,如果你遇到安全要求高的信息科长不愿意将应用系统的管理员密码给你,而你又需要以管理员身份进行一些工作时,可以给他讲讲这种方法。
领取专属 10元无门槛券
私享最新 技术干货