1. 程式人生 > 實用技巧 >PG-資料庫安全

PG-資料庫安全

安全等級

TCSEC(Trusted Computer System Evaluation Criteria)將計算機系統的安全劃分為4個等級、7個級別。

四個大類:D,C,B和A,其中部門A具有最高的安全性。每個類都代表個人或組織對評估系統的信任度存在顯著差異。此外,C,B和A分為一系列詳細分級:C1,C2,B1,B2,B3和A1。總體上,TCSEC分級為:D、C1,C2,B1,B2,B3和A1。

分類

  • D:最小保護(“Minimal protection”)

    • 預留給那些已經過評估但未能滿足更高分部要求的系統
  • C:自主保護(“Discretionary protection”)

    • C1 - 任意安全保護
      • 識別和認證
      • 分離使用者和資料
      • 自主訪問控制(DAC)能夠以個人為基礎實施訪問限制
      • 所需的系統文件和使用者手冊
    • C2 - 受控訪問保護
      • 更細緻的DAC
      • 通過登入程式進行個人問責
      • 審計跟蹤
      • 物件重用
      • 資源隔離
      • 舉一個系統例子是HP-UX
  • B:強制性保護(“Mandatory protection”)

    • B1 - 標記的安全保護

      • 安全策略模型的非正式宣告
      • 資料敏感標籤
      • 對選定主題和物件的強制訪問控制(MAC)
      • 標籤出口能力
      • 一些發現的瑕疵必須被移除或以其他方式減輕(不確定)
      • 設計規範和驗證
    • B2 - 結構化保護

      • 安全策略模型明確定義並正式記錄
      • DAC和MAC強制執行擴充套件到所有主體和客體
      • 對隱蔽儲存通道的出現和頻寬進行分析
      • 仔細構建保護關鍵和非保護關鍵元素
      • 設計和實施可以實現更全面的測試和審查
      • 認證機制得到加強
      • 可信賴的設施管理提供管理員和運營商隔離
      • 強加嚴格的配置管理控制
      • 操作員和管理員角色是分開的。
      • 舉一個系統例子是Multics
    • B3 - 安全域

      • 滿足參考監視器要求
      • 結構化以排除對安全策略實施不重要的程式碼
      • 旨在降低複雜性的重要系統工程
      • 安全管理員角色定義
      • 審計與安全有關的事件
      • 自動即時入侵檢測,通知和響應
      • 用於使用者認證功能的TCB的可信路徑
      • 可信系統恢復程式
      • 對隱蔽定時通道進行分析以確定發生情況和頻寬
      • 這種系統的一個例子是XTS-300的前身XTS-300
  • A: 驗證保護(“Verified protection”)

    • A1 - 已驗證設計
      • 在功能上與B3相同
      • 正式的設計和驗證技術,包括正式的頂級規範
      • 正式的管理和分配程式
      • A1級系統的例子有霍尼韋爾的SCOMP,Aesec的GEMSOS和波音的SNS伺服器。兩個未評估的產品是LOCK平臺和取消的DEC VAX安全核心。
    • 超越A1
      • 系統架構表明參考監視器的自我保護和完整性要求已在可信計算庫(TCB)中實施。
      • 安全測試會自動從正式的頂級規範或正式的低階規範中生成測試用例。
      • 形式規範和驗證是在可行的情況下使用形式化驗證方法將TCB驗證到原始碼級別的地方。
      • 可信設計環境是TCB設計在只有可信(清理)人員的受信任設施中的地方。

PG安全體系

PostgreSQL先通過使用者標識和認證來驗證訪問資料庫的使用者身份,判斷是否為合法使用者及是否具有許可權訪問資料庫資源。然後通過基於角色的訪問控制(Role Based Access Control, RBAC),並使用存取控制列表(ACL)方法控制訪問請求和包含資訊。

  • 使用者標識和認證
    • 最外層的安全保護措施
  • 使用者角色管理
    • 角色是許可權的集合,管理員根據角色在系統中承擔的職責分配具有不同許可權的角色。
  • 資料庫物件的訪問控制

使用者標識和認證

客戶端認證過程

  • 客戶端和服務端的Postmaster程序建立連線
  • 客戶端傳送請求資訊到守護程序Postmaster
  • Postmaster根據請求資訊檢查配置檔案pg_hba.conf是否允許該客戶端進行連線,並把認證方式和必要資訊傳送到客戶端
  • 客戶端根據收到的不同認證方式,傳送相應的認證資訊給Postmaster
  • Postmaster呼叫認證模組對客戶端送來的認證資訊進行認證。若認證通過,初始化一個Postgres程序與客戶端進行通訊;否則拒絕繼續會話,關閉連線。

客戶端配置檔案

客戶端認證所需的配置資訊都儲存在$PGDATA/pg_hba.conf檔案。通過若干空格或製表符分割欄位,檔案內容格式如下:

