目录

1.ssh简介  

1.2 sshd配置文件

1.3 scp跟ftp的用法

2.查看ssh服务是否启动成功

3.ssh的安全机制

4.ssh公钥加密的登录方式

4.1实现步骤

4.2 实践演示

4.3 ssh命令解析

5.ssh登陆验证的原理

5.1密码登陆

 5.2公钥认证


1.ssh简介  

SSH(Secure Shell,安全的外壳)是一种能够以安全的方式提供远程登录的协议,可以让远程主机通过网络访问sshd服务,开始一个安全shell,并对其进行操控一起学习linux

SSHD(Secure Shell Daemon)  可以通过网络在主机中开启shell的服务,d是daemon,守护进程,就是后台进程的含义(一直在内存里运行的程序,除非人为的停止),7*24运行

它是专为远程登录会话(甚至可以用Windows远程登录Linux服务器进行文件互传)和其他网络服务提供安全性的协议,可有效弥补网络中的漏洞,ssh协议属于应用层协议。同时ssh服务也是一种对数据进行加密传输的服务。

ssh服务为客户机提供安全的shell环境,用于远程管理。ssh的默认端口号是22号端口

ssh服务主要是在HP_UX,LINUX,AIX,UNIX系统上都有但是Windows上没有

ssh服务是允许用户在远程机器上执行任何命令,然后标准输出在本地(相当于你使用xshell连接你的vmware虚拟机,然后在xshell里面随便输入一条命令,真正执行的还是在vmware里面,但是会将执行结果输出在你的xshell界面内)

早期的明文远程登录协议是:telnet(因为是明文,所以不够安全,逐渐淘汰)

​​​​​​​​​​​​​​ssh_config给客户端传参数,sshd_config给服务端传参数

[root@xieshan ssh]# pwd
/etc/ssh
[root@xieshan ssh]# ls
ssh_config       sshd_config

init 0是关闭机器        init 6是重启机器

openssh 是实现ssh协议的一个工具,有客户端和服务端,用在linux系统中可以直接使用ssh客户端来登录到服务端,用在win系统中也可以直接用ssh客户端来登录到服务端,但是win环境下有图形化的工具来实现,比如x-shell、CRT

ssh登录的方式

1.2 sshd配置文件

PermitRootLogin no        禁止root用户登录,这样黑客不知道你的机器有哪些用户,可以增强安全

        1.然后可以使用其他用户,然后再给登录的那个用户设置sudo授权

        2.也可以使用其他用户登录,然后再su - root,虽然root不能直接登录,但是可以切换到root(su切换的时候,没有经过sshd的验证,直接在bash里面切换)

