天天看點

RDS PostgreSQL 安全最佳實踐

一、PostgreSQL行業位置

(一)行業位置

首先我們看一看RDS PostgreSQL在整個行業當中的位置,主要從以下4個方面去闡述,第一是整個阿裡雲資料庫在資料庫領域的位置,第二是PostgreSQL在資料庫行業的位置,第三是PostgreSQL在全球資料庫領域的位置,最後我們看看它應用到哪些行業。

RDS PostgreSQL 安全最佳實踐

阿裡雲資料庫是2019年Gartner的挑戰者,2019年Forrester的強勁表現者。2020年,阿裡雲資料庫挺進全球資料庫魔力象限上司者,這是阿裡雲資料庫在資料庫行業的位置。

在2020年的PG亞洲大會上,阿裡雲資料庫專屬叢集MyBase被評為“PG年度最佳産品獎”。

PostgreSQL連續三年被評為最佳的資料庫,在開源社群的話是排行第二,在所有的開源以及閉源産品中排名第四,并且廣泛應用到計算機資訊技術、金融領域以及高等教育等衆多領域。

(二)RDS PG VS 自建PG

下面我們看一下RDS PG相對于傳統的自建PG,或者ECS上社群的PG,它的優勢在哪裡?

RDS PostgreSQL 安全最佳實踐

總結起來大概有4個方面,RDS PG取得了絕對的領先。第一是可靠性,第二是安全性,第三是智能化,最後一個是支援豐富插件,這四點是遠遠領先于ECS自建PG。

可靠性展現在三個方面,第一個是Failover Slot能力,它保證發生HA切換時資料訂閱的延續性。第二個是Standby支援多上遊結點的特性,假設我們今天建立了讀寫分離的場景,主執行個體在發生HA切換的時候,那麼隻讀執行個體不會有任何資料缺失,所有資料增量同步資料都會保持。第三個是RDS提供了一鍵大版本更新的能力,每個版本都可以直接向上升到最高版本,目前我們支援了10個版本的向上更新能力,并且使用者隻需要在控制台點一個按鈕即可,後端的事情由我們完成,這是一個遠超自建PG與友商的功能。

在安全性方面,我們支援BYOK的方式做落盤加密。其次是SSL鍊路加密,最後是SGX全加密的能力,我們在這三個方面的安全能力相比自建PG有很大的優勢。

在智能化方面,我們借助DAS診斷優化的能力,幫助使用者做問題的自發現、自診斷、自優化以及自決策。

在插件方面,我們提供了Ganos插件,做時空資料的存儲、檢索以及查詢分析;PASE支援高效向量檢索;oss_fdw既可以實作資料的冷熱分離,又可以幫使用者節約成本。

通過以上對比我們可以得出一個結果,就是RDS PG在可靠性、安全性、智能化、插件豐富度方面優勢明顯。

二、資料安全大事件

(一)安全大事件

接下來我們看一下近幾年發生的安全大事件。

  • 事件一: 超5萬台MongoDB資料庫執行個體被勒索

2017年1月、9月,黑客通過在網際網路上掃描開放外部連接配接的MongoDB資料 庫,入侵了超5萬台伺服器,删除資料并留下勒索資訊。

  • 事件二: Gitlab誤删庫事件

2017年1月,“Gitlab誤删庫事件”導緻300GB資料被誤删,差不多6小時 的資料丢失, 影響約5000個項目,5000個評論和700個新使用者賬戶。

  • 事件三: 2.4億條酒店開房記錄(疑似)被轉賣

2018年,國内某知名連鎖酒店資料以8個比特币在暗網轉賣,其中包含了1.3 億條個人資訊、2.4億條酒店入住登記資訊。

  • 事件四: 删庫跑路事件

2020年2月,因公司内部員工惡意破壞線上生産環境資料,導緻服務不可用超過120小時,股價暴跌22%,市值縮水超30億港元。

(二)資料洩漏對企業的影響

下面我們看一下資料安全可能會給公司造成什麼樣的後果。

RDS PostgreSQL 安全最佳實踐

