日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

TXSQL企业级特性揭秘:加密与审计

發布時間:2024/2/28 数据库 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TXSQL企业级特性揭秘:加密与审计 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言:TXSQL是騰訊基礎架構部數據庫團隊自研的MySQL分支,對騰訊云以及眾多的內部業務提供了強大的數據庫內核支撐。相比原生的MySQL,TXSQL在BINLOG復制和InnoDB存儲引擎方面做了很多的優化,另外在Server層面也做了大量的工作。因此TXSQL擁有更好的性能,更好的穩定性和可維護性,以及更多的企業級特性。本文將對加密和審計這兩個企業級特性進行詳細的解讀。

?

一、加密


?

這里的加密是指對存儲在磁盤上數據的進行加密。對數據的通信進行加密MySQL很早就開始支持了。數據的加密操作是可以脫離數據庫進行的,比如用戶在插入一條數據時,對該數據進行加密;檢索數據時,再對該數據進行解密操作。這樣做存在兩個問題:其一,加密數據在數據庫中的查詢效率低下:加密數據在數據庫中很難進行相似性(like)查詢,以及進行范圍查詢。其二,加密密鑰的安全性問題由用戶保證:密鑰由用戶維護和管理,增加了安全的風險和維護的難度。

?

1.1 MySQL數據加密

MySQL在5.7版本推出數據加密功能:透明數據加密(Transparent Data Encryption)。透明加密是指數據的加解密操作對用戶透明。用戶在創建加密表時,不用指定加密密鑰。數據在寫盤時加密,在讀盤時解密。目前透明數據加密只支持InnoDB存儲引擎。下面的語句創建了一個加密表:

CREATE TABLE t1 (c1 INT) ENGINE=InnoDBENCRYPTION='Y';


其中,ENCRYPTION='Y'表示對該表的數據進行加密。那么數據是如何進行加解密的呢?

?

1.1.1兩層密鑰體系

我們在創建加密表的時候,會自動生成一個隨機的表空間密鑰(Tablespace Key)。數據由表空間密鑰保護。當我們在加密表中插入一條記錄,記錄以明文插入到緩沖區(Buffer Pool)的數據頁中。當數據頁要寫盤時,通過表空間密鑰,對該頁上的所有數據記錄進行加密后再寫盤。當請求的數據頁不在緩沖區時,數據頁從磁盤讀入,通過表空間密鑰,對數據頁中所有記錄進行解密之后,加入到緩沖區中。一句話:數據頁在緩沖區中是明文,在磁盤上是密文。另外數據加密采用的加密算法是AES256。

?


表空間密鑰是如何保存的?MySQL有一個全局的主密鑰(Master Key), 主密鑰有對應的ID(Master Key ID)。表空間密鑰由主密鑰保存。當表空間密鑰生成后,通過主密鑰加密,寫入到表空間的第一個數據頁中,和加密后的表空間密鑰一同保存的還有主密鑰的ID。當表空間第一次打開時,讀取第一個數據頁,通過主密鑰ID,得到主密鑰;然后通過主密鑰對表空間密鑰進行解密。

??

當系統運行之后,第一次創建加密表之前,全局的主密鑰為空。創建加密表時,當主密鑰為空,InnoDB會自動生成一個主密鑰ID,由固定前綴加server uuid以及序號組成。通過主密鑰管理接口,為主密鑰ID生成一個對應的主密鑰。

?

1.1.2 ?KEYRING密鑰管理框架

主密鑰的管理則是通過MySQL的KEYRING插件框架進行的。主要有四個接口:?

  • l? my_key_fetch

    my_bool

    my_key_fetch(const char *key_id, const char **key_type, const char* user_id,

    ??????????? void **key, size_t *key_len);

  • l? my_key_generate

    my_bool

    my_key_generate(const char *key_id, const char *key_type,

    ??????????????? const char *user_id, size_t key_len);

  • l? my_key_remove

    l? my_key_store

?

我們可以把KEYRING框架理解為一個簡單的Key-Value的store。上述InnoDB內部生成主密鑰的過程是通過調用my_key_generate和my_key_fetch完成。

?

MySQL社區版本提供KEYRING插件的一個簡單的文件實現:KEYRING_FILE。密鑰保存在文件中,通常叫keyring_file。這種實現方式非常不安全。當加密的表空間文件和keyring_file一同被拷貝出去,那么加密的表空間文件是可以正常讀取的。

