IoT 中樞裝置更新能以安全的方法將裝置韌體、映像和應用程式的更新部署至 IoT 裝置。 這套工作流程提供端對端安全通道,以及裝置可用於證明更新是受到信任、未經修改且刻意的完整監管鏈模型。
裝置更新工作流程中的所有步驟都會受到多種安全性功能和程序的保護,以確保管線中每個步驟可安全遞交至下一步。 裝置更新代理程式參考程式碼會找出並妥善管理所有不合法的更新要求, 參考代理程式也會檢查每次下載,以確保內容可信、未遭修改,且下載行為是有意進行的。
摘要
當更新匯入裝置更新實例時,服務會上傳並檢查更新二進位檔,以確保惡意使用者尚未修改它們。 驗證完成後,裝置更新服務會產生一份內部更新資訊清單,其中包含來自匯入資訊清單的檔案雜湊及其他中繼資料。 裝置更新服務會簽署此更新指令清單。
匯入服務並儲存於 Azure 之後,Azure 儲存體服務會自動加密處於靜止狀態的更新二進位檔,以及相關的客戶中繼資料。 裝置更新服務不會自動提供額外加密,但允許開發人員在內容送至裝置更新服務以前自行加密內容。
更新從裝置更新服務部署到裝置後,系統會透過受保護的 IoT 中樞通道將已簽署的訊息傳送至裝置。 裝置更新代理程式會驗證簽章,以判斷其是否為正宗。
所有產生的二進位下載內容都會受到更新資訊清單簽章驗證的保護。 更新資訊清單包含二進位檔案雜湊,因此只要資訊清單收到信任,裝置更新代理程式就會信任雜湊,並將其與二進位檔案比對。 下載並驗證更新二進位檔之後,它會交給裝置上的安裝程式。
實作詳細資料
為了讓裝置更新服務確實縮小為低效能的簡單裝置,安全性模型會使用原始非對稱金鑰和原始簽章, 如 JSON Web 權杖及 JSON Web 金鑰等以 JSON 為基礎的格式。
透過更新資訊清單保護更新內容
系統會使用兩個簽章驗證更新資訊清單, 這些簽章使用由「簽署」金鑰和「根」金鑰組成的結構而建立。
裝置更新代理程式包含內嵌的公鑰,用於所有裝置更新相容裝置。 這些公開金鑰是「根」金鑰, Microsoft控制對應的私鑰。
Microsoft 也會產生未包含在裝置更新代理程式中或未儲存在裝置上的公開/私密金鑰組, 稱為「簽署」金鑰。
當更新匯入 IoT 中樞 的裝置更新服務,且服務產生更新資訊清單時,服務會使用簽署金鑰來簽署該資訊清單,並包含簽署金鑰本身,而該金鑰是由根金鑰簽署的。 更新資訊清單傳送至裝置後,裝置更新代理程式會收到下列簽章資料:
- 簽章值本身。
- 用於產生 #1 的演算法。
- 用於產生 #1 的簽署金鑰的公開金鑰資訊。
- #3 中公開簽署金鑰的簽章。
- 用於產生 #3 的根金鑰的公開金鑰識別元。
- 用於產生 #4 的演算法。
裝置更新代理程式會使用該資訊來驗證公鑰的簽章是由根密鑰簽署。 裝置更新代理程式接著會驗證更新資訊清單簽章是否為由簽署金鑰所簽署。 如果所有簽章都正確,裝置更新代理程式就會信任更新指令清單。 由於更新資訊清單包含與更新檔案本身相對應的檔案雜湊值,因此如果雜湊值相符,則這些更新檔案也可視為可信。
擁有根金鑰和簽署金鑰讓 Microsoft 可採用定期變換簽署金鑰的安全性最佳做法。
JSON Web 簽章 (JWS)
updateManifestSignature是用來確保 內updateManifest含的資訊不會修改。
updateManifestSignature 是使用具有 JSON Web 金鑰的 JSON Web 簽章而產生,以便進行來源驗證。 此簽章為有三個區段的 Base64Url 編碼字串,每個區段以 "." 分隔。 請參閱 jws_util.h 輔助方法,以剖析及驗證 JSON 金鑰和權杖。
JSON Web 簽章是一種被廣泛使用的IETF 提案標準,用於使用以 JSON 為基礎的資料結構來簽署內容。 會藉由驗證資料簽章確保資料的完整性。 如需詳細資訊,請參閱 JSON Web 簽章 (JWS) RFC 7515 (英文)。
JSON Web 權杖
JSON Web Tokens 是一種開放且符合業界標準的方法,用於在雙方之間安全地表示宣告。
根金鑰
每部裝置更新裝置都必須包含一組根金鑰, 這些金鑰是所有裝置更新簽章的信任根源, 每個簽章都必須透過其中一個根金鑰進行鏈結,才會視為合法。
根金鑰組會隨著時間而變更,因為定期輪替簽署金鑰是妥適的安全做法。 因此,裝置更新代理程式軟體必須以裝置更新小組所指定的間隔,以最新的根密鑰集進行更新。 如需有關為根金鑰輪替作準備的指引,請參閱 如何為 IoT 中樞 的裝置更新根金鑰輪替作準備。
從版本 1.1.0 開始,裝置更新代理程式參考實作會在每次部署到裝置時自動檢查根金鑰是否有變更。 可能的變更:
- 有新的根金鑰可供使用。
- 現有的根金鑰已停用 (有效的「撤銷」),這表示建立信任已不再有效。
如果兩者都成立,裝置更新代理程式會自動從 DU 服務下載新的 根密鑰套件。 此套件包含所有根密鑰的完整集合,以及 已停用的清單 ,其中包含哪些根密鑰和/或簽署密鑰不再有效的相關信息。 根金鑰套件本身由各個根金鑰簽署,因此無論是透過 DU 代理程式本身所包含的原始根金鑰,還是透過任何後續下載的根金鑰,都可以建立對該套件的信任。 驗證程式完成後,系統會將任何新的根密鑰視為受信任,以使用指定更新指令清單的簽署金鑰來驗證信任,而停用清單中所列的任何根密鑰或簽署金鑰都不再信任該用途。
簽章
由其中一個根密鑰簽署的簽署(公開)金鑰隨附所有簽章。 簽章會辨識簽署金鑰是由哪個根金鑰所簽署的。
裝置更新代理程式若要驗證簽章,必須先驗證簽署 (公用) 金鑰的簽章正確有效,且已由核准根金鑰簽署。 簽署金鑰成功通過驗證後,便可使用已受到信任的簽署公開金鑰來驗證簽章本身。
簽署金鑰會以比根密鑰更快速的速度輪替,因此預期會以各種不同簽署密鑰簽署的訊息。
裝置更新服務會視需要管理簽署密鑰的撤銷,因此使用者不應該嘗試快取簽署密鑰。 請一律使用簽章隨附的簽署金鑰。
保護裝置
請務必確保裝置更新相關的安全性資產在裝置上受到適當保護, 根金鑰等資產需要受到保護,以防遭到修改。 有各種方式可以保護根金鑰,例如使用安全性裝置(TPM、SGX、HSM 或其他安全性裝置),或如同目前在參考實作中所做的那樣,將根金鑰硬式編碼到裝置更新代理程式中。 後者需要裝置更新代理程式代碼的數位簽名,並啟用系統的程式代碼完整性支援,以防止代理程式碼的惡意修改。
您可能還需要採取其他安全性措施,例如確保元件與元件之間的交接以安全的方式進行。 例如註冊用於執行各種元件的特定隔離帳戶,以及限制只能使用 localhost 網路通訊 (如 REST API 呼叫)。