SQL*Plus安全(一)

realkid4發表於2011-02-09

 

SQL*Plus是目前Oracle開發、管理人員最常用的開發管理工具。雖然Oracle在10g、11g新版本中,提供了諸多視覺化管理工具,來簡化Oracle資料庫管理和使用,但是SQL*Plus在多種平臺上仍佔有不可替代的地位。

 

 

安全問題是資料庫管理系統的一個重點。對資料進行有效的許可權控制管理,是保護資料完整性的一種手段。我們通常熟悉的安全性方法,是藉助grant和revoke許可權控制語句,將Oracle相關許可權附加到某個特定的使用者或者角色(使用者集合)。我們稱這種安全控制附加在使用者級別的技術,為user-level security(基於使用者安全技術)。

 

 

但是,在某些時候,這種許可權控制方式是存在一些漏洞的。比較明顯的就是Grant、Revoke和Set Role等命令,這些命令可以動態的將使用者資料庫訪問許可權(物件許可權、角色許可權和系統許可權)進行修改。所以,Oracle針對這種問題,提供了程式級別(Product-Level Security)的安全配置,作為User-Level Security的一種補充。

 

 

SQL*PLUS與PUP

 

Product-Level Security技術的基礎是基於名為Product_User_Profile(以下簡稱為PUP)的資料表。這個資料表是在System使用者的Schema下,通常隨著資料庫的建立而一同生成。

 

 

SQL> conn system/system@orcl;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as system

 

SQL> select * from v$version;

 

BANNER

----------------------------------------------------------------

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod

PL/SQL Release 10.2.0.1.0 - Production

CORE    10.2.0.1.0    Production

 

TNS for 32-bit Windows: Version 10.2.0.1.0 - Production

NLSRTL Version 10.2.0.1.0 - Production

 

SQL> desc product_user_profile;

Name          Type          Nullable Default Comments

------------- ------------- -------- ------- --------

PRODUCT       VARCHAR2(30)                           

USERID        VARCHAR2(30)  Y                        

ATTRIBUTE     VARCHAR2(240) Y                        

SCOPE         VARCHAR2(240) Y                        

NUMERIC_VALUE NUMBER(15,2)  Y                        

CHAR_VALUE    VARCHAR2(240) Y                        

DATE_VALUE    DATE          Y                        

LONG_VALUE    LONG          Y                        

 

SQL>

 

 

說明,如果這個資料表不存在,可以手工的執行指令碼pupbld.sql,但要注意是使用system使用者登入執行。一般這個指令碼位置在$ORACLE_HOME/sqlplus/admin目錄下。

 

 

PUP的含義就是一組定義規則。定義了某個使用者(USERID)在使用某種產品(PRODUCT)的使用,允許執行什麼命令和不允許使用什麼命令。就SQL*PLUS而言,在使用者登入的時候,SQL*PLUS會自動的讀取PUP資料表的配置項。

 

注意:這裡面有一個技術細節!就是使用配置項的獲取點,是在使用者login入系統的時候。也就是說如果我們設定了一個新的許可權規則,使用者只有重新登入入產品才能應用最新的許可權規則。

 

 

PUP使用

 

PUP資料表的結構中,每行就是一個規則專案。規定了使用某項產品的時候,某個使用者使用的許可權。下面是各列的含義和取值(部分參考Oracle官方文件:SQL*PLUS user guide)。

 

PUP列

列資訊描述

備註

PRODUCT

必填專案,應用產品的名稱。不允許為空;

SQLPLUS使用‘SQL*PLUS’,不支援萬用字元;

USERID

規則應用的資料庫使用者ID,來disabled某個使用者執行某種操作的能力;

支援使用萬用字元%;可以為hr、SC%、%;

意味著規則可以對多個使用者使用;

必須為大寫!

ATTRIBUTE

包括在SQL、PL/SQL和SQL*PLUS中需要禁用的命令。

如果要禁用角色設定功能,則需要加入“ROLES”在字串中;

SCOPE

無輸入,Oracle推薦輸入null;

留待其他產品使用;

NUMBERIC_VALUE

無輸入,Oracle推薦輸入null;

留待其他產品使用;

CHAR_VALUE

如果採用禁用SQL、SQLPLUS和PLSQL命令的方式,輸入“DISABLED”;

如果要禁用角色設定功能,必須包括要禁用的角色名稱;

DATE_VALUE

無輸入,Oracle推薦輸入null;

留待其他產品使用;

LONG_VALUE

無輸入,Oracle推薦輸入null;

留待其他產品使用;

 

 

 

 

從資料列的解析上看,Oracle是希望將PUP作為一個安全體系來進行推廣,構建所謂的“Product-Level Security”。雖然目前使用的主要是SQL*PLUS,但以後存在擴充的空間。

 

PUP資料表是在SYSTEM使用者下,SYSTEM使用者具有全部許可權。其他使用者只有select許可權。這樣可以儘可能的保護配置專案安全。

 

下面,我們進行一系列的配置實驗。配置PUP的過程是比較簡單的,使用簡單的insert語句就可以將配置規則插入到其中,不過記住一定是使用system使用者登入。

 

//使用system登入

SQL> conn system/system@orcl;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as system

//向資料表中插入資料

SQL> insert into product_user_profile (product, userid, attribute, char_value)

  2  values ('SQL*PLUS','%','INSERT','DISABLED');

 

1 row inserted

 

SQL> commit; //建立一條規則

……(篇幅原因,略)

 

SQL> col attribute format a10;

SQL> col product format a10;

SQL> col userid format a10;

SQL> col char_value format a10;

SQL> select product,userid,attribute,char_value from product_user_profile;

 

PRODUCT    USERID     ATTRIBUTE  CHAR_VALUE

---------- ---------- ---------- ----------

SQL*PLUS   %          INSERT     DISABLED

SQL*PLUS   %          UPDATE     DISABLED

SQL*PLUS   %          DELETE     DISABLED

SQL*PLUS   SCOTT      HOST       DISABLED

 

 

上面指令碼定義了一個規則集合。簡要的說,就是所有的使用者在使用SQL*PLUS的時候,不能使用insert、update和delete型別的dml語句。使用者scott,不允許使用sqlplus命令host(host命令的作用就是在sqlplus中呼叫作業系統命令列方法)。萬用字元%表示使用所有使用者。下面進行試驗:

 

 

SQL*Plus: Release 10.2.0.1.0 - Production on 星期三 2月 9 20:29:44 2011

 

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

 

SQL> conn hr/hr@orcl;

已連線。

SQL> select count(*) from jobs;  //Select命令沒有禁止

 

  COUNT(*)

----------

        19

 

SQL> delete from jobs;

SP2-0544: 在產品使用者概要檔案中禁用命令 "delete"  //報錯禁止!

SQL> insert into region values(10,'dkk');

SP2-0544: 在產品使用者概要檔案中禁用命令 "insert"  //報錯禁止!

SQL> update employees set first_name=null;

SP2-0544: 在產品使用者概要檔案中禁用命令 "update"  //報錯禁止!

SQL>

 

SQL> host notepad  //OS命令列工具,可以使用!

 

 

現在我們轉換使用者為scott。

 

SQL> conn scott/tiger@orcl

已連線。

SQL> delete from emp;      

SP2-0544: 在產品使用者概要檔案中禁用命令 "delete"  //作為%使用者的一員,被禁用!

SQL> host calc

SP2-0544: 在產品使用者概要檔案中禁用命令 "host"   //針對scott使用者的設定,被禁用!

SQL>

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17203031/viewspace-686923/,如需轉載,請註明出處,否則將追究法律責任。

相關文章