適用於:SQL Server 2022 (16.x)
Azure SQL 資料庫
Azure SQL 受控執行個體
如何在竄改之後復原?
修復任何類型竄改最簡單的方式,就是將資料庫還原到可驗證的最新備份。 要達成此目的,您可將資料庫還原到不同時間點,並使用先前的資料庫摘要來驗證總帳。 所謂可成功驗證的最新時間點,是保證未遭竄改且可用來繼續處理異動的時間點。 基於這個理由,頻繁的備份很重要,以利盡可能接近竄改的時間。 Azure SQL Database 會自動執行備份排程。 儘管這項技術很簡單,但有個重要注意事項:如在竄改之後執行任何異動,您必須了解這些異動將會遺失,或需要以手動修復總帳資料表,其方法為重新插入已驗證異動資訊,並重新計算這些在資料庫總帳第一次發生竄改事件之後的新異動雜湊碼。
竄改類別
根據竄改的類型,您可在某些情況修復總帳而不遺失資料。 您應該考慮兩種竄改事件類別。
竄改不影響進一步異動
竄改事件修改了總帳儲存的某些資料,但不影響任何進一步異動。 這可能是因為在任何交易涉及被竄改的資料之前就已偵測到攻擊,或因為攻擊以不影響新交易的方式影響了資料。 例如,如您使用總帳資料表來儲存銀行異動詳細資料,則竄改現有異動詳細資料不影響新異動,但會變更目前餘額。
由於竄改不影響竄改於事件後產生的任何異動,因此新的異動執行及產生的結果正確。 據此情況,理想上應將總帳帶入一致的狀態,而不影響這些異動。
如果攻擊者未竄改資料庫層級總帳,這很容易偵測並修復。 資料庫總帳狀態與產生的所有資料庫摘要一致,且附加至資料庫的任何新異動都已採用先前異動的有效雜湊值進行雜湊處理。 據此,即使竄改後進行異動,所產生的任何資料庫摘要仍然有效。 您可嘗試從備份針對遭篡改的異動擷取正確資料表總帳承載,驗證其仍為安全 (以擷取的備份資料做總帳驗證),接著在資料表總帳覆寫遭竄改的資料來修復操作資料庫。 這將建立一筆新交易以記錄修理交易。
受到篡改影響的資料已被用於進一步的交易
後續異動所使用的資料受竄改事件影響,則會影響異動的執行。 例如,在銀行應用程式中,當前帳戶餘額儲存在帳冊表中,修改表的當前狀態可能會對後續交易造成災難,因為這樣可能允許新交易超支。
如果攻擊者竄改了資料庫總帳,並重新計算區塊的雜湊值以維持內部一致性(直到與外部資料庫摘要進行驗證),那麼新的交易和資料庫摘要將會在不正確的雜湊基礎上生成。 這會導致總帳的分叉,因為新生成的資料庫摘要對應到了無效狀態,即使您使用先前的備份修復總帳,所有這些資料庫摘要也會變得永久無效。 此外,由於資料庫總帳已中斷,在未驗證之前,您不能信任竄改之後產生的異動詳細資料。 據此情況,可能透過下列方式還原竄改:
- 使用備份來復原被篡改交易的狀態。
- 正在驗證總帳的一部分,其範圍是從備份復原的最後一筆異動開始直到總帳的結束。 為此,您必須使用鏈條分叉部分中的資料庫摘要。 儘管資料庫摘要與總帳的原始部分不符,但仍可驗證總帳的分岔部分尚未遭到竄改。 如果這些也顯示竄改,這表示有多個竄改事件,因此必須以遞迴方式套用處理序,才能從備份復原總帳的不同部分。
- 手動修復表格總帳的方法是,將經驗證的交易資訊重新插入,然後重新計算這些在資料庫總帳首次被竄改事件後發生的新交易的雜湊值。