如何在CentOS7上启用没有Shell访问权限的SFTP

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

介绍

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

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

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

先决条件

要遵循本教程,您将需要:

  • 使用 this initial server setup tutorial 设置的一台 CentOS 7 服务器,包括 sudo 非 root 用户。
  • 可选地,与 yum install nano 一起安装的 nano 文本编辑器。 CentOS 默认自带 vi 文本编辑器,但 nano 可以更人性化。

第 1 步 — 创建新用户

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

sudo adduser sammyfiles

接下来,为新用户分配密码:

sudo passwd sammyfiles

输入一个强密码,然后再次重复以验证它。

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

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

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

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

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


有多种方法可以解决此所有权问题。 在本教程中,我们将创建并使用 /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 的终端访问,但允许文件传输访问。

让我们用vi或者你喜欢的文本编辑器打开SSH服务器配置文件(这里是vi的简短介绍)

sudo vi /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 目录之外的任何内容。 您可以在 this 基于 Ubuntu 的 chroot 教程 中了解有关 chroot 的更多信息。
  • 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 疑难解答系列 进行调试和修复。