配置SSH无登陆验证,在很多场景下是非常方便的,尤其是在管理大型集群服务时,避免了繁琐的密码验证,在安全级别越高的服务器上,通常密码的设置更复杂,配置SSH,不仅可以用密钥保证节点间通信的安全性,同时也降低了频繁输入密码登陆的耗时,大大提高了管理效率。
Master作为客户端,要实现无密码公钥认证,连接到服务器Slave上时,需要在Master上生成一个密钥对,包括一个公钥和一个私钥,而后将公钥复制到所有的Slave上。当Master通过SSH链接到Slave上时,Slave会生成一个随机数并用Master的公钥对随机数进行加密,并发送给Master。Master收到加密数之后再用私钥解密,并将解密数回传给Slave,Slave确认解密数无误之后就允许Master进行连接了。这就是一个公钥认证过程,期间不需要手工输入密码,重要的过程是将Master上产生的公钥复制到Slave上。 原理如下图:
通常情况下,一个集群服务下至少有一个Master和若干个Slave,那么无密码登陆通常指的是由Master到任意一个Slave的无验证的单向登陆,意思就是只能从Master登陆到Slave是不需要密码的,但是如果你想从Slave无验证登陆到Master,或者你想在Slave与Slave之间进行无验证登陆,这些都是不可行的,除非,你进行了密钥对的双向验证,才可以双向登陆。
我们考虑双向登录,下图是Master到Slave机器的单向登陆配置流程,如下:
假如主机名和IP地址的对应关系如下表:
主机名 | IP地址 |
Master | 192.168.1.100 |
Slave | 192.168.1.101 |
使用root用户分别对192.168.1.100和192.168.1.101的主机名分别设置为Master和Slave,如下:
[root@localhost] $ vi /etc/sysconfig/network NETWORKING=yes HOSTNAME=Master
同理,设置Slave主机。
修改host文件,设置ip和主机名称的映射关系。如下:
[root@localhost /]# vi /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 # 下面是我们添加的 192.168.1.100 Master 192.168.1.101 Slave
同理,在另一台机器上面进行设置。
在Master和Slave机器上面创建hadoop用户,密码为hadoop,如下:
[root@Master ~]# adduser hadoop [root@Master ~]# passwd hadoop Changing password for user hadoop. New password: BAD PASSWORD: it is based on a dictionary word BAD PASSWORD: is too simple Retype new password: passwd: all authentication tokens updated successfully.
同理,在Slave上面创建hadoop用户。
注意:下面步骤的操作都是在hadoop用户下面进行,除非需要修改配置文件。
首先,检测当前用户在.ssh目录下面是否存在,如下:
[hadoop@Master ~]$ ll -a .ssh total 20 drwx------. 2 hadoop hadoop 4096 Jul 2 04:53 . drwx------. 5 hadoop hadoop 4096 Jul 2 01:06 ..
从上面可知,当前用户下面的.ssh目录下面不存在id_rsa和id_rsa.pub文件。(注意:如果不存在.ssh文件,则手动创建.ssh文件即可)
其次,使用ssh-keygen生成密钥对文件,如下:
[hadoop@Master ~]$ ssh-keygen -t rsa -P '' Generating public/private rsa key pair. Enter file in which to save the key (/home/hadoop/.ssh/id_rsa): 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: 18:f8:3a:c5:74:2d:90:ba:d6:ea:28:e1:82:f6:d1:7f hadoop@centos201 The key's randomart image is: +--[ RSA 2048]----+ | .. | | ... . | | ..o o . | | .+ + . | | o= S | |. +o. | |o. ooo | |+o .o.. E | |o.oo. .. | +-----------------+
如果在.ssh下面存在id_rsa和id_rsa.pub文件,则直接跳过上面生成密钥对的步骤。
然后,将id_rsa.pub文件拷贝到Slave服务器上面,如下:
[hadoop@Master ~]$ scp ~/.ssh/id_rsa.pub Slave:/home/hadoop/.ssh The authenticity of host 'Slave (192.168.31.101)' can't be established. RSA key fingerprint is 57:b0:d0:bf:17:92:9a:1d:0a:ac:75:55:5e:83:4c:c1. Are you sure you want to continue connecting (yes/no)? yew^Hs^[[3~ Please type 'yes' or 'no': yes Warning: Permanently added 'Slave, 192.168.31.101' (RSA) to the list of known hosts. hadoop@Slave's password: id_rsa.pub 100% 398 0.4KB/s 00:00
第四步、配置服务端(Slave)
首先,查看当前(hadoop)用户下面是否存在.ssh目录,如下:
[hadoop@Slave .ssh]$ ll -a total 16 drwx------. 2 hadoop hadoop 4096 Jul 12 16:32 . drwx------. 5 hadoop hadoop 4096 Jul 12 15:49 .. -rw-r--r--. 1 hadoop hadoop 398 Jul 12 16:31 id_rsa.pub
如果存在,则将id_rsa.pub文件拷贝到authorized_keys中,否则执行第三步,将id_rsa.pub拷贝到当前目录下面,如下:
[hadoop@Slave .ssh]$ cat id_rsa.pub >> authorized_keys [hadoop@Slave .ssh]$ ll -a total 16 drwx------. 2 hadoop hadoop 4096 Jul 12 16:32 . drwx------. 5 hadoop hadoop 4096 Jul 12 15:49 .. -rw-rw-r--. 1 hadoop hadoop 398 Jul 12 16:32 authorized_keys -rw-r--r--. 1 hadoop hadoop 398 Jul 12 16:31 id_rsa.pub
其次,修改/etc/ssh/sshd_config配置文件,启用RSA公钥验证,如下:
[root@Slave /] $ vi /etc/ssh/sshd_config # 将下面三行的注释去掉 RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys
最后,重启SSHD服务,如下:
[root@Slave /] $ service sshd restart Stopping sshd: [ OK ] Starting sshd: [ OK ]
注意:
.ssh 文件的权限为700
authorized_keys 文件的权限为600
客户机执行如下代码:
# -v 调试模式 [hadoop@Master /] $ ssh -v Slave
使用调试模式登录Slave会显示一些详细的登陆日志信息。若登陆失败,或者仍然要输入密码,可以在服务器查看日志文件:/var/log/secure。若登陆成功,则以后就可以直接使用如下命令登录,如下:
[hadoop@Master /] $ ssh Slave
直接登陆了,不用输入密码.
到这里就讲解完了,如有不正确地方,望指正。谢谢支持!!!!