欢迎投稿

今日深度:

Oracle最佳替代者PostgreSQL数据库的整体安全性(1)(3)

要隐藏这些源代码:

•使用原生语言环境C、Perl、Python 等)将函数编写为一个模块并存储到主机的硬盘中。随后在 PostgreSQL 中创建一个抽象的用户定义函数来调用该模块。
•考虑在一个表中编写源代码并在需要时动态创建函数。
•在集群的另一个数据库中编写您的用户定义函数,该函数将由另一个已授权用户帐户通过 dblink 模块调用。
使用 security definer

security definer 使用创建函数的用户所拥有的特权执行函数。因此,用户可以访问在平常状态下不可用的表。

例如,如清单 12 所示,一个包含两个列的表在模式 Postgres 中由超级用户 postgres 创建。普通用户 user1 将使用 security definer 参数调用该函数并根据输入值获得一个值。


清单 12. 创建一个表和函数

postgres=# SET SESSION AUTHORIZATION postgres;SETpostgres=# CREATE TABLE postgres.t4(x serial,y numeric);NOTICE: CREATE TABLE will create implicit sequence "t4_x_seq" for serial column "t4.x"CREATE TABLEpostgres=# INSERT INTO postgres.t4(y) VALUES (random::numeric(4,3));INSERT 0 1postgres=# INSERT INTO postgres.t4(y) VALUES (random::numeric(4,3));INSERT 0 1postgres=# INSERT INTO postgres.t4(y) VALUES (random::numeric(4,3));INSERT 0 1postgres=# INSERT INTO postgres.t4(y) VALUES (random::numeric(4,3));INSERT 0 1postgres=# INSERT INTO postgres.t4(y) VALUES (random::numeric(4,3));INSERT 0 1postgres=# CREATE OR REPLACE FUNCTION public.f4 (postgres(# IN a int,postgres(# OUT b numericpostgres(# ) RETURNS SETOF numeric ASpostgres-# $body$postgres$# select y from postgres.t4 where x=$1 limit 1;postgres$# $body$postgres-# LANGUAGE SQL SECURITY DEFINER;CREATE FUNCTION            

清单 13 表明用户帐户 user1 现在可以访问所需的信息。


清单 13. 未授权角色通过一个函数调用访问表

postgres=# SET SESSION AUTHORIZATION user1;SETpostgres=> SELECT b as "my first record" FROM f4(1); my first record----------------- 0.379(1 row)postgres=> SELECT b as "my second record" FROM f4(2); my second record------------------ 0.200(1 row)            破解 PostgreSQL 密码

有效的密码管理是保证 DBMS 安全性的关键。DBA 的职责就是实施一项获得认可的密码策略。密码应当由随机选择的字符组成,这些字符不具备可识别的模式。常见实践表明密码至少应有 6 个字符并且需要经常更换。

PostgreSQL 用户帐户和密码

PostgreSQL 用户帐户安全策略主要与创建和管理用户帐户的 SQL 命令有关:

•CREATE ROLE
•ALTER ROLE
•DROP ROLE
下面的 SQL 语句属于比较旧的用户帐户管理尽管有效,您仍然应当使用较新的技术管理用户角色):

•CREATE GROUP
•ALTER GROUP
•DROP GROUP
•CREATE USER
•ALTER USER
•DROP USER
密码可以以加密或非加密形式保存。非加密 密码以明文形式存储,并且可以被超级用户读取。密码的加密 包括生成并存储其 MD5 散列,MD5 散列是无法读取的。要在登录时对密码进行验证,需要对密码进行散列化并将其与已经存储在数据集群中的密码进行比较。

下面是一些创建和管理密码的示例方法:

•未使用密码创建帐户: CREATE ROLE user1 WITH LOGIN;

•使用未加密密码创建帐户: CREATE ROLE roger WITH LOGIN UNENCRYPTED PASSWORD '123'

•修改帐户并分配一个加密过的密码: ALTER ROLE user1 WITH ENCRYPTED PASSWORD '123'

由超级用户对目录表 pg_shadow 执行一个 SQL 查询,结果返回用户帐户名及其密码。清单 4 展示了代码。


清单 14. 从目录获得用户的密码

postgres=# select usename as useraccount,passwd as "password" from pg_shadow wherelength(passwd)>1 order by usename; useraccount | password-------------+------------------------------------- user1 | md5173ca5050c91b538b6bf1f685b262b35 roger | 123(2 rows)            

清单 15 展示了如何为使用密码 123 的 user1 生成 MD5 散列。


清单 15. 生成 MD5 密码

postgres=# select 'md5'||md5('123user1') as "my own generated hash",                   passwd as "stored hash for user1"             from pg_shadow where usename='user1'; my own generated hash | stored hash for user1-------------------------------------+------------------------------------- md5173ca5050c91b538b6bf1f685b262b35 | md5173ca5050c91b538b6bf1f685b262b35(1 row)

准备好再受一次惊吓了吗?PostgreSQL 几乎没有提供任何机制以实施可靠的密码策略。

可能的安全局限性包括:

•超级用户无法对将用于密码的字符限制最小字符数。
•尽管针对如何保存密码未加密的或已加密的 MD5 散列)的配置设置提供了一个默认参数,超级用户无法强制用户使用特定的存储方法。
•不存在对用户帐户施加生命周期的机制。
•在集群的客户机身份验证配置文件 pg_hba.conf 中,当连接方法不是 PASSWORD 或 MD5 时,控制用户帐户的有效生命周期的机制将变得无关紧要。
•由 ALTER ROLE 语句修改的用户运行时参数,以及由超级用户或文件 postgresql.conf 中的默认配置设置的参数,都可以由用户帐户的所有者随意修改。
•重命名一个用户帐户将清除该帐户的密码,如果已被加密的话。
•无法跟踪谁对用户帐户做了修改或何时做了修改。
一个具有精心系统目录设计的强有力的架构可以为随时保持警惕的 DBA 带来回报。

由于存在各种各样的危害,因此有关用户帐户和密码的安全局限性需要用另一篇文章单独详细介绍。


www.htsjk.Com true http://www.htsjk.com/shujukuaq/16816.html NewsArticle 要隐藏这些源代码: 使用原生语言环境C、Perl、Python 等)将函数编写为一个模块并存储到主机的硬盘中。随后在 PostgreSQL 中创建一个抽象的用户定义函数...
评论暂时关闭