共用方式為


安全性架構︰敏感性資料 | 風險降低

產品/服務 發行項
電腦信任邊界
Web 應用程式
Database
Web API
Azure Document DB
Azure IaaS VM 信任邊界
Service Fabric 信任邊界
Dynamics CRM
Azure 儲存體
行動用戶端
WCF

確保二進位檔案經過模糊化 (如果包含敏感性資訊)

標題 詳細資料
元件 機器信任界限
SDL 階段 部署
適用的技術 泛型
屬性 N/A
參考 N/A
步驟 確定包含敏感性資訊的二進位檔已經過模糊處理,例如不應反轉的商業機密、敏感性商業邏輯。 這是為了阻止組件遭到進行反向工程。 CryptoObfuscator 之類的工具可用於此用途。

考慮使用加密檔案系統 (EFS) 來保護機密的使用者特定資料

標題 詳細資料
元件 機器信任界限
SDL 階段 組建
適用的技術 泛型
屬性 N/A
參考 N/A
步驟 考慮使用加密檔案系統 (EFS) 來保護機密的使用者特定資料,避免遭到可實際存取電腦的攻擊者竊取。

確保應用程式儲存在檔案系統上的敏感性資料已加密

標題 詳細資料
元件 機器信任界限
SDL 階段 部署
適用的技術 泛型
屬性 N/A
參考 N/A
步驟 確定在無法強制執行 EFS 的狀況下,應用程式儲存在檔案系統上的敏感性資料已加密 (例如使用 DPAPI)

確定瀏覽器上不會快取敏感性內容

標題 詳細資料
元件 Web 應用程式
SDL 階段 組建
適用的技術 泛型、Web Form、MVC5、MVC6
屬性 N/A
參考 N/A
步驟 瀏覽器可以儲存資訊以便進行快取和記錄歷程。 這些快取的檔案會儲存在資料夾中,例如若是 Internet Explorer,則會儲存在 Temporary Internet Files 資料夾內。 當您再次參閱這些頁面時,瀏覽器就會顯示快取內的這些頁面。 如果向使用者顯示敏感性資訊 (例如其地址、信用卡詳細資料、社會安全號碼或使用者名稱),那麼此資訊會儲存在瀏覽器的快取中,因而可透過檢查瀏覽器快取或直接按瀏覽器的 [上一頁] 按鈕加以擷取。 將所有頁面的 cache-control 回應標頭值設定為 "no-store"。

範例

<configuration>
  <system.webServer>
   <httpProtocol>
    <customHeaders>
        <add name="Cache-Control" value="no-store" />
        <add name="Pragma" value="no-cache" />
        <add name="Expires" value="-1" />
    </customHeaders>
  </httpProtocol>
 </system.webServer>
</configuration>

範例

這可透過篩選來實作。 可使用的範例如下︰

public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (filterContext == null || (filterContext.HttpContext != null && filterContext.HttpContext.Response != null && filterContext.HttpContext.Response.IsRequestBeingRedirected))
            {
                //// Since this is MVC pipeline, this should never be null.
                return;
            }

            var attributes = filterContext.ActionDescriptor.GetCustomAttributes(typeof(System.Web.Mvc.OutputCacheAttribute), false);
            if (attributes == null || **Attributes**.Count() == 0)
            {
                filterContext.HttpContext.Response.Cache.SetNoStore();
                filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
                filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
                if (!filterContext.IsChildAction)
                {
                    filterContext.HttpContext.Response.AppendHeader("Pragma", "no-cache");
                }
            }

            base.OnActionExecuting(filterContext);
        }

加密包含敏感性資料的 Web 應用程式設定檔案的區段

標題 詳細資料
元件 Web 應用程式
SDL 階段 組建
適用的技術 泛型
屬性 N/A
參考 作法:在 ASP.NET 2.0 中使用 DPAPI 加密組態區段指定受保護的組態提供者使用 Azure Key Vault 來保護應用程式的機密資訊
步驟 組態檔 (例如 Web.config、appsettings.json) 常會用來敏感性資訊,包括使用者名稱、密碼、資料庫連接字串和加密金鑰。 如果您不保護這項資訊,您的應用程式會很容易受到攻擊者或惡意使用者攻擊,而被其取得敏感性資訊,例如帳戶使用者名稱和密碼、資料庫名稱和伺服器名稱。 請根據部署類型 (Azure/內部部署),使用 DPAPI 或服務 (例如 Azure Key Vault) 加密組態檔的敏感性區段。

明確停用敏感性表單和輸入中的自動完成 HTML 屬性

