Azure 存储安全指南

概述

Azure 存储提供一整套安全性功能,这些功能相辅相成,帮助开发人员构建安全的应用程序:

  • 所有写入 Azure 存储的数据,使用存储服务加密 (SSE) 进行自动加密。
  • 存储帐户本身可以通过基于角色的访问控制和 Azure Active Directory 来保护。
  • 在应用程序和 Azure 之间传输数据时,可使用客户端加密、HTTPS 或 SMB 3.0 保护数据。
  • Azure 虚拟机使用的 OS 和数据磁盘可使用 Azure 磁盘加密进行加密。
  • 在 Azure 存储中,可以使用共享访问签名授予数据对象的委派访问权限。

本文概述其中每项可配合 Azure 存储使用的安全功能。 提供了详述每项功能的文章的链接,让你能够轻松深入每个主题。

本文涵盖以下主题:

  • 管理平面安全性 - 保护存储帐户

    管理平面包含用于管理存储帐户的资源。 此部分包括 Azure 资源管理器部署模型,以及如何使用基于角色的访问控制 (RBAC) 来控制对存储帐户的访问。 还解决了如何管理存储帐户密钥以及重新生成此类密钥。

  • 数据平面安全 - 保护对数据的访问

    此部分探讨如何在存储帐户(例如 Blob、文件、队列和表)中,允许使用共享访问签名和存储访问策略来访问实际的数据对象。 我们介绍服务级别 SAS 和帐户级别 SAS。 此外,介绍如何限制访问特定的 IP 地址(或 IP 地址范围)、如何限制用于 HTTPS 的协议,以及如何吊销共享访问签名而无需等到它过期。

  • 传输中加密

    此部分讨论如何在将数据传输到 Azure 存储或从中传出时提供保护。 我们将讨论 HTTPS 的建议用法,以及 SMB 3.0 针对 Azure 文件共享使用的加密。 同时还将探讨客户端加密,它可让你在将数据传输到客户端应用程序中的存储之前加密数据,以及从存储传出后解密数据。

  • 静态加密

    我们还将讨论存储服务加密 (SSE),目前此项服务已针对新的和现有的存储帐户自动启用。 还会介绍如何使用 Azure 磁盘加密,并探究磁盘加密、SSE 与客户端加密之间的基本差异和情况。

  • 使用 存储分析 审核 Azure 存储的访问

    此部分介绍如何在存储分析日志中查找某个请求的相关信息。 我们将查看实际的分析记录数据,并了解如何分辨请求是否是利用存储帐户密钥、共享访问签名还是匿名方式发出的,以及该请求是成功还是失败。

  • 使用 CORS 启用基于浏览器的客户端

    本部分介绍了如何允许跨域资源共享 (CORS)。 我们将讨论跨域访问,以及如何使用 Azure 存储内置的 CORS 功能来处理这种访问。

管理平面安全性

管理平面包含影响存储帐户本身的操作。 例如,可以创建或删除存储帐户、获取订阅中的存储帐户列表、检索存储帐户密钥,或重新生成存储帐户密钥。

创建新的存储帐户时,可以选择经典或 Resource Manager 部署模型。 在 Azure 中创建资源的经典模型只允许以孤注一掷的方式访问订阅,并访问存储帐户。

本指南着重于资源管理器模型,即创建存储帐户的建议方法。 使用 Resource Manager 存储帐户而不是提供整个订阅的访问权限,可以使用基于角色的访问控制 (RBAC) 以更高的限制级别来控制对管理平面的访问。

如何使用基于角色的访问控制 (RBAC) 来保护存储帐户

接下来,我们将讨论什么是 RBAC 以及如何使用它。 每个 Azure 订阅都有一个 Azure Active Directory。 可以为来自该目录的用户、组和应用程序授予访问权限,以便在使用 Resource Manager 部署模型的 Azure 订阅中管理资源。 这称为基于角色的访问控制 (RBAC)。 若要管理此访问权限,可以使用 Azure 门户Azure CLI 工具PowerShellAzure 存储资源提供程序 REST API

使用资源管理器模型可以将存储帐户放在资源组中,并使用 Azure Active Directory 来控制对该特定存储帐户的管理平面的访问。 例如,可以授权特定用户访问存储帐户密钥,而其他用户可以查看有关存储帐户的信息,但无法访问存储帐户密钥。

授予访问权限

通过将相应的 RBAC 角色分配给适当范围的用户、组和应用程序来授予访问权限。 若要授予对整个订阅的访问权限,请在订阅级别分配角色。 可以将权限授予资源组本身,以此授予资源组中所有资源的访问权限。 也可以将特定角色分配给特定资源,例如存储帐户。

