原文地址:
配置SSH无登陆验证,在很多场景下是非常方便的,尤其是在管理大型集群服务时,避免了繁琐的密码验证,在安全级别越高的服务器上,通常密码的设置更复杂,配置SSH,不仅可以用密钥保证节点间通信的安全性,同时也降低了频繁输入密码登陆的耗时,大大提高了管理效率。
SSH无密码验证的原理
Master作为客户端,要实现无密码公钥认证,连接到服务器Slave上时,需要在Master上生成一个密钥对,包括一个公钥和一个私钥,而后将公钥复制到所有的Slave上。当Master通过SSH链接到Slave上时,Slave会生成一个随机数并用Master的公钥对随机数进行加密,并发送给Master。Master收到加密数之后再用私钥解密,并将解密数回传给Slave,Slave确认解密数无误之后就允许Master进行连接了。这就是一个公钥认证过程,期间不需要手工输入密码,重要的过程是将Master上产生的公钥复制到Slave上。 原理如下图:
SSH无密码登陆的几种关系
通常情况下,一个集群服务下至少有一个Master和若干个Slave,那么无密码登陆通常指的是由Master到任意一个Slave的无验证的单向登陆,意思就是只能从Master登陆到Slave是不需要密码的,但是如果你想从Slave无验证登陆到Master,或者你想在Slave与Slave之间进行无验证登陆,这些都是不可行的,除非,你进行了密钥对的双向验证,才可以双向登陆。
我们考虑双向登录,下图是Master到Slave机器的单向登陆配置流程,如下:
配置详细流程
第一步、配置Master和Slave主机名和host文件
假如主机名和IP地址的对应关系如下表:
主机名 | IP地址 |
Master | 192.168.1.100 |
Slave | 192.168.1.101 |
使用root用户分别对192.168.1.100和192.168.1.101的主机名分别设置为Master和Slave,如下:
1
2
3
|
[root@localhost] $
vi
/etc/sysconfig/network
NETWORKING=
yes
HOSTNAME=Master
|
同理,设置Slave主机。
修改host文件,设置ip和主机名称的映射关系。如下:
1
2
3
4
5
6
|
[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
|
同理,在另一台机器上面进行设置。
第二步、创建Hadoop用户
在Master和Slave机器上面创建hadoop用户,密码为hadoop,如下:
1
2
3
4
5
6
7
8
|
[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用户下面进行,除非需要修改配置文件。
第三步、配置客户端(Master)
首先,检测当前用户在.ssh目录下面是否存在,如下:
1
2
3
4
|
[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生成密钥对文件,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
[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服务器上面,如下:
1
2
3
4
5
6
7
8
|
[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目录,如下:
1
2
3
4
5
|
[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拷贝到当前目录下面,如下:
1
2
3
4
5
6
7
|
[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公钥验证,如下:
1
2
3
4
5
|
[root@Slave /] $
vi
/etc/ssh/sshd_config
# 将下面三行的注释去掉
RSAAuthentication
yes
PubkeyAuthentication
yes
AuthorizedKeysFile .
ssh
/authorized_keys
|
最后,重启SSHD服务,如下:
1
2
3
|
[root@Slave /] $ service sshd restart
Stopping sshd: [ OK ]
Starting sshd: [ OK ]
|
注意:
.ssh 文件的权限为700
authorized_keys 文件的权限为600
第五步、测试配置
客户机执行如下代码:
1
2
|
# -v 调试模式
[hadoop@Master /] $
ssh
-
v
Slave
|
使用调试模式登录Slave会显示一些详细的登陆日志信息。若登陆失败,或者仍然要输入密码,可以在服务器查看日志文件:/var/log/secure。若登陆成功,则以后就可以直接使用如下命令登录,如下:
1
|
[hadoop@Master /] $
ssh
Slave
|
直接登陆了,不用输入密码.
到这里就讲解完了,如有不正确地方,望指正。谢谢支持!!!!