2015-10-13 64 views
1

因为缺乏耐心 - 我可以总结这个问题为:PostgreSQL的授权与访问ODBC链接表

什么实用的方法可以使用Access前端时,可以使用能够充分利用基于角色的权限在PostgreSQL中 那采用ODBC链接表?

现在对于更长的版本:

我继承升级的Access 2000/PG 7应用程序访问2013/PG 9.我是新来的Pos​​tgreSQL,但已经使用的令人讨厌的任务Oracle和Microsoft Access相当多。
编辑:生产服务器在Mac OS X Lion上运行PostgreSQL。我的测试机是通过ODBC在Oracle Linux的7

这个Access数据库是连接运行的PostgreSQL在PG数据库表,使用单PG登录角色(application_user)连接。每个用户都与这个登录角色连接,并且只有Forms/VBA中的条件限制了用户的权限。但是,如果用户可以进入导航窗格 - 他们可以直接访问链接表并绕过所有安全限制。在升级这个数据库时,我想看看我是否可以收紧这个数据库。

我可以在PostgreSQL上为每个用户设置自己的登录角色,但这意味着(从我看待它的方式)大量重新编译数据库。我宁愿不在生产数据库上进行如此大的更改 - 更需要增量更改。看看数据库的安全需求 - 我只能想到将需要的五个角色。

  • 订单录入
  • 客户准入
  • 订单和客户准入
  • 只读
  • 没有获得许可 - 禁止访问

我可以设置这些在PGSQL组角色并为每个角色提供必要的ACL。

我缺少的是我如何从单一的登录角色(application_user)到所有上述角色?

我最初的想法是设置application_user(登录角色)有没有组的角色(主要是导致“未授权 - 禁止访问”),然后用调用一个PL/pgSQL函数authorize(Username, MD5PassWord)授权并提升角色。该函数将检查提供的MD5哈希是否与用户表中存储的MD5哈希相匹配 - 如果是这样 - 它将为适当的组角色发出SET SESSION ROLE
如果这可行,它可以让我跟踪登录的用户名,然后使用功能,我可以将它与用户关联起来,用于业务逻辑或日志记录等。这也意味着我不必担心一些用户是否进入链接表 - 因为他们的访问将受到当前在该数据库会话中授权的角色的限制。

所以我掀起了一个plpgsql脚本,将其所有者设置为OrderCustomerEntryGroup并赋予其SECURITY DEFINER权利。

DECLARE 
    v_Status integer; 
BEGIN 
    v_Status := 0; 
    IF pin_username = 'username' AND MD5('foo') = pin_pwmd5 THEN 
     SET SESSION AUTHORIZATION OrderEntryGroup; 
     v_Status := 1; 
    END IF; 
    RETURN v_Status; 
END; 

唯一的问题但是我的执行是

SELECT authenticate('username',MD5('foo')); 

给出:

ERROR: cannot set parameter "session_authorization" within security-definer function 
SQL state: 42501 
Context: SQL statement "SET SESSION AUTHORIZATION OrderEntryGroup" 
PL/pgSQL function authenticate(character varying,text) line 7 at SQL statement 

所以我在这读了 - 从我可以告诉,你以前可以要做到这一点,但无论出于何种原因它被删除。除了在每个用户级别使用内置角色之外,我一直无法找到替代方案。

那么,我问的是...我缺少的是让我的方式(一个简单的解决方案)的工作,还是有不会涉及翻录除了这样做的更好的方式存在访问数据库?

回答

3

如果你想限制从直接连接来访问数据库,那么你就需要做一定量的后端“换装”无关。最好的方法几乎总是让每个用户连接自己的凭据,然后根据他们在数据库中所属的组(有时称为“角色”)限制该用户可以执行的操作。

如果您想避免为每个网络用户设置单独的数据库用户ID /密码,那么您应该使用集成Windows身份验证(SSPI)进行调查,如另一个问题here中所述。您仍然需要在数据库级别定义用户(除组/角色之外),但无论如何您都必须完成大部分工作。

+0

诚然,我不熟悉SSPI,但我要指出,生产数据库在Mac OS X Lion的(而不是服务器)和运行我的测试数据库是在Oracle的Linux 7上运行我看着PostgreSQL的认证模块决定我宁愿不引入另一层让我支持 - 而是坚持使用用户名/密码。在数据库服务器上设置每个用户并不是什么大问题。如何动态更改访问数据库中的凭据,而不会将它们保存在连接字符串中? – DHW

+1

@DHW我刚刚使用PostgreSQL ODBC v9.x进行了测试,它似乎缓存了像SQL Server那样的证书(和MySQL,IIRC,没有)。在这种情况下,您的用户将能够进入他们的PostgreSQL用户名和密码,一旦当你访问应用程序首次尝试打开一个PostgreSQL链接表,之后将继续使用缓存的凭据,只要你访问的应用程序是开放的。用这种方法做一些测试(因为我的PostgreSQL服务器是在Windows上,而不是在Linux/Mac上),如果它适合你,那么你将不必在连接字符串中保存凭据。 –

+1

不存储登录在连接字符串中,所以你不必重新链接与不同的用户,看到这个提示: http://blogs.office.com/b/microsoft-access/archive/2011/04 /08/power-tip-improve-the-security-of-database-connections.aspx –