ORACLE中的許可權/角色/DBA/SYSDBA以及remote_login_passwordfile引數的作用

liuhaimiao發表於2014-09-18
該問題源於我們現場的一個安全需求
我們想把作業系統使用者root/oracle的密碼改複雜,也把資料庫的sys使用者密碼改複雜.
但是突然發現一個具有dba角色的一般使用者wgmes能夠修改sys的密碼,也能以as sysdba 的方式登入進系統.
非常不安全,查過很多資料後才發現這幾個概念原來一直都被我混淆了

0.模式(schema)與使用者(user)
  這組概念幾乎相同,下文均以 使用者 來指代

1.許可權(privileges))
  許可權是某個使用者能做的行為的定義
  比如說 A使用者可以 刪除任何表,那麼就說該使用者擁有 drop any table 許可權
  反過來 若A使用者擁有drop any table 許可權,那麼他就可以刪除任何表格.
  有些許可權是針對使用者物件的---比如特定表上插入資料的許可權,被稱為物件許可權(object privileges)
  另外一些許可權是針對系統物件的---比如建立同義詞,對錶空間擁有無限配額,被稱為系統許可權(system privileges)
  這些系統許可權還有兩類,一類是需要資料庫被open之後才能行使的許可權,比如建立表,drop表
                       另外一類是不需要open就可以的,比如備份,建立資料庫,改歸檔模式等等.

  常見的系統許可權有:
    
CHANGE NOTIFICATION
ADMINISTER ANY SQL TUNING SET
ALTER ANY SQL PROFILE
CREATE RULE
EXPORT FULL DATABASE
EXECUTE ANY EVALUATION CONTEXT
DEQUEUE ANY QUEUE
DROP ANY INDEXTYPE
ALTER ANY INDEXTYPE

  其中有兩個極為特殊的系統許可權.SYSDBA和SYSOPER,後面我再說這兩個系統許可權的用途.

2.角色(role)
  當給某個使用者賦予許可權的時候,可以直接對其賦予許可權.
  也可以先將若干許可權形成一個集合體,在將這個集合體整體賦予該使用者.這裡這個許可權的集合體就是角色(role)
  比如我們建立了兩個使用者A和B,都想作為平時的資料庫管理員使用,
  那麼我們可以先建立一個角色.該角色擁有調整表空間/設定簇大小/建立索引等等一大堆系統許可權,然後把該角色賦予使用者A和B即可

  oracle10G預設的一個dba角色就是出於該種目的而設立的角色.其帶有常見管理員需要的系統許可權.同時他也有SYSDBA系統許可權

3.登入方式
  在我們登入系統時候, sqlplus AAA/BBB@hbis 這樣的命令實際上是一個簡化的命令
  真正的命令是       sqlplus AAA/BBB@hbis normal                        -1
  與之相對應的 還有  sqlplus AAA/BBB@hbis as sysdba                     -2
               或者  sqlplus sys/BBB@hbis as sysdba                     -3
  
  先說第一種情況,這是normal登入方式,表明我們想用AAA使用者正常登入進系統,
                 這個時候如果從V$SESSION 檢視,是能看到AAA使用者登入進來的.

  而如果我們想用sys使用者登入進來, 必須使用第三種方式的命令,
  這裡面的 as sysdba實際上是一種登入方式.由於sys使用者擁有擁有全部許可權.包括所有的系統許可權和物件許可權.
還有那些不需要open就可以行使的許可權,比如備份,建立資料庫,改歸檔模式等.
   因此在使用sys使用者登入時候,要求必須使用 as sysdba 來宣告這次是用sys使用者來行使其巨大的許可權.
   這個時候如果從V$SESSION 檢視,是能看到SYS使用者登入進來的.

   而有的時候,我們想臨時性的給予某個使用者那些巨大的許可權,那麼就可以使用第二種方式.
   首先先給AAA使用者賦予上面提到的極為特殊的系統許可權 SYSDBA 許可權.
   grant sysdba to AAA.
   這個系統許可權允許你 在登入時候 使用 as sysdba 子句來強迫系統將你識別為sys使用者,從而能用AAA使用者的密碼來行使sys使用者的那些巨大許可權
   然後 sqlplus AAA/BBB@hbis as sysdba  
   這裡as sysdba 會告訴系統我將使用sys系統的那些巨大許可權.
   此時從V$SESSION 檢視,是能看到SYS使用者,而不是AAA登入進來的.

4.密碼檔案與使用者密碼
  首先要知道,sys使用者從例項開始就存在,也就是nomount甚至IDLE instance的時候就有了.所以這個使用者的密碼不能像其他使用者那樣放在資料庫裡面.
  而一定要在作業系統的特定檔案中,也就是database或者dbs資料夾下面的oraSID.ora檔案.可以透過orapwd命令來生成.
  同樣,如果某個使用者想透過as sysdba方式來登入,也需要存放在這個檔案裡. 
  也就是說,只有具有sysdba系統許可權的使用者,才會在密碼檔案中有記錄
  因此很容易猜到,在賦予或收回sysdba系統許可權的時候,這個檔案裡面也會新增或移除該使用者的記錄.
  而想看系統中哪些使用者擁有sysdba系統許可權呢,請查詢select * from v$pwfile_users.


5.我們的情況
   由於我們的wgmes 使用者是個具有dba角色的使用者,因此他可以自由的使用as sysdba方式登入進系統.然後修改sys使用者的密碼.很不安全
   最後只好revoke了dba角色的sysdba系統許可權,然後revoke了dba角色的alter user許可權.
   這樣可以讓這個wgmes使用者不再去幹預sys的情況.
   其實我們的系統最大的問題是給一個普通使用者賦予了dba角色,而現在又不知道能不能revoke這個角色,不敢輕易的行動,只好現在最緊要的地方,也就是sysdba系統許可權收回來.

6.remote_login_passwordfile
  最後說說這個引數
  這個引數可以設定為 EXCLUSIVE  NONE 和 SHARED三種,用來負責說明sys以及想透過as sysdba方式登入進系統的那些使用者密碼的 
  
  當設定為NONE      時候.不允許遠端使用者用sys登入系統 不使用密碼檔案登入
  當設定為EXCLUSIVE 時候,允許遠端以sys登入,允許非sys使用者以as sysdba方式登入
  當設定為SHARED    時候,允許遠端以sys登入,允許非sys使用者以as sysdba方式登入,不能修改密碼

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

相關文章