使用者認證

  • 當用戶端與資料庫伺服器連接時,它將聲明以哪個PostgreSQL 資料庫使用者身份進行連接,就像我們登錄一台 Unix 電腦一樣。
  • 在 SQL 環境裡,活動的資料庫用戶名決定資料庫物件的各種存取權限。因此,實際上我們要限制的是使用者可以連接的資料庫。

    • PostgreSQL 實際上用"角色"的概念管理許可權。我們用資料庫使用者表示 "帶有LOGIN許可權的角色"。
  • 認證是資料庫伺服器識別用戶端的過程。它通過一些手段判斷是否允許此用戶端 (或者運行這個用戶端的用戶)與它所聲明的資料庫用戶名進行綁定。

  • PostgreSQL資料庫用戶名在邏輯上是和伺服器運行的作業系統用戶名相互獨立的。

    • 如果某個伺服器的所有用戶在那台伺服器機器上也有帳號,那麼給資料庫使用者賦與作業系統用戶名是有意義的。
    • 不過,一個接收遠端存取的伺服器很有可能有許多沒有本地作業系統帳號的使用者,因而在這種情況下資料庫使用者和作業系統用戶名之間不必有任何聯繫。

pg_hba.conf文件

  • 用戶端認證是由一個設定檔(通常名為pg_hba.conf)控制的, 它存放在資料庫集群的資料目錄裡。HBA的意思是"host-based authentication", 也就是基於主機的認證。

  • pg_hba.conf檔的常用格式是一組記錄,每行一條。空白行將被忽略,井號#開頭的注釋也被忽略。

    • 記錄不能跨行存在。 一條記錄是由若干用空格和/或定位字元分隔的欄位組成。
    • 如果欄位用引號包圍,那麼它可以包含空白。
  • 每條記錄聲明一種連接類型、一個用戶端 IP 位址範圍(如果和連接類型相關的話)、 一個資料庫名、一個用戶名字、對匹配這些參數的連接使用的認證方法。

    • 第一條匹配連接類型、用戶端位址、連接請求的資料庫名和用戶名的記錄將用於執行認證。
    • 這個處理過程沒有 "跨越"或者"回頭"的說法:如果選擇了一條記錄而且認證失敗,那麼將不再考慮後面的記錄。
    • 如果沒有匹配的記錄,那麼訪問將被拒絕。
# 每條記錄可以是下面七種格式之一:
local      database  user  auth-method  [auth-options]
host       database  user  address  auth-method  [auth-options]
hostssl    database  user  address  auth-method  [auth-options]
hostnossl  database  user  address  auth-method  [auth-options]
host       database  user  IP-address  IP-mask  auth-method  [auth-options]
hostssl    database  user  IP-address  IP-mask  auth-method  [auth-options]
hostnossl  database  user  IP-address  IP-mask  auth-method  [auth-options]
  • local: 這條記錄匹配企圖通過 Unix 域通訊端進行的連接。沒有這種類型的記錄,就不允許 Unix 域通訊端的連接。

  • host: 這條記錄匹配企圖通過 TCP/IP 進行的連接。host記錄匹配 SSL和非SSL的連接請求。

    • 除非伺服器帶著合適的listen_addresses配置參數值啟動,否則將不可能進行遠端的 TCP/IP 連接,因為缺省的行為是只監聽本地自環位址localhost的連接。
  • hostssl: 這條記錄匹配企圖使用 TCP/IP 的 SSL 連接。但必須是使用SSL加密的連接。

    • 要使用這個選項,編譯伺服器的時候必須打開SSL支持。 而且在伺服器啟動的時候必須打開ssl配置選項
  • hostnossl: 這條記錄與hostssl行為相反:它只匹配那些在 TCP/IP 上不使用SSL的連接請求。

  • database:聲明記錄所匹配的資料庫名稱。

    • 值 all表明該記錄匹配所有資料庫
    • 值sameuser表示如果被請求的資料庫和請求的使用者同名,則匹配。
    • 值samerole表示請求的使用者必須是一個與資料庫同名的角色中的成員。 (samegroup是一個已經廢棄了,但目前仍然被接受的samerole同義詞。) 對samerole來說,不認為超級用戶是角色的一個成員,除非他們明確的是角色的成員, 直接的或間接的,並且不只是由於超級用戶。
    • 值replication表示如果請求一個複製連結,則匹配(注意複製連結不表示任何特定的資料庫)。在其它情況裡,這就是一個特定的 PostgreSQL資料庫名字。可以通過用逗號分隔的方法聲明多個資料庫, 也可以通過首碼@來聲明一個包含資料庫名的檔。
  • user: 為這條記錄聲明所匹配的資料庫使用者。

    • 值all表明它匹配於所有用戶。否則,它就是特定資料庫使用者的名字或者是一個首碼+的組名稱。
    • 請注意, 在PostgreSQL裡,用戶和組沒有真正的區別,+實際上只是意味著 "匹配任何直接或者間接屬於這個角色的成員",而沒有+記號的名字只匹配指定的角色。
    • 為此,超級用戶如果明確是角色的成員,也只算是一個角色的成員,直接的或間接的,而不只是由於超級用戶。 多個用戶名可以通過用逗號分隔的方法聲明。一個包含用戶名的檔可以通過在檔案名前面首碼 @來聲明。
  • address: 聲明這條記錄匹配的用戶端機器位址。這個檔可以包含主機名稱、IP位址範圍或下面提到的特殊關鍵字之一。

  • auth-method: 聲明連接匹配這條記錄的時候使用的認證方法。

    • trust: 無條件地允許連接。這個方法允許任何可以與PostgreSQL 資料庫伺服器連接的使用者以他們期望的任意PostgreSQL 資料庫使用者身份進行連接,而不需要口令或任何其他認證。
    • reject: 無條件地拒絕連接。常用於從一個組中"過濾"某些主機,例如, 一個拒絕行能夠從連接中鎖定一個指定的主機,而稍後的行允許指定網路中的剩餘的主機連接。
    • md5: 要求用戶端提供一個雙重MD5散列的口令進行認證。
    • password: 要求用戶端提供一個未加密的口令進行認證。因為口令是以明文形式在網路上傳遞的, 所以我們不應該在不安全的網路上使用這個方式。
    • gss: 使用GSSAPI認證用戶。這只能用於TCP/IP連接。
    • sspi: 使用SSPI認證用戶。這只能在Windows上使用。
    • ident: 獲取客戶的作業系統名然後檢查該使用者是否匹配要求的資料庫用戶名, 方法是用戶的身份通過與運行在用戶端上的 ident 伺服器連接進行判斷的。 Ident認證只在進行TCP/IP連接的時候才能用。當指定本地連接時,將使用peer認證。
    • peer: 為作業系統獲取用戶端作業系統用戶名,並檢查該使用者是否匹配要求的資料庫用戶名。 該方法只適用於本地連接。
    • ldap: 使用LDAP伺服器進行認證。
    • radius: 使用RADIUS伺服器進行認證。
    • cert: 使用SSL用戶端證書進行認證。
    • pam: 使用作業系統提供的可插入認證模組服務(PAM)來認證。

