2015-10-13 66 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 –