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

介绍

SFTP代表S SH F ile T ransfer P rotocol。顾名思义,这是一种使用加密SSH连接在计算机之间传输文件的安全方法。尽管名称如此,但它与FTP(F ile T ransfer P rotocol)完全不同,尽管现代FTP客户端广泛支持它。

在启用了SSH访问的所有服务器上没有其他配置的默认情况下, SFTP是可用的。它安全且易于使用,但缺点是:在标准配置中,SSH服务器设置了对系统上具有帐户的所有用户的文件传输的访问权限和终端shell的访问权限。

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

课程准备

要学习本教程,您需要访问Ubuntu 18.04服务器。此服务器应具有具有sudo权限的非root用户以及启用的防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器

第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服务器配置以禁止对sammy文件的终端访问,但允许文件传输访问。

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

sudo nano /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 no。并X11Forwarding no禁用此用户的端口转发,隧道和X11转发。

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

注意:您可以省略该PasswordAuthentication yes行,而是设置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地址的访问。

更多Ubuntu教程请前往腾讯云+社区学习更多知识。


参考文献:《How To Enable SFTP Without Shell Access on Ubuntu 18.04》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Thinks

带你零基础入门express

作为一篇新手入门,这篇文章没有太多的技巧和花式,只是从零开始带你学习和掌握express的开发应用,比较适合于完全没有使用过express的新手,以及其他非前端...

2.4K570
来自专栏Java技术栈

漫画:HTTP 协议极简教程,傻瓜都能看懂!

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网服务器传输超文本到本地浏览器的传送协议。HTTP ...

16440
来自专栏云计算教程系列

如何在CentOS 7上安装和配置scponly

scponly是匿名FTP的安全替代品。它使管理员能够设置具有受限远程文件访问权限且无法访问交互式shell的安全用户帐户。

18000
来自专栏吴柯的运维笔记

Nginx服务器常见问题如何优化?

Nginx常见问题处理 -要求- 对Nginx服务器进行适当优化,以提升服务器的处理性能: 1.不显示Nginx软件版本号 2.如果客户端访问服务器提示“T...

39560
来自专栏云计算教程系列

如何在CVM上设置SSH仅作文件传输

SFTP代表SSH File Transfer Protocol。顾名思义,这是一种使用加密SSH连接将文件传输到服务器的安全方式。尽管名称如此,但它与FTP(...

22650
来自专栏有困难要上,没有困难创造困难也要上!

使用Sinopia搭建私有npm仓库

416110
来自专栏Spark学习技巧

聊聊spark-submit的几个有用选项

14030
来自专栏我是攻城师

如何管理Spark Streaming消费Kafka的偏移量(二)

38640
来自专栏美团技术团队

【美团技术团队博客】Linux资源管理之cgroups简介

引子 cgroups 是Linux内核提供的一种可以限制单个进程或者多个进程所使用资源的机制,可以对 cpu,内存等资源实现精细化的控制,目前越来越火的轻量级...

47360
来自专栏WindCoder

ubuntu14.04下java安装及环境配置

这可以说是一篇迟到的文章,几个月前就说要写,结果拖到了现在。中间由于系统打不开等一系列原因,不得不重装了一遍,这次环境配置是出了点小问题,最后奉上。

34120

扫码关注云+社区

领取腾讯云代金券