ITPub博客

首页 > 数据库 > Oracle > 使用Oracle的Security External Password Store功能实现加密登录

使用Oracle的Security External Password Store功能实现加密登录

原创 Oracle 作者:梓沐 时间:2017-02-24 10:19:58 0 删除 编辑

使用OracleSecurity External Password Store功能实现加密登录,不将明文密码暴露在生产环境当中。
原文地址:http://mp.weixin.qq.com/s/2SbP2IOq3ImjYeMkeS9QIA

    如果需要从SHELL脚本来连接到Oracle数据库,那么这些脚本包含数据库连接详细信息,这可能是一个主要的安全问题。一个解决方案是使用操作系统身份验证,但Oracle10g2版提供了使用安全外部密码存储的功能。其中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数据库安全外部密码存储的密码

什么是OracleSecure 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

其中orclsalTNS别名,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_HOMEOracle软件所在目录,而且我们也不允许去改动这里的目录和文件)


下面进行创建
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/,如需转载,请注明出处,否则将追究法律责任。

下一篇: Linux手动释放Cache
请登录后发表评论 登录
全部评论
擅长PLS/QL开发,SQL调优和改写,数据库设计

注册时间:2014-08-18

  • 博文量
    161
  • 访问量
    1086237