针对发送到存储帐户的请求强制实施必需的最低版本的传输层安全性 (TLS)

客户端应用程序与 Azure 存储帐户之间的通信使用传输层安全性 (TLS) 进行加密。 TLS 是一种标准的加密协议,可确保通过 Internet 进行通信的客户端与服务之间的隐私和数据完整性。 有关 TLS 的详细信息,请参阅传输层安全性

Azure 存储当前支持 TLS 协议的三个版本:1.0、1.1 和 1.2。 Azure 存储在公共 HTTPS 终结点上使用 TLS 1.2,但仍支持 TLS 1.0 和 TLS 1.1 以实现后向兼容性。

Azure 存储帐户允许客户端使用 TLS 的最早版本、TLS 1.0 及更高版本发送和接收数据。 若要强制实施更严格的安全措施,可以将存储帐户配置为要求客户端使用较新版本的 TLS 发送和接收数据。 如果存储帐户对 TLS 存在最低版本要求,则使用较旧版本发出的任何请求都会失败。

本文介绍了如何使用 DRAG(Detection-Remediation-Audit-Governance,检测-修正-审核-治理)框架为你的存储帐户持续管理安全的 TLS。

若要了解如何在从客户端应用程序发送请求时指定 TLS 的特定版本,请参阅为客户端应用程序配置传输层安全性 (TLS)

注意

客户端向存储帐户发送数据和从存储帐户接收数据时使用的密码套件取决于所使用的 TLS 版本。 无法将存储帐户配置为阻止使用特定密码,除非要求最低 TLS 版本。 如果你需要在连接到存储帐户时只允许特定密码套件的功能,请考虑使用 Azure 应用程序网关。 若要详细了解如何使用应用程序网关来实现此目的,请参阅在 Azure 应用程序网关上配置 TLS 策略版本和密码套件

检测客户端应用程序使用的 TLS 版本

在对存储帐户强制实施最低 TLS 版本时,可能会拒绝使用较旧版本的 TLS 发送数据的客户端发出的请求。 为了了解配置最低 TLS 版本可能会对客户端应用程序产生的影响,Microsoft 建议你对 Azure 存储帐户启用日志记录,并在间隔一段时间后分析日志,以检测 TLS 客户端应用程序使用的是哪个版本。

为了记录向 Azure 存储帐户发出的请求并确定客户端使用的 TLS 版本,可以使用 Azure Monitor 中的 Azure 存储日志记录。 有关详细信息,请参阅监视 Azure 存储

Azure Monitor 中的 Azure 存储日志记录支持使用日志查询来分析日志数据。 若要查询日志,可以使用 Azure Log Analytics 工作区。 若要详细了解日志查询,请参阅教程:Log Analytics 查询入门

若要使用 Azure Monitor 记录 Azure 存储数据并使用 Azure Log Analytics 对其进行分析,必须先创建一项诊断设置,用于指示要记录其数据的请求类型和存储服务。 若要在 Azure 门户中创建诊断设置,请执行以下步骤:

  1. 在包含你的 Azure 存储帐户的订阅中创建一个新 Log Analytics 工作区。 配置存储帐户的日志记录后,日志将在 Log Analytics 工作区中提供。 有关详细信息,请参阅在 Azure 门户中创建 Log Analytics 工作区

  2. 导航到 Azure 门户中的存储帐户。

  3. 在“监视”部分中,选择“诊断设置”。

  4. 选择要记录其请求的 Azure 存储服务。 例如,选择“Blob”会记录对 Blob 存储发出的请求。

  5. 选择“添加诊断设置”。

  6. 为该诊断设置提供一个名称。

  7. 在“类别详细信息”下的“日志”部分,选择要记录的请求类型。 可以记录读取、写入和删除请求。 例如,选择“StorageRead”和“StorageWrite”会记录对所选服务发送的读取和写入请求。

  8. 在“目标详细信息”下选择“发送到 Log Analytics”。 选择你的订阅以及前面创建的 Log Analytics 工作区,如下图所示。

    Screenshot showing how to create a diagnostic setting for logging requests

创建诊断设置后,今后会根据该设置记录对存储帐户发出的请求。 有关详细信息,请参阅创建诊断设置以收集 Azure 中的资源日志和指标

有关 Azure Monitor 的 Azure 存储日志中可用字段的参考,请参阅资源日志

按 TLS 版本查询记录的请求

