刘明帅
热爱生活!
刘明帅
SSH免密登录原理及实战
SSH免密登录原理及实战

一、何为SSH

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

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

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

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

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

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

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

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

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

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

二、免密登录的原理

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

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

Created with Raphaël 2.2.0客户端客户端服务器服务器公钥(id_rsa)私钥(id_rsa.pub)发送公钥发送登录请求服务器比对已保存的公钥生成一个随机字符串(Challenge)并用客户端的公钥加密客户端用私钥解密字符串(Challenge)将解密后的字符串(Challenge)发送回服务器如果两次字符串(Challenge)一致成功建立连接公钥(authorized_keys)

三、实战

实验环境:

主机名用户名密码
masterhadoop123456
slave1hadoop123456
slave2hadoop123456

先决条件:

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

操作步骤:

1.生成秘钥

分别在三台主机上输入:

[hadoop@master ~]$ ssh-keygen

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

[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/文件夹内
[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–
  4. authorized_keys文件权限必须为600即rw——-

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

2.追加公钥

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

[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.

3.测试

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

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

ps:关于配置文件 一般来说:配置文件是不需要修改的 如果一定要修改,那就更改以下两条吧

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

最后记得重启服务生效。

参考文献

https://en.wikipedia.org/wiki/Secure_Shell
[1]: The Secure Shell (SSH) Protocol Architecture. RFC 4251. IETF Network Working Group. 2006-01.
[2]:The Secure Shell (SSH) Authentication Protocol. RFC 4252. IETF Network Working Group. 2006-01.

文章链接: https://lmshuai.com/archives/146
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

推荐文章

发表评论

textsms
account_circle
email

刘明帅

SSH免密登录原理及实战
一、何为SSH Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议 它可在不安全的网络中为网络服务提供安全的传输环境[1]。SSH通过在网络中创建安全隧道来实现SSH客户…
扫描二维码继续阅读
2019-05-27