資料庫角色

  • PostgreSQL使用角色的概念管理資料庫存取權限。 根據角色自身的設置不同,一個角色可以看做是一個資料庫使用者,或者一組資料庫使用者。 角色可以擁有資料庫物件(比如表)以及可以把這些物件上的許可權賦予其它角色, 以控制誰擁有訪問哪些物件的許可權。

    • 另外,我們也可以把一個角色的成員 許可權賦予其它角色,這樣就允許成員角色使用分配給另一個角色的許可權。
    • 角色的概念替換了"用戶"和"組"。
  • 資料庫角色從概念上與作業系統使用者是完全無關的。在實際使用中把它們對應起來可能比較方便, 但這不是必須的。資料庫角色在整個資料庫集群中是全域的(而不是每個庫不同)。

    • 要創建一個角色,使用 SQL 命令CREATE ROLE執行:
    • name遵循 SQL 標識的規則:要麼完全沒有特殊字元, 要麼用雙引號包圍(實際上你通常會給命令增加額外的選項,比如LOGIN。 下面顯示更多細節)。要刪除一個現有角色,使用類似的DROP ROLE命令.
# 建立名為name的role
CREATE ROLE name;

# 刪除名為name的role
DROP ROLE name;
  • 為了方便,程式createuser和dropuser 提供了對了這些 SQL 命令的封裝。我們可以在 shell 命令上直接調用它們:
createuser name
dropuser name
  • 要檢查現有角色的集合,可以檢查pg_roles系統表(in psql shell)
    • psql的元命令\du也可以用於列出現有角色。
SELECT rolname FROM pg_roles;
  • 為了能創建初始資料庫系統,新建立的資料庫總是包含一個預定義的"超級用戶"角色,並且缺省時(除非在運行initdb時更改過) 他將和初始化該資料庫集群的使用者有相同的名稱。

    • 通常,這個角色名叫postgres。
    • 為了創建更多角色,你必須首先以這個初始用戶角色連接。
  • 每一個和資料庫的連接都必須用一個角色身份進行,這個角色決定在該連接上的初始許可權。 特定資料庫連接的角色名是在初始化連接請求的時候聲明的。

    • 比如,psql程式使用-U命令列選項聲明它代表的角色。
    • 許多應用以當前作業系統的用戶名為缺省角色名(這樣的應用包括createuser和psql)。所以,在系統使用者和資料庫角色之間有某種命名關係會讓我們工作方便很多。

results matching ""

    No results matching ""