使用Oracle的Security External Password Store功能實現加密登入
使用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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 安卓指紋對稱加密及登入功能的實現安卓加密
- js逆向實戰之某網遊登入引數password加密JS加密
- Java Web實現使用者登入功能JavaWeb
- 站點登入功能的實現
- [譯] 學習 Spring Security(八):使用 Spring Security OAuth2 實現單點登入SpringOAuth
- 一起來實現單使用者登入 —— 功能實現
- Spring Security原始碼分析五:Spring Security實現簡訊登入Spring原始碼
- Spring Security系列之實現簡訊登入(十)Spring
- 如何基於 Security 實現 OIDC 單點登入?
- 如何基於Security實現OIDC單點登入?
- 使用Oracle客戶端wallet實現匿名登入Oracle客戶端
- Spring Security 實戰乾貨:實現自定義退出登入Spring
- Spring Cloud Security:Oauth2實現單點登入SpringCloudOAuth
- 使用Go語言web框架wego實現使用者登入功能GoWeb框架
- Spring Security使用(二) 非同步登入Spring非同步
- SSM專案使用攔截器實現登入驗證功能SSM
- SpringBoot + Spring Security 學習筆記(五)實現簡訊驗證碼+登入功能Spring Boot筆記
- Jmeter 登入使用了 jsencrypt 加密密碼的登入介面JMeterJS加密密碼
- Spring Security實現統一登入與許可權控制Spring
- golang Iris 實現登入踢人功能 (擠號)Golang
- 面試官:如何實現掃碼登入功能?面試
- 實現基於JWT的Token登入驗證功能JWT
- JSP(ajax)+Servlet實現簡單的登入功能JSServlet
- Spring Security Oauth2.0 實現簡訊驗證碼登入SpringOAuth
- Spring Security——基於表單登入認證原理及實現Spring
- Spring Security系列教程之實現CAS單點登入上篇-概述Spring
- 使用CAS實現單點登入
- django與小程式實現登入驗證功能Django
- 一文徹底搞定Spring Security 認證,實現登陸登出功能Spring
- Laravel5.8 入門系列二,快速實現使用者註冊登入功能Laravel
- Ubuntu輸入password登陸後又跳回到登入介面Ubuntu
- 部落格後臺登入,使用者,說說等功能實現
- Struts2+AJAX+JQuery 實現使用者登入與註冊功能。jQuery
- iOS 登入加密iOS加密
- Spring Security原始碼分析三:Spring Social實現QQ社交登入Spring原始碼
- jwt以及如何使用jwt實現登入JWT
- Spring Security原始碼分析十二:Spring Security OAuth2基於JWT實現單點登入Spring原始碼OAuthJWT
- j_security_check使用者的登入資訊儲存在哪?