oracle 11g起,sysasm与sysdba需通过拆分操作系统组(如新建asmadmin组并确保asm管理员不在dba组)才能真正分离,仅授sysasm角色无效,因默认仍共享dba组映射,权限边界未实质隔离。

Oracle 11g 起,SYSASM 和 SYSDBA 已可物理分离——但默认不分离,必须手动干预,否则仍由同一 OS 组(如 dba)控制,权限边界形同虚设。
为什么不能只靠创建新用户并授 SYSASM 就算分离?
因为 Oracle 11g 初期默认将 SYSASM 角色自动授予所有拥有 SYSDBA 权限的 OS 用户(即 dba 组成员)。这意味着:即使你新建了 asmadmin 用户并只授 SYSASM,只要他还在 dba 组里,就能直接 sqlplus / as sysdba 连数据库实例——职责没分,风险照旧。
关键点在于:角色授予 ≠ 权限隔离;OS 组映射才是实际开关。
如何真正切断 SYSDBA 与 SYSASM 的 OS 层共享?
必须拆分操作系统组,这是唯一可靠方式。Oracle 后续版本(12c 及以后)已明确要求这样做,11g 虽未强制,但必须人工配置:
- 新建专用 OS 组,例如
asmadmin(不要用dba) - 将 ASM 管理员用户加入
asmadmin组,且**确保其不在dba组中** - 修改 ASM 实例的口令文件(
orapw+ASM),确认只包含SYS和asmoper等明确授权用户,不含数据库 DBA 账号 - 验证:用
asmoper用户执行id,输出中应仅含asmadmin,无dba
否则 sqlplus / as sysasm 和 sqlplus / as sysdba 都能成功,等于白做。
授 SYSASM 时容易忽略的两个硬性前提
SYSASM 不是普通角色,它依赖底层口令文件和实例类型双重校验:
- 只能对 ASM 实例(非数据库实例)生效;在数据库实例中执行
grant sysasm to user会报错ORA-01994: GRANT failed: password file missing or disabled - 必须使用 ASM 口令文件(通常为
$ORACLE_HOME/dbs/orapw+ASM),且该文件需启用:启动 ASM 实例前检查remote_login_passwordfile=EXCLUSIVE - 若用
CREATE USER创建asmoper,必须在 ASM 实例中操作,而非数据库实例——连错实例会导致用户根本不可见
常见错误:在数据库实例里建用户、授 SYSASM,再切到 ASM 实例去连,结果提示 user does not exist。
生产环境必须禁用的危险配置
以下配置会让职责分离彻底失效,哪怕 OS 组已拆分:
-
remote_os_authent = TRUE:允许 OS 认证绕过口令文件,dba组任何用户都能以任意身份直连 -
os_authent_prefix仍为默认ops$且未清理对应 OS 用户:比如ops$oracle在dba组,就等同于隐式SYSDBA - ASM 实例的
sqlnet.ora中未设置SQLNET.AUTHENTICATION_SERVICES = (NONE):可能触发意外的 OS 认证回退
真正分离后,asmoper 用户应无法执行 startup mount(数据库命令),而 dbadmin 用户执行 alter diskgroup ... add disk 会直接报 ORA-15000: command disallowed by current instance type——这才是隔离生效的信号。











