要理解该答案,需要了解不同的 Oracle 服务器进程的创建方式。 在第一种情况下,当用户未使用 TNS 连接字符串时,连接被直接路由到数据库,而不是首先经过监听程序。 数据库创建了一个用户进程,然后将该进程(称为 bequeathing)的控制权传递给进程所有者,以下使用术语 bequeath 进程,这显示在进程名称中。
第二种情况下,当用户仍然在同一服务器上但通过监听程序连接时,监听程序创建了称为 forking 的用户进程。 同样,如果用户进程在另一台计算机(例如笔记本电脑)上运行,连接需要通过监听程序,监听程序可能已经创建了该进程。 该进程是由远程服务器创建的,因此进程名称包含子句 LOCAL=NO。 即使 SQL*Plus 会话在同一服务器上运行,但它是一个非 bequeath 连接的事实使其成为非 LOCAL 连接。
(请注意: 根据 OS 的不同,您不能象在 bequeath 连接中查看 SQL*Plus 会话那样查看服务器进程的父 ID。 在某些情况下,即使连接为 bequeath,父 ID 仍将显示为“1”。 因此,不要依赖父 ID 来决定服务器进程的类型;请通过进程名称来决定。
既然您理解了双任务模型;让我们来看一下您是否抓住了整个讨论的重点。 服务器进程由数据库创建并运行,而不是启动了 SQL*Plus 等客户端进程的用户。 服务器进程使用可执行文件“oracle”或“oracle.exe”,因此仅名为“orasoft”(这样命名是为了避免与可执行文件的名称“oracle”这个术语冲突)的 Oracle 软件所有者应该有权执行它们,其他任何人都不可以。 那么,您为什么需要其他用户的权限呢?
简短回答是: 您不需要。您可以通过发出以下命令删除不需要的权限: $ chmod 4700 $ORACLE_HOME/bin/oracle
执行该命令后,权限将和下面的类似。 -rws------ 1 orasoft oinstall 248754168 Oct 8 07:11 oracle
现在我们可以通过 SUID 位转到策略。 在本例中,SUID 位设置为 ON(通过所有者的 rws 权限指示)。 策略 由于您不需要除 Oracle 软件所有者(本例为“orasoft”)之外的任何用户的权限来运行 Oracle 可执行文件,因此应该从可执行文件中删除 SUID 位,使其仅供所有者访问,其他任何人都不可访问。 $ chmod 0700 $ORACLE_HOME/bin/oracle
权限现在看起来与下面的类似: -rwx------ 1 orasoft oinstall 248754168 Oct 8 07:11 oracle
结论 这是较大的改动,理解其影响很重要。 当服务器上的用户(非 Oracle 软件所有者)尝试连接一个本地连接时,可执行文件“oracle”将以该用户的名义运行,就好像用户“orasoft”正在运行该文件一样。 这很重要;因为服务器进程将打开“orasoft”拥有的数据文件,该进程必须以“orasoft”身份运行,或者用户必须具有打开数据文件的权限。
例如,假设 UNIX 用户“ananda”登录到数据库所在的服务器,并进行本地连接: $ sqlplus arup/arup
该用户将立即收到一条错误信息。 ERROR:
ORA-12546: TNS:permission denied
Enter user-name:
原因很简单: 您删除了文件“oracle”上的 SUID 权限。 当用户执行本地连接时,实质上是尝试运行可执行文件“oracle”,但是由于 SUID 未设置,因此不会以用户“orasoft”身份尝试而是以“ananda”身份尝试。 由于用户 ananda 没有运行该文件的权限,因此该文件也不会得到执行,因此出现了 ORA-12546 错误。
(编辑:anna sui)
|