使用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学习笔记,您的支持是对我最大的鼓励!

时间: 2024-08-24 20:21:14

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

External Configuration Store Pattern 外部配置存储模式

Move configuration information out of the application deployment package to a centralized location. This pattern can provide opportunities for easier management and control of configuration data, and for sharing configuration data across applications

Spring Security 3.1 中功能强大的加密工具 PasswordEncoder

好吧,这种加密机制很复杂,还是看下图比较好了解: 3.1.0版本中新的PasswordEncoder继承关系 而在Spring-Security 3.1.0 版本之后,Spring-security-crypto模块中的password包提供了更给力的加密密码的支持,这个包中也有PasswordEncoder接口,接口定义如下. Java代码 Public interface PasswordEncoder{ String encode(String rawPassword); Boolean 

【翻译自mos文章】怎么检查Oracle Advanced Security Option 是否被安装上?

怎么检查Oracle Advanced Security Option 是否被安装上? 来源于: How To Check if Oracle Advanced Security Option is Installed ? (文档 ID 549989.1) 适用于: Advanced Networking Option - Version 9.2.0.1 to 11.2.0.3 [Release 9.2 to 11.2] Information in this document applies

SpringBoot集成Spring Security(4)——自定义表单登录

通过前面三篇文章,你应该大致了解了 Spring Security 的流程.你应该发现了,真正的 login 请求是由 Spring Security 帮我们处理的,那么我们如何实现自定义表单登录呢,比如添加一个验证码- 源码地址:https://github.com/jitwxs/blog_sample 文章目录 一.添加验证码 1.1 验证码 Servlet 1.2 修改 login.html 1.3 添加匿名访问 Url二.AJAX 验证三.过滤器验证 3.1 编写验证码过滤器 3.2 注

Spring Security笔记:Remember Me(下次自动登录)

前一节学习了如何限制登录尝试次数,今天在这个基础上再增加一点新功能:Remember Me. 很多网站,比如博客园,在登录页面就有这个选项,勾选“下次自动登录”后,在一定时间段内,只要不清空浏览器Cookie,就可以自动登录. 一.spring-security.xml 最简单的配置 1 <http auto-config="true" use-expressions="true"> 2 ... 3 <remember-me /> 4 <

oracle无密码登录

oracle wallet使用与维护 从Oracle10gR2开始, 通过使用Oracle Wallet达到任意用户不使用密码登录数据库(非操作系统认证方式),这对于用脚本登录数据库进行操作来说是非常有用的:尤其对于企业安全要求很高,不希望用户名和密码明文存在配置文件中,而且对于密码的维护是极为方便的,比如我把wallet放在指定路径下,当修改密码时,只需统一覆盖wallet即可,对于有大量应用服务器尤为方便. C:\app\Administrator\virtual\product\12.2.

Oracle数据库案例整理-Oracle系统执行时故障-Shared Pool内存不足导致数据库响应缓慢

1.1       现象描写叙述 数据库节点响应缓慢,部分用户业务受到影响. 查看数据库告警日志,開始显示ORA-07445错误,然后是大量的ORA-04031错误和ORA-00600错误. 检查数据库日志,数据库仍处于活动状态的信息例如以下: Sat Jul 17 07:51:52 2010 Thread 1 advanced to log sequence 266272   Current log# 2 seq# 266272 mem# 0: /dev/rlv_redo121   Curre

Oracle 11.2.0.4 For Linux 64bit+32bit 11Gu4数据库介质百度云

Oracle 11.2.0.4 For Linux 64bit+32bit 官方数据库介质 百度云盘下载 1.Oracle11G 64BIT介质官方链接 适用于Linux 64bit的Oracle Database 11G 第2版U4(11.2.0.4)Oracle11.2.0.4  Linux64BIT介质盘https://updates.oracle.com/Orion/Services/download/p13390677_112040_LINUX_1of7.zip?aru=1672098

ORACLE中的Net Configuration Assistant 点击后无反应, sqlplus登录数据库提示Oracle11g ORA-12560: TNS: 协议适配器错误

首先是对于点击无反应问题: 如果是客户端下的Net Configuration Assistant可用,而服务器端的Net Configuration Assistant等工具不可用的原因如下. 环境变量中Oracle_Home的配置错误可能是一方面,此时可直接删除Oracle_Home系统变量.此外,系统PATH中,如果Client的Orale 路径和DB的Oracle路径依次出现,可能启动数据库目录下的[配置和移植工具]时,启动的Net Mannget可能是你客户端Oracle_Home路径