分享到

引言

控制對系統和資料的訪問對於維護資料的安全性和完整性至關重要。PostgreSQL 提供了許多功能來幫助您管理這些問題,瞭解它們的工作原理是管理資料庫的重要組成部分。

控制對資源的訪問並定義誰可以對哪些實體做什麼,這一領域被稱為認證和授權。本指南探討了 PostgreSQL 提供的用於控制系統訪問和內部訪問的工具,旨在概述每個元件及其支援的整體功能。

什麼是認證和授權?

在深入瞭解 PostgreSQL 提供的具體工具之前,回顧認證和授權究竟是什麼以及它們為何重要,將會有所幫助。

什麼是認證?

認證是驗證身份的過程。在計算機領域,這通常意味著驗證使用者或實體是否如其所言。

認證通常涉及要求使用者提供他們知道的秘密資訊(如密碼)、他們擁有的獨特物品(如手機認證應用程式中的程式碼),或他們獨有身份特徵(如指紋認證)。

證明使用者身份的常見方式包括

  • 密碼
  • 金鑰
  • 安全證書
  • 軟體或硬體令牌
  • 指紋識別

認證是幾乎所有多使用者系統的重要要求。不同的人或實體(如自動化工具)需要不同的能力和資料訪問許可權,而建立身份是為客戶提供個性化體驗的第一步。認證是一種確認系統中賬戶只能由其所代表的真實世界人員或實體使用的途徑。

什麼是授權?

認證關注於驗證身份,而授權則側重於控制與這些身份或賬戶關聯的能力。一旦您知道某人是誰,授權功能就決定了他們可以做什麼。

授權策略中的定義通常包含三個組成部分

  • 主體:執行操作的使用者、賬戶或身份
  • 操作:要執行的具體功能或活動
  • 物件:操作所針對的資源、實體或範圍

授權策略可以定義廣泛的通用規則,也可以根據系統提供的控制級別定義具體的細粒度例外。有些策略將能力對映到使用者“類”或“角色”而不是單個使用者,以建立設定的授權級別。

授權是系統根據您的身份鎖定能力和資源訪問許可權的機制。因此,它與使用者管理、資源管理和安全性有著重要的關係。

PostgreSQL 如何配置認證和授權?

PostgreSQL 有幾個相互關聯的概念,它們共同滿足其認證和授權使用者訪問的管理要求。這些概念協同工作,以確定客戶端代表誰以及他們可以在 PostgreSQL 中做什麼。

簡而言之,PostgreSQL 使用以下框架來認證和授權使用者訪問資料庫叢集

  • 使用者和使用者類別在系統中被定義為角色
  • 認證到角色的方法定義在pg_hba.conf 檔案(基於主機的認證檔案)中。
  • 角色的能力和訪問級別由直接授予它們、透過角色成員資格或透過物件所有權授予的許可權來定義。

更深入地探索這三個相互關聯的領域可以幫助您瞭解它們各自如何促進 PostgreSQL 的訪問管理功能。

角色

PostgreSQL 沒有獨立的實體來表示使用者和組。相反,使用者賬戶和使用者組都作為單一的統一概念——角色來實現。角色是一種靈活的身份,用於表示單個使用者以及使用者組。

角色是 PostgreSQL 中的錨點,決定了認證和授權策略適用於誰。任何不普遍適用的策略都需要身份概念來定義誰受到限制和誰被允許。對 PostgreSQL 資料庫的每次連線都與一個特定的角色相關聯,該角色決定了其初始訪問級別。

授權策略決定了每個角色在資料庫叢集中擁有哪些許可權,包括它可以執行哪些命令、可以訪問哪些資源以及可以使用哪些功能。使用者透過認證角色來獲得這些許可權。

管理員可以將角色設為其他角色的成員,從而使成員獲得“容器”角色的許可權。這種靈活性允許您將某些角色視為使用者賬戶的對應物,而將其他角色視為使用者組、類別或職責的對應物。

單個角色可以同時作為容器和成員來實施更復雜的策略。通常,旨在用作使用者代理的角色具有定義的認證策略,其授權級別由其自身的許可權、其所屬角色的許可權以及其擁有的物件決定。相反,旨在用作組的角色通常沒有相關的授權。

關於角色的專門文章涵蓋了如何在 PostgreSQL 中定義和配置角色

pg_hba.conf 檔案

pg_hba.conf 檔案是 PostgreSQL 中定義認證策略的主要組成部分。在此語境中,“HBA”代表基於主機的認證(host-based authentication),指的是決定是否接受連線到 PostgreSQL 主機的策略。

