SSH免密登录原理及实战

0x00:何为SSH

Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议[1]

它可在不安全的网络中为网络服务提供安全的传输环境[2]。SSH通过在网络中创建安全隧道来实现SSH客户端与服务器之间的连接[3]

虽然任何网络服务都可以通过SSH实现安全传输,SSH最常见的用途是远程登录系统,人们通常利用SSH来传输命令行界面和远程执行命令。

SSH协议有两个主要版本,分别是SSH-1和SSH-2。

无论是哪个版本,核实未知密钥来源都是重要的事情,因为SSH只验证提供用户是否拥有与公钥相匹配的私钥,只要接受公钥而且密钥匹配服务器就会授予许可。

这样的话,一旦接受了恶意攻击者的公钥,那么系统也会把攻击者视为合法用户。

在客户端来看,SSH提供两种级别的安全验证。

  • LEVEL 1 Password-based security verification (基于密码的安全验证)
    • 知道帐号和密码,就可以登录到远程主机,并且所有传输的数据都会被加密。但是,可能会有别的服务器在冒充真正的服务器,无法避免被“中间人”攻击。
  • LEVEL 2 Key-based security verification (基于密钥的安全验证)
    • 需要依靠密钥,也就是你必须为自己创建一对密钥,并把公钥放在需要访问的服务器上。客户端软件会向服务器发出请求,请求用你的密钥进行安全验证。服务器收到请求之后,先在你在该服务器的用户根目录下寻找你的公钥,然后把它和你发送过来的公钥进行比较。如果两个密钥一致,服务器就用公钥加密“质询”(challenge)并把它发送给客户端软件。从而避免被“中间人”攻击。

在服务器端,SSH也提供安全验证。

  • 在第一种方案中,主机将自己的公钥分发给相关的客户端,客户端在访问主机时则使用该主机的公钥来加密数据,主机则使用自己的私钥来解密数据,从而实现主机密钥认证,确保数据的保密性。
  • 在第二种方案中,存在一个密钥认证中心,所有提供服务的主机都将自己的公开密钥提交给认证中心,而任何作为客户端的主机则只要保存一份认证中心的公开密钥就可以了。在这种模式下,客户端必须访问认证中心然后才能访问服务器主机。

0x01:免密登录的原理

免密登录是基于非对称加密的公钥-私钥的原理,也就是如上面所述的 LEVEL 2 第二种级别–基于密钥的安全验证:

本地存储客户端的公钥和私钥,服务器只存储客户端的公钥。

sequenceDiagram
    note left of 客户端:公钥(id_rsa)
    note left of 客户端:私钥(id_rsa.pub)
    客户端 ->>+ 服务器:事前发送私钥
    Note over 客户端,服务器:SSH登录开始 
    客户端 ->>+ 服务器:发送登录请求
    note left of 服务器:服务器比对已保存的公钥
    服务器 ->>- 客户端:生成一个随机字符串(Challenge)并用客户端的公钥加密
    note right of 客户端:客户端用私钥解密字符串(Challenge)
    客户端 ->>+ 服务器:私钥解密后发送回服务器
    note left of 服务器:如果两次字符串(Challenge)一致
    服务器 ->>- 客户端:成功建立连接
    note right of 服务器:公钥(authorized_keys)

0x02:实战

0x030:实验环境

主机名 用户名 密码
master hadoop 123456
slave1 hadoop 123456
slave2 hadoop 123456

0x031:先决条件

  • 各个主机可以ping通
  • 主机名设好
  • /etc/hosts内已定义正确的主机名-IP对应关系
  • 普通账号已创建同时设好密码

0x032:实验步骤

Sept1:生成秘钥

分别在三台主机上输入:

1
[hadoop@master ~]$ ssh-keygen

接下来的内容可能如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[hadoop@master ~]$ ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hadoop/.ssh/id_rsa):
Created directory '/home/hadoop/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/hadoop/.ssh/id_rsa.
Your public key has been saved in /home/hadoop/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:PSXm5qw7rGgPTAKxv6M2OID105aZoepT9RuNshVGPfE hadoop@master
The key's randomart image is:
+---[RSA 2048]----+
|. ... |
| o . o. |
|o . o.E |
| o. o o+ o |
|..o..+ BS+= |
|o == B =+.. |
|o oooo = oo |
|o+o..o. +. |
|oooo..o.oo |
+----[SHA256]-----+

如无特殊需求,比如公钥密码、存储位置等。这里可以直接回车下一步

秘钥即成功生成在~/.ssh/文件夹内

1
2
3
4
5
6
7
8
9
10
11
12
13
[hadoop@master ~]$ ls -la  .
total 12
drwx------. 3 hadoop hadoop 74 May 27 23:29 .
drwxr-xr-x. 3 root root 20 May 27 23:26 ..
-rw-r--r--. 1 hadoop hadoop 18 Aug 3 2017 .bash_logout
-rw-r--r--. 1 hadoop hadoop 193 Aug 3 2017 .bash_profile
-rw-r--r--. 1 hadoop hadoop 231 Aug 3 2017 .bashrc
drwx------. 2 hadoop hadoop 38 May 27 23:29 .ssh

[hadoop@master ~]$ ll .ssh/
total 8
-rw-------. 1 hadoop hadoop 1679 May 27 15:40 id_rsa
-rw-r--r--. 1 hadoop hadoop 395 May 27 15:40 id_rsa.pub

这里需要注意的是:

  1. .ssh文件夹权限必须为700即rwx——

  2. id_rsa文件权限必须为600即rw——-

  3. id_rsa.pub文件权限必须为644即rw-r–r–

如果是默认自动生成的,那么权限一般没有问题

Sept2:追加公钥

我个人比较喜欢使用ssh-copy-id这种方式,因为这种方式简单而又可靠

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[hadoop@master ~]$ ssh-copy-id master
Are you sure you want to continue connecting (yes/no)? yes
hadoop@slave1's password:

Number of key(s) added: 1

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

[hadoop@master ~]$ ssh-copy-id slave1
Are you sure you want to continue connecting (yes/no)? yes
hadoop@slave1's password:

Number of key(s) added: 1

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

[hadoop@master ~]$ ssh-copy-id slave2
Are you sure you want to continue connecting (yes/no)? yes
hadoop@slave1's password:

Number of key(s) added: 1

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

0x033:实验验证

此时 输入ssh slave1即可成功免密登录

Session
1
2
3
[hadoop@master ~]$ ssh slave1
Last login: Mon May 27 15:30:42 2019
[hadoop@slave1 ~]$

ps:关于配置文件

一般来说:配置文件是不需要修改的

如果一定要修改,那就更改以下两条吧

1
2
3
[root@master ~]$ vi /etc/ssh/sshd_config
PubkeyAuthentication yes
AuthorizedKeysFile /home/hadoop/.ssh/authorized_keys

最后记得重启服务生效。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!