| 產品/服務 |
發行項 |
| 電腦信任邊界 |
|
| 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 |
| 參考 |
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 個迴圈的工作因素反覆運算計數來排除暴力密碼破解的可能。 |
確定資料庫資料行中的敏感性資料已加密
確保資料庫層級的加密 (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 儲存體中儲存敏感性資料
將寫入電話本機儲存體的敏感性資料或 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 安全性模式
範例
下列組態將安全性模式設定為 [無]。
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name=""MyBinding"">
<security mode=""None""/>
</binding>
</bindings>
</system.serviceModel>
範例
所有服務繫結的安全性模式有五個可能選項︰