?

MySQL商業版提供KEYRING插件的另外一種實現:KEYRING_OKV。密鑰保存在ORACLE Key Vault中,確保密鑰的安全性。

?

1.2 ?TXSQL數據加密

在TXSQL中,我們沿用MySQL的透明加密體系,提供 KEYRING插件的另外一種實現:KEYRING_KMS。將KEYRING與企業級的KMS(Key Management Service) 集成。

?

KMS是騰訊云一項保護數據及密鑰安全的密鑰服務。服務涉及的各個流程均采用高安全性協議通信,保證服務高安全;提供分布式集群管理和熱備份,保證服務高可靠和高可用。KMS也采用的是兩層密鑰體系。KMS涉及兩類密鑰,即用戶主密鑰(CMK)與數據密鑰(Datakey)。用戶主密鑰用于加密數據密鑰或密碼、證書、配置文件等小包數據(最多 4KB)。數據密鑰用于加密業務數據。海量的業務數據在存儲或通信過程中使用數據密鑰以對稱加密的方式加密,而數據密鑰又通過用戶主密鑰采用非對稱加密方式加密保護。

?

通過API調用KMS接口時,首先創建用戶主密鑰;然后創建數據密鑰。CMK的個數限制為128,而數據密鑰則無此限制。在KEYRING_KMS實現上,MySQL的主密鑰和KMS的數據密鑰對應。由于KMS接口的限制和實際需要,我們只實現了KEYRING的兩個接口:my_key_generate和my_key_fetch。

?

我們依然保留MySQL兩層密鑰體系,我們只是用KMS來實現了主密鑰的管理,但沒有使用KMS來進行數據的加密。主要考慮有兩點:一是系統可用性方面的考慮,比如萬一KMS短時不可用,那么加密數據將無法訪問;二是系統性能方面的考慮,所有數據的加解密都通過KMS,加解密效率和網絡開銷無疑對系統影響巨大

?

1.2.1 Key Generate

在KEYRING_KMS中,我們同樣有一個本地文件,用來存儲密鑰ID和加密后的數據密鑰。這個加密后的數據密鑰是由KMS返回,所以解密這個數據密鑰也需要通過KMS來做。在下圖的流程中,我們通過固定的CMK別名(alias)來獲取或創建CMK,然后產生數據密鑰,將加密后的數據密鑰保存在本地文件中。

?

1.2.2 ?Key Fetch

獲取密鑰首先根據密鑰ID從文件中讀取加密后的數據密鑰,再通過KMS對數據密鑰進行解密,獲取密鑰明文。KMS進行解密時,只需要提供密文,不要需要其他信息。獲取密鑰明文成功之后,我們對密鑰明文進行了緩存,減少對KMS的訪問。


1.2.3 ?基于角色的訪問控制

在用戶開啟加密功能時,在CAM中,為用戶創建了一個可以訪問KMS的角色(role),并將此角色的權限授予指定的控制臺用戶。我們通過訪問CAM獲取臨時證書(secret key, secret id,token),通過臨時證書來訪問KMS。其中CAM是騰訊云提供的訪問控制服務。

?

如果不采用角色訪問控制,在開啟加密的時候,需要用戶提供自己的證書。其一,用戶體驗差,其二,用戶證書的安全性差。

?

還有一點值得注意:InnoDB中使用的主密鑰是可以輪換的。通過如下語句進行輪換:

ALTER INSTANCE ROTATE INNODB MASTER KEY;

主密鑰的輪換過程:

1. ?產生新的主密鑰ID;

2. ?獲取新的主密鑰(keygenerate);

3. ?對所有加密表空間,執行步驟4,5

4. ?對加密的表空間,用舊的主密鑰解密表空間密鑰;

5. ?用新的主密鑰加密表空間密鑰。


主密鑰的輪換,進一步提高了系統的安全性。

?

通過以上介紹,我們可以看到,TXSQL透明數據加密,將KMS和CAM有機的結合在一起,對訪問控制,密鑰管理和數據加密等各個環節進行嚴格把控,為用戶在騰訊云上提供了一個完整、安全、可靠的數據加密解決方案。


二、審計


