ssh远程登录服务
1.ssh简介SSH(Secure Shell,安全的外壳)是一种能够以安全的方式提供远程登录的协议。它是专为远程登录会话(甚至可以用Windows远程登录Linux服务器进行文件互传)和其他网络服务提供安全性的协议,可有效弥补网络中的漏洞,ssh协议属于应用层协议。同时ssh服务也是一种对数据进行加密传输的服务。ssh服务为客户机提供安全的shell环境,用于远程管理。ssh的默认端口号是22号
目录
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)
公钥和私钥是成对生成的,这两个密钥互不相同,两个密钥可以互相加密和解密
不能根据一个密钥而推算出另外一个密钥
公钥对外公开,私钥只有私钥的持有人才知道
私钥应该由密钥的持有人妥善保管
根据实现的功能不同,可以分为数据加密和数字签名
更多推荐
所有评论(0)