一鍵化部署通用方案,你學(xué)會了嗎?
部署內(nèi)容包分析
部署前應(yīng)該拿到「安裝包」和配套的「授權(quán)配置」,授權(quán)配置中包含授權(quán)包的授權(quán)碼,完整性校驗碼等內(nèi)容。
安裝包
安裝包是一個壓縮文件,里面包含了一個安裝工具和一個加密壓縮之后的部署包。安裝工具利用授權(quán)碼對部署包進行處理,并按授權(quán)碼攜帶的信息進行部署。
完整性校驗碼
完整性校驗碼用于校驗安裝包的完整性。
授權(quán)碼的結(jié)構(gòu)
部署授權(quán)碼用于協(xié)調(diào)部署安裝過程。
授權(quán)碼考慮使用具備授權(quán)信息的json文本,利用非對稱加密的方法,加密出來的字符串作為授權(quán)碼,授權(quán)碼的結(jié)構(gòu)包括但不限于 授權(quán)的模塊,部署包的解壓密碼等;
受商業(yè)模式的影響,還可以增加其他的授權(quán)內(nèi)容用于做到不同程度的限制,如下:
1、授權(quán)碼可能會被多次使用,特別是在內(nèi)網(wǎng)的情況下,無法限制其部署的次數(shù),可以考慮增加「授權(quán)碼的過期時間或授權(quán)碼生效的MAC地址」參數(shù)來限制授權(quán)碼的反復(fù)使用。
2、如果授權(quán)碼被濫用,為了便于后續(xù)查看是哪家泄漏的授權(quán)碼,可以在授權(quán)碼的原始json中增加「授權(quán)對象名稱」字段。
3、平臺如果是按年收費等,可以增加 「平臺的授權(quán)時間范圍」 字段,用來限制平臺的使用時間。
4、平臺如果考慮按用戶數(shù)量等收費,也可以增加 「授權(quán)的用戶數(shù)」 字段,用來限制平臺創(chuàng)建用戶的數(shù)量限制等。
下面是一套授權(quán)碼的 JSON 結(jié)構(gòu)示例,涵蓋了授權(quán)信息,如授權(quán)模塊、部署包解壓密碼、授權(quán)對象、MAC 地址綁定、授權(quán)時間范圍等。
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
{
"license_id": "123e4567-e89b-12d3-a456-426614174000",
"issued_at": "2024-10-22T12:00:00Z",
"expires_at": "2025-10-22T12:00:00Z",
"licensee": {
"company": "某某科技有限公司",
"contact": "admin@example.com"
},
"authorized_modules": [
"asset",
"vulnernable",
"notice"
],
"deployment": {
"unpack_password": "s3cr3tP@ssw0rd",
"allowed_macs": [
"00:1A:2B:3C:4D:5E",
"00:1A:2B:3C:4D:5F"
],
"instance_type": 0
},
"usage_restrictions": {
"valid_from": "2024-11-01T00:00:00Z",
"valid_to": "2025-11-01T00:00:00Z",
"max_users": 100
},
"security": {
"signature": "base64-encoded-signature"
}
}
說明
- 「license_id」:唯一的授權(quán)碼 ID,可用于追蹤授權(quán)。
- 「issued_at / expires_at」:授權(quán)碼的簽發(fā)時間和到期時間。
- 「licensee」:授權(quán)對象(企業(yè)或個人)。
- 「authorized_modules」:被授權(quán)的功能模塊列表。
- 「deployment」:
- unpack_password:部署包的解壓密碼。
- allowed_macs:受限的 MAC 地址列表,可用于防止無限制使用授權(quán)碼。
- nstance_type:授權(quán)部署實例的類型(0表示單節(jié)點授權(quán)部署,1表示三節(jié)點授權(quán)部署)
- 「usage_restrictions」:
valid_from / valid_to:平臺的授權(quán)有效期。
max_users:授權(quán)的最大用戶數(shù)。
「security」:
signature:授權(quán)碼的數(shù)字簽名(使用私鑰對整個 JSON 加密的哈希值,驗證時使用公鑰校驗)。
使用非對稱加密(如 RSA、ECC)對 JSON 進行加密,并將其轉(zhuǎn)換為 Base64 字符串,作為最終的授權(quán)碼。
缺陷問題
為了得到足夠的授權(quán)信息,授權(quán)碼會比較長:“我們的客戶場景基本為內(nèi)網(wǎng)部署,無法通過給簡單授權(quán)碼然后請求遠程授權(quán)信息的方式來代替”。
虛擬化或云環(huán)境下,MAC 地址可能頻繁變動,影響授權(quán)驗證:“在這種情況下,可以修改變化的MAC地址為其他不變的參數(shù)”。
用戶可能會修改系統(tǒng)時間,繞過授權(quán)時間限制
在內(nèi)網(wǎng)部署的情況下,授權(quán)碼盜用和濫用的方法比較多,我們現(xiàn)目前沒有很好的方案從技術(shù)上完全限制。
部署流程設(shè)計
校驗和配置
完整性校驗
用戶拿到 「安裝包、校驗碼、授權(quán)碼」 后,需使用完整性校驗工具對 「安裝包」 進行完整性校驗,確保安裝包未被篡改?!甘纠睿⊿HA256 校驗):」
ounter(line
sha256sum -c install_package.sha256
「若校驗失敗,則終止安裝并提示用戶重新獲取安裝包?!?/p>
解壓安裝包
校驗通過后,用戶手動解壓安裝包,得到以下內(nèi)容:
- 「加密部署包(encrypted_package.tar.gz)」
- 「部署工具(deploy_tool,可執(zhí)行二進制)」
- 「部署配置文件(deploy_config.yaml)」
「示例解壓命令:」
ounter(line
tar -xzf install_package.tar.gz
deploy_config.yaml 包含:
- 「版本信息」(當(dāng)前包版本號)
- 「依賴信息」(是否依賴其他組件)
- 「可選配置參數(shù)」(如端口、數(shù)據(jù)庫連接等)
配置參數(shù)
用戶可根據(jù)需求修改 deploy_config.yaml,未配置的參數(shù)采用默認值。
開始部署
啟動部署工具
用戶運行部署工具:
ounter(line
./deploy_tool
部署工具會要求用戶輸入 「授權(quán)碼」。
授權(quán)碼校驗
- 「解密授權(quán)碼」
- 使用預(yù)設(shè)的 「私鑰」 解密授權(quán)碼,獲得授權(quán)信息。
- 「校驗授權(quán)信息」
確認授權(quán)信息是否與本次部署的 「版本、環(huán)境」 匹配。
授權(quán)有效 → 繼續(xù)安裝
授權(quán)無效 → 終止安裝,提示用戶檢查授權(quán)
自動讀取當(dāng)前環(huán)境信息
部署工具會自動檢測系統(tǒng)中是否已有相同組件:
- 若已有 「相同版本」,提供 「僅安裝」 或 「覆蓋安裝」 選項:
a.「僅安裝」:保留用戶數(shù)據(jù),使用當(dāng)前版本進行安裝
b.「覆蓋安裝」:不保留舊版本數(shù)據(jù),重新安裝
- 若已有 「舊版本」,提供 「升級」 或 「覆蓋安裝」 選項:
「升級」:保留用戶數(shù)據(jù),更新至新版本
「覆蓋安裝」:不保留舊版本數(shù)據(jù),重新安裝
「示例命令(檢查已安裝版本):」
ounter(line
./deploy_tool --check-version
執(zhí)行安裝部署步驟
依賴檢查通過之后,利用授權(quán)碼解密得到的部署包密碼對部署包進行解密。
解密成功之后,進入安裝步驟,安裝工具會使用授權(quán)碼解密得到的安裝實例類型參數(shù),如果參數(shù)值為0,表示該授權(quán)碼是單實例部署的授權(quán);如果參數(shù)值為1,表示該授權(quán)碼是三節(jié)點實例部署的授權(quán);
如果是單實例部署,會提示用戶輸入當(dāng)前服務(wù)的外部IP地址和服務(wù)名(可選);
如果是三實例部署,會提升用戶需要輸入master節(jié)點的IP地址和服務(wù)名(可選);其他節(jié)點的IP地址和服務(wù)名(可選)。
用戶也可以在安裝前,將IP地址和服務(wù)名以配置的方式寫入到 deploy_config.yaml 中。
例如:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
master:
ip: "192.168.1.10"
host_name: "master-10"
nodes:
- ip: "192.168.1.11"
host_name: "node-11"
- ip: "192.168.1.12"
host_name: "node-12"
如果是單實例部署中,IP地址用戶也可以缺省,按照工具默認使用127.0.0.1進行部署,host_name默認為master;
在三實例部署中,host_name可以缺省,系統(tǒng)會自動以 **master-主節(jié)點IP(三四位)**為主節(jié)點;「node-從節(jié)點IP(三四位)為各個從節(jié)點」。
在所有的部署情況中,IP地址(和主機名)是變化概率比較大的內(nèi)容,所以這幾個參數(shù)還是會保留以交互式的方式讓用戶進行輸入。其他組件和應(yīng)用的配置參數(shù),則以缺省的方式進行配置(即默認值填充)。
安裝包的命名
「目標(biāo)」:通過文件名即可識別 「包類型」、「版本」、「發(fā)布時間」 及 「其他關(guān)鍵信息」。
****「命名格式」
ounter(line
<產(chǎn)品名稱>-<包類型>-<客戶標(biāo)識>-<發(fā)布版本>-<包類別>-<發(fā)布日期>.tar.gz
例如:
ounter(line
MyApp-Custom-ABCCorp-V2.3.1-Patch-202440.tar.gz
****「詳細字段說明」
「字段」 | 「示例」 | 「說明」 |
「產(chǎn)品名稱」 |
| 產(chǎn)品或系統(tǒng)名稱 |
「包類型」 |
/ | 「通用包」 、「定制化包」、「Beta 版本」 |
「客戶標(biāo)識」 |
| 「僅定制化包」 需要加客戶名稱(若通用包/Beta包則省略) |
「發(fā)布版本」 |
| 「產(chǎn)品版本號」 ,遵循 |
「包類別」 |
/ | 「完整包」 ( |
「發(fā)布日期」 |
| 「輪胎命名方式」 , |
****「命名示例」
「文件名」 | 「含義」 |
| 「通用完整包」 ,版本 |
| 「XYZCorp 客戶的定制完整包」 ,版本 |
| 「XYZCorp 客戶的定制補丁包」 ,版本 |
| 「Beta 測試版完整包」 ,版本 |
****「額外可選字段」
如果需要進一步細化,可以增加:
- 「架構(gòu)類型」(x86_64 / arm64)→ MyApp-General-V2.3.1-Full-202440-x86_64.tar.gz
- 「加密方式」(Enc 表示加密)→ MyApp-Custom-ABC-V2.3.1-Full-202440-Enc.tar.gz
「這樣一眼就能看出這個包的類型、客戶、版本和發(fā)布時間」
實現(xiàn)方案
部署場景的文件結(jié)構(gòu)
- checksum.txt
- listence.txt
- MyApp-Custom-XYZCorp-V1.5.0-Full-202438-x86_64.tar.gz
a.部署工具,二進制
- 部署配置文件
- 加密的部署包
- MyApp-Custom-XYZCorp-V1.5.0-Full-202438-x86_64-Enc.tar.gz
- deploy_config.yaml
- deploy_tool
checksum.txt中存放MyApp-Custom-XYZCorp-V1.5.0-Full-202438-x86_64.tar.gz的完整性校驗碼。
listence.txt中存放授權(quán)碼,是加密并編碼之后的授權(quán)信息。
安裝工具對授權(quán)碼進行解密
當(dāng)用戶手動解壓 MyApp-Custom-XYZCorp-V1.5.0-Full-202438-x86_64.tar.gz 之后,得到 deploy_tool 部署工具,該工具首先讀取并解密listence.txt,得到授權(quán)信息。
生成加密的授權(quán)碼
目標(biāo)是:
- 「確保授權(quán)碼只能被安裝工具解密」(即防止他人隨意解密)。
- 「防止私鑰泄露,同時保持安全性」。
- 生成一對 「RSA 公私鑰」:
a.「公鑰(public_key.pem)」 用于加密 listence.txt,并內(nèi)置在 部署包 內(nèi)。
b.**私鑰(private_key.pem)**「僅存儲在部署工具(deploy_tool)內(nèi)部」,用于解密授權(quán)碼。
- 這樣,**即使別人知道公鑰,他們也無法解密 ****listence.txt**。
「加密流程(生成授權(quán)碼)」
ounter(line
openssl rsautl -encrypt -pubin -inkey public_key.pem -in raw_license.txt -out listence.txt
「解密流程(在 deploy_tool 中)」
ounter(line
openssl rsautl -decrypt -inkey private_key.pem -in listence.txt -out license_decoded.txt
這樣,「只有」**deploy_tool**** 具備私鑰,才能解密授權(quán)碼**。
風(fēng)險
把 「私鑰」 放到 deploy_tool 里面存在 「反編譯泄露風(fēng)險」,如果攻擊者能夠獲取 deploy_tool 并反編譯,就有可能提取私鑰,從而解密 listence.txt。我們「可以考慮動態(tài)生成固定私鑰」的方法,通過「代碼中的特定計算規(guī)則」,在運行時生成私鑰,計算過程隱藏在復(fù)雜的數(shù)學(xué)運算、位運算、哈希計算等邏輯中。
授權(quán)信息的結(jié)構(gòu)
在前面的章節(jié)中,提到過授權(quán)信息的結(jié)構(gòu)。授權(quán)信息是一個json結(jié)構(gòu)的內(nèi)容,里面包含了所有用戶不能看或者不能篡改的內(nèi)容。
用戶填寫好IP和主機名之后的執(zhí)行邏輯
用戶可以手動在 deploy_config.yaml 中填寫好IP等必填參數(shù)信息,也可以通過腳本交互式填寫(如果deploy_config.yaml 沒有),格式為:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
master:
ip: "192.168.1.10"
host_name: "master-10"
nodes:
- ip: "192.168.1.11"
host_name: "node-11"
- ip: "192.168.1.12"
host_name: "node-12"
在此之后,一鍵化腳本會調(diào)用現(xiàn)目前的交互式部署工具V1進行細化的部署工作,V1工具為下面每個組件定義了完整的部署邏輯:
biz base
datax
dinky
dolphinschedul
doris
flink
fluentd
grafana
jdk11
jdk17
jdk8
kafka
knowledge
log_audit
minio
mysql
nginx
nmap
pgsql
prometheus
redis
supervisord
zookeeper
配置前優(yōu)化
同時V1工具也為每一個可變參數(shù),sql都定義了執(zhí)行流。
一鍵化部署工具V2會根據(jù)授權(quán)信息中的授權(quán)的大業(yè)務(wù)組件,「對需要的小組件進行安裝和校驗」,如果用戶在外部沒有為組件定義缺省參數(shù),則各組件會依照原有自動化部署中的默認參數(shù)進行配置和部署。
缺省的參數(shù)清單
在上面的描述中,我們在 deploy_config.yaml 配置了部署的IP信息。在某些情況下,我們需要手動配置一些部署的參數(shù),那么這個時候就需要用戶手動在deploy_config.yaml設(shè)置參數(shù)。
安裝進度展示
用戶可以看到安裝的進度、輸出的安裝正確日志或者錯誤日志和輸出最終訪問的方法等。
輔助文檔輸出
在上述一鍵化部署方案實施的前提下,在本方案交付時還應(yīng)該提供出缺省的參數(shù)清單、可能出現(xiàn)的問題&解決清單、一鍵化部署用戶使用、授權(quán)碼申請模版等文檔。