數(shù)據(jù)庫安全,是指以保護數(shù)據(jù)庫系統(tǒng)、數(shù)據(jù)庫服務(wù)器和數(shù)據(jù)庫中的數(shù)據(jù)、應(yīng)用、存儲,以及相關(guān)網(wǎng)絡(luò)連接為目的,防止數(shù)據(jù)庫系統(tǒng)及其數(shù)據(jù)遭到泄露、篡改或破壞的安全技術(shù)。
數(shù)據(jù)庫是企業(yè)最為核心的數(shù)據(jù)保護對象。與傳統(tǒng)的網(wǎng)絡(luò)安全防護體系不同,數(shù)據(jù)庫安全技術(shù)更加注重從客戶內(nèi)部的角度出發(fā)做安全,其安全要求包括了保密性、完整性和可用性,即CIA(Confidentiality, Integrity, Availability)的三個方面。
但對于傳統(tǒng)數(shù)據(jù)庫服務(wù)而言,要保證達到這些安全要求是復(fù)雜且困難的,需要從前端(業(yè)務(wù))到后端(數(shù)據(jù)庫以及服務(wù)器)各方面的整改和體系化的建設(shè)才能符合高標(biāo)準的安全需求,例如等保三級等合規(guī)性要求。這同時也意味著對客戶而言,要投入巨大的人力、物力、財力。
如果在云端就能擁有這些安全能力,客戶就無需為以上安全建設(shè)成本擔(dān)憂。騰訊云數(shù)據(jù)庫對數(shù)據(jù)庫安全技術(shù)進行統(tǒng)一支持后,所有客戶均可復(fù)用,從而減少客戶的數(shù)據(jù)庫安全成本投入。而騰訊云數(shù)據(jù)庫PostgreSQL到底提供哪些數(shù)據(jù)庫安全能力呢?本文將主要從數(shù)據(jù)安全,實例安全兩方面進行詳細介紹。
數(shù)據(jù)安全
TDE數(shù)據(jù)加密
透明數(shù)據(jù)加密(Transparent Data Encryption,以下簡稱 TDE)提供文件級別的加密,可以做到對數(shù)據(jù)庫上層的應(yīng)用透明,而存儲在硬盤上的數(shù)據(jù)是加密的,對磁盤數(shù)據(jù)讀取和寫入時透明地進行加解密,且這個過程中用戶無需自行修改業(yè)務(wù)代碼。
透明數(shù)據(jù)加密常用于解決一些安全合規(guī)問題,如PCI DSS、等級安全保護等要求靜態(tài)數(shù)據(jù)需要被保護的場景。
騰訊云數(shù)據(jù)庫 PostgreSQL 通過向用戶申請使用 KMS(Key Management Service)服務(wù)中保存的主密鑰,生成 DEK(Data Encryption Key)密文與 DEK 明文對云產(chǎn)品加密所使用的密鑰進行數(shù)據(jù)加密和解密。
圖:信封加密流程圖
此類加密方案被稱為信封加密(Envelope Encryption),即用另一個密鑰對密鑰進行加密。信封加密是一種應(yīng)對海量數(shù)據(jù)的高性能加解密方案。其可通過生成 DEK 來對本地數(shù)據(jù)進行加解密,保證了業(yè)務(wù)加密性能的要求,同時也由 KMS 確保了數(shù)據(jù)密鑰的隨機性和安全性。
所有的加密解密操作均由數(shù)據(jù)庫在內(nèi)存中進行,每一次數(shù)據(jù)庫重啟以及存在關(guān)閉內(nèi)存的操作時,均會重新從 KMS 獲取密鑰材料。本地存儲中不保存任何可用于解密的密鑰材料。
目前PostgreSQL社區(qū)版本并不提供數(shù)據(jù)透明加密的功能,而騰訊云數(shù)據(jù)庫PostgreSQL在內(nèi)核中實現(xiàn)了透明加密的能力,并且通過密鑰托管于用戶的KMS服務(wù)中,進一步降低了數(shù)據(jù)被破解的風(fēng)險,確保數(shù)據(jù)安全。
字段加密
數(shù)據(jù)加密是針對整體實例級別的加密功能,加密范圍大,則覆蓋范圍廣。雖然有部分業(yè)務(wù)也無需將整體實例進行加密,但需要重點針對一些特殊數(shù)據(jù)進行加密存儲。騰訊云數(shù)據(jù)庫PostgreSQL支持基于pgcrypto 插件針對字段進行加密的功能。
PostgreSQL中,pgcrypto是contrib下的一個插件,它提供了一些加密解密函數(shù),可以實現(xiàn)服務(wù)器端的數(shù)據(jù)加密解密。用戶可以在SQL語句中調(diào)用這些函數(shù)來完成數(shù)據(jù)的加密和解密。
在使用pgcrypto中的加密函數(shù)過程中,可以加密比較重要的字段,提高數(shù)據(jù)的安全性。
pgcrypto模塊提供的加密函數(shù)有以下幾類:通用Hash函數(shù),Password Hash函數(shù),PGP加密函數(shù),Raw加密函數(shù),隨機數(shù)據(jù)函數(shù)。
整體來看,字段加密可以有效地防止重點敏感數(shù)據(jù)泄露,適用于密碼、關(guān)鍵數(shù)據(jù)等加密場景。
數(shù)據(jù)脫敏
有些情況下,有些表的特定列含有敏感數(shù)據(jù)(如用戶信息表中的用戶手機號)。毫無疑問,只有指定用戶才有權(quán)限看到這些敏感數(shù)據(jù),其他用戶則只能看到脫敏后的數(shù)據(jù)。如果此時采用數(shù)據(jù)列級加密,則需要客戶端也介入進來進行實現(xiàn),否則加密和解密實現(xiàn)比較繁瑣。
為減少客戶業(yè)務(wù)代碼工作的參與,對于此類場景騰訊云數(shù)據(jù)庫PostgreSQL支持客戶直接在PostgreSQL中進行配置實現(xiàn)。
第一種方式:通過視圖脫敏的方案進行操作,如通過查詢語句,將指定字段進行字符串處理。代碼如下:
hehe => SELECT id,name,SUBSTRING(phone_number, 1,3) ||'****'||SUBSTRING(phone_number, 7,4) as phone_number FROM t;
id | name | phone_number
----+----------+--------------
1 | zhangsan | 180****2321
1 | lisi | 136****2321
1 | | 177****2423
1 | wangwu | 177****2423
(4 rows)
第二種方式:通過postgresql_anonymizer插件能力實現(xiàn),實現(xiàn)對數(shù)據(jù)脫敏的需求。
行級安全策略
RLS(ROW Level Security) 是PostgreSQL 9.5版本之后的新增特性,提供了基于行的安全策略,限制數(shù)據(jù)庫用戶的查看表數(shù)據(jù)權(quán)限。在其他數(shù)據(jù)庫中,對用戶的權(quán)限管控均在表級別,例如:限制某個用戶只能查詢某個表。而采用RLS后,不同的用戶訪問一個表可以看到不同的數(shù)據(jù)。
默認情況下,表沒有任何安全策略限制。這樣用戶根據(jù) SQL 特權(quán)系統(tǒng)具有對表的訪問特權(quán),對于查詢或更新來說其中所有的行都是平等的。當(dāng)在一個表上啟用行安全性時,所有對該表選擇行或者修改行的普通訪問都必須被一條行安全性策略所允許(不過,表的擁有者通常不服從行安全性策略。如果表上不存在安全策略,如果沒有配置安全策略,所有的數(shù)據(jù)查詢和更新都會禁止,但是對全表進行操作的命令,比如 TRUNCATE 和 REFERENCES 不受影響。
行安全性策略可以針對特定的命令、角色或者兩者。一條策略可以被指定為適用于ALL命令,或者查詢(SELECT)、 插入(INSERT)、更新(UPDATE)或者刪除(DELETE)。同一個策略可分配多個角色,并且通常的角色成員關(guān)系和繼承規(guī)則也適用。
行級安全策略可適用于在針對多個數(shù)據(jù)混合存儲于同一張表內(nèi),又需要根據(jù)用戶類型進行查看或者讀寫權(quán)限進行分類限制的場景。騰訊云數(shù)據(jù)庫PostgreSQL通過行級安全策略則可以有效避免數(shù)據(jù)被意外篡改和操作,最大程度上保護數(shù)據(jù)安全。
實例安全
安全組訪問策略
安全組是一種有狀態(tài)的包含過濾功能的虛擬防火墻,用于設(shè)置單臺或多臺云數(shù)據(jù)庫的網(wǎng)絡(luò)訪問控制,是騰訊云數(shù)據(jù)庫提供的重要網(wǎng)絡(luò)安全隔離手段。安全組是一個邏輯上的分組,客戶可以將同一地域內(nèi)具有相同網(wǎng)絡(luò)安全隔離需求的云數(shù)據(jù)庫實例加到同一個安全組內(nèi)。
安全組訪問策略可以有效的控制訪問數(shù)據(jù)庫的來源IP地址,設(shè)置黑白名單,允許指定的網(wǎng)絡(luò)段、IP地址訪問,拒絕風(fēng)險地址的訪問。
角色權(quán)限訪問控制
在大企業(yè)中,數(shù)據(jù)庫資源面向不同的業(yè)務(wù)提供服務(wù),而不同的業(yè)務(wù)隸屬于不同的小組或者部門,此時如何在統(tǒng)一的賬號下管理不同的業(yè)務(wù)資源就成為了安全權(quán)限管理的一大難題。
騰訊云數(shù)據(jù)庫PostgreSQL訪問管理 CAM 則可以用于幫助客戶安全管理騰訊云賬戶下資源的訪問權(quán)限。通過 CAM,客戶可以創(chuàng)建、管理和銷毀用戶(組),并通過身份管理和策略管理控制指定用戶可以使用的騰訊云資源,進而達到權(quán)限分離的目的。這種權(quán)限管理方式是典型的PBAC(基于策略的訪問控制),可以實現(xiàn)資源級粒度的控制。
客戶可以通過子帳號實現(xiàn)不同的賬號管理不同的服務(wù)來規(guī)避以上的問題。默認情況下,子帳號沒有使用云服務(wù)的權(quán)利或者相關(guān)資源的權(quán)限。因此,騰訊云數(shù)據(jù)庫PostgreSQL支持創(chuàng)建策略來允許子帳號使用他們所需要的資源或權(quán)限。針對某一個用戶、某一個資源、某一個操作均可以做到精細化的控制。進而避免越權(quán)操作,讓所有的用戶僅可操作自己權(quán)限范圍內(nèi)的資源。
網(wǎng)絡(luò)隔離
云數(shù)據(jù)庫 PostgreSQL 支持使用私有網(wǎng)絡(luò)來實現(xiàn)更高程度的網(wǎng)絡(luò)隔離控制,搭配使用安全組和私有網(wǎng)絡(luò)將極大提升訪問 PostgreSQL實例的安全性。
私有網(wǎng)絡(luò)是用戶在騰訊云上建立的一塊邏輯隔離的網(wǎng)絡(luò)空間。在私有網(wǎng)絡(luò)內(nèi),用戶可以自由定義網(wǎng)段劃分、IP 地址和路由策略,進而實現(xiàn)資源級的網(wǎng)絡(luò)隔離。
部署在私有網(wǎng)絡(luò)中的 PostgreSQL實例默認只能被同一個私有網(wǎng)絡(luò)中的 CVM 訪問,若 CVM 與 PostgreSQL實例不在同一個私有網(wǎng)絡(luò),也可以通過申請外網(wǎng)的方式進行訪問,考慮到網(wǎng)絡(luò)安全的問題,不建議采用外網(wǎng)的方式進行數(shù)據(jù)庫訪問,若必須采用外網(wǎng)訪問 PostgreSQL實例,請配合安全組來實現(xiàn)客戶端的訪問控制。
VPC的網(wǎng)絡(luò)基礎(chǔ)設(shè)施還可以防止DDoS攻擊。當(dāng)用戶使用外網(wǎng)連接和訪問 PostgreSQL實例時,可能會遭受 DDoS 攻擊。針對這一問題,騰訊云數(shù)據(jù)庫提供流量清洗和封堵處理功能,完全由系統(tǒng)自動觸發(fā)和結(jié)束。當(dāng)騰訊云數(shù)據(jù)庫安全系統(tǒng)認為用戶實例正在遭受 DDoS 攻擊時,首先會啟動流量清洗功能,如果流量清洗無法抵御攻擊或者攻擊達到封堵閾值,則會進行封堵處理。
實例刪除防呆
“刪庫跑路” 是在數(shù)據(jù)庫行業(yè)中經(jīng)常被人拿出來調(diào)侃的一句話,其核心原因就是在于傳統(tǒng)數(shù)據(jù)庫的管理手段單一,很容易出現(xiàn)運維人員對實例進行刪除,導(dǎo)致實際業(yè)務(wù)受到巨大損失。
云上數(shù)據(jù)庫支持實例回收站能力,當(dāng)用戶出現(xiàn)了實例刪除,并不會直接將數(shù)據(jù)完全清理,而是會在回收站呆上幾天。這樣避免了誤操作或者惡意操作導(dǎo)致的實例無法回收情況。當(dāng)實例進入回收站后,業(yè)務(wù)出現(xiàn)異常無法訪問,則可幫助客戶及時發(fā)現(xiàn)問題,進而抓緊時間挽救。
同時騰訊云數(shù)據(jù)庫結(jié)合云安全訪問策略,使實例的隔離與下線接口掌握在不同權(quán)限的負責(zé)人手中。這樣做可對高危操作進行管理隔離,避免單一人員風(fēng)險導(dǎo)致的數(shù)據(jù)庫安全問題。
除了通過訪問控制策略之外,騰訊云數(shù)據(jù)庫還可以基于商業(yè)流程服務(wù)BPaaS 與云函數(shù)SCF的結(jié)合形式,在云上實現(xiàn)審批流服務(wù),使高危操作都受到審批流的管理。
整體來看,以上數(shù)據(jù)庫實例安全的防呆措施,可避免95%以上的實例意外風(fēng)險,充分保障數(shù)據(jù)庫的穩(wěn)定運行。
總結(jié)
數(shù)據(jù)庫安全能力提升任重道遠,如何確保數(shù)據(jù)庫在正常對外提供服務(wù)的同時,不斷提高安全防護能力也是騰訊云數(shù)據(jù)庫一直以來在創(chuàng)新突破的目標(biāo)。
如今,騰訊云數(shù)據(jù)庫豐富的安全策略組合,可幫助客戶有效降低在數(shù)據(jù)庫安全方面的投入成本,使得客戶輕松享用一系列安全能力。