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数据库我们一般使用手动打开钱包。
在官方文档里面有高级安全里面可以建立一个自动打开的钱包。
给一个表加一列,或者修改某个列为加密。
创建一个表空间使用加密。
标签:profile,39,--,car,30,用户,VPD,oracle,权限 From: https://www.cnblogs.com/xgq20210831/p/18562895