一、sftp对比vsftpd的异同
ftp和sftp非常相似,都支持批量传输(一次传输多个文件),文件夹/目录导航,文件移动,文件夹/目录创建,文件删除等。但还是存在着差异,下面我们来看看ftp和sftp之间的区别。
1、安全通道ftp不提供任何安全通道来在主机之间传输文件;而sftp协议提供了一个安全通道,用于在网络上的主机之间传输文件。
2、使用的协议ftp使用TCP / IP协议。而,sftp是SSH协议的一部分,它是一种远程登录信息。
3、连接方式ftp使用TCP端口21上的控制连接建立连接。而,sftp是在客户端和服务器之间通过SSH协议(TCP端口22)建立的安全连接来传输文件。
4、安全性ftp密码和数据以纯文本格式发送,大多数情况下是不加密的,安全性不高。而,sftp会在发送之前加密数据,二进制的形式传递,是无法“按原样”阅读的,安全性较高。
二、sftp部署
必要条件:
你的openssh-server版本至少得是4.8p1, 因为配置权限需要版本添加的新配置项ChrootDirectory来完成。
如何查看自己服务器上的ssh版本?大家可以尝试以下命令:
ssh -V
#创建sftp的用户组
groupadd sftp
#用户名sftpuser,创建用户到用户组,并禁止登录
useradd -g sftp -s /bin/false sftpuser -d /data/sftpuser
#为sftpuser设置密码
echo "123456" | passwd --stdin sftpuser
#修改ssh配置
vim /etc/ssh/sshd_config
#注释Subsystem sftp /usr/libexec/openssh/sftp-server(若不注释,可以通过"cd / "看到系统所有文件)
#定义了 OpenSSH 服务器对 sftp(SSH 文件传输协议)的处理方式
Subsystem sftp internal-sftp
#匹配sftp组的用户,如果有多个组,用逗号分隔。也可以使用"Match User mysftp"匹配用户,多个用户之间也是用逗号分隔。
Match Group sftp
#将用户的根目录指定到/data/sftpuser(%u 是一个通配符,表示当前连接用户的用户名。在 ChrootDirectory 指令中使用 %u,可以实现将不同的用户限制在他们各自的家目录下)
ChrootDirectory /data/sftpuser/%U
#指定sftp命令(限制用户只能通过 sftp 上传、下载或管理文件,而不允许他们执行其他任意命令)
ForceCommand internal-sftp
#禁止用户在 SSH 连接中进行 TCP 转发。
AllowTcpForwarding no
#是否允许用户可以使用端口转发。
X11Forwarding no
#修改用户的根目录,让它属于root
chown -R root:sftp /data/sftpuser
chmod -R 755 /data/sftpuser
#创建sftpuser用户可写入的目录,并授权
#由于sshd_config配置中指定了根目录,根目录无法写入,因此要创建一个用于上传文件的目录。
#目录所有者为sftpuser,有写入权限;所有组为sftp,无写入权限。
mkdir /data/sftpuser/sftpdata
chown -R sftpuser:sftp /data/sftpuser/sftpdata
chmod -R 755 /data/sftpuser/sftpdata
#重启sshd服务
systemctl restart sshd
连接:
sftp sftpuser@192.168.1.10
#备注:
如果要将某个用户访问的根目录指定到某个固定的目录下的访问用户名下,并且看不到别人的目录则
例如:user1要访问的目录为/data/sftpuser/user1、user2要访问的目录为/data/sftpuser/user2
ChrootDirectory /data/sftpuser/%U
如果要将某个用户的家目录指定指定为根目录
ChrootDirectory %h
踩坑:
常见问题:
如果你链接服务器的时候出现下面的提示:
Write fAIled: Broken pipe
Couldn't read packet: Connection reset by peer
这个问题的原因是ChrootDirectory的权限问题,你设定的目录必须是root用户所有,否则就会出现问题。所以请确保sftp用户根目录的所有人是root, 权限是 750 或者 755。
三、如果需要sftp的端口和sshd的端口不同
cp -rp /etc/ssh/sshd_config /etc/ssh/sftp_config
修改配置文件时sshd_config不动,修改/etc/ssh/sftp_config
vim /etc/ssh/sftp_config
Port 2222
Subsystem sftp internal-sftp
Match Group sftp
ChrootDirectory %h
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
#软连接sshd的启动方式
ln -s /usr/sbin/sshd /usr/sbin/sftpd
#启动
/usr/sbin/sftpd -f /etc/ssh/sftp_config
#停止
kill -9 `ps aux | grep /usr/sbin/sftpd | grep -v 'grep' | awk '{print $2}'`