一、數據完整性
1.應采用校驗技術或密碼技術保證重要數據在傳輸過程中的完整性,包括但不限於鑒別數據、重要業務數據、重要審計數據、重要配置數據、重要視頻數據和重要個人信息等
針對於傳輸過程中數據的完整性具體概念這里就不多闡述了,網上一些資料已經寫得比較清楚了,大致意思就是數據發送前后要有一個檢測機制,確保數據發送前和接收后的一致性。
針對數據庫系統來說,需要考慮的數據有:
鑒別數據、重要配置數據、重要業務數據、重要審計數據、重要個人信息等
然后,傳輸過程中的完整性一般是通過通信協議來實現的,一般常見的包括TLS、SSH等協議,具體到數據庫這個測評對象來說,就是去查看它是否啟用了SSL進行了數據通信,當然最好詢問下管理人員,確認是否還有其他保證數據傳輸過程中的完整性措施。
具體的配置就略過了,有興趣的可看等保2.0涉及的PostgreSQL數據庫(上),這里介紹了如何開啟SSL管理。
針對這個測評項,我們先去查看$PGDATA目錄下的postgresql.conf文件,確認是否已經啟用SSL:

確保配置的連接地址沒有漏網之魚(可不采用ssl連接的地址)就可以了。
2.應采用校驗技術或密碼技術保證重要數據在存儲過程中的完整性,包括但不限於鑒別數據、重要業務數據、重要審計數據、重要配置數據、重要視頻數據和重要個人信息等
針對存儲過程中的完整性保護,用簡單的方式來說就是你如何去判斷一個重要文件是否為初始的可信狀態,沒有被惡意篡改、刪除或新增等,要有這種完整性檢測機制。一般通過對比文件前后的哈希值來判斷重要文件、數據是否被篡改。
針對數據庫系統來說,需要考慮的數據有:
鑒別數據、重要配置數據、重要業務數據、重要審計數據、重要個人信息等
譬如我們需要對數據庫配置文件進行一個完整性檢測,我們就需要配置文件初始可信狀態時的哈希值,然后再根據目前的文件生成一個哈希值,對比前后的一致性,確認數據是否被篡改過。
下面是一個客戶的實例,他對服務器上的一些重要文件進行了完整性校驗,具有期望和當前的比對機制。

這個一般數據庫自身不帶這種機制,得詢問管理人員是否使用了第三方軟件對數據庫重要數據進行了完整性校驗。
二、數據保密性
1.應采用密碼技術保證重要數據在傳輸過程中的保密性,包括但不限於鑒別數據、重要業務數據和重要個人信息等
這個條款的意思就比較清楚了,就是讓你對重要數據進行加密傳輸。
一般針對數據庫需要考慮
鑒別數據、重要業務數據、重要個人信息等
1.1 鑒別信息
首先我們要去看pg_hba.conf文件中METHOD的配置信息