关于使用 RBAC 访问 Azure 存储帐户的管理操作,需了解以下要点:

  • 分配访问权限,就是将角色分配给希望拥有访问权限的帐户。 可控制对用于管理该存储帐户的操作的访问权限,但不能控制对帐户中数据对象的访问权限。 例如,你可以授予检索存储帐户属性(例如冗余)的权限,但不能授予检索 Blob 存储中的容器或容器中的数据的权限。
  • 针对有权访问存储帐户中数据对象的用户,可为他们提供权限来读取存储帐户密钥,而该用户可以使用这些密钥来访问 Blob、队列、表和文件。
  • 可将角色分配给特定的用户帐户、用户组或应用程序。
  • 每个角色都有“操作”和“非操作”列表。 例如,“虚拟机参与者”角色具有“listKeys”操作,允许读取存储帐户密钥。 “参与者”具有“非操作”,例如在 Active Directory 中更新用户的访问权限。
  • 存储的角色包括(但不限于)以下角色:

    • 所有者 – 他们可以管理一切,包括访问权限。
    • 参与者 – 他们可以执行所有者可执行的所有操作,但分配访问权限除外。 拥有此角色的用户可以查看和重新生成存储帐户密钥。 他们可以使用存储帐户密钥来访问数据对象。
    • 读者 – 他们可以查看有关存储帐户的信息(机密除外)。 例如,如果将存储帐户中拥有读取者权限的角色分配给某个用户,该用户就可以查看存储帐户的属性,但无法对属性进行任何更改或查看存储帐户密钥。
    • 存储帐户参与者 - 他们可以管理存储帐户 - 他们可以读取订阅的资源组和资源,以及创建和管理订阅资源组部署。 他们也可以访问存储帐户密钥,这又意味着他们可以访问数据平面。
    • 用户访问管理员 – 他们可以管理对存储帐户的用户访问。 例如,他们可将“读者”权限授予特定用户。
    • 虚拟机参与者 – 他们可以管理虚拟机,但无法管理已连接的存储帐户。 此角色可以列出存储帐户密钥,意味着分配此角色的用户可以更新数据平面。

      为了让用户能够创建虚拟机,他们必须能够在存储帐户中创建相应的 VHD 文件。 为此,他们需要能够检索存储帐户密钥,并将它传递给创建 VM 的 API。 因此,他们必须拥有此权限才能列出存储帐户密钥。

  • 利用定义自定义角色的功能,可以从可对 Azure 资源执行的操作的列表中整理出一组操作。
  • 必须先在 Azure Active Directory 中设置用户,才能为他们分配角色。
  • 可以创建一份报告,描述哪个用户使用了 PowerShell 或 Azure CLI 在哪个范围为哪些对象授予/撤销哪种类型的访问权限。

资源

管理存储帐户密钥

存储帐户密钥是由 Azure 创建的 512 位字符串,配合存储帐户名称用于访问存储于存储帐户中的数据对象,例如,Blob、表中的实体、队列消息,以及 Azure 文件共享中的文件。 控制对存储帐户密钥的访问就能控制对该存储帐户的数据平面的访问。

每个存储帐户在 Azure 门户和 PowerShell cmdlet 中有两个密钥,分别称为“密钥 1”和“密钥 2”。 可采用多种多种方式手动重新生成这些密钥,包括(但不限于)使用 Azure 门户、PowerShell、Azure CLI,或以编程方式使用 .NET 存储客户端库或 Azure 存储服务 REST API。

有许多原因会导致重新生成存储帐户密钥。

  • 可出于安全原因而定期重新生成密钥。
  • 如果有人设法侵入应用程序并检索硬编码或存储在配置文件中的密钥,为其提供存储帐户的完整访问权限,则必须重新生成存储帐户密钥。
  • 如果团队使用存储资源管理器应用程序来保留存储帐户密钥,则有团队成员离职时也需要重新生成密钥。 在某人离职后,应用程序仍将继续运行,使其他成员可以访问存储帐户。 这实际上是他们创建帐户级别共享访问签名的主要原因 – 可以改用帐户级别的 SAS,而不是将访问密钥存储在配置文件中。

密钥重新生成计划

你不希望在不进行某些规划的情况下单纯重新生成你使用的密钥。 如果这样做,可能会切断对该存储帐户的所有访问权限,而这会造成严重中断。 因此有两个密钥。 一次只应重新生成一个密钥。

重新生成密钥之前,请务必列出依赖于存储帐户的所有应用程序,以及 Azure 中使用的所有其他服务。 例如,如果 Azure 媒体服务依赖于存储帐户,则必须在重新生成密钥后将访问密钥与媒体服务重新同步。 如果使用存储资源管理器之类的任何应用程序,也必须为这些应用程序提供新的密钥。 如果 VM 的 VHD 文件存储在存储帐户中,它们将不会受到重新生成存储帐户密钥的影响。

可以在 Azure 门户中重新生成密钥。 重新生成密钥之后,最多 10 分钟后即可跨存储服务进行同步。

