安全帧:通信安全 |缓解措施

使用 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)工具需要连接到受公司网络或防火墙保护的数据源。

  1. 锁定机器可以隔离 DMG 工具,并防止故障程序损坏数据源机器或窥探数据。 (例如,必须安装最新更新、启用最低所需的端口、受控帐户预配、启用审核、启用磁盘加密等)
  2. 数据网关密钥必须定期轮换,或者每当 DMG 服务帐户密码续订时
  3. 必须加密通过链接服务传输的数据

确保所有发到标识服务器的流量都通过 HTTPS 连接

标题 详细信息
组件 标识服务器
SDL 阶段 部署
适用的技术 常规
属性
参考
步骤 默认情况下,IdentityServer 要求所有传入连接都通过 HTTPS 进行。 与 IdentityServer 的通信仅通过安全传输完成,这绝对是必需的。 某些部署方案(例如 TLS 卸载)可以放宽此要求。 有关详细信息,请参阅参考中的“标识服务器部署”页。

验证用于对 SSL、TLS 和 DTLS 连接进行身份验证的 X.509 证书

标题 详细信息
组件 Web 应用程序
SDL 阶段 建造
适用的技术 常规
属性
参考
步骤

使用 SSL、TLS 或 DTLS 的应用程序必须完全验证它们连接到的实体的 X.509 证书。 这包括验证以下项的证书:

  • 域名
  • 有效期(开始日期和到期日期)
  • 吊销状态
  • 使用情况(例如服务器身份验证、客户端身份验证)
  • 信任链。 证书必须链接到由平台信任的根证书颁发机构(CA),或由管理员显式配置
  • 证书公钥的密钥长度必须为 >2048 位
  • 哈希算法必须是 SHA256 及更高版本

在 Azure 应用服务中为自定义域配置 TLS/SSL 证书

标题 详细信息
组件 Web 应用程序
SDL 阶段 建造
适用的技术 常规
属性 环境类型 - Azure
参考 在 Azure 应用服务中为应用启用 HTTPS
步骤 默认情况下,Azure 已为每个应用启用了 HTTPS,并为 *.chinacloudsites.cn 域提供通配符证书。 但是,与所有通配符域一样,它不像使用具有自己的证书 引用的自定义域那样安全。 建议为要通过部署的应用访问的自定义域启用 TLS

强制所有流量通过 HTTPS 连接进入 Azure 应用服务

标题 详细信息
组件 Web 应用程序
SDL 阶段 建造
适用的技术 常规
属性 环境类型 - Azure
参考 在 Azure 应用服务上强制实施 HTTPS
步骤

尽管 Azure 已为具有域 *.chinacloudsites.cn 通配符证书的 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 解决了以下威胁:

  • 用户通过书签或手动输入 https://example.com,可能遭遇中间人攻击:HSTS 会自动将该目标域的 HTTP 请求重定向到 HTTPS。
  • 旨在纯 HTTPS 的 Web 应用程序无意中包含 HTTP 链接或通过 HTTP 提供内容:HSTS 会自动将 HTTP 请求重定向到目标域的 HTTPS
  • 中间人攻击者尝试使用无效证书截获来自受害者用户的流量,并希望用户接受错误的证书:HSTS 不允许用户覆盖无效的证书消息

确保 SQL Server 连接加密和证书验证

标题 详细信息
组件 数据库
SDL 阶段 建造
适用的技术 SQL Azure
属性 SQL 版本 - V12
参考 有关为 SQL 数据库编写安全连接字符串的最佳做法
步骤

SQL 数据库和客户端应用程序之间的所有通信始终使用传输层安全性(TLS)进行加密,即以前的安全套接字层(SSL)。 SQL 数据库不支持未加密的连接。 若要使用应用程序代码或工具验证证书,请显式请求加密连接,并且不信任服务器证书。 如果应用程序代码或工具未请求加密连接,它们仍将接收加密连接

但是,它们可能无法验证服务器证书,因此容易受到“中间人”攻击。 若要使用 ADO.NET 应用程序代码验证证书,请在数据库连接字符串中设置 Encrypt=TrueTrustServerCertificate=False。 若要通过 SQL Server Management Studio 验证证书,请打开“连接到服务器”对话框。 单击“连接属性”选项卡上的“加密连接”

强制加密与 SQL Server 的通信

标题 详细信息
组件 数据库
SDL 阶段 建造
适用的技术 OnPrem
属性 SQL 版本 - MsSQL2016、SQL 版本 - MsSQL2012、SQL 版本 - MsSQL2014
参考 启用与数据库引擎的加密连接
步骤 启用 TLS 加密将增强通过网络在 SQL Server 实例与应用程序之间传输的数据的安全性。

确保与 Azure 存储的通信通过 HTTPS 进行

标题 详细信息
组件 Azure 存储
SDL 阶段 部署
适用的技术 常规
属性
参考 Azure 存储 Transport-Level 的加密功能 - 使用 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 的 ServerCertificateValidationCallback 委托来防止 MITM 证书固定。

示例:

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://www.azure.cn/");
            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 用于对敏感信息的所有访问。
  • 解释: 如果应用程序处理敏感信息并且不使用消息级加密,则只应允许它通过加密传输通道进行通信。
  • 建议: 确保禁用 HTTP 传输并改为启用 HTTPS 传输。 例如,用<httpsTransport/>标签替换<httpTransport/>标签。 不要依赖于网络配置(防火墙),以确保只能通过安全通道访问应用程序。 从哲学的角度来看,应用程序不应依赖于网络的安全性。

从实际的角度来看,负责保护网络的人员并不总是在应用程序发展时跟踪应用程序的安全要求。

WCF:将消息安全保护级别设置为 EncryptAndSign

标题 详细信息
组件 WCF(Windows Communication Foundation)
SDL 阶段 建造
适用的技术 .NET Framework 3
属性
参考 MSDN
步骤
  • 解释: 当保护级别设置为“none”时,它将禁用消息保护。 机密性和完整性是通过适当的设定程度来实现的。
  • 建议:
    • when Mode=None - 禁用消息保护
    • when Mode=Sign - 签名但不加密消息;应在数据完整性很重要时使用
    • when Mode=EncryptAndSign - 对消息进行签名和加密

如果只需要验证信息的完整性而不考虑保密性,请考虑关闭加密,并仅对消息进行签名。 这对于需要验证原始发件人但未传输敏感数据的作或服务协定可能很有用。 减少保护级别时,请注意消息不包含任何个人数据。

示例:

以下示例显示了配置服务和操作以只对消息进行签名。 服务协定示例 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
步骤
  • 解释: 不要在管理员或高特权帐户下运行 WCF 服务。 如果服务被破坏,则会导致影响严重。
  • 建议: 使用最低特权帐户托管 WCF 服务,因为它会减少应用程序的攻击面,并减少受到攻击的潜在损害。 如果服务帐户需要 MSMQ、事件日志、性能计数器和文件系统等基础结构资源的其他访问权限,则应为这些资源提供适当的权限,以便 WCF 服务能够成功运行。

如果服务需要代表原始调用方访问特定资源,请使用模拟和委派来传递调用方身份,以进行后续授权检查。 在开发场景中,使用本地网络服务账户,这是一个具有较低特权的特殊内置账户。 在生产方案中,创建最低特权的自定义域服务帐户。

通过 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 协议。