Linux使用SSH免密码登录

现在分布式集群非常的流行, 经常在不同的机器上面切换来回那是家常便饭. 如果每次切换都需要输入用户名与密码, 那就是要崩溃的节奏啊. 好在SSH-KEY给我们提供了便利, 只要在master生成一个PUB_KEY, 然后拷贝到clusters中, 以后便可以直接使用ssh hostname即能快速,方便的切换到需要操作的机器上面.

先说下机器的环境:

2台服务器均为Centos 6.7 x86_64 系统

主节点master, IP地址: 192.168.8.200

从节点cluster01, IP地址: 192.168.8.201

下面首先在主节点上生成一个SSH-KEY, 在终端输入ssh-keygen -t rsa, 这里使用默认的存放的目录, 无密码, 连续按2次回车键即可, 如下图所示:

ssh-login-without-pswd-1

然后将生成的PUB_KEY文件, 使用cat管道命令输出名称为authorized_keys的文件, 再用scp命令拷贝一份到节点服务器上面(此时是要输入密码的), 如下图所示:

ssh-login-without-pswd-2

如无法执行scp命令, 请执行安装命令: yum install -y openssh-clients

登录节点服务器, 在用户根目录下执行下面的命令:

1
2
3
chmod 700 .ssh/

chmod 600 .ssh/authorized_keys

那么到这一步我们便可以实现SSH免密码登录的功能. 回到主节点服务器, 用ssh hostname就可以切换到想到操作的节点机器上面, Good Luck.

注意:

  • authorized_keys 文件一定要在主节点服务器上生成, 不然是无效的, 即拷贝了PUB_KEY文件到节点服务器也仍是需要密码登录.

  • 如果是比较新的sshd, 可以用ssh-copy-id hostname的命令快捷的实现上面的步骤, 不过记得要先安装openssh-clients.

参考:

原理:

为了更好的理解SSH免密码登录原理,我们先来说说SSH的安全验证,SSH采用的是”非对称密钥系统”,即耳熟能详的公钥私钥加密系统,其安全验证又分为两种级别。

  • 基于口令的安全验证

这种方式使用用户名密码进行联机登录,一般情况下我们使用的都是这种方式。整个过程大致如下:» (1)客户端发起连接请求。

(2)远程主机收到用户的登录请求,把自己的公钥发给客户端。

(3)客户端接收远程主机的公钥,然后使用远程主机的公钥加密登录密码,紧接着将加密后的登录密码连同自己的公钥一并发送给远程主机。

(4)远程主机接收客户端的公钥及加密后的登录密码,用自己的私钥解密收到的登录密码,如果密码正确则允许登录,到此为止双方彼此拥有了对方的公钥,开始双向加密解密。

PS:当网络中有另一台冒牌服务器冒充远程主机时,客户端的连接请求被服务器B拦截,服务器B将自己的公钥发送给客户端,客户端就会将密码加密后发送给冒牌服务器,冒牌服务器就可以拿自己的私钥获取到密码,然后为所欲为。因此当第一次链接远程主机时,在上述步骤的第(3)步中,会提示您当前远程主机的”公钥指纹”,以确认远程主机是否是正版的远程主机,如果选择继续后就可以输入密码进行登录了,当远程的主机接受以后,该台服务器的公钥就会保存到 ~/.ssh/known_hosts文件中。

  • 基于密匙的安全验证

这种方式你需要在当前用户家目录下为自己创建一对密匙,并把公匙放在需要登录的服务器上。当你要连接到服务器上时,客户端就会向服务器请求使用密匙进行安全验证。服务器收到请求之后,会在该服务器上你所请求登录的用户的家目录下寻找你的公匙,然后与你发送过来的公匙进行比较。如果两个密匙一致,服务器就用该公匙加密“质询”并把它发送给客户端。客户端收到“质询”之后用自己的私匙解密再把它发送给服务器。与第一种级别相比,第二种级别不需要在网络上传送口令。

PS:简单来说,就是将客户端的公钥放到服务器上,那么客户端就可以免密码登录服务器了,那么客户端的公钥应该放到服务器上哪个地方呢?默认为你要登录的用户的家目录下的 .ssh 目录下的 authorized_keys 文件中(即:~/.ssh/authorized_keys)。