日期:2014-05-16  浏览次数:20381 次

EnterpriseDB的SQL注入攻击保护功能二


3
通常维护操作

下面描述这样执行其他通用操作。
必须以超级用户连接到数据库并在查询路径中包含模式sqlprotect以执行这些操作。

3.1
给受保护角色列表增加角色,运行protect_role('rolename')函数。

edb=# SELECT protect_role('newuser');
protect_role
--------------
(1 row)

3.2
从受保护角色列表删除角色,运行unprotect_role('rolename')或unprotect_role(roleoid)函数。
注意:
如果在从受保护角色列表删除角色以前,用drop role或者drop user删除了这个角色,
用unprotect_role(roleoid)删除是有用的。如果在受保护的关系上查询,给这个用户
返回像unknown(OID=16458)这样的值,使用unprotect_role(roleoid)会ok。

用unprotect_role(roleoid)这个函数删除角色,也删除了这个角色的保护关系列表。
已删除角色的统计信息用drop_stats函数删除。

从受保护角色列表删除角色
edb=# SELECT unprotect_role('newuser');
unprotect_role
----------------
(1 row)

这个角色也可以根据其OID删除
edb=# SELECT unprotect_role(16693);
unprotect_role
----------------
(1 row)

3.3
为角色设置保护类型

可以改变要保护的角色的 免受SQL注入攻击的类型。
改变edb_sql_protect里相应SQL注入攻击类型列的boolean值。
保证在更新edb_sql_protect表的sql语句的where子句里有dbid, roleid。

例子
允许角色执行utility命令,如下更新列allow_utiltiy_cmds:
UPDATE edb_sql_protect SET allow_utility_cmds = TRUE WHERE dbid = 13917 AND roleid = 16671;

提供查询edb_sql_protect或list_protected_users验证
edb=# SELECT dbid, roleid, allow_utility_cmds FROM edb_sql_protect;
dbid | roleid | allow_utility_cmds
-------+--------+--------------------
13917 | 16671 | t
(1 row)
这个更新的规则在该用户新的会话上起作用。

edb=>  create table appuser_tab_3(f1 INTEGER);
CREATE TABLE

3.4
从受保护关系列表中删除关系
可以删除SQL/Protect在学习模式加入到受保护关系列表中的关系。
用下面的函数可以从edb_sql_protect_rel删除受保护关系列表中的关系。
unprotect_rel('rolename', 'relname')
unprotect_rel('rolename', 'schema', 'relname')
unprotect_rel(roleoid, reloid)
如果给定的关系步骤当前搜索路径下,用第二个函数指明该关系所在模式。

edb=# select * from list_protected_rels;

下面的例子演示了从appuser的受保护关系列表中删除public.emp关系
edb=# SELECT unprotect_rel('appuser', 'public', 'emp');
unprotect_rel
---------------
(1 row)

验证:
edb=# SELECT * FROM list_protected_rels;
Database | Protected User | Schema | Name | Type | Owner
----------+----------------+--------+-------------+-------+--------------
edb | appuser | public | dept | Table | enterprisedb
edb | appuser | public | appuser_tab | Table | appuser
(2 rows)
SQL/Protect现在会给一个warning或阻止这个用户对这个关系的访问
SQL/Protect现在会给一个warning或阻止appuser对public.emp的访问

3.5
删除统计信息

可以用下面的函数从视图edb_sql_protect_stats中删除统计信息:
drop_stats('rolename')
drop_stats(roleoid)
注意:
如果在用drop_stats('rolename')删除角色统计信息以前,用droprole或者drop user删除了这个角色,
用drop_stats(roleoid) 删除是有用的。如果在edb_sql_protect_stats上查询,
返回像unknown(OID=16458)这样的值,使用drop_stats(roleoid)会ok。

下面是删除统计信息的例子:
edb=# SELECT drop_stats('appuser');
drop_stats
------------
(1 row)
edb=# SELECT * FROM edb_sql_protect_stats;
username | superusers | relations | commands | tautology | dml
----------+------------+-----------+----------+-----------+-----
(0 rows)

下面是在用drop_stats('rolename')删除角色统计信息以前,用droprole或者drop user删除了这个角色
的例子:
edb=# SELECT * FROM edb_sql_protect_stats;
username | superusers | relations | commands | tautology | dml
---------------------+------------+-----------+----------+-----------+-----
unknown (OID=16693) | 0 | 5 | 3 | 1 | 0
appuser | 0 | 5 | 2 | 1 | 0
(2 rows)
edb=# SELECT drop_stats(16693);
drop_stats
------------
(1 row)
edb=# SELECT * FROM edb_sql_protect_stats;
username | superusers | relations | commands | tautology | dml
----------+------------+-----------+----------+-----------+-----
appuser | 0 | 5 | 2 | 1 | 0
(1 ro