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

介绍

SFTP代表 S SH ** F** ile ** T** ransfer ** P** rotocol. 正如其名称所示,它是一种使用加密SSH连接的机器之间传输文件的安全方式。 尽管它的名称,它是一个完全不同的协议,而不是 FTP(** F** ile ** T** ransfer ** P** protocol),尽管它被现代的FTP客户端广泛支持。

SFTP 默认情况下在所有已启用 SSH 访问的服务器上没有额外配置,它是安全和易于使用的,但具有一个缺点:在标准配置中,SSH 服务器向系统上有帐户的所有用户提供文件传输和终端壳访问。

在某些情况下,您可能只希望允许某些用户进行文件传输,而不允许 SSH 访问. 在本教程中,我们将设置 SSH DAEMON 以限制 SFTP 访问到一个目录,每个用户均不允许 SSH 访问。

前提条件

要遵循本教程,您需要访问Ubuntu 18.04服务器,该服务器应该具有非根用户的sudo特权,以及启用防火墙。

第1步:创建新用户

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

1sudo adduser sammyfiles

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

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

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

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

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

注意:一些版本的OpenSSH对目录结构和所有权没有如此严格的要求,但大多数现代的Linux发行版(包括Ubuntu 18.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. . .
 3
 4Match User sammyfiles
 5ForceCommand internal-sftp
 6PasswordAuthentication yes
 7ChrootDirectory /var/sftp
 8PermitTunnel no
 9AllowAgentForwarding no
10AllowTcpForwarding no
11X11Forwarding 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'.和`AllowTcp forward no'. .

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

美元(注)

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

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

美元

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

1sudo systemctl restart sshd

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

步骤4 – 验证配置

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

使用正常壳存取方式登录服务器作为 sammyfiles 不再可能。

1ssh sammyfiles@localhost

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

1[secondary_label Error message]
2This service allows sftp connections only.
3Connection to localhost closed.

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

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

1sftp sammyfiles@localhost

代替错误消息,此命令将显示一个成功的登录消息与交互式提示。

1[secondary_label SFTP prompt]
2Connected to localhost.
3sftp>

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

1ls

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

1[secondary_label SFTP file list output]
2uploads

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

1cd ..

此命令不会给出错误,但列出目录内容如前不会显示任何变化,证明用户无法切换到主目录。

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

结论

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

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

Published At
Categories with 技术
comments powered by Disqus