我们使用 Oracle 11.2,在 Solaris 10 上运行用 C++ 编写的服务器进程。我们的支持人员有自己的 Oracle 用户名,并且我们的服务器进程有一个专用的 Oracle 用户(我们称之为 servuser)。
出于审计目的,我们需要确保只有服务器进程使用 servuser 帐户进行更改,但是,支持人员也可以使用 servuser 访问数据库,只要他们是从 Solaris 主机进行的服务器进程。
对此显而易见的解决方案是使用操作系统身份验证 - 为进程创建一个 Solaris 用户,并将其映射到 Oracle servuser。唯一的问题是:这些服务器进程运行在与 Oracle 实例不同的主机上。打开远程授权是一个巨大的、众所周知的安全漏洞(只需在您的操作系统上创建您自己的用户 - presto)。
我能想到的所有其他策略都不好:
将密码存储在 Solaris 帐户的文件中是不好的,因为支持人员可以看到它们并用于通过 sqlplus 进行连接;
加密文件并不好 - 服务器进程必须有权访问私钥,然后支持人员可以使用该私钥,然后他们可以解密并且我们回到第 1 步。
我想创建一个登录触发器,检查我们是否以 servuser 身份连接,然后如果 v$session 中的模块/程序值与我们识别为有效客户端的值不匹配,则引发异常。这是一种弱保护,因为有人可以编写自己的应用程序来欺骗这些值。
处理这种情况的“官方”方式是什么?操作系统身份验证仅在您在托管实例的同一个盒子上运行客户端时才能安全地工作,这似乎毫无用处,IMO。然而我认为我们的场景很常见 - 应用服务器在单独的实例上运行,但您要确保只有它们才能使用特权帐户。
建议?