适用于 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 权限模型

Azure Blob 存储不支持通过 SFTP 进行 Microsoft Entra 身份验证或授权。 相反,SFTP 使用一种新的标识管理形式,称为“本地用户”。

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

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

注意

本地用户不能与其他 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 的存储帐户,你可以使用 Azure Blob 存储的全部安全设置,通过 Azure 门户、Azure CLI、Azure PowerShell 命令、AzCopy 以及 Azure SDK 和 Azure REST API,对访问 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
  • 更改文件/目录的权限
  • 对子目录中的 Blob 执行写入操作时,需要拥有读取权限,以便能够打开目录并访问 Blob 属性。

    ACL

    对于目录或 Blob 级权限,可以更改 ADLS Gen2 ACL 使用的所有者、组和模式。 大多数 SFTP 客户端都会公开用于更改这些属性的命令。 下表更加详细地描述了常用命令。

    命令 所需的容器权限 说明
    chown o
  • 更改文件/目录的所有者
  • 必须指定数字 ID
  • chgrp o
  • 更改文件/目录的组
  • 必须指定数字 ID
  • chmod p
  • 更改文件/目录的权限/模式
  • 必须指定 POSIX 样式的八进制权限
  • 更改所有者和组所需的 ID 是本地用户的部分新属性。 下表更详细地描述了本地用户的每个新属性。

    properties 说明
    UserId
  • 本地用户在存储帐户中的唯一标识符
  • 创建本地用户时默认生成
  • 用于设置文件/目录的所有者
  • GroupId
  • 一组本地用户的标识符
  • AllowAclAuthorization
  • 允许使用 ACL 授权此本地用户的请求
  • 所需的 ACL 配置完毕且本地用户启用 AllowAclAuthorization 后,他们可以使用 ACL 来授权其请求。 与 RBAC 类似,容器权限可以与 ACL 互操作。 仅当本地用户没有足够的容器权限时,才会评估 ACL。 有关详细信息,请参阅 Azure Data Lake Storage Gen2 中的访问控制模型

    主目录

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

    sftp myaccount.myusername@myaccount.blob.core.chinacloudapi.cn
    put logfile.txt
    

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

    sftp myaccount.mycontainer.myusername@myaccount.blob.core.chinacloudapi.cn
    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 密钥的长度必须至少为 2048 位。

    基于安全考虑,对 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 存储

    已知支持的客户端

    以下客户端提供与 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

    1 必须将 AllowPKCS12KeystoreAutoOpen 选项设置为 no

    限制和已知问题

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

    定价和计费

    启用 SFTP 终结点需要按小时付费。 有关最新的定价信息,请参阅 Azure Blob 存储定价

    提示

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

    基础存储帐户的事务、存储和网络价格适用。 所有 SFTP 事务都会在存储帐户上转换为读取、写入或其他事务。 这包括所有 SFTP 命令和 API 调用。

    另请参阅