我们小组有以下情况:
我们有大量访问中央数据库的应用程序。所有这些应用程序都使用相同的应用程序"数据库凭证密码不是特别安全,因此我们违反了我们公司的完全合法的安全准则。其中一些应用程序在WebLogic上运行,其他应用程序是独立的Java应用程序,其他应用程序只是shell脚本,但都使用相同的用户名:密码凭证,这些凭证以多种方式编码,这些方式不是最佳安全性:硬编码,写入在各种安全级别等的配置文件中
这个相当陈旧的设置是改变的噩梦。如果我们更改数据库上的密码,不同位置的大量配置文件也需要更改,这需要启动和停止各种服务器,配置更改等。不可避免地会出现无法忍受的长度中断。
如果可以创建第二个数据库用户,则作为"别名"对于第一个用户在第一个用户的相关模式上拥有相同的权利和特权,但是使用不同的密码,这个配置的噩梦将会得到缓解。可以在数据库上创建用户,然后,或多或少地在闲暇时,可以重新配置每个应用程序以使用"别名",每个应用程序只需要非常简短的中断。然后,当安全规则规定它需要再次更改密码时,可以反向完成相同的过程。
更新 - 以下段落中的要求不在原始问题中。
我指定"别名"是第二次登录应该像第一次登录一样完全正常工作,也就是说,不需要更改SQL:即SELECT * from some_table
应该继续工作而不需要更改SELECT * from first_user.some_table
。
很可能这样的系统已经存在,名字是我没想到的,但到目前为止,我的搜索还没有向我展示我正在寻找的东西。
有没有人曾经处理过这种情况以及如何处理?也许有一个解决方案,它不同于我的"别名"想法?
感谢。
答案 0 :(得分:3)
听起来你所描述的是proxy authentication。您可以使用自己的密码创建用户A
,但能够以另一个用户B
连接到数据库。唯一的缺点是,弄清楚应用程序可能使用的每个框架如何进行代理身份验证可能会有点痛苦。充分利用代理身份验证可能需要对某些应用程序进行代码更改。
退后一步,我不清楚你真的需要那么复杂。除非您的所有应用程序都需要在目标模式中创建和删除对象(这会非常不寻常),否则听起来只是想要
例如,如果您真正想要的是允许新用户在架构中的每个表上执行DML
-- Create the role that will have privileges to do DML on every table in
-- the FOO schema
CREATE ROLE foo_all_dml;
-- Grant privileges to the role
BEGIN
FOR t IN (SELECT *
FROM dba_tables
WHERE owner = 'FOO')
LOOP
EXECUTE IMMEDIATE
'GRANT SELECT, INSERT, UPDATE, DELETE ON foo.' ||
t.table_name ||
' TO foo_all_dml';
END LOOP;
END;
/
-- Create the new user
CREATE USER bar
IDENTIFIED BY <<new password>>;
-- Grant the role to the user
GRANT foo_all_dml
TO bar;
随着新对象的添加,您可以为该角色授予适当的权限,并且您使用该角色创建的所有用户都可以获得该权限。
如果要避免限定对象名称,可以创建引用原始模式中对象的同义词(公共或私有)。如果要在BAR
架构中为FOO
架构中的每个表创建一个私有同义词
BEGIN
FOR t IN (SELECT *
FROM dba_tables
WHERE owner = 'FOO')
LOOP
EXECUTE IMMEDIATE
'CREATE SYNONYM bar.' || t.table_name ||
' FOR foo.' || t.table_name;
END LOOP;
END;
您还可以创建一个执行
的登录触发器ALTER SESSION SET current_schema = foo
登录bar
。
答案 1 :(得分:2)
您可以使用角色。创建角色:
create role universal_app_role identified by 123;
然后,您需要找到所有期望的权限并将其授予此角色,例如:
grant create table to universal_app_role;
之后,您可以将此角色授予任何用户:
grant universal_app_role to john_smith;
之后,您还可以向此角色添加任何新权限(universal_app_role
),具有此角色的所有用户都可以获得该权限。
修改强>
你已经更新了你的问题,我的答案变得不那么合适了。如果要在不编写模式名称的情况下访问数据库对象,可以为该对象创建公共同义词:
create public synonym some_table for first_user.some_table;