天天看點

去哪兒資料庫自動化平台實踐——通訊協定

去哪兒資料庫自動化平台實踐——通訊協定

作者介紹:

錢芳園

專注資料庫和資料庫自動化領域的工程師,擅長 MySQL、Redis 運維以及基于 go 語言的資料庫自動化開發。

一、背景

新一代去哪兒資料庫自動化平台設計整體架構如下:

去哪兒資料庫自動化平台實踐——通訊協定

架構說明:

【1】平台是分層建構,不同層級的子產品功能專注不同的功能,上圖隻是列出部分子產品。

【2】Server 是整個架構的初始化子產品,也是整個平台的管控節點。

【3】Meta 是整個架構的中繼資料中心。

【4】每個子產品都是獨立的存在,同一層級的子產品之間可以互相調用,低層級的子產品不能主動調用高層級的子產品。

根據自動化平台的規劃,平台需要部署一套 Agent 和各種 Plugin 在目标伺服器上,Agent 和 Plugin 具備執行各種指令、任務。但是 Agent/Plugin 需要與 Server 之間傳輸一些敏感資訊(密碼、秘鑰等),需要設計一套互動協定,防止敏感資訊洩露,確定資料傳輸的安全性。

二、目标

設計一套Agent/Plugin和Server之間的通信協定,需要實作以下目标:

  • 滿足功能上的需求,可以接受請求,執行指令和任務。
  • 確定敏感資訊傳輸的安全性。
  • 對部分影響較大的請求進行認證。
  • 盡可能不依賴外部服務。

三、分析

通訊方式

目前主流兩個服務之間的通訊方式有:http/https、tcp、udp、rcp。

通訊方式 協定層 優點 缺點
tcp/udp 傳輸層 完全可定制化的通訊協定,可以具備較高的安全性。 需要從底層實作一套複雜的通訊協定,開發成本非常高。
rpc 應用層 成熟的通訊協定,現有架構可以完整支援,可以在此基礎上完成二次開發,并且性能較高。 需要指定的用戶端才能通訊,調試不太友善,開發成本稍高。
http/https 應用層 成熟的通訊協定,現有架構可以完整支援,可以在此基礎上完成二次開發,并且用戶端較多,調試非常友善。 相比rcp,性能較低,開發成本較低。

目前 Agent / Plugin 和 Server 之間的通訊的性能要求不高,最主要的是滿足功能上的需求和防止敏感資訊洩露,友善開發、調試。故我們采用開發成本稍低的 http 協定。

需要加密的接口

Agent/Plugin和Server 之間通訊時,90% 的場景是擷取一些非敏感性資訊,例如:伺服器資訊、硬體資訊等。如果這些非敏感的資訊進行加密會大大浪費資源,增加雙方的負擔。故我們對含有非敏感資訊的接口不采用加密的通訊方式,僅對含有敏感資訊的接口進行加密傳輸。

加密協定

加密方式大緻分為對稱加密和非對稱加密。兩者主要的差別在于加密和解密的秘鑰是否是同一個。

  • 對稱加密

對稱加密用的秘鑰既可以用來加密明文資料,也可以用來解密密文資料,故被稱之為對稱加密。一般情況下對稱加密的加密算法是公開的,一旦秘鑰洩露則密文就會很容破解,是以對稱加密的關鍵在于秘鑰的安全管理。

加密過程如下:

密文=Func(明文,秘鑰)           

其中Func為加密算法。

解密過程如下:

明文=Func(密文,秘鑰)           

其中 Func 為加密算法。

對稱加密算法主要有 AES、DES、3DES 等,由于 DES 和 3DES 在安全性方面不如 AES,故現在不再推薦使用 DES 和 3DES 。

名稱 密鑰長度 運算速度 安全性 資源消耗 是否推薦
DES 56位 較快 不推薦
3DES 112位或168位 不推薦
AES 128、192、256位 推薦
  • 非對稱加密

非對稱加密有一對秘鑰,可以用其中任何一個秘鑰來加密,用另一個秘鑰來解密。一般情況下會把其中的一把秘鑰公開,可以使用這個秘鑰對任何資料進行加密,隻要另一把秘鑰不洩露就可以確定資料安全。為了區分這兩個秘鑰,可以公開的秘鑰稱為公鑰,不能公開的秘鑰稱為私鑰。

