SSH协议:scp复制、sftp文件传输、SSH密钥对认证

本文详细介绍了SSH协议的概念、常用配置文件、命令操作,如MobaXterm和Xshell的连接,SCP与SFTP文件传输,以及SSH密钥对认证的过程,包括ssh-keygen的使用和密钥对的生成、传输与管理。
摘要由CSDN通过智能技术生成

目录

一、SSH介绍

二、SSH相关常用文件

三、SSH常用命令

四、SSH实验 

4.1、远程连接MobaXterm、Xshell

4.2、SCP:文件传输工具

4.3 、SFTP:安全的文件传输协议

4.4、SSH密钥对认证 :ssh-keygen


一、SSH介绍

SSH(Secure Shell)是一种网络协议,用于在两个网络设备之间建立加密的、安全的连接。它被广泛用于远程管理、文件传输、VPN(Virtual Private Network)和数据存储等领域。

SSH协议主要包括两个组件:SSH客户端和SSH服务器。当您使用SSH客户端连接到一个SSH服务器时,客户端和服务器之间会建立一个安全的、加密的连接。这意味着,通过这个连接传输的所有数据都是加密的,包括用户名和密码等敏感信息。

SSH协议也支持公钥认证,这种认证方式比基于密码的认证更加安全。在公钥认证中,需要先在本地计算机上生成一个公钥和私钥,然后将公钥复制到远程服务器上。当尝试通过SSH连接到远程服务器时,服务器会检查提供的公钥是否与其存储在文件中的公钥匹配。如果匹配,则计算机将被允许登录到服务器。

二、SSH相关常用文件

2.1、/etc/ssh/sshd_config:配置SSH服务端,用于设置SSH服务器的各种参数和行为,例如监听的端口、允许登录的用户、认证方式、密码策略等。

2.2、/etc/ssh/ssh_config:配置SSH客户端,用于设置SSH客户端的行为和连接选项,例如默认使用的认证方式、连接超时时间、代理设置等。
 

/etc/ssh/sshd_config常见参数:

Port: 该参数指定SSH服务器监听的端口号。默认情况下,SSH服务器监听22端口,但是可以通过修改Port参数来指定其他端口号。

ListenAddress: 该参数指定SSH服务器监听的网络地址。默认情况下,SSH服务器会在所有网络接口上监听连接请求。但是可以使用ListenAddress参数来指定监听某个特定的网络接口。

2.3、~/.ssh/id_rsa:存放基于 RSA 算法的 SSH 私钥的默认路径,通常情况下,私钥文件应该具有严格的访问权限,只有拥有者可以读取和写入该文件,以保证私钥不被恶意获取。(如果是基于其他算法,例如基于ecdsa算法,那么私钥文件为~/.ssh/id_ecdsa)

2.4、~/.ssh/id_rsa.pub:存放基于 RSA 算法 SSH 公钥的文件路径,公钥文件是可以公开和共享的,可以在需要进行 SSH 公钥认证的场景下提供给其他人或系统管理员。(如果是基于其他算法,例如基于ecdsa算法,那么私钥文件为~/.ssh/id_ecdsa.pub)

三、SSH常用命令

ssh: 这是最基本的SSH命令,用于建立与远程服务器的安全连接。

ssh user@hostname        #user是登录远程服务器的用户名,hostname是远程服务器的主机名或IP地址

ssh-keygen: 用于生成SSH密钥对(公钥和私钥)。

ssh-keygen -t rsa         #将生成一个RSA密钥对

ssh-copy-id: 将本地公钥复制到远程服务器,以实现无密码登录。

ssh-copy-id user@hostname         #这将将本地公钥复制到远程服务器上的用户目录下的~/.ssh/authorized_keys文件中。

scp: 用于在本地计算机和远程服务器之间复制文件。

scp local_file user@hostname:remote_location        #将本地文件复制到远程服务器 

scp user@hostname:remote_file local_location        #将远程服务器上的文件复制到本地计算机

ssh-add: 将私钥添加到ssh-agent,以便在使用SSH时免去输入密码。

ssh-add ~/.ssh/id_rsa         #将id_rsa私钥添加到ssh-agent中

ssh-agent: SSH代理,用于管理和使用SSH私钥。

ssh-keyscan: 用于获取远程服务器的公钥。

ssh-keyscan hostname 

四、SSH实验 

实验环境:虚拟机1(服务端):172.16.80.51

                  虚拟机2(客户端):172.16.80.12

实验前准备:(关闭防火墙,改ssh端口)

两台虚拟机关闭防火墙,降低安全机制

