千家信息网

使用Oracle的Security External Password Store功能实现无密码登录数据库

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,使用Oracle的Security External Password Store功能实现无密码登录数据库作者:赵全文 网名:guestart在今年国内很多用户的Oracle数据库突然遭到比特币勒索,
千家信息网最后更新 2026年10月31日使用Oracle的Security External Password Store功能实现无密码登录数据库

使用Oracle的Security External Password Store功能实现无密码登录数据库

作者:赵全文 网名:guestart

在今年国内很多用户的Oracle数据库突然遭到比特币勒索,从这一方面来说,数据库的安全,大家没有引起足够的重视。其实不难发现,我们在生产环境中使用的Oracle数据库确实存在着很多安全隐患和安全风险。Oracle在数据库安全方面的解决方案也有很多,比如Oracle审计与数据库防火墙(AVDF)产品、Oracle的透明数据加密功能(KDE)和Oralce Wallet(也称Oracle 钱夹)加密用户的密码等等。

如果需要从SHELL脚本来连接到Oracle数据库,那么这些脚本包含数据库连接详细信息,这可能是一个主要的安全问题。一个解决方案是使用操作系统身份验证,但Oracle 10g第2版提供了使用安全外部密码存储的功能。其中Oracle登录证书存储在客户端Oracle电子钱包中,这样的话,在SHELL脚本里就可以使用"/ @ db_alias"这样的语法来连接。这对于用脚本登录数据库进行操作来说是非常有用的,尤其对于企业安全要求很高,不希望用户名和密码明文存在配置文件中,而且对于密码的维护是极为方便的,比如把wallet放在指定路径下,当修改密码时,只需统一覆盖wallet即可。

今天我和大家分享一下,如何使用Oracle的Security External Password Store功能实现无密码登录数据库,以此不将明文密码暴露在生产环境当中。

那么,Oracle是如何通过安全外部密码存储(Secure External Password Store)来达到无密码登录数据库呢?我们来说,连接到数据库的密码证书是存储在Oracle wallet里,这个wallet(钱夹)是一个用来保存认证和签名证书的一种安全软件容器。这种钱包使用可以简化依靠密码凭据连接到数据库的大规模部署。 配置此功能时,应用程序代码,批处理作业和脚本不再需要嵌入的用户名和密码。 风险降低,因为这样的密码不再以明确的方式暴露,并且当用户名或密码改变时,密码管理策略更容易实施,而不改变应用程序代码。

因为用"安全外部密码存储"这种方式所存储的密码密文信息是存储在Oracle wallet里的,那么我们先介绍一下,什么是Oracle wallet以及它里面可以存储一些什么信息?请看下面的一段英文描述,

中文翻译如下,

Oracle钱夹是一个用于存储不同类型认证和加密密钥的PKCS#12容器。因此,这种钱夹可以用于存储以下信息的一个或多个:

  • Oracle数据库的PKI身份验证凭据

  • 网络加密证书(SSL/TLS)

  • Oracle高级安全透明数据加密(TDE)的主加密密钥

  • Oracle数据库安全外部密码存储的密码

说的直白一点,Oracle wallet可以形象的比喻成我们日常生活中的钱包一样,在钱包里,我们可以放银行卡、×××、信用卡、公司的员工卡、就餐卡等等。

看了上面的一段英文描述和中文翻译,想必大家对Oracle wallet也有所了解。那么到底什么是Oracle的Secure External Password Store(安全外部密码存储)呢?我们再看下面的一段英文描述,

中文翻译如下,

使用安全外部密码存储,Oracle将数据库凭据(即用户名和密码)安全地存储在Oracle电子钱包中。 在启动数据库连接时,Oracle访问钱包并根据连接字符串读取凭据。 由于配置了自动登录,因此无需密码即可打开钱包并读取凭据。 只有在电子钱包中添加,更改或删除凭据时才需要密码。

连接字符串在电子钱包中是唯一的。 每个连接字符串只能存储一个凭证。 同一数据库的不同凭据必须由不同的连接字符串区分。

从上面的中文解读,我们可以得知,安全外部密码存储就是Oracle把用户名和密码存放在Oracle wallet的一种安全加密形式。

下面我们根据Oracle 10gR2官方文档中的Secure External Password Store功能来演示和操作,最终实现无密码登录数据库。

虽然说,使用wallet的图形界面(在command line interface下 输入owm命令可以打开)可以极大的简化管理密码证书,至于为什么不能用owm(oracle wallet manager)来创建和管理wallet的外部密码存储,而是使用mkstore命令?以下是摘自Oracle官方文档的一段描述:

