SFTP(SSH File Transfer Protocol)是建立在SSH(安全外壳协议)之上的一个安全文件传输协议,要“接收SFTP”,核心就是配置好服务器的SSH服务,绝大多数Linux/Unix服务器和macOS系统都自带SSH服务,这也意味着它们天生就具备了提供SFTP服务的能力。
下面我将分步骤详细说明如何配置。
SFTP是SSH的一个子系统(sftp-server
),当客户端通过SFTP连接时,SSH守护进程(sshd
)会启动这个子系统来处理文件传输请求,我们不需要单独安装SFTP服务器软件,只需要配置SSH。
以下步骤假设您拥有服务器的root或sudo权限。
1、检查SSH服务状态:
systemctl status ssh
# 或者,在某些系统上可能是sshd
systemctl status sshd
如果看到active (running)
,说明服务已在运行,如果未安装,请先安装(在Ubuntu上:sudo apt update && sudo apt install openssh-server
)。
步骤二:配置SSH以启用SFTP(关键步骤)
SSH的主配置文件是/etc/ssh/sshd_config
,我们需要编辑这个文件。
1、备份配置文件(好习惯):
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
2、编辑配置文件:
sudo nano /etc/ssh/sshd_config
3、确保SFTP子系统已启用(通常默认是开启的):
找到类似下面这行,确保它没有被注释掉(行首没有#
):
Subsystem sftp /usr/lib/openssh/sftp-server
在某些新版本中,可能会使用内部的sftp-server:
Subsystem sftp internal-sftp
一般情况下,无需修改此行。
步骤三:创建专用的SFTP用户(为了安全,强烈推荐)
为了安全起见,最好不要让SFTP用户拥有完整的系统shell访问权限,我们可以创建一个只能用于SFTP、不能SSH登录的用户。
1、创建用户组(可选,便于管理多个SFTP用户):
sudo groupadd sftpusers
2、创建新用户,并指定其主目录和禁止shell登录:
sudo useradd -g sftpusers -d /home/sftpuser -s /sbin/nologin sftpuser
-g sftpusers
将用户添加到sftpusers
组。
-d /home/sftpuser
设置用户的主目录。
-s /sbin/nologin
设置用户的登录shell为/sbin/nologin
,这将阻止其获得SSH shell。
3、设置用户密码:
sudo passwd sftpuser
4、创建并设置主目录权限:
sudo mkdir -p /home/sftpuser sudo chown root:root /home/sftpuser # 将目录的所有者改为root,增强安全 sudo chmod 755 /home/sftpuser # root可读写执行,其他用户只读执行
关键点:为了让ChrootDirectory
(下一步会配置)正常工作,目录的所有者必须是root
,并且其他用户不能有写权限。
5、在用户主目录下创建用户实际可以操作的子目录:
sudo mkdir /home/sftpuser/files sudo chown sftpuser:sftpusers /home/sftpuser/files sudo chmod 755 /home/sftpuser/files
用户sftpuser
只能在files
目录下上传、下载和删除文件。
步骤四:配置Chroot监狱(增强安全性)
“Chroot监狱”能将用户的活动范围限制在其主目录内,使其无法访问服务器上的其他文件系统,这是SFTP配置中非常重要的安全措施。
在/etc/ssh/sshd_config
文件的末尾添加以下配置:
Match Group sftpusers ChrootDirectory /home/%u ForceCommand internal-sftp AllowTcpForwarding no X11Forwarding no
Match Group sftpusers
这个配置块只对属于sftpusers
组的用户生效。
ChrootDirectory /home/%u
将用户限制在其主目录(/home/用户名
)中。%u
是一个变量,代表用户名。
ForceCommand internal-sftp
强制这些用户连接时只能使用SFTP,即使他们尝试启动其他命令也会被拒绝。
AllowTcpForwarding no
和X11Forwarding no
禁用端口转发和X11转发,进一步减少攻击面。
1、检查配置文件语法是否正确:
sudo sshd -t
如果没有输出,说明语法正确。
2、重启SSH服务:
sudo systemctl restart sshd
您可以从任何SFTP客户端进行测试。
使用命令行客户端
sftp sftpuser@你的服务器IP地址
输入密码后,您应该会看到类似sftp>
的提示符,尝试pwd
、ls
等命令,确认您被限制在/home/sftpuser
目录下,并且可以在files
目录中进行操作。
使用图形化客户端(推荐)
FileZilla(跨平台,免费)
WinSCP(Windows)
Cyberduck(macOS)
Transmit(macOS)
在客户端中,选择协议为SFTP,输入服务器IP地址、用户名(sftpuser
)和密码即可连接。
如果您的服务器开启了防火墙(如ufw
或firewalld
),请确保SSH端口(默认为22)是开放的。
对于ufw(Ubuntu)
sudo ufw allow ssh # 或者直接允许22端口 sudo ufw allow 22/tcp
要让服务器“接收SFTP”,您需要:
1、确保SSH服务正常运行。
2、创建专用的SFTP用户,并限制其shell访问。
3、配置SSH(sshd_config
),通过Match
块为SFTP用户启用Chroot监狱,增强安全性。
4、正确设置目录权限,这是Chroot能正常工作的关键。
5、重启SSH服务并测试连接。
按照以上步骤操作,您就可以成功搭建一个安全、可用的SFTP服务器了,如果您在某个步骤遇到问题,可以查看SSH的日志文件(通常是/var/log/auth.log
或/var/log/secure
)来排查错误。
文章摘自:https://idc.huochengrm.cn/fwq/16661.html
评论