Using Trigger after logon on database limit IP&USER access your Oracle database

最近有个项目需要限制某些数据库用户的访问来源IP,在PG中比较好实现,但是ORACLE没有比较简便的操作。
如果不管用户的话,仅仅限制来源IP对监听的访问是比较容易实现的,通过配置数据库服务器的sqlnet.ora文件或者修改数据库服务器的IPTABLES等手段实现。
sqlnet.ora范例:
tcp.validnode_checking=yes
tcp.invited_nodes=(172.16.33.11,172.16.34.89)

iptables范例:
[root@kefu ~]# cat /etc/sysconfig/iptables
# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
# 允许访问1521的服务器
-A RH-Firewall-1-INPUT -s 172.16.3.68/32 -m state --state NEW -m tcp -p tcp --dport 1521 -j ACCEPT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT

下面来看看如何限制特定用户和特定IP:

1. 创建ACL表 (本例将ACL表建立在dsm用户下,随便建哪里都可以)
create table dsm.tbl_iplimit (logonuser varchar2(32),ip_address varchar2(15),remark varchar2(64),create_time date default sysdate);
insert into dsm.tbl_iplimit values ('DSM','172.16.18.81','digoal''s host.',sysdate);
insert into dsm.tbl_iplimit values ('DSM','local','本地',sysdate);
commit;
这里限制了DSM用户只能从172.16.18.81和ORACLE所在服务器登录.其他用户不受限制.

2. 创建触发器
conn / as sysdba
create or replace trigger "logon_audit" after
logon on database
declare
record_num number;
userip varchar2(15);
isforbidden boolean:=true;
begin
  userip:=nvl(sys_context ('userenv','ip_address'),'local');
  select count(*) into record_num from dsm.tbl_iplimit where logonuser=user;
  if (record_num>0) then
      select count(*) into record_num from dsm.tbl_iplimit where logonuser=user and ip_address=userip;
      if (record_num=0) then
      raise_application_error(-20003,'ip :'||userip||' is forbided');
      end if;
  end if;
exception
 when value_error then
  sys.dbms_output.put_line('exception handed');
 when others then
  raise;
end logon_audit;
/

3. 测试
在本地登录
SQL> conn dsm/pwd
正常
delete from tbl_iplimit where ip_address='local';
commit;
exit;
再在本地登录,已经受阻了.
SQL> conn dsm/pwd
ERROR:
ORA-00604: error occurred at recursive SQL level 1
ORA-20003: ip :local is forbided
ORA-06512: at line 18

换台机器(172.16.3.67)登录:
SQL> conn dsm/pwd@//172.16.3.13:1521/sid
ERROR:
ORA-00604: error occurred at recursive SQL level 1
ORA-20003: ip :local is forbided
ORA-06512: at line 18
受阻

换台机器(172.16.3.81)登录:
SQL> conn dsm/pwd@//172.16.3.13:1521/sid
正常

如果IP范围比较宽,可以写一个IP比较的函数加入到上面的判断中,避免写很多条记录。

时间: 2024-09-10 21:28:13

Using Trigger after logon on database limit IP&USER access your Oracle database的相关文章

Oracle数据安全解决方案(2)——Oracle Database Vault

原文地址:http://download.oracle.com/docs/cd/B28359_01/server.111/b31222/dvintro.htm Oracle Database Vault 本篇包含如下内容: ·         什么是Oracle Database Vault? ·         Oracle Database Vault组成部分 ·         Oracle Database Vault遵循哪些规范 ·         Database Vault应对哪些

oracle database link

原文整理自网络: database link基础知识 什么是database link? database link,它是用来更方便的一个数据库中访问另一个数据库(包括本地和远程的,道理是一样的),一开始,很多人会发生误解,其实是在本地建立的.即数据库连接只是连到别的数据库的快捷方式. database link是定义一个数据库到另一个数据库的路径的对象,database link允许你查询远程表及执行远程程序.在任何分布式环境里,database都是必要的.另外要注意的是database li

Oracle Database 11g Express Editon介绍及安装

一.Oracle Database 11g Express版本介绍 公司项目开发中,使用 的数据库是Oracle 10g和MySQL 5.5,最新因为开发需要,需要从后台读取一些数据.使用的客户端是PL/SQL Developer,当然有很多同事喜欢用Toad.当然客户端工具基本上大同小异,估计高手直接用PL*SQL命令行,也是可以进行开发的.在学习学习 SQL Server时,老师推荐我们按照SQL Server 2005 Express,他说首先是免费版,不需要大家去找序列号,而已和以后真实

oracle database access object

access|object|oracle  Calling example:<? $conn = OCILogon("www_cec", "webchn99", "unicorn");#or you can just inclued file like "include("modcec_OCI_conn.php3");" $newOda= new ODA($conn);################

Oracle Database 10g:删除表

oracle 使用 Oracle Database 10g 中的闪回表特性,可以毫不费力地恢复被意外删除的表 以下是一个不该发生却经常发生的情况:用户删除了一个非常重要的表 - 当然是意外地删除 - 并需要尽快地恢复.(在某些时候,这个不幸的用户可能就是 DBA!) Oracle9i Database 推出了闪回查询选项的概念,以便检索过去某个时间点的数据,但它不能闪回 DDL 操作,如删除表的操作.唯一的恢复方法是在另一个数据库中使用表空间的时间点恢复,然后使用导出/导入或其他方法,在当前数据

信息: Oracle Database Configuration Assistant 失败

安装异常: 信息: Oracle Database Configuration Assistant 失败 log:C:\Program Files\Oracle\Inventory\logs\installActions2014-10-24_10-56-40PM.log 本人的解决: 跳过此步按照,可以先不管的,安装完其他步骤后,安装其他完成后. 在程序中,运行"Database Configuration Assistant ",再次安装,就可成功.   网友意见: 1.cmd下输入

Grid+ASM+Oracle Database 12c安装配置教程

备注:工作需要开始学习oracle,之前只学习过mysql的一些基础东东,oracle对我而言是一个新的数据体系,作为初学者,很多地方可能写的不对,只是个人理解,误导之处,请谅解,求指正![Byrd:2016年7月3日]   环境基础:   虚拟机IP(LINUX):1.1.1.212  本地IP(WIN):1.1.1.1  变量配置:   [root@oracle01 ~]# uname -a  Linux oracle01.db.hangzhou.t4x.org 2.6.32-358.el6

Configure Oracle GoldenGate for Oracle to Oracle Database Synchronization

环境介绍:        两台装有Solaris10的虚拟机,主机名为GG01和GG02 ,对应的IP为192.168.1.91和192.168.1.92.目前已经安装了oracle database 10g软件,数据库已处于运行状态.GG01上的数据库实例是GGDB01,而GG02上的数据库实例是GGDB02.网上好多类似文档中的数据库的数据文件都是放在本地磁盘上的,做起来基本上没什么问题.可我这里使用了ASM,所以好几次都是失败,几经周折最后还是搞定了. 一.安装之前的准备工作: 在安装GG

Oracle Database 10g 未在当前操作系统中经过认证

错误信息如下: <提示有1个错误,1个警告,2个要求待验证 错误问题详细信息如下:正在检查操作系统要求- 要求的结果: 5.0,5.1,5.2,6.0 之一实际结果: 6.1 检查完成.此次检查的总体结果为: 失败 <<<< 问题: Oracle Database 10g 未在当前操作系统中经过认证.建议案: 确保在正确的平台上安装软件. 警告问题详细信息如下:正在检查网络配置要求- 检查完成.此次检查的总体结果为: 失败 <<<< 问题: 安装检测到