Oracle OS 認證, 口令檔案
1、os認證
oracle安裝之後預設情況下是啟用了os認證的,這裡提到的os認證是指伺服器端os認證。os認證的意思把登入資料庫的使用者和口令校正放在了作業系統一級。如果以安裝oracle時的使用者登入os,那麼此時在登入oracle資料庫時不需要任何驗證,如:
SQL> connect /as sysdba
已串連。
SQL> connect sys/aaa@dmt as sysdba
已串連。
SQL> connect sys/bbb as sysdba
已串連。
SQL> connect aaa/bbb as sysdba
已串連。
SQL> show user
USER 為 "SYS"
SQL>
不論輸入什麼使用者(哪怕這個使用者如aaa在資料庫中根本不存在),只要以sysdba許可權串連資料庫,都可以串連上,並且串連使用者是sys,這樣很方便,有時候,如果忘記了資料庫的密碼,而又想登入資料庫,可以通過這種方式,前提是在資料庫伺服器上;但是方便的同時也帶來了一些安全隱患,於是很多人想屏蔽os認證,在win下只要把oracle_home/NETWORK/admin/sqlnet.ora中的SQLNET.AUTHENTICATION_SERVICES= (nts)nts改成none或者注釋掉這句話(在前面加上#),就可以屏蔽os功能,要想以sys使用者連上資料庫必須輸入正確的sys口令,如:
SQL> connect /as sysdba
ERROR:
ORA-01031: 許可權不足
SQL> connect sys/aaa as sysdba
ERROR:
ORA-01017: 使用者名稱/口令無效; 登入被拒絕
SQL> connect aaa/bbb as sysdba
ERROR:
ORA-01031: 許可權不足
SQL> connect sys/system as sysdba
已串連。
SQL>
或者可以把oracle的安裝使用者從組ora_dba中刪除掉,當然也可以直接把ora_dba這個組也刪除,都可以屏蔽os功能。在unix/linux下也可以在檔案sqlnet.ora中增加SQLNET.AUTHENTICATION_SERVICES=(none)以及刪除dba(groupdel dba)組或者把oracle使用者從dba組中刪除都可以屏蔽os認證。利用這兩種方法屏蔽os功能似乎總有些讓人不放心,或者說不能讓人完全信服,因為畢竟系統管理員還是可以建立ora_dba or dba組以及修改sqlnet.ora檔案,如何徹底屏蔽os功能?讓它"永世不得翻身"呢?我沒有這方面的經驗,大家可以補充!
2、口令檔案
oracle的口令檔案的作用是存放所有以sysdba或者sysoper許可權串連資料庫的使用者的口令,如果想以sysdba許可權遠端連線資料庫,必須使用口令檔案,否則不能連上,由於sys使用者在串連資料庫時必須以sysdba or sysoper方式,也就是說sys使用者要想串連資料庫必須使用口令檔案,因此我認為在資料庫中存放sys使用者的口令其實沒有任何意義!使用口令檔案的好處是即使資料庫不處於open狀態,依然可以通過口令檔案驗證來串連資料庫。開始安裝完oracle,沒有給普通使用者授予sysdba許可權,口令檔案中只存放了sys的口令,如果之後把sysdba許可權授予了普通使用者,那麼此時會把普通使用者的口令從資料庫中讀到口令檔案中儲存下來,當然這時必須要求資料庫處於open狀態。如:
SQL> grant sysdba to test;
授權成功。
SQL> connect test/aaa@orcl as sysdba
ERROR:
ORA-01017: 使用者名稱/口令無效; 登入被拒絕
警告: 您不再串連到 ORACLE。
SQL> connect test/test@orcl as sysdba
已串連。
SQL> alter database close;
資料庫已更改。
SQL> grant sysdba, sysoper to test;
grant sysdba, sysoper to test
*
第 1 行出現錯誤:
ORA-01109: 資料庫未開啟
到底有幾個使用者被授予了sysdba或者sysoper許可權,可以通過查詢如下v$pwfile_users獲得,v$pwfile_users的資訊就是源於口令檔案的(This view lists users who have been granted SYSDBA and SYSOPER privileges as derived from the password file.)
SQL> select * from v$pwfile_users;
USERNAME SYSDB SYSOP
------------------------------ ----- -----
SYS TRUE TRUE
TEST TRUE FALSE
到底可以有幾個使用者被授予sysdba或者sysoper許可權,是由建立口令檔案時指定的entries數決定的,準確的說還不完全是,最終還和os block的大小有關,如果entries指定了5,一個os block可以存放8個使用者的口令,那麼可以由8個使用者被授予sysdba或者sysoper。
下面看一個簡單的測試:
SQL> declare
2 v_string varchar2(100);
3 begin
4 for i in 1..100 loop
5 v_string := 'create user test'||i||' identified by test'||i;
6 execute immediate v_string ;
7 end loop;
8 end;
9 /
PL/SQL 過程已成功完成。
SQL> select count(*) from dba_users where username like '%TEST%';
COUNT(*)
----------
101
這裡之所以是101,是因為之前已經建立過test使用者
SQL> declare
2 v_string varchar2(100);
3 begin
4 for i in 1..100 loop
5 v_string := 'grant sysdba to test'||i;
6 execute immediate v_string ;
7 end loop ;
8 end ;
9 /
declare
*
第 1 行出現錯誤:
ORA-01996: GRANT 失敗: 口令檔案 '' 已滿
ORA-06512: 在 line 6
SQL> select * from v$pwfile_users;
USERNAME SYSDB SYSOP
------------------------------ ----- -----
SYS TRUE TRUE
TEST1 TRUE FALSE
TEST2 TRUE FALSE
TEST3 TRUE FALSE
TEST4 TRUE FALSE
TEST5 TRUE FALSE
TEST6 TRUE FALSE
TEST7 TRUE FALSE
TEST8 TRUE FALSE
已選擇9行。
SQL>
可以清楚的看到v$pwfile_users裡面並不是建立口令檔案時指定的entries=5而是9條記錄,意味著9個使用者的口令佔用了一個os block,其實也可能是多個os block,總之這些block都是滿的,但是觀察口令檔案,還是佔了2k,這是我解釋不清的地方。通過os命令發現;每個簇位元組數4096;這裡其實就是os block 大小實際上是4k,但是口令檔案佔用了2k,根本沒有用滿一個os block,不知道何故,也是我的疑惑 (
This parameter specifies the number of entries that you require the password file to accept. This number corresponds to the number of distinct users allowed to connect to the database as SYSDBA or SYSOPER. The actual number of allowable entries can be higher than the number of users, because the ORAPWD utility continues to assign password entries until an operating system block is filled. For example, if your operating system block size is 512 bytes, it holds four password entries. The number of password entries allocated is always a multiple of four.
)
win下查看os block大小
C:\WINDOWS\system32>fsutil fsinfo ntfsinfo e:
NTFS 卷序號 : 0x12afb454f6e54b31
版本 : 3.1
區數量 : 0x00000000040270d0
簇總數 : 0x0000000000804e1a
可用簇 : 0x00000000000b8d41
保留總數 : 0x0000000000000000
每個扇區位元組數 : 512
每個簇位元組數 : 4096
每個 FileRecord 段的位元組數 : 1024
每個 FileRecord 段的簇數 : 0