准备就绪后,请遵循以下常规过程,详细了解应如何更改密钥。 在本例中,假设你当前使用的是密钥 1,并想要更改所有项目以改用密钥 2。

  1. 重新生成密钥 2 以确保密钥的安全。 可在 Azure 门户中执行此操作。
  2. 在存储密钥所存储到的所有应用程序中,更改存储密钥以使用密钥 2 的新值。 测试并发布应用程序。
  3. 在所有应用程序和服务成功启动并运行之后,重新生成密钥 1。 这可确保未明确提供新密钥的任何人都不再拥有存储帐户的访问权限。

如果当前使用密钥 2,可以使用相同的过程,但反转密钥名称。

可以过几天后迁移,更改每个应用程序来使用新的密钥并进行发布。 全部完成之后,应该返回并重新生成旧密钥,使其不再可用。

还可将存储帐户密钥作为机密放在 Azure 密钥保管库中,并让应用程序从此处检索该密钥。 然后,重新生成密钥并更新 Azure 密钥保管库时,就不需要重新部署应用程序,因为它们自动从 Azure 密钥保管库中选择新密钥。 请注意,可以让应用程序每次在需要密钥时读取它,或者,可以将它缓存在内存中,如果使用密钥时失败,将再次从 Azure Key Vault 中检索该密钥。

使用 Azure 密钥保管库还可以提高存储密钥的安全级别。 如果使用此方法,永远都不需要将存储密钥硬编码于配置文件中,这样将删除某人不需特定权限即可访问密钥的途径。

使用 Azure 密钥保管库的另一个优点是,还可使用 Azure Active Directory 来控制对密钥的访问。 这意味着,可以将访问权限授予少数必须从 Azure Key Vault 检索密钥的应用程序,并了解其他应用程序在未特别授予它们权限的情况下无法访问密钥。

注意:建议同一时间在所有应用程序中只使用一个密钥。 如果在某些地方使用密钥 1 并在其他地方使用密钥 2,则无法在没有部分应用程序失去访问的情况下轮转密钥。

资源

数据平面安全

数据平面安全是指用于保护存储在 Azure 存储的数据对象(Blob、队列、表和文件)的方法。 我们已了解在传输数据期间加密数据和安全的方法,但该从何处着手来控制访问对象?

可通过两种方法授权对数据对象本身的访问权限。 分别是控制对存储帐户密钥的访问,和使用共享访问签名来授予特定时间段对特定数据对象的访问权限。

此外,对于 Blob 存储,可以通过对保存 Blob 的容器的访问级别进行相应设置,来允许对 Blob 进行公共访问。 如果将容器的访问权限设置为“Blob”或“容器”,则允许该容器中 Blob 的公共读取访问权限。 这意味着 URL 指向该容器中 Blob 的任何人都可以在浏览器中打开它,而不需要使用共享访问签名或拥有存储帐户密钥。

存储帐户密钥

存储帐户密钥是由 Azure 创建的 512 位字符串,配合存储帐户名称用于访问存储于存储帐户中的数据对象。

例如,可读取 Blob、写入队列、创建表,还可修改文件。 可以通过 Azure 门户或使用众多存储资源管理器应用程序之一来执行这其中的许多操作。 也可编写代码来使用 REST API 或某个存储客户端库来执行这些操作。

管理平面安全性部分中所述,对经典存储帐户的存储密钥的访问权限可以通过提供对 Azure 订阅的完全访问权限来授予。 可以通过基于角色的访问控制 (RBAC) 来控制对使用 Azure Resource Manager 模型的存储帐户的存储密钥的访问权限。

如何使用共享访问签名和存储访问策略来委派对帐户中对象的访问权限

共享访问签名是一个字符串,包含可附加到 URI 的安全令牌,可用于委派存储对象的访问权限,以及指定访问的权限和日期/时间范围等限制。

可以授予对 Blob、容器、队列、文件和表的访问权限。 使用表时,可以实际授予权限来访问表中某个范围的条目,方法是指定想要让用户有权访问的分区和行键范围。 例如,如果已使用具有地理状态的分区键存储数据,则可为某人提供仅限加州数据的访问权限。

另举一例,可以为 Web 应用程序提供 SAS 令牌,使它能够将条目写入队列,并为辅助角色应用程序提供 SAS 令牌,以便从队列中获取和处理消息。 或者,可以为某位客户提供 SAS 令牌,使他们能够将图片上传到 Blob 存储中的容器,并为 Web 应用程序提供权限来读取这些图片。 在这两种情况下,都可实现关注点分离 – 每个应用程序只能获取执行其任务所需的访问权限。 这是通过使用共享访问签名来实现的。

使用共享访问签名的原因

为什么要使用 SAS 而不只是分发存储帐户密钥,哪一种方法更方便? 分发存储帐户密钥就像是在存储王国中共享密钥。 它会授予完全访问权限。 其他人可以使用密钥,并将其整个音乐库上传到你的存储帐户。 他们也许还能将文件替换为受病毒感染的版本,或窃取数据。 不应草率地无限制分发对存储帐户的访问权限。

如果使用共享访问签名,可以只为客户端提供有限时间内所需的权限。 例如,如果有人将 Blob 上传到帐户,则你可以授予他们刚好足够时间的写入权限来上传 Blob(当然,这取决于 Blob 的大小)。 如果改变想法,可以撤销该访问权限。

