如何使用CREATE SESSION命令追踪Oracle数据库登陆

日期: 2009-07-02 作者:Brian Fedorko翻译:孙瑞 来源:TechTarget中国 英文

问:我正在寻找一种方法,能够识别那些一个月以上都没有登陆过的用户。我原以为Oracle会自带这个功能,现在好像需要用fnd logins写一个SQL查询是吗?   答:开箱即用,Oracle数据库对追踪来访用户的功能并不强大。但这并不意味着Oracle不能胜任这一任务。事实上,Oracle数据库审计功能十分强大、灵活并且易配置。

适当并有效地使用数据库审计功能是拥有高效安全策略的基础。由于我们不可能阻止零时间漏洞攻击,所以同样重要的是检测对数据库的未授权访问动作。   注意:我不知道你使用的是什么版本的Oracle关系型数据库管理系统,但一下的建议对9i-11g都有效,除非另有说明。   针对特……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

问:我正在寻找一种方法,能够识别那些一个月以上都没有登陆过的用户。我原以为Oracle会自带这个功能,现在好像需要用fnd logins写一个SQL查询是吗?

  答:开箱即用,Oracle数据库对追踪来访用户的功能并不强大。但这并不意味着Oracle不能胜任这一任务。事实上,Oracle数据库审计功能十分强大、灵活并且易配置。适当并有效地使用数据库审计功能是拥有高效安全策略的基础。由于我们不可能阻止零时间漏洞攻击,所以同样重要的是检测对数据库的未授权访问动作。

  注意:我不知道你使用的是什么版本的Oracle关系型数据库管理系统,但一下的建议对9i-11g都有效,除非另有说明。

  针对特定性的需求,确定哪些用户在30天内都没有登录,我们将开始针对您的数据库进行审核(注意:您必须以特权账号身份登录数据库才能执行此操作):

  SQL> alter SYSTEM set audit_trail=DB scope=spfile;
  SQL> shutdown immediate
  SQL> startup
  SQL> show parameter audit_trail;

  这个动作只能在数据库重启之后生效,这就是我为什么要加上关闭和启动命令的原因。当参数被设置并重启数据库之后,你的数据库将不会自动开始审计用户操作,但是如果不再重启,它将在任何时候都有此功能。

  我之所以在DB中设置了一个audit_trail参数,是因为它可以在数据库内部的SYS.AUD$表中记录用户动作。它使得我们能够使用简单的SQL查询和Oracle提供的视图来轻松迅速地统计我们需要的信息。在OS的文件系统中,还有其它的选择可供我们扩大信息收集或存储不同格式的审计信息。Oracle审计追踪说明书为我们提供了所有选择的详尽说明。

  因为我们选择在数据库内部存储审计动作,所以我们需要为SYS.AUD$表设计一个最优方法。SYS.AUD$表随着我们收集和储存审计信息而增长,它是存在系统的表空间里,因此同时会造成表空间的增长。不幸的是,在系统表空间增长之后,的确没有一个比较好的办法来缩减它。而幸运的是,SYS.AUD$表是为数不多的SYS表,我们可以在数据库内部任意移动它而不造成任何问题。

  最优方法就是为SYS.AUD$表特别创建一个表空间。这使得表增长不会影响到系统表空间和相关数据文件。如果审计表和非系统表空间增长过大,我们有很多方法来将表内容存档并调整表空间大小,或直接将它移动到新的空间。另外利用具体的权限,这个表空间可以被隔离到不同的文件夹来加强我们的安全状况,甚至可以防止窜改审计信息。虽然这和原来的问题关系不大。

  下面提供一些关于达成最优方法的命令示例。首先为审计表创建一个表空间:

  SQL> CREATE BIGFILE TABLESPACE "AUDITING"
  DATAFILE '[Insert your path here without square brackets].AUDIT01.DBF'
  SIZE 10M
  AUTOEXTEND ON NEXT 1024K
  MAXSIZE UNLIMITED
  LOGGING
  EXTENT MANAGEMENT LOCAL
  SEGMENT SPACE MANAGEMENT AUTO;
  -- NOTE – 'BIGFILE' is only applicable to versions 10g & 11g, omit for 9i use

  然后我们把SYS.AUD$表移动到新的表空间:

  SQL> alter TABLE SYS.AUD$ move tablespace AUDITING;

  这将让你能够验证移动是否成功:

  SQL> select TABLE_NAME, TABLESPACE_NAME, STATUS
  from DBA_TABLES
  where TABLE_NAME like 'AUD$';

  下一步就开始审计动作,它能生成我们需要的数据,检测哪些用户在三十天内登陆了数据库,即CREATE SESSION。它将记录有谁登陆了,什么时候登录的还有是否成功登陆了。

  SQL> audit CREATE SESSION;

  任务完成!现在我们只需要使用SQL语句将过去三十天成功登陆的用户过滤掉。出于易用性和性能考虑,我强烈建议创建一个视图,选择所有成功登陆的用户,然后通过查询移除这些用户。这个查询还可以帮助你添加Oracle默认用户和没有登录的有效用户,这样他们就不会显示在最后的结果集中。

  

    SQL> create view LOGIN_LAST_THIRTY_DAYS_VIEW
  as
  select DISTINCT u.USERNAME
  from DBA_USERS u join DBA_AUDIT_SESSION a
  on u.USERNAME = a.USERNAME
  where a.RETURNCODE = 0
  and SYSDATE - a.TIMESTAMP between 0 and 30;
  SQL> select DISTINCT USERNAME
  from DBA_USERS
  where
  USERNAME not in
  (select * from LOGIN_LAST_THIRTY_DAYS_VIEW)
  and USERNAME not in
  ('SYS', 'SYSTEM', 'SYSMAN', 'DBSNMP', 'Add other oracle default schemas here as needed')
  order by USERNAME;

  这个操作看似很庞大,但实际上只是一些SQL命令和重启,因此不要被背景信息所吓倒。现在所有的基础工作都完成了,你在审计表中收集的信息同样可以用来检测暴力攻击,执行行为分析来突出可疑操作,生成使用状态仿形等等。

翻译

孙瑞
孙瑞

相关推荐