local      DATABASE  USER  METHOD  [OPTIONS]
host       DATABASE  USER  ADDRESS  METHOD  [OPTIONS]
hostssl    DATABASE  USER  ADDRESS  METHOD  [OPTIONS]
hostnossl  DATABASE  USER  ADDRESS  METHOD  [OPTIONS]
欄位說明
  • local:通過Unix套接字連線

  • host:通過TCP/IP進行連線

  • hostssl:通過TCP/IP使用SSL的連線

  • hostnossl:只匹配在TCP/IP上不使用SSL的連線

  • database:宣告匹配的資料庫名稱。可以使用逗號分割多個數據庫名稱,也可以使用字首@宣告一個包含資料庫名的檔案。還可以使用以下預定義的值

    • all:匹配所有的資料庫
    • sameuser:匹配和請求使用者名稱同名的資料庫
    • samerole:請求的使用者必須是一個與資料庫同名的角色中的成員
  • user:宣告匹配的資料庫使用者

    • 可以指定一個使用者名稱
    • 使用組名,需要在組名前新增字首+
    • 使用all匹配所有使用者
  • ADDRESS:指定匹配的主機集

    • 可以使用IP地址和網路掩碼
    • 可以使用主機名
  • METHOD:連線時使用的認證方法

    • trust:無條件允許連線
    • reject:無條件地拒絕連線
    • md5:提供md5加密的口令進行認證
    • password:提供一個未加密的口令認證
    • scram-sha-256:
    • gss:
    • sspi:
    • ident:通過對映檔案pg_ident.conf判斷
    • peer:
    • pam:通過作業系統提供的熱插拔認證模組服務(PAM)來認證
    • ldap:
    • radius:
    • cert:通過SSL客戶端進行認證
  • OPTIONS:

客戶端認證

基於角色的許可權管理

許可權分類

  • 系統許可權:規定使用者使用資料庫的許可權(連線資料庫、建立資料庫、建立使用者等)
  • 物件許可權:在表、序列、函式等資料庫物件上執行特殊動作的許可權(SELECT、INSERT、UPDATE、DELETE、REFERENCES、TRIGGER、CREATE、CONNECT、TEMPORARY、EXECUTE和USAGE等

角色屬性

角色屬性:定義角色擁有的系統許可權

  • LOGIN(登入):具有登入屬性的角色才可以作為連線資料庫的使用者
  • SUPERUSER(超級使用者):具有SUPERUSER屬性的角色具有系統最高許可權
  • CREATEDB(建立資料庫):定義角色是否能建立資料庫
  • CREATEROLE(建立角色):定義角色是否可以建立新角色
  • PASSWORD(口令):設定角色的口令
  • INHERIT(繼承):定義一個角色是否繼承它所屬角色的許可權
  • CONNECTION LIMIT(連線限制):宣告角色可使用的併發連線數量

初始化時預設建立一個和作業系統使用者同名的資料庫超級使用者(通常使用postgres使用者)

角色屬性系統表
  • pg_authid系統表可以檢視角色的屬性資訊
                        Table "pg_catalog.pg_authid"
     Column     |           Type           | Collation | Nullable | desc 
----------------+--------------------------+-----------+----------+---------
 oid            | oid                      |           | not null | 
 rolname        | name                     |           | not null | 角色名稱
 rolsuper       | boolean                  |           | not null | 是否超級使用者
 rolinherit     | boolean                  |           | not null | 是否自動繼承所屬組角色的許可權
 rolcreaterole  | boolean                  |           | not null | 是否建立新角色
 rolcreatedb    | boolean                  |           | not null | 是否建立資料庫
 rolcanlogin    | boolean                  |           | not null | 是否可以登入
 rolreplication | boolean                  |           | not null | 是否用於複製
 rolbypassrls   | boolean                  |           | not null | 
 rolconnlimit   | integer                  |           | not null | 限制最大併發連線數(-1 無限制)
 rolpassword    | text                     | C         |          | 角色口令
 rolvaliduntil  | timestamp with time zone |           |          | 口令失效時間
Indexes:
    "pg_authid_oid_index" UNIQUE, btree (oid), tablespace "pg_global"
    "pg_authid_rolname_index" UNIQUE, btree (rolname), tablespace "pg_global"
Tablespace: "pg_global"

  • pg_roles檢視提供了訪問資料庫角色資訊

  • pg_auth_members系統表儲存了角色之間的成員關係

物件訪問控制

在PG中,建立安全的資料庫連線是由使用者標識和認證技術共同實現,而建立連線後的安全訪問保護則是由基於角色的物件訪問控制。

訪問控制列表(ACL)

訪問控制列表(Access Contron List, ACL)是物件許可權管理和許可權檢查的基礎,PG系統通過操作ACL實現物件的訪問控制管理。每個物件都有ACL,他儲存了此物件所有授權資訊。