[root@51 ~]# setenforce 0
[root@51 ~]# systemctl stop firewalld

[root@12 ~]# systemctl stop firewalld
[root@12 ~]# setenforce 0

修改虚拟机1的配置文件

#修改虚拟机1的配置文件,即将修改端口号和监听的地址
[root@51 ~]# vim /etc/ssh/sshd_config

 配置文件中17到20行如下

解释:

1、Port 22:这是SSH服务器监听的端口号。默认情况下,SSH服务器使用端口22进行通信。您可以根据需要更改此端口号,以增加安全性或避免冲突。
2、AddressFamily any:此配置指定SSH服务器将接受来自任何地址家族(IPv4或IPv6)的连接请求。
3、ListenAddress 0.0.0.0:此配置指定SSH服务器应该监听的IPv4地址。在这种情况下,服务器将监听所有可用的IPv4地址。
4、ListenAddress :: :此配置指定SSH服务器应该监听的IPv6地址。在这种情况下,服务器将监听所有可用的IPv6地址。

 改成如下所示

为了增强安全性,更改端口号。 

4.1、远程连接MobaXterm、Xshell

MobaXterm和Xshell都是基于SSH协议的远程终端工具,现在虚拟机1的ssh端口号更改,远程登录时需要注意端口号。

MobaXterm的连接:

Xshell的连接:

 主机(H)为本机IP地址

端口号改为ssh配置的端口号

虚拟机2(172.16.80.12) 连接 虚拟机1(172.16.80.51)

[root@12 ~]# ssh -p 10022 root@172.16.80.51
The authenticity of host '[172.16.80.51]:10022 ([172.16.80.51]:10022)' can't be established.
ECDSA key fingerprint is SHA256:nzXoq4mASEAi8y0Gzz5qMg3FZct/JGPcq7WZI6zzmeQ.
ECDSA key fingerprint is MD5:39:16:e6:c5:55:5e:49:aa:df:18:35:93:22:16:a2:0b.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[172.16.80.51]:10022' (ECDSA) to the list of known hosts.
root@172.16.80.51's password:
Last login: Thu Jan 25 01:54:18 2024 from 172.16.80.1
[root@51 ~]# cd /opt
[root@51 opt]# ls
compose_lnmp  containerd  mysql  nginx  php  playbooks  rh  xxtg01
[root@51 opt]# touch test01.txt
[root@51 opt]# ls
compose_lnmp  containerd  mysql  nginx  php  playbooks  rh  test01.txt  xxtg01
[root@51 opt]# exit
logout
Connection to 172.16.80.51 closed.

ssh -p 10022 root@172.16.80.51 命令解析:

1、ssh:表示要使用 SSH 协议进行连接。

2、-p 10022:指定了要连接的远程服务器的端口号为 10022。默认情况下,SSH 默认端口是22。

3、root:是要登录到远程服务器的用户名。

4、172.16.80.51:目标 Linux 服务器的 IP 地址。

5、输入完这个命令回车后,在它所问的‘Are you sure you want to continue connecting (yes/no)?’后面输入 yes,在‘root@172.16.80.51's password:’后面输入 虚拟机1的root用户密码。

6、此时 虚拟机2 可以以root用户的身份操作 虚拟机1 了,用exit命令退出远程连接。

4.2、SCP:文件传输工具

scp用法:

从远程服务器复制文件到本地:scp user@remote_host:/remote/file.txt /local/directory/

从本地复制文件到远程服务器:scp local_file.txt user@remote_host:/remote/directory/

复制文件: 

[root@12 opt]# scp -P10022 root@172.16.80.51:/opt/test01.txt /opt/
root@172.16.80.51's password:
test01.txt                                                                             100%    0     0.0KB/s   00:00
[root@12 opt]# ls
rh  share  test01.txt

scp -P10022 root@172.16.80.51:/opt/test01.txt /opt/ :从远程服务器上用户 root 的主目录下的 /opt/ 目录中的 test01.txt 文件复制到本地计算机的 /opt/ 目录中,并且使用的 SSH 端口号是 10022(如果是22端口可以不用输入-P22)。

 复制目录:

[root@12 opt]# scp -rP 10022 root@172.16.80.51:/opt/123 /opt/

-r:表示递归复制整个目录。

4.3 、SFTP:安全的文件传输协议

SFTP(Secure File Transfer Protocol)是一种安全的文件传输协议,用于在本地计算机和远程服务器之间进行安全的文件传输和管理。SFTP相比于FTP具有更高的安全性,传输速度比普通FTP要慢,语法和FTP一样。

Windows系统中,win键+R键,输入cmd打开命令行界面,输入‘sftp -P 10022 root@172.16.80.51’进行连接。