pg_hba.conf 檔案允許管理員定義細粒度的認證要求,包括透過匹配系統來實現。連線會根據匹配條件進行測試,以確定是否應使用某個認證策略。

策略逐行定義,欄位之間用空格分隔。每個策略定義匹配條件和認證要求。

匹配條件可以檢查以下標準,例如

  • 客戶端連線方式
  • 他們試圖認證到的角色
  • 他們試圖訪問的資料庫
  • 客戶端的 IP 地址和網路屬性

第一個匹配連線的認證策略用於認證。PostgreSQL 提供了各種複雜程度不同的認證方法,從密碼和證書到與 LDAPRADIUS 伺服器等外部系統協調。

由於每個連線只諮詢一個策略(第一個匹配的策略),因此控制策略的特異性和順序非常重要。不當的順序可能導致客戶端連線匹配到錯誤的策略,這可能會阻止使用者訪問系統,或者無意中允許連線訪問。

遵循我們關於在 PostgreSQL 中配置認證的指南,瞭解如何配置有效的 pg_hba.conf 策略。

PostgreSQL 許可權和角色屬性系統

PostgreSQL 授權故事的最後一部分是定義每個角色可以做什麼的功能。有許多機制可以改變各種角色的訪問或控制級別。

角色屬性

PostgreSQL 允許您更改角色能力的第一種方式是使用角色屬性角色屬性定義了角色在整個資料庫叢集中擁有的許可權。這些許可權主要是特殊的管理員級別能力,或者是對賬戶限制程度的表達。

最強大的屬性是 superuser 屬性,它賦予角色繞過 PostgreSQL 內任何授權檢查的能力,實際上,允許其完全控制系統。其他屬性允許更狹義的許可權,例如分別使用 createrolecreatedb 屬性建立角色和資料庫的能力。

屬性還可以影響角色被允許訪問系統的方式。例如,初始連線中需要 login 屬性才能進行認證。同樣,可以設定 connection limit 來控制角色可以進行的併發連線數。

角色屬性是定義角色全域性能力的主要手段。

PostgreSQL 使用另一個系統來確定角色對特定資料庫物件(如資料庫、表和列)的許可權。角色與資料庫物件的關係是其所有權狀態和授予其許可權的函式。

物件所有權

物件所有權是第一個決定因素。預設情況下,角色擁有其自己建立的任何物件。所有權賦予您對物件的完全訪問許可權,包括刪除或修改物件本身的特殊許可權。只有 superuser 角色才能刪除或修改它們不擁有的物件。

每個資料庫物件只有一個所有者。如果您希望多個角色擁有資料庫物件的所有者許可權,則需要將它們都設為單個角色的成員,並賦予該角色所有權。

授予的物件許可權

非物件所有者角色可以使用 PostgreSQL 的許可權授予系統獲得不同級別的訪問許可權。

資料庫物件上的許可權使用 GRANTREVOKE 命令管理。GRANT 命令在此上下文中用於向特定資料庫物件上的角色新增許可權。相反,REVOKE 命令則從角色中移除相同的許可權。

如前所述,只有物件所有者和 superuser 角色才能刪除或修改物件本身。但是,可以為物件內的資料或其他物件分配細粒度許可權。例如,對於表,SELECTINSERTUPDATEDELETE 許可權分別控制角色是否可以檢視、新增、修改和刪除資料。

可用許可權的型別取決於所討論的資料庫物件。例如,REFERENCES 許可權允許角色建立與物件相關的外部索引鍵約束,僅限於在表或表列物件上使用。這是因為,例如,在序列上定義外部索引鍵約束許可權沒有意義。有關哪些許可權和資料庫物件可以一起使用的摘要,請查閱 PostgreSQL 許可權文件中的表 5.1 和表 5.2

請檢視我們關於在 PostgreSQL 中管理許可權的指南,瞭解有關如何使用 PostgreSQL 授權系統的更多資訊。

結論

PostgreSQL 的認證和授權系統如果整體來看,最初可能會顯得複雜。然而,系統中的各個元件都定義明確,並且大多隻與一個關注點相關。瞭解這些系統如何協同工作以實現強大而靈活的訪問管理,對於確保您的資料庫及其資料安全至關重要。

關於作者
Justin Ellingwood

Justin Ellingwood

Justin 自 2013 年以來一直撰寫關於資料庫、Linux、基礎設施和開發者工具的文章。他目前與妻子和兩隻兔子住在柏林。他通常不需要用第三人稱寫作,這讓所有相關方都感到欣慰。
© . This site is unofficial and not affiliated with Prisma Data, Inc.