標題 詳細資料
元件 Web 應用程式
SDL 階段 組建
適用的技術 泛型
屬性 N/A
參考 MSDN︰自動完成屬性在 HTML 中使用自動完成HTML 清理弱點再次自動完成?!
步驟 自動完成屬性會指定表單應開啟或關閉自動完成。 當自動完成開啟時,瀏覽器會根據使用者之前輸入的值自動填妥值。 例如,在表單中輸入新名稱和密碼並提交表單後,瀏覽器會詢問是否應儲存密碼。之後在顯示表單時,就會自動填入名稱和密碼或在輸入名稱時填妥。 具有本機存取權的攻擊者可從瀏覽器快取取得純文字密碼。 預設會啟用自動完成,但您必須明確地加以停用。

範例

<form action="Login.aspx" method="post " autocomplete="off" >
      Social Security Number: <input type="text" name="ssn" />
      <input type="submit" value="Submit" />    
</form>

確保使用者畫面上顯示的敏感性資料已經過遮罩

標題 詳細資料
元件 Web 應用程式
SDL 階段 組建
適用的技術 泛型
屬性 N/A
參考 N/A
步驟 當敏感性資料 (例如密碼、信用卡號碼 SSN 等) 顯示在螢幕上時,應為其加上遮罩。 這是為了避免未經授權的人員存取資料 (例如背後偷窺密碼、支援人員看到使用者的 SSN 號碼)。 請確定這些資料元素不會以純文字顯示,並會適當地加上遮罩。 在接受這些輸入內容 (例如,輸入類型 = "password") 以及在螢幕上顯示 (例如,只顯示信用卡號碼最後 4 位數) 時,必須謹慎處理。

實作動態資料遮罩以對不具特殊權限的使用者限制敏感性資料曝光

標題 詳細資料
元件 Database
SDL 階段 組建
適用的技術 Sql Azure、OnPrem
屬性 SQL 版本 - V12、SQL 版本 - MsSQL2016
參考 動態資料遮罩
步驟 動態資料遮罩的目的在於限制機密限制的曝光,防止不該存取資料的使用者檢視該資料。 動態資料遮罩並不是用來防止資料庫使用者直接連接到資料庫,以及執行會讓機密資料片段曝光的全面查詢。 動態資料遮罩是為了補充其他 SQL Server 安全性功能 (稽核、加密、資料列層級安全性...),因此強烈建議您搭配使用這項功能以便加強保護資料庫中的敏感性資料。 請注意,SQL Server 2016 (含) 以上版本和 Azure SQL Database 才支援此功能。

確保密碼以進行 Salt 處理的格式儲存

標題 詳細資料
元件 Database
SDL 階段 組建
適用的技術 泛型
屬性 N/A
參考 使用 .NET Crypto API 的密碼雜湊
步驟 密碼不應該儲存在自訂的使用者存放區資料庫中。 應改為使用 salt 值來儲存密碼雜湊。 請確定使用者的 salt 永遠是唯一的,並且先套用 bcrypt、scrypt 或 PBKDF2 再儲存密碼,最少以 150,000 個迴圈的工作因素反覆運算計數來排除暴力密碼破解的可能。

確定資料庫資料行中的敏感性資料已加密

標題 詳細資料
元件 Database
SDL 階段 組建
適用的技術 泛型
屬性 SQL 版本 - 全部
參考 加密 SQL Server 中的敏感性資料加密 SQL Server 中的一欄資料以憑證加密
步驟 資料庫中的敏感性資料 (例如信用卡號碼) 必須加密。 您可以使用資料行層級加密或透過使用加密功能的應用程式函式來加密資料。

確保資料庫層級的加密 (TDE) 已啟用

標題 詳細資料
元件 Database
SDL 階段 組建
適用的技術 泛型
屬性 N/A
參考 了解 SQL Server 的透明資料加密 (TDE)
步驟 SQL Server 的透明資料加密 (TDE) 功能有助於加密資料庫中的敏感性資料,並保護用來以憑證加密資料的金鑰。 這可防止沒有金鑰的人使用資料。 TDE 會保護休眠的資料,也就是資料檔和記錄檔。 它提供了與各個不同業界內建立的許多法令、規章和指導方針相符的能力,

確保資料庫備份已加密

標題 詳細資料
元件 Database
SDL 階段 組建
適用的技術 SQL Azure、OnPrem
屬性 SQL 版本 - V12、SQL 版本 - MsSQL2014
參考 SQL Database 備份加密
步驟 SQL Server 可在建立備份時加密資料。 藉由在建立備份時指定加密演算法和加密程式 (憑證或非對稱金鑰),使用者可建立加密的備份檔案。