一般来说,用户(包括应用程序、批处理任务和脚本)都是通过一个标准的数据库连接字符串(database_connect_string)的连接语句(connect statement)来连接到Oracle数据库的。这些字符串里包括用户名、密码和网络服务名,或者是在tnsnames.ora文件当中列出的TNS别名,还有另一种连接字符串的形式是主机名:端口号:sid(这种形式在应用程序连接到Oracle数据库当中随处可见)。

比如,下面这样的连接形式:

其中ORASALES为TNS别名,ourhost37:1527:DB17为主机名:端口号:sid。

然而,如果客户端配置了安全外部密码存储的话,就可以使用下面的连接语法来连接到数据库,而不需要指定用户名和密码。

在这种情况下,数据库证书、用户名和密码是安全地存储在创建的Oracle钱夹里,由于wallet的自动登录特性(auto login)是打开的,也就是说,一旦创建了wallet以后是自动打开的,所以不需要密码去打开wallet。在这个wallet里有证书,而用来连接数据库的用户名和密码的信息就保存在这个证书里。

接下来,我们就开始使用外部密码存储来配置Oracle的客户端。

1、先查看一下Oracle软件默认的wallet目录所在的位置和状态

从上图可以看出,wallet的类型是以文件形式存在,而且默认的wallet就是位于$ORACLE_BASE/admin/$ORACLE_SID/wallet目录,状态为关闭。那么,我们再去相应的位置查看一下wallet目录是否存在,

从上图可以得知,wallet目录不存在,因为我们从来没有创建过wallet,它的状态应该就是closed,所以我们在用mkstore命令(前面在说不能用owm创建wallet时提到过)创建wallet之前,必须先创建一个存在的wallet目录。这里为了安全起见,也为了防止将wallet目录误删除,我们不把wallet目录放在刚才用v$encryption_wallet视图查出的位置,即$ORACLE_BASE/admin/$ORACLE_SID下,而是放到$ORACLE_HOME/owm(因为$ORACLE_HOME是Oracle软件所在目录,而且我们也不允许去改动这里的目录和文件)。

下面进行创建wallet目录,

2、在Oracle客户端开启external password store(外部密码存储)。

(1)使用mkstore命令先创建一个wallet,命令语法来自官方文档

wallet_location参数指定为我们刚才创建的wallet目录

上面提示,要给wallet输入一个密码(在wallet打开时需要输入,在创建完wallet以后,Oracle会自动打开),这里输入Oracle123(输入的密码不回显哦),再输入一遍(同样不回显,如果2次输入的不一样,Oracle会提示重新输入的)。

那么,我们到wallet目录下面查看一下是生成了什么文件。

其中cwallet.sso文件是用于保存wallet是否自动登录的信息,ewallet.p12文件是用来保存相关的证书信息,而我们要使用的用户名和密码的信息就保存在证书里。

(2)使用mkstore命令来给刚才创建的wallet创建证书,命令语法来自官方文档

其中带<>的参数,官方文档已经解释的很清楚了,我们再描述一下。

wallet_location:wallet目录所在位

db_connect_string:文件tnsname.ora中的TNS别名

tnsnames.ora:存放Oracle数据库连接字符串的文件,也是Oracle约定俗成的文件,从Oracle诞生起一直沿用到今,可见它的重要性不言而喻。在Linux系统下,位于$ORACLE_HOME/network/admin目录

username:Oracle数据库要连接的用户名

password:Oracle连接用户要输入的密码

为了不和Oracle原先在tnsnames.ora文件中创建的TNS别名有所关联,我们再单独创建一个。

其中BASE是我们刚才新建的TNS别名,而YSYKTEST是原先存在的TNS别名。

现在开始用mkstore命令创建wallet的证书,见下图

在创建证书时,需要输入wallet的密码,就第1步创建wallet时输入的密码。

其中,base是刚刚创建的TNS别名,而且用户名和密码一定要输入正确,否则即使创建成功,一会儿也连不上Oracle数据库。

其实用mkstore命令创建wallet的证书时,也可以不将用户的密码写在命令行中,而是根据命令提示进行输入(输入的密码不回显),见下图操作:

其中,前两次输入的密码为用户szd_base_v2的密码ysyktest,第三次输入的密码为wallet的密码Oracle123。

上面是创建了wallet的证书,为了让Oracle能够使用wallet,还必须在sqlnet.ora文件(和tnsnames.ora一样,也是位于$ORACLE_HOME/network/admin目录)中指定WALLET_LOCATION参数和SQLNET.WALLET_OVERRIDE参数。下面进入第3步,

