使用Oracle的Security External Password Store功能實現加密登入

梓沐發表於2017-02-24

使用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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章