程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle的安全標記算不算bug

Oracle的安全標記算不算bug

編輯:Oracle數據庫基礎

Oracle提供了安全標記的功能,即OLS,也就是常說的強制訪問控制。其模型是建立在BLP安全模型之上,並進行了擴展。

BLP模型的元素是安全級別和范圍,即可以對主客體進行安全級別和范圍的設定,從而達到控制數據流動的目的,即向下讀、向上寫的規則。即用戶可以讀低於用戶安全級別的數據,寫高於用戶安全級別的數據(當然還有范圍的約定,這裡不介紹了)。

Oracle擴展了BLP模型,用戶可以設置多個安全級別,通過如下接口:

  1. SA_USER_ADMIN.SET_LEVELS          
  2. Syntax:      
  3. PROCEDURE SET_LEVELS (policy_name IN VARCHAR2,         
  4. user_name          
  5. IN VARCHAR2,         
  6. max_level          
  7. IN VARCHAR2,         
  8. min_level          
  9. IN VARCHAR2 DEFAULT NULL,         
  10. def_level          
  11. IN VARCHAR2 DEFAULT NULL,         
  12. row_level          
  13. IN VARCHAR2 DEFAULT NULL);          
  14. Parameter                                     Meaning      
  15. policy_name                                 SpecifIEs the policy          
  16. user_name                                 SpecifIEs the user name           
  17. max_level                                 The highest level for read and write Access      
  18. min_level                                 The lowest level for write Access def_level                                 SpecifIEs the default level (equal to or   
  19.                                           greater than the minimum level, and equal                                                                                to or less than the maximum level)          
  20. row_level                                 SpecifIEs the row level (equal to or greater                                                                              than the minimum level, and equal to or     

可以看出,用戶標記可以指定最大、最小、默認和行級四種安全級別。這些安全級別之間是有約束關系的

  1. min_level<=max_levelmin_level<=def_level<=max_levelmin_level<=row_level<=def_level  

如果違法這種規則的話,執行此函數就會失敗。了解了這麼多之後,我們進行實踐,以LBACSYS進行登錄,執行如下語句

  1. --創建策略P1,並為策略添加安全級別,數值越大代表安全級別越高。  
  2. --L1<L2<L3<L4 
  3. EXEC sa_sysdba.create_policy('P1','LABEL_COL');  
  4. EXEC sa_components.create_level('P1', 10, 'L1', 'L1');  
  5. EXEC sa_components.create_level('P1', 20, 'L2', 'L2');  
  6. EXEC sa_components.create_level('P1', 30, 'L3', 'L3');  
  7. EXEC sa_components.create_level('P1', 40, 'L4', 'L4');  
  8. --給用戶SYSMAN設置用戶標記  
  9. EXEC sa_user_admin.set_levels('P1','SYSMAN','L2', 'L1', 'L2', 'L2');  

根據上面的介紹,這裡設置的四種安全級別符合要求。我們通過DBA_SA_USER_LABELS視圖可以查看用戶的標記。

  1. SQL> SELECT USER_NAME, LABELS FROM DBA_SA_USER_LABELS;  
  2. USER_NAME      
  3. --------------------------------------------------------------------------------      
  4. LABELS      
  5. --------------------------------------------------------------------------------      
  6. SYSMAN      
  7. MAX READ LABEL='L2',MAX WRITE LABEL='L2',MIN WRITE LABEL='L1',DEFAULT READ LABEL      
  8. ='L2',DEFAULT WRITE LABEL='L2',DEFAULT ROW LABEL='L2' 

可以看到MIN WRITE LABEL = L1

同時Oracle提供了一個系統函數,用於改變標記的值:

  1. Syntax:      
  2. PROCEDURE ALTER_LABEL (         
  3.    policy_name       IN VARCHAR2,         
  4.    label_tag         IN INTEGER,         
  5.    new_label_value   IN VARCHAR2 DEFAULT NULL,         
  6.    new_data_label    IN BOOLEAN  DEFAULT NULL);      
  7. PROCEDURE ALTER_LABEL (  
  8.    policy_name       IN VARCHAR2,         
  9.    label_value       IN VARCHAR2,         
  10.    new_label_value   IN VARCHAR2 DEFAULT NULL,         
  11.    new_data_label    IN BOOLEAN  DEFAULT NULL);      
  12. Table 6–18 Parameters for SA_LABEL_ADMIN.ALTER_LABEL      
  13.    Parameter Name                         Parameter Description   
  14.    policy_name                     SpecifIEs the name of an existing policy       
  15.    label_tag                          IdentifIEs the integer tag assigned to the label                                                                           to be altered       
  16.    label_value                         IdentifIEs the existing character string                                                                                   representation of the label to be altered       
  17.    new_label_value                 SpecifIEs the new character string                                                                                   representation of the label value. If NULL, the                                                                             existing value is not changed.  

此時我們對L1的標記進行改寫

  1. EXEC sa_label_admin.alter_label('P1''L1''L4'TRUE); 

執行成功,我們查看用戶標記表,發現如下所示:

  1. SQL> SELECT USER_NAME, LABELS FROM DBA_SA_USER_LABELS;  
  2. USER_NAME  
  3. --------------------------------------------------------------------------------  
  4. LABELS  
  5. --------------------------------------------------------------------------------  
  6. SYSMAN  
  7. MAX READ LABEL='L2',MAX WRITE LABEL='L2',MIN WRITE LABEL='L4',DEFAULT READ LABEL  
  8. ='L2',DEFAULT WRITE LABEL='L2',DEFAULT ROW LABEL='L2' 

可以看出MIN WRITE LABEL變成了L4,其他的LABEL還是L2,這時的用戶標記已經是不合法的了,在這種情況下,在執行相應操作時,很多操作會被禁止,比如對打了標記的表進行更新操作,因為此時的用戶標記在進行訪問判斷時永遠是恆假值(不過此時系統不會崩潰,有點失望..),以上實驗的版本為11.1.0.6.0

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved