oracle 使用者和安全
基本概念
1、認證:說的是認證透過之後,才能登陸進入資料庫
2、授權:是登陸進入資料庫以後,能做什麼
3、審計:進入資料庫以後,授權以後,做事情被記錄做事過程
這就是傳說中的:3A(authentication認證、authorization授權、audit審計)
建立一個使用者,然後給使用者授權
關於授權(有哪些許可權?):
1、系統許可權:能建表、能建索引、能刪除表、能刪除索引、能建儲存過程、能登陸資料庫。
2、物件許可權:能訪問某個表、在某個物件上的許可權。
3、角色:將一部分系統許可權,和物件許可權打包,給一個角色,將角色再給使用者,減少反覆授權這種情況,當然角色也可以給角色。
用EM建一個使用者,要把em用明白了
1、登入em,瀏覽器裡輸入網址:http://192.168.56.12:1158/em -- 192.168.56.12:伺服器的ip地址
2、
3、
4、
5、建一個使用者
6、授權,系統許可權
7、物件許可權
8、角色
9、限額
10、顯示SQL
注意這幾點:
1、使用者名稱
2、密碼複雜度要求
3、預設表空間,建表時預設放到這個表空間中
4、預設臨時表空間,將來使用臨時表空間的時候,就用預設臨時表空間
5、系統許可權,引數admin option表示許可權可以給別人
connect:登陸資料庫的許可權
resource:可以建表建物件
select all table:查詢所有表的許可權 如select * from u2.test;
create all table:可以為其他使用者建立表 如create table u2.t1;
6、物件許可權,引數grant option表示許可權可以給別人
針對某個使用者低下的某個表有某種許可權叫物件許可權
7、角色
就是系統許可權和物件許可權組合成的,admin option表示許可權可以給別人
8、配額
某個使用者將來在某個表空間上只能用多少空間
一般使用者建完以後,要給兩個常用的角色:
1、connect
2、resource
查詢使用者相關的資訊
建立使用者後查詢使用者資訊:
select * from dba_users;
查詢使用者被賦予哪些許可權
1、查詢使用者許可權相關的檢視
select * from dba_views a where a.view_name like 'DBA_%PRIV%'
2、查詢使用者utest1被賦予的物件許可權
select * from dba_tab_privs where grantee='UTEST1'
3、查詢使用者utest1被賦予的系統許可權
select * from dba_sys_privs where GRANTEE='UTEST1'
4、查詢使用者utest1被賦予什麼角色
select * from dba_role_privs where grantee='UTEST1'
怎麼看這個角色下面還有哪些許可權和角色呢?
select * from dba_views a where a.view_name like '%ROLE%'; --查詢角色許可權相關的檢視
select * from role_role_privs where role='RESOURCE'; --查詢角色RESOURCE有什麼角色的許可權
select * from role_sys_privs where role='RESOURCE'; --查詢角色RESOURCE有什麼系統許可權
select * from role_tab_privs where role='RESOURCE'; --查詢角色RESOURCE有什麼表的許可權
撤銷使用者utest1裡的DBA角色
查詢使用者限額
select * from dba_views where view_name like '%QUOT%'; -- 查詢限額的相關檢視
select * from dba_ts_quotas;
對於使用者utest1在users表空間裡面限額的相關資訊
概要檔案(profile)
建立一個概要檔案
1、資源控制
2、密碼策略
profile的作用:
1、資源限制:一般不使用,這個地方的資源控制
一般使用resource manager的技術
2、密碼策略控制
密碼過期
密碼失敗登入次數
密碼複雜度
密碼永遠不過期
登陸多少次錯誤被鎖住
如果想用密碼複雜度需要跑一個指令碼:
[oracle@db11g ~]$ cd $ORACLE_HOME
[oracle@db11g db_1]$ cd rdbms
[oracle@db11g rdbms]$ cd admin
[oracle@db11g admin]$ ll utlpwd*
-rw-r--r-- 1 oracle oinstall 12176 Jan 31 2013 utlpwdmg.sql -- 這個指令碼
[oracle@db11g admin]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.4.0 Production on Sat Feb 11 13:25:47 2017
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> @utlpwdmg.sql
Function created.
Grant succeeded.
Profile altered.
Function created.
Grant succeeded.
執行完指令碼之後,看一下效果:
密碼策略就有要求了
口令檔案
oracle有一個sysdba許可權:oracle的超級許可權,預設sys使用者具有這個許可權
sysdba許可權的一個特點:啟動和關閉資料庫
口令檔案位置:
啟動資料庫需要登陸使用者,而資料庫沒有啟動無法進行使用者認證,口令檔案中就儲存著sys使用者的密碼可以進行認證,登陸後就可以啟動資料庫了
資料庫口令檔案存放著資料庫例項的密碼檔案
檢視口令檔案的內容,使用string來格式化:
口令檔案被刪之後,重建口令檔案
遠端登陸資料庫需要口令檔案,口令檔案即在資料庫中也存在這個位置;假設將口令檔案刪除,將無法程序遠端登陸,可以重新建立口令檔案:
[oracle@oracle dbs]$ orapwd --help
Usage: orapwd file=<fname> entries=<users> force=<y/n> ignorecase=<y/n> nosysdba=<y/n>
where
file - name of password file (required),
password - password for SYS will be prompted if not specified at command line,
entries - maximum number of distinct DBA (optional),
force - whether to overwrite existing file (optional),
ignorecase - passwords are case-insensitive (optional),
nosysdba - whether to shut out the SYSDBA logon (optional Database Vault only).
There must be no spaces around the equal-to (=) character.
[oracle@oracle dbs]$ orapwd file=orapworcl entries=5 -- entries=5:表示裡面可以放至少5個sysdba的密碼
Enter password for SYS:
[oracle@oracle dbs]$
呼叫者和定義者許可權
a使用者建立儲存過程x 訪問t表;b使用者訪問儲存過程x 訪問t表時,b使用者執行a使用者的儲存過程的時候,預設會用a使用者的許可權去訪問t表,但是b使用者不能直接訪問t表,b使用者只能執行a使用者建立的儲存過程
一個儲存過程:
public角色
oracle有一個角色:public角色
就是說:只要把許可權給了public角色,public角色就馬上把所有的許可權給了所有使用者,任何一個使用者都可以使用這個許可權
但是revoke許可權的時候報錯了:死鎖,oracle死鎖有兩種錯誤:一種是ORA-04020錯誤,另一種是ORA-00060錯誤
給public角色賦權的時候沒有問題,但是要revoke的時候,是一個非常危險的事情,因為會訪問一個sys.standadd包,這個包是一個基礎包,revokepublic角色許可權的時候會重新編譯這個包,是一個相當危險的事情。
使用者透過檢視和儲存過程訪問表
透過檢視或者儲存過程變相的控制使用者和表的關係
使用者修改表中某些行的行為被寫在了儲存過程裡,使用者只具有執行儲存過程的許可權,但是不能直接訪問這個表,也可以達到控制使用者訪問標的許可權。
VPD(對錶的行級和列級的訪問控制)
VPD實現對行級訪問的控制
FGAC
列級VPD
主要透過例子來講VPD:每個使用者登陸後訪問相同的表,但看到的資料不同
1、建一張表car
create table car (name varchar2(20),num number,cost number);
insert into car values('toyota',10,30);
insert into car values('volvo',50,30);
insert into car values('honda',60,30);
insert into car values('biaozhi',70,20);
insert into car values('xuetielong',80,20);
insert into car values('polo',90,20);
insert into car values('xiali',20,10);
insert into car values('jili',30,10);
insert into car values('byd',40,10);
commit;
查詢car表:
SQL> select * from car;
NAME NUM COST
-------------------- ---------- ----------
toyota 10 30
volvo 50 30
honda 60 30
biaozhi 70 20
xuetielong 80 20
polo 90 20
xiali 20 10
jili 30 10
byd 40 10
9 rows selected.
建立函式
2、建立一個函式1:
呼叫的時候需要兩個引數:1、使用者; 2、表的名字
返回值:返回一個where條件
create or replace function fun_name (fun_scheme varchar2,fun_object varchar2)
return varchar2 as fun_cost varchar2(20);
begin
fun_cost:='cost=30';
return(fun_cost);
end fun_name;
/
3、建立另外一個函式2:
也是一樣,返回另外一個where條件
create or replace function fun_num (fun_scheme varchar2,fun_object varchar2)
return varchar2 as fun_cost varchar2(20);
begin
fun_cost:='cost=10';
return(fun_cost);
end fun_num;
/
可以定義多個這樣的函式
建立策略
4、定義一個策略1:
指定使用者,指定表,還有策略函式
策略的名字(隨便起就可以)
相關列
begin
dbms_rls.add_policy(
object_schema => 'u1', -- 使用者
object_name => 'car', -- 表
policy_name => 'filter_name', -- 策略的名字
policy_function => 'fun_name', -- 策略函式
sec_relevant_cols => 'name'); -- 相關列
end;
比如執行SQL:select * from u1.car; 就會觸發這個策略
觸發策略,只返回cost=30的:
SQL> connect u1/u1
Connected.
SQL> select * from car;
NAME NUM COST
-------------------- ---------- ----------
toyota 10 30
volvo 50 30
honda 60 30
使用utest1使用者查詢的時候,什麼資料都沒有返回:
SQL> connect utest1/utest1
Connected.
SQL> select * from car;
no rows selected
5、定義另外一個策略2:
begin
dbms_rls.add_policy(
object_schema => 'u1',
object_name => 'car',
policy_name => 'filter_num',
policy_function => 'fun_num',
sec_relevant_cols => 'num');
end;
每個函式對應各自的策略
VPD的特點:
1、每一個使用者登陸以後,看到的都是不同的資料,就好像每個人使用一個獨立的資料庫一樣
2、virtual private database
3、建立策略函式
返回where條件
建立策略
滿足策略,觸發策略;呼叫策略函式,返回where條件,隱含的加到sql後面
可以定義多個策略,定義多個函式
查詢某個(U1)使用者下的策略
select * from dba_policies p where p.object_owner='U1';
刪除策略:
begin
dbms_rls.drop_policy('u1','car','filter_num');
end;
/
begin
dbms_rls.drop_policy('u1','car','filter_name');
end;
/
另外的筆記
vpd還有待補充。
--ORACLE 資料庫的VPD
--建表使用使用者u1。
create table car (name varchar2(20),num number,cost number);
insert into car values('toyota',10,30);
insert into car values('volvo',50,30);
insert into car values('honda',60,30);
insert into car values('biaozhi',70,20);
insert into car values('xuetielong',80,20);
insert into car values('polo',90,20);
insert into car values('xiali',20,10);
insert into car values('jili',30,10);
insert into car values('byd',40,10);
commit;
--函式1返回where條件 cost=30
create or replace function fun_name (fun_scheme varchar2,fun_object varchar2)
return varchar2 as fun_cost varchar2(20);
begin
fun_cost:='cost=30';
return(fun_cost);
end fun_name;
--函式2放回where條件 cost=10
create or replace function fun_num (fun_scheme varchar2,fun_object varchar2)
return varchar2 as fun_cost varchar2(20);
begin
fun_cost:='cost=10';
return(fun_cost);
end fun_num;
--建立策略1
begin
dbms_rls.add_policy(
object_schema=>'u1',
object_name=>'car',
policy_name=>'filter_name',
policy_function=>'fun_name',
sec_relevant_cols=>'name');
end;
--建立策略2
begin
dbms_rls.add_policy(
object_schema=>'u1',
object_name=>'car',
policy_name =>'filter_num',
policy_function =>'fun_num',
sec_relevant_cols=>'num');
end;
--建立策略3
begin
dbms_rls.add_policy(
object_schema => 'u1',
object_name => 'car',
policy_name => 'filter_num',
policy_function => 'fun_num',
sec_relevant_cols => 'num',
sec_relevant_cols_opt => dbms_rls.ALL_ROWS );
end;
--用不同的使用者查詢資料看策略是否生效。
select name from car;
select * from car;
--刪除策略1
begin
dbms_rls.drop_policy('u1','car','FILTER_NAME');
end;
/
--刪除策略2
begin
dbms_rls.drop_policy('u1','car','FILTER_NUM');
end;
/
--查詢u1使用者下的策略。
select * from dba_policies p where p.object_owner='U1';
使用者u1沒有策略的查詢結果是
SQL> select * from car;
NAME NUM COST
toyota 10 30
volvo 50 30
honda 60 30
biaozhi 70 20
xuetielong 80 20
polo 90 20
xiali 20 10
jili 30 10
byd 40 10
9 rows selected.
SQL> 建立兩個策略後使用sys使用者的查詢結果和沒有使用策略的u1使用者查詢結果相同。
使用者u1建立策略1後查詢結果
SQL> set linesize 100SQL> select * from car;
NAME NUM COST
toyota 10 30
volvo 50 30
honda 60 30
SQL>
使用者u1建立策略1和2後的查詢結果是。
SQL> select * from car;no rows selected
SQL>
只是建立策略3使用者u1查詢結果
SQL> set linesize 100 SQL> select * from car;
NAME NUM COST
toyota 30
volvo 30
honda 30
biaozhi 20
xuetielong 20
polo 20
xiali 20 10
jili 30 10
byd 40 10
9 rows selected.
SQL> 可以看到cost不等於10的列num不顯示。
給不同的使用者訪問返回不同的where條件。
函式3
create or replace function f_limit_access--函式3( vc_schema varchar2, vc_object varchar2) return varchar2asvc_userid varchar2(100);begin select SYS_CONTEXT('USERENV','SESSION_USER') into vc_userid from dual; if (trim(vc_userid)='U1') then return '1=1'; else return '1=0'; end if;end;/策略4
begindbms_rls.add_policy(object_schema => 'U1',object_name => 'CAR',policy_name => 'VPD_TEST',function_schema => 'U1',policy_function => 'F_LIMIT_ACCESS');end;/
審計
對sys使用者
只要登陸,就強制審計。可以設定引數使登陸後所做的事情也審計。
你做了什麼不審計。
用sys使用者登陸資料庫登陸這個行為就被審計了。
SQL> exitDisconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing options[oracle@oracle dbs]$ sqlplus / as sysdbaSQL*Plus: Release 11.2.0.4.0 Production on Mon Feb 20 11:30:47 2017Copyright (c) 1982, 2013, Oracle. All rights reserved.Connected to:Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsSQL> 檢視審計檔案
[oracle@oracle adump]$ pwd/u01/app/oracle/admin/oracl/adump[oracle@oracle adump]$ ll -t |moretotal 2020-rw-r- 1 oracle oinstall 777 Feb 20 11:30 oracl_ora_3008_20170220113047381227143795.aud-rw-r- 1 oracle oinstall 777 Feb 20 11:05 oracl_ora_2833_20170220110550377784143795.aud-rw-r- 1 oracle oinstall 777 Feb 20 10:48 oracl_ora_2703_20170220104849080974143795.aud[oracle@oracle adump]$ cat oracl_ora_3008_20170220113047381227143795.audAudit file /u01/app/oracle/admin/oracl/adump/oracl_ora_3008_20170220113047381227143795.audOracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1System name: LinuxNode name: oracleRelease: 2.6.32-431.el6.x86_64Version: #1 SMP Sun Nov 10 22:19:54 EST 2013Machine: x86_64Instance name: oraclRedo thread mounted by this instance: 1Oracle process number: 32Unix process pid: 3008, image: oracle@oracle (TNS V1-V3)Mon Feb 20 11:30:47 2017 +08:00LENGTH : '160'ACTION :[7] 'CONNECT'DATABASE USER:[1] '/'PRIVILEGE :[6] 'SYSDBA'CLIENT USER:[6] 'oracle'CLIENT TERMINAL:[5] 'pts/0'STATUS:[1] '0'DBID:[10] '1976643781'[oracle@oracle adump]$ 要想使sys使用者登陸後所做的事情也被設計,需要設定一個引數。可以看到這個引數修改需要重啟資料庫。
修改引數並重啟資料庫。
SQL> show parameter audit_sys_operationsSQL> alter system set audit_sys_operations=true scope=spfile;System altered.SQL> startup force;檢視審計檔案可以看到
標準資料庫審計--普通使用者
普通使用者的審計
1、11g預設開啟了對普通使用者的審計
2、需要設定。
審計什麼。
1、審計sql語句
2、使用了哪些系統許可權。
3、使用了哪些物件許可權
使用em進行審計配置。
成功或者失敗審計。
按照回話審計。
access更細一些。
針對系統的許可權。 按照會話審計和按照訪問審計。一般使用bysession,對於ddl語句不可以使用bysession。
select * from dba_obj_audit_opts;--查詢物件的審計
select * from dba_priv_audit_opts;--許可權的審計。
select * from dba_stmt_audit_opts; --執行sql語句的審計。
這些檢視都在參考裡面。
select * from dba_audit_trail; --查詢實實在在的審計資訊。
truncate table aud$; --清除審計資訊。
觸發幾個審計。
select * from dba_audit_session; --審計的會話。
select * from dba_audit_object; --物件相關的審計。
精細化審計
審計某些列,審計某些行,審計某一部分。
oracle資料庫加密
1、表上的列加密
2、表空間進行加密
11g
錢包
1、建立一個錢包,錢包有一個密碼。
2、加密的時候,只要錢包保持開啟,直接使用加密功能。
錢包的建立。
1、編輯sqlnet.ora引數檔案。下面這個目錄需要必須有自己建立。
2、執行一條命令
這條命令會生成一個檔案
密碼會放到這個檔案中。
查詢錢包是否開啟。
開啟錢包,開啟錢包需要使用開啟時的密碼。
我們建立的錢包不是自動開啟的錢包。要建立一個自動開啟的錢包需要使用。
在oracle資料庫我們一般使用手動開啟錢包。
在官方文件裡面有高階安全裡面可以建立一個自動開啟的錢包。
給一個表加一列,或者修改某個列為加密。
建立一個表空間使用加密。