2020年IBM《資料洩露年度報告》顯示,全球資料洩露事件達到3932起,洩露資料記錄數大概是370億條,平均單次洩露事件造成的損失大概是386萬美元,涉事上市公司平均股價下跌7.27%,基本可以算是暴跌。

各個國家針對安全事件也出了一些法律法規,如歐盟的《GDPR》以及中國的《資料安全法》、《民法典》。

介紹完以上安全事故,以及給企業帶來的嚴重後果,接下來我們看一下RDS PostgreSQL如何幫助使用者保障資料安全。

三、RDS資料庫安全體系

(一)功能大圖

這裡我們将傳統/自建/線下IDC使用者的資料庫和RDS資料庫保障安全的方式做了一個對比。首先我們看一下自建資料庫的安全措施,基本上有三個次元,第一是資料庫運維,第二是資料庫核心,第三是備份恢複。

RDS PostgreSQL 安全最佳實踐

針對于資料庫運維,是通過白名單、DBA授權以及用戶端直連的方式,幾乎沒有安全可言。

資料庫核心方面,通過賬号權限、DBA巡檢以及應用防範去保障安全。

資料庫備份是通過備份腳本,做本地備份,備份到目前的機器;通過腳本對備份集進行校驗。

以上就是傳統線下自建資料庫的安全措施,下面我們看看在阿裡雲是怎麼打造雲資料庫安全體系的,如上圖右邊所示。

我們主要從兩個鍊路來建構雲資料庫安全體系。第一是從控制鍊路,做到了事前防範、事中保護和事後的審計;第二個是資料鍊路,從接入層、網絡層、代理層、引擎層和存儲層打造資料鍊路安全。

事前防範有安全風險預警,可以給使用者提供很多安全提醒;事中保護是由RAM鑒權與子賬号的方式來控制使用者的權限;事後審計是通過管理審計日志的方式來做安全的審計。

在資料鍊路方面,可以分為5層,分别是接入層、網絡層、代理層、引擎層和存儲層。

自上而下看的話,我們在接入層有雲盾、堡壘機、DMS系統以及RAM授權,在管理方面有管理審計日志。

在網絡層有VPC、安全組、白名單、SSL鍊路加密與API操作審計等。

在代理層我們做到了防暴力破解,防SQL注入,登入審計以及SQL審計。

引擎層包括賬号權限控制,ACL加密和TDE日志等。

最後在存儲層,我們也有非常多組合的安全保護機制,比如BYOK,備份加密,雲盤加密和SGX全加密。

從對比來看的話,阿裡雲的資料庫安全體系是全方位、多角度對,做到了滴水不漏。

(二)全鍊路生命周期

下面我們看一下在安全大圖的基礎上,怎麼對全鍊路生命周期做安全的保護。

RDS PostgreSQL 安全最佳實踐

首先在登入資料庫的時候,我們是通過身份的識别,比如白名單,必須要在白名單裡的IP或者在IP段裡,才可以登入到資料庫。并且還要做權限驗證/認證以及使用者密碼強校驗。

登入到資料庫進行資料傳輸的時候,我們通過VPC、安全組、SSL以及HTTPS做鍊路加密。

接着在資料處理的時候,通過資料的隔離,如權限管理,加/解密計算以及資料脫敏等操作來實作資料處理的安全性。

資料處理完以後要進行資料交換,我們通過交換的管控,如權限管理,資料清洗以及資料脫敏。

在存儲層有剛才提到的BYOK,雲盤加密,備份加密以及SGX全加密。

最後一環也是大家比較容易忽視的一環,就是資料删除的時候也有安全風險。我們通過檔案的實體銷毀,比如把資料完全抹掉,備份檔案全部清除,中繼資料也要全部清除。

通過以上方式,就可以做到全鍊路生命周期的安全管控。

(三)最嚴格的安全合規

接下來通過一個典型的例子,看RDS如何去做事前防範,事中保護以及事後審計。

RDS PostgreSQL 安全最佳實踐

最上面Computer & Mobile Apps表示端這一層,我們可以通過手機的APP、電腦或者平闆的方式連接配接到背景應用所在的ECS,ECS到資料庫這一層我們提供了SSL的鍊路加密,防止用戶端或服務端的中間人欺詐的風險,中間會穿過防火牆(IPFilter),然後到達RDS的Proxy。到了Proxy以後,Proxy和RDS也是一個SSL鍊路加密。

