安全文件传输协议之SFTP的使用

时间:2023-01-06 03:04:06

一、SFTP概述

在前几篇文章,我们讲到了文件传输协议FTP(File Transfer Protocol),那也是使用比较广泛的文件服务器,但是我们需要知道,Linux系统并不自带FTP程序

如果要上传或者下载数据,就需要我们去额外部署FTP程序,而只要是应用程序,那多多少少会占用一些系统资源,基于这个问题,我们可以使用Linux自带的SFTP来进行数据的上传与下载

那什么是SFTP呢?SFTP全称为(Secure File Transfer Protocol)即安全文件传输协议,从前面S这个字母以及单词我们就可以看出来,SFTP可以为用户传输数据时提供一种安全的加密方法

我们需要知道的就是,它不需要额外去部署,同时没有独立的守护进程,默认已经集成于SSH,所以它需要使用sshd的守护进程来完成相应的连接操作与数据上传和下载操作

另一方面就是它与FTP的语法也差不多,所以使用起来非常方便,同时Windows下常见的FTP客户端也都支持SFTP,如果大家对安全方面要求比较高的时候,那么SFTP将会是一个不错的选择

那SFTP与FTP的区别?

节约资源:因为已经集成于SSH,同时也不需要额外部署程序,所以这对系统来说资源占用就比较少
使用方便:没有独立的守护进程,无需额外配置,因为它已经集成于SSH,所以安装了SSH就等同于开启了SFTP
传输效率:因为对数据进行了加密,所以相对来说比较安全,但是这种安全也是以牺牲传输效率为代价的,也就是说SFTP的传输效率要比FTP慢,但差别也不是很大

二、SFTP使用

1)固定IP地址

[root@sftp-server ~]# ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.2.3.11  netmask 255.255.255.0  broadcast 10.2.3.255
        inet6 fe80::20c:29ff:fec1:6505  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:c1:65:05  txqueuelen 1000  (Ethernet)
        RX packets 504  bytes 41228 (40.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 367  bytes 37601 (36.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

2)查看SSH版本

提示:低于4.8p1版本的SSH需要升级

[root@sftp-server ~]# ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017

3)创建SFTP组

提示:创建SFTP组的初衷是,如果后期有多个用户,则使用组比较好控制读写权限

[root@sftp-server ~]# groupadd sftp

3)创建两个SFTP测试用户并设置密码

[root@sftp-server ~]# useradd -g sftp -s /sbin/nologin test1
[root@sftp-server ~]# useradd -g sftp -s /sbin/nologin test2

[root@sftp-server ~]# echo "abc-123" | passwd --stdin test1
更改用户 test1 的密码 。
passwd:所有的身份验证令牌已经成功更新。

[root@sftp-server ~]# echo "abc-123" | passwd --stdin test2
更改用户 test2 的密码 。
passwd:所有的身份验证令牌已经成功更新。

4)创建数据存储目录

提示:这里将sftp组下所有用户的家目录统一指定到数据存储目录,并按用户名进行区分,因为那个用户登录就会直接进入到自己的家目录

[root@sftp-server ~]# mkdir -p /sftp/data
[root@sftp-server ~]# mkdir -p /sftp/data/test1
[root@sftp-server ~]# mkdir -p /sftp/data/test2

[root@sftp-server ~]# usermod -d /sftp/data/test1 test1
[root@sftp-server ~]# usermod -d /sftp/data/test2 test2

5)定义sshd配置文件

提示:修改sshd配置文件的时候,一定要先备份,并且要细心,否则重启ssh服务以后,会造成ssh远程失败,sftp登录成功的现象

[root@sftp-server ~]# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

[root@sftp-server ~]# vim /etc/ssh/sshd_config
#Subsystem      sftp    /usr/libexec/openssh/sftp-server  #注释默认已有的
Subsystem       sftp    internal-sftp
Match Group     sftp
ChrootDirectory /sftp/data/%u
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp

[root@sftp-server ~]# systemctl restart sshd
[root@sftp-server ~]# netstat -anput | grep sshd
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1136/sshd
tcp        0     36 10.2.3.11:22            10.2.3.1:4308           ESTABLISHED 994/sshd: root@pts/

6)定义目录权限

提示:为了便于管理,所以我将各个用户的属组设置为了sftp,因为test1与test2均属于sftp组,如果后期还有用户,直接把它们加进sftp组即可,这样权限控制方便

[root@sftp-server ~]# chown root:sftp /sftp/data/test1
[root@sftp-server ~]# chown root:sftp /sftp/data/test2

[root@sftp-server ~]# ls -lh /sftp/data
总用量 0
drwxr-xr-x 2 root sftp 6 2月  20 21:21 test1
drwxr-xr-x 2 root sftp 6 2月  20 21:21 test2

