如何在 Ubuntu 20.04 上启用 SFTP 而无需 shell 访问权限

介绍

SFTP代表了 S SH ** F** ile ** T** ransfer ** P** rotocol,是使用加密SSH连接在机器之间传输文件的安全途径,虽然名称类似,但这是与(FTP)(https://andsky.com/tech/tutorials/what-is-ftp-and-how-is-it-used)(** F** ile ** T** ransfer ** P** rotocol)不同的协议,但现代FTP客户端广泛支持SFTP。

SFTP默认可用,但所有服务器上没有附加配置,并启用了SSH访问. 虽然使用起来安全且相当直截了当,但SFTP的一个缺点是,在一个标准配置中,SSH服务器允许所有用户在系统上有一个账户的文件传输访问和终端 shell访问. 在许多情况下,对用户权限实行颗粒控制更为安全。 例如,您可能想要允许某些用户只执行文件传输,但阻止他们通过SSH获得终端访问服务器.

在本教程中,您将设置SSH DAEMON来限制SFTP访问到一个目录,每个用户均不允许SSH访问。

前提条件

要遵循本教程,您将需要访问Ubuntu 20.04服务器. 该服务器应该具有非根用户的sudo特权,以及启用防火墙。 有关此设置的帮助,请遵循我们的 Ubuntu 20.04 初始服务器设置指南

第1步:创建新用户

首先,创建一个新用户,只会获得文件传输访问服务器. 在这里,我们使用用户名 sammyfiles ,但你可以使用任何你喜欢的用户名:

1sudo adduser sammyfiles

您将被要求为帐户创建密码,随后提供有关用户的一些信息. 用户信息是可选的,因此您可以按ENTER,以便这些字段空白。

您现在已经创建了一个新的用户,将被允许访问受限制的目录. 在下一步,您将创建文件传输目录并设置必要的权限。

步骤2 — 创建文件转移的目录

为了限制 SFTP 访问到一个目录,您必须首先确保目录符合 SSH 服务器的权限要求,这些要求非常具体。

具体来说,目录本身和在文件系统树中之前的所有目录必须由 root 拥有,不能由其他人编写,因此,无法限制访问用户的家目录,因为家目录属于用户,而不是 ** root** 。

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

在本教程中,您将创建和使用/var/sftp/uploads作为目标上传目录。/var/sftp将由 root 拥有,不会由其他用户编写;子目录/var/sftp/uploads将由 ** sammyfiles** 拥有,以便用户可以上传文件。

首先,创建目录:

1sudo mkdir -p /var/sftp/uploads

将 `/var/sftp 的所有者设置为 root :

1sudo chown root:root /var/sftp

给同一个目录写权限,并给其他用户只读和执行权限:

1sudo chmod 755 /var/sftp

更改您刚刚创建的用户的上传目录的所有权。下列命令再次使用示例用户和组 sammyfiles ,所以如果您给创建的用户另一个名称,请确保更改:

1sudo chown sammyfiles:sammyfiles /var/sftp/uploads

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

步骤 3 – 限制访问一个目录

在此步骤中,您将更改 SSH 服务器配置以禁用 sammyfiles 的终端访问,但允许文件传输访问。

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

1sudo nano /etc/ssh/sshd_config

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

 1[label /etc/ssh/sshd_config]
 2
 3Match User sammyfiles
 4ForceCommand internal-sftp
 5PasswordAuthentication yes
 6ChrootDirectory /var/sftp
 7PermitTunnel no
 8AllowAgentForwarding no
 9AllowTcpForwarding no
10X11Forwarding no

以下是每个指令所做的:

  • Match User 告诉 SSH 服务器只对指定的用户应用以下命令。 在这里,我们具体说明萨米文件 。 再次, 如果不同, 请用自己的用户名更新 。
  • `ForceCommand Internal-sftp'迫使SSH服务器在登录时运行SFTP服务器,不允许 shell访问.
  • `Password Authentication yes'允许该用户密码认证。
  • " Chroot Directory/var/sftp/ " 确保不允许用户访问 " /var/sftp " 目录以外的任何内容。
  • Allow Agent Forward no'、AllowTcp Forward no'和`X-11 forward no'分别使港口转运、地道转运和X11转运失效。 添加这些指令的目的是进一步限制该用户访问服务器. .

此套命令,从匹配用户开始,可以对不同用户进行复制和重复,请确保对匹配用户行中的用户名进行相应的修改。

美元(注)

** 注意** :您可以省略PasswordAuthentication yes行,并设置 SSH 密钥访问以增强安全性。 请遵循 SSH Essentials: Working with SSH Servers, Clients, and Keys教程中的复制您的公共 SSH 密钥部分。

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

美元

添加这些行后,保存并关闭文件. 如果您正在使用nano,您可以通过按CTRL + X,然后按Y,然后按ENTER

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

1sudo systemctl restart sshd

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

步骤4 – 验证配置

让我们确保我们的新的 sammyfiles 用户只能传输文件. 如前所述,SFTP用于在机器之间传输文件. 您可以通过测试本地机器和服务器之间的传输来验证此功能。

首先,尝试作为您在步骤 1 中创建的用户登录您的服务器,因为您添加到 SSH 配置文件的设置,这将是不可能的:

1[environment local]
2ssh sammyfiles@your_server_ip

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

1[environment local]
2[secondary_label Output]
3This service allows sftp connections only.
4Connection to your_server_ip closed.

这意味着 sammyfiles 不再可以使用 SSH 访问服务器壳。

接下来,检查用户是否能够成功访问 SFTP 进行文件传输:

1[environment local]
2sftp sammyfiles@your_server_ip

代替错误消息,此命令将通过交互式提示生成成功登录消息:

1[environment local]
2[secondary_label Output]
3Connected to your_server_ip
4sftp>

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

1[environment local]
2ls

这将显示在上一步创建的上传目录,并将您返回sftp>提示:

1[environment local]
2[secondary_label Output]
3uploads

要验证用户确实受到此目录的限制,并且无法访问此目录之前的任何目录,您可以尝试将目录更改为以前的目录:

1[environment local]
2cd ..

此命令不会给出错误,但会像以前一样列出目录内容,没有变化,证明用户无法切换到主目录。

您现在已经验证了限制配置的正常运行,新创建的 sammyfiles 用户只能使用 SFTP 协议访问服务器进行文件传输,并且无法访问完整的壳。

结论

虽然本教程只使用一个目录和一个用户进行简化,但您可以将此示例扩展到多个用户和多个目录。

SSH 服务器允许更复杂的配置方案,包括限制访问群组或多个用户,甚至限制访问某些 IP 地址. 您可以在 OpenSSH 烹饪书中找到其他配置选项的示例和可能的指令的解释。

Published At
Categories with 技术
comments powered by Disqus