簡介
上一節我們介紹了 TDengine 安全部署配置建議,除了傳統的這些配置外,TDengine 還有其他的安全策略,例如 IP 白名單、審計日志、數據加密等,這些都是 TDengine Enterprise 特有功能,其中白名單功能在 3.2.0.0 版本首次發布,審計日志在 3.1.1.0 版本中首次發布,數據庫加密在 3.3.0.0 中首次發布,建議使用最新版本。
IP 白名單
IP 白名單是一種網絡安全技術,它使 IT 管理員能夠控制“誰”可以訪問系統和資源,提升數據庫的訪問安全性,避免外部的惡意攻擊。IP 白名單通過創建可信的 IP 地址列表,將它們作為唯一標識符分配給用戶,并且只允許這些 IP 地址訪問目標服務器。請注意,用戶權限與 IP 白名單是不相關的,兩者分開管理。下面是配置 IP 白名單的具體方法。
增加 IP 白名單的 SQL 如下。
create user test pass password [sysinfo value] [host host_name1[,host_name2]]
alter user test add host host_name1
查詢 IP 白名單的 SQL 如下。
SELECT TEST, ALLOWED_HOST FROM INS_USERS;
SHOW USERS;
刪除 IP 白名單的命令如下。
ALTER USER TEST DROP HOST HOST_NAME1
說明
- 開源版和企業版本都能添加成功,且可以查詢到,但是開源版本不會對 IP 做任何限制。
create user u_write pass 'taosdata1' host 'iprange1','iprange2'
,可以一次添加多個 ip range,服務端會做去重,去重的邏輯是需要 ip range 完全一樣- 默認會把
127.0.0.1
添加到白名單列表,且在白名單列表可以查詢 - 集群的節點 IP 集合會自動添加到白名單列表,但是查詢不到。
- taosadaper 和 taosd 不在一個機器的時候,需要把 taosadaper IP 手動添加到 taosd 白名單列表中
- 集群情況下,各個節點 enableWhiteList 成一樣,或者全為 false,或者全為 true,要不然集群無法啟動
- 白名單變更生效時間 1s,不超過 2s,每次變更對收發性能有些微影響(多一次判斷,可以忽略),變更完之后、影響忽略不計,變更過程中對集群沒有影響,對正在訪問客戶端也沒有影響(假設這些客戶端的 IP 包含在 white list 內)
- 如果添加兩個 ip range,192.168.1.1/16(假設為 A),192.168.1.1/24(假設為 B),嚴格來說,A 包含了 B,但是考慮情況太復雜,并不會對 A 和 B 做合并
- 要刪除的時候,必須嚴格匹配。也就是如果添加的是 192.168.1.1/24,要刪除也是 192.168.1.1/24
- 只有 root 才有權限對其他用戶增刪 ip white list
- 兼容之前的版本,但是不支持從當前版本回退到之前版本
- x.x.x.x/32 和 x.x.x.x 屬于同一個 iprange,顯示為 x.x.x.x
- 如果客戶端拿到的 0.0.0.0/0,說明沒有開啟白名單
- 如果白名單發生了改變,客戶端會在 heartbeat 里檢測到。
- 針對一個 user,添加的 IP 個數上限是 2048
審計日志
TDengine 先對用戶操作進行記錄和管理,然后將這些作為審計日志發送給 taosKeeper,再由 taosKeeper 保存至任意 TDengine 集群。管理員可通過審計日志進行安全監控、歷史追溯。TDengine 的審計日志功能開啟和關閉操作非常簡單,只須修改 TDengine 的配置文件后重啟服務。審計日志的配置說明如下。
taosd 配置
審計日志由數據庫服務 taosd 產生,其相應參數要配置在 taos.cfg 配置文件中,詳細參數如下表。
參數名稱 | 參數含義 |
---|---|
audit | 是否打開審計日志,1 為開啟,0 為關閉,默認值為 0。 |
monitorFqdn | 接收審計日志的 taosKeeper 所在服務器的 FQDN |
monitorPort | 接收審計日志的 taosKeeper 服務所用端口 |
monitorCompaction | 上報數據時是否進行壓縮 |
taosKeeper 配置
在 taosKeeper 的配置文件 keeper.toml 中配置與審計日志有關的配置參數,如下表所示
參數名稱 | 參數含義 |
---|---|
auditDB | 用于存放審計日志的數據庫的名字,默認值為 “audit”,taosKeeper 在收到上報的審計日志后會判斷該數據庫是否存在,如果不存在會自動創建 |
數據格式
上報的審計日志格式如下
{"ts": timestamp,"cluster_id": string,"user": string,"operation": string,"db": string,"resource": string,"client_add": string,"details": string
}
表結構
taosKeeper 會依據上報的審計數據在相應的數據庫中自動建立超級表用于存儲數據。該超級表的定義如下
create stable operations(ts timestamp, details varchar(64000), user varchar(25), operation varchar(20), db varchar(65), resource varchar(193), client_add(25)) tags (clusterID varchar(64) );
其中
- db 為操作涉及的 database,resource 為操作涉及的資源。
- user 和 operation 為數據列,表示哪個用戶在該對象上進行了什么操作
- timestamp 為時間戳列,表示操作發生時的時間
- details 為該操作的一些補充細節,在大多數操作下是所執行的操作的 SQL 語句。
- client_add 為客戶端地址,包括 ip 和端口
操作列表
目前審計日志中所記錄的操作列表以及每個操作中各字段的含義(因為每個操作的施加者,即 user、client_add、時間戳字段在所有操作中的含義相同,下表不再描述)
操作 | Operation | DB | Resource | Details |
---|---|---|---|---|
create database | createDB | db name | NULL | SQL |
alter database | alterDB | db name | NULL | SQL |
drop database | dropDB | db name | NULL | SQL |
create stable | createStb | db name | stable name | SQL |
alter stable | alterStb | db name | stable name | SQL |
drop stable | dropStb | db name | stable name | SQL |
create user | createUser | NULL | 被創建的用戶名 | 用戶屬性參數, (password 除外) |
alter user | alterUser | NULL | 被修改的用戶名 | 修改密碼記錄被修改的參數和新值 (password 除外),其他操作記錄 SQL |
drop user | dropUser | NULL | 被刪除的用戶名 | SQL |
create topic | createTopic | topic 所在 DB | 創建的 topic 名字 | SQL |
drop topic | cropTopic | topic 所在 DB | 刪除的 topic 名字 | SQL |
create dnode | createDnode | NULL | IP:Port 或 FQDN:Port | SQL |
drop dnode | dropDnode | NULL | dnodeId | SQL |
alter dnode | alterDnode | NULL | dnodeId | SQL |
create mnode | createMnode | NULL | dnodeId | SQL |
drop mnode | dropMnode | NULL | dnodeId | SQL |
create qnode | createQnode | NULL | dnodeId | SQL |
drop qnode | dropQnode | NULL | dnodeId | SQL |
login | login | NULL | NULL | appName |
create stream | createStream | NULL | 所創建的 stream 名 | SQL |
drop stream | dropStream | NULL | 所刪除的 stream 名 | SQL |
grant privileges | grantPrivileges | NULL | 所授予的用戶 | SQL |
remove privileges | revokePrivileges | NULL | 被收回權限的用戶 | SQL |
compact database | compact | database name | NULL | SQL |
balance vgroup leader | balanceVgroupLead | NULL | NULL | SQL |
restore dnode | restoreDnode | NULL | dnodeId | SQL |
restribute vgroup | restributeVgroup | NULL | vgroupId | SQL |
balance vgroup | balanceVgroup | NULL | vgroupId | SQL |
create table | createTable | db name | NULL | table name |
drop table | dropTable | db name | NULL | table name |
查看審計日志
在 taosd 和 taosKeeper 都正確配置并啟動之后,隨著系統的不斷運行,系統中的各種操作(如上表所示)會被實時記錄并上報,用戶可以登錄 taosExplorer,點擊系統管理→審計頁面,即可查看審計日志; 也可以在 TDengine CLI 中直接查詢相應的庫和表。
數據加密
TDengine 支持透明數據加密(Transparent Data Encryption,TDE),通過對靜態數據文件進行加密,阻止可能的攻擊者繞過數據庫直接從文件系統讀取敏感信息。數據庫的訪問程序是完全無感知的,應用程序不需要做任何修改和編譯,就能夠直接應用到加密后的數據庫,支持國標 SM4 等加密算法。在透明加密中,數據庫密鑰管理、數據庫加密范圍是兩個最重要的話題。TDengine 采用機器碼對數據庫密鑰進行加密處理,保存在本地而不是第三方管理器中。當數據文件被拷貝到其他機器后,由于機器碼發生變化,無法獲得數據庫密鑰,自然無法訪問數據文件。TDengine 對所有數據文件進行加密,包括預寫日志文件、元數據文件和時序數據文件。加密后,數據壓縮率不變,寫入性能和查詢性能僅有輕微下降。
配置密鑰
密鑰配置分離線設置和在線設置兩種方式。
方式一,離線設置。通過離線設置可為每個節點分別配置密鑰,命令如下。
taosd -y {encryptKey}
方式二,在線設置。當集群所有節點都在線時,可以使用 SQL 配置密鑰,SQL 如下。
create encrypt_key {encryptKey};
在線設置方式要求所有已經加入集群的節點都沒有使用過離線設置方式生成密鑰,否則在線設置方式會失敗,在線設置密鑰成功的同時也自動加載和使用了密鑰。
創建加密數據庫
TDengine 支持通過 SQL 創建加密數據庫,SQL 如下。
create database [if not exists] db_name [database_options]
database_options:database_option ...
database_option: {encrypt_algorithm {'none' |'sm4'}
}
主要參數說明如下。
- encrypt_algorithm:指定數據采用的加密算法。默認是 none,即不采用加密。sm4 表示采用 SM4 加密算法
查看加密配置
用戶可通過查詢系統數據庫 ins_databases 獲取數據庫當前加密配置,SQL 如下。
select name, `encrypt_algorithm` from ins_databases;name | encrypt_algorithm |
=====================================================power1 | none |power | sm4 |
查看節點密鑰狀態
通過以下的 SQL 命令參看節點密鑰狀態。
show encryptions;select * from information_schema.ins_encryptions;dnode_id | key_status |
===============================================1 | loaded |2 | unset |3 | unknown |
key_status 有三種取值:
- 當節點未設置密鑰時,狀態列顯示 unset。
- 當密鑰被檢驗成功并且加載后,狀態列顯示 loaded。
- 當節點未啟動,key 的狀態無法被探知時,狀態列顯示 unknown。
更新密鑰配置
當節點的硬件配置發生變更時,需要通過以下命令更新密鑰,與離線配置密鑰的命令相同。
taosd -y {encryptKey}
更新密鑰配置,需要先停止 taosd,并且使用完全相同的密鑰,也即密鑰在數據庫創建后不能修改。
訪問官網
更多內容歡迎訪問 TDengine 官網