此外,可以指定将使用 SAS 所发出的请求限制为特定的 IP 地址或 Azure 外部的 IP 地址范围。 你还可以要求使用特定协议(HTTPS 或 HTTP/HTTPS)来发出请求。 这意味着,如果只想要允许 HTTPS 流量,可以将所需的协议设置为仅限 HTTPS,并阻止 HTTP 流量。

共享访问签名的定义

共享访问签名是一组附加到指向资源的 URL 的查询参数

其中提供有关允许的访问权限的信息,以及准许该访问权限的时间长度。 下面提供了一个示例:此 URI 将提供对 Blob 的读取权限,期限为五分钟。 请注意,SAS 查询参数必须以 URL 编码,例如 %3A 表示冒号 (:),%20 表示空格。

http://mystorage.blob.core.chinacloudapi.cn/mycontainer/myblob.txt (URL to the blob)
?sv=2015-04-05 (storage service version)
&st=2015-12-10T22%3A18%3A26Z (start time, in UTC time and URL encoded)
&se=2015-12-10T22%3A23%3A26Z (end time, in UTC time and URL encoded)
&sr=b (resource is a blob)
&sp=r (read access)
&sip=168.1.5.60-168.1.5.70 (requests can only come from this range of IP addresses)
&spr=https (only allow HTTPS requests)
&sig=Z%2FRHIX5Xcg0Mq2rqI3OlWTjEg2tYkboXr1P9ZUXDtkk%3D (signature used for the authentication of the SAS)

Azure 存储服务对共享访问签名进行身份验证的方式

当存储服务收到请求时,它获取输入查询参数,并使用与调用程序相同的方法来创建签名。 然后比较这两个签名。 如果它们相符,则存储服务可以检查存储服务版本以确保它有效、检查当前日期和时间是在指定时段内、确保请求的访问权限对应于发出的请求,等等。

以上述 URL 为例,如果 URL 指向文件而不是 Blob,此请求会失败,因为它指定共享访问签名适用于 Blob。 如果调用的 REST 命令是更新 Blob,则该命令会失败,因为共享访问签名指定只准许读访问权限。

共享访问签名的类型

  • 服务级别 SAS 可用于访问存储帐户中的特定资源。 其中的一些示例是检索容器中的 Blob 列表、下载 Blob、更新表中的实体、将消息添加到队列,或将文件上传到文件共享。
  • 帐户级别 SAS 可用于访问服务级别 SAS 可用的任何功能。 此外,它可以为服务级别 SAS 不准许的资源提供选项,例如,能够创建容器、表、队列及文件共享。 也可一次性指定对多个服务的访问权限。 例如,可授权某人访问存储帐户中的 Blob 和文件。

创建 SAS URI

  1. 可以根据需要创建 URI,每次都定义所有查询参数。

    该方法十分灵活,但如果每次都有一组类似的逻辑参数,使用存储访问策略是个不错的想法。

  2. 可以针对整个容器、文件共享、表或队列创建存储访问策略。 然后使用此策略作为所创建的 SAS URI 的基础。 可以轻松撤销基于存储访问策略的权限。 可以对每个容器、队列、表或文件共享最多定义五个策略。

    例如,如果要让许多人读取特定容器中的 Blob,则可以创建存储访问策略,表示“提供读访问权限”以及每次都一样的任何其他设置。 然后,可以使用存储访问策略的设置,并指定过期日期/时间,来创建 SAS URI。 这样做的优点是不需要每次指定所有查询参数。

吊销

假设 SAS 已泄露,或者要基于公司安全或法规遵循要求更改 SAS。 如何使用该 SAS 撤销对资源的访问权限? 这取决于 SAS URI 的创建方式。

如果使用即席 URI,将有三个选项。 可以颁发具有短期过期策略的 SAS 令牌,然后只需等待 SAS 过期。 可以重命名或删除资源(假设令牌范围只限于单个对象)。 可以更改存储帐户密钥。 根据使用该存储帐户的服务数目而定,最后一个选项可能造成很大的影响,而且在没有任何规划的情况下可能达不到想要的效果。

如果使用派生自存储访问策略的 SAS,可以通过撤销存储访问策略来删除访问权限 – 只能在其过期后进行更改,或者完全删除它。 这会立即生效,并使每个使用该存储访问策略创建的 SAS 失效。 更新或删除存储访问策略可能将影响通过 SAS 访问该特定容器、文件共享、表或队列的用户,但如果要写入客户端,使得他们可在旧的 SAS 变成无效时请求一个新的 SAS,则这将可正常运行。

由于使用派生自存储访问策略的 SAS 可以立即撤销该 SAS,因此建议的最佳做法是尽可能使用存储访问策略。

资源

有关使用共享访问签名和存储访问策略的详细信息和示例,请参阅以下文章:

传输中加密

传输级加密 – 使用 HTTPS