Azure Monitor 中的 Azure 存储日志包含用于向存储帐户发送请求的 TLS 版本。 使用 TlsVersion 属性可检查已记录请求的 TLS 版本。

要确定过去七天内使用不同版本的 TLS 对 Blob 存储发出了多少请求,请打开 Log Analytics 工作区。 接下来,将以下查询粘贴到新的日志查询中并运行该查询。 请记得将括号中的占位符值替换为你自己的值:

StorageBlobLogs
| where TimeGenerated > ago(7d) and AccountName == "<account-name>"
| summarize count() by TlsVersion

结果将显示使用各个 TLS 版本发出的请求数计数:

Screenshot showing results of log analytics query to return TLS version

按调用方 IP 地址和用户代理标头查询记录的请求

Azure Monitor 中的 Azure 存储日志还包括调用方 IP 地址和用户代理标头,以帮助你评估哪些客户端应用程序访问了存储帐户。 通过分析这些值,可以确定是必须更新客户端应用程序以使用较新的 TLS 版本,还是可以接受客户端未使用最低 TLS 版本发送请求时导致的失败。

要确定过去七天内哪些客户端使用低于 TLS 1.2 的 TLS 版本发出了请求,请将以下查询粘贴到新的日志查询中并运行该查询。 请记得将括号中的占位符值替换为你自己的值:

StorageBlobLogs
| where TimeGenerated > ago(7d) and AccountName == "<account-name>" and TlsVersion != "TLS 1.2"
| project TlsVersion, CallerIpAddress, UserAgentHeader

使用最低版本的 TLS 修正安全风险

如果你确信来自使用较旧版 TLS 的客户端的流量很小,或者允许使用较旧版 TLS 发出的请求失败,则可开始在存储帐户上实施最低版本的 TLS。 要求客户端使用最低版本的 TLS 对存储帐户发出请求是将数据的安全风险降至最低的策略的一部分。

重要

如果使用连接到 Azure 存储的服务,请确保在你设置存储帐户所需的最低版本前,该服务使用相应的 TLS 版本向 Azure 存储发送请求。

为存储帐户配置最低 TLS 版本

若要为存储帐户配置最低 TLS 版本,请为该帐户设置 MinimumTlsVersion 版本。 此属性适用于使用 Azure 资源管理器部署模型创建的所有存储帐户。 有关 Azure 资源管理器部署模型的详细信息,请参阅存储帐户概述

MinimumTlsVersion 属性的默认值因其设置方式而异。 通过 Azure 门户创建存储帐户时,默认情况下,最低 TLS 版本设置为 1.2。 使用 PowerShell、Azure CLI 或 Azure 资源管理器模板创建存储帐户时,默认情况下不会设置 MinimumTlsVersion 属性。在你显式设置此属性之前,它不会返回值。

如果未设置 MinimumTlsVersion 属性,则其值可能会显示为 null 或空字符串,具体取决于上下文 。 如果未设置属性值,则存储帐户会允许以 TLS 1.0 或更高版本发送的请求。

通过 Azure 门户创建存储帐户时,默认情况下,最低 TLS 版本设置为 1.2。

若要通过 Azure 门户为现有存储帐户配置最低 TLS 版本,请执行以下步骤:

  1. 导航到 Azure 门户中的存储帐户。

  2. 在“设置”下,选择“配置”。

  3. 在“最低 TLS 版本”下,使用下拉列表选择访问此存储帐户中的数据必需的最低 TLS 版本。

    Screenshot showing how to configure minimum version of TLS in the Azure portal.

注意

更新存储帐户的最低 TLS 版本后,最多可能需要 30 秒才能完全传播更改。

配置最低 TLS 版本需要 Azure 存储资源提供程序的 2019-04-01 版或更高版本。 有关详细信息,请参阅 Azure 存储资源提供程序 REST API

检查多个帐户的必需最低 TLS 版本

若要在具有最佳性能的一组存储帐户中检查必需的最低 TLS 版本,可以使用 Azure 门户中的 Azure Resource Graph 资源管理器。 若要详细了解如何使用 Resource Graph 资源管理器,请参阅快速入门:使用 Azure Resource Graph 资源管理器运行你的第一个 Resource Graph 查询

在 Resource Graph 资源管理器中运行以下查询将返回存储帐户的列表,并显示每个帐户的最低 TLS 版本:

