Oracle数据库链接(dblink)相关技术咨询
Oracle数据库链接(dblink)相关技术咨询
问题1:如果设置了Oracle dblink,配置的外部数据库是否能访问我的数据库?
哥们,这个得先明确dblink的核心特性——它默认是单向的!你在自己的数据库里创建dblink连接到外部DB,只是赋予了你这边的数据库访问外部DB的权限,反过来外部DB是不能直接访问你的数据库的。
举个实际场景:你在DB_A里建了dblink连到DB_B,那DB_A能正常读/写DB_B的数据,但DB_B如果没做两件事,根本碰不到你的DB_A:
- 外部DB(DB_B)那边得创建一个指向你的数据库的dblink
- 你的数据库必须给外部DB用来访问的账号授予对应的权限(比如
CREATE SESSION是基础,还要有具体表的SELECT/INSERT等权限)
问题2:有没有办法检查哪些外部数据库被允许通过dblink访问我的数据库?
这个得从几个维度入手,毕竟外部的dblink是在对方库上创建的,你这边没法直接看到对方的配置,但可以从自己库的权限、访问控制和审计记录来排查:
检查有哪些账号具备远程访问权限
先查哪些用户拥有远程连接的基础权限,以及创建dblink的权限:SELECT grantee, privilege FROM dba_sys_privs WHERE privilege IN ('CREATE SESSION', 'CREATE DATABASE LINK') ORDER BY grantee;另外,还得查这些用户有没有具体表的操作权限,毕竟就算能连进来,没表权限也没法操作数据:
SELECT grantee, owner, table_name, privilege FROM dba_tab_privs WHERE privilege IN ('SELECT', 'INSERT', 'UPDATE', 'DELETE') ORDER BY grantee;检查监听的访问控制配置
外部DB要连你的库,首先得通过Oracle监听,你可以查看监听配置文件(listener.ora)里的访问控制规则,比如TCP.INVITED_NODES参数,这里会列出被允许连接的IP地址或主机名,能帮你缩小范围。查看审计日志(如果开启了审计)
要是你的数据库开启了审计功能,直接查审计记录就能看到哪些远程主机访问过你的库:SELECT os_username, username, machine, timestamp FROM dba_audit_session WHERE returncode = 0 ORDER BY timestamp DESC;这里的
machine字段会显示连接来源的主机名或IP,结合权限查询结果,就能大致判断哪些外部DB被允许访问了。
备注:内容来源于stack exchange,提问作者J H




