18、安全

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、查询在哪个视图中。

  1. select*from dba_views a where a.view_name like 'DBA_%PRIV%'
  2. select*from dba_tab_privs where grantee='U1'--查询用户u1被赋予的对象的权限。
  3. select*from dba_sys_privs WHERE GRANTEE='U1'--查询用户u1被赋予的系统的权限。
  4. select*from dba_role_privs where grantee='U1'--查询用户u1被赋予什么角色。

怎么看这个角色下面还有哪些权限和角色呢。
查询角色在哪个视图中

  1. select*from dba_views a where a.view_name like '%ROLE%';
  2. select*from dba_views a where a.view_name like '%ROLE%';--查询角色赋权在哪个视图中
  3. select*from role_role_privs where role='DBA';--查询角色dba有什么角色的权限。
  4. select*from role_sys_privs where role='DBA';--查询角色dba有什么系统权限
  5. select*from role_tab_privs where role='DBA';--查询角色dba有什么表的权限。

删除用户权限

  1. REVOKE UPDATE ON "HR"."JOBS" FROM "U1"

18.2.3、查询用户配额

  1. select*from dba_views where view_name like '%QUOT%';
  2. select*from dba_views where view_name like '%QUOT%';
  3. 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、口令文件重建

假设将口令文件删除,将无法进程远程登陆。可以重新建立口令文件。

  1. [oracle@oracle dbs]$ orapwd --help
  2. Usage: orapwd file=<fname> entries=<users> force=<y/n> ignorecase=<y/n> nosysdba=<y/n>
  3. where
  4. file - name of password file (required),
  5. password - password for SYS will be prompted ifnot specified at command line,
  6. entries - maximum number of distinct DBA (optional),
  7. force - whether to overwrite existing file (optional),
  8. ignorecase - passwords are case-insensitive (optional),
  9. nosysdba - whether to shut out the SYSDBA logon (optional DatabaseVault only).
  10. There must be no spaces around the equal-to (=) character.
  11. [oracle@oracle dbs]$ orapwd file=orapworacl entries=5
  12. Enter password for SYS:
  13. [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还有待补充。

  1. --ORACLE 数据库的VPD
  2. --建表使用用户u1
  3. create table car (name varchar2(20),num number,cost number);
  4. insert into car values('toyota',10,30);
  5. insert into car values('volvo',50,30);
  6. insert into car values('honda',60,30);
  7. insert into car values('biaozhi',70,20);
  8. insert into car values('xuetielong',80,20);
  9. insert into car values('polo',90,20);
  10. insert into car values('xiali',20,10);
  11. insert into car values('jili',30,10);
  12. insert into car values('byd',40,10);
  13. commit;
  14. --函数1返回where条件 cost=30
  15. create or replace function fun_name (fun_scheme varchar2,fun_object varchar2)
  16. return varchar2 as fun_cost varchar2(20);
  17. begin
  18. fun_cost:='cost=30';
  19. return(fun_cost);
  20. end fun_name;
  21. --函数2放回where条件 cost=10
  22. create or replace function fun_num (fun_scheme varchar2,fun_object varchar2)
  23. return varchar2 as fun_cost varchar2(20);
  24. begin
  25. fun_cost:='cost=10';
  26. return(fun_cost);
  27. end fun_num;
  28. --建立策略1
  29. begin
  30. dbms_rls.add_policy(
  31. object_schema=>'u1',
  32. object_name=>'car',
  33. policy_name=>'filter_name',
  34. policy_function=>'fun_name',
  35. sec_relevant_cols=>'name');
  36. end;
  37. --建立策略2
  38. begin
  39. dbms_rls.add_policy(
  40. object_schema=>'u1',
  41. object_name=>'car',
  42. policy_name =>'filter_num',
  43. policy_function =>'fun_num',
  44. sec_relevant_cols=>'num');
  45. end;
  46. --建立策略3
  47. begin
  48. dbms_rls.add_policy(
  49. object_schema =>'u1',
  50. object_name =>'car',
  51. policy_name =>'filter_num',
  52. policy_function =>'fun_num',
  53. sec_relevant_cols =>'num',
  54. sec_relevant_cols_opt => dbms_rls.ALL_ROWS );
  55. end;
  56. --用不同的用户查询数据看策略是否生效。
  57. select name from car;
  58. select*from car;
  59. --删除策略1
  60. begin
  61. dbms_rls.drop_policy('u1','car','FILTER_NAME');
  62. end;
  63. /
  64. --删除策略2
  65. begin
  66. dbms_rls.drop_policy('u1','car','FILTER_NUM');
  67. end;
  68. /
  69. --查询u1用户下的策略。
  70. select*from dba_policies p where p.object_owner='U1';

用户u1没有策略的查询结果是

  1. SQL>select*from car;
  2. NAME NUM COST
  3. --------------------------------------------------------------------------------
  4. toyota 1030
  5. volvo 5030
  6. honda 6030
  7. biaozhi 7020
  8. xuetielong 8020
  9. polo 9020
  10. xiali 2010
  11. jili 3010
  12. byd 4010
  13. 9 rows selected.
  14. SQL>

建立两个策略后使用sys用户的查询结果和没有使用策略的u1用户查询结果相同。

用户u1建立策略1后查询结果

  1. SQL>set linesize 100
  2. SQL>select*from car;
  3. NAME NUM COST
  4. -----------------------------------------------------------
  5. toyota 1030
  6. volvo 5030
  7. honda 6030
  8. SQL>

用户u1建立策略1和2后的查询结果是。

  1. SQL>select*from car;
  2. no rows selected
  3. SQL>

只是建立策略3用户u1查询结果

  1. SQL>set linesize 100
  2. SQL>select*from car;
  3. NAME NUM COST
  4. --------------------------------------------------
  5. toyota 30
  6. volvo 30
  7. honda 30
  8. biaozhi 20
  9. xuetielong 20
  10. polo 20
  11. xiali 2010
  12. jili 3010
  13. byd 4010
  14. 9 rows selected.
  15. SQL>--可以看到cost不等于10的列num不显示。

给不同的用户访问返回不同的where条件。
函数3

  1. create or replace function f_limit_access--函数3
  2. (
  3. vc_schema varchar2,
  4. vc_object varchar2
  5. )return varchar2
  6. as
  7. vc_userid varchar2(100);
  8. begin
  9. select SYS_CONTEXT('USERENV','SESSION_USER')
  10. into vc_userid
  11. from dual;
  12. if(trim(vc_userid)='U1')then
  13. return'1=1';
  14. else
  15. return'1=0';
  16. endif;
  17. end;
  18. /

策略4

  1. begin
  2. dbms_rls.add_policy(
  3. object_schema =>'U1',
  4. object_name =>'CAR',
  5. policy_name =>'VPD_TEST',
  6. function_schema =>'U1',
  7. policy_function =>'F_LIMIT_ACCESS');
  8. end;
  9. /

18.9、审计

18.9.1、对sys用户

只要登陆,就强制审计。可以设置参数使登陆后所做的事情也审计。
你做了什么不审计。
用sys用户登陆数据库登陆这个行为就被审计了。

  1. SQL>exit
  2. DisconnectedfromOracleDatabase11gEnterpriseEditionRelease
  3. 11.2.0.4.0-64bitProduction
  4. With the Partitioning, OLAP,DataMiningandRealApplicationTesting options
  5. [oracle@oracle dbs]$ sqlplus /as sysdba
  6. SQL*Plus:Release11.2.0.4.0Production on MonFeb2011:30:472017
  7. Copyright(c)1982,2013,Oracle.All rights reserved.
  8. Connected to:
  9. OracleDatabase11gEnterpriseEditionRelease11.2.0.4.0-64bitProduction
  10. With the Partitioning, OLAP,DataMiningandRealApplicationTesting options
  11. SQL>

查看审计文件

  1. [oracle@oracle adump]$ pwd
  2. /u01/app/oracle/admin/oracl/adump
  3. [oracle@oracle adump]$ ll -t |more
  4. total 2020
  5. -rw-r-1 oracle oinstall 777Feb2011:30 oracl_ora_3008_20170220113047381227143795.aud
  6. -rw-r-1 oracle oinstall 777Feb2011:05 oracl_ora_2833_20170220110550377784143795.aud
  7. -rw-r-1 oracle oinstall 777Feb2010:48 oracl_ora_2703_20170220104849080974143795.aud
  8. [oracle@oracle adump]$ cat oracl_ora_3008_20170220113047381227143795.aud
  9. Audit file /u01/app/oracle/admin/oracl/adump/oracl_ora_3008_20170220113047381227143795.aud
  10. OracleDatabase11gEnterpriseEditionRelease11.2.0.4.0-64bitProduction
  11. With the Partitioning, OLAP,DataMiningandRealApplicationTesting options
  12. ORACLE_HOME =/u01/app/oracle/product/11.2.0/db_1
  13. System name:Linux
  14. Node name: oracle
  15. Release:2.6.32-431.el6.x86_64
  16. Version:#1 SMP Sun Nov 10 22:19:54 EST 2013
  17. Machine: x86_64
  18. Instance name: oracl
  19. Redo thread mounted bythis instance:1
  20. Oracle process number:32
  21. Unix process pid:3008, image: oracle@oracle (TNS V1-V3)
  22. MonFeb2011:30:472017+08:00
  23. LENGTH :'160'
  24. ACTION :[7]'CONNECT'
  25. DATABASE USER:[1]'/'
  26. PRIVILEGE :[6]'SYSDBA'
  27. CLIENT USER:[6]'oracle'
  28. CLIENT TERMINAL:[5]'pts/0'
  29. STATUS:[1]'0'
  30. DBID:[10]'1976643781'
  31. [oracle@oracle adump]$

要想使sys用户登陆后所做的事情也被设计,需要设置一个参数。可以看到这个参数修改需要重启数据库。

修改参数并重启数据库。

  1. SQL> show parameter audit_sys_operations
  2. SQL> alter system set audit_sys_operations=true scope=spfile;
  3. System altered.
  4. SQL> startup force;

查看审计文件可以看到

### 18.9.2、标准数据库审计–普通用户

普通用户的审计
1、11g默认开启了对普通用户的审计
2、需要设置。

审计什么。
1、审计sql语句
2、使用了哪些系统权限。
3、使用了哪些对象权限

使用em进行审计配置。
成功或者失败审计。
按照回话审计。
access更细一些。


针对系统的权限。 按照会话审计和按照访问审计。一般使用bysession,对于ddl语句不可以使用bysession。

  1. select*from dba_obj_audit_opts;--查询对象的审计
  2. select*from dba_priv_audit_opts;--权限的审计。
  3. select*from dba_stmt_audit_opts;--执行sql语句的审计。
  4. 这些视图都在参考里面。
  5. select*from dba_audit_trail;--查询实实在在的审计信息。
  6. truncate table aud$;--清除审计信息。
  7. 触发几个审计。
  8. select*from dba_audit_session;--审计的会话。
  9. select*from dba_audit_object;--对象相关的审计。

18.9.3、精细化审计

审计某些列,审计某些行,审计某一部分。

18.10、oracle数据库加密

1、表上的列加密
2、表空间进行加密。
11g

钱包
1、建立一个钱包,钱包有一个密码。
2、加密的时候,只要钱包保持打开,直接使用加密功能。

钱包的建立。
1、编辑sqlnet.ora参数文件。下面这个目录需要必须有自己建立。

2、执行一条命令

这条命令会生成一个文件

密码会放到这个文件中。

查询钱包是否打开。

打开钱包,打开钱包需要使用打开时的密码。

我们建立的钱包不是自动打开的钱包。要建立一个自动打开的钱包需要使用。
在oracle数据库我们一般使用手动打开钱包。
在官方文档里面有高级安全里面可以建立一个自动打开的钱包。

给一个表加一列,或者修改某个列为加密。

创建一个表空间使用加密。

posted @ 2017-02-25 21:01  海天境域  阅读(140)  评论(0)    收藏  举报