管理防火牆後面的 linux 電腦集群
我公司的產品本質上是一個 Linux 機器(Ubuntu),它位於其他人的網路中執行我們的軟體。到目前為止,我們在野外只有不到 25 個盒子,並使用 TeamViewer 來管理它們。
我們現在要運送 1000 個這樣的盒子,TeamViewer 不再是一種選擇。我的工作是想辦法訪問這些盒子並更新它們上面的軟體。該解決方案應該能夠穿透防火牆以及您擁有的東西。
我考慮過:
1. 本地開發的解決方案(例如 Linux 服務),它建立到雲中的伺服器的SSH 反向隧道,以及雲中的另一個服務來跟踪這些服務並讓您連接到它們。
這顯然是勞動密集型的,坦率地說,感覺就像是在重新發明輪子,因為很多其他公司肯定已經遇到過這個問題。即便如此,我不確定我們是否會做得很好。
2. puppet、chef或OpenVPN等工具
我試圖盡可能多地閱讀,但我似乎無法通過行銷演講深入了解顯而易見的選擇。
除了我們之外,沒有其他人需要連接到這些盒子。有沒有相關經驗的大神可以指點一下?
拉取更新,不要推送
隨著您的擴展,對所有產品進行推送更新將變得不可行。
- 您必須跟踪每個客戶,每個客戶可能都有不同的防火牆配置。
- 您必須通過客戶的防火牆創建傳入連接,這需要埠轉發或其他類似機制。這對您的客戶來說是一個安全風險
相反,讓您的產品定期“拉動”其更新,然後隨著您的成長,您可以在伺服器端添加額外的容量。
如何?
正如你所建議的,這個問題已經解決了。這是我能想到的幾種方法。
using apt:使用帶有自定義 PPA 和源列表的內置 apt 系統。如何設置 PPA?
- **缺點:**除非您使用像啟動板這樣的公共託管服務,否則設置自己的 apt PPA + 打包系統不適合膽小的人。
使用 ssh:為每個產品生成一個 SSH 公鑰,然後將該設備的密鑰添加到您的更新伺服器。然後,只需擁有您的軟體
rsync
/scp
所需的文件。
- **缺點:**必須跟踪(並備份!)您發送的每個產品的所有公鑰。
- Pro:比原始下載更安全,因為唯一可以訪問更新的設備是那些安裝了公鑰的設備。
原始下載+簽名檢查:
- 在某處發布簽名的更新文件(Amazon S3、FTP 伺服器等)
- 您的產品會定期檢查要更改的更新文件,然後下載/驗證簽名。
- 缺點:根據您的部署方式,這些文件可能是公開可訪問的*(這可能使您的產品更容易進行逆向工程和破解)*
ansible:Ansible 是管理系統配置的好工具。它屬於 puppet / chef 的領域,但是是無代理的(使用 python)並且設計為冪等的。如果部署您的軟體需要復雜的 bash 腳本,我會使用這樣的工具來降低執行更新的複雜性。
當然,還有其他方法可以做到這一點。但這讓我想到了一個重要的點。
簽署/驗證您的更新!
無論您做什麼,都必須有一種機制來確保您的更新沒有被篡改。惡意使用者可以在上述任何配置中冒充您的更新伺服器。如果你不驗證你的更新,你的盒子更容易被黑客入侵和進入。
執行此操作的一個好方法是簽署您的更新文件。您必須維護一個證書(或向某人付費),但您可以在每台設備上安裝指紋,然後再將它們發送出去,這樣他們就可以拒絕被篡改的更新。
物理安全
當然,如果有人可以物理訪問客戶的部署,他們可以輕鬆接管伺服器。**但至少他們無法攻擊其他部署!**物理安全可能是您客戶的責任。
如果您願意,想像一下如果您使用大型 OpenVPN 網路進行更新會發生什麼……然後他們可以使用受感染的伺服器攻擊VPN 上的每個實例
安全
無論您做什麼,都需要從一開始就建立安全性。不要在這裡偷工減料——如果你這樣做了,你最終會後悔的。
完全保護此更新系統超出了本文的範圍,如果您或您團隊中的某個人不熟悉該領域,我強烈建議您聘請顧問。它值得每一分錢。