首页 > 其他分享 >39、安全_1(权限、用户profile文件、密码文件、VPD对行级访问的控制)

39、安全_1(权限、用户profile文件、密码文件、VPD对行级访问的控制)

时间:2024-11-25 14:35:08浏览次数:4  
标签:profile 39 -- car 30 用户 VPD oracle 权限

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

相关文章

  • CritiCS:智能协作下的创意长篇故事生成框架 | EMNLP'24
    来源:晓飞的算法工程笔记公众号,转载请注明出处论文:CollectiveCriticsforCreativeStoryGeneration论文地址:https://arxiv.org/abs/2410.02428创新点提出了\({\ttCritiCS}\)的框架,旨在通过基于创造力标准的集体评议,创造性地增强故事计划和文本表现力。通过实......
  • CF1392H ZS Shuffles Cards
    首先,游戏结束时的期望轮数可以表示为第\(i\)轮还未结束的概率乘第\(i\)轮的期望抽牌数,而注意到每一轮的期望抽牌数都是一定的,而后者是简单的,故先考虑处理前者。发现前者似乎并不好算,而它的形式等价于期望轮数,现在考虑算期望轮数。考虑分析这个过程,我们将会在抽牌的过程中不......
  • 代码随想录算法训练营第十一天|LC150.逆波兰表达式求值|LC239.滑动窗口最大值|LC347.
    150.逆波兰表达式求值-力扣(LeetCode)题目要求:    1、整数除法只保留整数部分;    2、该表达式总会得出有效数值且部存在除数为0的情况;    3、逆波兰表达式:是一种后缀表达式,所谓后缀就是指运算符写在后面。fromtypingimportListfromoperato......
  • ABB机器人DSQC639主板维修
    ABB机器人主板DSQC639维修时如何判断哪些因素导致了元气器虚焊?1.元件热稳定性检查:从大量的维修实践来看,电解电容的热稳定性不好是常见的原因之一,其次是其它电容、三极管、二极管、IC、电阻等。 2.焊点外观检查:虚焊的焊点表面可能出现锥形空洞,焊点周围呈圆形凸起,或者焊点周围出......
  • 解决TypeError: 'NoneType' object is not subscriptable
    1.捕获异常的方式try:img_list=img_list["name"]except:img_list=""2.对象进行判断ifimg_list:img_list=img_list["name"]else:img_list=""demotextJson=json.loads(res.text)#转json对象iftextJson:##整个对象都......
  • 【题解】P3917 异或序列
    传送门也算是一个有关于异或的小trick吧,简单记录一下。可以维护原序列的前缀异或和\(sum\),于是原题答案贡献变为\(\sum\limits_{i=1}^n\sum\limits_{j=i}^nsum_j\oplussum_{i-1}\)。变形一下为\(\sum\limits_{i=0}^{n-1}\sum\limits_{j=1}^{i+1}sum_i\oplussum_{j}......
  • Web前端开发入门学习笔记之CSS 39-40 --新手超级友好版- 文本颜色字体篇
       Foreword写在前面的话: 大家好,我是一名刚开始学习HTML的新手。这篇文章是我在学习html过程中的一些笔记和心得,希望能和同样在学习HTML的朋友们分享。由于我的知识有限,文章中可能存在错误或不准确的地方,欢迎大家在评论区提出建议和指正。我非常期待大家的反馈,以便我能......
  • P3959 [NOIP2017 提高组] 宝藏 题解
    P3959[NOIP2017提高组]宝藏题解搜索魅力时刻怎么说,四种做法比较??的模拟退火跑得快但是正确性有问题的状压DP跑得慢但是一定正确的状压DP时间复杂度很玄学的DFS+剪枝我就选择了搜索的做法先打个暴搜,70pts点击查看暴搜代码#include<bits/stdc++.h>usingna......
  • vue ui创建项目报错:Cannot read property 'indexOf' of undefined解决方法
    本来以为是个很简单的小报错,在网上搜了几个教程竟然都没有解决,整了快半个小时,越整越烦躁。最后忍无可忍重新安装了一遍nodejs,竟然还报这个错...突然想到自己一直没去看详细的报错日志,于是在黑窗看了一下报错内容:原来是权限不够(注:之前用系统管理员身份运行过,创建项目那里目录一......
  • 基于STM32的智慧超市管理设计与实现(239)
    文章目录一、前言1.1项目背景1.2设计思路1.3功能详细总结【1】环境监测与智能控制【2】商品管理与顾客服务【3】实时数据展示1.4环境监测页面设计1.5超市收银上位机1.6系统框架图1.7硬件原理图1.8硬件实物二、硬件选型2.1STM32开发......