去哪兒資料庫自動化平台實踐——通訊協定

加密過程如下:

密文=Func(明文,公鑰)           

其中Func為加密算法。

解密過程如下:

明文=Func(密文,私鑰)           

其中Func為加密算法。

常見的非對稱加密算法有RSA、DSA等。

名稱 成熟度 安全性(取決于密鑰長度) 運算速度 資源消耗
RSA
DSA 隻能用于數字簽名
ECC 低(計算量小,存儲空間占用小,帶寬要求低)

RSA 加密算法是目前最有影響力的公鑰加密算法,并且被普遍認為是目前最優秀的公鑰方案 之一。RSA 是第一個能同時用于加密和數字簽名的算法,它能夠抵抗到目前為止已知的所有密碼攻擊,已被 ISO 推薦為公鑰資料加密标準。

對稱加密和非對稱加密算法比較:

加密方式 優勢 劣勢
對稱加密 速度快,資源消耗低 安全性不如非對稱加密
非對稱加密 安全性高 加解密速度低,資源消耗高

基于加密和解密速度上的考慮,目前Agent/Plugin和Server之間采用對稱加密算法。

流程設計

  • 流程圖

圖示以Agent和 Server 認證過程為例。Agent 和 Server 之間都含有一個固定的 key,這個 key 是編碼在二進制代碼中,無法通路。

  • 認證過程

1. agent 啟動時會收集自身和環境資訊,并向 server 注冊。

2. server 收到注冊請求之後,會針對本次請求的 agent 生成配置資訊。

  • 随機生成一個securityKey(每個agent每次注冊都會生成新的securityKey)。
  • 使用 securityKey 加密 agent 的原始配置資訊。
  • 使用 key 加密 securityKey 。

3. server 将配置資訊(包含加密之後的 securityKey)發送給 agent。

4. agent 收到配置資訊後,使用對應的 key 解析 securityKey,然後使用 securityKey 解密出原始的配置資訊。

  • 請求過程

1. server 生成 token。

  • 生成包含 server 身份資訊在内的服務資訊。
  • 使用 agent 對應的 securityKey 加密服務資訊。
  • 使用加密之後的服務資訊生成 token 。

2. server 向 agent 下發指令請求,并附加 token。

3. agent 收到請求之後,進行檢查。

  • 解析 token 并擷取服務資訊。
  • 使用 securityKey 解密服務資訊,并擷取請求的身份資訊。
  • 檢查身份資訊是否正确,如果檢查錯誤則直接拒絕請求。

4. agent 執行指令并傳回結果。

  • 說明

1. agent 和 server 共有的 key

  • key 隻用于加密和解密 sercurityKey,不用于其他用途,即使洩露也不會影響認證。
  • agent 和 server 是二進制編譯部署,key 不存在與配置檔案中,key 不會在網絡中以任何形式傳輸。
  • key不參與資料加密過程,即使 server 向 agent 請求時,key 不相同認證也會通過。
  • 後面如果需要考慮替換掉 key,隻需要保證 agent 注冊的時候 server 與 agent 的 key 相同就可以注冊成功。

2. securityKey

  • 每個 agent 專屬一個 securityKey 。
  • 每個 agent 啟動注冊均會随機生成一個 securityKey ,如果存在舊的 securityKey 則會被覆寫。
  • securityKey 是用來加密敏感資訊,防止敏感資訊。
  • securityKey 僅在注冊過程中傳輸一次,并且隻存在于 agent 的記憶體中,不會以任何形式存在于檔案中。

3. token

token 中包含加密之後的server身份資訊,agent 認證時會做如下檢查:

  • agent 檢查 token 身份資訊是否符合要求,如果身份資訊不符合要求則認證不予通過。
  • agent 會将身份資訊與請求來源進行比較,如果不同則被認為 token 為非法

作者:錢芳園

來源:微信公衆号:Qunar技術沙龍

出處:https://mp.weixin.qq.com/s/Otj6O-xkSsq5cYG6VOSR2g

繼續閱讀