实战篇:Oracle巧记登录用户IP,无所遁形

举报
Lucifer三思而后行 发表于 2021/10/28 12:51:20 2021/10/28
【摘要】 作者简介作者:LuciferLiu,中国DBA联盟(ACDU)成员。目前主要从事Oracle DBA工作,曾从事 Oracle 数据库开发工作,主要服务于生产制造,汽车金融等行业。现拥有Oracle OCP,OceanBase OBCA认证,擅长Oracle数据库运维开发,备份恢复,安装迁移,Linux自动化运维脚本编写等。 前言日常工作生产,我们一般都通过监听连接Oracle数据库。如果...

作者简介

  • 作者:LuciferLiu,中国DBA联盟(ACDU)成员。
  • 目前主要从事Oracle DBA工作,曾从事 Oracle 数据库开发工作,主要服务于生产制造,汽车金融等行业。
  • 现拥有Oracle OCP,OceanBase OBCA认证,擅长Oracle数据库运维开发,备份恢复,安装迁移,Linux自动化运维脚本编写等。

前言

  • 日常工作生产,我们一般都通过监听连接Oracle数据库。如果想要记录访问过数据库的用户IP地址,常规方式是无法做到的,但是可以通过一些非常规方式来实现。

在这里插入图片描述

实现

这里提供几种方式:

  • 通过触发器实现
  • 查看监听日志
  • 通过PLSQL包 DBMS_SESSION

1 触发器实现

  • 创建单独表空间存放记录
sqlplus / as sysdba
create tablespace test datafile;

在这里插入图片描述

  • 通过ctas从v$session创建session历史记录表指定表空间test
sqlplus / as sysdba
create table session_history tablespace test as (select sid,username,program,machine,'000.000.000.000'ipadd,sysdate moditime from v$session where 0=1);

在这里插入图片描述

  • 创建触发器,当有用户登录时,将记录插入session历史记录表
sqlplus / as sysdba
CREATE or replace trigger on_logon_trigger after logon
ON database begin
INSERT INTO session_history
SELECT  sid
       ,username
       ,program
       ,machine
       ,sys_context('userenv','ip_address')
       ,sysdate
FROM v$session
WHERE audsid = userenv('sessionid'); end;
/

在这里插入图片描述

  • 本机通过lucifer用户登录
sqlplus lucifer/lucifer@10.211.55.110/orcl

  • 查询非SYS用户的登录记录
sqlplus / as sysdba
alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
select * from session_history q where q.username not in ('SYS');

在这里插入图片描述
至此,第一种方式已经介绍完毕。可以看到,已经可以记录到登录数据库的用户IP地址。

2 查看监听日志

  • 查看监听日志位置
su - oracle
lsnrctl status

在这里插入图片描述

  • 查看监听日志
tail -100 log.xml

在这里插入图片描述
这种方式也是可以实现查看登录IP,但是查询起来过于麻烦,不推荐使用。

3 PLSQL包 DBMS_SESSION

  • 为方便后面测试,先删除第一种方式创建的 触发器和表空间
sqlplus / as sysdba
drop trigger on_logon_trigger;
drop tablespace test;

在这里插入图片描述

  • 测试是否还能看到IP
sqlplus lucifer/lucifer@10.211.55.110/orcl
sqlplus / as sysdba
alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
select username,machine,terminal,program,client_info,logon_time from v$session;

在这里插入图片描述
从上图的 client_info字段为空,可以看出v$session视图并没有记录到IP。

  • 使用DBMS_SESSION程序包设置可以查询IP地址
sqlplus / as sysdba
exec DBMS_SESSION.set_identifier(SYS_CONTEXT('USERENV', 'IP_ADDRESS'));
/

在这里插入图片描述

  • 主机测试用户登录是否能查看IP地址
sqlplus lucifer/lucifer@10.211.55.110/orcl
alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
select sys_context('userenv','ip_address') from dual; 

在这里插入图片描述

  • 换一个主机客户端登录,查看是否可以查询IP地址
    在这里插入图片描述

从上述实验可以看出,客户端已经可以查询IP地址,说明plsql包但生效,但是不会记录到v$session中,需要创建一个触发器来实现。

  • 创建触发器,记录客户端登录IP
sqlplus / as sysdba
create or replace trigger on_logon_trigger
  after logon on database
begin
  dbms_application_info.set_client_info(sys_context('userenv','ip_address'));
end;
/

在这里插入图片描述

  • 查询v$session查看是否有记录IP地址
sqlplus / as sysdba
select username,machine,terminal,program,client_info,logon_time from v$session where username is not null;

在这里插入图片描述
可以看到,IP地址已经被记录了。

通过以上几种方式,我们可以跟踪记录到登录用户的IP地址。至于有什么作用,自己脑补吧。


本次分享到此结束啦~

如果觉得文章对你有帮助,点赞、收藏、关注、评论,一键四连支持,你的支持就是我创作最大的动力。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。