前言:
數據庫安全的目的是保護數據庫系統中的數據,防止數據被泄露、篡改、破壞等。
這裏我們主要從用戶權限控制和審計去介紹數據庫安全
一、用戶權限控制
1、權限
在介紹用戶和角色前,我們先來看一下什麼是權限
什麼是權限?
執行某些特定SQL語句的能力以及訪問或維護某一特定對象的能力。
權限的類型
權限的類型 | 作用 | 例子 |
---|---|---|
系統權限 | 用戶可以執行一類特定的SQL語句 | 用戶A想要連接數據庫,則用戶A需要有CREATE SESSION系統權限 |
對象權限 | 用戶可以訪問或維護某一特定對象 | 用戶A訪問用戶B的表C,則用戶A需要有表C的SELECT對象權限 |
系統權限是什麼?
- 用戶進行系統操作的能力
- 系統管理員(SYS用戶、DBA角色)擁有所有系統權限
系統權限示例
系統權限 | 權限說明 |
---|---|
CREATE SESSION | 連接數據庫 |
CREATE USER | 創建新用戶 |
ALTER USER | 修改用戶信息 |
DROP USER | 刪除用戶 |
CREATE ROLE | 創建新角色 |
DROP ANY ROLE | 刪除任意角色 |
GRANT ANY PRIVILEGE | 授予/回收任意系統權限 |
GRANT ANY ROLE | 授予/回收任意角色 |
GRANT ANY OBJECT PRIVILEGE | 授予任意用戶的對象的權限 |
…… | …… |
對象權限是什麼?
- 對數據庫對象執行各種操作的能力
- 對象的所有者(即創建對象的用戶)和系統管理員(SYS用戶、DBA角色)擁有該對象的所有權限。也就是說用戶對自己的對象進行操作是不需要被賦予對象權限的。
- 對象權限是對其他用戶擁有的對象進行操作前需要被賦予的。
對象權限示例:
對象權限 | 權限說明 |
---|---|
SELECT | 訪問其他用戶的對象 |
DELETE | 刪除其他用戶的對象數據 |
UPDATE | 更新其他用戶的對象數據 |
ALTER | 更改其他用戶的對象定義 |
INSERT | 往其他用戶的對象插入數據 |
INDEX | 創建索引 |
…… | …… |
2、用戶
作爲數據庫管理員,需要爲每一個需要連接數據庫的使用者規劃一個數據庫用戶。
數據庫用戶的主要用途
- 連接數據庫。
- 訪問數據庫對象和執行SQL語句。
數據庫用戶可以分爲三類
- 系統管理員:具有數據庫的最高權限,並且具有所有的系統權限和對象權限(如SYS用戶、SYSDBA用戶)。
- 安全管理員:具有CREATE USER權限的帳戶。
- 普通用戶:普通用戶默認具有PUBLIC對象權限,沒有其他任何權限,需要系統管理員通過GRANT語句賦權。
補充:
SYS:數據庫初始超級管理員用戶 具有數據庫的最高權限,並且具有所有的系統權限和對象權限。 建議數據庫安裝後及時修改SYS初始密碼。
PUBLIC:公共用戶 此用戶無法登錄數據庫,它表示所有數據庫用戶的集合。如果某個權限賦於了PUBLIC,那麼所有數據庫的用戶都可以有這個權限。 爲了保障數據庫的數據安全,請謹慎向PUBLIC用戶授予對象權限。
若某用戶想把他某個對象的某個權限授予數據庫所有的用戶,那他可以直接將此權限授予PUBLIC用戶,可避免多次授權操作。
- 用戶的創建
語法
CREATE USER user_name IDENTIFIED BY password;
參數說明
- user_name: 創建的用戶名。
- password:用戶密碼,需要滿足密碼複雜度。
注意事項:
執行該語句的用戶需要有CREATE USER系統權限。
用戶名不能和數據庫中已存在的用戶名和角色名重複。
創建用戶時,需要指定用戶名和密碼。
SYS用戶和PUBLIC用戶不允許創建,是系統預置用戶。
例子:
創建用戶smith,密碼爲database_123
CREATE USER smith IDENTIFIED BY database_123;
- 用戶的修改
語法
ALTER USER user_name IDENTIFIED BY new_password;
參數說明
- user_name: 要修改的用戶名。
- new_password:新的用戶密碼
例子:
將用戶smith的密碼修改爲database_456。
ALTER USER smith IDENTIFIED BY database_456;
應用場景:
- 修改用戶密碼。
- 手動鎖定用戶或給用戶解鎖。
- 給用戶指定配置檔案。
- 定義用戶默認表空間。
- 用戶的刪除
語法
DROP USER [ if exists ] user_name [ CASCADE ];
參數說明
- user_name: 要刪除的用戶名。
- if exists:要刪除的用戶是否存在。
• 不指定if exists選項時,如果要刪除的用戶不存在,會提示錯誤信息。
• 指定if exists選項時,如果要刪除的用戶不存在,直接返回執行成功,用戶存在則刪除該用戶。 - CASCADE
• 不指定CASCADE選項時,如果要刪除的用戶中還有數據庫對象沒有刪除,會提示錯誤信息。
• 如果指定CASCADE選項,刪除該用戶時,會同步強制刪除屬於該用戶的數據庫對象。
例子:
刪除用戶smith,同時強制刪除該用戶的數據庫對象。
DROP USER if exists smith CASCADE;
注意事項
執行該語句的用戶需要有DROP USER系統權限。 不能刪除當前正在與數據庫相連的用戶。
SYS用戶和PUBLIC用戶不允許刪除,是系統預置用戶。
請謹慎使用刪除用戶操作,即使刪除過程中斷,已經刪除的對象也無法恢復,建議先刪除該用戶創建的數據庫對象,再刪除用戶。
3、角色
什麼是角色?
角色是一組命名的權限的集合,數據庫使用角色進行權限組織及劃分。
**角色的意義?**
一個數據庫可能有多個用戶需要訪問,爲了方便管理,可以先將權限分組,並授予給角色。每一個權限組對應一個角色。對於不同權限級別的用戶,可以將對應的角色授予用戶,相當於批量授予用戶需要的權限,而不需要逐個授予權限。
注意: 角色不屬於任何用戶。
角色不能登錄數據庫和執行SQL語句操作。
角色在系統中必須是唯一的。
角色不屬於任何用戶可以理解爲:角色不是某個用戶私有的,多個用戶都可以擁有這個角色。如財務是角色,但財務這個角色不是任何一個員工私有的,多個員工可以擁有財務這個角色。
- 角色的創建
語法
CREATE ROLE role_name;
參數:
-
role_name: 創建的角色名。
例子
創建角色teacher
CREATE ROLE teacher;
注意事項:
執行該語句的用戶需要有CREATE ROLE系統權限。 角色名不能與數據庫中已有的用戶名和角色名重名,否則會提示錯誤信息
爲了方便用戶使用,創建數據庫成功後,默認創建瞭如下系統角色:
角色 | 描述 |
---|---|
DBA | 具有所有系統權限,該角色不可刪除。 |
RESOURCE | 具有創建存儲過程、函數、觸發器、表、序列的權限。 |
CONNECT | 具有連接數據庫的權限。 |
STATISTICS | 具有創建、查看WSR快照、生成WSR報告的權限,但是沒有修改設置WSR參數的權限。 |
- 角色的刪除
語法:
DROP ROLE role_name;
例子:
刪除角色 teacher
DROP ROLE teacher;
注意事項:
執行該語句的用戶需要有DROP ANY ROLE系統權限,或者是該角色的創建者,或者被授予該角色並攜帶WITH ADMIN
OPTION屬性。 如果角色不存在,會提示錯誤信息。 角色被刪除時,將該角色具有的權限從被授予該角色的用戶或者其他角色上回收。 DROP
ANY ROLE系統權限:擁有此權限的用戶可以刪除任意角色 擁有WITH ADMIN
OPTION屬性的含義爲用戶可將所獲得的系統權限/角色再次授予給其它用戶或角色。
- 用戶、角色和權限的關係
- 用戶可定義角色,角色爲多個權限的集合。
- 角色賦予用戶或其他角色,則用戶或其他角色擁有了此角色的所有權限。
- 角色的權限可以繼承。
理解:
例如
- 財務只可以發放工資、撥款,總監原來只能審覈預算、查看收支報表。
- 把財務的角色賦給總監之後,總監繼承了財務的權限,既能審覈預算、查看收支報表,又能發放工資和撥款。
- 再把總監的角色賦給員工1和員工2後,員工1和員工2都能審覈預算、查看收支報表、發放工資和撥款。
5、授權
什麼是授權?
將權限或角色授予給用戶或其他角色
理解:
比如將系統權限1授予給用戶1的操作是授權,將權限1、2、3授予角色1是授權,將角色1授予角色2的操作也是授權。
-
系統權限的授予
語法:
GRANT system_privilege_name TO grantee [ WITH ADMIN OPTION ];
主要參數:
- system_privilege_name:系統權限名。
- grantee:被授予的用戶或角色。
- WITH ADMIN OPTION:被授予的用戶或角色可將所獲得的系統權限再次授予其它用戶或角色。(可選項)
例子:
向用戶smith授予CREATE SESSION系統權限,smith還可將此權限授予給其他用戶或角色。
GRANT CREATE SESSION TO smith WITH ADMIN OPTION;
- 角色的授予
語法:
GRANT role_name TO grantee [ WITH ADMIN OPTION ];
主要參數:
- role_name:角色名。
- grantee:被授予的用戶或角色。
- WITH ADMIN OPTION:被授予的用戶或角色可將所獲得的角色再次授予其它用戶或角色。(可選)
例子:
向用戶smith授予teacher角色,smith還可將此角色授予給其他用戶或角色。
GRANT teacher TO smith WITH ADMIN OPTION;
- 對象權限的授權
語法:
GRANT object_privilege_name ON object_name TO grantee [ WITH GRANT OPTION ];
主要參數:
- object_privilege_name:對象權限名。
- object_name:對象名。
- grantee:被授予對象權限的用戶或角色。
- WITH GRANT OPTION:被授予的用戶可將獲得的對象權限再次授予其它用戶或角色。
例子:
向用戶smith授予表table1的SELECT對象權限,smith還可將此對象權限授予給其他用戶或角色。
GRANT SELECT ON table1 TO smith WITH GRANT OPTION;
6、權限回收
什麼是權限回收?
將權限或角色從受權者回收。(受權者:曾被授予權限或角色的用戶)
- 系統權限回收
語法
REVOKE system_privilege_name FROM revokee;
主要參數說明:
- system_privilege_name:系統權限名。
- revokee:被回收權限的用戶或角色。
例子:
回收用戶smith的CREATE SESSION系統權限。
REVOKE CREATE SESSION FROM smith;
CREATE SESSION系統權限:擁有此權限的用戶可以連接數據庫。
- 角色的回收
語法:
REVOKE role_name FROM revokee;
例子:
回收用戶smith的teacher角色。
REVOKE teacher FROM smith;
-
對象權限的回收
對象回收是指:回收某用戶對某一特定對象的訪問或維護能力
語法:
REVOKE object_privilege_name ON object_name FROM revokee;
參數:
- object_privilege_name:對象權限名。
- object_name:對象名。
- revokee:被回收對象權限的用戶或角色。
理解:
例如:
員工A是財務,可以查看很多與資金相關的統計表,若員工A要離職,則需收回他的財務角色,使得員工A不能再查看所有的資金統計表;但若只是不想員工A查看某個統計表a,則只需收回他查看統計表a的對象權限。
例子:
回收用戶smith在表table1上的SELECT對象權限
REVOKE SELECT ON table1 FROM smith;
注意: 系統權限、角色和對象權限在不使用時需及時回收。
二、審計
什麼是審計?
- 數據庫審計屬於數據庫安全技術之一。
- 審計主要用於實時監視並記錄在數據庫系統中用戶的操作行爲。
- 用戶操作行爲的結果記錄在審計日誌中。
審計的意義是什麼?
- 審計的作用通常是爲了保護數據庫中的信息私密,提高數據庫安全級別。
- 審計日誌是安全事件中事後追溯、定位問題原因及劃分事故責任的重要手段。
- 數據庫管理員可以利用審計日誌信息,重現導致數據庫現在的一系列事件,找出非法操作的用戶、事件和內容等。
- 審計還可以對用戶訪問數據庫的行爲記錄、分析,識別安全威脅。
-
審計日誌
修改審計日誌等級的語法:
ALTER SYSTEM SET AUDIT_LEVEL = value;
參數value:審計級別的值。默認值是3
AUDIT_LEVEL參數
- AUDIT_LEVEL = 0:關閉審計日誌,不推薦使用。
- AUDIT_LEVEL > 0:開啓審計日誌,同時還會對用戶登錄、註銷等請求進行審計。 默認值爲3。
審計日誌的類型、範圍及對應的AUDIT_LEVEL取值
AUDIT_LEVEL取值(十進制) | 審計日誌類型 | 審計範圍 |
---|---|---|
1 | DDL | 數據庫對象的創建、修改、刪除,包括:表、索引、視圖、序列、用戶、角色、表空間、profile、會話等。 |
2 | DCL | 設置或更改數據庫事務、用戶權限、鎖表等。 |
4 | DML | 對數據庫表中的數據進行操作,如插入、更新、刪除,也包括查詢審計。 |
8 | PL | 對存儲過程的解析與執行進行審計,如EXECUTE(可簡寫爲EXEC)與CALL等操作的調用。 |
補充 :
表中AUDIT_LEVEL取值(十進制)爲基礎值,若AUDIT_LEVEL爲兩個或多個基礎值之和,則表明同時開啓了兩個或多個類型的審計。例如DCL審計是2,DML審計是4,設置AUDIT_LEVEL的值爲6(2+4),則表明同時開啓DCL和DML審計。
-
修改審計級別
查看當前審計級別
SELECT NAME, VALUE, DEFAULT_VALUE, ISDEFAULT FROM SYS.DV_PARAMETERS WHERE NAME='AUDIT_LEVEL';
相關參數:
- VALUE:當前值。
- DEFAULT_VALUE:默認值。
- ISDEFAULT:是否爲默認值。
修改審計級別:
將審計級別修改爲6,同時開啓DCL和DML審計。
ALTER SYSTEM SET AUDIT_LEVEL = 6;