sftp服务
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方式和PASV方式,中文意思为主动式和被动式。
- 主动模式(Port)
FTP客户端首先和FTP服务器的TCP21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。 PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的TCP 20端口连接至客户端的指定端口发送数据。
PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端在命令链路上用PORT命令告诉服务器:“我打开了XXXX端口,你过来连接我”。于是服务器从20端口向客户端的XXXX端口发送连接请求,建立一条数据链路来传送数据。
- 被动模式(Passive)
在建立控制通道与主动模式相似,但建立连接后是Pasv命令。FTP服务器收到Pasv命令后便随机打开一个高端端口(端口号大于1024)并且通知客户端在这个端口上传送数据的请求,客户端连接FTP服务器此端口,通过三次握手建立通道,然后FTP服务器将通过这个端口进行数据的传送。
PASV(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,服务器在命令链路上用PASV命令告诉客户端:“我打开了XXXX端口,你过来连接我”。于是客户端向服务器的XXXX端口发送连接请求,建立一条数据链路来传送数据。
从上面可以看出,两种方式的命令链路连接方法是一样的,而数据链路的建立方法就完全不同。而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子系统。下面是一些常用的参数及其作用,以控制SFTP子系统的行为和功能。
- -d debug_level:指定调试级别。默认为0,表示禁用调试。
- -f log_facility:指定日志设备类型。默认为AUTH。日志文件路径为“/var/log/auth.log”,所有与SFTP身份验证相关的信息都将被记录在这个文件中。
- -l log_level:指定日志级别。默认为INFO。这将记录所有重要的信息,如启动和停止服务、连接和断开连接等。
- -P sftp_server_path:指定sftp-server可执行文件的路径。默认为/usr/lib/openssh/sftp-server。
- -u umask:指定新文件/目录的默认权限掩码。默认为022。
- -e:禁止使用文件名中的“..”操作符。这可以提高安全性,因为它会防止用户尝试通过使用“..”操作符来访问其他目录。
- -R:启用对SFTP根目录的访问限制,即启用chroot。这是SFTP服务器的默认行为。
- -r:禁用对SFTP根目录的访问限制,即禁用chroot。这意味着用户可以访问系统上的任何目录。
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进行身份验证。
SFTP的使用
SFTP与SSH服务分离
复制和创建相关文件
ssh服务 | 操作 | sftp服务 |
---|---|---|
/usr/lib/systemd/system/sshd.service | 通过修改/usr/lib/systemd/system/sshd.service文件得到 | /etc/systemd/system/sftpd.service |
/etc/pam.d/sshd | 通过复制/etc/pam.d/sshd文件得到 | /etc/pam.d/sftpd |
/etc/ssh/sshd_config | 通过复制/etc/ssh/sshd_config文件得到 | /etc/ssh/sftpd_config |
/usr/sbin/sshd | ln -sf /usr/sbin/sshd /usr/sbin/sftpd | /usr/sbin/sftpd |
/etc/sysconfig/sshd | 通过修改/etc/sysconfig/ssh文件得到 | /etc/sysconfig/sftp |
cp /usr/lib/systemd/system/sshd.service /etc/systemd/system/sftpd.service
cp /etc/pam.d/sshd /etc/pam.d/sftpd
cp /etc/ssh/sshd_config /etc/ssh/sftpd_config
ln -sf /usr/sbin/sshd /usr/sbin/sftpd
cp /etc/sysconfig/sshd /etc/sysconfig/sftpd
修改sftpd.service
[Unit]
Description=sftpd server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service
[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/sftpd
ExecStart=/usr/sbin/sftpd -f /etc/ssh/sftpd_config -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
如果,openssh采用二进制包升级过,比如从OS自带的7.4p1版本升级到8.6p1版本,sftpd.service文件中需要做下面的修改:
[Service]
Type=simple