在RDS上有兩種形态的存儲,分别是本地存儲和雲盤存儲。這兩種存儲我們都提供了存儲層的加密,如TDE、SGX全加密以及BYOK落盤加密,以上就是通路的整個鍊路。

在RDS這一層,資料庫備份是通過遠端脫機備份到OSS中,不會備份在本地,也就是說今天的備份檔案并不會因為這台實體機挂掉或者出現故障,而導緻備份檔案找不到,因為我們是遠端脫機實時地以全量加增量的方式備份到OSS上,可以保證使用者資料有一個保底的備份檔案。

當然,我們所有的記錄檔以及SQL審計都會存在SLS裡,這樣就可以做到事後審計的能力。

總結來看,RDS在事前防範有權限控制、使用者名和密碼、ACL、白名單以及VPC/SG。權限控制表示使用者權限的管控,使用者名密碼的強比對、完全比對以及通路控制。白名單方面,我們隻允許開了白名單的IP或者IP段的使用者能夠連接配接到RDS上。在網絡方面,我們将使用者的ECS和RDS所在的VPC/SG保持一緻,才能夠讓使用者連接配接到我們的RDS上面,做到了網絡隔離。

事中保護方面,我們提供了SSL證書防中間人欺詐,TDE的透明資料加密,防止拖庫。SGX全加密是基于可行硬體的全加密的資料庫,BYOK是使用者自帶的密鑰,基于這個密鑰對資料進行落盤加密。BYOK支援直接用KMS Key的方式,備份加密可以把資料庫備份檔案進行加密,哪怕我們的備份檔案被别人拿到,對方也無法還原出我們的資料。

事後審計是通過SQL審計以及API審計來做的。

綜上來看,RDS資料庫滿足最嚴格的安全合規要求。

四、PG 安全最佳實踐

(一)RDS PG SSL鍊路加密

第一個安全實踐案例是SSL鍊路加密。

RDS PostgreSQL 安全最佳實踐

PG的SSL鍊路加密非常強大,主要有6大适用場景,可以做到防服務端僞裝;防用戶端僞裝;還可以做到既防服務端,又防用戶端僞裝;當使用者證書過期的時候,我們提供證書更新的能力,除此之外,還可以配置ACL。當使用者用戶端證書洩露,或者使用者懷疑自己的用戶端證書洩露了,我們提供吊銷用戶端證書的功能,拒絕有證書洩露風險用戶端登入。

具體展開的話,在防服務端僞裝方面,我們提供了兩種類型的證書,分别是阿裡雲頒發的服務端證書與使用者自定義服務端證書。

在防用戶端僞裝方面,可以用服務端去驗證用戶端證書的真僞,也可以通過清除用戶端證書來更新證書。

防服務端、用戶端僞裝實際上實作的是用戶端驗證服務端真僞,服務端驗證用戶端真僞,是一種雙向驗證的安全保護。

證書更新原理比較簡單,就是先把證書清掉,然後再重新啟動,就可以實作證書更新。

ACL是控制用戶端的通路,吊銷證書就是針對有洩漏風險的證書,我們可以一鍵吊銷,并拒絕這樣的用戶端證書登入。

(二)連接配接啟用SSL PG Demo

下面舉一個例子,假設我們今天在RDS上面啟用了用戶端證書和服務端證書的時候,我們該如何通路這樣的RDS執行個體?

這個地方的話我會分三個場景來介紹,第一是用pgAdmin用戶端的時候該怎麼做,第二個是用PG SQL指令終端的時候該怎麼配,最後是應用程式如何連接配接啟用了SSL防僞裝功能的RDS PG。

RDS PostgreSQL 安全最佳實踐

首先是第一個場景,pgAdmin配置三個地方,General tab設定連接配接名字,Connection是設定RDS的連接配接字元串、使用者名密碼,而SSL Tab頁面裡面要配置4個東西,分别是SSL mode、Client certification、Client certification Key和Root certification,如下所示。

RDS PostgreSQL 安全最佳實踐

通過這樣的方式,pgAdmin用戶端就可以連接配接到RDS執行個體上了。

