在Ubuntu系统中,Oracle数据库的运行和权限管理需结合操作系统层设置,确保数据库服务及文件的安全性。
Oracle数据库服务通常以专用用户(如oracle
)运行,需将其加入对应用户组(如oinstall
、dba
、oper
),实现权限隔离:
groups oracle
sudo addgroup oinstall
(若未存在)sudo usermod -aG oinstall,dba oracle
groups 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_1
sudo chown -R oracle:oinstall /u01
(递归修改/u01
下所有文件的所有者为oracle
,组为oinstall
)sudo chmod -R 775 /u01
(允许所有者与组读写执行,其他用户仅读执行)。限制Oracle数据库端口(默认1521
)的访问,仅允许可信IP连接:
sudo ufw allow 1521/tcp
sudo ufw enable
sudo 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;
)监控敏感操作,及时发现异常。