信任特权用户,DBMS_SQLHASH和有关加密的三个误解

客户经常联系Integrigy寻求帮助以保护其敏感数据。通常,这些请求是帮助您定位并加密敏感数据的请求。加密时 为敏感数据提供保护,但绝不能解决所有安全问题。如何保护敏感数据(以及如何使用敏感数据验证特权用户(例如数据库管理员)的信任)不仅需要加密。

《 Oracle数据库安全性指南》(对Oracle数据库安全性感兴趣的任何人都可以读懂)在第八章中介绍了有关加密的三个关键点:

  1. 加密不能解决访问控制问题-加密后,有权访问数据库中数据的用户没有更多或更少的特权
  2. 加密不能防止恶意数据库管理员的攻击-如果不可信任的用户具有重要特权,那么他们可以对组织构成多种威胁,其中某些威胁比查看未加密的信用卡号更重要
  3. 加密所有内容并不能保证数据的安全性–必要时必须提供数据,并考虑备份和灾难恢复解决方案。此外,加密所有数据将严重影响性能。
     

DBMS_SQLHASH

除了加密外,Oracle提供的一种安全工具是DBMS_SQLHASH软件包。散列值类似于数据指纹,可用于验证数据是否已更改(称为数据完整性)。散列与加密不同,了解这一区别很重要。如果您需要更多有关哈希的知识,请参见下面的参考部分。 

The DBMS_SQLHASH package has been delivered since 10g and provides an interface to generate the hash value of the result set returned by a 的SQL query and provides support for several industry-standard hashing algorithms including SHA-1.

DBMS_SQLHASH.GETHASH(sqltext IN varchar2,

                                               摘要类型在BINARY_INTEGER中,

                                               chunk_size IN号默认值134217728)

 

sqltext

对其结果进行哈希处理的SQL语句

摘要类型

使用的哈希算法:HASH_MD4,HASH_MD5或HASH_SH1

将3用于HASH_SH1,将2用于HASH_MD5,将1用于HASH_MD4

chunk_size

获取哈希时结果块的大小

当结果集大小很大时,GETHASH函数会将其分成大小等于chunk_size的块。它将为每个块生成哈希,然后使用哈希链计算最终哈希。默认的chunk_size是128 MB。

 

审核员如何使用DBMS_SQLHASH

DBMS_SQLHASH的一种用例是帮助审核员信任但验证特权用户(例如数据库管理员)的操作。通过对键表进行哈希处理,审核员可以快速确定数据库管理员是否进行了更改(授权或未授权)。审核员可以通过在审核期开始时记录哈希值与该期末时的哈希值进行比较来做到这一点。如果审核期末的哈希值与期初的哈希值匹配,则未进行任何更改。如果要审核的数据库和/或表数量很多,则此方法是一种非常有用的方法,可用于确定需要进行额外检查的内容-假设已配置了足够的日志记录以捕获更改的详细信息。

例如,为了确定一段时间内Oracle数据库用户及其相关特权是否发生了变化,例如授予对敏感数据的访问权限,审核员可以对以下字典表进行哈希处理:

  • SYS.DBA_USERS
  • SYS.DBA_ROLES
  • SYS.DBA_TAB_PRIVS
  • SYS.DBA_SYS_PRIVS
  • SYS.DBA_ROLE_PRIVS

例子

注意:要调用SYS.DBMS_SQLHASH包,用户将需要SYS授予的执行权限。

控制

DBA_USERS

的SQL

SELECT SYS.DBMS_SQLHASH.GETHASH('SELECT * FROM SYS.DBA_USERS BY USER_ID',3)sh1_dba_user_hash FROM DUAL;

样品

结果

Sh1_dba_user_hash

7BD61E22E35FA2F95035E6A794F5B8CF0E37FDF6

 

控制

SYS.DBA_ROLES

的SQL

SELECT SYS.DBMS_SQLHASH.GETHASH('SELECT * FROM SYS.DBA_ROLES BY ROLE',3)sh1_dba_roles_hash FROM DUAL;

样品

结果

sh1_dba_roles_hash

C80D69048D613E926E95AF77B627D9B5D6CB20C8

 

控制

SYS.DBA_TAB_PRIVS

的SQL

SELECT SYS.DBMS_SQLHASH.GETHASH('SELECT * FROM SYS.DBA_TAB_PRIVS BY OWNER,TABLE_NAME',3)sh1_dba_tab_privs_hash FROM DUAL;

样品

结果

sh1_dba_tab_privs_hash

53FBDBDBF95186400A4DEEE611F51CD0B1E998DF

 

控制

SYS.DBA_SYS_PRIVS

的SQL

SELECT SYS.DBMS_SQLHASH.GETHASH('SELECT * FROM SYS.DBA_SYS_PRIVS OR BY BY GRANTEE,PRIVILEGE',3)sh1_dba_sys_privs_hash FROM DUAL;

样品

结果

sh1_dba_sys_privs_hash

A27E8C71AD0CAEFB94AFEAB5DB108871F09BC281

 

控制

SYS.DBA_ROLE_PRIVS

的SQL

SELECT SYS.DBMS_SQLHASH.GETHASH('SELECT * FROM SYS.DBA_ROLE_PRIVS BY GRANTEE,GRANTED_ROLE',3)sh1_dba_role_privs_hash FROM DUAL;

样品

结果

sh1_dba_role_privs_hash

5715D1B2C2A775D579B36DEBD2C2F1F608762AEC

 

关键

order by子句将更改HASH。 Oracle支持说明1569256.1对此进行了更详细的说明。 为了保证在不同时间发布的SQL具有相同的HASH,必须使用相同的数据顺序。

如果您对Integrigy针对Oracle和Oracle E-Business Suite的哈希方法有疑问或感兴趣,请通过以下地址与我们联系 [email protected]

参考文献

 Share this post

订阅RSS

将我们添加到您最喜欢的新闻阅读器中。

在Twitter上关注

获取最新更新。