Oracle 信任操作系统来验证用户身份,然后根据用户所属的操作系统组,自动授予其对应的数据库角色。
这个关联是在 Oracle 软件安装阶段 就确定下来的,具体过程如下:
- 编译时的硬编码映射
在 Oracle 软件安装的最后阶段,会运行一个脚本 (root.sh) 来以 root 权限执行一些操作。其中一部分工作就是编译一个特定的 C 语言文件:ORACLEHOME/rdbms/lib/config.c。编译后文件是ORACLE_HOME/rdbms/lib/config.c。编译后文件是ORACLEHOME/rdbms/lib/config.c。编译后文件是ORACLE_HOME/rdbms/lib/config.o。最关键的一步,root.sh 脚本随后会启动一个名为重链接 的过程。它会调用 make 工具,执行一个特定的链接命令。
这个命令会将许多个已有的 .o 目标文件(包括刚刚新生成的 config.o)与Oracle的库文件链接在一起,最终生成一个完整的、全新的可执行文件。
这个最终生成的可执行文件就是:$ORACLE_HOME/bin/oracle
这个 oracle 二进制文件就是Oracle数据库的核心进程,所有数据库实例的后台进程(如 PMON, SMON, DBWn 等)都是它的派生进程。
在config.c这个文件中,定义了操作系统组与数据库角色之间的固定映射关系。你可以查看这个文件的内容来确认(不同版本可能略有差异):
/* 示例性的 config.c 内容 */ss_dba_grp="OSDBA";/* 映射到 SYSDBA 角色 */ss_oper_grp="OSOPER";/* 映射到 SYSOPER 角色 */ss_backup_grp="OSBACKUPDBA";/* 映射到 BACKUPDBA 角色 */ss_dg_grp="OSDGDBA";/* 映射到 DGDBA 角色 */ss_km_grp="OSKMDBA";/* 映射到 KMDBA 角色 */关键点:
OSBACKUPDBA 是一个 操作系统组的名称。
BACKUPDBA 是一个 数据库角色的名称。
这个编译过程就在两者之间建立了一个不可更改的、硬编码的链接。
- 连接时的认证流程
当一个操作系统用户(比如 oraclebackup)尝试以下列方式连接时:
sqlplus / as SYSBACKUP或者在使用RMAN时:
rman target /认证流程如下:
1、操作系统认证:Oracle 客户端发现连接字符串是 /,它就会请求操作系统内核:“当前正在运行我的这个进程的用户(oraclebackup)是谁?他属于哪些组?”
2、检查组成员:操作系统返回用户 oraclebackup 所属的组列表,其中包含了 OSBACKUPDBA。
3、映射到角色:Oracle 数据库接收到这个信息后,查询其在编译时建立的映射表,发现 OSBACKUPDBA 组应该被映射到 BACKUPDBA 这个数据库角色。
4、授予权限并建立会话:数据库自动为这个会话授予 BACKUPDBA 角色所包含的所有权限(包括 SYSBACKUP),然后成功建立连接。用户此时就拥有了 SYSBACKUP 的权限。