安全性架構︰通訊安全性 | 風險降低
產品/服務 | 發行項 |
---|---|
Azure 事件中樞 | |
Dynamics CRM | |
Azure Data Factory | |
Identity Server | |
Web 應用程式 | |
Database | |
Azure 儲存體 | |
行動用戶端 | |
WCF | |
Web API | |
Azure Cache for Redis | |
IoT 現場閘道 | |
IoT 雲端閘道 |
使用 SSL/TLS 保護與事件中樞的通訊
標題 | 詳細資料 |
---|---|
元件 | Azure 事件中樞 |
SDL 階段 | 組建 |
適用的技術 | 泛型 |
屬性 | N/A |
參考 | 事件中樞驗證和安全性模型概觀 |
步驟 | 使用 SSL/TLS 保護事件中樞的 AMQP 或 HTTP 連線 |
檢查服務帳戶權限,並確認自訂服務或 ASP.NET 網頁採用 CRM 的安全性
標題 | 詳細資料 |
---|---|
元件 | Dynamics CRM |
SDL 階段 | 組建 |
適用的技術 | 泛型 |
屬性 | N/A |
參考 | N/A |
步驟 | 檢查服務帳戶權限,並確認自訂服務或 ASP.NET 網頁採用 CRM 的安全性 |
在將內部部署 SQL Server 連線至 Azure Data Factory 時使用資料管理閘道
標題 | 詳細資料 |
---|---|
元件 | Azure Data Factory |
SDL 階段 | 部署 |
適用的技術 | 泛型 |
屬性 | 已連結的服務類型 - Azure 和內部部署 |
參考 | 在內部部署與 Azure Data Factory 之間移動資料 |
步驟 | 必須有資料管理閘道 (DMG) 工具才能連線到受到公司網路或防火牆保護的資料來源。
|
確定前往 Identity Server 的所有流量都是透過 HTTPS 連線
標題 | 詳細資料 |
---|---|
元件 | Identity Server |
SDL 階段 | 部署 |
適用的技術 | 泛型 |
屬性 | N/A |
參考 | IdentityServer3 - 金鑰、簽章和密碼編譯、IdentityServer3 - 部署 |
步驟 | 根據預設,IdentityServer 要求所有連入連線必須透過 HTTPS 傳輸過來。 與 IdentityServer 的通訊絕對必須只透過安全的傳輸來進行。 某些部署案例 (例如 TLS 卸載) 可以放寬此需求。 如需詳細資訊,請參閱 [參考] 中的 Identity Server 部署頁面。 |
檢查用來驗證 SSL、TLS 與 DTLS 連線的 X.509 憑證
標題 | 詳細資料 |
---|---|
元件 | Web 應用程式 |
SDL 階段 | 組建 |
適用的技術 | 泛型 |
屬性 | N/A |
參考 | N/A |
步驟 | 使用 SSL、TLS 或 DTLS 的應用程式必須完全驗證其所連線到之實體的 X.509 憑證。 這包括驗證憑證的下列項目︰
|
在 Azure App Service 中設定自訂網域的 TLS/SSL 憑證
標題 | 詳細資料 |
---|---|
元件 | Web 應用程式 |
SDL 階段 | 組建 |
適用的技術 | 泛型 |
屬性 | EnvironmentType - Azure |
參考 | 針對 Azure App Service 中的 App 啟用 HTTPS |
步驟 | 根據預設,Azure 已使用 *.azurewebsites.net 網域的萬用字元憑證來啟用每一個應用程式的 HTTPS。 但是,就像所有萬用字元網域一樣,這並不如使用自訂網域搭配自己的憑證那麼安全。參閱。 建議您針對要透過其存取已部署應用程式的自訂網域啟用 TLS |
強制所有前往 Azure App Service 的流量透過 HTTPS 連線來進行
標題 | 詳細資料 |
---|---|
元件 | Web 應用程式 |
SDL 階段 | 組建 |
適用的技術 | 泛型 |
屬性 | EnvironmentType - Azure |
參考 | 在 Azure App Service 上強制使用 HTTPS |
步驟 | 雖然 Azure 已使用 *.azurewebsites.net 網域的萬用字元憑證來啟用 Azure App Service 的 HTTPS,但它不會強制使用 HTTPS。 訪客可能仍會使用 HTTP 存取應用程式,而危及應用程式的安全性,因此您必須明確地強制使用 HTTPS。 ASP.NET MVC 應用程式應使用 RequireHttps 篩選 來強迫不安全的 HTTP 要求透過 HTTPS 重新傳送。 或者,您也可以使用 Azure App Service 隨附的 URL Rewrite 模組來強制使用 HTTPS。 URL Rewrite 模組可讓開發人員定義連入要求在送達應用程式之前要套用的規則。 您可以在儲存於應用程式根目錄的 web.config 檔案中定義 URL Rewrite 規則 |
範例
下列範例包含可強制所有連入流量使用 HTTPS 的基本 URL Rewrite 規則
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Force HTTPS" enabled="true">
<match url="(.*)" ignoreCase="false" />
<conditions>
<add input="{HTTPS}" pattern="off" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" appendQueryString="true" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
此規則的運作方式是當使用者使用 HTTP 要求頁面時,便傳回 HTTP 狀態碼 301 (永久重新導向)。 301 會將要求重新導向至與訪客要求相同的 URL,但使用 HTTPS 來取代要求的 HTTP 部分。 例如,HTTP://contoso.com
會重新導向至 HTTPS://contoso.com
。
啟用 HTTP Strict Transport Security (HSTS)
標題 | 詳細資料 |
---|---|
元件 | Web 應用程式 |
SDL 階段 | 組建 |
適用的技術 | 泛型 |
屬性 | N/A |
參考 | OWASP HTTP Strict Transport Security 功能提要 |
步驟 | HTTP Strict Transport Security (HSTS) 是可供選擇加入的安全性增強功能,可由 Web 應用程式透過使用特殊的回應標頭來指定。 支援的瀏覽器在收到此標頭之後,該瀏覽器會防止任何通訊透過 HTTP 傳送到指定網域,並改為透過 HTTPS 傳送所有通訊。 它也可以防止瀏覽器上出現 HTTPS 點選提示。 若要實作 HSTS,必須在網站全域設定下列回應標頭,不論是設定於程式碼或組態中。Strict-Transport-Security: max-age=300;includeSubDomains HSTS 可應付下列威脅:
|
啟用 SQL Server 連線加密和憑證驗證
標題 | 詳細資料 |
---|---|
元件 | Database |
SDL 階段 | 組建 |
適用的技術 | SQL Azure |
屬性 | SQL 版本 - V12 |
參考 | 為 SQL Database 撰寫安全連接字串的最佳作法 |
步驟 | SQL Database 和用戶端應用程式之間的所有通訊永遠都會使用傳輸層安全性 (TLS) (先前稱為安全通訊端層 (SSL)) 來加密。 SQL Database 不支援未加密連線。 若要使用應用程式程式碼或工具驗證憑證,請明確地要求加密的連接,並且不要信任伺服器憑證。 即使您的應用程式程式碼或工具未要求加密連線,它們仍然會接收加密的連線 不過,它們可能不會驗證伺服器憑證,這樣一來很容易受到「攔截式」攻擊。 若要使用 ADO.NET 應用程式程式碼驗證憑證,請在資料庫連接字串中設定 |
強制加密與 SQL Server 的通訊
標題 | 詳細資料 |
---|---|
元件 | Database |
SDL 階段 | 組建 |
適用的技術 | OnPrem |
屬性 | SQL 版本 - MsSQL2016、SQL 版本 - MsSQL2012、SQL 版本 - MsSQL2014 |
參考 | 啟用資料庫引擎的加密連接 |
步驟 | 啟用 TLS 加密,可提高 SQL Server 執行個體和應用程式之間跨網路傳輸資料的安全性。 |
確定對 Azure 儲存體的通訊是透過 HTTPS 來進行
標題 | 詳細資料 |
---|---|
元件 | Azure 儲存體 |
SDL 階段 | 部署 |
適用的技術 | 泛型 |
屬性 | N/A |
參考 | Azure 儲存體傳輸層級加密 – 使用 HTTPS |
步驟 | 若要確保傳輸中 Azure 儲存體資料的安全性,請在呼叫 REST API 或存取儲存體中的物件時一律使用 HTTPS 通訊協定。 此外,共用存取簽章 (可用來委派 Azure 儲存體物件的存取權) 包含一個選項,可指定在使用共用存取簽章時只能使用 HTTPS 通訊協定,以確保任何使用 SAS 權杖送出連結的人都將使用正確的通訊協定。 |
如果無法啟用 HTTPS,則在下載 Blob 之後驗證 MD5 雜湊
標題 | 詳細資料 |
---|---|
元件 | Azure 儲存體 |
SDL 階段 | 組建 |
適用的技術 | 泛型 |
屬性 | StorageType - Blob |
參考 | Windows Azure Blob MD5 概觀 |
步驟 | Windows Azure Blob 服務會提供相關機制來確保應用程式和傳輸層的資料完整性。 如果基於任何原因,您必須使用 HTTP 而不是 HTTPS,且您要使用區塊 Blob,您可以使用 MD5 檢查,協助確認要傳輸的 Blob 完整性 這有助於提供保護以防止發生網路/傳輸層錯誤,但不一定是媒介攻擊。 如果您可以使用 HTTPS 來提供傳輸層安全性,則使用 MD5 檢查是多餘且不必要的。 |
使用 SMB 3.x 相容用戶端來確保要傳輸到 Azure 檔案共用的資料會加密
標題 | 詳細資料 |
---|---|
元件 | 行動用戶端 |
SDL 階段 | 組建 |
適用的技術 | 泛型 |
屬性 | StorageType - 檔案 |
參考 | Azure 檔案儲存體、適用於 Windows 用戶端的 Azure 檔案儲存體 SMB 支援 |
步驟 | 使用 REST API 時,Azure 檔案服務支援 HTTPS,但較常用來作為附加到 VM 的 SMB 檔案共用。 SMB 2.1 不支援加密,因此只允許在 Azure 中的相同區域內連接。 不過,SMB 3.x 支援加密,而且可以搭配 Windows Server 2012 R2、Windows 8、Windows 8.1 和 Windows 10 使用,允許跨區域存取,甚至是桌面上的存取。 |
實作憑證關聯
標題 | 詳細資料 |
---|---|
元件 | Azure 儲存體 |
SDL 階段 | 組建 |
適用的技術 | 泛型、Windows Phone |
屬性 | N/A |
參考 | 憑證和公開金鑰釘選 |
步驟 | 憑證釘選可防止攔截式 (MITM) 攻擊。 釘選程序會將主機與其預期的 X509 憑證或公開金鑰相關聯。 在主機已知或已看到憑證或公開金鑰後,憑證或公開金鑰便已關聯或「釘選」到主機。 因此,當敵人嘗試發動 TLS MITM 攻擊時,在 TLS 交握期間,來自攻擊者伺服器的金鑰將會與已釘選憑證的金鑰不同,從而捨棄該要求,因此,就能透過實作 ServicePointManager 的 |
範例
using System;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography;
namespace CertificatePinningExample
{
class CertificatePinningExample
{
/* Note: In this example, we're hardcoding the certificate's public key and algorithm for
demonstration purposes. In a real-world application, this should be stored in a secure
configuration area that can be updated as needed. */
private static readonly string PINNED_ALGORITHM = "RSA";
private static readonly string PINNED_PUBLIC_KEY = "3082010A0282010100B0E75B7CBE56D31658EF79B3A1" +
"294D506A88DFCDD603F6EF15E7F5BCBDF32291EC50B2B82BA158E905FE6A83EE044A48258B07FAC3D6356AF09B2" +
"3EDAB15D00507B70DB08DB9A20C7D1201417B3071A346D663A241061C151B6EC5B5B4ECCCDCDBEA24F051962809" +
"FEC499BF2D093C06E3BDA7D0BB83CDC1C2C6660B8ECB2EA30A685ADE2DC83C88314010FFC7F4F0F895EDDBE5C02" +
"ABF78E50B708E0A0EB984A9AA536BCE61A0C31DB95425C6FEE5A564B158EE7C4F0693C439AE010EF83CA8155750" +
"09B17537C29F86071E5DD8CA50EBD8A409494F479B07574D83EDCE6F68A8F7D40447471D05BC3F5EAD7862FA748" +
"EA3C92A60A128344B1CEF7A0B0D94E50203010001";
public static void Main(string[] args)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://azure.microsoft.com");
request.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) =>
{
if (certificate == null || sslPolicyErrors != SslPolicyErrors.None)
{
// Error getting certificate or the certificate failed basic validation
return false;
}
var targetKeyAlgorithm = new Oid(certificate.GetKeyAlgorithm()).FriendlyName;
var targetPublicKey = certificate.GetPublicKeyString();
if (targetKeyAlgorithm == PINNED_ALGORITHM &&
targetPublicKey == PINNED_PUBLIC_KEY)
{
// Success, the certificate matches the pinned value.
return true;
}
// Reject, either the key or the algorithm does not match the expected value.
return false;
};
try
{
var response = (HttpWebResponse)request.GetResponse();
Console.WriteLine($"Success, HTTP status code: {response.StatusCode}");
}
catch(Exception ex)
{
Console.WriteLine($"Failure, {ex.Message}");
}
Console.WriteLine("Press any key to end.");
Console.ReadKey();
}
}
}
啟用 HTTPS - 安全傳輸通道
標題 | 詳細資料 |
---|---|
元件 | WCF |
SDL 階段 | 組建 |
適用的技術 | NET Framework 3 |
屬性 | N/A |
參考 | MSDN、Fortify Kingdom |
步驟 | 應用程式組態應確定敏感性資訊的所有存取都會使用 HTTPS。
但從現實觀點來看,負責保護網路的人員不一定能跟隨應用程式安全性需求的演變腳步。 |
WCF︰將訊息安全性保護層級設定為 EncryptAndSign
標題 | 詳細資料 |
---|---|
元件 | WCF |
SDL 階段 | 組建 |
適用的技術 | .NET Framework 3 |
屬性 | N/A |
參考 | MSDN |
步驟 |
若您只需要驗證資訊的完整性而不必擔心機密性,請考慮關閉加密功能,只要簽署訊息即可。 對於需要驗證原始傳送者,但不會傳輸敏感性資料的作業或服務合約,這會非常實用。 在降低保護層級時,請注意訊息並未包含任何個人資料。 |
範例
下列範例顯示將服務和作業設定為只簽署訊息的情況。 ProtectionLevel.Sign
的服務合約範例:以下是在服務合約層級使用 ProtectionLevel.Sign 的範例︰
[ServiceContract(Protection Level=ProtectionLevel.Sign]
public interface IService
{
string GetData(int value);
}
範例
ProtectionLevel.Sign
的作業合約範例 (適用於細微控制)︰以下是在作業合約層級使用 ProtectionLevel.Sign
的範例︰
[OperationContract(ProtectionLevel=ProtectionLevel.Sign]
string GetData(int value);
WCF︰使用最低權限帳戶來執行 WCF 服務
標題 | 詳細資料 |
---|---|
元件 | WCF |
SDL 階段 | 組建 |
適用的技術 | .NET Framework 3 |
屬性 | N/A |
參考 | MSDN |
步驟 |
如果您的服務需要代表原始呼叫者存取特定資源,請使用模擬與委派來傳送呼叫者的身分識別以進行下游授權檢查。 在開發案例中,請使用區域網路服務帳戶,這是擁有較小權限的特殊內建帳戶。 在生產案例中,請建立最低權限的自訂網域服務帳戶。 |
強制所有前往 Web API 的流量透過 HTTPS 連線來進行
標題 | 詳細資料 |
---|---|
元件 | Web API |
SDL 階段 | 組建 |
適用的技術 | MVC5、MVC6 |
屬性 | N/A |
參考 | 在 Web API 控制器中強制執行 SSL |
步驟 | 如果應用程式同時具有 HTTPS 和 HTTP 繫結,用戶端仍可使用 HTTP 來存取網站。 若要避免這個問題,請使用動作篩選來確保受保護之 API 的要求一律會透過 HTTPS。 |
範例
下列程式碼顯示會檢查 TLS 的 Web API 驗證篩選:
public class RequireHttpsAttribute : AuthorizationFilterAttribute
{
public override void OnAuthorization(HttpActionContext actionContext)
{
if (actionContext.Request.RequestUri.Scheme != Uri.UriSchemeHttps)
{
actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden)
{
ReasonPhrase = "HTTPS Required"
};
}
else
{
base.OnAuthorization(actionContext);
}
}
}
將此篩選新增至任何需要 TLS 的 Web API 動作:
public class ValuesController : ApiController
{
[RequireHttps]
public HttpResponseMessage Get() { ... }
}
確定對 Azure Cache for Redis 的通訊是透過 TLS
標題 | 詳細資料 |
---|---|
元件 | Azure Cache for Redis |
SDL 階段 | 組建 |
適用的技術 | 泛型 |
屬性 | N/A |
參考 | Azure Redis TLS 支援 |
步驟 | Redis 伺服器不支援現成可用的 TLS,但 Azure Cache for Redis 支援。 如果您是連線至 Azure Cache for Redis,且您的用戶端支援 TLS (例如 StackExchange.Redis),則應該使用 TLS。 預設會對新的 Azure Cache for Redis 執行個體停用非 TLS 連接埠。 除非 Redis 用戶端仰賴 TLS 支援,否則,請確保安全的預設值未遭變更。 |
請注意,Redis 是設計成要供受信任環境內的受信任用戶端存取。 這表示,讓 Redis 執行個體直接面對網際網路通常不是什麼好主意,或者一般來說,讓它直接面對不受信任之用戶端可直接存取 Redis TCP 連接埠或 UNIX 通訊端的環境也不是好主意。
保護裝置對現場閘道的通訊
標題 | 詳細資料 |
---|---|
元件 | IoT 現場閘道 |
SDL 階段 | 組建 |
適用的技術 | 泛型 |
屬性 | N/A |
參考 | N/A |
步驟 | 對於 IP 型裝置,通訊協定通常可以封裝在 SSL/TLS 通道來保護傳輸中的資料。 對於其他不支援 SSL/TLS 的通訊協定,請調查是否有安全版本的通訊協定可在傳輸層或訊息層提供安全性。 |
使用 SSL/TLS 保護裝置對雲端閘道的通訊
標題 | 詳細資料 |
---|---|
元件 | IoT 雲端閘道 |
SDL 階段 | 組建 |
適用的技術 | 泛型 |
屬性 | N/A |
參考 | 選擇您的通訊協定 |
步驟 | 使用 SSL/TLS 的安全 HTTP/AMQP 或 MQTT 通訊協定。 |