使用Oracle的Security External Password Store功能实现加密登录,不将明文密码暴露在生产环境当中。
原文地址:http://mp.weixin.qq.com/s/2SbP2IOq3ImjYeMkeS9QIA
如果需要从SHELL脚本来连接到Oracle数据库,那么这些脚本包含数据库连接详细信息,这可能是一个主要的安全问题。一个解决方案是使用操作系统身份验证,但Oracle10g第2版提供了使用安全外部密码存储的功能。其中Oracle登录证书存储在客户端Oracle电子钱包中,这样的话,在SHELL脚本里就可以使用"/@db_alias"这样的语法来连接。这对于用脚本登录数据库进行操作来说是非常有用的,尤其对于企业安全要求很高,不希望用户名和密码明文存在配置文件中,而且对于密码的维护是极为方便的,比如把wallet放在指定路径下,当修改密码时,只需统一覆盖wallet即可。
那么,Oracle是如何通过安全外部密码存储(Secure External Password Store)来达到无密码登录数据库呢?我们来说,连接到数据库的密码证书是存储在Oracle wallet里,这个wallet(钱夹)是一个用来保存认证和签名证书的一种安全软件容器。这种钱包使用可以简化依靠密码凭据连接到数据库的大规模部署。配置此功能时,应用程序代码,批处理作业和脚本不再需要嵌入的用户名和密码。风险降低,因为这样的密码不再以明确的方式暴露,并且当用户名或密码改变时,密码管理策略更容易实施,而不改变应用程序代码。
因为用"安全外部密码存储"这种方式所存储的密码密文信息是存储在Oracle wallet里的,那么我们先介绍一下,什么是Oracle wallet以及它里面可以存储一些什么信息?
Oracle钱夹是一个用于存储不同类型认证和加密密钥的PKCS#12容器。因此,这种钱夹可以用于存储以下信息的一个或多个:
1.Oracle数据库的PKI身份验证凭据?网络加密证书(SSL/TLS)
2.Oracle高级安全透明数据加密(TDE)的主加密密钥
3.Oracle数据库安全外部密码存储的密码
什么是Oracle的Secure External Password Store(安全外部密码存储)呢?
使用安全外部密码存储,Oracle将数据库凭据(即用户名和密码)安全地存储在Oracle电子钱包中。在启动数据库连接时,Oracle访问钱包并根据连接字符串读取凭据。由于配置了自动登录,因此无需密码即可打开钱包并读取凭据。只有在电子钱包中添加,更改或删除凭据时才需要密码。连接字符串在电子钱包中是唯一的。每个连接字符串只能存储一个凭证。同一数据库的不同凭据必须由不同的连接字符串区分。从上面的中文解读,我们可以得知,安全外部密码存储就是Oracle把用户名和密码存放在Oracle wallet的一种安全加密形式。
一般来说,用户(包括应用程序、批处理任务和脚本)都是通过一个标准的数据库连接字符串(database_connect_string)的连接语句(connect statement)来连接到 Oracle 数据库的。这些字符串里包括用户名、密码和网络服务名,或者是在 tnsnames.ora 文件当中列出的 TNS 别名,还有另一种连接字符串的 形式是主机名:端口号:sid(这种形式在应用程序连接到 Oracle 数据库当中随处可见)。
比如,下面这样的连接形式
connect scott/tiger@orclsal
connect scott/tiger@127.0.0.1:1521:orcl
其中orclsal为TNS别名,127.0.0.1:1521:orcl为主机名:端口号:sid。然而,如果客户端配置了安全外部密码存储的话,就可以使用下面的连接语法来连接到数据库,而不需要指定用户名和密码。
connect /@db_connect_string
在这种情况下,数据库证书、用户名和密码是安全地存储在创建的Oracle钱夹里,由于wallet的自动登录特性(auto login)是打开的,也就是说,一旦创建了wallet以后是自动打开的,所以不需要密码去打开wallet。在这个wallet里有证书,而用来连接数据库的用户名和密码的信息就保存在这个证书里。
接下来,我们就开始使用外部密码存储来配置Oracle的客户端。
1.查看Oracle软件默认的wallet目录所在的位置和状态
SQL> set lines 200
SQL> col wrl_type for a10
SQL> col wrl_parameter for a40
SQL> col status for a10
SQL> select * from v$encryption_wallet;
WRL_TYPE WRL_PARAMETER STATUS
---------- ---------------------------------------- ----------
file /u01/oracle/admin/orcl/wallet CLOSED
从上可以看出,wallet的类型是以文件形式存在,而且默认的 wallet就是位于$ORACLE_BASE/admin/$ORACLE_SID/wallet 目录,状态为关闭。那么,我们再去相应的位置查看一下wallet目录是否存在,
[oracle@oracle ~]$ cd /u01/oracle/admin/orcl/
[oracle@oracle orcl]$ ll
total 20
drwxr-x--- 2 oracle oinstall 12288 Feb 17 21:15 adump
drwxr-x--- 2 oracle oinstall 4096 Dec 21 13:44 dpdump
drwxr-x--- 2 oracle oinstall 4096 Dec 21 13:47 pfile
从上可以得知,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目录
[oracle@oracle orcl]$ cd $ORACLE_HOME/owm
[oracle@oracle owm]$ mkdir wallet
[oracle@oracle owm]$ ll
total 12
drwxr-xr-x. 2 oracle oinstall 4096 Dec 21 02:02 install
drwxr-xr-x. 2 oracle oinstall 4096 Dec 21 02:00 jlib
drwxr-xr-x 2 oracle oinstall 4096 Feb 17 21:18 wallet
2.在Oracle客户端开启external password store(外部密码存储)。
2.1使用mkstore命令先创建一个wallet
[oracle@oracle owm]$ mkstore -wrl $ORACLE_HOME/owm/wallet -create
Oracle Secret Store Tool : Version 11.2.0.4.0 - Production
Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
Enter password:
PKI-01002: Invalid password:Passwords must have a minimum length of eight characters and contain alphabetic characters combined with numbers or special characters.
Enter password:
PKI-01002: Invalid password:Passwords must have a minimum length of eight characters and contain alphabetic characters combined with numbers or special characters.
Notes:这里由于密码长度太小,导致创建Wallet不成功
[oracle@oracle owm]$ ll
total 12
drwxr-xr-x. 2 oracle oinstall 4096 Dec 21 02:02 install
drwxr-xr-x. 2 oracle oinstall 4096 Dec 21 02:00 jlib
drwxr-xr-x 2 oracle oinstall 4096 Feb 17 21:18 wallet
[oracle@oracle owm]$ cd wallet/
[oracle@oracle wallet]$ ls
[oracle@oracle wallet]$ mkstore -wrl $ORACLE_HOME/owm/wallet -create
Oracle Secret Store Tool : Version 11.2.0.4.0 - Production
Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
Enter password:
Enter password again:
上面提示,要给wallet输入一个密码(在wallet打开时需要输入,在创建完wallet以后,Oracle会自动打开),这里输入Oracle123(输入的密码不回显),再输入一遍(同样不回显,如果2次输入的不一样,Oracle会提示
重新输入的)。
那么,我们到wallet目录下面查看一下是生成了什么文件。
[oracle@oracle wallet]$ ll
total 8
-rw------- 1 oracle oinstall 3589 Feb 17 21:20 cwallet.sso
-rw------- 1 oracle oinstall 3512 Feb 17 21:20 ewallet.p12
其中cwallet.sso文件是用于保存wallet是否自动登录的信息,ewallet.p12文件是用来保存相关的证书信息,而我们要使用的用户名和密码的信息就保存在证书里。
3.使用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别名有所关联,我们再单独创建一个。
# tnsnames.ora Network Configuration File: /u01/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
BASE =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
其中BASE是我们刚才新建的TNS别名,而ORCL是原先存在的TNS别名。现在开始用mkstore命令创建wallet的证书,如下:
[oracle@oracle admin]$ mkstore -wrl $ORACLE_HOME/owm/wallet -createCredential base scott
Oracle Secret Store Tool : Version 11.2.0.4.0 - Production
Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
Your secret/Password is missing in the command line
Enter your secret/Password:
Re-enter your secret/Password:
Enter wallet password:
Create credential oracle.security.client.connect_string1
其中,前两次输入的密码为用户scott的密码tiger,第三次输入的密码为wallet的密码Oracle123。
上面是创建了wallet的证书,为了让Oracle能够使用wallet,还必须在sqlnet.ora文件(和 tnsnames.ora一样,也是位于$ORACLE_HOME/network/admin目录)中指定WALLET_LOCATION参数和SQLNET.WALLET_OVERRIDE参数。其中,WALLET_LOCATION参数当中DIRECTORY的取值为wallet目录。下面在sqlnet.ora文件中增加这2个参数,
[oracle@oracle admin]$ cd $ORACLE_HOME/network/admin
[oracle@oracle admin]$ ll
total 20
-rw-r--r-- 1 oracle oinstall 651 Feb 4 10:24 listener.ora
drwxr-xr-x. 2 oracle oinstall 4096 Dec 21 02:00 samples
-rw-r--r--. 1 oracle oinstall 381 Dec 17 2012 shrept.lst
-rw-r--r--. 1 oracle oinstall 211 Dec 21 02:28 sqlnet.ora
-rw-r----- 1 oracle oinstall 858 Feb 17 21:26 tnsnames.ora
# sqlnet.ora Network Configuration File: /u01/oracle/product/11.2.0/db_1/network/admin/sqlnet.ora
# Generated by Oracle configuration tools.
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
ADR_BASE = /u01/oracle
WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = /u01/oracle/product/11.2.0/db_1/owm/wallet) ) )
SQLNET.WALLET_OVERRIDE = TRUE
4.现在,我们尝试去用base的连接串去连接Oracle数据库,查看其登录用户为SCOTT,这样就达到了不用输密码登录数据库的目的。
[oracle@oracle admin]$ sqlplus /@base
SQL*Plus: Release 11.2.0.4.0 Production on Fri Feb 17 21:44:16 2017
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> show user;
USER is "SCOTT"
用SCOTT用户去连接Oracle数据库,也是一样的效果。
[oracle@oracle admin]$ sqlplus scott
SQL*Plus: Release 11.2.0.4.0 Production on Fri Feb 17 21:44:25 2017
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Enter password:
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> show user;
USER is "SCOTT"
查看v$encryption_wallet视图变化
SQL> select * from v$encryption_wallet;
WRL_TYPE WRL_PARAMETER STATUS
---------- -------------------------------------------------- --------------------
file /u01/oracle/product/11.2.0/db_1/owm/wallet OPEN_NO_MASTER_KEY
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29812844/viewspace-2134200/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29812844/viewspace-2134200/