確定與 Web API 相關的敏感性資料未儲存在瀏覽器的儲存體中

標題 詳細資料
元件 Web API
SDL 階段 組建
適用的技術 MVC 5、MVC 6
屬性 識別提供者 - ADFS、識別提供者 - Microsoft Entra ID
參考 N/A
步驟

在某些實作中,與 Web API 驗證相關的敏感性構件會儲存在瀏覽器的本機儲存體內。 例如,Microsoft Entra 驗證成品,像是 adal.idtoken、adal.nonce.idtoken、adal.access.token.key、adal.token.keys、adal.state.login、adal.session.state、adal.expiration.key 等。

即使在登出或瀏覽器關閉之後,仍可使用這些構件。 如果攻擊者取得這些構件的存取權,便可重複使用它們來存取受保護的 (API)。 確定與 Web API 相關的所有敏感性構件未儲存在瀏覽器的儲存體中。 萬一只能儲存在用戶端中 (例如,運用隱含 OpenIdConnect/OAuth 流程的單一頁面應用程式 (SPA) 需要在本機儲存存取權杖),使用的儲存選項沒有持續性。 例如,使用 SessionStorage 勝過 LocalStorage。

範例

以下 JavaScript 程式碼片段來自將驗證構件儲存在本機儲存體的自訂驗證程式庫。 請避免這類實作。