數據庫審計也是數據庫安全的重要一環。所謂審計,就是對用戶在數據庫中的操作和行為進行記錄,基于這些記錄,可以進行審查分析。我們可以通過審計記錄來對一個非法操作進行追查;對數據庫性能和運行狀態進行(也可以通過系統監控獲得);可以對用戶的訪問模式進行跟蹤建模等等。這些事后的分析可以幫助我們發現數據庫運行過程中的風險,發出告警,以及采取必要的干預措施。

?

2.1 MySQL審計

MySQL同樣提供了一個審計插件(AuditPlugin)框架。在框架內部主要處理函數為:

int (*event_notify)(MYSQL_THD, mysql_event_class_t, const void *);

?

在Server層面,從系統啟動,用戶登錄,到SQL執行的各個節點,以事件的方式,通知審計插件進行記錄。以下是事件類型的例子:

  • MYSQL_AUDIT_CONNECTION_PRE_AUTHENTICATE

  • ?MYSQL_AUDIT_CONNECTION_CONNECT

  • ?MYSQL_AUDIT_CONNECTION_DISCONNECT

  • ?MYSQL_AUDIT_CONNECTION_DISCONNECT

  • ?MYSQL_AUDIT_COMMAND_START

  • ?MYSQL_AUDIT_COMMAND_END


MySQL社區版只提供審計插件的范例,而在MySQL商業版中提供企業級審計功能。

?

2.2 TXSQL審計

TXSQL的重要用戶有對審計功能的迫切需求:用戶需要對數據庫操作進行事后的跟蹤和分析。我們利用審計插件框架,綜合考慮功能和性能,提供了一套全新的審計解決方案。

?

2.2.1 審計架構

我們整個審計框架的示意圖

?

用戶連接(session)產生的審計記錄被寫入到一片固定的內存中;專門的寫盤線程(Flush Thread)將內存中的審計記錄寫入到審計文件中(Audit File);審計代理(Audit Agent)則讀取審計文件,將審計記錄發送到審計日志中心:CTSDB集群進行集中存儲。其中,一個TXSQL實例對應一個寫盤線程,一個審計代理服務多個TXSQL實例,一臺物理機上只有一個審計代理。

?

CTSDB是騰訊基礎架構部數據庫團隊研發的時間序列數據庫(目前可以在騰訊云上申請試用)。審計數據又恰好是時間序列數據。選擇CTSDB來存儲審計數據帶來的好處有:其一數據壓縮率高;其二數據吞吐量大;其三數據分析能力強。完全滿足我們在高壓力情況下,對審計數據的處理和分析能力。

?

2.2.2 審計日志格式

我們采用json格式對審計日志傳輸。記錄的內容有時間戳,影響的行數,執行的時間,錯誤碼,規則號,主機,實例名,用戶名,數據庫名,過濾策略名,SQL語句,以及SQL類型等。

?

2.2.3 審計過濾規則

考慮到審計日志量巨大,提供過濾規則就很必要。我們提供如下過濾規則

1. ?主機IP,用戶名,數據庫名,表名可以使用“include, exclude, =, <>, regex”進行過濾;

2. ?SQL語句可以使用“include,exclude, regex”進行過濾;

3. ?SQL類型可以使用“=,<>”進行過濾;

4. ?影響函數和之行時間可以使用“>, <, >=, <=, =”進行過濾。

?

2.2.4 審計性能

為了減少審計帶來的性能損失,我們只對命令執行完之后的結果進行審計。這樣就省去了很大一部分的審計日志。根據我們的測試,打開審計并進行全量審計(Audit all)時,系統性能損失9%;打開審計并且不進行審計(Audit null)時,性能損失約為3%。

?

三、小結



TXSQL在實現加密和審計這兩個企業級特性,是對用戶需求的積極響應。在實現上,也充分結合與騰訊云內其他平臺進行結合,提供一站式的解決方案。為了給用戶提供性能更好,功能更強,可用性更高的數據庫服務,TXSQL一直在努力。另外,TXSQL?關于加密和審計的開源工作也在進行著中,已經初步和?MariaDB?達成了相關合作,在不久的將來里,這兩個企業級的功能就能與大家在開源版本中見面。


總結

以上是生活随笔為你收集整理的TXSQL企业级特性揭秘:加密与审计的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。