授权 SSH 文件传输协议 (SFTP) 客户端访问 Azure Blob 存储
本文介绍如何为 SFTP 客户端授权访问,以便可以使用 SFTP 客户端安全连接到 Azure 存储帐户的 Blob 存储终结点。
若要详细了解 Azure Blob 存储中的 SFTP 支持,请参阅 Azure Blob 存储中的 SSH 文件传输协议 (SFTP)。
先决条件
创建本地用户
Azure 存储不支持使用共享访问签名 (SAS) 或 Microsoft Entra 身份验证来访问 SFTP 终结点。 必须改用称作“本地用户”的标识,可以使用 Azure 生成的密码或安全外壳 (SSH) 密钥对来保护该标识。 若要向连接客户端授予访问权限,存储帐户必须具有与该密码或密钥对关联的标识。 该标识称为本地用户。
本部分介绍如何创建本地用户,选择身份验证方法,以及为该本地用户分配权限。
若要详细了解 SFTP 权限模型,请参阅 SFTP 权限模型。
选择身份验证方法
可以使用密码或安全外壳 (SSH) 公钥-私钥对,对从 SFTP 客户端连接的本地用户进行身份验证。
重要
虽然可以启用这两种身份验证形式,但 SFTP 客户端只能使用其中的一种形式进行连接。 不支持多重身份验证 - 这种方法需要有效的密码和有效的公钥/私钥对才能成功完成身份验证。
在 Azure 门户中导航到存储帐户。
在“设置”下,依次选择“SFTP”、“添加本地用户” 。
在“添加本地用户”配置窗格中添加用户名,然后选择要与此本地用户关联的身份验证方法。 可以关联密码和/或 SSH 密钥。
如果选择“SSH 密码”,则在完成“添加本地用户”配置窗格中的所有步骤后,密码就会显示。 SSH 密码由 Azure 生成,长度至少为 32 个字符。
如果选择“SSH 密钥对”,请选择“公钥源”以指定密钥源。
下表描述了每个密钥源选项:
选项 |
指南 |
生成新的密钥对 |
使用此选项可以创建新的公钥/私钥对。 公钥以你提供的密钥名称存储在 Azure 中。 成功添加本地用户后,可以下载私钥。 |
使用 Azure 中存储的现有密钥 |
若要使用已存储在 Azure 中的公钥,请使用此选项。 若要在 Azure 中查找现有密钥,请参阅列出密钥。 当 SFTP 客户端连接到 Azure Blob 存储时,这些客户端需要提供与此公钥关联的私钥。 |
使用现有公钥 |
若要上传存储在 Azure 外部的公钥,请使用此选项。 如果你没有公钥,但想要在 Azure 外部生成一个公钥,请参阅使用 ssh-keygen 生成密钥。 |
选择“下一步”打开配置窗格的“权限”选项卡。
本部分介绍如何使用 SSH 密钥或密码进行身份验证。
使用 SSH 密钥进行身份验证 (PowerShell)
选择要使用的公钥类型。
使用 Azure 中存储的现有密钥
若要使用已存储在 Azure 中的公钥,请使用此选项。 若要在 Azure 中查找现有密钥,请参阅列出密钥。 当 SFTP 客户端连接到 Azure Blob 存储时,这些客户端需要提供与此公钥关联的私钥。
使用存储在 Azure 外部的现有公钥。
如果你没有公钥,请参阅使用 ssh-keygen 生成密钥来了解如何创建密钥。 仅支持 OpenSSH 格式的公钥。 提供的密钥必须使用此格式:<key type> <key data>
。 例如,RSA 密钥类似于:ssh-rsa AAAAB3N...
。 如果密钥采用另一种格式,你可以使用 ssh-keygen
之类的工具将其转换为 OpenSSH 格式。
使用 New-AzStorageLocalUserSshPublicKey 命令创建公钥对象。 将 -Key
参数设置为包含密钥类型和公钥的字符串。 在下面的示例中,密钥类型为 ssh-rsa
,密钥为 ssh-rsa a2V5...
。
$sshkey = "ssh-rsa a2V5..."
$sshkey = New-AzStorageLocalUserSshPublicKey -Key $sshkey -Description "description for ssh public key"
使用 Set-AzStorageLocalUser 命令创建本地用户。 如果使用 SSH 密钥,则将 SshAuthorizedKey
参数设置为在上一步中创建的公钥对象。
以下示例创建本地用户,然后将密钥输出到控制台。
$UserName = "mylocalusername"
$localuser = Set-AzStorageLocalUser -ResourceGroupName $resourceGroupName -StorageAccountName $storageAccountName -UserName $UserName -SshAuthorizedKey $sshkey -HasSharedKey $true -HasSshKey $true
$localuser
$localuser.SshAuthorizedKeys | ft
注意
本地用户还具有仅用于 SMB 身份验证的 sharedKey
属性。
使用密码进行身份验证 (PowerShell)
使用 Set-AzStorageLocalUser 命令创建本地用户,并将 -HasSshPassword
参数设置为 $true
。
以下示例创建使用密码身份验证的本地用户。
$UserName = "mylocalusername"
$localuser = Set-AzStorageLocalUser -ResourceGroupName $resourceGroupName -StorageAccountName $storageAccountName -UserName $UserName -HasSshPassword $true
可以使用 New-AzStorageLocalUserSshPassword 命令创建密码。 将 -UserName
参数设置为用户名。
以下示例为用户生成密码。
$password = New-AzStorageLocalUserSshPassword -ResourceGroupName $resourceGroupName -StorageAccountName $storageAccountName -UserName $UserName
$password
重要
以后不再可以检索到此密码,因此请务必复制该密码,并将其存储在可以找到的位置。 如果丢失了密码,则必须生成一个新密码。 请注意,SSH 密码由 Azure 生成,长度至少为 32 个字符。
本部分介绍如何使用 SSH 密钥或密码进行身份验证。
使用 SSH 密钥进行身份验证 (Azure CLI)
选择要使用的公钥类型。
使用 Azure 中存储的现有密钥
若要使用已存储在 Azure 中的公钥,请使用此选项。 若要在 Azure 中查找现有密钥,请参阅列出密钥。 当 SFTP 客户端连接到 Azure Blob 存储时,这些客户端需要提供与此公钥关联的私钥。
使用存储在 Azure 外部的现有公钥。
如果你没有公钥,请参阅使用 ssh-keygen 生成密钥来了解如何创建密钥。 仅支持 OpenSSH 格式的公钥。 提供的密钥必须使用此格式:<key type> <key data>
。 例如,RSA 密钥类似于:ssh-rsa AAAAB3N...
。 如果密钥采用另一种格式,你可以使用 ssh-keygen
之类的工具将其转换为 OpenSSH 格式。
若要创建使用 SSH 密钥进行身份验证的本地用户,请使用 az storage account local-user create 命令,然后将 --has-ssh-key
参数设置为包含密钥类型和公钥的字符串。
以下示例创建名为 contosouser
的本地用户,并使用密钥值为 ssh-rsa a2V5...
的 ssh-rsa 密钥进行身份验证。
az storage account local-user create --account-name contosoaccount -g contoso-resource-group -n contosouser --ssh-authorized-key key="ssh-rsa a2V5..." --has-ssh-key true --has-ssh-password true
注意
本地用户还具有仅用于 SMB 身份验证的 sharedKey
属性。
使用密码进行身份验证 (Azure CLI)
若要创建使用密码进行身份验证的本地用户,请使用 az storage account local-user create 命令,然后将 --has-ssh-password
参数设置为 true
。
以下示例创建名为 contosouser
的本地用户,并将 --has-ssh-password
参数设置为 true
。
az storage account local-user create --account-name contosoaccount -g contoso-resource-group -n contosouser --has-ssh-password true
使用 az storage account local-user regenerate-password 命令创建密码。 将 -n
参数设置为本地用户名。
以下示例为用户生成密码。
az storage account local-user regenerate-password --account-name contosoaccount -g contoso-resource-group -n contosouser
重要
以后不再可以检索到此密码,因此请务必复制该密码,并将其存储在可以找到的位置。 如果丢失了密码,则必须生成一个新密码。 请注意,SSH 密码由 Azure 生成,长度至少为 32 个字符。
授予对容器的权限
选择要对哪个容器授予访问权限,以及要提供的访问级别。 这些权限适用于容器中的所有目录和子目录。 若要详细了解每个容器权限,请参阅容器权限。
如果要在文件和目录级别授权访问,可以启用 ACL 授权。 此功能目前以预览版提供,只能使用 Azure 门户来启用。
在“权限”选项卡中,选择要提供给此本地用户使用的容器。 然后,选择要允许此本地用户执行的操作类型。
重要
本地用户必须至少拥有一个容器权限,或该容器的主目录的 ACL 权限。 否则,尝试连接到该容器将会失败。
如果你要使用与此容器中的文件和目录关联的访问控制列表 (ACL) 来授权访问,请选中“允许 ACL 授权”复选框。 若要详细了解如何使用 ACL 来为 SFTP 客户端授权,请参阅 ACL。
还可以通过将此本地用户分配到组 ID,将其添加到组中。 该 ID 可以是所需的任何编号或编号方案。 通过对用户进行分组,可以添加和删除用户,而无需将 ACL 重新应用于整个目录结构。 只需在组中添加或删除用户即可。
注意
本地用户的用户 ID 会自动生成。 无法修改此 ID,但创建本地用户后,可以通过在“编辑本地用户”窗格中重新打开该用户来查看该 ID。
在“主目录”编辑框中,键入容器的名称,或者用作与此本地用户关联的默认位置的目录路径(包括容器名称,例如 mycontainer/mydirectory
)。
若要详细了解主目录,请参阅主目录。
选择“添加”按钮以添加本地用户。
如果启用了密码身份验证,则在添加本地用户后,Azure 生成的密码将显示在对话框中。
重要
以后不再可以检索到此密码,因此请务必复制该密码,并将其存储在可以找到的位置。
如果选择生成新的密钥对,则在添加本地用户后,系统会提示你下载该密钥对的私钥。
注意
本地用户具有仅用于 SMB 身份验证的 sharedKey
属性。
确定要向本地用户提供哪些容器,以及希望允许此本地用户执行的操作类型。 使用 New-AzStorageLocalUserPermissionScope 命令并将该命令的 -Permission
参数设置为与访问权限级别对应的一个或多个字母,来创建权限范围对象。 可能的值为 Read (r)、Write (w)、Delete (d)、List (l)、Create (c)、Modify Ownership (o)、Modify Permissions (p)。
以下示例集创建权限范围对象,该对象为 mycontainer
容器提供读取和写入权限。
$permissionScope = New-AzStorageLocalUserPermissionScope -Permission rw -Service blob -ResourceName mycontainer
重要
本地用户必须对要连接到的容器拥有至少一个容器权限,否则连接尝试将失败。
使用 Set-AzStorageLocalUser 命令更新本地用户。 将 -PermissionScope
参数设置为前面创建的权限范围对象。
以下示例使用容器权限更新本地用户,然后将权限范围输出到控制台。
$UserName = "mylocalusername"
$localuser = Set-AzStorageLocalUser -ResourceGroupName $resourceGroupName -StorageAccountName $storageAccountName -UserName $UserName -HomeDirectory "mycontainer" -PermissionScope $permissionScope
$localuser
$localuser.PermissionScopes | ft
若要更新本地用户对容器的权限,请使用 az storage account local-user update 命令,然后将该命令的 permission-scope
参数设置为与访问权限级别对应的一个或多个字母。 可能的值为 Read (r)、Write (w)、Delete (d)、List (l)、Create (c)、Modify Ownership (o)、Modify Permissions (p)。
以下示例为本地用户名 contosouser
提供对名为 contosocontainer
的容器的读取和写入访问权限。
az storage account local-user update --account-name contosoaccount -g contoso-resource-group -n contosouser --home-directory contosocontainer --permission-scope permissions=rw service=blob resource-name=contosocontainer
后续步骤
相关内容