ns.AuthHelper.Authenticate = function () {
window.config = {
instance: 'https://login.microsoftonline.com/',
tenant: ns.Configurations.Tenant,
clientId: ns.Configurations.AADApplicationClientID,
postLogoutRedirectUri: window.location.origin,
cacheLocation: 'localStorage', // enable this for Internet Explorer, as sessionStorage does not work for localhost.
};

加密儲存在 Azure Cosmos DB 中的敏感性資料

標題 詳細資料
元件 Azure Document DB
SDL 階段 組建
適用的技術 泛型
屬性 N/A
參考 N/A
步驟 請先在應用程式層級加密敏感性資料再儲存於 DocumentDB,或將敏感性資料儲存在其他儲存體解決方案,例如 Azure 儲存體或 Azure SQL

使用 Azure 磁碟加密來加密虛擬機器使用的磁碟

標題 詳細資料
元件 Azure IaaS VM 信任界限
SDL 階段 部署
適用的技術 泛型
屬性 N/A
參考 使用 Azure 磁碟加密來加密虛擬機器所使用的磁碟
步驟

Azure 磁碟加密是目前預覽版中的新功能。 此功能允許您加密 IaaS 虛擬機器所使用的作業系統磁碟和資料磁碟。 對於 Windows,磁碟機是使用業界標準的 BitLocker 加密技術來加密。 對於 Linux,磁碟是使用 DM-Crypt 技術來加密。 這會與 Azure 金鑰保存庫整合,可讓您控制和管理磁碟加密金鑰。 Azure 磁碟加密解決方案支援下列三個客戶加密案例:

  • 在透過客戶加密的 VHD 檔案和客戶提供的加密金鑰 (儲存於 Azure 金鑰保存庫中) 建立的新 IaaS VM 上啟用加密。
  • 在透過 Azure Marketplace 建立的新 IaaS VM 上啟用加密。
  • 在 Azure 中已執行的現有 IaaS VM 上啟用加密。

在 Service Fabric 應用程式中加密祕密

標題 詳細資料
元件 Service Fabric 信任界限
SDL 階段 組建
適用的技術 泛型
屬性 環境 - Azure
參考 管理 Service Fabric 應用程式中的密碼
步驟 密碼可以是任何機密資訊,例如儲存體連接字串、密碼或其他不會以純文字處理的值。 使用 Azure Key Vault 來管理 Service Fabric 應用程式中的金鑰和密碼。

執行安全性模型,並在需要時使用業務單位/小組

標題 詳細資料
元件 Dynamics CRM
SDL 階段 組建
適用的技術 泛型
屬性 N/A
參考 N/A
步驟 執行安全性模型,並在需要時使用業務單位/小組

將重要實體上的存取以共用功能最小化

標題 詳細資料
元件 Dynamics CRM
SDL 階段 部署
適用的技術 泛型
屬性 N/A
參考 N/A
步驟 將重要實體上的存取以共用功能最小化

訓練使用者與 Dynamics CRM Share 功能相關聯的風險和良好的安全性做法

標題 詳細資料
元件 Dynamics CRM
SDL 階段 部署
適用的技術 泛型
屬性 N/A
參考 N/A
步驟 訓練使用者與 Dynamics CRM Share 功能相關聯的風險和良好的安全性做法

包含開發標準規則,禁止在例外狀況管理中顯示設定詳細資料

標題 詳細資料
元件 Dynamics CRM
SDL 階段 部署
適用的技術 泛型
屬性 N/A
參考 N/A
步驟 包含開發標準規則來禁止在開發外的例外狀況管理中顯示組態詳細資料。 請在檢閱程式碼或定期檢查時對此進行測試。

待用資料的 Azure 儲存體服務加密 (SSE) (預覽)

標題 詳細資料
元件 Azure 儲存體
SDL 階段 組建
適用的技術 泛型
屬性 StorageType - Blob
參考 待用資料的 Azure 儲存體服務加密 (預覽)
步驟

待用資料的 Azure 儲存體服務加密 (SSE) 會協助您保護資料安全,以符合組織安全性和法規遵循承諾。 利用此功能,Azure 儲存體會自動加密資料,再保存到儲存體,以及在擷取之前解密。 以完全無感的方式處理所有加密、解密和金鑰管理。 SSE 只適用於區塊 Blob、分頁 Blob 及附加 Blob。 其他類型的資料 (包括表格、佇列和檔案) 將不會加密。

加密和解密工作流程:

  • 客戶會在儲存體帳戶上啟用加密
  • 當客戶將新資料 (放置 Blob、放置區塊、放置頁面等等) 寫入至 Blob 儲存體,每個寫入是使用 256 位元 AES 加密 (可用的最強區塊加密方式之一) 進行加密
  • 當客戶需要存取資料 (取得 Blob 等) 時,資料會在傳回給使用者之前自動解密
  • 如果已停用加密,就不會再加密新的寫入,現有加密資料在使用者重新寫入之前會保持加密。 啟用加密時,寫入至 Blob 儲存體將會加密。 資料的狀態在使用者於啟用/停用儲存體帳戶的加密之間切換時不會變更
  • 所有加密金鑰會由 Microsoft 儲存、加密及管理

請注意,在此階段中,用來加密的金鑰是由 Microsoft 所管理。 Microsoft 一開始會產生金鑰,並管理金鑰的安全儲存體,以及如同內部 Microsoft 原則所定義的定期輪換。 客戶未來將會獲得管理自有加密金鑰的功能,並提供從 Microsoft 管理的金鑰到客戶自控金鑰的移轉路徑。

使用用戶端加密在 Azure 儲存體中儲存敏感性資料

標題 詳細資料
元件 Azure 儲存體
SDL 階段 組建
適用的技術 泛型
屬性 N/A
參考 Microsoft Azure 儲存體的用戶端加密和 Azure Key Vault 金鑰保存庫教學課程:在 Microsoft Azure 儲存體中使用 Azure 金鑰保存庫加密和解密 Blob在 Azure Blob 儲存體中使用 Azure 加密擴充功能安全地存放資料
步驟

適用於 .NET NuGet 套件的 Azure 儲存體用戶端程式庫支援在上傳至 Azure 儲存體之前將用戶端應用程式內的資料加密,並在下載至用戶端時解密資料。 程式庫也支援與 Azure 金鑰保存庫整合,以進行儲存體帳戶金鑰管理。 以下是用戶端加密運作方式的簡短描述:

  • Azure 儲存體用戶端 SDK 會產生內容加密金鑰 (CEK),這是使用一次的對稱金鑰
  • 客戶資料是使用此 CEK 加密
  • 然後使用金鑰加密金鑰 (KEK) 包裝 (加密) CEK。 KEK 由金鑰識別碼所識別,可以是非對稱金鑰組或對稱金鑰,且可以在本機管理或儲存在 Azure 金鑰保存庫中。 儲存體用戶端本身永遠沒有 KEK 的存取權。 它只是叫用金鑰保存庫所提供的金鑰包裝演算法。 如有需要,客戶可以選擇使用自訂提供者來包裝/取消包裝金鑰
  • 然後,將加密的資料上傳至 Azure 儲存體服務。 請參閱 [參考] 區段中的連結,以取得低階實作詳細資料。

將寫入電話本機儲存體的敏感性資料或 PII 資料加密

標題 詳細資料
元件 行動用戶端
SDL 階段 組建
適用的技術 泛型、Xamarin
屬性 N/A
參考 使用 Microsoft Intune 原則管理裝置上的設定和功能金鑰鏈貼身
步驟

如果應用程式在行動裝置的檔案系統上寫入敏感性資訊,例如使用者的 PII (電子郵件、電話號碼、名字、姓氏、喜好設定等),則應先將它加密再寫入本機檔案系統。 如果應用程式是企業應用程式,則請探究使用 Windows Intune 發佈應用程式的可能性。

範例

Intune 可以設定下列安全性原則來保護敏感性資料︰

Require encryption on mobile device    
Require encryption on storage cards
Allow screen capture

範例

如果應用程式不是企業應用程式,則使用平台提供的金鑰存放區、金鑰鏈來存放加密金鑰,使用可能會在檔案系統上執行的密碼編譯作業。 下列程式碼片段示範如何使用 xamarin 從金鑰鏈存取金鑰︰

        protected static string EncryptionKey
        {
            get
            {
                if (String.IsNullOrEmpty(_Key))
                {
                    var query = new SecRecord(SecKind.GenericPassword);
                    query.Service = NSBundle.MainBundle.BundleIdentifier;
                    query.Account = "UniqueID";

                    NSData uniqueId = SecKeyChain.QueryAsData(query);
                    if (uniqueId == null)
                    {
                        query.ValueData = NSData.FromString(System.Guid.NewGuid().ToString());
                        var err = SecKeyChain.Add(query);
                        _Key = query.ValueData.ToString();
                    }
                    else
                    {
                        _Key = uniqueId.ToString();
                    }
                }

                return _Key;
            }
        }

先將產生的二進位檔案模糊化,再散發給終端使用者

標題 詳細資料
元件 行動用戶端
SDL 階段 組建
適用的技術 泛型
屬性 N/A
參考 適用於 .NET 的密碼編譯模糊化 (英文)
步驟 產生的二進位檔 (apk 內的組件) 應該進行模糊處理,以阻止組件遭到進行反向工程。CryptoObfuscator 之類的工具可用於此用途。

將 clientCredentialType 設定為憑證或 Windows

標題 詳細資料
元件 WCF
SDL 階段 組建
適用的技術 .NET Framework 3
屬性 N/A
參考 Fortify
步驟 在未加密的通道上搭配使用 UsernameToken 與純文字密碼會將密碼洩漏給攻擊者,而讓其竊取到 SOAP 訊息。 使用 UsernameToken 的服務提供者可能會接受以純文字傳送的密碼。 透過未加密通道傳送純文字密碼,會將認證洩漏給攻擊者,而讓其竊取到 SOAP 訊息。

範例

下列 WCF 服務提供者組態會使用 UsernameToken:

<security mode="Message"> 
<message clientCredentialType="UserName" />

將 clientCredentialType 設定為憑證或 Windows。

未啟用 WCF 安全性模式

標題 詳細資料
元件 WCF
SDL 階段 組建
適用的技術 泛型、.NET Framework 3
屬性 安全性模式 - 傳輸、安全性模式 - 訊息
參考 MSDNFortify KingdomWCF 安全性基礎概念 CoDe Magazine
步驟 尚未定義任何傳輸或訊息安全性。 傳輸訊息的應用程式若沒有傳輸或訊息安全性,就無法保證訊息的完整性或機密性。 當 WCF 安全性繫結設定為 [無] 時,會同時停用傳輸和訊息安全性。

範例

下列組態將安全性模式設定為 [無]。

<system.serviceModel> 
  <bindings> 
    <wsHttpBinding> 
      <binding name=""MyBinding""> 
        <security mode=""None""/> 
      </binding> 
  </bindings> 
</system.serviceModel> 

範例

所有服務繫結的安全性模式有五個可能選項︰

  • 無。 關閉安全性。
  • 傳輸。 使用傳輸安全性來互相保護驗證和訊息。
  • 訊息。 使用訊息安全性來互相保護驗證和訊息。
  • 兩者。 可讓您提供傳輸和訊息層級安全性的設定 (只有 MSMQ 支援此模式)。
  • TransportWithMessageCredential。 認證會隨訊息傳遞,而且傳輸層會提供訊息保護和伺服器驗證。
  • TransportCredentialOnly。 用戶端認證會使用傳輸層傳遞,但未套用任何訊息保護。 使用傳輸和訊息安全性來保護訊息的完整性和機密性。 下列組態會告知服務搭配使用傳輸安全性和訊息認證。
    <system.serviceModel>
    <bindings>
      <wsHttpBinding>
      <binding name=""MyBinding""> 
      <security mode=""TransportWithMessageCredential""/> 
      <message clientCredentialType=""Windows""/> 
      </binding> 
    </bindings> 
    </system.serviceModel>