为确保 Azure 存储数据安全,应采取另一个措施,即在客户端与 Azure 存储之间加密数据。 第一条建议是始终使用 HTTPS 协议,这可确保通过公共 Internet 进行安全通信。

若要获得安全的通信渠道,在调用 REST API 或访问存储中的对象时,应该始终使用 HTTPS。 此外, 共享访问签名(可用于委派对 Azure 存储对象的访问权限)包含一个选项,用于指定在使用共享访问签名时只能使用 HTTPS 协议,以确保任何使用 SAS 令牌发出链接的人都使用正确的协议。

在调用 REST API 来访问存储帐户中的对象时,可以通过为存储帐户启用需要安全传输来强制使用 HTTPS。 在启用此功能后,使用 HTTP 的连接将被拒绝。

传输期间对 Azure 文件共享使用加密

使用 REST API 时,Azure 文件支持 HTTPS,但经常用作附加到 VM 的 SMB 文件共享。 SMB 2.1 不支持加密,因此只允许在 Azure 中的相同区域内连接。 但是,SMB 3.0 支持加密,并且可以在 Windows Server 2012 R2、Windows 8、Windows 8.1 和 Windows 10 中使用,允许跨区域访问和桌面上的访问。

尽管 Azure 文件共享可以与 Unix 配合使用,但 Linux SMB 客户端尚不支持加密,因此只允许在 Azure 区域内访问。 Linux 的加密支持已经在负责 SMB 功能的 Linux 开发人员的路线图上。 当他们添加加密时,必须具有访问 Linux 上 Azure 文件共享的相同能力,就像对于 Windows 所做的一样。

可以通过为存储帐户启用需要安全传输来强制对 Azure 文件服务使用加密。 如果使用 REST API,则 HTTPs 是必需的。 对于 SMB,只有支持加密的 SMB 连接将会成功连接。

资源

使用客户端加密来保护发送到存储的数据

另一个可帮助确保在客户端应用程序与存储之间传输时数据安全的选项是客户端加密。 数据先经过加密,再传输到 Azure 存储。 从 Azure 存储检索数据时,在客户端上收到数据之后会将其解密。 即使数据在通过连接时已加密,但还是建议使用 HTTPS,因为它内置了数据完整性检查,有助于降低影响数据完整性的网络错误。

客户端加密也是一种可用于加密静态数据的方法,因为数据是以加密形式存储的。 静态加密部分将更详细地讨论此功能。

静态加密

有三项 Azure 功能可提供静态加密。 Azure 磁盘加密可用于加密 IaaS 虚拟机中的 OS 和数据磁盘。 客户端加密和 SSE 都用于加密 Azure 存储中的数据。

尽管可以使用客户端加密来加密传输中的数据(也以其加密形式存储于存储中),可能习惯在传输期间只使用 HTTPS,而且有一些方式可让数据在存储时自动加密。 有两种做法可以执行此操作 - Azure 磁盘加密和 SSE。 其中一种是用于直接加密 VM 使用的 OS 和数据磁盘上的数据,另一种用于加密写入 Azure Blob 存储的数据。

存储服务加密 (SSE)

针对所有存储帐户启用 SSE,并且不能禁用。 将数据写入 Azure 存储时,SSE 自动加密数据。 从 Azure 存储读取数据时,Azure 存储会在返回数据之前将其解密。 SSE 帮助保护数据,而无需修改代码或将代码添加到任何应用程序。

用于 SSE 的密钥由 Azure 管理。 Azure 最初将生成密钥,并根据 Microsoft 内部策略的定义管理安全存储和定期轮转密钥。

SSE 自动加密所有性能层(标准和高级)、所有部署模型(Azure 资源管理器和经典)、所有 Azure 存储服务(Blob、队列、表和文件)中的数据。

客户端加密

在介绍传输中数据加密时,我们曾提到客户端加密。 此功能可用于以编程方式加密客户端应用程序中的数据,然后通过连接发送数据以写入 Azure 存储,并在从 Azure 存储检索数据之后以编程方式解密数据。

这确实可提供传输中加密,但也会提供静态加密的功能。 尽管会在传输过程中加密数据,仍建议使用 HTTPS 来充分利用内置的数据完整性检查,帮助降低影响数据完整性的网络错误。

例如,如果 Web 应用程序会存储 Blob 和检索 Blob,而你想让应用程序和数据尽可能保持安全,可使用此功能。 在此情况下,请使用客户端加密。 客户端与 Azure Blob 服务之间的流量包含加密的资源,并且没有人能够解释传输中的数据并将它重组到专用 Blob。

客户端加密内置于 Java 和 .NET 存储客户端库,这些库使用 Azure 密钥保管库 API 让实现变得很简单。 加密和解密数据的程序会使用信封技术,并在每个存储对象中存储加密使用的元数据。 例如,对于 Blob,会会其存储在 Blob 元数据中;对于队列,会它添加到每个队列消息。

