一、SQLPlus权限体系概述
Oracle数据库的权限管理采用基于角色的访问控制(RBAC)模型。在Debian上通过SQLPlus管理权限时,需要理解以下核心概念:
1.1 权限类型
| 权限类型 | 说明 | 示例 |
|---|---|---|
| 系统权限 | 允许执行特定操作 | CREATE SESSION, CREATE TABLE |
| 对象权限 | 允许操作特定对象 | SELECT ON hr.employees |
| 角色权限 | 权限的集合 | DBA, CONNECT, RESOURCE |
1.2 用户与角色关系
用户 → 角色 → 权限
↓ ↓ ↓
scott → DBA → CREATE ANY TABLE
→ dev_role → SELECT ON employees
二、用户管理
2.1 创建用户
-- 基本创建
CREATE USER scott IDENTIFIED BY tiger;
-- 指定默认表空间
CREATE USER scott IDENTIFIED BY tiger
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp;
-- 指定配额
CREATE USER scott IDENTIFIED BY tiger
QUOTA 100M ON users
QUOTA UNLIMITED ON temp;
2.2 修改用户
-- 修改密码
ALTER USER scott IDENTIFIED BY new_password;
-- 锁定/解锁用户
ALTER USER scott ACCOUNT LOCK;
ALTER USER scott ACCOUNT UNLOCK;
-- 修改配额
ALTER USER scott QUOTA 200M ON users;
-- 设置密码过期
ALTER USER scott PASSWORD EXPIRE;
2.3 删除用户
-- 删除用户(需要无对象)
DROP USER scott;
-- 删除用户及所有对象
DROP USER scott CASCADE;
2.4 查看用户信息
-- 查看所有用户
SELECT username, account_status, created FROM dba_users;
-- 查看当前用户
SHOW USER;
-- 查看用户配额
SELECT * FROM dba_ts_quotas WHERE username = 'SCOTT';
三、系统权限管理
3.1 常用系统权限
| 权限 | 说明 |
|---|---|
| CREATE SESSION | 连接数据库 |
| CREATE TABLE | 创建表 |
| CREATE VIEW | 创建视图 |
| CREATE PROCEDURE | 创建存储过程 |
| CREATE USER | 创建用户 |
| ALTER USER | 修改用户 |
| DROP USER | 删除用户 |
| CREATE ANY TABLE | 在任何模式创建表 |
| DROP ANY TABLE | 删除任何模式下的表 |
3.2 授权系统权限
-- 授予基本权限
GRANT CREATE SESSION TO scott;
GRANT CREATE TABLE TO scott;
GRANT CREATE VIEW TO scott;
-- 授予WITH ADMIN OPTION(可转授)
GRANT CREATE SESSION TO scott WITH ADMIN OPTION;
-- 批量授权
GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW TO scott;
3.3 回收系统权限
-- 回收权限
REVOKE CREATE TABLE FROM scott;
-- 查看已授予的系统权限
SELECT * FROM dba_sys_privs WHERE grantee = 'SCOTT';
四、对象权限管理
4.1 对象权限类型
| 权限 | 适用对象 |
|---|---|
| SELECT | 表、视图、序列 |
| INSERT | 表、视图 |
| UPDATE | 表、视图 |
| DELETE | 表、视图 |
| ALTER | 表 |
| INDEX | 表 |
| REFERENCES | 表 |
| EXECUTE | 过程、函数、包 |
4.2 授权对象权限
-- 授予表权限
GRANT SELECT ON hr.employees TO scott;
GRANT INSERT, UPDATE ON hr.departments TO scott;
-- 授予所有权限
GRANT ALL ON hr.employees TO scott;
-- 授予WITH GRANT OPTION(可转授)
GRANT SELECT ON hr.employees TO scott WITH GRANT OPTION;
-- 授予列级权限
GRANT UPDATE (salary, commission_pct) ON hr.employees TO scott;
4.3 回收对象权限
-- 回收对象权限
REVOKE SELECT ON hr.employees FROM scott;
-- 查看已授予的对象权限
SELECT * FROM dba_tab_privs WHERE grantee = 'SCOTT';
五、角色管理
5.1 预定义角色
| 角色 | 包含权限 |
|---|---|
| CONNECT | CREATE SESSION, CREATE VIEW等 |
| RESOURCE | CREATE CLUSTER, CREATE TABLE等 |
| DBA | 几乎所有系统权限 |
| EXP_FULL_DATABASE | 导出权限 |
| IMP_FULL_DATABASE | 导入权限 |
5.2 创建自定义角色
-- 创建角色
CREATE ROLE hr_manager;
-- 给角色授权
GRANT SELECT ANY TABLE TO hr_manager;
GRANT INSERT ANY TABLE TO hr_manager;
GRANT UPDATE ANY TABLE TO hr_manager;
-- 将角色授予用户
GRANT hr_manager TO scott;
-- 设置默认角色
ALTER USER scott DEFAULT ROLE hr_manager;
-- 或启用所有角色
ALTER USER scott DEFAULT ROLE ALL;
5.3 角色管理操作
-- 修改角色密码
ALTER ROLE hr_manager IDENTIFIED BY new_password;
-- 设置角色需要密码激活
ALTER ROLE hr_manager IDENTIFIED BY manager_pwd;
-- 禁用角色
ALTER ROLE hr_manager IDENTIFIED EXTERNALLY;
-- 删除角色
DROP ROLE hr_manager;
5.4 查看角色信息
-- 查看所有角色
SELECT * FROM dba_roles;
-- 查看角色包含的系统权限
SELECT * FROM dba_sys_privs WHERE grantee = 'HR_MANAGER';
-- 查看用户拥有的角色
SELECT * FROM dba_role_privs WHERE grantee = 'SCOTT';
六、Debian上的特殊配置
6.1 操作系统认证
# 配置Oracle操作系统认证
sudo vi $ORACLE_HOME/network/admin/sqlnet.ora
# 添加以下内容
SQLNET.AUTHENTICATION_SERVICES = (NTS)
# 或
SQLNET.AUTHENTICATION_SERVICES = (BEQ, NONE)
# 创建操作系统用户组
sudo groupadd dba
sudo usermod -aG dba $USER
# 重新登录使组生效
logout
6.2 使用SQLPlus操作系统认证登录
# 以SYSDBA权限登录(无需密码)
sqlplus / as sysdba
# 以SYSOPER权限登录
sqlplus / as sysoper
# 查看当前权限
SHOW USER;
6.3 密码文件管理
# 创建密码文件
sudo $ORACLE_HOME/bin/orapwd \
file=$ORACLE_HOME/dbs/orapw$ORACLE_SID \
entries=10 \
force=y
# 设置远程登录
ALTER SYSTEM SET REMOTE_LOGIN_PASSWORDFILE = EXCLUSIVE SCOPE=SPFILE;
# 重启数据库生效
SHUTDOWN IMMEDIATE;
STARTUP;
七、权限审计与安全
7.1 审计配置
-- 启用标准审计
AUDIT SELECT TABLE BY scott BY ACCESS;
AUDIT INSERT TABLE BY scott BY SESSION;
-- 启用对象审计
AUDIT SELECT ON hr.employees BY ACCESS;
-- 查看审计记录
SELECT * FROM dba_audit_trail;
7.2 权限查询脚本
-- 查找具有DBA角色的用户
SELECT grantee FROM dba_role_privs
WHERE granted_role = 'DBA' AND admin_option = 'YES';
-- 查找具有ANY权限的用户
SELECT grantee, privilege
FROM dba_sys_privs
WHERE privilege LIKE '%ANY%';
-- 查找被授予权限的用户
SELECT grantee, privilege, admin_option
FROM dba_sys_privs
WHERE grantee NOT IN ('SYS', 'SYSTEM')
ORDER BY grantee;
7.3 安全最佳实践
| 实践 | 说明 |
|---|---|
| 最小权限原则 | 只授予必要权限 |
| 使用角色管理 | 避免直接授权给用户 |
| 定期审计 | 检查权限是否合理 |
| 密码策略 | 设置密码复杂度要求 |
| 账户锁定 | 防止暴力破解 |
八、常见问题解答
Q1: 如何查看当前用户的权限?
A:
-- 查看当前用户系统权限
SELECT * FROM user_sys_privs;
-- 查看当前用户对象权限
SELECT * FROM user_tab_privs;
-- 查看当前用户角色
SELECT * FROM user_role_privs;
Q2: 为什么授予了权限但无法操作?
A: 可能原因:
1. 权限未生效(需要重新连接)
2. 授予的是角色权限,但角色未启用
3. 对象权限需要指定模式名
解决:
-- 启用角色
SET ROLE hr_manager;
-- 或授予直接权限
GRANT SELECT ON hr.employees TO scott;
Q3: 如何迁移用户权限到新数据库?
A: 使用以下脚本导出权限:
-- 生成授权脚本
SPOOL grant_script.sql
SELECT 'GRANT ' || privilege || ' TO ' || grantee || ';'
FROM dba_sys_privs
WHERE grantee = 'SCOTT';
SELECT 'GRANT ' || privilege || ' ON ' || owner || '.' || table_name || ' TO ' || grantee || ';'
FROM dba_tab_privs
WHERE grantee = 'SCOTT';
SPOOL OFF;
九、总结
在Debian上通过SQLPlus管理Oracle数据库权限,需要掌握:
1. 用户管理:创建、修改、删除用户
2. 系统权限:授予和回收系统级权限
3. 对象权限:控制对具体对象的访问
4. 角色管理:通过角色简化权限管理
5. 安全审计:定期审查权限设置
权限管理的核心是遵循最小权限原则,只授予用户完成工作所需的最低权限,并定期进行权限审计,确保数据库安全。
注:本文基于Oracle 21c + Debian 12环境整理,适用于Oracle 12c及以上版本。