你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

适用于 Azure Blob 存储的 SSH 文件传输协议 (SFTP) 支持

Blob 存储现在支持 SSH 文件传输协议 (SFTP)。 使用此项支持,可以通过 SFTP 客户端安全地连接到 Blob 存储,从而可以使用 SFTP 进行文件访问、文件传输和文件管理。

下面的视频将向你介绍相关的详细信息。

Azure 允许使用 Azure Blob 服务 REST API、Azure SDK 以及 AzCopy 等工具将数据安全传输到 Blob 存储帐户。 但是,旧式工作负载通常使用传统的文件传输协议,例如 SFTP。 可将自定义应用程序更新为使用 REST API 和 Azure SDK,但只能通过对代码进行重大更改来进行这种更新。

在此功能发布之前,若要使用 SFTP 将数据传输到 Azure Blob 存储,必须购买第三方产品,或编排自己的解决方案。 对于自定义解决方案,你必须在 Azure 中创建虚拟机 (VM) 来托管 SFTP 服务器,然后更新、修补、管理、缩放和维护复杂的体系结构。

现在,借助 Azure Blob 存储的 SFTP 支持,可以一键式为 Blob 存储帐户启用 SFTP 支持。 然后,可以设置用于身份验证的本地用户标识,以通过端口 22 使用 SFTP 连接到存储帐户。

本文介绍 Azure Blob 存储的 SFTP 支持。 若要了解如何为存储帐户启用 SFTP,请参阅使用 SSH 文件传输协议 (SFTP) 连接到 Azure Blob 存储

注意

SFTP 是平台级服务,因此即使帐户选项已禁用,端口 22 也会打开。 如果未配置 SFTP 访问,则所有请求都将与服务断开连接。

SFTP 和分层命名空间

SFTP 支持要求启用分层命名空间。 分层命名空间将对象(文件)组织到目录和子目录的层次结构中,就像组织计算机上的文件系统一样。 分层命名空间以线性方式缩放,并且不会降低数据容量或性能。

分层命名空间支持不同的协议。 SFTP 是这些可用的协议之一。 下图显示了通过多个协议和 REST API 进行存储访问。 为了方便阅读,该图使用词语 Gen2 REST 来指代 Azure Data Lake Storage Gen2 REST API。

分层命名空间

SFTP 权限模型

无法使用 Microsoft Entra 标识为 SFTP 客户端授权。 相反,SFTP 使用一种新的标识管理形式,称为“本地用户”。

本地用户必须使用密码或安全外壳 (SSH) 私钥凭据进行身份验证。 一个存储帐户最多可以有 2,000 个本地用户。

若要设置访问权限,需创建一个本地用户并选择身份验证方法。 然后,对于帐户中的每个容器,可以指定要向该用户授予的访问级别。

注意

本地用户不能与其他 Azure 存储权限模型进行互操作,例如 RBAC(基于角色的访问控制)和 ABAC(基于属性的访问控制)。 支持本地用户在预览级别使用访问控制列表 (ACL)。

例如,对于存储在容器 con1 中的文件 foo.txt,Jeff 具有通过其 Microsoft Entra 标识获得的只读权限(可以通过 RBAC 或 ABAC 进行控制)。 如果 Jeff 通过 NFS(未作为根/超级用户进行装载时)、Blob REST 或 Data Lake Storage Gen2 REST 访问存储帐户,系统会强制实施这些权限。 但是,如果 Jeff 有一个本地用户标识,其中有容器 con1 中数据的删除权限,则可以使用本地用户标识通过 SFTP 删除 foo.txt。

启用 SFTP 支持不妨碍其他类型的客户端使用 Microsoft Entra ID。 对于使用 Azure 门户、Azure CLI、Azure PowerShell 命令、AzCopy 以及 Azure SDK 和 Azure REST API 访问 Blob 存储的用户,你可以继续使用整套 Azure Blob 存储安全设置来授权访问。 有关详细信息,请参阅 Azure Data Lake Storage Gen2 中的访问控制模型

身份验证方法

可以使用密码或安全外壳 (SSH) 公钥-私钥对,通过 SFTP 对连接的本地用户进行身份验证。 可以配置这两种身份验证形式,并让连接的本地用户选择要使用的形式。 但是,不支持多重身份验证,这种方法需要有效的密码和有效的公钥/私钥对才能成功完成身份验证。

密码

你无法设置自定义密码,而只能使用 Azure 为你生成的密码。 如果选择密码身份验证,则完成本地用户配置后将提供密码。 请确保复制该密码,并将其保存在以后可以找到的位置。 以后不再可以从 Azure 检索到该密码。 如果丢失了密码,必须生成一个新密码。 出于安全原因,你无法自行设置密码。

SSH 密钥对

公钥-私钥对是安全外壳 (SSH) 的最常见身份验证形式。 私钥是机密,应该只为本地用户所知。 公钥存储在 Azure 中。 当 SSH 客户端使用本地用户标识连接到存储帐户时,它会发送一条包含公钥和签名的消息。 Azure 将验证该消息,并检查存储帐户是否识别了用户和密钥。 有关详细信息,请参阅 SSH 和密钥概述

