侧边栏壁纸
  • 累计撰写 128 篇文章
  • 累计创建 13 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

【ORACLE】有关18c的一个很多文章都没提到的安全方面的变更-禁止软链接

DarkAthena
2021-11-30 / 0 评论 / 0 点赞 / 763 阅读 / 5005 字

前言

事情的起因是这样的,我在我的21c数据库环境中尝试做一些与操作系统的交互,比如读写文件,但遇上了之前没有遇到过的报错。

先看下面这个例子:

案例

先查一个目录

SELECT DIRECTORY_PATH
  FROM DBA_DIRECTORIES H
 WHERE H.directory_name = 'DATA_PUMP_DIR';

---
/u01/app/oracle/admin/cdb1/dpdump/D1F166B4357F093BE053040011AC4C08

然后进操作系统,在这个目录生成一个文件

echo "123" > /u01/app/oracle/admin/cdb1/dpdump/D1F166B4357F093BE053040011AC4C08/test.tst
cat /u01/app/oracle/admin/cdb1/dpdump/D1F166B4357F093BE053040011AC4C08/test.tst

123

在数据库中用bfilename函数查这个文件,并打开

select bfilename('DATA_PUMP_DIR','test.tst') from dual;

报错

ORA-22288: 文件或 LOB 操作FILEOPEN失败
soft link in path

再在数据库中执行删除文件

begin
utl_file.fremove('DATA_PUMP_DIR','test.tst');
end;
/

报错

ORA-29283: 无效的文件操作 : 路径遍历符号链接 [29433]
ORA-06512: 在 "SYS.UTL_FILE", line 251
ORA-06512: 在 "SYS.UTL_FILE", line 1230
ORA-06512: 在 line 2

分析

根据提示来看,“soft link in path”这个指的是软链接,我又联想到,我这个目录的确是在一个软链接下面,但以前玩11g和12c这都是基操呀,咋会出现这情况?于是我在oracle官网上开始搜索一些关键词,搜到了这篇
https://docs.oracle.com/en/database/oracle/oracle-database/19/rnrdm/enterprise-edition-bugs.html#GUID-3D1D4E57-416B-4AC9-9637-72D2BAE554C5

2.5.5.2 Bug 24291322
Symbolic links are not allowed in the directory object paths or filenames when opening BFILEs. The entire directory path and filename is checked and the following error is returned if any symbolic link is found:

ORA-22288: file or LOB operation FILEOPEN failed soft link in path
Workaround:

If the database directory object or filename that you are trying to open contains symbolic links, then change it to provide the real path and filename.

说是有个BUG?但为什么解决方案却是要我们用真实路径而不是去修复它?

问题肯定没这么简单,因为我记得我早前在看dbms_utility包的时候,有发现一个directory_has_symlink函数,用来判断一个目录是不是软链接的,以前没有这个,ORACLE这波呀,肯定是有备而来!

原因

于是我继续在bing上搜索,看到了这2篇文章
《Symbolic Links in DIRECTORY Objects not permitted with Oracle 18c/19c》
《Behavior Change in Oracle 18c/19c: No symbolic links for Data Pump directories》

果然,文中提到ORACLE基于安全角度考虑,取消了对软链接目录的支持,受这个影响的相关功能有

  • Data Pump
  • PL/SQL package UTL_FILE
  • BFILEs
  • External Tables

并且在18c预升级程序执行时,会有提示,当前数据库存在哪些软链接目录,请手工用真实路径重建。
MOS Note: 2380601.1 (Database Preupgrade tool check list):
image.png

疑惑

"WARNING"、"MANUAL",这么重要的事情,有关18c的新特性介绍文章里咋没见到呢。。。搜相关报错信息,国内几大技术网站里也没搜到。

难道国内就没人用oracle做软链接下的文件读写操作?还是都停留在12c之前?

我想起我以前所在的公司,如果要升级数据库,这个问题可能会很难搞。我对那些package无比熟悉,几乎都刻在脑海里了,有大量各种各样的文件操作。

眼下我也不用急着解决我研究中遇到的这个问题,反正有其他方式可以实现。

临时解决方案

当然,ORACLE不可能在如此重大的修改上留一手,其实可以修改相关参数来实现软链接依旧可用:

ALTER SYSTEM SET "_disable_directory_link_check" = TRUE SCOPE=SPFILE;
ALTER SYSTEM SET "_kolfuseslf" = TRUE SCOPE=SPFILE;

修改后重启数据库即可。这只是临时解决方案,而正确的解决方案依然还是把软链接目录修改成实际的目录。

附:检查哪些目录是软链接的脚本

@?/rdbms/admin/utldirsymlink.sql
0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin
博主关闭了所有页面的评论