SFTP代表SSH File Transfer Protocol。顾名思义,这是一种使用加密SSH连接将文件传输到服务器的安全方式。尽管名称如此,但它与FTP(File Transfer Protocol)完全不同,尽管FTP已经得到了客户的广泛支持。
默认情况下,SFTP能够正常使用,并且在启用了SSH访问的所有服务器都无需进行其他设置。它安全且易于使用。
在某些情况下,您可能只希望允许某些用户进行文件传输而不允许SSH访问。在本教程中,我们将设置SSH守护程序,以限制对每个用户不允许SSH访问一个目录的SFTP访问。
要学习本教程,您需要:
首先,创建一个只授予服务器文件传输访问权限的新用户。在这里,我们使用的是用户名sammyfiles。
sudo adduser sammyfiles
接下来,为新用户分配密码:
sudo passwd sammyfiles
请在这里输入一个强密码,然后再次输入重复密码进行验证。
您现在已经创建了一个新用户,该用户将被授予对受限目录的访问权限。在下一步中,我们将创建文件传输目录并设置必要的权限。
为了限制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服务器本身。
在此步骤中,我们将修改SSH服务器配置以禁止sammy文件的终端访问,但允许文件传输访问。
让我们用你喜欢的文本编辑器打开SSH服务器配置文件,我这里使用的是vi
sudo vi /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 no
、AllowTcpForwarding no
、X11Forwarding no
禁用此用户的端口,隧道和X11转发。注意:您可以省略
PasswordAuthentication yes
,设置SSH密钥访问以提高安全性。按照SSH Essentials
的“ 复制公共SSH密钥”部分:使用SSH服务器,客户端和密钥教程来执行此操作。在为用户禁用shell访问之前,请确保执行此操作。
在下一步中,我们将通过密码访问本地SSH来测试配置,但是如果设置了SSH密钥,则需要使用用户的密钥对访问计算机。
要应用配置更改,请重新启动该服务。
sudo systemctl restart sshd
您现在已配置SSH服务器以限制仅对sammyfiles访问文件传输。最后一步是测试配置以确保其按预期工作。
让我们确保我们的新sammyfiles用户只能传输文件。
使用正常的shell访问权限登录sammyfiles应该不行了。我们来试试吧:
ssh sammyfiles@localhost
在返回到原始提示之前,您将看到以下消息:
This service allows sftp connections only.
Connection to localhost closed.
这意味着sammyfiles无法再使用SSH访问服务器shell。
接下来,让我们验证用户是否可以成功访问SFTP进行文件传输。
sftp sammyfiles@localhost
此命令将显示带有交互式提示的成功登录消息,而不是错误消息。
Connected to localhost.
sftp>
您可以使用ls
命令在提示中列出目录内容:
ls
这将显示uploads
在上一步中创建的目录并返回到sftp>提示符。
uploads
要验证用户确实仅限于此目录并且无法访问其上方的任何目录,您可以尝试将目录更改为其上方的目录。
cd ..
此命令不会出错,但是像以前一样列出目录内容将不会显示任何更改,从而证明用户无法切换到父目录。
您现在已验证受限配置是否按预期工作。新创建的sammyfiles用户只能使用SFTP协议访问服务器进行文件传输,并且无法访问完整的shell。
您已将用户限制为仅访问SFTP。本教程仅使用一个目录和一个用户,但您可以将此示例扩展到多个用户和多个目录。更多Linux教程可以参考腾讯云云学院Linux入门到精通相关课程。
参考文献:《How To Enable SFTP Without Shell Access on CentOS 7 》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。