如果选择使用私钥-公钥对进行身份验证,则可以生成一个对、使用已存储在 Azure 中的一个对,或者向 Azure 提供现有公钥-私钥对的公钥。 每个本地用户最多可以拥有 10 个公钥。

容器权限

对于容器级权限,可以选择要授予访问权限的容器,以及要提供的访问级别(读取、写入、列出、删除所有权和修改权限)。 这些权限适用于容器中的所有目录和子目录。 可向每个本地用户授予对最多 100 个容器的访问权限。 也可以在创建本地用户后更新容器权限。 下表更详细地描述了每项权限。

权限 符号 说明
读取 r
  • 读取文件内容
  • 写入 w
  • 上传文件
  • 创建目录
  • “上传”目录
  • 列出 l
  • 列出容器中的内容
  • 列出目录中的内容
  • 删除 d
  • 删除文件/目录
  • 创建 c
  • 如果文件不存在,则上传文件
  • 如果目录不存在,则创建目录
  • 修改所有权 o
  • 更改文件或目录的拥有用户或拥有组
  • 修改权限 p
  • 更改文件或目录的 ACL
  • 对子目录中的 Blob 执行写入操作时,需要拥有读取权限,以便能够打开目录并访问 Blob 属性。

    访问控制列表 (ACL)

    重要

    此功能目前以预览版提供。 有关 beta 版本、预览版或尚未正式发布的版本的 Azure 功能所适用的法律条款,请参阅 Microsoft Azure 预览版的补充使用条款

    通过 ACL,你可授予精细的访问权限,例如针对特定目录或文件的写入访问权限。 若要了解有关 ACL 的详细信息,请参阅 Azure Data Lake Storage Gen2 中的访问控制列表 (ACL)

    若要使用 ACL 为本地用户授权,必须先为该本地用户启用 ACL 授权。 请参阅授予对容器的权限

    注意

    虽然 ACL 可为许多不同类型的标识定义权限级别,但只有拥有用户、拥有组和所有其他用户标识才可用于为本地用户授权。 本地用户授权尚不支持命名用户和命名组。

    下表描述了用于 ACL 授权的本地用户的属性。

    properties 说明
    UserId
  • 本地用户在存储帐户中的唯一标识符
  • 创建本地用户时默认生成
  • 用于在文件/目录上设置所有者用户
  • GroupId
  • 本地用户组的标识符
  • 用于在文件/目录上设置所有者组
  • AllowAclAuthorization
  • 允许使用 ACL 授权此本地用户的请求
  • ACL 权限的评估方式

    仅当本地用户不拥有执行操作所需的容器权限时,才会评估 ACL。 由于系统评估访问权限的方式,你无法使用 ACL 来限制已由容器级权限授予的访问权限。 这是因为,系统首先会评估容器权限,如果这些权限授予足够的访问权限,则忽略 ACL。

    重要

    若要授予本地用户对某个文件的读取或写入访问权限,需要向该本地用户授予对容器根文件夹,以及该文件所在文件夹的层次结构中每个文件夹的“执行”权限。 如果本地用户是拥有用户或拥有组,则可以将“执行”权限应用于拥有用户或拥有组。 否则,必须将“执行”权限应用于所有其他用户

    使用 SFTP 客户端修改 ACL

    虽然可以使用任何支持的 Azure 工具或 SDK 来修改 ACL 权限,但本地用户也可以修改这些权限。 要使本地用户能够修改 ACL 权限,必须首先向本地用户授予 Modify Permissions 权限。 请参阅授予对容器的权限

    本地用户只能更改 ACL 的拥有用户、拥有组和所有其他用户的权限级别。 目前不支持为命名用户、命名组和命名安全主体添加或修改 ACL 条目。

    本地用户还可以更改拥有用户和拥有组的 ID。 事实上,只有本地用户才能将拥有用户或拥有组的 ID 更改为本地用户 ID。 目前无法使用 Azure 工具或 SDK 在 ACL 中引用本地用户 ID。 若要更改目录或 Blob 的拥有用户或拥有组,必须向本地用户授予 Modify Ownership 权限。

    若要查看示例,请参阅修改文件或目录的 ACL

    主目录

    配置权限时,可以选择为本地用户设置一个主目录。 如果在 SFTP 连接请求中未指定其他容器,则此主目录就是用户默认连接到的目录。 例如,假设使用 Open SSH 发出了以下请求。 此请求未将某个容器或目录名称指定为 sftp 命令的一部分。

    sftp myaccount.myusername@myaccount.blob.core.windows.net
    put logfile.txt
    

    如果将用户的主目录设置为 mycontainer/mydirectory,则他们会连接到该目录。 然后,logfile.txt 文件将上传到 mycontainer/mydirectory。 如果未设置主目录,则连接尝试会失败。 连接用户必须连同请求指定一个容器,然后在上传文件之前使用 SFTP 命令导航到目标目录。 下面的示例对此进行了展示:

    sftp myaccount.mycontainer.myusername@myaccount.blob.core.windows.net
    cd mydirectory
    put logfile.txt  
    

    注意

    主目录只是连接的本地用户所在的初始目录。 如果本地用户具有适当的容器权限,则他们可以导航到所连接到的容器中的其他任何路径。

    支持的算法

    可以使用许多不同的 SFTP 客户端安全地连接,然后传输文件。 连接的客户端必须使用下表中指定的算法。

    类型 算法
    主机密钥 1 rsa-sha2-256 2
    rsa-sha2-512 2
    ecdsa-sha2-nistp256
    ecdsa-sha2-nistp384
    密钥交换 ecdh-sha2-nistp384
    ecdh-sha2-nistp256
    diffie-hellman-group14-sha256
    diffie-hellman-group16-sha512
    diffie-hellman-group-exchange-sha256
    密码/加密 aes128-gcm@openssh.com
    aes256-gcm@openssh.com
    aes128-ctr
    aes192-ctr
    aes256-ctr
    完整性/MAC hmac-sha2-256
    hmac-sha2-512
    hmac-sha2-256-etm@openssh.com
    hmac-sha2-512-etm@openssh.com
    公钥 ssh-rsa 2
    rsa-sha2-256
    rsa-sha2-512
    ecdsa-sha2-nistp256
    ecdsa-sha2-nistp384
    ecdsa-sha2-nistp521

    1 主机密钥在此处发布。 2 RSA 密钥的长度必须至少为 2,048 位。

    基于安全考虑,对 Azure Blob 存储的 SFTP 支持目前限制了其加密算法支持。 我们强烈建议客户利用 Microsoft 安全开发生命周期 (SDL) 批准的算法,安全地访问其数据。

    目前,根据 Microsoft 安全 SDL,我们不打算支持以下各项:ssh-dssdiffie-hellman-group14-sha1diffie-hellman-group1-sha1diffie-hellman-group-exchange-sha1hmac-sha1hmac-sha1-96。 算法支持将来可能会发生变化。

    使用 SFTP 进行连接

    若要开始使用,请启用 SFTP 支持,创建本地用户,并为该本地用户分配权限。 然后,可以使用任何 SFTP 客户端来安全地进行连接,然后就可以传输文件了。 有关分布指导,请参阅通过使用 SSH 文件传输协议 (SFTP) 来连接到 Azure Blob 存储

    网络注意事项

    SFTP 是平台级服务,因此即使帐户选项已禁用,端口 22 也会打开。 如果未配置 SFTP 访问,则所有请求都将与服务断开连接。 使用 SFTP 时,可能需要通过配置防火墙、虚拟网络或专用终结点来限制公共访问。 这些设置在应用程序层强制执行,这意味着它们不特定于 SFTP,并且会影响与所有 Azure 存储终结点的连接。 有关防火墙和网络配置的详细信息,请参阅配置 Azure 存储防火墙和虚拟网络

    注意

    尝试在协议层确定 TLS 支持的审核工具可能会返回 TLS 版本,此外,直接针对存储帐户终结点运行时,可能会返回所需的最低版本。 有关详细信息,请参阅针对发送到存储帐户的请求强制实施必需的最低版本的传输层安全性 (TLS)

    已知支持的客户端

    以下客户端提供与 Azure Blob 存储的 SFTP 兼容的算法支持。 如果在连接时遇到问题,请参阅 Azure Blob 存储的 SSH 文件传输协议 (SFTP) 支持的限制和已知问题。 此列表并不详尽,可能会随着时间的推移而变化。

    • AsyncSSH 2.1.0+
    • Axway
    • Cyberduck 7.8.2+
    • edtFTPjPRO 7.0.0+
    • FileZilla 3.53.0+
    • libssh 0.9.5+
    • Maverick Legacy 1.7.15+
    • Moveit 12.7
    • OpenSSH 7.4+
    • paramiko 2.8.1+
    • phpseclib 1.0.13+
    • PuTTY 0.74+
    • QualysML 12.3.41.1+
    • RebexSSH 5.0.7119.0+
    • Salesforce
    • ssh2js 0.1.20+
    • sshj 0.27.0+
    • SSH.NET 2020.0.0+
    • WinSCP 5.10+
    • Workday
    • XFB.Gateway
    • JSCH 0.1.54+
    • curl 7.85.0+
    • AIX1
    • MobaXterm v21.3

    1 必须将 AllowPKCS12KeystoreAutoOpen 选项设置为 no

    限制和已知问题

    有关 Azure Blob 存储的 SFTP 支持的限制和问题的完整列表,请参阅限制和已知问题文章

    定价和计费

    启用 SFTP 会产生每小时费用。 有关最新的定价信息,请参阅 Azure Blob 存储定价

    提示

    要避免被动费用,可考虑仅在主动使用 SFTP 传输数据时才启用它。 有关如何启用和随后禁用 SFTP 支持的指导,请参阅使用 SSH 文件传输协议 (SFTP) 连接到 Azure Blob 存储

    基础存储帐户的事务、存储和网络价格适用。 所有 SFTP 事务都会在存储帐户上转换为读取、写入或其他事务。 这包括所有 SFTP 命令和 API 调用。 有关详细信息,请参阅了解 Azure Blob 存储的完整计费模型