你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
产品/服务 | 文章 |
---|---|
Azure 事件中心 | |
Dynamics CRM | |
Azure 数据工厂 | |
标识服务器 | |
Web 应用程序 | |
数据库 | |
Azure 存储 | |
移动客户端 | |
WCF | |
Web API | |
用于 Redis 的 Azure 缓存 | |
IoT 现场网关 | |
IoT 云网关 |
使用 SSL/TLS 保护与事件中心的通信
标题 | 详细信息 |
---|---|
组件 | Azure 事件中心 |
SDL 阶段 | 建造 |
适用的技术 | 常规 |
属性 | 无 |
参考 | 事件中心身份验证和安全模型概述 |
步骤 | 使用 SSL/TLS 保护到事件中心的 AMQP 或 HTTP 连接 |
检查服务帐户权限,并检查自定义服务或 ASP.NET 页面是否遵循 CRM 的安全性
标题 | 详细信息 |
---|---|
组件 | Dynamics CRM |
SDL 阶段 | 建造 |
适用的技术 | 常规 |
属性 | 无 |
参考 | 无 |
步骤 | 检查服务帐户权限,并检查自定义服务或 ASP.NET 页面是否遵循 CRM 的安全性 |
将本地 SQL Server 连接到 Azure 数据工厂时使用数据管理网关
标题 | 详细信息 |
---|---|
组件 | Azure 数据工厂 |
SDL 阶段 | 部署 |
适用的技术 | 常规 |
属性 | 链接服务类型 - Azure 和本地 |
参考 | 在本地和 Azure 数据工厂之间移动数据 |
步骤 | 数据管理网关(DMG)工具需要连接到受公司网络或防火墙保护的数据源。
|
确保所有发到标识服务器的流量都通过 HTTPS 连接
标题 | 详细信息 |
---|---|
组件 | 标识服务器 |
SDL 阶段 | 部署 |
适用的技术 | 常规 |
属性 | 无 |
参考 | 无 |
步骤 | 默认情况下,IdentityServer 要求所有传入连接都通过 HTTPS 进行。 与 IdentityServer 的通信仅通过安全传输完成,这绝对是必需的。 某些部署方案(例如 TLS 卸载)可以放宽此要求。 有关详细信息,请参阅参考中的“标识服务器部署”页。 |
验证用于对 SSL、TLS 和 DTLS 连接进行身份验证的 X.509 证书
标题 | 详细信息 |
---|---|
组件 | Web 应用程序 |
SDL 阶段 | 建造 |
适用的技术 | 常规 |
属性 | 无 |
参考 | 无 |
步骤 | 使用 SSL、TLS 或 DTLS 的应用程序必须完全验证它们连接到的实体的 X.509 证书。 这包括验证以下项的证书:
|
在 Azure 应用服务中为自定义域配置 TLS/SSL 证书
标题 | 详细信息 |
---|---|
组件 | Web 应用程序 |
SDL 阶段 | 建造 |
适用的技术 | 常规 |
属性 | 环境类型 - Azure |
参考 | 在 Azure 应用服务中为应用启用 HTTPS |
步骤 | 默认情况下,Azure 已为每个应用启用 HTTPS,其中包含 *.azurewebsites.net 域的通配符证书。 但是,与所有通配符域一样,它不像使用具有自己的证书 引用的自定义域那样安全。 建议为要通过部署的应用访问的自定义域启用 TLS |
强制所有流量通过 HTTPS 连接进入 Azure 应用服务
标题 | 详细信息 |
---|---|
组件 | Web 应用程序 |
SDL 阶段 | 建造 |
适用的技术 | 常规 |
属性 | 环境类型 - Azure |
参考 | 在 Azure 应用服务上强制实施 HTTPS |
步骤 | 尽管 Azure 已为具有域 *.azurewebsites.net 通配符证书的 Azure 应用服务启用 HTTPS,但它不会强制实施 HTTPS。 访问者仍可能使用 HTTP 访问应用,这可能会损害应用的安全性,因此必须显式强制实施 HTTPS。 ASP.NET MVC 应用程序应使用 RequireHttps 筛选器 ,该筛选器强制通过 HTTPS 重新发送不安全的 HTTP 请求。 或者,AZURE 应用服务随附的 URL 重写模块可用于强制实施 HTTPS。 URL 重写模块使开发人员能够在将请求移交给应用程序之前定义应用于传入请求的规则。 URL 重写规则在存储在应用程序的根目录中的 web.config 文件中定义 |
示例:
以下示例包含一个基本 URL 重写规则,该规则强制所有传入流量使用 HTTPS
<?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,但将请求的 HTTP 部分替换为 HTTPS。 例如, HTTP://contoso.com
将被重定向到 HTTPS://contoso.com
。
启用 HTTP 严格传输安全性(HSTS)
标题 | 详细信息 |
---|---|
组件 | Web 应用程序 |
SDL 阶段 | 建造 |
适用的技术 | 常规 |
属性 | 无 |
参考 | OWASP HTTP 严格传输安全备忘单 |
步骤 | HTTP 严格传输安全(HSTS)是一种选择加入安全增强功能,它通过使用特殊响应标头由 Web 应用程序指定。 一旦受支持的浏览器收到此标头,浏览器将阻止通过 HTTP 向指定域发送任何通信,而是通过 HTTPS 发送所有通信。 它还会阻止用户在浏览器上绕过 HTTPS 安全提示。 若要实现 HSTS,必须在代码或配置中全局为网站配置以下响应标头。Strict-Transport-Security:max-age=300;includeSubDomains HSTS 解决了以下威胁:
|
确保 SQL Server 连接加密和证书验证
标题 | 详细信息 |
---|---|
组件 | 数据库 |
SDL 阶段 | 建造 |
适用的技术 | SQL Azure |
属性 | SQL 版本 - V12 |
参考 | 有关为 SQL 数据库编写安全连接字符串的最佳做法 |
步骤 | SQL 数据库和客户端应用程序之间的所有通信始终使用传输层安全性(TLS)进行加密,即以前的安全套接字层(SSL)。 SQL 数据库不支持未加密的连接。 若要使用应用程序代码或工具验证证书,请显式请求加密连接,并且不信任服务器证书。 如果应用程序代码或工具未请求加密连接,它们仍将接收加密连接 但是,它们可能无法验证服务器证书,因此容易受到“中间人”攻击。 若要使用 ADO.NET 应用程序代码验证证书,请在数据库连接字符串中设置 |
强制加密与 SQL Server 的通信
标题 | 详细信息 |
---|---|
组件 | 数据库 |
SDL 阶段 | 建造 |
适用的技术 | OnPrem |
属性 | SQL 版本 - MsSQL2016、SQL 版本 - MsSQL2012、SQL 版本 - MsSQL2014 |
参考 | 启用与数据库引擎的加密连接 |
步骤 | 启用 TLS 加密将增强通过网络在 SQL Server 实例与应用程序之间传输的数据的安全性。 |
确保与 Azure 存储的通信通过 HTTPS 进行
标题 | 详细信息 |
---|---|
组件 | Azure 存储 |
SDL 阶段 | 部署 |
适用的技术 | 常规 |
属性 | 无 |
参考 | Azure 存储传输级加密 – 使用 HTTPS |
步骤 | 若要确保 Azure 存储数据在传输中的安全性,请始终在调用 REST API 或访问存储中的对象时使用 HTTPS 协议。 此外,可用于委托对 Azure 存储对象的访问的共享访问签名包括一个选项,用于指定在使用共享访问签名时只能使用 HTTPS 协议的选项,确保发送具有 SAS 令牌的链接的任何人都将使用适当的协议。 |
如果无法启用 HTTPS,请在下载 Blob 后验证 MD5 哈希
标题 | 详细信息 |
---|---|
组件 | Azure 存储 |
SDL 阶段 | 建造 |
适用的技术 | 常规 |
属性 | 存储类型 - 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 |
属性 | 无 |
参考 | 证书和公钥固定 |
步骤 | 证书固定防御曼内The-Middle (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(Windows Communication Foundation) |
SDL 阶段 | 建造 |
适用的技术 | NET Framework 3 |
属性 | 无 |
参考 | MSDN、巩固王国 |
步骤 | 应用程序配置应确保 HTTPS 用于对敏感信息的所有访问。
从实际的角度来看,负责保护网络的人员并不总是在应用程序发展时跟踪应用程序的安全要求。 |
WCF:将消息安全保护级别设置为 EncryptAndSign
标题 | 详细信息 |
---|---|
组件 | WCF(Windows Communication Foundation) |
SDL 阶段 | 建造 |
适用的技术 | .NET Framework 3 |
属性 | 无 |
参考 | 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(Windows Communication Foundation) |
SDL 阶段 | 建造 |
适用的技术 | .NET Framework 3 |
属性 | 无 |
参考 | MSDN |
步骤 |
如果服务需要代表原始调用方访问特定资源,请使用模拟和委派来传递调用方身份,以进行后续授权检查。 在开发场景中,使用本地网络服务账户,这是一个具有较低特权的特殊内置账户。 在生产方案中,创建最低特权的自定义域服务帐户。 |
通过 HTTPS 连接强制所有流量发到 Web API
标题 | 详细信息 |
---|---|
组件 | 网络应用程序接口 |
SDL 阶段 | 建造 |
适用的技术 | MVC5、MVC6 |
属性 | 无 |
参考 | 在 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 Redis 缓存的通信通过 TLS 进行
标题 | 详细信息 |
---|---|
组件 | 适用于 Redis 的 Azure 缓存 |
SDL 阶段 | 建造 |
适用的技术 | 常规 |
属性 | 无 |
参考 | Azure Redis TLS 支持 |
步骤 | Redis 服务器不支持现装的 TLS,但 Azure Redis 缓存支持。 如果要连接到 Azure Redis 缓存,并且客户端支持 TLS(如 StackExchange.Redis),则应使用 TLS。 对于新的 Azure Redis 缓存实例,默认禁用非 TLS 端口。 确保安全默认值不会更改,除非对 redis 客户端的 TLS 支持存在依赖关系。 |
请注意,Redis 旨在由受信任环境中的受信任客户端访问。 这意味着,一般来说,直接将 Redis 实例暴露在互联网,或置于不受信任的客户端能够直接访问 Redis TCP 端口或 UNIX 套接字的环境中,通常不是个好主意。
保护设备到现场网关的通信
标题 | 详细信息 |
---|---|
组件 | IoT 现场网关 |
SDL 阶段 | 建造 |
适用的技术 | 常规 |
属性 | 无 |
参考 | 无 |
步骤 | 对于基于 IP 的设备,通信协议通常封装在 SSL/TLS 通道中以保护传输中的数据。 对于不支持 SSL/TLS 的其他协议,调查是否存在在传输层或消息层提供安全性的协议的安全版本。 |
使用 SSL/TLS 保护设备到云网关的通信
标题 | 详细信息 |
---|---|
组件 | IoT 云网关 |
SDL 阶段 | 建造 |
适用的技术 | 常规 |
属性 | 无 |
参考 | 选择通信协议 |
步骤 | 使用 SSL/TLS 保护 HTTP/AMQP 或 MQTT 协议。 |