对于加密本身,可以生成和管理自己的加密密钥。 也可以使用 Azure 存储客户端库所生成的密钥,或者让 Azure 密钥保管库生成密钥。 可以将加密密钥存储在本地密钥存储中,或将它们存储在 Azure Key Vault 中。 Azure 密钥保管库允许使用 Azure Active Directory 为特定用户授予 Azure 密钥保管库中密码的访问权限。 这意味着,并非每个人都能读取 Azure Key Vault,以及检索用于进行客户端加密的密钥。

资源

使用 Azure 磁盘加密来加密虚拟机所用的磁盘

Azure 磁盘加密是一项新功能。 此功能允许加密 IaaS 虚拟机使用的 OS 磁盘和数据磁盘。 对于 Windows,驱动器是使用行业标准 BitLocker 加密技术加密的。 对于 Linux,磁盘是使用 DM-Crypt 技术加密的。 它与 Azure 密钥保管库集成,可用于控制和管理磁盘加密密钥。

在 Azure 中启用了 IaaS VM 时,该解决方案支持以下 IaaS VM 方案:

  • 与 Azure 密钥保管库集成
  • 标准层 VM:A、D、DS 等系列 IaaS VM
  • 在 Windows 和 Linux IaaS VM 上启用加密
  • 在 Windows IaaS VM 的 OS 和数据驱动器上禁用加密
  • 在 Linux IaaS VM 的数据驱动器上禁用加密
  • 在运行 Windows 客户端 OS 的 IaaS VM 上启用加密
  • 在包含装载路径的卷上启用加密
  • 在使用 mdadm 配置了磁盘条带化 (RAID) 的 Linux VM 上启用加密
  • 使用 LVM 对 Linux VM 上的数据磁盘启用加密
  • 在使用存储空间配置的 Windows VM 上启用加密
  • 支持所有 Azure 公共区域

该解决方案不支持版本中的以下方案、功能和技术:

  • 基本层 IaaS VM
  • 在 Linux IaaS VM 的 OS 驱动器上禁用加密
  • 使用经典 VM 创建方法创建的 IaaS VM
  • 与本地密钥管理服务集成
  • Azure 文件(文件共享系统)、网络文件系统 (NFS)、动态卷,以及配置了基于软件的 RAID 系统的 Windows VM

Note

以下 Linux 发行版(RHEL 7.2、CentOS 7.2n 和 Ubuntu 16.04)当前支持 Linux OS 磁盘加密。

此功能可确保虚拟机磁盘上的所有数据在 Azure 存储中静态加密。

资源

Azure 磁盘加密、SSE 和客户端加密的比较

IaaS VM 及其 VHD 文件

对于 IaaS VM 使用的数据磁盘,建议使用 Azure 磁盘加密。 如果使用 Azure 应用商店创中的映像建 VM,Azure 将在 Azure 存储中对存储帐户执行映像的浅层复制 ,并且即使已启用 SSE,也不会将其加密。 创建 VM 并启动更新映像后,SSE 将开始加密数据。 出于此原因,如果你想要将它们完全加密,最好是在通过 Azure Marketplace 中的映像创建的 VM 上使用 Azure 磁盘加密。

如果从本地将预先加密的 VM 带入 Azure 中,就能将加密密钥上传到 Azure Key Vault,并继续针对本地使用的 VM 使用加密。 启用 Azure 磁盘加密即可处理此方案。

如果你有来自本地的未加密 VHD,可以作为自定义映像将它上传到库并从中预配 VM。 如果使用 Resource Manager 模板执行此操作,可以要求它在启动 VM 时打开 Azure 磁盘加密。

添加数据磁盘并将其装载到 VM 时,可在该数据磁盘上开启 Azure 磁盘加密。 它先在本地加密该数据磁盘,然后经典部署模型层将会对存储进行延迟写入,如此即可加密存储内容。

客户端加密

客户端加密是加密数据的最安全方法,因为它会在传输前加密数据。 但是,它需要向使用存储的应用程序添加代码,这可能不是理想行为。 在以上事例中,可使用 HTTPS 保护传输中的数据。 数据到达 Azure 存储后,SSE 将会对其进行加密。

通过客户端加密,可以加密表中条目、消息队列和 Blob。

客户端加密完全通过应用程序来管理。 这是最安全的方式,但要求以编程方式更改应用程序,并将密钥管理程序放在正确的位置。 如果在传输期间想要额外的安全性,并且想要将存储的数据加密,可以使用此方法。

客户端加密会在客户端上生成更多负载,必须在缩放性计划中考虑到这一点,特别是要加密并传输大量数据时。

存储服务加密 (SSE)

SSE 由 Azure 存储管理。 SSE 不是针对传输中数据安全性提供的,但它会在数据写入 Azure 存储时加密数据。 SSE 不影响 Azure 存储性能。

可以使用 SSE 加密任何类型的存储帐户数据(块 blob、追加 blob、页 blob、表数据、队列数据和文件)。

