sftp 服务常用配置说明

sftp 是 Secure File Transfer Protocol 的缩写,安全文件传送协议。可以为传输文件提供一种安全的加密方法。SFTP 为 SSH 的一部分,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的 FTP 要低得多,如果您对网络安全性要求更高时,可以使用 SFTP 代替 FTP。默认ssh启用了sftp,只要可登陆系统的用户(/bin/bash)就可登陆,登陆后目录无限制,可任意切换其他目录。为了安全起见,可以配置sshd以限制sftp登录用户的权限。最好将登陆后用户限制在指定目录,无法切换到外部目录

基本配置

ChrootDirectory 配置前提:
ChrootDirectory 设置的目录权限及其所有的上级文件夹权限,属主和属组必须是 root;
ChrootDirectory 设置的目录权限及其所有的上级文件夹权限,只有属主能拥有写权限,权限最大设置只能是 755。

如果权限配置不对,会导致无法登录
如果上级目录无法设置为root权限,可以通过ln链接的方式实现
限制后的用户无法 ssh 登录系统

创建相关用户和组

groupadd sftp
useradd -g sftp -d /data/sftp/sftpuser1 -s /sbin/nologin sftpuser1
echo 123456 | passwd --stdin sftpuser1

chown root:root /data/sftp/sftpuser1
chmod 755 /data/sftp/sftpuser1

# 因为 /data/sftp/sftpuser1 属主和属组都为root,其他用户无写入权限,需要创建sftpuser1可写入的目录
mkdir -p /data/sftp/sftpuser1/upload
chown sftpuser1:sftp /data/sftp/sftpuser/upload
chmod 755 /data/sftp/sftpuser1/upload

修改 sshd_config 配置

/etc/ssh/sshd_config
#Subsystem      sftp    /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp

# 拒绝指定用户登录,不能放在Match user中
DenyUsers user1 user2


maxsessions 10

# 针对用户配置sftp, 多个用户可重复配置以下内容,或者通过针对组配置sftp
Match user sftpuser1,sftpuser2
# 该行强制执行内部 sftp,并忽略任何 ~/.ssh/rc 文件中的命令。
ForceCommand internal-sftp

ChrootDirectory /data/sftp/sftpuser1

# 下面两项是与安全有关
AllowTcpForwarding no
X11Forwarding no

# 针对用户组配置sftp
Match Group sftp,sftp1
ForceCommand internal-sftp

# %h 代表用户 home 目录,%u 代表用户名。
ChrootDirectory /data/sftp/%u

修改配置后,重启 sshd 服务生效
systemctl restart sshd

常见错误

Unable to open .: permission denied

解决方法: 如果启动了 selinux, 关闭 selinux

Couldn’t read packet: Connection reset by peer

问题原因: ChrootDirectory (/data/sftp/sftpuser1) 目录及所有上级目录的用户和组必须为 root,权限最多为 755, 参考说明

remote readdir(“/“): Permission denied

问题原因: sftp 用户对 ChrootDirectory (/data/sftp/sftpuser1) 目录要有读取权限,参考说明

禁用 sftp 功能

修改 sshd 配置文件 /etc/ssh/sshd_config,注释以下内容

/etc/ssh/sshd_config
# Subsystem sftp /usr/libexec/openssh/sftp-server

修改配置文件后重启 sshd 服务

systemctl restart sshd

使用sftp登录时会报错 : Error: Could not connect to server