7)创建上传目录并定义权限

提示:其实到这里用户已经可以正常登录了,但是它们没有办法往根写入数据,所以我们要在它们自己的家目录新建一个目录并定义权限,以供用户上传数据使用,这点其实和FTP一样

结果:各自上传目录的所属主为test1与test2,各自上传目录的所属组为sftp,所属主的权限为可读写,所属组的权限为只读 

[root@sftp-server ~]# mkdir /sftp/data/test1/upload
[root@sftp-server ~]# mkdir /sftp/data/test2/upload

[root@sftp-server ~]# chown test1:sftp /sftp/data/test1/upload
[root@sftp-server ~]# chown test2:sftp /sftp/data/test2/upload

[root@sftp-server ~]# ls -lh /sftp/data/test1
总用量 0
drwxr-xr-x 2 test1 sftp 6 2月  20 21:39 upload

[root@sftp-server ~]# ls -lh /sftp/data/test2
总用量 0
drwxr-xr-x 2 test2 sftp 6 2月  20 21:39 upload

8)在Windows平台验证

(1)test1用户

测试登录

安全文件传输协议之SFTP的使用

测试上传数据

安全文件传输协议之SFTP的使用

确认数据已经上传

安全文件传输协议之SFTP的使用

(2)test2用户

测试登录

安全文件传输协议之SFTP的使用

测试上传数据

安全文件传输协议之SFTP的使用

确认数据已经上传

安全文件传输协议之SFTP的使用

9)在Linux平台验证

(1)test1用户

[root@sftp-server ~]# sftp test1@10.2.3.11
The authenticity of host '10.2.3.11 (10.2.3.11)' can't be established.
ECDSA key fingerprint is SHA256:6k01Y/Yol5AK3CfnByxZNpmHRxqouOQEkKfnxN6a3p4.
ECDSA key fingerprint is MD5:9c:d1:3a:11:31:ae:e9:be:e5:5f:a9:ec:55:e3:b5:ba.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.2.3.11' (ECDSA) to the list of known hosts.
test1@10.2.3.11's password:
Connected to 10.2.3.11.
sftp>
sftp> ls  #查看有那些目录
upload
sftp>
sftp> cd upload  #进入上传数据的目录
sftp>
sftp> ls  #查看刚刚在Windows平台上传的文件
hadoop-3.2.1.tar.gz   nextcloud-17.0.2.zip
sftp>
sftp> put /root/mongodb-linux-x86_64-rhel7-3.6.14.tgz  #上传数据
Uploading /root/mongodb-linux-x86_64-rhel7-3.6.14.tgz to /upload/mongodb-linux-x86_64-rhel7-3.6.14.tgz
/root/mongodb-linux-x86_64-rhel7-3.6.14.tgz                                                                                100%  116MB  99.4MB/s   00:01
sftp>
sftp> put /root/nginx-1.16.1.tar.gz  #上传数据
Uploading /root/nginx-1.16.1.tar.gz to /upload/nginx-1.16.1.tar.gz
/root/nginx-1.16.1.tar.gz                                                                                                  100% 1008KB 102.8MB/s   00:00
sftp>
sftp> ls  #再来查看、可以发现上传成功
hadoop-3.2.1.tar.gz                    mongodb-linux-x86_64-rhel7-3.6.14.tgz  nextcloud-17.0.2.zip                   nginx-1.16.1.tar.gz 

[root@sftp-server ~]# ls -lh /sftp/data/test1/upload
总用量 541M
-rw-r--r-- 1 test1 sftp 343M 2月 20 21:51 hadoop-3.2.1.tar.gz
-rw-r--r-- 1 test1 sftp 117M 2月 20 22:04 mongodb-linux-x86_64-rhel7-3.6.14.tgz
-rw-r--r-- 1 test1 sftp 81M 2月 20 21:51 nextcloud-17.0.2.zip
-rw-r--r-- 1 test1 sftp 1009K 2月 20 22:04 nginx-1.16.1.tar.gz

(2)test2用户

[root@sftp-server ~]# sftp test2@10.2.3.11
test2@10.2.3.11's password:
Connected to 10.2.3.11.
sftp>
sftp> ls
upload
sftp>
sftp> cd  upload
sftp>
sftp> ls
httpd-2.4.41.tar.gz   mysql-5.7.27.tar.gz
sftp>
sftp> put /root/redis-3.2.13.tar.gz
Uploading /root/redis-3.2.13.tar.gz to /upload/redis-3.2.13.tar.gz
/root/redis-3.2.13.tar.gz                                                                                                  100% 1516KB 117.1MB/s   00:00
sftp>
sftp> put /root/zabbix-3.2.11.tar.gz
Uploading /root/zabbix-3.2.11.tar.gz to /upload/zabbix-3.2.11.tar.gz
/root/zabbix-3.2.11.tar.gz
sftp> ls
httpd-2.4.41.tar.gz   mysql-5.7.27.tar.gz   redis-3.2.13.tar.gz   zabbix-3.2.11.tar.gz                                                      