resources
| where type =~ 'Microsoft.Storage/storageAccounts'
| extend minimumTlsVersion = parse_json(properties).minimumTlsVersion
| project subscriptionId, resourceGroup, name, minimumTlsVersion

测试客户端的最低 TLS 版本

若要测试存储帐户必需的最低 TLS 版本是否禁止使用较旧版本发出的调用,可以将客户端配置为使用较旧版本的 TLS。 若要详细了解如何将客户端配置为使用特定的 TLS 版本,请参阅为客户端应用程序配置传输层安全性 (TLS)

当客户端使用不满足为帐户配置的最低 TLS 版本的 TLS 版本访问存储帐户时,Azure 存储会返回错误代码 400 错误(错误请求),并返回一条消息,指示不允许所使用的 TLS 版本对此存储帐户发出请求。

注意

为存储帐户配置最低 TLS 版本时,该最低版本将在应用程序层强制执行。 当直接针对存储帐户终结点运行时,尝试在协议层确定 TLS 支持的工具可能会返回 TLS 版本以及所需的最低版本。

使用 Azure Policy 审核合规性

如果你有大量存储帐户,则可能需要执行审核,以确保为所有帐户配置组织所需的最低 TLS 版本。 若要审核一组存储帐户的合规性,请使用 Azure Policy。 Azure Policy 是一项服务,可用于创建、分配和管理将规则应用于 Azure 资源的策略。 Azure Policy 可帮助你确保这些资源始终符合公司标准和服务级别协议。 有关详细信息,请参阅 Azure Policy 概述

创建具有 Audit 效果的策略

Azure Policy 支持的效果决定了针对资源评估某个策略规则时会发生什么情况。 当资源不合规时,Audit 效果会创建一个警告,但不会停止请求。 有关效果的详细信息,请参阅了解 Azure Policy 效果

若要通过 Azure 门户针对最低 TLS 版本创建具有 Audit 效果的策略,请执行以下步骤:

  1. 在 Azure 门户中,导航到 Azure Policy 服务。

  2. 在“创作”部分下,选择“定义”。

  3. 选择“添加策略定义”以创建新的策略定义。

  4. 对于“定义位置”字段,选择“更多”按钮以指定审核策略资源所在的位置。

  5. 指定策略的名称。 还可以指定说明和类别。

  6. 在“策略规则”下,将以下策略定义添加到“policyRule”部分。

    {
      "policyRule": {
        "if": {
          "allOf": [
            {
              "field": "type",
              "equals": "Microsoft.Storage/storageAccounts"
            },
            {
                "anyOf": [
                  {
                    "field": "Microsoft.Storage/storageAccounts/minimumTlsVersion",
                    "notEquals": "TLS1_2"
                  },
                  {
                    "field": "Microsoft.Storage/storageAccounts/minimumTlsVersion",
                    "exists": "false"
                  }
                ]
            }
          ]
        },
        "then": {
          "effect": "audit"
        }
      }
    }
    
  7. 保存策略。

分配策略

接下来,将策略分配给资源。 策略的作用域对应于该资源及其下的所有资源。 有关策略分配的详细信息,请参阅 Azure Policy 分配结构

若要在 Azure 门户中分配策略,请执行下列步骤:

  1. 在 Azure 门户中,导航到 Azure Policy 服务。
  2. 在“创作”部分下,选择“分配”。
  3. 选择“分配策略”以创建新的策略分配。
  4. 对于“作用域”字段,请选择策略分配的作用域。
  5. 对于“策略定义”字段,请选择“更多”按钮,然后从列表中选择你在上一部分定义的策略。
  6. 提供策略分配的名称。 说明是可选的。
  7. 让“策略强制实施”设置为“启用”状态。 此设置对审核策略没有影响。
  8. 选择“查看 + 创建”以创建分配。

查看合规性报告

分配策略后,你可以查看合规性报告。 审核策略的合规性报告会指出哪些存储帐户不符合策略。 有关详细信息,请参阅获取策略合规性数据

创建策略分配后,合规性报告可能需要几分钟时间才会变得可用。

若要在 Azure 门户中查看合规性报告,请执行以下步骤:

  1. 在 Azure 门户中,导航到 Azure Policy 服务。

  2. 选择“合规性”。

  3. 筛选你在上一步创建的策略分配名称的结果。 该报告显示有多少资源不符合策略。

  4. 你可以在报告中向下钻取以获取更多详细信息,包括不合规的存储帐户的列表。

    Screenshot showing compliance report for audit policy for minimum TLS version

