背景
TDengine 的分布式、多組件特性導致 TDengine 的安全配置是生產系統中比較關注的問題。本文檔旨在對 TDengine 各組件及在不同部署方式下的安全問題進行說明,并提供部署和配置建議,為用戶的數據安全提供支持。
安全配置涉及組件
TDengine 包含多個組件,有:
taosd
:內核組件。taosc
:客戶端庫。taosAdapter
:REST API 和 WebSocket 服務。taosKeeper
:監控服務組件。taosX
:數據管道和備份恢復組件。taosxAgent
:外部數據源數據接入輔助組件。taosExplorer
:Web 可視化管理界面。
與 TDengine 部署和應用相關,還會存在以下組件:
- 通過各種連接器接入并使用 TDengine 數據庫的應用。
- 外部數據源:指接入 TDengine 的其他數據源,如 MQTT、OPC、Kafka 等。
各組件關系如下:
關于各組件的詳細介紹,請參考 組件介紹。
TDengine 安全設置
taosd
taosd 集群間使用 TCP 連接基于自有協議進行數據交換,風險較低,但傳輸過程不是加密的,仍有一定安全風險。
啟用壓縮可能對 TCP 數據混淆有幫助。
- compressMsgSize:是否對 RPC 消息進行壓縮,整數,可選:-1:所有消息都不壓縮;0:所有消息都壓縮;N (N>0):只有大于 N 個字節的消息才壓縮。
為了保證數據庫操作可追溯,建議啟用審計功能。
- audit:審計功能開關,0 為關,1 為開。默認打開。
- auditInterval:上報間隔,單位為毫秒。默認 5000。
- auditCreateTable:是否針對創建子表開啟申計功能。0 為關,1 為開。默認打開。
為保證數據文件安全,可啟用數據庫加密。
- encryptAlgorithm:數據加密算法。
- encryptScope:數據加密范圍。
啟用白名單可限制訪問地址,進一步增強私密性。
- enableWhiteList:白名單功能開關,0 為關,1 為開;默認關閉。
taosc
用戶和其他組件與 taosd
之間使用原生客戶端庫(taosc)和自有協議進行連接,數據安全風險較低,但傳輸過程仍然不是加密的,有一定安全風險。
taosAdapter
taosadapter 與 taosd 之間使用原生客戶端庫(taosc)和自有協議進行連接,同樣支持 RPC 消息壓縮,不會造成數據安全問題。
應用和其他組件通過各語言連接器與 taosadapter 進行連接。默認情況下,連接是基于 HTTP 1.1 且不加密的。要保證 taosadapter 與其他組件之間的數據傳輸安全,需要配置 SSL 加密連接。在 /etc/taos/taosadapter.toml
配置文件中修改如下配置:
[ssl]
enable = true
certFile = "/path/to/certificate-file"
keyFile = "/path/to/private-key"
在連接器中配置 HTTPS/SSL 訪問方式,完成加密訪問。
為進一步增強安全性,可啟用白名單功能,在 taosd
中配置,對 taosdapter 組件同樣生效。
taosX
taosX
對外包括 REST API 接口和 gRPC 接口,其中 gRPC 接口用于 taos-agent 連接。
- REST API 接口是基于 HTTP 1.1 且不加密的,有安全風險。
- gRPC 接口基于 HTTP 2 且不加密,有安全風險。
為了保證數據安全,建議 taosX API 接口僅限內部訪問。在 /etc/taos/taosx.toml
配置文件中修改如下配置:
[serve]
listen = "127.0.0.1:6050"
grpc = "127.0.0.1:6055"
從 TDengine 3.3.6.0 開始,taosX 支持 HTTPS 連接,在 /etc/taos/taosx.toml
文件中添加如下配置:
[serve]
ssl_cert = "/path/to/server.pem"
ssl_key = "/path/to/server.key"
ssl_ca = "/path/to/ca.pem"
并在 Explorer 中修改 API 地址為 HTTPS 連接:
# taosX API 本地連接
x_api = "https://127.0.01:6050"
# Public IP 或者域名地址
grpc = "https://public.domain.name:6055"
taosExplorer
與 taosAdapter
組件相似,taosExplorer
組件提供 HTTP 服務對外訪問。在 /etc/taos/explorer.toml
配置文件中修改如下配置:
[ssl]
# SSL certificate file
certificate = "/path/to/ca.file"# SSL certificate private key
certificate_key = "/path/to/key.file"
之后,使用 HTTPS 進行 Explorer 訪問,如 https://192.168.12.34 。
taosxAgent
taosX 啟用 HTTPS 后,Agent 組件與 taosx 之間使用 HTTP 2 加密連接,使用 Arrow-Flight RPC 進行數據交換,傳輸內容是二進制格式,且僅注冊過的 Agent 連接有效,保障數據安全。
建議在不安全網絡或公共網絡環境下的 Agent 服務,始終開啟 HTTPS 連接。
taosKeeper
taosKeeper 使用 WebSocket 連接與 taosadpater 通信,將其他組件上報的監控信息寫入 TDengine。
taosKeeper
當前版本存在安全風險:
- 監控地址不可限制在本機,默認監控 所有地址的 6043 端口,存在網絡攻擊風險。使用 Docker 或 Kubernetes 部署不暴露 taosKeeper 端口時,此風險可忽略。
- 配置文件中配置明文密碼,需要降低配置文件可見性。在
/etc/taos/taoskeeper.toml
中存在:
[tdengine]
host = "localhost"
port = 6041
username = "root"
password = "taosdata"
usessl = false
安全增強
我們建議使用在局域網內部使用 TDengine。
如果必須在局域網外部提供訪問,請考慮添加以下配置:
負載均衡
使用負載均衡對外提供 taosAdapter 服務。
以 Nginx 為例,配置多節點負載均衡:
http {server {listen 6041;location / {proxy_pass http://websocket;# Headers for websocket compatibleproxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection $connection_upgrade;# Forwarded headersproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;proxy_set_header X-Forwarded-Host $host;proxy_set_header X-Forwarded-Port $server_port;proxy_set_header X-Forwarded-Server $hostname;proxy_set_header X-Real-IP $remote_addr;}}upstream websocket {server 192.168.11.61:6041;server 192.168.11.62:6041;server 192.168.11.63:6041;}
}
如果 taosAdapter 組件未配置 SSL 安全連接,還需要配置 SSL 才能保證安全訪問。SSL 可以配置在更上層的 API Gateway,也可以配置在 Nginx 中;如果你對各組件之間的安全性有更強的要求,您可以在所有組件中都配置 SSL。Nginx 配置如下:
http {server {listen 443 ssl;ssl_certificate /path/to/your/certificate.crt;ssl_certificate_key /path/to/your/private.key;}
}
安全網關
在現在互聯網生產系統中,安全網關使用也很普遍。traefik 是一個很好的開源選擇,我們以 traefik 為例,解釋在 API 網關中的安全配置。
Traefik 中通過 middleware 中間件提供多種安全配置,包括:
- 認證(Authentication):Traefik 提供 BasicAuth、DigestAuth、自定義認證中間件、OAuth 2.0 等多種認證方式。
- IP 白名單(IPWhitelist):限制允許訪問的客戶端 IP。
- 頻率限制(RateLimit):控制發送到服務的請求數。
- 自定義 Headers:通過自定義 Headers 添加
allowedHosts
等配置,提高安全性。
一個常見的中間件示例如下:
labels:- "traefik.enable=true"- "traefik.http.routers.tdengine.rule=Host(`api.tdengine.example.com`)"- "traefik.http.routers.tdengine.entrypoints=https"- "traefik.http.routers.tdengine.tls.certresolver=default"- "traefik.http.routers.tdengine.service=tdengine"- "traefik.http.services.tdengine.loadbalancer.server.port=6041"- "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"- "traefik.http.middlewares.check-header.headers.customrequestheaders.X-Secret-Header=SecretValue"- "traefik.http.middlewares.check-header.headers.customresponseheaders.X-Header-Check=true"- "traefik.http.middlewares.tdengine-ipwhitelist.ipwhitelist.sourcerange=127.0.0.1/32, 192.168.1.7"- "traefik.http.routers.tdengine.middlewares=redirect-to-https,check-header,tdengine-ipwhitelist"
上面的示例完成以下配置:
-
TLS 認證使用
default
配置,這個配置可使用配置文件或 traefik 啟動參數中配置,如下:traefik: image: "traefik:v2.3.2" hostname: "traefik" networks: - traefik command: - "--log.level=INFO" - "--api.insecure=true" - "--providers.docker=true" - "--providers.docker.exposedbydefault=false" - "--providers.docker.swarmmode=true" - "--providers.docker.network=traefik" - "--providers.docker.watch=true" - "--entrypoints.http.address=:80" - "--entrypoints.https.address=:443" - "--certificatesresolvers.default.acme.dnschallenge=true" - "--certificatesresolvers.default.acme.dnschallenge.provider=alidns" - "--certificatesresolvers.default.acme.dnschallenge.resolvers=ns1.alidns.com" - "--certificatesresolvers.default.acme.email=linhehuo@gmail.com" - "--certificatesresolvers.default.acme.storage=/letsencrypt/acme.json"
上面的啟動參數配置了 default
TSL 證書解析器和自動 acme 認證(自動證書申請和延期)。
-
中間件
redirect-to-https
:配置從 HTTP 到 HTTPS 的轉發,強制使用安全連接。- "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
-
中間件
check-header
:配置自定義 Headers 檢查。外部訪問必須添加自定義 Header 并匹配 Header 值,避免非法訪問。這在提供 API 訪問時是一個非常簡單有效的安全機制。 -
中間件
tdengine-ipwhitelist
:配置 IP 白名單。僅允許指定 IP 訪問,使用 CIDR 路由規則進行匹配,可以設置內網及外網 IP 地址。
總結
數據安全是 TDengine 產品的一項關鍵指標,這些措施旨在保護 TDengine 部署免受未經授權的訪問和數據泄露,同時保持性能和功能。但 TDengine 自身的安全配置不是生產中的唯一保障,結合用戶業務系統制定更加匹配客戶需求的解決方案更加重要。