SFTP服务安全加固设置:一步步提升文件传输安全性
为什么你的SFTP需要加固?
很多新手搭建完SFTP就直接用默认配置——端口22、允许密码登录、用户可访问整个文件系统。
这种状态下,服务器极易被暴力破解或权限滥用。SFTP服务安全加固设置就是在现有SSH服务基础上,通过调整配置文件来缩小攻击面,同时保证正常文件传输不受影响。
下面我们按步骤一步步操作。
---
加固前需要准备什么?
- 一台Linux服务器(本文以Ubuntu 20.04为例,CentOS命令类似)
- 已开通SSH的root或sudo用户权限
- 建议先在本地备份
/etc/ssh/sshd_config:sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak - 准备一个用于测试的非root普通用户(例如
sftpuser)
如果你用宝塔面板,部分操作可以在“SSH管理器”或“系统安全”中完成,但手动修改配置文件更可控。
---
核心加固步骤:从端口到权限
1. 修改SSH默认端口(避开扫描器)
编辑 /etc/ssh/sshd_config,找到 #Port 22 改为 Port 2222(或你喜欢的1024-65535之间的端口)。
修改后重启服务:
sudo systemctl restart sshd
注意:修改后别忘了在防火墙放行新端口,否则你会把自己锁在外面。例如 sudo ufw allow 2222/tcp。
2. 禁用密码登录,强制使用密钥
生成密钥对(本地执行):
ssh-keygen -t ed25519 -f ~/.ssh/sftp_key
将公钥上传到服务器:
ssh-copy-id -i ~/.ssh/sftp_key.pub -p 22 sftpuser@你的服务器IP
确认能密钥登录后,在 sshd_config 中修改:
PasswordAuthentication no
PubkeyAuthentication yes
ChallengeResponseAuthentication no
3. 限制SFTP用户只能访问指定目录(Chroot)
这一步防止用户通过SFTP看到其他目录。
创建专用目录并设置权限:
sudo mkdir -p /home/sftpuser/upload
sudo chown root:root /home/sftpuser
sudo chmod 755 /home/sftpuser
sudo chown sftpuser:sftpuser /home/sftpuser/upload
然后在 sshd_config 末尾添加:
Match User sftpuser
ChrootDirectory /home/sftpuser
ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no
重启服务:sudo systemctl restart sshd
4. 禁用SFTP用户的Shell登录
只允许SFTP,不允许SSH终端。
修改 /etc/passwd 中该用户的shell:
sudo usermod -s /usr/sbin/nologin sftpuser
或者使用 -s /bin/false,效果类似。
---
常见问题与避坑指南
问题1:修改端口后无法连接
- 检查防火墙是否放行了新端口
- 查看SSH日志:
sudo journalctl -u sshd -n 20或/var/log/auth.log - 如果用的是云服务器,安全组也要放行对应端口
问题2:Chroot配置后用户无法登录
- 最常见原因:Chroot目录的所有者必须是root,且权限不能为777。
- 检查目录权限:
ls -ld /home/sftpuser应为drwxr-xr-x root root - 用户主目录(即Chroot内部)的上级目录必须归root所有
问题3:用户仍然能通过SSH登录
- 确认
ForceCommand internal-sftp写在了Match User块内,且Match块位于sshd_config末尾。 - 检查
AllowUsers或DenyUsers是否有冲突
避坑提醒:
- 不要直接修改
Subsystem sftp /usr/lib/openssh/sftp-server这一行,否则影响全局。 - 每次修改
sshd_config后先测试:sudo sshd -t,如果无输出说明语法正确。 - 建议保留一个root登录的备用SSH会话,防止配置错误断开连接。
---
验证你的配置是否生效
- 验证端口修改:在本地执行
ssh -p 2222 sftpuser@你的服务器IP,如果不输入密码就登录成功(密钥已配置),说明端口和密钥认证正常。 - 验证禁止密码登录:尝试使用密码连接(可临时删掉密钥或用其他用户),应提示“Permission denied (publickey)”。
- 验证Chroot限制:连接后执行
ls -l /,看到的内容应只包含Chroot目录内的文件(如upload文件夹),无法进入/etc、/var等真实系统目录。 - 验证Shell禁用:通过SSH尝试执行
ls等命令,应该被拒绝并自动断开。
如果你使用的是FileZilla等客户端,连接时注意端口、协议选择SFTP(SSH File Transfer Protocol),并指定密钥文件。
---
完成以上步骤后,你的SFTP服务安全等级已经比默认配置提升了一大截。
后续根据实际业务需求,还可以进一步限制IP来源、配置Fail2Ban等。
如果遇到任何异常,优先回看日志和本笔记的避坑部分。