使用 Azure Policy 强制实施最低 TLS 版本

Azure Policy 可以确保 Azure 资源符合要求和标准,从而为云治理提供支持。 若要为你的组织中的存储帐户强制实施最低 TLS 版本要求,你可以创建一个策略,用于阻止创建具有以下特点的新存储帐户:该帐户将最低 TLS 要求设置为比该策略规定的版本更旧的 TLS。 如果该帐户的最低 TLS 版本设置不符合策略,则此策略还会阻止对现有帐户进行所有配置更改。

强制实施策略会使用 Deny 效果来阻止具有如下特点的请求:将创建或修改存储帐户,导致最低 TLS 版本不再符合组织标准。 有关效果的详细信息,请参阅了解 Azure Policy 效果

若要针对低于 TLS 1.2 的最低 TLS 版本创建具有 Deny 效果的策略,请执行使用 Azure Policy 审核合规性中所述的步骤,但在策略定义的“policyRule”部分提供以下 JSON:

{
  "policyRule": {
    "if": {
      "allOf": [
        {
          "field": "type",
          "equals": "Microsoft.Storage/storageAccounts"
        },
        {
            "anyOf": [
              {
                "field": "Microsoft.Storage/storageAccounts/minimumTlsVersion",
                "notEquals": "TLS1_2"
              },
              {
                "field": "Microsoft.Storage/storageAccounts/minimumTlsVersion",
                "exists": "false"
              }
            ]
        }
      ]
    },
    "then": {
      "effect": "deny"
    }
  }
}

创建具有 Deny 效果的策略并将其分配给作用域后,用户无法创建最低 TLS 版本低于 1.2 的存储帐户。 用户也不能对当前需要的最低 TLS 版本低于 1.2 的现有存储帐户进行任何配置更改。 如果尝试这样做,将会导致错误。 必须将存储帐户的必需最低 TLS 版本设置为 1.2,然后才能继续创建或配置帐户。

下图显示了在以下情况下发生的错误:当具有 Deny 效果的策略要求将最低 TLS 版本设置为 TLS 1.2 时,你尝试创建最低 TLS 版本设置为 TLS 1.0(针对新帐户的默认值)的存储帐户。

Screenshot showing the error that occurs when creating a storage account in violation of policy

需要最低版本的 TLS 所需的权限

若要为存储帐户设置 MinimumTlsVersion 属性,用户必须具有创建和管理存储帐户的权限。 提供这些权限的 Azure 基于角色的访问控制 (Azure RBAC) 角色包含 Microsoft.Storage/storageAccounts/write 或 Microsoft.Storage/storageAccounts/* 操作。 具有此操作的内置角色包括:

这些角色未提供通过 Microsoft Entra ID 访问存储帐户中数据的访问权限。 但是,它们包含 Microsoft.Storage/storageAccounts/listkeys/action,可以授予对帐户访问密钥的访问权限。 借助此权限,用户可以使用帐户访问密钥访问存储帐户中的所有数据。

角色分配的范围必须设定为存储帐户级别或更高级别,以允许用户为存储帐户要求最低版本的 TLS。 有关角色范围的详细信息,请参阅了解 Azure RBAC 的范围

请注意,仅向需要能够创建存储帐户或更新其属性的用户分配这些角色。 使用最小特权原则确保用户拥有完成任务所需的最少权限。 有关使用 Azure RBAC 管理访问权限的详细信息,请参阅 Azure RBAC 最佳做法

注意

经典订阅管理员角色“服务管理员”和“共同管理员”具有 Azure 资源管理器所有者角色的等效权限。 所有者角色包括所有操作,因此具有这些管理角色之一的用户也可以创建和管理存储帐户。 有关详细信息,请参阅 Azure 角色、Azure AD 角色和经典订阅管理员角色

网络注意事项

当客户端向存储帐户发送请求时,客户端在处理任何请求之前,首先会与存储帐户的公共终结点建立连接。 建立连接后,将检查最低 TLS 版本设置。 如果请求使用的 TLS 版本比设置指定的版本低,则连接仍会成功,但是请求最终会失败。 有关 Azure 存储的公共终结点的详细信息,请参阅资源 URI 语法

后续步骤