Complete Reference - Oracle 基本安全
Oracle 利用create user、create role、grant命令控制數據訪問。- Database system privilege
- Database object privilege
SYS用戶擁有Oracle用來管理數據庫的核心內部表;
SYSTEM用戶則擁有其他的表和視圖 - 可以使用SYSTEM用戶登錄,創建其他用戶。
create user username identified
{by password | externally | globally as 'extnm'};
{by password | externally | globally as 'extnm'};
-- 創建用戶
create user Dora identified by avocado;
-- 修改密碼
alter user Dora identified by psyche;
-- 不給用戶CREATE SESSION權限,則用戶無法登錄
grant CREATE SESSION to Dora;
create user Dora identified by avocado;
-- 修改密碼
alter user Dora identified by psyche;
-- 不給用戶CREATE SESSION權限,則用戶無法登錄
grant CREATE SESSION to Dora;
- 密碼會過期 - 由分配給賬戶的配置文件決定
- 用戶有可能會由于多次連續失敗而被鎖定
- 修改密碼之后,需要維護密碼歷史記錄,防止重用以前的密碼
配置文件由DBA管理 - create profile命令創建。
關于密碼和賬戶的訪問,配置文件規定了一下內容:
- 密碼的生存期 Lifetime,決定了多長時間必須更改密碼
- 密碼的“過期日期”后的寬限期,在此期間可以修改密碼
- 在賬戶自動“鎖定”之前允許連續失敗的次數
- 賬戶保持鎖定狀態的天數
- 在重用一個密碼前必須經過的天數
- 在重用一個密碼前必須經歷的更改次數
數據庫管理員可以利用password命令修改任何用戶的密碼;其他用戶只能修改自己的密碼。
在SQL*Plus中使用password命令修改密碼,輸入的新密碼不會顯示在屏幕上。
SQL> conn wpeng/exigen@server03
Connected.
SQL> password
Changing password for WPENG
Old password:
New password:
Retype new password:
Password changed
Connected.
SQL> password
Changing password for WPENG
Old password:
New password:
Retype new password:
Password changed
可以使用配置文件管理密碼的過期、重用和復雜性。
可以設定一個密碼的生存期,鎖定密碼使用太久的賬戶,降低密碼的復雜性,將多次失敗登陸的賬戶鎖定...
密碼過期機制
-- 創建LIMITED_PROFILE配置文件
create profile LIMITED_PROFILE limit
FAILED_LOGIN_ATTEMPTS 5;
-- 交由JANE使用
create user JANE identified by EYRE
profile LIMITED_PROFILE;
grant create SEESION to JANE;
create profile LIMITED_PROFILE limit
FAILED_LOGIN_ATTEMPTS 5;
-- 交由JANE使用
create user JANE identified by EYRE
profile LIMITED_PROFILE;
grant create SEESION to JANE;
-- JANE 5次連續失敗
connect jane/eyre
ERROR:
ORA-28000: the account is locked
-- 解鎖
alter user JANE account unlock;
-- 鎖住指定賬戶
alter user JANE account lock;
-- 在超過配置文件的PASSWORD_LOCK_TIME值,自動解鎖
-- 通過PASSWORD_LIFE_TIME設置密碼的最大壽命
-- 強制30天修改一次密碼
alter profile LIMITED_PROFILE limit
PASSWORD_LIFE_TIME 30;
-- 為到期密碼設置一個寬限期 PASSWORD_GRACE_TIME
"鎖定"賬戶,可以在一定時間之后,自動解鎖;connect jane/eyre
ERROR:
ORA-28000: the account is locked
-- 解鎖
alter user JANE account unlock;
-- 鎖住指定賬戶
alter user JANE account lock;
-- 在超過配置文件的PASSWORD_LOCK_TIME值,自動解鎖
-- 通過PASSWORD_LIFE_TIME設置密碼的最大壽命
-- 強制30天修改一次密碼
alter profile LIMITED_PROFILE limit
PASSWORD_LIFE_TIME 30;
-- 為到期密碼設置一個寬限期 PASSWORD_GRACE_TIME
“過期”賬戶,則需要DBA手工設置才能重新生效。
SQL> alter user wpeng password expire;
User altered.
SQL> conn wpeng/exige@server03
ERROR:
ORA-28001: the password has expired
Changing password for wpeng
New password:
Retype new password:
Password changed
Connected.
可以強制用戶在第一次登陸的時候,修改自己的密碼:User altered.
SQL> conn wpeng/exige@server03
ERROR:
ORA-28001: the password has expired
Changing password for wpeng
New password:
Retype new password:
Password changed
Connected.
-- 使用create user 的子句 passowed expire
create user *** identified by ***
password expire;
create user *** identified by ***
password expire;
可以通過查詢DBA_USERS視圖的EXPIRY_DATE,得到任意賬戶密碼的到期日期。
密碼重用機制
為了防止密碼被重用,可以使用配置文件中的兩個參數(相互排斥的,設置其中一個,另一個必須被設置為UNLIMITED):
- PASSWORD_REUSE_MAX - 指定一個密碼重用前密碼必須變化的次數
- PASSWORD_REUSE_TIME - 指定一個密碼可以重用前必須間隔的天數
alter profile LIMITED_PROFILE limit
PASSWORD_REUSE_MAX 3
PASSWORD_REUSE_TIME UNLIMITED;
-- 試圖使用一個近期的密碼,則:
ORA-280007: the password cannot be reused.
PASSWORD_REUSE_MAX 3
PASSWORD_REUSE_TIME UNLIMITED;
-- 試圖使用一個近期的密碼,則:
ORA-280007: the password cannot be reused.
標準角色
應用程序中用戶通過角色來獲得權限。
可以根據應用程序的需要,將系統權限和對象訪問融入到角色當中。
CONNECT, RESOURCE, DBA是為了向后兼容,所以不應該再使用。
為了替換CONNECT, RESOURCE, DBA,應當創建自己的角色以便有權限執行特定的系統權限。
-- 可以將任何系統權限賦予其他用戶和角色,或則授予public
-- with admin option 可以保證被授權者可以將權限或角色授予其他用戶或角色
-- all子句授予用戶或角色除SELECT ANY DICTIONARY系統權限以外的所有權限
grant {system privilege | role | all [privileges] }
[, {system privilege | role | all [privileges]} ...]
to {user | role} [, {user | role}] ...
[identified by password]
[with admin option]
-- with admin option 可以保證被授權者可以將權限或角色授予其他用戶或角色
-- all子句授予用戶或角色除SELECT ANY DICTIONARY系統權限以外的所有權限
grant {system privilege | role | all [privileges] }
[, {system privilege | role | all [privileges]} ...]
to {user | role} [, {user | role}] ...
[identified by password]
[with admin option]
-- 撤銷用戶或角色權限
revoke {system privilege | role | all [privileges] }
[, {system privilege | role | all [privileges]}
]
from {user | role} [, {user | role}]
revoke {system privilege | role | all [privileges] }
[, {system privilege | role | all [privileges]}

from {user | role} [, {user | role}]

-- 刪除一個用戶
-- cascade可以刪除一個用戶及其擁有的所有對象,其中包括參照完整性約束
-- 使用引用已刪除用戶模式中的對象的視圖、同義詞、存儲過程、函數或程序包失效
-- 如果不是用cascade,并且用戶擁有的對象仍然存在,則Oracle不會刪除該用戶,相反返回一個錯誤信息
drop user username [cascade];
-- cascade可以刪除一個用戶及其擁有的所有對象,其中包括參照完整性約束
-- 使用引用已刪除用戶模式中的對象的視圖、同義詞、存儲過程、函數或程序包失效
-- 如果不是用cascade,并且用戶擁有的對象仍然存在,則Oracle不會刪除該用戶,相反返回一個錯誤信息
drop user username [cascade];
用戶可以給他所擁有的任何對象授權;
數據庫管理員可以授予任何系統權限。
-- Dora 擁有COMFORT表并且是數據庫管理員
-- ======系統權限=====
create user Judy identified by sarah;
grant create SESSION to Judy;
create user Bob identified by carolyn;
grant create SEESION, create TABLE, create VIEW, create SYNONYM to Bob;
alter user Bob
default tablespace users
quota 5m on users;
-- ======對象權限=====
-- with grant option,則Bob可以將從Dora的表上得到的權限再授予其他用戶。
grant select on COMFORT to Bob;
如果打算基于另外一個用戶的表創建視圖,并且把視圖的訪問權限授予其他用戶,則必須擁有對基表的with grant option權限。-- ======系統權限=====
create user Judy identified by sarah;
grant create SESSION to Judy;
create user Bob identified by carolyn;
grant create SEESION, create TABLE, create VIEW, create SYNONYM to Bob;
alter user Bob
default tablespace users
quota 5m on users;
-- ======對象權限=====
-- with grant option,則Bob可以將從Dora的表上得到的權限再授予其他用戶。
grant select on COMFORT to Bob;
除非同義詞,否則表名必須跟在表的擁有者的用戶名之后;
否則Oracle會認為這個表不存在。
select * from Dora.COMFORT;
可以使用任何約束或任何計算來創建視圖,然后把訪問視圖的而不是訪問基表的權限,授予其他用戶。
創建同義詞
創建一個視圖,使它包含其他用戶的整個表或視圖的另一種方法就是創建同義詞。
create synonym LITTLECONFORT for Dora.SOMECOMFORT;
創建角色
為了創建角色,必須擁有CREATE ROLE系統權限
create role role_name
[not identified
| identified {by password | using [schema.]package
|externally | globally}];
[not identified
| identified {by password | using [schema.]package
|externally | globally}];
create role CLERK;
create role MANAGER;
create role MANAGER;
grant select on COMFORT to CLERK;
grant CREATE SESSION to CLERK;
grant CREATE SESSION, CREATE VIEW to MANAGER;
-- 不可以進行循環授權
grant CLERK to MANAGER;
使用with admin option子句,那么被授權者有權將這個角色授予其他的用戶或角色。grant CREATE SESSION to CLERK;
grant CREATE SESSION, CREATE VIEW to MANAGER;
-- 不可以進行循環授權
grant CLERK to MANAGER;
被授權者也能更改和刪除這個角色。
角色可以看做命名的一組權限。
對視圖、過程、函數、程序包或者外鍵進行操作時,不能使用通過角色授予用戶權限。
在創建這些類型的數據庫對象后,必須依靠所需權限直接的授權。
grant CLERK to Bob;
grant MANAGER to Dora with admin option;
grant MANAGER to Dora with admin option;
為角色添加密碼
使用alter role命令達到:更改啟用角色所需的權限。
在默認情況下,角色不具有相關聯的密碼。為了使一個角色就有安全性,應該在alter role命令中使用identified關鍵字。
alter role MANAGER identified by cygnusxi;
-- 角色也可以綁定到操作系統權限。
alter role MANAGER identified externally;
-- 角色也可以綁定到操作系統權限。
alter role MANAGER identified externally;
-- 刪除角色密碼
alter role MANAGER no identified;
alter role MANAGER no identified;
在用戶的賬戶被更改時,可以通過alter user命令的default role子句來為該用戶創建默認角色列表。這個命令的默認的動作是:將用戶的所有角色設置為默認角色,每當用戶登錄啟用所有的角色。
在任何時候,用戶可以啟用的角色最大數目是通過MAX_ENABLED_ROLES數據庫初始化參數設置的。
-- Bob在登錄時,啟用CLERK角色
alter user Bob
default role CLERK;
-- 啟用一個非默認角色
set role CLERK;
-- =====查看當前用戶,已經啟用的角色,可以從SESSION_ROLES數據字典視圖中選相關信息
-- =====查詢SEESION_PRIVS可以知道當前啟動的系統權限
set role all;
set role all except CLERK;
-- 如果一個角色有相關密碼,則必須通過identified by 指定
set role MANAGER identified by cygnusxi;
-- 在會話中,禁用某一個角色 - 此命令在當前會話中,禁用所有角色
set role none;
alter user Bob
default role CLERK;
-- 啟用一個非默認角色
set role CLERK;
-- =====查看當前用戶,已經啟用的角色,可以從SESSION_ROLES數據字典視圖中選相關信息
-- =====查詢SEESION_PRIVS可以知道當前啟動的系統權限
set role all;
set role all except CLERK;
-- 如果一個角色有相關密碼,則必須通過identified by 指定
set role MANAGER identified by cygnusxi;
-- 在會話中,禁用某一個角色 - 此命令在當前會話中,禁用所有角色
set role none;
-- 撤銷角色的權限
revoke SELECT on COMFORT from CLERK;
-- 刪除角色
drop role CLERK;
drop role MANAGER;
系統和對象權限的grant和revoke操作會立即生效。revoke SELECT on COMFORT from CLERK;
-- 刪除角色
drop role CLERK;
drop role MANAGER;
而角色的grant和revoke操作僅當前用戶發出set role或啟用一個新的用戶會話時才生效。
-- =====給指定的列授予UPDATE權限
grant update(Noon, Midnight) on COMFORT to Judy;
grant update(Noon, Midnight) on COMFORT to Judy;
revoke all : 將刪除以前列出的所有權限,從SELECT到INDEX;
創建一個其where子句中包含User(偽列)的一個視圖:
-- 當查詢MY_CHECKOUT時,將依賴于偽列User的記錄
create or replace view MY_CHECKOUT as
select * from BOOKSHELF_CHECKOUT
where SUBSTR(name, 1, INSTR(name, ' ')-1) = User;
create or replace view MY_CHECKOUT as
select * from BOOKSHELF_CHECKOUT
where SUBSTR(name, 1, INSTR(name, ' ')-1) = User;
給公眾授予訪問權:
grant select on MY_CHECKOUT to public;
創建public同義詞,可以簡化使用,不必使用模式所有者create public synonym MY_CHECKOUT for Practice.MY_CHECKOUT;
-- 有限資源的授權
-- ===== create user 或者 alter user參數
alter user Bob
quota 100M on USERS;
-- =====想撤銷一個用戶的空間限額,將UNLIMITED TABLESPACE系統權限授予該用戶
-- ===== create user 或者 alter user參數
alter user Bob
quota 100M on USERS;
-- =====想撤銷一個用戶的空間限額,將UNLIMITED TABLESPACE系統權限授予該用戶