是否可以停止对特定用户的 Oracle DB 授权?
Is it possible to stop Oracle DB grants for specific user?
我公司使用Oracle 12c 数据库。我们在数据库中定义了几个用户,也定义了一些角色。我更喜欢我们的开发团队通过角色授予对新 tables/procedures 的访问权限,而不是直接授予用户。
例如,假设我们有用户 USER1 和授予 USER1 的角色 READ_ROLE。如果开发人员创建了一个新的 table TABLE1
- 不应允许他们将对 TABLE1 的读取权限直接授予 USER1
- 相反,他们应该授予对 READ_ROLE 的读取访问权限,这会间接向 USER1
授予相同的访问权限
不幸的是,我们的团队有 40 多名开发人员,随着时间的推移,人们一直在将资助直接分配给用户而不是角色。有了 100k+ 的资助、几百 tables 和几十个用户,它变得很难管理,这就是为什么我更喜欢使用角色。手动监管也有点困难。
oracle DB 是否有系统的方法来阻止允许用户获得新的授权?当有人试图添加新的赠款时,可能会导致异常?
正如 APC 所指出的,您不应允许开发人员直接在生产数据库上授予任何内容。当您有一个只有 3-4 名开发人员的小型应用程序时,这可能没问题。在您的规模中,这真的很危险,作为供应商,您无法确保在您的应用程序中有任何 quality/security。
无论如何,您可以使用这样的系统触发器:
CREATE OR REPLACE TRIGGER grant_trigger
BEFORE GRANT ON {your_schema}.SCHEMA
DECLARE
user_list ora_name_list_t;
number_of_grantees PLS_INTEGER;
res INTEGER
BEGIN
IF (ora_sysevent = 'GRANT') THEN
number_of_grantees := ora_grantee(user_list);
SELECT COUNT(*)
INTO res
FROM DBA_USERS
WHERE USERNAME MEMBER OF user_list;
IF res > 0 THEN
RAISE_APPLICATION_ERROR(-20010, 'It is not permitted to GRANT directly to USER. Use ROLE instead');
END IF;
END IF;
END;
您可以添加其他条件,例如
DECLARE
user_list ora_name_list_t;
number_of_grantees PLS_INTEGER;
res INTEGER
privilege_list ora_name_list_t;
number_of_privileges PLS_INTEGER;
BEGIN
IF (ora_sysevent = 'GRANT') THEN
number_of_grantees := ora_grantee(user_list);
SELECT COUNT(*)
INTO res
FROM DBA_USERS
WHERE USERNAME MEMBER OF user_list;
IF res > 0 THEN
RAISE_APPLICATION_ERROR(-20010, 'It is not permitted to GRANT directly to USER. Use ROLE instead');
END IF;
END IF;
number_of_privileges := ora_privilege_list(privilege_list);
IF 'DELETE' MEMBER OF privilege_list THEN
RAISE_APPLICATION_ERROR(-20010, 'You must not grant "DELETE"');
-- Other privileges as SELECT, INSERT, UPDATE would be permitted.
END IF;
IF (ora_dict_obj_type = 'TABLE') THEN
RAISE_APPLICATION_ERROR(-20010, 'You must not grant anything to a TABLE');
-- Other objects like VIEW or PROCEDURE would be permitted.
END IF;
END;
有关详细信息,请参阅 SYSTEM TRIGGER。确保您的开发人员没有 ADMINISTER DATABASE TRIGGER
或 CREATE ANY TRIGGER
权限,否则他们可以禁用触发器并绕过它。
我公司使用Oracle 12c 数据库。我们在数据库中定义了几个用户,也定义了一些角色。我更喜欢我们的开发团队通过角色授予对新 tables/procedures 的访问权限,而不是直接授予用户。
例如,假设我们有用户 USER1 和授予 USER1 的角色 READ_ROLE。如果开发人员创建了一个新的 table TABLE1
- 不应允许他们将对 TABLE1 的读取权限直接授予 USER1
- 相反,他们应该授予对 READ_ROLE 的读取访问权限,这会间接向 USER1 授予相同的访问权限
不幸的是,我们的团队有 40 多名开发人员,随着时间的推移,人们一直在将资助直接分配给用户而不是角色。有了 100k+ 的资助、几百 tables 和几十个用户,它变得很难管理,这就是为什么我更喜欢使用角色。手动监管也有点困难。
oracle DB 是否有系统的方法来阻止允许用户获得新的授权?当有人试图添加新的赠款时,可能会导致异常?
正如 APC 所指出的,您不应允许开发人员直接在生产数据库上授予任何内容。当您有一个只有 3-4 名开发人员的小型应用程序时,这可能没问题。在您的规模中,这真的很危险,作为供应商,您无法确保在您的应用程序中有任何 quality/security。
无论如何,您可以使用这样的系统触发器:
CREATE OR REPLACE TRIGGER grant_trigger
BEFORE GRANT ON {your_schema}.SCHEMA
DECLARE
user_list ora_name_list_t;
number_of_grantees PLS_INTEGER;
res INTEGER
BEGIN
IF (ora_sysevent = 'GRANT') THEN
number_of_grantees := ora_grantee(user_list);
SELECT COUNT(*)
INTO res
FROM DBA_USERS
WHERE USERNAME MEMBER OF user_list;
IF res > 0 THEN
RAISE_APPLICATION_ERROR(-20010, 'It is not permitted to GRANT directly to USER. Use ROLE instead');
END IF;
END IF;
END;
您可以添加其他条件,例如
DECLARE
user_list ora_name_list_t;
number_of_grantees PLS_INTEGER;
res INTEGER
privilege_list ora_name_list_t;
number_of_privileges PLS_INTEGER;
BEGIN
IF (ora_sysevent = 'GRANT') THEN
number_of_grantees := ora_grantee(user_list);
SELECT COUNT(*)
INTO res
FROM DBA_USERS
WHERE USERNAME MEMBER OF user_list;
IF res > 0 THEN
RAISE_APPLICATION_ERROR(-20010, 'It is not permitted to GRANT directly to USER. Use ROLE instead');
END IF;
END IF;
number_of_privileges := ora_privilege_list(privilege_list);
IF 'DELETE' MEMBER OF privilege_list THEN
RAISE_APPLICATION_ERROR(-20010, 'You must not grant "DELETE"');
-- Other privileges as SELECT, INSERT, UPDATE would be permitted.
END IF;
IF (ora_dict_obj_type = 'TABLE') THEN
RAISE_APPLICATION_ERROR(-20010, 'You must not grant anything to a TABLE');
-- Other objects like VIEW or PROCEDURE would be permitted.
END IF;
END;
有关详细信息,请参阅 SYSTEM TRIGGER。确保您的开发人员没有 ADMINISTER DATABASE TRIGGER
或 CREATE ANY TRIGGER
权限,否则他们可以禁用触发器并绕过它。