[root@sftp-server ~]# ls -lh /sftp/data/test2/upload
总用量 78M
-rw-r--r-- 1 test2 sftp 8.9M 2月  20 21:57 httpd-2.4.41.tar.gz
-rw-r--r-- 1 test2 sftp  52M 2月  20 21:57 mysql-5.7.27.tar.gz
-rw-r--r-- 1 test2 sftp 1.5M 2月  20 22:08 redis-3.2.13.tar.gz
-rw-r--r-- 1 test2 sftp  16M 2月  20 22:08 zabbix-3.2.11.tar.gz

10)扩展知识-远程复制命令scp

通过scp命令可以利用SSH安全连接与远程主机相互复制数据

使用scp命令时,需要指定:复制源、目标、目标主机地址、登录用户,最后根据提示输入对应的密码即可

实例1:将本机的redis软件包复制到目标主机的/root目录

[root@sftp-server ~]# scp /root/redis-3.2.13.tar.gz root@10.2.3.12:/root/	#复制文件到目标主机
The authenticity of host '10.2.3.12 (10.2.3.12)' can't be established.
ECDSA key fingerprint is SHA256:6k01Y/Yol5AK3CfnByxZNpmHRxqouOQEkKfnxN6a3p4.
ECDSA key fingerprint is MD5:9c:d1:3a:11:31:ae:e9:be:e5:5f:a9:ec:55:e3:b5:ba.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.2.3.12' (ECDSA) to the list of known hosts.
root@10.2.3.12's password:
redis-3.2.13.tar.gz                                                                                                        100% 1516KB  76.4MB/s   00:00    

[root@sftp-server ~]# ssh 10.2.3.12 ls -lh /root/	#查看复制过去的文件
root@10.2.3.12's password:
总用量 1.5M
-rw-r--r-- 1 root root 1.5M 2月  20 22:17 redis-3.2.13.tar.gz

实例2:将目标主机/etc/passwd文件复制到本机的/root目录下

[root@sftp-server ~]# scp root@10.2.3.12:/etc/passwd /root/
root@10.2.3.12's password:
passwd                                                                                                                     100%  915   540.8KB/s   00:00   

[root@sftp-server ~]# ls -lh
总用量 134M
-rw-r--r-- 1 root root  117M 2月  20 22:03 mongodb-linux-x86_64-rhel7-3.6.14.tgz
-rw-r--r-- 1 root root 1009K 2月  20 22:03 nginx-1.16.1.tar.gz
-rw-r--r-- 1 root root   915 2月  20 22:21 passwd
-rw-r--r-- 1 root root  1.5M 2月  20 22:03 redis-3.2.13.tar.gz
-rw-r--r-- 1 root root   16M 2月  20 22:03 zabbix-3.2.11.tar.gz

[root@sftp-server ~]# head -10 passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

实例3:使用非22端口,将本机的/sftp/data/test1/upload目录复制到目标主机的/opt目录

提示:因为是复制目录,所以要使用-r选项来进行复制,然后使用-P选项来指定目标主机的SSH端口

[root@sftp-server ~]# scp -P 3214 -r /sftp/data/test1/upload root@10.2.3.12:/opt
root@10.2.3.12's password:
nextcloud-17.0.2.zip                                                                                                      100%   80MB 119.0MB/s   00:00
hadoop-3.2.1.tar.gz                                                                                                       100%  343MB 125.4MB/s   00:02
mongodb-linux-x86_64-rhel7-3.6.14.tgz                                                                      100%  116MB 133.4MB/s   00:00
nginx-1.16.1.tar.gz                                                                                                        100% 1008KB  93.6MB/s   00:00    

[root@sftp-server ~]# ssh -p 3214 root@10.2.3.12 ls -lh /opt/
root@10.2.3.12's password:
总用量 0
drwxr-xr-x 2 root root 133 2月  20 22:27 upload

[root@sftp-server ~]# ssh -p 3214 root@10.2.3.12 ls -lh /opt/upload
root@10.2.3.12's password:
总用量 541M
-rw-r--r-- 1 root root  343M 2月  20 22:26 hadoop-3.2.1.tar.gz
-rw-r--r-- 1 root root  117M 2月  20 22:27 mongodb-linux-x86_64-rhel7-3.6.14.tgz
-rw-r--r-- 1 root root   81M 2月  20 22:26 nextcloud-17.0.2.zip
-rw-r--r-- 1 root root 1009K 2月  20 22:27 nginx-1.16.1.tar.gz

【只是为了打发时间】