sftp
sftp介绍
SFTP(SSH File Transfer Protocol,也称 Secret File Transfer Protocol),是一种基于SSH(安全外壳)的安全的文件传输协议。使用SFTP协议可以在文件传输过程中提供一种安全的加密算法,从而保证数据的安全传输,所以SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低。
SFTP是SSH的一部分,SFTP没有单独的守护进程,它必须使用SSHD守护进程(端口号默认是22)来完成相应的连接操作,sftp服务作为ssh的一个子服务,是通过 /etc/ssh/sshd_config
配置文件中的 Subsystem
实现的,如果没有配置 Subsystem
参数,则系统是不能进行sftp访问的。所以,要分离ssh和sftp服务的话,基本的思路是创建两个sshd进程,分别监听在不同的端口,一个作为ssh服务的deamon,另一个作为sftp服务的deamon。
FTP
FTP是TCP/IP协议组中的协议之一,它工作在 OSI 模型的第七层, TCP 模型的第四层, 即应用层, 使用 TCP 传输而不是 UDP, 客户在和服务器建立连接前要经过一个“三次握手”的过程, 保证客户与服务器之间的连接是可靠的, 而且是面向连接, 为数据传输提供可靠保证。
FTP 是基于(C/S)模型而设计的,由两个部分组成:
- FTP服务器(用来存储文件)
- FTP客户端(用户可以使用FTP客户端通过FTP协议访问位于FTP服务器上的资源)
默认情况下FTP协议使用TCP端口中的20和21这两个端口。21端口用于传输控制信息,而是否使用20作为传输数据的端口与FTP使用的传输模式有关,如果采用被动模式则具体使用哪个端口要服务器端和客户端协商决定。FTP传输模式分为以下两种:
-
主动模式(Port)
【图片】
FTP客户端首先和FTP服务器的TCP21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。 PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的TCP 20端口连接至客户端的指定端口发送数据。 -
被动模式(Passive)
【图片】
在建立控制通道与主动模式相似,但建立连接后是Pasv命令。FTP服务器收到Pasv命令后便随机打开一个高端端口(端口号大于1024)并且通知客户端在这个端口上传送数据的请求,客户端连接FTP服务器此端口,通过三次握手建立通道,然后FTP服务器将通过这个端口进行数据的传送。
注意:很多防火墙在设置的时候都是不允许接受外部发起的连接的,所以许多位于防火墙后或内网的FTP服务器不支持PASV模式,因为客户端无法穿过防火墙打开FTP服务器的高端端口;而许多内网的客户端不能用PORT模式登陆FTP服务器,因为从服务器的TCP 20无法和内部网络的客户端建立一个新的连接,造成无法工作。
FTP与SFTP区别
- 安全通道
FTP 不提供任何安全通道来在主机之间传输文件;
SFTP协议提供了一个安全通道,用于在网络上的主机之间传输文件。
- 使用的协议
FTP使用 TCP/IP协议。
SFTP是SSH协议的一部分,它是一种远程登录信息,安全文件传送协议。
- 链接方式
FTP使用TCP端口中的 20和21这两个端口,其中20用于传输数据,21用于传输控制信息。
SFTP是在客户端和服务器之间通过SSH协议(TCP端口22)建立的安全连接来传输文件。
- 安全性
FTP密码和数据以纯文本格式发送,大多数情况下是不加密的,安全性不高。
SFTP会在发送之前加密数据,二进制的形式传递,是无法 "按原样" 阅读的,安全性较高。
SFTP的安装和配置
安装SFTP需要一个SSH服务器作为前提,SSH服务器一般都已经在Linux系统中安装好,只需要根据自己的需要进行相应的配置。具体步骤如下:
安装OpenSSH服务器:
yum -y install openssh-server
创建SFTP用户组和用户
groupadd sftp
useradd -g sftp -s /sbin/nologin sftpuser
mkdir /home/sftpuser/{.ssh,sftpdir}
touch /home/sftpuser/.ssh/authorized_keys
chmod 600 /home/sftpuser/.ssh/authorized_keys
chown root.root /home/sftpuser && chmod 755 /home/sftpuser
chown sftpuser.sftp -R /home/sftpuser/{.ssh,sftpdir}
这将创建一个名为sftpuser的用户,其家目录为/home/sftpuser
修改OpenSSH配置文件:
cp /etc/ssh/sshd_config{,.bak}
vim /etc/ssh/sshd_config
将以下几项配置修改为如下内容:
#Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp -l INFO -f AUTH
Match group sftpusers # 限制SFTP子系统的使用仅适用于sftp用户组中的用户。
ChrootDirectory %h # 将用户的根目录限制为其家目录。
X11Forwarding no # 禁止X11转发,以提高安全性。
AllowTcpForwarding no # 禁止TCP转发,以提高安全性。
ForceCommand internal-sftp # 强制所有SFTP会话使用内部的SFTP子系统,以避免shell访问。
这个配置中,Subsystem sftp internal-sftp
是指将所有SFTP连接重定向到OpenSSH的内部SFTP子系统。
- “-l INFO” 参数是用来设置日志级别为“INFO”。这将记录所有重要的信息,如启动和停止服务、连接和断开连接等。
- “-f AUTH” 参数是用来指定日志文件的位置。日志文件路径为“/var/log/auth.log”,所有与SFTP身份验证相关的信息都将被记录在这个文件中。
sftp-server
是OpenSSH服务器默认使用的SFTP服务器程序,它运行在独立的进程中,通过SFTP协议提供文件传输服务。它具有很好的兼容性,可以与大多数SFTP客户端一起使用,而且功能比较完整,可以满足大多数用户的需求。但是,由于它运行在独立的进程中,因此需要更多的系统资源,并且可能存在安全漏洞。
internal-sftp
是OpenSSH服务器提供的另一种SFTP服务器实现方式,它是一个内部的SFTP服务器,与OpenSSH服务器在同一进程中运行。它的优点是可以更好地控制对文件系统的访问,而且对系统资源的消耗更少,从而提高了服务器的性能。但是,由于它的实现方式不同于sftp-server,因此可能存在与某些SFTP客户端不兼容的情况。
重新启动SSHD服务
sudo systemctl restart sshd
SFTP验证连接方式
账户密码验证:使用账户ID和密码进行验证,凭据验证过程中是加密的。
passwd sftpuser
# vim /etc/ssh/sshd_config
PasswordAuthentication yes
SSH密钥验证:通过SSH密码进行验证。
访问端生成密钥,将公钥上传至sftp /home/user/.ssh/authorized_keys中,实现免密访问
ssh-keygen -t rsa -b 4096 -C "SFTP key"
sftp服务端配置
# vim /etc/ssh/sshd_config
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
# ChallengeResponseAuthentication yes # 用于启用或禁用基于挑战响应协议的身份验证(多因素身份验证)。例如使用Google Authenticator进行身份验证。