在Ubuntu系统中,Oracle数据库的运行和权限管理需结合操作系统层设置,确保数据库服务及文件的安全性。
Oracle数据库服务通常以专用用户(如oracle)运行,需将其加入对应用户组(如oinstall、dba、oper),实现权限隔离:
groups oraclesudo addgroup oinstall(若未存在)sudo usermod -aG oinstall,dba oraclegroups oracle确认用户已加入目标组。Oracle软件目录(如/u01/app/oracle/product/19.3.0/dbhome_1)和数据文件目录(如/u01/app/oracle/oradata)需设置正确权限,避免未授权访问:
sudo mkdir -p /u01/app/oracle/product/19.3.0/dbhome_1sudo chown -R oracle:oinstall /u01(递归修改/u01下所有文件的所有者为oracle,组为oinstall)sudo chmod -R 775 /u01(允许所有者与组读写执行,其他用户仅读执行)。限制Oracle数据库端口(默认1521)的访问,仅允许可信IP连接:
sudo ufw allow 1521/tcpsudo ufw enablesudo ufw status(确认1521/tcp端口已开放)。Oracle权限分为系统权限(控制数据库整体操作)和对象权限(控制特定对象的操作),可通过角色简化权限分配。
系统权限允许用户执行数据库级操作(如创建会话、创建表),常用命令如下:
CREATE USER test_user IDENTIFIED BY Test@1234 DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp QUOTA 10M ON users;(指定用户名、密码、默认表空间及配额)GRANT CREATE SESSION, CREATE TABLE, UNLIMITED TABLESPACE TO test_user;(授予连接数据库、创建表、无限制使用表空间的权限)REVOKE CREATE TABLE FROM test_user;(撤销创建表的权限)SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = 'TEST_USER';(查询用户拥有的系统权限)。对象权限允许用户操作特定数据库对象(如表、视图),常用命令如下:
GRANT SELECT, INSERT ON hr.employees TO test_user;(授予test_user对hr用户下employees表的查询、插入权限)REVOKE SELECT ON hr.employees FROM test_user;(撤销查询权限)SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE = 'TEST_USER';(查询用户拥有的对象权限)。角色是权限的集合,可简化权限分配与管理,常用命令如下:
CREATE ROLE hr_role;(创建名为hr_role的角色)GRANT SELECT, INSERT ON hr.employees TO hr_role;(将employees表的对象权限授予角色)GRANT hr_role TO test_user;(将hr_role角色授予test_user)REVOKE hr_role FROM test_user;(撤销用户的角色)SELECT * FROM ROLE_TAB_PRIVS WHERE GRANTEE = 'HR_ROLE';(查询角色拥有的对象权限)。通过脚本实现批量授权,减少重复操作:
grant_to_role.sh):#!/bin/bash
if [ $# -ne 1 ]; then
echo "Usage: $0 user_a|user_b|user_c|all"
exit 1
fi
task=$1
source /home/oracle/.bash_profile # 加载Oracle环境变量
logfile=/home/oracle/tmp/grant_to_role_$(date +%F).log
echo "Time: $(date)" >> $logfile
echo "Executing SQL script..." >> $logfile
sqlplus /nolog <<EOF >> $logfile
CONNECT sys/password AS SYSDBA
$([[ $task == "all" ]] && echo "GRANT SELECT ON hr.employees TO hr_role;" || echo "GRANT SELECT ON hr.employees TO $task;")
EXIT;
EOF
echo "Batch grant completed. Log saved to $logfile."
执行脚本:./grant_to_role.sh all(批量授予所有用户权限)或./grant_to_role.sh test_user(授予指定用户权限)。CREATE TABLE、SELECT权限,无需DROP DATABASE权限)。SELECT * FROM DBA_SYS_PRIVS;),撤销未使用的权限。DEVELOPER_ROLE、MANAGER_ROLE),便于统一管理。AUDIT SELECT TABLE BY test_user;)监控敏感操作,及时发现异常。