39、安全_1(許可權、使用者profile檔案、密碼檔案、VPD對行級訪問的控制)

一只c小凶许發表於2024-11-25

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資料庫我們一般使用手動開啟錢包。
在官方文件裡面有高階安全裡面可以建立一個自動開啟的錢包。

給一個表加一列,或者修改某個列為加密。

建立一個表空間使用加密。

相關文章