针对 Azure Blob 存储的 SSH 文件传输协议 (SFTP) 支持(预览)

Blob 存储现在支持 SSH 文件传输协议 (SFTP)。 此项支持提供通过 SFTP 终结点安全地连接到 Blob 存储帐户的功能,使你可以使用 SFTP 进行文件访问、文件传输和文件管理。

重要

SFTP 支持目前处于预览版阶段,可在常规用途 v2 和高级块 Blob 帐户上使用

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

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 是这些可用的协议之一。

分层命名空间

SFTP 权限模型

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

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

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

注意

本地用户不能与其他 Azure 存储权限模型进行互操作,例如 RBAC(基于角色的访问控制)和 ACL(访问控制列表)。

例如,对于存储在容器 con1 中的文件 foo.txt,Jeff 具有通过其 Azure AD 标识获得的只读权限(可以通过 RBAC 或 ACL 进行控制)。 如果 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 提供现有公钥-私钥对的公钥。

容器权限

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

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

    主目录

    配置权限时,可以选择为本地用户设置一个主目录。 如果在 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 密钥交换 密码/加密 完整性/MAC 公钥
    rsa-sha2-256 2 ecdh-sha2-nistp384 aes128-gcm@openssh.com hmac-sha2-256 ssh-rsa 2
    rsa-sha2-512 2 ecdh-sha2-nistp256 aes256-gcm@openssh.com hmac-sha2-512 ecdsa-sha2-nistp256
    ecdsa-sha2-nistp256 diffie-hellman-group14-sha256 aes128-cbc hmac-sha2-256-etm@openssh.com ecdsa-sha2-nistp384
    ecdsa-sha2-nistp384 diffie-hellman-group16-sha512 aes192-cbc hmac-sha2-512-etm@openssh.com
    diffie-hellman-group-exchange-sha256 aes256-cbc
    aes128-ctr
    aes192-ctr
    aes256-ctr

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

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

    目前,根据 Microsoft 安全 SDL 的要求,我们不打算支持以下各项:ssh-dssdiffie-hellman-group14-sha1diffie-hellman-group1-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+
    • 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

    上面的受支持客户端列表并不详尽,今后可能会有变化。

    限制和已知问题

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

    定价和计费

    重要

    在公开预览期,使用 SFTP 不会产生额外的费用。 但是,标准事务、存储和网络价格仍对基础 Azure Data Lake Store Gen2 帐户适用。 该功能推出正式版后,SFTP 可能会产生额外的费用。

    事务和存储成本取决于多种因素,例如存储帐户类型,以及用于将数据传输到存储帐户的终结点。

    另请参阅