(3)在sqlnet.ora文件中增加WALLET_LOCATION参数和SQLNET.WALLET_OVERRIDE参数,参考语法来自官方文档

WALLET_LOCATION = ( SOURCE = ( METHOD = FILE )( METHOD_DATA = ( DIRECTORY = /private/ora102/network/admin ) ) )

其中,WALLET_LOCATION参数当中DIRECTORY的取值为wallet目录。下面在sqlnet.ora文件中增加这2个参数,

进入$ORACLE_HOME/network/admin目录,发现没有sqlnet.ora文件,可能是没有配置sqlnet.ora文件。那么我们在图形界面下,用netca命令生成sqlnet.ora文件,然后再增加那2个参数。

选择第2个单选按钮,命名方法配置,进入下一步

将上图中的Local Naming加到右边空白窗格,最后点finish。那么,此时在$ORACLE_HOME/network/admin目录下就会生成sqlnet.ora文件。

sqlnet.ora文件刚创建以后,里面的内容只有下面几行,

现在添加WALLET_LOCATION和SQLNET.WALLET_OVERRIDE这2个参数,

现在,Oracle客户端的安全外部密码存储已经配置完毕。

为了简化操作步骤,也可以将操作步骤(1)和(2)合为一步,直接创建wallet及其证书,如下图所示:

其中,前两次输入的密码为wallet本身的密码,这里输入Oracle123,后两次输入的密码为用户szd_base_v2的密码ysyktest。

现在,我们尝试去用base的连接串去连接Oracle数据库,查看其登录用户为szd_base_v2,这样就达到了不用输密码登录数据库的目的。

那么,用szd_base_v2用户去连接Oracle数据库,也是一样的效果。

现在我们看一下视图v$encryption_wallet的内容有什么变化,

下面是没有使用Security External Password Store之前,视图v$encryption_wallet的内容(前面在创建wallet之前也提到过,呵呵)

通过上面2图对比,我们不难发现,Oracle现在使用了我们刚才创建的wallet,并且该wallet的状态为打开且正在使用。

如果用户szd_base_v2的密码进行了更改,也需要把wallet里的证书信息进行更改,否则证书里还是存放旧密码的信息,在连接Oracle数据库的时候就会报错。下面将用户szd_base_v2的密码改为ysykbase,再用sqlplus /@base登录,看有什么报错。

现在,我们用mkstore命令将wallet里的证书进行更改,然后再用sqlplus /@base登录,就会正常连接。

其中,前两次输入的密码为刚刚更改的用户szd_base_v2的密码,第三次输入的密码为wallet的密码。

除了用sqlplus直接登录Oracle数据库以外,在导入导出数据和一些对数据库日常维护的SHELL脚本中也可以使用,而且不会暴露明文密码,可以消除一定的安全隐患。例如,下面的1个expdp脚本和1个SHELL脚本。

至此,用Oracle的Secure External Password Store功能实现无密码登录数据库 演示完毕。


参考网址:

官方文档 http://docs.oracle.com/cd/B19306_01/network.102/b14266/cnctslsh.htm#g1033548

Stefan Oehrli的Blog http://www.oradba.ch/2014/07/secure-external-password-store-for-rman/


如果您觉得此篇文章对您有帮助,欢迎关注微信公众号:guestart的DBA学习笔记,您的支持是对我最大的鼓励!

密码 数据 数据库 用户 安全 存储 输入 文件 证书 目录 登录 命令 用户名 信息 参数 脚本 钱包 字符 字符串 配置 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 重生之互联网科技帝国 互联网科技公司税收优惠 万易互联网科技有限公司 多迪互联网科技有限公司 哈尔滨新华互联网科技 西藏七维空间互联网科技有限公司 福州新华互联网科技学校 知乎 科技互联网大厂 南平创想时代互联网科技有限公司 语蝶互联网科技有限公司 链环科技传统企业怎么转型互联网 深圳育鹏互联网科技有限公司招聘 青海科技产业互联网发展 高科技互联网发展前景如何 恒生互联网科技业指数调整周期 互联网科技圈年度人物 科技互联网的核心竞争力 上海互联网科技公司ppt 安徽零酒互联网科技有限公司 平安好医生打造互联网科技医疗 互联网科技 北京互联网科技 互联网科技公司电话 互联网科技公司做什么 智腾互联网科技有限公司 速维有品互联网信息科技(苏州)有限公司 银川新华互联网科技学校联系电话 本届互联网博览会上的黑科技 天津腾达互联网科技有限公司 互联网科技快讯热点
0