聊聊Oracle的OS驗證登入
使用者名稱、密碼是我們最常見的安全驗證策略方法,也是我們在各種應用系統軟體中採用的最多的安全保護策略。對Oracle而言,以最大限度保護系統資料安全,是不可推卸的天然職責。
從最早版本到今天,Oracle在使用者名稱和密碼安全策略方面不斷的加以改進,比如,進入11g之後,Default Profile要求定期進行使用者密碼修改操作,使用者密碼加密演算法強化,以及對dba_users等資料字典檢視進行最佳化改進。今天我們要討論的是一種Oracle的另一種驗證策略——OS驗證策略。
這裡,我們要進行一定澄清。最常見的OS驗證策略,發生在Oracle伺服器端的機器上。突出的表現是:如果我們透過了作業系統層面驗證,也就是登入了伺服器本機(Remote Desktop或者SecurCRT),Oracle就認為當前使用者已經可以透過認證,不需要額外的資料庫驗證。當然,這要求作業系統使用者歸屬在系統特定使用者組,如Linux中的oinstall、dba。比如我們經常啟動關閉伺服器使用的conn /方式,就是這個型別登入驗證方法。注意:透過在sqlnet.ora中引數的配置,我們是可以關閉這個特性的。
普通的OS驗證策略兩個特點:一個是伺服器本地生效,客戶端匿名登入無效。另一個只能登入為管理員sys,不能其他使用者。那麼,有沒有方法實現客戶端遠端匿名登入,而且實現非sys使用者呢?本篇我們就來介紹這個方法。
1、實驗環境介紹
我們實驗環境為Oracle 11g,具體版本為11.2.0.4。伺服器為Linux版本。
SQL> select * from v$version;
BANNER
---------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE 11.2.0.4.0 Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production
與本實驗相關的引數保持預設狀態。
SQL> show parameter os
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_lost_write_protect string NONE
diagnostic_dest string /u01/app
optimizer_index_cost_adj integer 100
os_authent_prefix string ops$
os_roles boolean FALSE
remote_os_authent boolean FALSE
remote_os_roles boolean FALSE
timed_os_statistics integer 0
預設情況下,我們只能在伺服器端實現匿名登入,登入之後直接以最高許可權sys的角色出現。
SQL> conn / as sysdba
Connected.
SQL> show user
USER is "SYS"
不新增as sysdba登入過程是不允許的。
SQL> conn /
ERROR:
ORA-01017: invalid username/password; logon denied
下面我們來討論如何進行OS層面驗證。
2、伺服器端OS驗證配置
Oracle的OS層面驗證,最直接的關聯引數就是os_authent_prefix,預設取值為ops$。這種技術是很簡單的,是建立在作業系統使用者名稱與資料庫使用者名稱之間的對映規則上。
Oracle規定,如果嘗試連線資料庫的作業系統使用者名稱新增引數os_authent_prefix作為字首之後,與資料庫某一個特定使用者名稱schema相同,那麼就可以實現OS驗證配置。注意:這個規則是在伺服器端成立的。比如:如果當前連線的作業系統名為oracle,os_authent_prefix為ops$,如果此時資料庫中包括一個為ops$oracle的使用者,是可以在伺服器端進行匿名登入的。
下面進行測試,當前Linux伺服器端OS使用者名稱為oracle,也是oinstall和dba組成員。
[oracle@localhost ~]$ id
uid=500(oracle) gid=500(oinstall) groups=500(oinstall),501(dba),502(oper) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
建立使用者ops$oracle,授予一定許可權。
SQL> create user ops$oracle identified by oracle;
User created.
SQL> grant connect, resource to ops$oracle;
Grant succeeded.
這樣conn /後不帶as sysdba登入就允許透過了。
SQL> conn /
Connected.
SQL> show user
USER is "OPS$ORACLE"
如果新增了as sysdba,匿名管理員登入同樣成立。
SQL> conn / as sysdba
Connected.
SQL> show user
USER is "SYS"
這個規則在伺服器端還是問題不大,在現實環境中實際意義也不是很大。但是,這個特性勢必會引起一個想法:匿名遠端登入是否可以實現?
3、匿名OS驗證遠端登入
在之前筆者的文章中,我們討論過什麼是“遠端登入”。結論是:對Oracle而言,只要透過監聽器程式的過程,Oracle都會將其作為遠端登入。而不是去探究登入動作是不是伺服器端發生。要經過監聽器程式,最直接的就是登入中加入@地址標記符。
我們首先在伺服器端進行試驗,其上已經有sicspcdb的本地連線命名。
[oracle@localhost ~]$ tnsping sicspcdb
TNS Ping Utility for Linux: Version 11.2.0.4.0 - Production on 14-JUL-2014 17:47:08
Copyright (c) 1997, 2013, Oracle. All rights reserved.
Used parameter files:
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = sicspcdb)))
OK (0 msec)
測試伺服器端OS匿名驗證。
SQL> conn /@sicspcdb
ERROR:
ORA-01017: invalid username/password; logon denied
SQL> conn /@sicspcdb as sysdba
ERROR:
ORA-01017: invalid username/password; logon denied
遠端匿名登入,Oracle預設是關閉的。這個在實際生產環境中非常有必要,遠端客戶端對於Oracle而言是不安全可靠的。如果希望開啟,需要調整引數remote_os_authent。
SQL> alter system set remote_os_authent=true;
alter system set remote_os_authent=true
*
ERROR at line 1:
ORA-02095: specified initialization parameter cannot be modified
該引數需要重啟資料庫。
SQL> alter system set remote_os_authent=true scope=spfile;
System altered.
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance
ORACLE instance started.
Total System Global Area 2.0911E+10 bytes
Fixed Size 2262368 bytes
Variable Size 1.1677E+10 bytes
Database Buffers 9193914368 bytes
Redo Buffers 38170624 bytes
Database mounted.
Database opened.
注意:我們修改引數之後,重啟Oracle報提示過期引數出現在例項啟動環節。這個現象我們注意下來,之後討論!
Os引數修改成功。
SQL> show parameter os
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
(篇幅原因,有省略……)
os_authent_prefix string ops$
os_roles boolean FALSE
remote_os_authent boolean TRUE
remote_os_roles boolean FALSE
timed_os_statistics integer 0
為了後續操作,生成一份pfile。
SQL> create pfile from spfile;
File created.
此時,在Linux伺服器端OS匿名登入成功。
SQL> conn / --伺服器本地登入成功
Connected.
SQL> conn /@sicspcdb –-伺服器遠端匿名登入成功
Connected.
SQL> show user
USER is "OPS$ORACLE"
SQL> conn /@sicspcdb as sysdba
ERROR:
ORA-01017: invalid username/password; logon denied –sys遠端匿名登入失敗!
下面我們在windows客戶端上進行測試,看遠端客戶端OS匿名登入是否成功。Windows作業系統使用者名稱為admin,需要在資料庫中進行額外配置。
SQL> create user ops$admin identified by oracle;
User created.
SQL> grant connect, resource to ops$admin;
Grant succeeded.
在windows本地測試:
--本地TNS名稱驗證
C:\Users\admin>tnsping sicspcdb_linux_bk
TNS Ping Utility for 64-bit Windows: Version 11.2.0.4.0 - Production on 14-7月 -
2014 18:04:25
Copyright (c) 1997, 2013, Oracle. All rights reserved.
已使用的引數檔案:
D:\app\admin\product\11.2.0\dbhome_1\network\admin\sqlnet.ora
已使用 TNSNAMES 介面卡來解析別名
嘗試連線 (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.1
6.19.2)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = sicspcdb)))
OK (10 毫秒)
登入測試。
C:\Users\admin>sqlplus /nolog
SQL*Plus: Release 11.2.0.4.0 Production on 星期一 7月 14 18:04:45 2014
Copyright (c) 1982, 2013, Oracle. All rights reserved.
SQL> conn /@sicspcdb_linux_bk
已連線。
SQL> show user
USER 為 "OPS$ADMIN"
實驗成功!透過引數remote_os_authent的開啟,可以幫助我們實現客戶端的匿名登入。
4、匿名登入與安全
隨著我們日常生活資訊化,越來越多的系統出現在我們身邊,記住各種系統的使用者名稱密碼開始成為生活工作的負擔。所以,類似於單點登入的技術會有很大的發展前景。但是,對於資料庫而言,OS匿名登入還是存在很大的風險。
Oracle資料庫連線驗證包括幾個要素:伺服器IP地址、服務名、連線埠和使用者名稱密碼資訊。從資訊公開角度看,伺服器IP地址、服務名和連線埠是沒有什麼秘密而言的。真正能夠起到資料保護的,也就是使用者名稱和密碼資訊。如果普遍採用OS匿名登入,特別是客戶端普遍使用,只要作業系統建立一個特定的使用者,就可以直接登入,顯然是危險的。
回到我們重啟資料庫過程中,報錯過期引數使用的情況。我們開啟生成的pfile檔案,可以看到設定的remote_os_authent引數。
[oracle@localhost dbs]$ cat initsicspcdb.ora
sicspcdb.__db_cache_size=9193914368
*.processes=1000
*.remote_login_passwordfile='EXCLUSIVE'
*.remote_os_authent=TRUE
*.sessions=1105
*.undo_tablespace='UNDOTBS1'
使用這個pfile啟動資料庫,可以報錯更加清晰。
SQL> startup pfile=initsicspcdb.ora
ORA-32006: REMOTE_OS_AUTHENT initialization parameter has been deprecated
Remote_os_authent已經被認為過期,Oracle甚至不推薦我們再使用這個引數了。在pfile中刪除引數,重新啟動資料庫。
*.remote_login_passwordfile='EXCLUSIVE'
*.remote_os_authent=FALSE
*.sessions=1105
*.undo_tablespace='UNDOTBS1'
--剔除之後
Database dismounted.
ORACLE instance shut down.
SQL> startup pfile=initsicspcdb.ora
ORACLE instance started.
Total System Global Area 2.0911E+10 bytes
Fixed Size 2262368 bytes
Variable Size 1.1677E+10 bytes
Database Buffers 9193914368 bytes
從這個現象,我們可以猜測:Oracle也不推薦使用OS驗證。
5、結論
OS匿名驗證這個特性出現的很早,是早期Oracle發展的一個方向。近些年的版本中,這個特性沒有過多的發展,說明Oracle在這個方面已經不再過多延伸了。在筆者之前的文章中,也介紹過藉助Oracle客戶端wallet特性實現的匿名登入,兩者原理不同,安全性差異也有千差萬別。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8494287/viewspace-1351107/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ORACLE登入驗證方式的詳解Oracle
- Oracle 登入的三種驗證機制Oracle
- oracle中使用者登入的驗證方法Oracle
- oracle使用者登入驗證總結Oracle
- 登入驗證碼生成kaptcha(輸入驗證碼)APT
- MySQL登入驗證方式MySql
- JS登入驗證nullJSNull
- python驗證登入Python
- Laravel- Auth 登入驗證Laravel
- ASP.NET登入驗證ASP.NET
- GitHub--oauth驗證登入GithubOAuth
- Django 使用LDAP驗證登入DjangoLDA
- Oracle基礎結構之OS驗證和口令檔案驗證Oracle
- js登入與註冊驗證JS
- APPCNA 指紋驗證登入APP
- CAS自定義登入驗證方法
- android Volley登入驗證的使用Android
- [翻譯] 如何修改 Laravel 的登入驗證Laravel
- HTML_登入時的JS驗證方法HTMLJS
- uniapp 完成兩種方式登入 驗證碼登入 密碼登入APP密碼
- app直播原始碼,登入時輸入驗證碼、簡訊驗證身份APP原始碼
- vue登入註冊,帶token驗證Vue
- django 自定義登入驗證邏輯Django
- 用Abp實現兩步驗證(Two-Factor Authentication,2FA)登入(三):免登入驗證
- 遊戲陪玩原始碼的登入方式,簡訊驗證碼登入的實現遊戲原始碼
- 聊聊小程式的登入邏輯
- 詳解Spring Security的HttpBasic登入驗證模式SpringHTTP模式
- 實現基於JWT的Token登入驗證功能JWT
- PHP結合Ajax實現登入驗證的DemoPHP
- golang 中使用 JWT 實現登入驗證GolangJWT
- vue實現簡訊驗證碼登入Vue
- Laravel-admin 登入新增驗證碼Laravel
- sql 注入越過登入驗證例項SQL
- node實現登入圖片驗證碼
- spring mvc實現登入驗證碼SpringMVC
- Spring Security 一鍵接入驗證碼登入和小程式登入Spring
- sqlnet.ora 驗證oracle 登陸方式SQLOracle
- 通過selenium突破極驗驗證實現登入