C:\Users\Administrator>sftp -P 10022 root@172.16.80.51
root@172.16.80.51's password:
Connected to 172.16.80.51.
sftp> cd /opt
sftp> ls
123            compose_lnmp   containerd     mysql          nginx          php            playbooks      rh             
test01.txt     xxtg01
sftp> get test01.txt
Fetching /opt/test01.txt to test01.txt
/opt/test01.txt                                                                       100%    6     2.8KB/s   00:00
sftp> put hello.txt
Uploading hello.txt to /opt/hello.txt
hello.txt                                                                             100%   11     0.0KB/s   00:00

get test01.txt会将远程主机的当前目录下的test01.txt传输到本机的C:\Users\Administrator目录下。

put hello.txt会将hello.txt文件从本机的C:\Users\Administrator目录传输到远程主机的当前目录下。

4.4、SSH密钥对认证 :ssh-keygen

SSH密钥对使用了两个不同的密钥:一个是公钥,另一个是私钥。公钥可以在网络上自由传播,而私钥必须被妥善保管。在 SSH 密钥对认证中,本地计算机和远程主机都有一对密钥。本地计算机会将公钥发送到远程主机。远程主机将公钥添加到其授权密钥文件中,并将其与本地的用户名进行关联。随后,远程主机会向本地计算机发送一个随机的挑战字符串。本地计算机使用私钥对该字符串进行加密,并将加密结果发送回远程主机。如果远程主机能够使用已保存的公钥成功解密加密结果,并且解密结果等于挑战字符串,则身份验证成功。

简单总结:私钥通常存储在用户本地计算机上,并且必须得到妥善保护。公钥可以自由传播,用于将其添加到其他计算机上的授权密钥文件,以实现使用私钥进行身份认证。SSH 密钥对认证,更高的安全性,免去密码输入

ssh-keygen的常见参数:

t指定密钥类型,可选值包括 rsa、dsa、ecdsa 和 ed25519 等
b指定密钥长度,单位为比特。默认值为 2048(RSA 密钥)或 256(ECDSA 和 Ed25519 密钥)
c为生成的密钥添加注释,通常用于标识密钥所属的用户或用途
f指定生成的密钥文件名和路径。

 ssh-keygen常用的非对称加密算法:rsa、dsa、ecdsa。ssh-keygen中的-t参数指定算法。密钥公钥路径在~/.ssh/路径下。私钥文件一般为 ~/.ssh/id_算法缩写 (例如:~/.ssh/id_rsa),公钥文件一般为 ~/.ssh/id_算法缩写.pub (例如:~/.ssh/id_rsa.pub)。

以ECDSA密钥类型举例:

#在虚拟机1(172.16.80.51)中生成 ECDSA 类型的密钥对,输入命令:ssh-keygen -t ecdsa
[root@51 ~]# ssh-keygen -t ecdsa
Generating public/private ecdsa key pair.
Enter file in which to save the key (/root/.ssh/id_ecdsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_ecdsa.
Your public key has been saved in /root/.ssh/id_ecdsa.pub.
The key fingerprint is:
SHA256:rs3LZRr41ykdY5WMaAyo1R1vmBpO8v+kwIDV/7uA28k root@51
The key's randomart image is:
+---[ECDSA 256]---+
|       o ...     |
|      o.o .+     |
|     oo +oo.oo . |
|    .o = ++.. +  |
|    . . S..  .   |
|       = o .+    |
|      . * =+o+   |
|       * Xo*+.   |
|      . OoE.+.   |
+----[SHA256]-----+

# ~/.ssh/ 目录下生成了密钥,公钥:id_ecdsa,私钥:id_ecdsa.pub
[root@51 ~]# ls ~/.ssh/
id_ecdsa  id_ecdsa.pub  id_rsa  id_rsa.pub  known_hosts

#传输公钥,使用 ssh-copy-id 命令
[root@51 ~]# ssh-copy-id -i ~/.ssh/id_ecdsa root@172.16.80.12
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_ecdsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@172.16.80.12'"
and check to make sure that only the key(s) you wanted were added.

#启动新bash子进程,将 SSH 私钥添加到 ssh-agent 代理中
[root@51 ~]# ssh-agent bash
[root@51 ~]# ssh-add
Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)
Identity added: /root/.ssh/id_ecdsa (/root/.ssh/id_ecdsa)

#验证:连接虚拟机2
[root@51 ~]# ssh root@172.16.80.12
Last login: Sun Jan 28 01:31:01 2024 from 172.16.80.1
[root@12 ~]#
#连接成功

  • 18
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值