Oracle 19C学习 - 12. 用户与权限管理
ORACLE数据库两种安全验证模式
1. 操作系统认证
我们可以将Linux的用户加入到oinstall,dba组中,然后在Oracle本地登陆或者使用远程登陆,可以作为sysdba登录,在数据库级不需要提供密码(具体操作见附1)。
SQLPLUS / as SYSDBA
Linux默认支持操作系统认证,要关闭操作系统验证,可以:
- 在$ORACLE_HOME/network/admin目录下创建sqlnet.ora,添加:SQLNET.AUTHENTICATION_SERVICES = (NONE)。
- 取消用户的dba和oinstall组。
2. 口令认证
Oracle的口令文件存放所有sysdba或者sysoper权限的用户的口令,如果想以sysdba权限远程连接数据库,必须使用口令文件,否则不能连上。
使用口令文件的好处是即使数据库不处于open状态,依然可以通过口令文件验证来连接数据库。
安装完oracle,口令文件中只存放了sys的口令。如果之后把sysdba权限授予了普通用户,那么此时会把普通用户的口令从数据库中读到口令文件中保存下来,这时要求数据库处于open状态。
重新建立口令文件
orapwd file=$ORACLE_HOME/dbs/orapw$ORACL_SID password=oracle force=y format=12 --format=12支持弱口令。
REMOTE_LOGIN_PASSWORDFILE参数
REMOTE_LOGIN_PASSWORDFILE参数增强系统的安全性,所谓提高安全性就是禁止以SYSDBA或SYSOPER特权用户从客户端登陆到数据库系统中。
show parameter remote_login_passwordfile NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ remote_login_passwordfile string EXCLUSIVE
- EXCLUSIVE:允许客户端以SYSDBA或SYSOPER权限登录到数据库实例中完成数据库管理操作;
允许授予和回收SYSDBA或SYSOPER权限。(允许你在sys用户下使用alter user sys identified by xxx;给sys用户修改密码的) - NONE:禁止客户端以SYSDBA或SYSOPER权限登录到数据库实例中完成数据库管理操作;
禁止授予和回收SYSDBA或SYSOPER权限。 - SHARED:允许客户端以SYSDBA或SYSOPER权限登录到数据库实例中完成数据库管理操作;
禁止授予和回收SYSDBA或SYSOPER权限。(不允许你在sys用户下使用alter user sys identified by xxx;给sys用户修改密码的)
使用alter system命令更改,因为修改的是SPFILE,所以修改后,需要重新启动数据库才能看到效果。
SQL> alter system set remote_login_passwordfile=shared scope=spfile; System altered. SQL> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down.
SQL> startup ORACLE instance started. SQL> show parameter remote_login_passwordfile NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ remote_login_passwordfile string SHARED
权限Privilege
- 系统权限:获得访问数据库的权限 并且能执行特定DDL操作
- 对象权限:处理数据库对象的内容 比如说SELECT UPDATE INSERT
系统权限
方案/模式(SCHEMA):对象的集合,例如表、视图、序列和同义词的集合,并且SCHEMA和USER是同名。
系统权限示例
-- CREATE SESSION 创建会话
-- CREATE TABLE 创建表
-- CREATE SEQUENCE 创建序列
-- CREATE VIEW 创建视图
-- CREATE PROCEDURE 创建存储过程
创建用户: CREATE USER USER_NAME IDENTIFIED BY PASSWORD;
删除用户:DROP USER USER_NAME;
为用户授予系统权限 GRANT 权限 TO USER.
为用户取消系统权限 REVOKE 权限 FROM USER
--授权
GRANT CREATE SESSION, CREATE TABLE, CREATE SEQUENCE, CREATE VIEW TO scott; Grant succeeded.
--取消授权 REVOKE CREATE SEQUENCE, CREATE VIEW FROM scott;
查看某个用户当前的系统权限:(用户名请使用大写并在sys用户下执行)
SELECT grantee, privilege FROM dba_sys_privs WHERE GRANTEE = 'SCOTT'; --scott要大写 GRANT PRIVILEGE ----- ---------------------------------------- SCOTT CREATE TABLE SCOTT CREATE SESSION
对象权限
用户在自己的SCHEMA中具有所有的对象的权限。用户可以授权给任何其他用户或角色。
不同类型的方案对象(SCHEMA)具有不同的对象权限。
对象权限特点:
- 对象权限会根据对象的不同而变化。
- 对象的所有者对其具有全部权限。
- 所有者可以将属于他的对象权限授予其他用户。
对象权限
对象权限授权实例
HR用户赋予对象权限给SCOTT用户
GRANT SELECT, UPDATE
ON employees
TO scott;
Grant succeeded.
查看用户的对象权限
--查scott用户权限,就在scott用户下进行
COL grantee FOR a20 COL owner FOR a20 COL table_name FOR a20 COL privilege FOR a20 set lines 200 set pages 200 SELECT grantee, owner, table_name, privilege FROM user_tab_privs WHERE grantee='SCOTT'; GRANTE OWNER TABLE_NAME PRIVILEGE ------ -------------------- -------------------- -------------------- SCOTT HR EMPLOYEES SELECT SCOTT HR EMPLOYEES UPDATE
撤销对象权限
CASCADE 如果要删除通过REFERENCES权限对该对象实行的
CONSTRAINTS 任何引用完整性约束,则此项是必须的
REVOKE SELECT,UPDATE
ON employees
FROM scott;
Revoke succeeded.
WITH ADMIN OPTION(系统权限)
被授予该权限的用户有权将某个他已有的系统权限授予其他用户或角色。
他有两个特点:
- 如果用户使用WITH ADMIN OPTION为某个用户授予系统权限,取消父用户的系统权限并不会级联取消子用户的权限。
- 系统权限无级联,即A授予B系统权限,B授予C系统权限,如果A收回B的系统权限,C的系统权限不受影响;系统权限可以跨用户回收,即A可以直接收回C用户的权限。
SYS:
GRANT CREATE SESSION TO LEO
WITH ADMIN OPTION;
LEO:
GRANT CREATE SESSION TO KEVIN;
REVOKE LEO的权限不影响Kevin的登陆。
Kevin无法给其他用户授权CREATE SESSION,提示权限不够。
WITH GRANT OPTION(对象权限)
授予该权限的用户有权将对象权限授予其他用户或角色。
如果取消父用户的对象权限,那么对于这个用户使用WITH GRANT OPTION授予权限的用户来说,取消WITH GRANT OPTION授权是级联的。
HR:
GRANT SELECT
ON EMPLOYEES
TO leo
WITH GRANT OPTION;
LEO:
GRANT SELECT
ON hr.employees
TO KEVIN;
--revoke leo的权限会同样revoke掉kevin的权限。revoke后,kevin进行查询会提示没有表或者视图
角色 ROLE
可以创建角色,并分配系统权限与对象权限,然后再将角色分配给用户。
常见的预定义角色: CONNECT, RESOURCE, DBA等。
--创建角色 CREATE ROLE service_leader;
CREATE ROLE manager IDENTIFIED BY oracle;
--为角色分配系统权限 GRANT create session, create table, create view TO service_leader; --为角色分配对象权限 GRANT select ON hr.employees TO service_leader; --查看角色的系统权限 SELECT * FROM role_sys_privs WHERE role='SERVICE_LEADER'; --查看角色的对象权限 SELECT * FROM dba_tab_privs WHERE GRANTEE='SERVICE_LEADER';
--删除角色
DROP ROLE service_leader;
--一个组可以授权给另外一个组
SQL> GRANT DBA TO service_leader;
Grant succeeded.
--SYSDBA和SYSOPER无法再被授权
SQL> GRANT SYSDBA TO service_leader;
ERROR at line 1:
ORA-01931: cannot grant SYSDBA to a role
SQL> GRANT SYSOPER TO service_leader;
ERROR at line 1:
ORA-01931: cannot grant SYSOPER to a role
DBLINK数据库连接
允许本地用户访问远程数据库中的数据。服务器提前与远程服务器建立链接。
第一种:私有数据库连接(需要CREATE DATABAS LINK权限)
CREATE DATABASE LINK hr_19c CONNECT TO hr IDENTIFIED BY "hr" USING '192.168.16.66:1521/orcl';
注: hr/hr是远程服务器的用户名和密码; 192.168.16.66是远程的服务器;orcl是实例名
第二种:公共数据库连接(需要CREATE PUBLIC DATABAS LINK权限)
CREATE PUBLIC DATABASE LINK hr_19c_P CONNECT TO hr IDENTIFIED BY "hr" USING '192.168.16.66:1521/orcl';
注: hr/hr是远程服务器的用户名和密码; 192.168.16.66是远程的服务器;orcl是实例名
--用户需要有CREATE DATABASE LINK的权限或者CREATE PUBLIC DATABASE LINK的权限。
GRANT CREATE DATABASE LINK, CREATE PUBLIC DATABASE LINK TO hr;
--删除建立的DATABASE LINK,用户创建的私有dblink,只能在此用户下删除,sys看不到。
DROP DATABASE LINK hr_to_12c;
--删除PUBLIC DATABASE LINK, 有DROP PUBLIC DATABASE LINK的用户可以删除其他人创建的PUBLIC DATABASE LINK.
DROP PUBLIC DATABASE LINK hr_to_12c_p;
附1:
1. 环境变量中添加下列语句(root)
vim /etc/profile
if [ $USER = "leo" ]; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi
source /etc/profile
useradd -g oinstall -G dba,oper leo
passwd leo
su - leo
vim .bash_profile
export EDITOR=vi
export TMP=/tmp
export TMPDIR=$TMP
export ORACLE_SID=orcl
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/19c/db_1
export INVENTORY_LOCATION=/u01/oraInventory
export TNS_ADMIN=$ORACLE_HOME/network/admin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export NLS_LANG="AMERICAN_AMERICA.AL32UTF8"
export NLS_DATE_FORMAT="YYYY-MM-DD HH24:MI:SS"
export PATH=$ORACLE_HOME/bin:/bin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:$PATH:$HOME/bin
umask 022
source .bash_profile
至此,leo用户可以使用数据库。