ssh配置无密码验证

来源:互联网 发布:mac 登录界面变成英文 编辑:程序博客网 时间:2024/04/30 13:53

SSH(Secure Shell)在linux中ssh有很多用途。由于它对传输的数据进行加密和压缩,使得其比telnet等更安全。

ssh提供两种安全验证方式:基于口令和基于密钥。

基于口令的方式中,客户端需提供用户名和口令,在频繁使用时,可能感觉不方便,因此可以采用基于密钥的方式。该方式中,一次分发密钥后,验证将由程序自动进行,且安全性比基于口令方式更强。

原理:

ssh双方,通过相应帐号主目录下的.ssh目录中的id_rsa,id_rsa.pub和authorized_keys文件中密钥进行验证(如/root/.ssh/)。

  • id_rsa,自己的rsa私钥;
  • id_rsa_pub,自己的rsa公钥;
  • authorized_keys,存放rsa客户端的公钥。

通信过程:

  1. 客户端向ssh服务器发出连接请求,请求用密匙进行安全验证,该请求包含请求的帐号和自己的公钥。
  2. ssh服务器收到请求后,先在服务器的用户目录下对应帐号目录中寻找你的公用密钥(即/home/$user/.ssh/authorized_keys文件中),如果找到的公钥与客户端发来的公钥一致,则开始进行下一步“质询”。
  3. 服务器用该公钥加密“质询”(challenge)信息,并发送绐客户端。
  4. 客户端收到加密的质询信息后,用自己的密钥对其解密,并将解密后的信息发送回服务器。
  5. 服务器验证客户端返回的质询信息正确后,验证结束,双方开始通信。

配置文法:


假如要使A机ssh到B机时无需口令,只需两步:

  1. 在A机执行ssh-keygen -t rsa生成用于ssh验证的rsa密钥(如果已有,则可不用不用再次生成);
  2. 将生成的id_rsa.pub公钥内容添加到B机对应帐号的.ssh下的authorized_keys文件中(如对于root帐号则为/root/.ssh/authorized_keys)。

ssh-keygen -t rsa 命令执行时输入信息如下:

  1. zhangtao@zhangtao-desktop:~$ ssh-keygen -t rsa
  2. Generating public/private rsa key pair.
  3. Enter file in which to save the key (/home/zhangtao/.ssh/id_rsa): //密钥保存位置,直接回车保持默认;
  4. Created directory '/home/zhangtao/.ssh'.
  5. Enter passphrase (empty for no passphrase): //设置密钥的密码,空密码直接回车即可;
  6. Enter same passphrase again: //确认上一步设置的密码。

密钥生成后会提示保存位置和密钥信息:

  1. Your identification has been saved in /home/zhangtao/.ssh/id_rsa.
  2. Your public key has been saved in /home/zhangtao/.ssh/id_rsa.pub.
  3. The key fingerprint is:
  4. 6b:f5:d4:14:19:74:9e:ef:1c:7f:56:d5:84:74:74:ee zhangtao@zhangtao-desktop
  5. The key's randomart image is:
  6. +--[ RSA 2048]----+
  7. |            +o   |
  8. |            . +. |
  9. |            o = o|
  10. |         o . + B |
  11. |         S * * E |
  12. |       . o B + . |
  13. |          . o . .|
  14. |               . |
  15. |                 |
  16. +-----------------+

之后将生成的id_rsa.pub文件内容附加到B机对应帐号下的authorized_keys文件即可,如:/home/root/.ssh/authorized_keys。

authorized_keys 文件说明:


该文件每一行包含一个ssh客户端的rsa公钥,例如:

  1. ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA0EmxseCe(太长省略了) zhang@node1
  2. ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAmrVo9jp0(太长省略了) root@node2

格式:keyType pubKeys username@hostname.domain

  • keyType 为密钥类型,rsa加密为ssh-rsa,dsa加密则为ssh-dsa;
  • pubKey 则为对应加密方式的公钥;
  • username为对应的用户号名,客户机登录到主机后将具有该用户的权限;
  • hostname.domain则为客户机的计算机名,可以使用通配符*代表所有主机,例如要使所有具有该密钥的主机都能以root用户登录到本机,则可写为 root@* 或 root@*.cluster(允许cluster域中所有主机,需有dns支持);

known_hosts 文件说明:


用于对远程主机进行身份鉴别。

known_hosts顾名思义,已知的主机。该文件存放远程主机的ssh主机公钥(不同于用于登录的密钥),用于对主机进行指纹(fingerprint)验证,确保你要登录到的主机确实是你请求的主机,防止伪造的第三方欺骗。在使用ssh时经常由于此处出错。


格式:hostname,IP keyType pubKey

  • hostname为主机的计算机名,IP为其IP地址,两者均可使用通配符 * 代表所有主机。
  • keyType 为密钥类型,rsa加密为ssh-rsa,dsa加密则为ssh-dsa;
  • pubKey 则为对应加密方式的公钥;
该文件使用方式如下:(A登录到B机)
  1. A机要求B机的主机公钥,B机响应本机的主机公钥;
  2. 如果A机是第一次登录到B机,则由于A机的known_hosts中没有B机的信息,因此会提示本地没有B机信息,并询问用户该信息是否属实,并保存在本地的known_hosts;
  3. 如果本地的known_hosts已有B机的信息,则对比该信息,确认B机的身份。如果对比结果不同,则提示用户B机改变,该B机可能是的,伪造的第三方欺骗。此时ssh将退出,停止登录。
每台主机的主机密钥在ssh安装时自动生成,存放在/etc/ssh目录下,重新安装ssh或系统将导致该密钥改变,进而导致登录该机的客户端出错。

SSH在集群中的配置方法

在集群中,需要各节点间ssh时不用密码,由于集群机器多,这里面有以下几个问题:

  • 要在每台节点上运行ssh-keygen生成密钥,并收集到所有的公钥,生成一个authorized_keys,再分发到所有节点上。
  • 要收集所有节点的主机指纹,生成一个authorized_keys,并放到所有节点,不然在第一次用ssh时会有提示保存主机指纹,对程序调用ssh造成影响。
  • 一旦某台节点重装了,那就得把每个节点的authorized_keys更新一下,而且由于其它节点上的known_hosts中已有该节点的旧主机指纹,会阻止对该节点的ssh。
我的方法是将所有节点的ssh密钥和主机指纹设置成相同的,并在authorized_keys和authorized_keys使用通配符。
具体配置方法
该配置以root帐号,且使用rsa密钥为例。准备以下文件:
  • /etc/ssh/目录下的文件:
    ssh_host_*:这些文件是ssh的主机密钥,即主机指纹。
  • /root/.ssh/目录下的文件:
    id_rsa  id_rsa.pub:root用户的ssh密钥,(如果用root帐号的话)
    authorized_keys:清空该文件内容,并将id_rsa.pub文件内容复制进来,然后修改其中的username@hostname为root@*,以允许具有该密钥的所有主机。
    known_hosts:清空该文件内容,并将ssh_host_rsa_key.pub文件内容复制进来,然后修改其中的hostname,IP为*,*。
然后将修改后的文件放到所有节点的对应目录下,替换掉相应的文件即可。
如果你是通过kickstart安装节点,则可以写到ks文件里,这样节点安装完后ssh就可以用了。
小窍门:准备authorized_keys和known_hosts时可以使用ssh登录自己,这样相应的密钥就自动存放到文件了。
错误处理

现将我在使用SSH中遇到的问题总结如下:

原创粉丝点击