如何在Ubuntu18.04上启用没有Shell访问的SFTP

来自菜鸟教程
跳转至:导航、​搜索

介绍

SFTP 代表 SSH File T 传输 P 协议。 顾名思义,这是一种使用加密 SSH 连接在机器之间传输文件的安全方式。 尽管有这个名字,它是一个与 FTP 完全不同的协议(File Transfer Protocol),尽管它被现代广泛支持FTP 客户端。

默认情况下,SFTP 可用,无需在所有启用了 SSH 访问的服务器上进行额外配置。 它安全且易于使用,但也有一个缺点:在标准配置中,SSH 服务器向所有在系统上拥有帐户的用户授予文件传输访问权限和终端 shell 访问权限。

在某些情况下,您可能希望只允许某些用户进行文件传输而不允许 SSH 访问。 在本教程中,我们将设置 SSH 守护程序以限制对一个目录的 SFTP 访问,并且不允许基于每个用户的 SSH 访问。

先决条件

要学习本教程,您需要访问 Ubuntu 18.04 服务器。 此服务器应该有一个具有 sudo 权限的非 root 用户,并且启用了防火墙。 如需有关设置的帮助,请遵循我们的 Initial Server Setup Guide for Ubuntu 18.04

第 1 步 — 创建新用户

首先,创建一个新用户,该用户将仅被授予对服务器的文件传输访问权限。 在这里,我们使用用户名 sammyfiles,但您可以使用任何您喜欢的用户名。

sudo adduser sammyfiles

系统将提示您为该帐户创建密码,然后是有关用户的一些信息。 用户信息是可选的,因此您可以按 ENTER 将这些字段留空。

您现在已经创建了一个新用户,该用户将被授予访问受限目录的权限。 在下一步中,我们将创建文件传输目录并设置必要的权限。

第 2 步 — 创建文件传输目录

为了限制 SFTP 访问一个目录,我们首先要确保该目录符合 SSH 服务器的权限要求,这是非常特殊的。

具体来说,文件系统树中的目录本身和它上面的所有目录必须由 root 拥有,并且不能被其他任何人写入。 因此,不可能简单地限制对用户主目录的访问,因为主目录归用户所有,而不是 root

注意: 有些版本的 OpenSSH 对目录结构和所有权没有这么严格的要求,但大多数现代 Linux 发行版(包括 Ubuntu 18.04)都有。


有多种方法可以解决此所有权问题。 在本教程中,我们将创建并使用 /var/sftp/uploads 作为目标上传目录。 /var/sftp将归root所有,其他用户不可写; 子目录 /var/sftp/uploads 将归 sammyfiles 所有,这样用户就可以上传文件到它。

首先,创建目录。

sudo mkdir -p /var/sftp/uploads

/var/sftp 的所有者设置为 root

sudo chown root:root /var/sftp

赋予root对同一目录的写权限,赋予其他用户只读和执行权限。

sudo chmod 755 /var/sftp

uploads 目录的所有权更改为 sammyfiles

sudo chown sammyfiles:sammyfiles /var/sftp/uploads

现在目录结构已经到位,我们可以配置 SSH 服务器本身。

第 3 步 — 限制对一个目录的访问

在这一步中,我们将修改 SSH 服务器配置以禁止 sammyfiles 的终端访问,但允许文件传输访问。

使用 nano 或您喜欢的文本编辑器打开 SSH 服务器配置文件。

sudo nano /etc/ssh/sshd_config

滚动到文件的最底部并附加以下配置片段:

/etc/ssh/sshd_config

. . .

Match User sammyfiles
ForceCommand internal-sftp
PasswordAuthentication yes
ChrootDirectory /var/sftp
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no

然后保存并关闭文件。

以下是每个指令的作用:

  • Match User 告诉 SSH 服务器仅将以下命令应用于指定的用户。 在这里,我们指定 sammyfiles
  • ForceCommand internal-sftp 强制 SSH 服务器在登录时运行 SFTP 服务器,不允许 shell 访问。
  • PasswordAuthentication yes 允许对此用户进行密码验证。
  • ChrootDirectory /var/sftp/ 确保不允许用户访问 /var/sftp 目录之外的任何内容。
  • AllowAgentForwarding noAllowTcpForwarding noX11Forwarding no 禁用此用户的端口转发、隧道和 X11 转发。

这组命令以 Match User 开头,也可以为不同的用户复制和重复。 确保相应地修改 Match User 行中的用户名。

注意:您可以省略 PasswordAuthentication yes 行,而是设置 SSH 密钥访问以提高安全性。 按照 SSH 基础:使用 SSH 服务器、客户端和密钥 教程的 复制您的公共 SSH 密钥 部分来执行此操作。 确保在禁用用户的 shell 访问之前执行此操作。

在下一步中,我们将通过在本地使用密码访问 SSH 来测试配置,但如果您设置了 SSH 密钥,则需要使用用户的密钥对访问计算机。


要应用配置更改,请重新启动服务。

sudo systemctl restart sshd

您现在已将 SSH 服务器配置为仅限制 sammyfiles 对文件传输的访问。 最后一步是测试配置以确保它按预期工作。

第 4 步 — 验证配置

让我们确保我们的新 sammyfiles 用户只能传输文件。

使用正常的 shell 访问以 sammyfiles 身份登录服务器应该不再可能。 让我们尝试一下:

ssh sammyfiles@localhost

在返回原始提示之前,您将看到以下消息:

Error messageThis service allows sftp connections only.
Connection to localhost closed.

这意味着 sammyfiles 不能再使用 SSH 访问服务器 shell。

接下来,我们来验证用户是否可以成功访问 SFTP 进行文件传输。

sftp sammyfiles@localhost

此命令不会显示错误消息,而是显示带有交互式提示的成功登录消息。

SFTP promptConnected to localhost.
sftp>

您可以在提示符中使用 ls 列出目录内容:

ls

这将显示在上一步中创建的 uploads 目录,并返回到 sftp> 提示符。

SFTP file list outputuploads

要验证用户确实被限制在此目录中并且无法访问它上面的任何目录,您可以尝试将目录更改为它上面的目录。

cd ..

这个命令不会报错,但是像以前一样列出目录内容会显示没有变化,证明用户无法切换到父目录。

您现在已验证受限配置是否按预期工作。 新创建的 sammyfiles 用户只能使用 SFTP 协议访问服务器进行文件传输,无法访问完整的 shell。

结论

您已将用户限制为只能通过 SFTP 访问服务器上的单个目录,而没有完全的 shell 访问权限。 虽然本教程为简洁起见仅使用一个目录和一个用户,但您可以将此示例扩展到多个用户和多个目录。

SSH 服务器允许更复杂的配置方案,包括一次限制对组或多个用户的访问,甚至限制对某些 IP 地址的访问。 您可以在 OpenSSH Cookbook 中找到其他配置选项的示例和可能指令的解释。 如果您在使用 SSH 时遇到任何问题,可以使用此 SSH 疑难解答系列 进行调试和修复。