前言
隨着技術的進步和網絡技術的發展,安全是任何行業都需要面對的挑戰,如前兩年爆發的WnCry電腦病毒,數據信息被加密。因此,數據安全始終需要預防。正因為數據庫作為存儲數據最重要的載體,所以除了硬件物理層面的數據安全防護之外,也需要在軟件層面加強數據安全防護。接下來介紹一下PostgreSQL中在數據安全層面對數據庫做防護。
目錄
一、客戶端接入認證
二、管理用戶及安全
三、設置密碼安全策略
四、行級安全(rls)策略
一、客戶端接入認證
PostgreSQL客戶端接入認證的主要方式是通過pg_hba.conf文件來進行配置。
1.1 配置客戶端接入認證
客戶端接入認證背景
如果主機需要遠程連接數據庫,必須在數據庫系統的配置文件中增加此主機的信息,並且進行客戶端接入認證。配置文件(默認名稱為pg_hba.conf)存放在數據庫的數據目錄里。hba(host-based authentication)表示是基於主機的認證。
- PostgreSQL支持如下三種認證方式,這三種方式都需要配置pg_hba.conf文件。
- 基於主機的認證:服務器端根據客戶端的IP地址、用戶名及要訪問的數據庫來查看配置文件從而判斷用戶是否通過認證。
- 口令認證:包括遠程連接的加密口令認證和本地連接的非加密口令認證。
- SSL加密:使用openssl(通用協議平台)提供服務器端和客戶端安全連接的環境。
- pg_hba.conf文件的格式是一行寫一條信息,表示一個認證規則,空白和注釋(以#開頭)被忽略。
- 每個認證規則是由若干空格和/,空格和制表符分隔的字段組成。如果字段用引號包圍,則它可以包含空白。一條記錄不能跨行存在。
pg_hba.conf文件中的每條記錄可以是下面四種格式之一
- 在配置 pg_hba.conf 文件時,請依據通訊需求按照格式內容從上至下配置記錄,優先級高的需求需要配置在前面。
- 若服務端pg_hba.conf文件配置了hostssl,postgresql.conf中必須開啟SSL認證模式。
因此對於認證規則的配置建議如下:
- 靠前的記錄有比較嚴格的連接參數和比較弱的認證方法。
- 靠后的記錄有比較寬松的連接參數和比較強的認證方法。
1.2 pg_hba.conf 配置文件參數說明及認證方式
參數說明
| 參數名稱 | 描述 | 取值范圍 |
| local | 表示這條記錄只接受通過Unix域套接字進行的連接。沒有這種類型的記錄,就不允許Unix域套接字的連接。 只有在從服務器本機使用gsql連接且在不指定-U參數的情況下,才是通過Unix域套接字連接。 |
- |
| host | 表示這條記錄既接受一個普通的TCP/IP套接字連接,也接受一個經過SSL加密的TCP/IP套接字連接。 | - |
| hostssl | 表示這條記錄只接受一個經過SSL加密的TCP/IP套接字連接。 | 用SSL進行安全的連接,需要配置申請數字證書並配置相關參數。 |
| hostnossl | 表示這條記錄只接受一個普通的TCP/IP套接字連接。 | - |
| DATABASE | 聲明記錄所匹配且允許訪問的數據庫。 |
說明: 值replication表示如果請求一個復制鏈接,則匹配,但復制鏈接不表示任何特定的數據庫。如需使用名為replication的數據庫,需在database列使用記錄 replication 作為數據庫名。 |
| USER | 聲明記錄所匹配且允許訪問的數據庫用戶。 |
說明: +表示前綴符號。
|
| ADDRESS | 指定與記錄匹配且允許訪問的IP地址范圍。 | 支持IPv4和IPv6,可以使用如下兩種形式來表示:
說明: 以IPv4格式給出的IP地址會匹配那些擁有對應地址的IPv6連接,比如127.0.0.1將匹配IPv6地址 ::ffff:127.0.0.1 |
| METHOD | 聲明連接時使用的認證方法。 | 支持如下幾種認證方式
|
認證方式
| 認證方式 | 說明 |
| trust | 采用這種認證模式時,使用psql且不指定-U參數的連接,此時不需要口令。 trust認證對於單用戶工作站的本地連接是非常合適和方便的,通常不適用於多用戶環境。如果想使用這種認證方法,可利用文件系統權限限制對服務器的Unix域套接字文件的訪問。要使用這種限制有兩個方法:
須知: 設置文件系統權限只能Unix域套接字連接,它不會限制本地TCP/IP連接。 |
| reject | 無條件地拒絕連接。常用於過濾某些主機。 |
| md5 | 要求客戶端提供一個md5加密的口令進行認證。 須知: 不推薦使用md5認證,因為md5為不安全的加密算法,存在網絡安全風險。 |
| scram-sha-256 | md5的升級版本,要求客戶端提供一個sha256算法加密的口令進行認證,該口令在傳送過程中結合salt(服務器發送給客戶端的隨機數)的單向sha256加密,增強了安全性。(推薦) |
| cert | 客戶端證書認證模式,此模式需進行SSL連接配置且需要客戶端提供有效的SSL證書,不需要提供用戶密碼。 須知: 該認證方式只支持hostssl類型的規則。 |
| password | 使用明文密碼 |
1.3 使用SSL進行安全的TCP/IP連接
從CA認證中心申請到正式的服務器、客戶端的證書和密鑰。(假設服務器的私鑰為server.key,證書為server.crt,客戶端的私鑰為client.key,證書為client.crt,CA根證書名稱為cacert.pem。)此處以OPENSSL生成的認證為基礎:
1)部署CA環境
登陸postgres用戶執行
生成2048位的CA私鑰:輸入密碼test
根證書文件名稱為server.req
輸入cakey.pem的口令test。
輸入國家名稱:CN
輸入省份:Jiangsu
輸入城市:NanJing
輸入組織名稱:gs
其中有些可以省略不填
使用openssl.cnf中的配置
輸入cakey.pem的口令,
檢查輸出的請求與簽名是否匹配
5)生成服務器證書私鑰
輸入server.key的口令
輸入系統要求的一些信息
其中一些字段可以不填,確保和創建CA時的內容一致
修改CA/index.txt.attr中的屬性為no
使用openssl.cnf中的配置,輸入cakey.pem中的口令
檢查請求與簽名是否匹配
1)啟動PostgreSQL服務器
將ssl認證功能啟用
輸入之前ssl認證文件配置的密碼后,數據庫即能啟動
2.1 默認權限機制
數據庫對象創建后,進行對象創建的用戶就是該對象的所有者。集群安裝后的默認情況下,未開啟三權分立,數據庫系統管理員具有與對象所有者相同的權限。也就是說對象創建后,默認只有對象所有者或者系統管理員可以查詢、修改和銷毀對象,以及通過GRANT將對象的權限授予其他用戶。
為使其他用戶能夠使用對象,必須向用戶或包含該用戶授予必要的權限。
不同的權限與不同的對象類型關聯。要撤消已經授予的權限,可以使用REVOKE。對象所有者的權限(例如ALTER、 DROP、GRANT和REVOKE)是隱式的,無法授予或撤消。即只要擁有對象就可以執行對象所有者的這些隱式權限。對象所有者可以撤消自己的普通權限,例如,使表對自己以及其他人只讀。
系統表和系統視圖要么只對系統管理員可見,要么對所有用戶可見。標識了需要系統管理員權限的系統表和視圖只有系統管理員可以查詢。
數據庫提供對象隔離的特性,對象隔離特性開啟時,用戶只能查看有權限訪問的對象(表、視圖、字段、函數),系統管理員不受影響。
2.2 用戶
使用CREATE USER 和 ALTER USER 可以創建和管理數據庫用戶。數據庫包含一個或者多個已命名的數據庫。用戶和角色在整個數據庫中是共享的,但是數據並不共享。即用戶可以連接到任何數據庫,但當連接成功后,任何用戶都只能訪問連接請求里聲明的那個數據庫。
2.2.1 管理員用戶
管理員用戶可以管理數據庫中的對象,可以通過WITH SUPERUSER關鍵詞創建管理員用戶
示例:創建具有管理員角色的用戶admin1和admin2
對於有多個業務部門,各部門間使用不同的數據庫用戶進行業務操作,同時有一個同級的數據庫維護部門使用數據庫管理員進行維護操作的場景下,業務部門可能希望在未經授權的情況下,管理員用戶只能對各部門的數據進行控制操作(DROP、ALTER、TRUNCATE),但是不能進行訪問操作(INSERT、DELETE、UPDATE、SELECT、COPY)。即針對管理員用戶,表對象的控制權和訪問權要能夠分離,提高普通用戶數據安全性。
示例:創建普通用戶user1和user2
Schema又稱作模式。通過管理Schema,允許多個用戶使用同一數據庫而不相互干擾,可以將數據庫對象組織成易於管理的邏輯組,同時便於將第三方應用添加到相應的Schema下而不引起沖突。
每個數據庫包含一個或多個Schema。數據庫中的每個Schema包含表和其他類型的對象。數據庫創建初始,默認具有一個名為public的Schema,且所有用戶都擁有此Schema的權限。可以通過Schema分組數據庫對象。Schema類似於操作系統目錄,但Schema不能嵌套。
相同的數據庫對象名稱可以應用在同一數據庫的不同Schema中,而沒有沖突。例如,a_schema和b_schema都可以包含名為mytable的表。具有所需權限的用戶可以訪問數據庫的多個Schema中的對象。
在初始數據庫postgres中創建用戶時,系統會自動幫助用戶創建一個同名Schema。在其他數據庫中,若需要同名Schema,則需要用戶手動創建。
數據庫對象是創建在數據庫搜索路徑中的第一個Schema內的。
創建SCHEMA可以使用CREATE SCHEMA語句創建。
更改SCHEMA名稱或者所有者,可以使用ALTER SCHEMA語句進行修改。
要刪除SCHEMA及其對象,使用DROP SCHEMA 語法可以進行刪除。
要在SCHEMA內創建表,以schema.tablename格式創建表。不指定schemaname時,對象默認創建到search_path中的第一個schema名稱。
示例1:創建schema對象s1和s2
綜上案例,可以發現,如果一個普通用戶對於schema下的對象進行訪問,修改等操作,首先要讓普通用戶具有對schema的使用權限,其次對schema下的對象要授權普通用戶具有訪問修改的權限。
三、設置密碼安全策略
設置賬戶的密碼安全策略
用戶密碼存儲在系統表pg_authid中,為防止用戶密碼泄露,PostgreSQL對用戶密碼進行加密存儲,所采用的加密算法由配置參數password_encryption_type決定。
- 當參數password_encryption設置為 scram-sha-256 時,表示采用 scram-sha-25 6方式對密碼加密。
- 當參數password_encryption設置為 md5 時,表示采用md5方式對密碼加密。md5為不安全的加密算法,不建議使用。
注意:PostgreSQL數據庫默認采用MD5加密。該參數設置后需要重新啟動數據庫服務器,並且需要更改原有密碼,使修改后用戶使用的密碼加密算法生效。
示例1:查看數據庫默認加密算法
四、行級安全(rls)策略
行級訪問控制特性將數據庫訪問控制精確到數據表行級別,使數據庫達到行級訪問控制的能力。不同用戶執行相同的SQL查詢操作,讀取到的結果是不同的。
用戶可以在數據表創建行訪問控制(Row Level Security)策略,該策略是指針對特定數據庫用戶、特定SQL操作生效的表達式。當數據庫用戶對數據表訪問時,若SQL滿足數據表特定的Row Level Security策略,在查詢優化階段將滿足條件的表達式,按照屬性(PERMISSIVE | RESTRICTIVE)類型,通過AND或OR方式拼接,應用到執行計划上。
行級訪問控制的目的是控制表中行級數據可見性,通過在數據表上預定義Filter,在查詢優化階段將滿足條件的表達式應用到執行計划上,影響最終的執行結果。當前受影響的SQL語句包括SELECT,UPDATE,DELETE。
示例:假設一張表中存儲了不同用戶的數據,但是不同的用戶只能看到自身相關的信息,不能訪問其它用戶的數據信息。
以上就是PostgreSQL數據庫中關於客戶端接入認證,用戶級別安全和基於行安全(RLS)的內容。
在PostgreSQL中,除了這些來控制數據庫的安全以外,還有pg_hba中的其它基於主機的訪問控制策略,數據庫訪問審計策略及對數據的加密策略。此章節中不再對涉及的其它安全訪問控制進行一一探討。
