聊聊Oracle的OS驗證登入

dbhelper發表於2014-11-29

 

使用者名稱、密碼是我們最常見的安全驗證策略方法,也是我們在各種應用系統軟體中採用的最多的安全保護策略。對Oracle而言,以最大限度保護系統資料安全,是不可推卸的天然職責。

從最早版本到今天,Oracle在使用者名稱和密碼安全策略方面不斷的加以改進,比如,進入11g之後,Default Profile要求定期進行使用者密碼修改操作,使用者密碼加密演算法強化,以及對dba_users等資料字典檢視進行最佳化改進。今天我們要討論的是一種Oracle的另一種驗證策略——OS驗證策略。

這裡,我們要進行一定澄清。最常見的OS驗證策略,發生在Oracle伺服器端的機器上。突出的表現是:如果我們透過了作業系統層面驗證,也就是登入了伺服器本機(Remote Desktop或者SecurCRT),Oracle就認為當前使用者已經可以透過認證,不需要額外的資料庫驗證。當然,這要求作業系統使用者歸屬在系統特定使用者組,如Linux中的oinstalldba。比如我們經常啟動關閉伺服器使用的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驗證配置

 

OracleOS層面驗證,最直接的關聯引數就是os_authent_prefix,預設取值為ops$。這種技術是很簡單的,是建立在作業系統使用者名稱與資料庫使用者名稱之間的對映規則上。

Oracle規定,如果嘗試連線資料庫的作業系統使用者名稱新增引數os_authent_prefix作為字首之後,與資料庫某一個特定使用者名稱schema相同,那麼就可以實現OS驗證配置。注意:這個規則是在伺服器端成立的。比如:如果當前連線的作業系統名為oracleos_authent_prefixops$,如果此時資料庫中包括一個為ops$oracle的使用者,是可以在伺服器端進行匿名登入的。

下面進行測試,當前Linux伺服器端OS使用者名稱為oracle,也是oinstalldba組成員。

 

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

相關文章