Oracle数据库安全管理
1、用户管理
也称为账户,它是Oracle使用者的身份证明
用户需要使用正确的用户名和密码才能连接数据库
用户权限不同,允许访问的对象和执行的操作是不一样的。
方案(模式schema):一个特定用户下的对象集合,创建一个用户就会创建一个方案,一个用户只能关联一个方案。用户名就是方案名
方案就相当于你的财产,就是对象的集合
Oracle的初始用户
管理员:sys和system
sys:可以创建、启动、关闭和修改数据库
system:不能创建和启动、关闭数据库
普通用户:scott、hr(pdb模式)
除管理员外,其余用户在创建后处于锁定状态
软件项目一般不建议使用这些初始用户
创建用户
做软件开发最好是自己创建用户。
最简单创建用户的方法:
create user username identified by password;
带有条件的创建用户的方法:
CREATE USER username
IDENTIFIED BY password
DEFAULT TABLESPACE tablespacename
TEMPORARY TABLESPACE tablespacename
QUOTA size ON tablespacename;
例:创建一个mr用户,口令为mrsoft,并设置默认的表空间为users,临时表空间为temp的用户
create user c##mr identified by mrsoft default tablespace users temporary tablespace temp;
默认是cdb模式,要加上c##
scott用户没有权限,在system_conn管理员下进行创建。
创建完c##mr用户,但是此时这个用户是没有任何权限的。
在sql plus中:
用户名:c##mr 口令:mrsoft
此时会提示缺乏创建对话权限。
查看用户信息
dba_users
user_objects
desc dba_users;
desc user_objects;
select * from dba_users;
select * from user_objects
不是所有的人都可以查看用户信息,所以我们一般都用dba
desc dba_users;
查看用户信息:
select * from dba_users where username =‘c##scott’;
desc user_objects;
查看用户信息:
select * from user_objects;
这个查询语句可以放在scott用户下运行,在该用户下运行就只查看该用户下的自己的表的信息。
修改用户
修改密码
1、Alter user 用户名 identified by newpwd
2、password
对于password修改密码的方式,修改自己的密码需要使用旧密码
对于password c##scott;是修改其他用户的方法,在system_conn管理员下修改,不需要旧密码。
用户锁定与解锁
1、Alter user username account lock
2、Alter user username account unlock
分配表空间配额
格式:Alter user username quota size on tablespace
例:alter user c##mr quota 10m on users’
修改用户east在表空间上的磁盘限额为20m(原始为10m,增加10m)。
alter user c##east quota 20m on tbsp_1;
修改用户east的新口令为123456(原始为mrsoft)。
alter user c##east identified by 123456;
删除用户
格式:drop user username [cascade]
(1)如果用户方案中包括任何对象,在删除用户时,必须加上cascade短语。
(2)如果用户当前正与Oracle服务器连接,则不能删除。
(3)只有管理员才能删除用户
cascade在我们学习基联删除的时候学到过
drop user c##scott cascade;
提示:无法删除当前连接的用户(正在工作中的不能删除)
自己不能删除自己(管理员不能删除管理员)
2、权限管理
概念
概念:执行特定类型的SQL语句或访问一个用户的对象的权利
Oracle数据库使用权限来控制用户对数据的访问和用户所能执行的操作。
分类:系统权限和对象权限
系统权限
数据库级别执行某些操作的权限
create session
create tablespace
create table
create view
Alter命令
Drop命令
一般create、alter、drop都属于系统权限
补充:
对象权限
用户对某个特定的数据库对象执行某种操作的权限
指对数据库中的特定对象(如表、视图、序列等)的访问控制权限,以及用户可以在这些数据库对象上执行哪些操作
数据库用户拥有对自己的对象的所有对象权限,所以对象权限管理实际上是对象所有者对其他用户操作该对象的权限管理。
常用权限:增删改查
权限授权管理
授权
Grant 系统权限 to user
Grant 对象权限 on 数据对象 to user
grant create session to xiaoming
grant select on emp to xiaoming
create user c##mr identified by mrsoft default tablespace users temporary tablespace temp;
此时创建的c##mr没有任何权限
grant create session to c##mr;(在system_conn管理员下输入)
在sql developer中创建一个新连接:c##mr,mrsoft,orcl
现在只有连接数据库的权限。
grant create table to c##mr;(在system_conn管理员下输入)
授权创建表权限。
创建表权限有了,那么增删改查权限就都有了
select * from c##scott.emp;
提示:表或视图不存在,这是因为权限不足,缺乏对象权限。
授权:grant select on emp to c##mr;(在scott_conn下输入)
表上修改数据的权限:
grant update on emp to c##mr;
表上删除数据的权限:
grant delete on emp to c##mr;
表上添加数据的权限:
grant insert on emp to c##mr;
如果想一次性授予查找、修改、删除、添加数据的权限:
grant uodate,delete,insert,select on emp to c##mr;
或者:
grant all on emp to c##mr;
只允许修改工资列:
grant update(sal) on emp to c##mr;
给数据库中所有的用户授予相同的权限:
grant update(sal) on emp to public;
这里授予相同的权限使用了public,当然不仅仅是update(sal) 权限,换成其他的权限也是可以的。
课堂练习
1、如果scott将修改emp表的权限给rose用户,该如何操作
2、如果scott希望将对emp表的查询、插入、删除和修改表的权限都给rose ,该如何操作
3、如果只允许rose修改emp表的工资列,该怎么操作
4、如果给数据库中所有用户分配相同的权限,该怎么操作
答:
1、grant update on emp to c##rose;
2、grant uodate,delete,insert,select on emp to c##rose;
或者:
grant all on emp to c##rose;
3、grant update(sal) on emp to c##rose;
4、grant update(sal) on emp to public;
权限的传递
系统权限:
with admin option
对象权限:
with grant option
允许被授予者进一步为其他用户授予权限
grant create session to c##rose with admin option;
在创建rose权限的时候允许rose用户再把权限传递给其他人
grant update(sal) on emp to c##rose with grant option;
注意:不管是授予rose用户系统权限还是对象权限,再使用c##rose用户去给mr用户授权的话,那么c##rose用户就与mr用户是级联的。
为c##rose用户授权:
grant update on emp to c##rose with grant option
sqlplus:conn c##rose/rose
sqlplus:grant update on c##scott.emp to c##mr;
rose用户与mr用户级联但是此时更新emp表用户信息,查询是看不到更新内容的,必须授予select查看权限才能看到结果。
只要是在rose用户下授权其他用户就是和rose用户级联了。当然前提是这个权限是其他用户给rose的对象权限
在scott用户下授权其他用户就是和scott用户级联了。
如果是Scott用户授权给mr,就是在scott用户下给mr授权
如果是Scott用户授权给mr,对mr而言,所得权利和rose给他授权是一样的。但这个授权和rose没关系,只和scott有关系。
就是说如果这时撤销rose的权限,mr的权限仍然存在。
但如果是rose给mr授权,那这时撤销rose的权限就和mr有级联了,就是mr的权限也没有了。
收回权限/撤销权限
撤销系统权限
格式:revoke 权限 from user
撤销系统权限时没有级联效果
撤销对象权限
格式:revoke object_privilege [all] on object from user
级联问题:如果对象是用with grant option授予的,则撤销对象权限也将导致级联撤销
revoke create session from c##rose;
conn c##rose/rose
提示:您将不再连接到oracle。
注意:但是级联的用户hr是可以继续连接的,也就是说级联的用户的权限不会撤销。
查看权限
可以通过查询以下视图来获取有关权限的信息:
dba_sys_privs:列出授予用户和角色的系统权限
session_privs:列出用户当前可用的权限
dba_tab_privs:列出对于数据库中所有对象的所有权限
dba_col_privs:描述数据库中的所有对象的授权
列出当前用户可用的权限:
select * from session_privs;
3、角色管理
概念:
角色:一系列权限的集合,目的在于简化对权限的管理
Oracle数据库允许将一组相关权限授予某个角色,然后将这个角色授予需要的用户,拥有该角色的用户将拥有该角色包含的所有权限。
角色、用户及权限是一组关系密切的对象,既然角色是一组权限的集合,那么,它只有被授予某个用户才能有意义,可以用如图所示的图形来帮助我们理解角色、用户及权限的关系。
拥有某角色的用户,就拥有了该角色的所有权限。
一个角色可以给多个用户,一个权限也可以给多个角色。
角色分类:预定义角色和自定义角色
常用预定义角色
connect:登录数据库,执行查询语句和操作
resource:create table,对该表的所有权限
DBA:执行某些授权命令、创建表,以及对任何表的数据进行操纵。它包括了上面两种角色的操作。
DBA权限相当于管理员的权限,包含了connect、resource所有权限,一般不要把DBA权限给用户。
自定义角色
用户根据业务需要自己创建具有某些权限的角色,然后为角色授权,最后再将权限分配给用户。
创建角色
有两种方式
不验证:
create role 角色名
数据库验证:
Create role 角色名 identified by 密码
在system/root用户下:
创建角色:create role c##role2;
授权角色:grant create session,create table to c##role2;
把角色给用户:grant c##role2 to mr;
有了权限之后进行建表:create table t(tid number);
提示:权限不足
原因:对象权限给了用户用户就有了,而系统权限必须重新连接用户才能获得权限。
也可以把预定义角色的权限给用户:
grant connect,resource to c##mr;
也可以把角色给角色:
grant connect,resource to c##role2;
此时角色c##role2就拥有了connect,resource角色所拥有的所有权限。
为角色授权
grant all on emp to testrole;
为用户授予角色
grant testrole,create session to tom;
回收权限
revoke testrole,create session from tom
注意事项:
对象权限只能单独授权和单独回收
系统权限和角色可以在一条语句中完成授权和回收
一个用户可以被授予多个角色
一个角色也可以被授予多个用户
一个角色还可以被授予另一个角色
查看角色
查看数据库中有哪些角色(包含预定义和自定义)
select * from dba_roles;
查看当前用户有哪些角色
select * from user_role_privs;
查看角色包含的权限
select * from role_role_privs where role=‘ROLE1’;
select * from role_sys_privs where role=‘ROLE1’;
select * from role_tab_privs where role=‘ROLE1’;
管理用户角色
设置角色口令
alter role role_name not idenitfied|identified by password
删除角色
drop role role_name
删除角色后,原来拥有该角色的用户将失去相应的权限
4、事务管理
为什么需要事务
例如,银行转帐问题:
假定资金从帐户A转到帐户B,至少需要两步:
帐户A的资金减少
然后帐户B的资金相应增加
概念(事务和锁):
事务:一系列语句构成的逻辑单元
用于保证数据的一致性,它由一组相关的 dml 语句组成,该组的 dml(数据操作语言,增删改,没有查询)语句要么全部成功,要么全部失败。
锁:当执行事务操作时(dml 语句),oracle 会在被作用的表上加锁,防止其它用户修改表的结构。会在数据行上加锁,防止其它用户修改数据。
这个地方所说的锁就是和Java多线程中的同步锁是相同的概念,相同的用法。
说明:
一个书屋可能会有很多步骤,只要有一个步骤失败则会使整个步骤进行回滚(取消)
之前所学的都是隐式结束事务。
事务开启
从执行的第一条dml语句开始。(增删改)
事务结束
显示结束:主动提交或撤销
隐式结束:被动提交或撤销
隐式结束事务
执行一条数据定义语句(create\drop\alter)
执行一个数据控制命令(grant\revoke)
正常断开数据库连接
特殊SQL命令的隐式提交
有些SQL命令的提交工作是隐式的,并不需要COMMIT命令就可完成提交工作:
connect, disconnect ,quit, exit,
create table, alter table, drop table,
create view,alter view,drop view,
grant, revoke, DCL
SQL>delete from emp where eid=3; --开始一个事务
已删除一行
SQL>create table tab(id number(5)); --提交事务
表已创建。–事务结束
SQL>delete from emp where eid=4 --开始一个新事务
显式结束事务
显示结束:
commit 提交事务
rollback 回滚事务
savepoint 保存点
回滚事务
撤销对数据库进行的全部操作。
保存点(回退点):在含有较多sql语句的事务中间设定的回滚标记。
利用保存点可以将事务划分成若干部分,这样回滚时就不必回滚整个事务,而可以回滚到指定的保存点,有更大的灵活性
savepoint a;
update bank set mon=mon-500 where nam=‘tom’;
savepoint b;
update bank set mon=mon+500 where nam=‘jack’;
rollback to a;
commit;
以上语句执行后,相当于什么也没有做,因为最后回滚到了a点。
在system/root用户下:
update emp set sal =999 where empno = 7369;
修改成功
select * from emp;
sqlplus下:
conn c##scott/tiger
select * from emp;
我们查询可以发现,我们刚刚在system/root用户下修改成功的数据在这里并没有修改,这是因为事务还没有结束,不会保存到磁盘上,此时会保存在缓冲区中,缓冲区的事务是可以回滚的。
update emp set sal =888 where empno = 7369;
光标一直没有结束,因为有锁。
再回到system/root用户下:
此时commit;
sqlplus下:
我们发现system/root提交事务之后,锁就解锁了。
sqlplus中光标结束,提示修改成功,但是system/root下的数据也不会修改,也是因为sqlplus下的scott用户没有commit提交。
总结回滚事务语句的功能
执行没有“TO”回滚子句的ROLLBACK语句,它实现如下功能:
结束事务;
撤销事务中所有对数据库的修改;
清除事务中设置的所有保留点;
释放事务中的加锁;
执行包含“TO”保留点子句的ROLLBACK语句,它完成如下操作:
只回滚保留点之后的那部分事务;
撤销该保留点之后所设置的保留点;
释放该保留点之后所施加的表锁和行锁;
课堂练习
在一个学生管理系统中,教师teacher01可以查询学生(student表)的所有信息,并可以修改学生成绩(score列)。学生student01可以查看学生信息。主任director01可以添加和删除学生。请问该如何为teacher01 student01 director01授予相应权限。