如果使用 VHD 文件的存档或库作为创建新虚拟机的基础,可以创建新的存储帐户,然后将 VHD 文件上传到该帐户。 这些 VHD 文件由 Azure 存储加密。

如果 Azure 磁盘加密已针对 VM 中的磁盘启用,则 SSE 和 Azure 磁盘加密会加密所有新写入的数据。

存储分析

使用存储分析来监视授权类型

对于每个存储帐户,可以启用 Azure 存储分析来执行日志记录和存储指标数据。 若要检查存储帐户的性能指标,或者由于发生性能问题而需要排查存储帐户问题,这是一个绝佳工具。

可以在存储分析记录中看到的另一部分数据是其他人访问存储时使用的身份验证方法。 例如,使用 Blob 存储,可以看到他们使用的是共享访问签名还是存储帐户密钥,或者访问的 Blob 是否为公共的。

如果要严密监视存储的访问,这很有用。 例如,在 Blob 存储中,可以将所有容器设置为专用,并通过应用程序实现 SAS 服务的使用。 然后可以定期检查日志,以了解你的 Blob 是否是使用存储帐户密钥访问的(这可能表示出现安全违规),或者 Blob 是公共的但它们不应该是公共的。

日志的外观

通过 Azure 门户启用存储帐户指标和日志记录后,分析数据会开始快速累积。 每个服务的日志记录与指标是分开的;只有在该存储帐户中有活动时才将写入日志,而根据设置指标的方式,会每分钟、每小时或每天记录指标。

日志将存储在存储帐户中名为 $logs 的容器的块 Blob 中。 启用存储分析后,自动创建此容器。 创建此容器之后,无法将它删除,但可以删除其内容。

在 $logs 容器下面,每个服务都有一个文件夹,另外还有对应于年/月/日/小时的子文件夹。 在小时下面,日志带有编号。 下面是目录结构的外观:

日志文件视图

针对 Azure 存储发出的每个请求都将记录。 下面是日志文件的快照,其中显示了前几个字段。

日志文件快照

如你所见,可以使用日志来跟踪对存储帐户的各种调用。

所有这些字段的用途是什么?

在下面列出的资源中,有一篇文章提供了日志中许多字段的列表及其用途。 下面是依次列出的字段列表:

日志文件中字段的快照

我们对于 GetBlob 的条目及其身份验证方法感兴趣,因此需要查找操作类型“Get-Blob”的条目,并检查请求状态(第四列)和授权类型(第八列)。

例如,在上述列表的前几列中,请求状态为“Success”且授权类型为“authenticated”。 这意味着已使用存储帐户密钥验证请求。

如何对我的 Blob 进行身份验证?

下面提供了我们感兴趣的三种用例。

  1. Blob 是公共的,可使用 URL 来访问(无需共享访问签名)。 在本例中,请求状态为“AnonymousSuccess”且授权类型为“anonymous”。

    1.0;2015-11-17T02:01:29.0488963Z;GetBlob;AnonymousSuccess;200;124;37;anonymous;;mystorage…

  2. Blob 是专用的且与共享访问签名配合使用。 在本例中,请求状态为“SASSuccess”且授权类型为“sas”。

    1.0;2015-11-16T18:30:05.6556115Z;GetBlob;SASSuccess;200;416;64;sas;;mystorage…

  3. Blob 是专用的,可使用存储密钥来访问。 在本例中,请求状态为“Success”且授权类型为“authenticated”。

    1.0;2015-11-16T18:32:24.3174537Z;GetBlob;Success;206;59;22;authenticated;mystorage…

可使用 Microsoft Message Analyzer 查看和分析这些日志。 它包含搜索和筛选功能。 例如,你可能想要搜索 GetBlob 的实例,以查看其使用方式是否符合预期,即要确保其他人不会以不适当的方式访问存储帐户。

资源

跨源资源共享 (CORS)

跨域访问资源

在某一个域中运行的 Web 浏览器对来自不同域的资源发出 HTTP 请求称为跨域 HTTP 请求。 例如,contoso.com 中的 HTML 页面将对托管在 fabrikam.blob.core.chinacloudapi.cn 上的 jpeg 发出请求。 出于安全原因,浏览器将限制从脚本(例如 JavaScript)中初始化的跨域 HTTP 请求。 这意味着,当 contoso.com 的网页上有一些 JavaScript 代码请求 fabrikam.blob.core.chinacloudapi.cn 上的该 jpeg 时,浏览器不允许该请求。

必须对 Azure 存储执行哪些操作? 如果正在使用名为 Fabrikam 的存储帐户在 Blob 存储中存储 JSON 或 XML 数据文件等静态资产,则资产的域是 fabrikam.blob.core.chinacloudapi.cn,contoso.com web 应用程序无法使用 JavaScript 来访问它们,因为域不相同。 如果尝试调用某个 Azure 存储服务(例如表存储)以返回要通过 JavaScript 客户端处理的 JSON 数据,则这一点同样适用。

可能的解决方案

