18、安全
18.1、基本概念
18.2、用户权限
18.2.1、用em建一个用户。要把em来用明白了。
18.2.2、查询和用户角色相关的权限
18.2.3、查询用户配额
18.3、概要文件(profile)。
18.4、口令文件。
18.4.1、口令文件位置。
18.4.2、口令文件的内容
18.4.3、口令文件重建
18.5、调用者和定义者权限。
18.6、public角色
18.7、通过视图和存储过程控制权限
18.8、行级和列级的VPD
18.9、审计
18.9.1、对sys用户
18.9.3、精细化审计
18.10、oracle数据库加密
18、oracle 用户和安全
18.1、基本概念
1、认证:登陆进入
2、授权:登陆进入后做什么。
3、审计:进入后授权以后,做事情记录做事过程。
3A
用户、授权。
1、系统权限
能建表、能建索引、能删除表、能删除索引、能建存储过程、能登陆数据库。
2、对象权限
能访问某个表、在某个对象上的权限。
3、角色
将一部分系统权限,和对象权限打包。给一个角色。将角色再给用户。减少反复授权这种情况。当然角色也可以给角色。
18.2、用户权限
18.2.1、用em建一个用户。要把em来用明白了。
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、配额
某个用户将来在某个表空间上只能用多少空间。
一般用户要给两个角色。
connect 、resource 。
18.2.2、查询和用户角色相关的权限
创建用户后查询用户。
select * from dba_users;
查询用户被赋予什么用户权限。
1、查询在哪个视图中。
select*from dba_views a where a.view_name like 'DBA_%PRIV%'
select*from dba_tab_privs where grantee='U1'--查询用户u1被赋予的对象的权限。
select*from dba_sys_privs WHERE GRANTEE='U1'--查询用户u1被赋予的系统的权限。
select*from dba_role_privs where grantee='U1'--查询用户u1被赋予什么角色。
怎么看这个角色下面还有哪些权限和角色呢。
查询角色在哪个视图中
select*from dba_views a where a.view_name like '%ROLE%';
select*from dba_views a where a.view_name like '%ROLE%';--查询角色赋权在哪个视图中
select*from role_role_privs where role='DBA';--查询角色dba有什么角色的权限。
select*from role_sys_privs where role='DBA';--查询角色dba有什么系统权限
select*from role_tab_privs where role='DBA';--查询角色dba有什么表的权限。
删除用户权限
REVOKE UPDATE ON "HR"."JOBS" FROM "U1"
18.2.3、查询用户配额
select*from dba_views where view_name like '%QUOT%';
select*from dba_views where view_name like '%QUOT%';
select*from dba_ts_quotas;--数据库配额相关的信息。
撤销权限。
给用户常用的两个角色
connect、resource。
18.3、概要文件(profile)。
建立一个概要文件。
查询一个概要文件
改变一个用户使用的概要文件
profile的作用。
1、资源限制 –一般不使用,这个地方的资源控制。
一般使用resource manager的技术。(后面讲。)
2、密码策略
密码过期时间。过期后可用时间。 密码复杂度。
密码永远不过期。登陆多少次错误被锁住。
我们希望密码永不过期。密码不会被锁住。
登陆失败次数一般我们设置成没有限制。
如果想用密码复杂度需要跑一个脚本。
密码管理函数。
在数据库中建立一个概要文件,在建用户的时候可以使用这个概要文件(profile)
关于资源控制一般不在这做。
18.4、口令文件。
sysdba
超级权限。
sys用户具有这个权限。
启动和关闭数据库。
18.4.1、口令文件位置。
启动数据库需要登陆用户,而数据库没有启动无法进行用户认证,口令文件中就保存着sys用户的密码可以进行认证。登陆后就可以启动数据库了。远程登陆需要用到口令文件。
数据库口令文件存放着数据库实例的密码文件。
18.4.2、口令文件的内容
查看口令文件的内容。使用string来格式化。
远程登陆数据库需要口令文件。口令文件即在数据库中也存在这个位置。
18.4.3、口令文件重建
假设将口令文件删除,将无法进程远程登陆。可以重新建立口令文件。
[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 ifnot 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 DatabaseVault only).
There must be no spaces around the equal-to (=) character.
[oracle@oracle dbs]$ orapwd file=orapworacl entries=5
Enter password for SYS:
[oracle@oracle dbs]$
18.5、调用者和定义者权限。
a用户建立存储过程x访问t表。b用户访问存储过程x访问t表,默认用户b 是用a用户的权限去访问t表的。这就是使用定义者权限访问表。
b执行a的存储过程时候默认会用a的权限去访问t。
但是下面这句话后就会使用调用者的权限执行。
18.6、public角色
oracle有一个角色public角色。
将任何权限给了public角色就相当于,把权限给了所有用户。
但是revoke权限的时候报错了。死锁有两种错误,一种是ORA0-04020错误。
给public角色赋权的时候没有问题,但是要revoke的时候,是一个非常危险的事情,因为会访问一个sys.standadd包,这个包是一个基础包。revokepublic角色权限的时候会重新编译这个包。是一个相当危险的事情。在oracle生产环境中做任何事情都是非常危险的。
18.7、通过视图和存储过程控制权限
通过视图变相的控制用户和表的关系。
用户修改表中的某些行写存储过程,用户具有执行存储过程的权限,但是不能访问这个表。也可以达到控制用户访问表的权限。
18.8、行级和列级的VPD
VPD实现行级访问控制。
FGAC
列级VPD
主要通过例子讲VPD
每个用户登陆后访问相同的表,看到的数据不同。
建一张表car
select * from car
函数1.
函数2
策略1
用户U1访问car表,的时候执行函数fun_name。返回name列。
1、建一个函数,
调用函数需要提供两个参数:用户、表。
放回一个:where条件。
2、可以定义多个函数。
3、定义一个策略
用户
表
策略函数。
相关列。
select name from u1.car;就会触发策略。触发策略后就会执行这个函数。返回where条件,就会隐含的加到这个select name from u1.car where cost=30;
1、每个用户登陆以后,看到的都是不同的数据,就好像每个人使用一个独立的数据库一样。
2、virtual private database
3、建立策略函数。
返回where条件。
建立策略
满足策略,触发策略,调用策略函数,返回where条件,隐含的加到sql后面。
可以定义多个策略,定义多个函数。
查询某个用户下的策略
select * from dba_policies p where p.object_owner='U1';
删除策略。
没有策略后再次查询数据。
1、隐藏某些行、
2、隐藏某些列。
3、不同的用户登陆后不同的显示。
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 1030
volvo 5030
honda 6030
biaozhi 7020
xuetielong 8020
polo 9020
xiali 2010
jili 3010
byd 4010
9 rows selected.
SQL>
建立两个策略后使用sys用户的查询结果和没有使用策略的u1用户查询结果相同。
用户u1建立策略1后查询结果
SQL>set linesize 100
SQL>select*from car;
NAME NUM COST
-----------------------------------------------------------
toyota 1030
volvo 5030
honda 6030
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 2010
jili 3010
byd 4010
9 rows selected.
SQL>--可以看到cost不等于10的列num不显示。
给不同的用户访问返回不同的where条件。
函数3
create or replace function f_limit_access--函数3
(
vc_schema varchar2,
vc_object varchar2
)return varchar2
as
vc_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';
endif;
end;
/
策略4
begin
dbms_rls.add_policy(
object_schema =>'U1',
object_name =>'CAR',
policy_name =>'VPD_TEST',
function_schema =>'U1',
policy_function =>'F_LIMIT_ACCESS');
end;
/
18.9、审计
18.9.1、对sys用户
只要登陆,就强制审计。可以设置参数使登陆后所做的事情也审计。
你做了什么不审计。
用sys用户登陆数据库登陆这个行为就被审计了。
SQL>exit
DisconnectedfromOracleDatabase11gEnterpriseEditionRelease
11.2.0.4.0-64bitProduction
With the Partitioning, OLAP,DataMiningandRealApplicationTesting options
[oracle@oracle dbs]$ sqlplus /as sysdba
SQL*Plus:Release11.2.0.4.0Production on MonFeb2011:30:472017
Copyright(c)1982,2013,Oracle.All rights reserved.
Connected to:
OracleDatabase11gEnterpriseEditionRelease11.2.0.4.0-64bitProduction
With the Partitioning, OLAP,DataMiningandRealApplicationTesting options
SQL>
查看审计文件
[oracle@oracle adump]$ pwd
/u01/app/oracle/admin/oracl/adump
[oracle@oracle adump]$ ll -t |more
total 2020
-rw-r-1 oracle oinstall 777Feb2011:30 oracl_ora_3008_20170220113047381227143795.aud
-rw-r-1 oracle oinstall 777Feb2011:05 oracl_ora_2833_20170220110550377784143795.aud
-rw-r-1 oracle oinstall 777Feb2010:48 oracl_ora_2703_20170220104849080974143795.aud
[oracle@oracle adump]$ cat oracl_ora_3008_20170220113047381227143795.aud
Audit file /u01/app/oracle/admin/oracl/adump/oracl_ora_3008_20170220113047381227143795.aud
OracleDatabase11gEnterpriseEditionRelease11.2.0.4.0-64bitProduction
With the Partitioning, OLAP,DataMiningandRealApplicationTesting options
ORACLE_HOME =/u01/app/oracle/product/11.2.0/db_1
System name:Linux
Node name: oracle
Release:2.6.32-431.el6.x86_64
Version:#1 SMP Sun Nov 10 22:19:54 EST 2013
Machine: x86_64
Instance name: oracl
Redo thread mounted bythis instance:1
Oracle process number:32
Unix process pid:3008, image: oracle@oracle (TNS V1-V3)
MonFeb2011:30:472017+08:00
LENGTH :'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_operations
SQL> alter system set audit_sys_operations=true scope=spfile;
System altered.
SQL> startup force;
查看审计文件可以看到
### 18.9.2、标准数据库审计–普通用户
普通用户的审计
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;--对象相关的审计。
18.9.3、精细化审计
审计某些列,审计某些行,审计某一部分。
18.10、oracle数据库加密
1、表上的列加密
2、表空间进行加密。
11g
钱包
1、建立一个钱包,钱包有一个密码。
2、加密的时候,只要钱包保持打开,直接使用加密功能。
钱包的建立。
1、编辑sqlnet.ora参数文件。下面这个目录需要必须有自己建立。
2、执行一条命令
这条命令会生成一个文件
密码会放到这个文件中。
查询钱包是否打开。
打开钱包,打开钱包需要使用打开时的密码。
我们建立的钱包不是自动打开的钱包。要建立一个自动打开的钱包需要使用。
在oracle数据库我们一般使用手动打开钱包。
在官方文档里面有高级安全里面可以建立一个自动打开的钱包。
给一个表加一列,或者修改某个列为加密。
创建一个表空间使用加密。