[sc@xieshan ~]$ pstree -p|egrep bash
           |-login(4105)---bash(4399)
           |-sshd(3814)-+-sshd(7351)---bash(7353)
           |            |-sshd(7412)---bash(7414)---su(8042)---bash(8043)-+-grep(8065)
           |            `-sshd(7966)---bash(7972)

#直接在bash下面su

可以杀掉别人的连接,先通过w查看到别人的端口号以及TTY,然后通过ps aux查看到那个bash对应的pid

[root@xieshan log]# w
 11:35:40 up 14:15,  5 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1                      二10   25:11m  0.03s  0.03s -bash
root     pts/0    192.168.2.147    09:27    2:07m  0.02s  0.02s -bash
root     pts/1    192.168.2.147    11:20   15:37   0.01s  0.01s -bash
root     pts/2    192.168.2.144    09:39    4.00s  0.10s  0.00s w
root     pts/3    192.168.2.118    11:35    3.00s  0.00s  0.00s -bash
[root@xieshan log]# ps aux|grep bash
root       4399  0.0  0.2 115764  2248 tty1     Ss+  7月26   0:00 -bash
root       7353  0.0  0.2 115772  2224 pts/0    Ss+  09:27   0:00 -bash
root       7414  0.0  0.2 115856  2380 pts/2    Ss   09:39   0:00 -bash
root       7972  0.0  0.2 115768  1996 pts/1    Ss+  11:20   0:00 -bash
root       8072  0.0  0.2 115768  2232 pts/3    Ss+  11:35   0:00 -bash
root       8103  0.0  0.0 112824   988 pts/2    R+   11:36   0:00 grep --color=auto bash
[root@xieshan log]# kill -9 8072
[root@xieshan log]# w
 11:39:13 up 14:18,  4 users,  load average: 0.02, 0.02, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1                      二10   25:15m  0.03s  0.03s -bash
root     pts/0    192.168.2.147    09:27    2:11m  0.02s  0.02s -bash
root     pts/1    192.168.2.147    11:20   19:10   0.01s  0.01s -bash
root     pts/2    192.168.2.144    09:39    1.00s  0.12s  0.01s w

ssh日志文件存放的位置:

 /var/log/secure

[root@xieshan log]# cat /var/log/secure
Jul 25 09:29:39 xieshan sshd[27974]: Accepted password for root from 192.168.2.147 port 53639 ssh2
Jul 25 09:29:39 xieshan sshd[27974]: pam_unix(sshd:session): session opened for user root by (uid=0)
Jul 25 09:33:57 xieshan sshd[28010]: Accepted password for root from 192.168.2.103 port 63059 ssh2
Jul 25 09:33:57 xieshan sshd[28010]: pam_unix(sshd:session): session opened for user root by (uid=0)
Jul 25 09:47:34 xieshan sshd[26565]: pam_unix(sshd:session): session closed for user root
Jul 25 10:36:41 xieshan groupadd[28277]: group added to /etc/group: name=nscd, GID=28

查看当前系统中的用户里,哪些登录过,哪些没有登录过

[root@xieshan log]# lastlog
用户名           端口     来自             最后登陆时间
root             pts/3    192.168.2.118    三 7月 27 11:35:37 +0800 2022
bin                                        **从未登录过**
daemon                                     **从未登录过**
adm                                        **从未登录过**
lp                                         **从未登录过**
sync                                       **从未登录过**
shutdown                                   **从未登录过**
halt                                       **从未登录过**
mail                                       **从未登录过**
operator                                   **从未登录过**

1.3 scp跟ftp的用法

scp可以拷贝别人机器上的文件或者文件夹到本地机器上来,也可以将本地机器上的文件拷贝到远程机器上去

[root@xieshan ssh]# scp root@192.168.2.152:/etc/passwd /lianxi/shell-test/ssh.passwd
root@192.168.2.152's password: 
passwd                                        100% 4430   527.0KB/s   00:00    
[root@xieshan ssh]# cd /lianxi/shell-test/
[root@xieshan shell-test]# ls
1            jicheng.py    net.sh              ssh.passwd    test-user.sh
hanshu.sh    lan_down.txt  s1.txt              test-if.sh    up.txt
ip.sh        lan_up.txt    scan_lan.sh         test-name.sh
iptables.sh  name.txt      scwebsite2_ssl.log  test.sh    
[root@xieshan shell-test]# scp -r root@192.168.2.152:/lianxi /lianxi/shell-test/ #将对方机器的/lianxi这个文件夹拷贝到本机上
root@192.168.2.152's password: 

sftp可以用来传输文件,get用来下载文件,put用来上传文件【sftp的功能类似于xshell中自带的ftp文件传输功能】

[root@xieshan shell-test]# sftp root@192.168.2.35
The authenticity of host '192.168.2.35 (192.168.2.35)' can't be established.
ECDSA key fingerprint is SHA256:zkStKO8BEuYXgnWccGwT3NYlp+/gkXjBt6mubVJb0Zk.
ECDSA key fingerprint is MD5:10:a5:fa:8e:36:c6:b4:bc:ac:c9:80:03:79:ae:df:a1.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.2.35' (ECDSA) to the list of known hosts.
root@192.168.2.35's password: 
Connected to 192.168.2.35.
sftp> ls
anaconda-ks.cfg     
sftp> mkdir /lianxi
sftp> cd /lianxi
sftp> ls
sftp> pwd        #远程机器的位置
Remote working directory: /lianxi
sftp> lpwd        #本地机器的位置
Local working directory: /lianxi/shell-test
sftp> !ls        #查看本地机器目录下的文件
1	     jicheng.py    name.txt	scwebsite2_ssl.log  test.sh
hanshu.sh    lan_down.txt  net.sh	ssh.passwd	    test-user.sh
ip.sh	     lan_up.txt    s1.txt	test-if.sh	    up.txt
iptables.sh  lianxi	   scan_lan.sh	test-name.sh
sftp> put ip.sh /lianxi        #把本地的ip.sh上传到远程机器/lianxi
Uploading ip.sh to /lianxi/ip.sh
ip.sh                                         100%  276    56.7KB/s   00:00    
sftp> ls
ip.sh  
sftp> cd /lianxi
sftp> ls
aa     ip.sh  
sftp> get aa .    #下载远程机器的aa到本地来
Fetching /lianxi/aa to ./aa
/lianxi/aa                                    100%    3     2.2KB/s   00:00    
sftp> !ls        #查看本地机器目录下的文件
1	   iptables.sh	 lianxi    scan_lan.sh	       test-name.sh
aa	   jicheng.py	 name.txt  scwebsite2_ssl.log  test.sh
hanshu.sh  lan_down.txt  net.sh    ssh.passwd	       test-user.sh
ip.sh	   lan_up.txt	 s1.txt    test-if.sh	       up.txt
sftp> 

2.查看ssh服务是否启动成功

1.使用ps命令查看进程信息(如果有ssh进程的信息,则表示启动成功)

[root@xieshan ~]# ps -ef|grep ssh
root       6996      1  0 5月30 ?       00:00:00 /usr/sbin/sshd -D
root       9384   6996  0 03:24 ?        00:00:00 sshd: root@pts/1
root      10158   6996  0 06:57 ?        00:00:00 sshd: root@pts/0
root      10257   6996  0 08:54 ?        00:00:00 sshd: root@pts/2
root      10275  10259  0 08:54 pts/2    00:00:00 grep --color=auto ssh
[root@xieshan ~]# ps aux|grep ssh
root       6996  0.0  0.4 112872  4364 ?        Ss   5月30   0:00 /usr/sbin/sshd -D
root       9384  0.0  0.6 161480  6084 ?        Ss   03:24   0:00 sshd: root@pts/1
root      10158  0.0  0.7 162656  7320 ?        Ss   06:57   0:00 sshd: root@pts/0
root      10257  0.2  0.6 161476  6216 ?        Ss   08:54   0:00 sshd: root@pts/2
root      10277  0.0  0.0 112824   988 pts/2    R+   08:55   0:00 grep --color=auto ssh

2.使用pidof  进程名称,查看是否有进程的信息

[root@xieshan ~]# pidof sshd
10257 10158 9384 6996

3.使用netstat 查看端口状态(ssh服务是22号端口)

[root@xieshan ~]# netstat -anplut|grep ssh
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      6996/sshd           
tcp        0      0 192.168.0.43:22         192.168.0.3:49174       ESTABLISHED 10257/sshd: root@pt 
tcp        0      0 192.168.0.43:22         192.168.0.3:52753       ESTABLISHED 10158/sshd: root@pt 
tcp        0      0 192.168.0.43:22         192.168.0.99:62588      ESTABLISHED 9384/sshd: root@pts 
tcp6       0      0 :::22                   :::*                    LISTEN      6996/sshd           
[root@xieshan ~]# netstat -anplut|grep 22
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      6996/sshd           
tcp        0      0 192.168.0.43:22         192.168.0.3:49174       ESTABLISHED 10257/sshd: root@pt 
tcp        0      0 192.168.0.43:22         192.168.0.3:52753       ESTABLISHED 10158/sshd: root@pt 
tcp        0      0 192.168.0.43:22         192.168.0.99:62588      ESTABLISHED 9384/sshd: root@pts 
tcp6       0      0 :::22                   :::*                    LISTEN      6996/sshd           
#0.0.0.0:22表示在本机所有ip上监听22端口
#0.0.0.0:*  表示允许任意ip,任意端口客户端来连接

4.使用lsof命令查看端口状态

[root@xieshan ~]# lsof -i:22
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd     6996 root    3u  IPv4  39093      0t0  TCP *:ssh (LISTEN)
sshd     6996 root    4u  IPv6  39095      0t0  TCP *:ssh (LISTEN)
sshd     9384 root    3u  IPv4  95885      0t0  TCP www.huang.com:ssh->192.168.0.99:62588 (ESTABLISHED)
sshd    10158 root    3u  IPv4 122768      0t0  TCP www.huang.com:ssh->192.168.0.3:52753 (ESTABLISHED)
sshd    10257 root    3u  IPv4 134869      0t0  TCP www.huang.com:ssh->192.168.0.3:49174 (ESTABLISHED)

5.使用ss命令查看端口状态

[root@xieshan ~]# ss -anplut|grep ssh
tcp    LISTEN     0      128       *:22                    *:*                   users:(("sshd",pid=6996,fd=3))
tcp    LISTEN     0      128      :::22                   :::*                   users:(("sshd",pid=6996,fd=4))
[root@xieshan ~]# ss -anplut|grep 22
tcp    LISTEN     0      128       *:22                    *:*                   users:(("sshd",pid=6996,fd=3))
tcp    LISTEN     0      128      :::22                   :::*                   users:(("sshd",pid=6996,fd=4))

6.查看一台机器是否安装了ssh(centos系统默认都安装了openssh)

[root@xieshan multi-user.target.wants]# rpm -qa|egrep openssh
openssh-clients-7.4p1-16.el7.x86_64
openssh-7.4p1-16.el7.x86_64
openssh-server-7.4p1-16.el7.x86_64
openssh-7.4p1-22.el7_9.x86_64

3.ssh的安全机制

SSH是专为远程登录会话和其他网络服务提供的安全性协议,想要使用SSH协议来远程管理Linux系统,则需要配置sshd服务程序。sshd是基于SSH协议开发的一款远程管理服务程序,它能够提供两种安全验证的方法:

基于口令的验证——用账号和密码来验证登录(密码登录)

基于密钥的验证——需要在本地生成秘钥对,然后把秘钥对中的公钥上传至服务器,并与服务器中的公钥进行比较,该方式相比较来说更加安全(免密码登录)

ssh对数据进行加密的方式主要有两种:

  • 对称加密(也称为密钥加密)
    • 加密和解密的钥匙都是同一把,怎么样安全的保存这个密钥,并且让这个密钥在需要加密的机器之前都是共享的?
    • 因此,对称加密并不安全,它很难保证这个密钥不被泄漏
  • 非对称加密(也称为公钥加密)
    • 生成一对公私钥,私钥自己保管,公钥给别人   (哪个为私钥取决于管理者把哪个留给自己,哪个给被人,给自己的就叫私钥,给别人的就叫公钥)
    • 公私钥是成对存在的,一个用于加密,一个用于解密
      • 如果使用公钥进行加密,私钥进行解密,那么一般是用于数据加密
      • 如果使用私钥进行加密,公钥进行解密,那么一般是用于认证               

 非对称加密示意图如下(数据加密过程):

4.ssh公钥加密的登录方式

 ssh的公钥认证,免密码登陆方式,可以是在两台不同的机器上,也可以是在一台机器的不同账户上。

4.1实现步骤

A-->B
1、在A机器上生成公钥对,(如果有公钥对,则不需要重新生成),默认会放在当前用户家目录下的.ssh/文件下,会生成一个id_rsa(私钥),id_rsa.pub(公钥)

 [root@mysql-binary ~]# ssh-keygen  #生成,中间一直敲回车,选择默认

2、在B机器上目标用户的家目录下面~/.ssh/authorized_keys文件里将A机器的公钥复制粘贴过来,没有此文件就创建,并且确保这个文件的权限设为600
3、查看公钥认证是否成功
   在A机器上执行  ssh root@B机器的ip
   不需要输入密码就可以登陆到B机器,则表示免密码登陆成功

########公钥认证排错##############
1、确保公钥正确
2、确保~/.ssh/authorized_keys文件权限为600
3、确保家目录以及.ssh目录权限为755以下权限,即属组和其他人没有7的权限

4.2 实践演示

1.在Linux的A机器中生成一对公私钥,使用ssh-keygen命令

[root@xieshan ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):     #存放公私钥的路径,按照默认的就好
/root/.ssh/id_rsa already exists.
Overwrite (y/n)? y            #我之前生成过,现在覆盖
Enter passphrase (empty for no passphrase):      #是否给公私钥再加上一个密码,我认为没必要,所以没输入密码,直接回车
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:l+fh7mbTjslYck6jpiGBl6mOxavaK+7vYrAZWGO2eC4 root@xieshan
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|                 |
|                 |
|  =  . o   .     |
|.= o. = S o o    |
|= o. o . . + .   |
|.*  + . . . B.   |
|E+.+ . . ..@++.  |
|=*O=o   .oo+Bo.  |
+----[SHA256]-----+
[root@xieshan ~]# 

2.查看A机器产生的公钥(存放在~/.ssh/id_rsa.pub里面)

[root@xieshan ~]# cd .ssh
[root@xieshan .ssh]# ls
authorized_keys  id_rsa  id_rsa.pub  known_hosts
[root@xieshan .ssh]# cat id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8K7izJ0akb3tOOPdT5BRFTBN5xdoREg0cH40OzdNF3a8msQUbaZ6kNo7FbQijfEcDa87gvG+3QU6lPi7ok9xqjINrxg/3XGD4bUV4IXygXb+MoOJy69SjV6fd5FFuZNq5M2NK7OSx64Ut+2jKci689Hh2VQzGQkdOaOF4vOdMgkxDjr7UEWA8bcgiJjlv6XfqLbgHT6iZ2aG5sFWDdnegR8EqI0TjVyFC+9kO67E8qU+SwQCcMJ+srf6MSYWxU4JQkBBrYpMkIRmX80NM2WvSoNI13VHE8wKJeSnrOqpA9GwzxBgr06mhn4zsrpuetvGm63DHfo7Edh4B1Mn5cpKX root@xieshan
[root@xieshan .ssh]# pwd
/root/.ssh

3.在B机器中,将A机器产生的公钥添加到~/.ssh/authorized_keys里面,并且修改权限(.ssh权限位755一下,authorized_keys文件权限为600)

[root@localhost .ssh]# su - sc
上一次登录:二 5月 31 09:57:54 CST 2022从 192.168.0.43pts/1 上
[sc@localhost ~]$ ls -al
总用量 20
drwx------. 3 sc   sc   111 5月  31 16:57 .
drwxr-xr-x. 5 root root  44 5月  31 09:52 ..
-rw-------. 1 sc   sc   139 5月  31 16:57 .bash_history
-rw-r--r--. 1 sc   sc    18 10月 31 2018 .bash_logout
-rw-r--r--. 1 sc   sc   193 10月 31 2018 .bash_profile
-rw-r--r--. 1 sc   sc   231 10月 31 2018 .bashrc
drwxr-xr-x. 2 sc   sc    29 5月  31 09:56 .ssh
-rw-------. 1 sc   sc   672 5月  31 09:56 .viminfo
[sc@localhost ~]$ cd .ssh
[sc@localhost .ssh]$ vim authorized_keys 
[sc@localhost .ssh]$ chmod 600 authorized_keys 
[sc@localhost .ssh]$ 

4.在A机器中使用ssh连接上B机器,并且不需要输入密码(你将A产生的公钥添加到了B机器的哪个账户里,就连接上哪个账户,我是添加到B的sc里面)

[root@xieshan .ssh]# ip a      #查看A机器的IP地址
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:7b:fb:12 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.43/24 brd 192.168.0.255 scope global noprefixroute dynamic ens33
       valid_lft 84856sec preferred_lft 84856sec
    inet 192.168.0.130/24 brd 192.168.0.255 scope global secondary noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::3ecb:fb98:7235:d96d/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:7b:fb:1c brd ff:ff:ff:ff:ff:ff
    inet 192.168.66.254/24 brd 192.168.66.255 scope global noprefixroute ens37
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe7b:fb1c/64 scope link 
       valid_lft forever preferred_lft forever
[root@xieshan .ssh]# ssh sc@192.168.0.11    #免密码登陆到B机器的sc用户上
Last failed login: Wed Jun  1 19:48:38 CST 2022 from 192.168.0.43 on ssh:notty
There were 5 failed login attempts since the last successful login.
Last login: Wed Jun  1 19:45:12 2022
[sc@localhost ~]$ ip a         #查看B机器的IP地址
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:d5:52:4b brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.11/24 brd 192.168.0.255 scope global noprefixroute dynamic ens33
       valid_lft 84959sec preferred_lft 84959sec
    inet 192.168.66.1/24 brd 192.168.66.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::985d:f102:2334:7e09/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[sc@localhost ~]$ exit      #退出登陆
登出
Connection to 192.168.0.11 closed.
[root@xieshan .ssh]# ^C

5.使用ssh -vvv可以查看到登陆的详细信息

登陆时默认会去寻找家目录下的~/.ssh/id_rsa去进行验证,所以尽量不要在生成key的时候将它的默认路径更改,如果改变了,就需要使用ssh命令的-i选项来指定私钥文件路径

[root@mysql-binary .ssh]# ssh -vvv 192.168.0.35 wy #######查看登陆过程详细信息
...
debug1: Trying private key: /home/sanchuang/.ssh/id_rsa
debug3: no such identity: /home/sanchuang/.ssh/id_rsa: No such file or directory
debug1: Trying private key: /home/sanchuang/.ssh/id_dsa
debug3: no such identity: /home/sanchuang/.ssh/id_dsa: No such file or directory
debug1: Trying private key: /home/sanchuang/.ssh/id_ecdsa
debug3: no such identity: /home/sanchuang/.ssh/id_ecdsa: No such file or directory
debug1: Trying private key: /home/sanchuang/.ssh/id_ed25519
debug3: no such identity: /home/sanchuang/.ssh/id_ed25519: No such file or directory
...

###默认会去寻找~/.ssh/id_rsa,然后再找id_dsa等等

4.3 ssh命令解析

ssh  命令登陆
   -l  指定登陆的用户名
   -p  指定server的端口
   -i  指定私钥文件,默认会在~/.ssh/去找私钥
   -o  接特定设置选项

 #无需输入yes,自动保存hostkey
   ssh -o StrictHostKeyChecking=no 192.168.0.132 -p 223

[root@mysql-binary .ssh]# ssh 192.168.0.35 -l wy -p 22  #指定用户,指定端口
Last login: Sat Nov 14 10:01:37 2020 from 192.168.0.132


[sanchuang@mysql-binary ~]$ ssh 192.168.0.35  #不接任何用户名,会默认以当前A机器所在用户登陆B机器同名的用户,不管B机器有没有这个用户
sanchuang@192.168.0.35's password: 


[root@xieshan .ssh]# ls
authorized_keys  id_rsa  id_rsa.pub  known_hosts
[root@xieshan .ssh]# rm -rf known_hosts 
[root@xieshan .ssh]# ssh 192.168.0.11 -l sc 
The authenticity of host '192.168.0.11 (192.168.0.11)' can't be established.
ECDSA key fingerprint is SHA256:5Z0EPSwK2A0knQIfyFdynxekKIG2vttgi5eZeaD1YB0.
ECDSA key fingerprint is MD5:c8:15:ba:62:75:70:eb:54:90:11:91:2e:01:97:84:b8.
Are you sure you want to continue connecting (yes/no)? no   #每次登陆都必须手动输入yes,如果输入no,就会一直登陆不上去,这对于写脚本来管理大量的机器来说不方便
Host key verification failed.
[root@xieshan .ssh]# ssh 192.168.0.11 -l sc
The authenticity of host '192.168.0.11 (192.168.0.11)' can't be established.
ECDSA key fingerprint is SHA256:5Z0EPSwK2A0knQIfyFdynxekKIG2vttgi5eZeaD1YB0.
ECDSA key fingerprint is MD5:c8:15:ba:62:75:70:eb:54:90:11:91:2e:01:97:84:b8.
Are you sure you want to continue connecting (yes/no)? no
Host key verification failed.
[root@xieshan .ssh]# ssh 192.168.0.11 -l sc
The authenticity of host '192.168.0.11 (192.168.0.11)' can't be established.
ECDSA key fingerprint is SHA256:5Z0EPSwK2A0knQIfyFdynxekKIG2vttgi5eZeaD1YB0.
ECDSA key fingerprint is MD5:c8:15:ba:62:75:70:eb:54:90:11:91:2e:01:97:84:b8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.0.11' (ECDSA) to the list of known hosts.
Last login: Wed Jun  1 20:16:32 2022 from 192.168.0.43
[sc@localhost ~]$ exit
登出
Connection to 192.168.0.11 closed.
[root@xieshan .ssh]# 
[root@xieshan .ssh]# ssh -o StrictHostKeyChecking=no 192.168.0.11 -l sc   #-o选项的特别设置,不需要再手动输入yes了,自动保存hostkey
Last login: Wed Jun  1 20:17:42 2022 from 192.168.0.43

5.ssh登陆验证的原理

5.1密码登陆

client向server发送登陆请求,server将自己的公钥发送给client。
client使用这个公钥,将密码进行加密,发送给server
server用私钥解密登陆密码,验证合法性
server返回验证结果给client

###密码登陆的公私钥匙ssh服务自己产生的,存放在/etc/ssh里面,好几对,只是采用了不同的加密方式

[root@xieshan .ssh]# cd /etc/ssh
[root@xieshan ssh]# ls
moduli       ssh_host_ecdsa_key      ssh_host_ed25519_key.pub
ssh_config   ssh_host_ecdsa_key.pub  ssh_host_rsa_key
sshd_config  ssh_host_ed25519_key    ssh_host_rsa_key.pub
[root@xieshan ssh]# ls -al
总用量 616
drwxr-xr-x.  2 root root        225 3月  21 14:52 .
drwxr-xr-x. 88 root root       8192 6月   1 19:57 ..
-rw-r--r--.  1 root root     581843 4月  11 2018 moduli
-rw-r--r--.  1 root root       2276 4月  11 2018 ssh_config
-rw-------.  1 root root       3907 3月  21 14:52 sshd_config
-rw-r-----.  1 root ssh_keys    227 12月 31 15:57 ssh_host_ecdsa_key
-rw-r--r--.  1 root root        162 12月 31 15:57 ssh_host_ecdsa_key.pub
-rw-r-----.  1 root ssh_keys    387 12月 31 15:57 ssh_host_ed25519_key
-rw-r--r--.  1 root root         82 12月 31 15:57 ssh_host_ed25519_key.pub
-rw-r-----.  1 root ssh_keys   1679 12月 31 15:57 ssh_host_rsa_key
-rw-r--r--.  1 root root        382 12月 31 15:57 ssh_host_rsa_key.pub
[root@xieshan ssh]# 

这个流程有一个问题, 怎么保证收到的公钥就是目标server的公钥?(中间人攻击)
如果一个攻击者中途拦截了client的登陆请求,发送自己的公钥给client,client端就会用攻击者的公钥进行数据加密,攻击者接收到信息后,用自己的私钥就可以解密了,这就窃取了client的登陆信息了。

为了解决这个问题,client端第一次登陆的时候,会进行一个登陆公钥确认

sanchuang@mysql-binary .ssh]$ ssh 192.168.0.35
The authenticity of host '192.168.0.35 (192.168.0.35)' can't be established.
ECDSA key fingerprint is SHA256:6V02tsAzBmVJ7yEbppVkISnSEyvf+HFWbzDbIPwmG84.
ECDSA key fingerprint is MD5:6c:bd:a9:37:af:ba:f1:53:dd:c8:d2:d9:16:44:c9:9e.
Are you sure you want to continue connecting (yes/no)?

####确认server服务端的这个host主机摘要,确认成功之后就会将server端的pubkey保存在~/.ssh/known_hosts里面,以后每次连接都会验证这个know_hosts里的key和收到的pubkey是否一致。

###查看公钥指纹ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub

###server主机的pubkey保存在/etc/ssh/目录下,默认使用 ssh_host_ecdsa_key.pub
[root@mysql-rpm ssh]# cd /etc/ssh
[root@mysql-rpm ssh]# ls
moduli      sshd_config         ssh_host_ecdsa_key.pub  ssh_host_ed25519_key.pub  ssh_host_rsa_key.pub
ssh_config  ssh_host_ecdsa_key  ssh_host_ed25519_key    ssh_host_rsa_key

 密码登陆示意图:

 5.2公钥认证

client端生成公钥对,将公钥追加在server端的~/.ssh/authorized_keys
发送登陆请求,server收到请求之后,生成随机字符串发送给client
client用自己的私钥对字符串进行加密,发送给server。
server收到加密字符串之后用公钥解密,比较解密出的字符串和之前生成的字符串事发后一致。
返回结果给client

公钥(Public Key)和私钥(Private Key)
公钥和私钥是成对生成的,这两个密钥互不相同,两个密钥可以互相加密和解密 
不能根据一个密钥而推算出另外一个密钥
公钥对外公开,私钥只有私钥的持有人才知道 
私钥应该由密钥的持有人妥善保管 
根据实现的功能不同,可以分为数据加密和数字签名

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