解决此问题的方法之一是将类似于“storage.contoso.com”的自定义域分配给 fabrikam.blob.core.chinacloudapi.cn。 问题在于,只能将该自定义域分配给一个存储帐户。 如果资产存储在多个存储帐户中该怎么办?

解决此问题的另一种方法是让 Web 应用程序充当存储调用的代理。 这意味着,如果要将文件上传到 Blob 存储,Web 应用程序可以在本地写入它,然后将它复制到 Blob 存储,或者将它全部读入内存,然后将它写入 Blob 存储。 或者,你可以编写专门的 Web 应用程序(例如 Web API),以在本地上传文件并将它们写入 Blob 存储。 无论如何,都必须在确定伸缩性需求时考虑该功能。

CORS 有何用途?

Azure 存储允许启用 CORS – 跨域资源共享。 对于每个存储帐户,可以指定可访问该存储帐户中的资源的域。 例如,在上述用例中,我们可以在 fabrikam.blob.core.chinacloudapi.cn 存储帐户中启用 CORS,并将它设置为允许访问 contoso.com。然后,Web 应用程序 contoso.com 就能直接访问 fabrikam.blob.core.chinacloudapi.cn 中的资源。

要注意的一点是,CORS 允许访问,但不提供所有对存储资源的非公共访问所需的身份验证。 这意味着,如果它们是公共的,就只能访问 Blob,或者可以包含共享访问签名来提供相应的权限。 表、队列和文件没有公共访问权限并需要 SAS。

默认情况下,对所有服务禁用了 CORS。 可以使用 REST API 或存储客户端库调用某个方法来设置服务策略,以启用 CORS。 执行该操作时,会在 XML 中包含 CORS 规则。 以下示例将针对存储帐户的 Blob 服务使用“设置服务属性”操作来设置 CORS 规则。 可以使用存储客户端库或 REST API 针对 Azure 存储执行该操作。

<Cors>    
    <CorsRule>
        <AllowedOrigins>http://www.contoso.com, http://www.fabrikam.com</AllowedOrigins>
        <AllowedMethods>PUT,GET</AllowedMethods>
        <AllowedHeaders>x-ms-meta-data*,x-ms-meta-target*,x-ms-meta-abc</AllowedHeaders>
        <ExposedHeaders>x-ms-meta-*</ExposedHeaders>
        <MaxAgeInSeconds>200</MaxAgeInSeconds>
    </CorsRule>
<Cors>

下面是每一行的含义:

  • AllowedOrigins 指出哪些不匹配的域可以从存储服务请求并接收数据。 这意味着,contoso.com 和 fabrikam.com 可以针对特定的存储帐户向 Blob 存储请求数据。 还可将此项设置为通配符 (*),允许所有域访问请求。
  • AllowedMethods 这是发出请求时可使用的方法(HTTP 请求谓词)列表。 在本示例中,只允许 PUT 和 GET。 可将此项设置为通配符 (*),允许使用所有方法。
  • AllowedHeaders 这是在发出请求时原始域可以指定的请求标头。 在本示例中,允许所有以 x-ms-meta-data、x-ms-meta-target 和 x-ms-meta-abc 开头的元数据标头。 通配符 (*) 表示允许任何以指定前缀开头的标头。
  • ExposedHeaders 告知浏览器应向请求颁发者公开的响应标头。 在本示例中,将公开任何以“x-ms-meta-”开头的标头。
  • MaxAgeInSeconds 表示浏览器将缓存预检 OPTIONS 请求的最长时间。 (有关预检请求的详细信息,请检查下面的第一篇文章。)

资源

有关 CORS 及其启用方法的详细信息,请参阅以下资源。

有关 Azure 存储安全性的常见问题

  1. 如果无法使用 HTTPS 协议,该如何验证传输到 Azure 存储或从中传出的 Blob 的完整性?

    如果出于任何原因需要使用 HTTP 而不是 HTTPS,并且正在使用块 Blob,可以使用 MD5 检查来帮助验证传输中 Blob 的完整性。 这会有助于防止网络/传输层错误,但不一定可帮助防止中间攻击。

    如果可以使用提供传输级安全的 HTTPS,则使用 MD5 检查就很多余且不必要。

    有关详细信息,请查看 Azure Blob MD5 Overview(Azure Blob MD5 概述)。

  2. 美国政府实施的 FIPS 合规性要求是怎样的?

    美国联邦信息处理标准 (FIPS) 定义了美国联邦政府计算机系统批准使用的加密算法,以保护敏感数据。 如果在 Windows 服务器或桌面上启用 FIPS 模式,将告知 OS 仅应使用经 FIPS 验证的加密算法。 如果某个应用程序使用不合规的算法,即表示该应用程序违规。 使用 .NET Framework 4.5.2 或更高版本,应用程序可在计算机处于 FIPS 模式时自动切换加密算法来使用符合 FIPS 的算法。

    Microsoft 允许每个客户决定是否启用 FIPS 模式。 我们相信,客户没有充分的理由违反政府法规,不按默认启用 FIPS 模式。

    资源