zoukankan      html  css  js  c++  java
  • linux使用:配置SSH免密码登陆

    在应用中我们经常会登陆其他的主机,每次都需要输入用户名和密码。另外在hadoop的使用中也会使用ssh命令去连接其它的主机。我们可以设置SSH免密码登陆来实现其他主机登录该主机是不用输入密码。

    现在我们有两台测试的linux的虚拟机,我们称之为主机1和主机2。ip分别为192.168.1.101和192.168.1.102,我们这次的目的是用主机主机1的grid用户无密码连接主机2的grid用户

    1. 在主机1生成密钥

    先解释一下,三个提示信息

    • Enter file in which to save the key (/home/admin/.ssh/id_rsa)文件保存的位置,默认为当前"用户身份"的主文件夹下的.ssh文件夹下的id_rsa
    • Enter passphrase (empty for no passphrase) 输入连接密码,默认为空
    • Enter same passphrase again 再次输入密码,默认为空

    我们在主机1中创建一个密钥,由于所有设置都是用的默认的,因此直接三个回车

    [grid@tiny01 ~]$ ssh-keygen -t rsa
    
    

    我们可以查看一下当前用户主目录下的.ssh文件夹

    [grid@tiny01 ~]$ cd ~/.ssh
    [grid@tiny01 .ssh]$ pwd
    /home/grid/.ssh
    [grid@tiny01 .ssh]$ ll
    total 12
    -rw-------. 1 grid grid 1675 Jul 22 13:38 id_rsa
    -rw-r--r--. 1 grid grid  393 Jul 22 13:38 id_rsa.pub
    -rw-r--r--. 1 grid grid  402 Jul 22 12:35 known_hosts
    
    

    可以发现下面有两个文件:id_rsaid_rsa.pub其中id_rsa.pub是公钥,id_pub是私钥

    2. 将主机1公钥分发到主机2下

    我们可以直接使用ssh-copy-id 主机名命令将公钥拷贝到对方的主机下,例如:

    [grid@tiny01 ~]$ ssh-copy-id tiny02
    grid@tiny02's password:
    Now try logging into the machine, with "ssh 'tiny02'", and check in:
    
      .ssh/authorized_keys
    
    to make sure we haven't added extra keys that you weren't expecting.
    

    实际上ssh-copy-id 命令就是将当前主机id_rsa.pub中的内容,追加到目标主机上的~/.ssh/authorized_keys文件上,如果该文件不存在,则创建

    3. 登录到主机2
    我们现在就可以登录主机2了

    login as: admin
    admin@192.168.132.115's password:
    Last login: Tue Mar  7 05:10:19 2017 from 192.168.132.59
    [admin@tiny ~]$ ssh 192.168.132.114
    Last login: Tue Mar  7 05:13:28 2017 from 192.168.132.115
    [admin@tiny ~]$
    

    测试成功

    4.关于SSH连接中流程问题(以下内容纯属于一本正经的胡说八道)

    前面说到SSH是将公钥发给别的主机,然后别的主机用公钥加密,然后发送回来的吗?所以不应该是将公钥发送给其他主机上,然后其他主机来连接这台主机吗?为什么在这里变为了讲公钥发送给其他主机,然后去连接其它主机,不应该是被连接吗?其实我也不知道,看了SSH协议交互过程 这篇博客,我做出了一下猜测

    当我们没有设置SSH免密码的时候,我们需要输入密码才能进行远程连接。所以他的连接过程可能是这样子:

    • 客户端向服务器发出了连接请求
    • 服务器向客户端发出了公钥
    • 客户端将用户名、密码、自己的公钥等信息通过服务器提供的公钥加密发送回了服务器
    • 服务器对认证信息进行比对,认证正确后通过认证
    • 服务器向客户端返回认证通过的响应,并且此后由于双方都有对方的公钥因此所有的通讯都进行加密传输。
    • 客户端将要执行的命令加密后传给服务器
    • 服务器解密并应执行命令
    • 服务器将执行的命令的结果返回给客户端

    而免密码登陆的时候连接过程呢?由于此时服务器已经有了客户端的公钥,可能是这样子的

    • 客户端向服务器发出了连接请求
    • 服务器向客户端发出了公钥
    • 客户端将publickey认证所需的信息发送给了服务器
    • 服务器对认证信息进行比对,认证正确后通过认证
    • 服务器向客户端返回认证通过的响应,并且此后由于双方都有对方的公钥因此所有的通讯都进行加密传输。
    • 客户端将要执行的命令加密后传给服务器
    • 服务器解密并应执行命令
    • 服务器将执行的命令的结果返回给客户端

    发现其实二者是一样的只不过就是认证方式不同,一个是password认证,一个是publickey认证,而当服务器将客户端的公钥配到authorized_keys就表示已经同意了对方的免密码连接。需要注意一个问题,password认证所用的密钥和publickey认证所用的密钥是不同的。password认证所用的密钥在/etc/ssh下,而publickey认证所用的密钥在~/.ssh下,因此publickey认证所用的公钥在传输过程中是加密的。

    而我们换一种情况考虑,就是假设是公钥给谁就是允许谁免密码连接的情况,会有以下几个问题:

    1. 如果公钥是谁获得谁就可以免密码连接。那么由于公钥是公开的,因此服务器相当于谁都可以登录的。
    2. 那么我们加一个认证啊,因为password认证不能用,而publickey认证也不能用,因此我们需要创建一个认证方式,例如:我们在客户端请求免密码的时候,设置一个随机的字符串,发送给客户端,然后客户端通过这串字符串当做认证条件呢。恩,可以。如果这样子,我们都不许配置免密码了,直接写一个脚本,把服务器对应用户名和密码放进去就好了,也能实现这个效果。

    其实我们只要区分免密码和SSH加密不同就可以了:

    • SSH加密本质是保持通讯过程的安全,他主要目的在通讯安全上,至于你们通讯过程,例如是否认证,服务器是否允许客户端的访问不是他需要关心的问题。
    • 免密码目的是免除认证,SSH加密只是他防止认证过程中认证信息被监听的一种手段,也不是他的目的。

    因此虽然可能有许多种免密码的方式,但是我们只要找出来一种最为安全、高效的就可以了。没有必要纠结于为什么不怎么怎么做。

    5.参考资料
    SSH协议交互过程


    需要注意的问题:

    1. 关于自己主机登陆自己的主机也需要密码?
    我们可以测试一下这个问题:

    [root@tiny1 ~]# ifconfig
    eth0      Link encap:Ethernet  HWaddr 00:0C:29:49:E9:9D
              inet addr:192.168.132.113  Bcast:192.168.132.255  Mask:255.255.255.0
              inet6 addr: fe80::20c:29ff:fe49:e99d/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:2648 errors:0 dropped:0 overruns:0 frame:0
              TX packets:1725 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:250583 (244.7 KiB)  TX bytes:187492 (183.0 KiB)
              Interrupt:19 Base address:0x2024
    
    lo        Link encap:Local Loopback
              inet addr:127.0.0.1  Mask:255.0.0.0
              inet6 addr: ::1/128 Scope:Host
              UP LOOPBACK RUNNING  MTU:16436  Metric:1
              RX packets:10 errors:0 dropped:0 overruns:0 frame:0
              TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0
              RX bytes:840 (840.0 b)  TX bytes:840 (840.0 b)
    
    [root@tiny1 ~]# ssh 192.168.132.113
    The authenticity of host '192.168.132.113 (192.168.132.113)' can't be established.
    RSA key fingerprint is 67:91:3a:e4:97:af:9d:01:37:5f:4a:ed:14:dc:04:46.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '192.168.132.113' (RSA) to the list of known hosts.
    root@192.168.132.113's password:
    Last login: Tue Mar  7 12:09:45 2017 from 192.168.132.59
    

    所以在我们设置免密码登陆的时候我们也需要对自己的主机进行设置

    2. root用户之间为什么设置却不可以

    root用户默认设置是不可以使用ssh免密码登陆的,但是可以修改相关配置,使其能够使用ssh免密码登陆,但是在此不做介绍

  • 相关阅读:
    Oracle RAC asm常用命令
    Oracle10g RAC关闭及启动步骤
    工具系列 | git checkout 可替换命令 git switch 和 git restore
    工具系列 | 博客签名
    工具系列 | Token认证方式之JWT【转载】
    PHP系列 | ThinkPHP5.1 如何自动加载第三方SDK(非composer包 )
    工具系列 | 虚拟化VMware ESXi 6.7服务器安装配置
    安全系列 | 【阿里云】安全告警处理-进程异常行为-访问恶意下载源
    其他系列 | Github 贡献统计异常的处理
    MySQL系列 | 安装 MySQL 5.7 on Ubuntu 16.04 | 18.04
  • 原文地址:https://www.cnblogs.com/erygreat/p/7222353.html
Copyright © 2011-2022 走看看