FTP存在的不足:
明文传输
- FTP传输的数据(包括用户名、密码和文件内容)都是明文的,这意味着数据可以被网络上的任何人截获并读取。
- 没有内置的加密机制,容易受到中间人攻击。
被动模式下的端口问题
- FTP的被动模式需要开放一系列的高位端口,这些端口可能会被防火墙或NAT设备阻止,导致连接问题。
SFTP协议
SFTP(SSH File Transfer Protocol 或 Secure File Transfer Protocol)是一种通过 SSH(Secure Shell)协议实现的文件传输协议,旨在提供安全的文件传输和管理功能。它结合了 SSH 的安全性和文件传输协议的功能,是 FTP 的安全替代方案。
SFTP 的特点
安全性
- 加密传输:所有传输的数据,包括命令、文件内容和用户名、密码,都经过加密,确保数据在传输过程中不被窃听或篡改。
- 身份验证:使用 SSH 的强大认证机制,包括基于密码和公钥的认证,提供了高安全性的身份验证。
简单的端口配置
- 单一端口:默认使用 SSH 的端口(22),简化了防火墙和路由器的配置,不需要像 FTP 那样复杂的端口管理。
丰富的功能
- 文件管理:支持文件的上传、下载、删除、重命名、目录创建等操作。
- 权限管理:支持文件和目录权限的查看和修改。
- 断点续传:可以在传输中断后继续传输,适合大文件的传输。
启用SFTP服务
安装OpenSSH:RHEL通常默认安装了OpenSSH。如果没有安装,可以使用以下命令安装。
[root@localhost ~]# dnf install -y openssh-server
启动并配置SSH服务:确保SSH服务已启动并在系统启动时自动启动。
[root@localhost ~]# systemctl start sshd
[root@localhost ~]# systemctl enable sshd
创建SFTP用户:创建一个新的用户组和用户,并设置密码。
[root@localhost ~]# groupadd sftpusers
[root@localhost ~]# useradd -m -G sftpusers -s /sbin/nologin sftpuser
[root@localhost ~]# passwd sftpuser
Changing password for user sftpuser.
New password:
BAD PASSWORD: The password fails the dictionary check - it is too simplistic/systematic
Retype new password:
passwd: all authentication tokens updated successfully.
配置SSH以限制SFTP用户:编辑SSH配置文件 /etc/ssh/sshd_config,添加以下内容来限制SFTP用户的活动范围。
[root@localhost ~]# vim /etc/ssh/sshd_config
添加以下内容;
Match Group sftpusers
ChrootDirectory /home/%u
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
保存并关闭文件,然后重启SSH服务:
[root@localhost ~]# systemctl restart sshd
设置目录权限:设置正确的目录权限以确保SFTP用户可以正常使用。
[root@localhost ~]# chown root:root /home/sftpuser
[root@localhost ~]# chmod 755 /home/sftpuser
[root@localhost ~]# mkdir /home/sftpuser/uploads
[root@localhost ~]# chown sftpuser:sftpuser /home/sftpuser/uploads
使用SFTP客户端连接:在客户端,可以使用命令行SFTP工具或图形化SFTP客户端(如FileZilla)进行连接。
连接成功后,可以使用以下常用命令进行文件操作:
ls:列出远程目录内容
cd:切换远程目录
lcd:切换本地目录
get:下载文件
put:上传文件
mkdir:创建远程目录
rmdir:删除远程目录
rm:删除远程文件
exit:退出SFTP会话
基本使用:
从远程服务器下载文件:
get remote_file [local_file]
remote_file:这是必选参数,表示您想要从远程服务器下载的文件路径和文件名。
[local_file]:这是可选参数,表示您希望在本地保存文件的路径和文件名。如果省略此参数,文件将使用远程文件的相同名称下载到当前本地目录。
sftp> get uploads/file.txt
Fetching /uploads/file.txt to file.txt
上传文件到远程服务器:
put local_file [remote_file]
在客户端服务器上创建一个测试文件,通过put上传本地文件到SFTP服务器端;
[root@localhost ~]# touch test_data.csv
sftp> put test_data.csv uploads/
Uploading test_data.csv to /uploads/test_data.csv
test_data.csv 100% 0 0.0KB/s 00:00