傳輸相關的參數大致有下類三個:
SCRAM-SHA-256
這是一種挑戰-響應架構, 可防止密碼在不可信連接上嗅探,並支持以密碼散列的形式將密碼存儲在服務器上, 這種形式被認為是安全的。
MD5
方法md5使用自定義安全性較低的質詢-響應機制。 它可以防止密碼嗅探,並避免以純文本形式將密碼存儲在服務器上, 但如果攻擊者設法從服務器竊取密碼哈希,則不提供保護。而且, MD5哈希算法現在不再被認為對於確定的攻擊是安全的。
password
是以明文密碼傳送給數據庫,建議不要在生產環境中使用。
這里舉例一個以MD5傳輸的例子:
未開啟SSL時,我通過Wireshare對數據庫認證過程的數據包進行抓取,發現傳輸的密碼字段信息
官方文檔的說明為質詢-響應機制。
嘗試密碼使用‘123456’,傳輸的並不是123456的MD5值,具有一定的保密性。
當開啟SSL時,我們再抓包,發現啥都看不懂了
1.2 重要業務數據、重要個人信息
未開啟SSL時,我這里進行執行一條查詢語句 select * from pg_shadow;
通過wireshark抓包,一些重要數據將會被竊聽
在包里我們能找到執行的SQL語句,和語句執行后的輸出結果顯示,所以這並不安全
開啟SSL后,執行上面相同的操作,發現也是啥也看不懂了
總結:
1.查看postgresql.conf、pg_hba.conf文件確認是否開啟SSL管理,如果開啟均符合。
2.未開啟SSL情況下,去查看pg_hba.conf文件METHOD字段的配置信息
鑒別數據:METHOD值為SCRAM-SHA-256、MD5時鑒別數據傳輸過程中具有保密性,當值為password時,為不符合
重要業務數據、重要個人信息:未開啟SSL,不符合。
當然不排除有其它可實現的手段,具體的可以找系統管理人員確認。
2.應采用密碼技術保證重要數據在存儲過程中的保密性,包括但不限於鑒別數據、重要業務數據和重要個人信息等
2.1 鑒別數據
我們可以使用password_encryption命令可以查看存儲密碼使用的算法,默認為MD5。
然后去查看用戶口令存儲的表:select * from pg_shadow;
口令存儲對應為passwd字段值
● 該算法的保密性
在網上搜索了一下,都是說pgSQL口令存的是用戶名+口令的MD5值,但具體是一個怎樣的存儲規律並沒有明說,這里經過自己測試,終於知道它是如何存儲用戶口令的。
為口令+角色名的MD5碼,口令在前,角色名再后。
首先,我們創建兩個用戶,進行測試:
create role est password '12345678t';
create role st password '1234567te';
然后去表中查詢它們的MD5值
可以看出passwd字段相同,未加salt,通過解密可以得到明文
2.2 重要業務數據、重要個人信息
這個一般去詢問數據庫管理員,是否對相關信息進行加密存儲。
如果加密了,叫他幫你打開下對應表截圖取證即可。
三、數據備份恢復
1. 應提供重要數據的本地數據備份與恢復功能
1.1 自帶命令
一般就類似於mysqldump,用這種方式,客戶很有可能就是將他寫進腳本里面,然后通過計划任務定時執行備份腳本。
1)pg_dumpSQL 轉儲方法的思想是創建一個由SQL命令組成的文件,當把這個文件回饋給服務器時,服務器將利用其中的SQL命令重建與轉儲時狀態一樣的數據庫。 PostgreSQL為此提供了工具pg_dump。這個工具的基本用法是:
pg_dump [connection-option...] [option...] [dbname]
dbname
指定要被轉儲的數據庫名。如果沒有指定,將使用環境變量PGDATABASE。如果環境變量也沒有設置,則使用指定給該連接的用戶名。
語法:pg_dump dbname > outfile
恢復:
pg_dump生成的文本文件可以由psql程序讀取,常用命令:
psql dbname < infile
pg_dump和psql讀寫管道的能力使得直接從一個服務器轉儲一個數據庫到另一個服務器成為可能,例如:
pg_dump -h host1 dbname | psql -h host2 dbname
2)pg_dumpall
pg_dump每次只轉儲一個數據庫,而且它不會轉儲關於角色或表空間(因為它們是集簇范圍的)的信息。為了支持方便地轉儲一個數據庫集簇的全部內容,提供了pg_dumpall程序。pg_dumpall備份一個給定集簇中的每一個數據庫,並且也保留了集簇范圍的數據,如角色和表空間定義。該命令的基本用法是:
pg_dumpall > outfile
恢復:
直接使用pg_dump下來的文件會發現無法恢復角色等相關信息
通過pg_dumpall 轉儲的結果可以使用psql恢復:
psql -f infile postgres
也可使用
psql < file
1.2 第三方軟件
在實際測評中,我們還能碰到許多客戶是用第三方軟件來對數據庫系統進行數據備份的。
這里我們就要去查看備份軟件中設置的策略是如何的。
總結:
至少需要確認備份的時間(如幾點執行備份)、頻率(如每日執行還是每周)、備份內容(如全庫備份還是增量,或者有些是對服務器整機進行備份,同時包含了數據庫)、備份文件存儲(如本地存儲還是定時存儲在哪)、是否具有恢復功能(當然如果這個功能都沒的話,這軟件還是別賣了。。)等。
確認完這些后,還要去查看備份的地方是否真的生成了備份文件,同時還需對備份文件進行恢復測試,確認備份數據的有效性。
2. 應提供異地實時備份功能,利用通信網絡將重要數據實時備份至備份場地
這個就去詢問管理人員是否將數據進行了異地備份。不同行業對異地的標准也是不同,具體的需要依據行業的指導文件進行判斷。
這里我個人好像在哪里看到過異地至少30公里,不知道腦子里為啥有30公里這個印象,主要這個條款的目的也是避免一些重大災害的,比如地震、火災之類的。
3. 應提供重要數據處理系統的熱冗余,保證系統的高可用性
這條也沒啥好說的,熱冗余一般就是看是否采用熱備、集群等方式部署,一般至少兩台部署,去找管理人員詢問、取證。
咱也不可能每種數據庫、服務器之類怎么熱冗余部署的都搞清楚,那也不會做等保了是吧,得干運維去了(滑稽),所以一般我還是去詢問管理人員這個是什么方式部署的。