第二個場景是psql指令終端,需要配置5個參數,分别是:

  1. PGSSLCERT:SSL用戶端證書
  2. PGSSLKEY:用戶端證書密鑰
  3. PGSSLROOTCERT:SSL根證書
  4. PGSSLMODE:SSL安全連接配接模式

例如:

RDS PostgreSQL 安全最佳實踐

設定好這些參數以後,就可以去連接配接RDS執行個體。我們可以看到紅色框裡面表明已經啟用 SSL的安全隧道了,會有SSL Connection的提醒,而且有protocol表示這是TLSv.1.2的版本。

下面是使用者比較關心的,就是啟用以後應用程式該怎麼寫,JDBC應該怎麼樣設定,這裡最開始做的時候是有一點門檻的,有幾個參數設定:

  • SSL一定要設定為true,表示啟用SSL;
  • sslrootcert是根證書的檔案;
  • sslkey是證書檔案的密鑰轉換成pk8的格式,轉換指令也寫到注釋上了;
  • sslcert是SSL用戶端證書的檔案;
  • sslpassword,指生成 pk8檔案時輸入的密碼;
  • sslmode可以設定為verify-full、require等,設定完就可以去連接配接,讀到表裡面的資料。

如下所示:

RDS PostgreSQL 安全最佳實踐

(三)SGX全加密概念

RDS PostgreSQL 安全最佳實踐

接下來我們看一下SGX全加密,它分為三個層次,第一個是端,端看到的是明文,不管是SQL語句還是最終資料都是明文。

中間鍊路層的話,它的SQL語句都是加密的,回報回來的資料也是加密的。

存儲這一層也是全加密的,哪怕是一個超級賬号使用者,拿到了資料庫所有的通路權限,進去看表的資料,看到的也都是密文,不知道它裡面的資訊。

第三層我們畫了一個問号,表示這個人想要去看的時候,在鍊路這一層以及資料庫存儲這一層,都看不到明文的資料,隻有我們授信的這些端才可以看到這個明文的資料。

以上就是整個SGX全加密的概念,下面我們看一下它的原理。

(四)基于可信硬體的全加密資料庫

RDS PostgreSQL 安全最佳實踐

在端這一層的話,我們的查詢語句、操作語句、DDL、DML語句都是明文,回報回來的結果也是明文。在存儲這一層,資料存儲、查詢語句、執行的資料傳回到端之前端結果都是密文。

這帶來的好處就是對于非授信的端,資料全程不可見,并且它可以相容原生SQL查詢,也相容整個RDS的生态工具類,比如持資料遷移 (DTS)、備份 (DBS) 等。

(五)SGX全加密 - 純軟Demo

我們站在應用開發者的角度,假設使用的是一個全加密的資料庫,我們要怎麼做才能使應用跟資料庫進行比對。

RDS PostgreSQL 安全最佳實踐

第一步是要準備一個RDS執行個體,我們在RDS的控制台上建立一個PG執行個體,目前隻支援PG 11.0的版本,接着設定白名單,然後在RDS上面建立高權限賬号。

第二步是環境的準備,使用高權限的賬号登入到RDS執行個體上,建立一個測試的加密資料庫,然後在加密資料庫裡建立加密的插件,然後建立測試的表,到這一步我們的環境就配置好了,接下來就是我們的代碼該怎麼去适配。

首先Java代碼要下載下傳一個依賴包,安裝依賴包後添加POM依賴,然後就可以做資料的加密和解密了。

RDS PostgreSQL 安全最佳實踐

上面是一個具體的例子,為什麼是在用戶端實作加/解密?

可以看到,寫資料的時候就是最上面的方法,把資料的明文進行了加密,在讀取資料的時候,把讀取到的密文檔案再進行解密,就可以得到一個明文。

可以看到結果最上面的一條記錄,就是資料庫裡存儲的密文檔案,關鍵的這些字段都是進行了加密,哪怕有其他有權限的人登上去,或者把備份檔案拿到,它都是一個密文,而最下面就是這一條資料真正的明文。

詳情還可以參見阿裡雲官方幫助文檔:

https://help.aliyun.com/document_detail/229525.html