2、SSH无密码验证配置

  Hadoop运行过程中需要管理远端Hadoop守护进程,在Hadoop启动以后,NameNode是通过SSH(Secure Shell)来启动和停止各个DataNode上的各种守护进程的。这就必须在节点之间执行指令的时候是不需要输入密码的形式,故我们需要配置SSH运用无密码公钥认证的形式,这样NameNode使用SSH无密码登录并启动DataName进程,同样原理,DataNode上也能使用SSH无密码登录到NameNode。

" 公私钥"认证方式简单的解释:首先在客户端上创建一对公私钥(公钥文件:~/.ssh/id_rsa.pub;私钥文件:~/.ssh/id_rsa)。然后把公钥放到服务器上(~/.ssh/authorized_keys), 自己保留好私钥.在使用ssh登录时,ssh程序会发送私钥去和服务器上的公钥做匹配.如果匹配成功就可以登录了。

2.1 安装和启动SSH协议

  在"Hadoop集群(第1期)"安装CentOS6.0时,我们选择了一些基本安装包,所以我们需要两个服务:ssh和rsync已经安装了。可以通过下面命令查看结果显示如下:

 

rpm –qa | grep openssh

rpm –qa | grep rsync

 


ssh无密码验证登陆配置_无密码登录

 

  假设没有安装ssh和rsync,可以通过下面命令进行安装。

 

yum install ssh 安装SSH协议

yum install rsync (rsync是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件)

service sshd restart 启动服务

 

  确保所有的服务器都安装,上面命令执行完毕,各台机器之间可以通过密码验证相互登。

无密码登录分为两种:

1.单点对多点——只有master能够无密码登陆所有slave机器

2.多点对多点——集群中的所有机器都能够相互进行ssh免密码登陆

集群ssh无密码(单点对多点)

在用户Storm下进行密码访问,则需要依次输入如下命令:

ssh-keygen    -t rsa   -P

ssh-copy-id   storm@node1

ssh-copy-id   storm@node2

ssh-copy-id   storm@node3


      ssh-keygen命令式生成、管理和转换认证密钥的命令,主要包括RSA和DSA两种密钥。密钥类型可以用-t选项指定。

如果没有指定则默认生成用于SSH-2的RSA密钥。

    指定使用DSA密钥的命令如下:

    ssh-keygen -t dsa

    由于要进行无密码访问,所有,全部交互选项都直接按回车键,采用默认值。然后就会生成一对密钥,存放在用户目录的“~/.ssh”文件夹里面。

    然后,使用“ssh-copy-id  用户名@主机名”命令进行传输密钥好到目标节点,需要输入一次目标节点的密码。

    下次再等了,就可以进行无密码访问了。

     利用ssh-copy-id能将id_rsa.pub复制到 目标机器:~/.ssh/authorized_keys 且自动累加

集群ssh无密码(多点对多点)

       简单的实现方案是,在master机器上生成公钥和私钥,然后将生成的公钥和私钥都拷贝到其他机器上。这样每台机器上就都有了一对匹配的密钥对,并且每台机器上的证书中的公钥都能和其他机器上的私钥匹配。


ssh-keygen    -t rsa   -P

scp   ~/.ssh/id_rsa.pub    storm@node1:~/.ssh/

scp   ~/.ssh/id_rsa  storm@node1:~/.ssh/


~/.ssh/id_rsa.pub    storm@node2:~/.ssh/

scp   ~/.ssh/id_rsa  storm@node2:~/.ssh/



~/.ssh/id_rsa.pub    storm@node3:~/.ssh/

scp   ~/.ssh/id_rsa  storm@node3:~/.ssh/


公钥追加的方式多对多:

生成密钥对然后将自己的公钥发送给集群中的其他机器,

然后将公钥追加到authorized_keys中

ssh-keygen    -t rsa   -P

scp   ~/.ssh/id_rsa.pub    storm@node:~/.ssh/                  发送给其他机器

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys               将公钥添加到authorized_keys(每台机器都要执行)

这里最好使用shell脚本,循环执行。

2.2 配置Master无密码登录所有Salve

  1)SSH无密码原理

  Master(NameNode | JobTracker)作为客户端,要实现无密码公钥认证,连接到服务器Salve(DataNode | Tasktracker)上时,需要在Master上生成一个密钥对,包括一个公钥和一个私钥,而后将公钥复制到所有的Slave上。当Master通过SSH连接Salve时,Salve就会生成一个随机数并用Master的公钥对随机数进行加密,并发送给Master。Master收到加密数之后再用私钥解密,并将解密数回传给Slave,Slave确认解密数无误之后就允许Master进行连接了。这就是一个公钥认证过程,其间不需要用户手工输入密码。重要过程是将客户端Master复制到Slave上。

  2)Master机器上生成密码对

   在Master节点上执行以下命令:

 

ssh-keygen –t rsa –P ''

 

无密码密钥对,询问其保存路径时直接回车采用默认路径。生成的密钥对:id_rsa和id_rsa.pub,默认存储在"/home/hadoop/.ssh"目录下。

 


ssh无密码验证登陆配置_无密码登录_02

 

  查看"/home/hadoop/"下是否有".ssh"文件夹,且".ssh"文件下是否有两个刚生产的无密码密钥对。

 


ssh无密码验证登陆配置_密码_03

 

  接着在Master节点上做如下配置,把id_rsa.pub追加到授权的key里面去。

 

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

 


ssh无密码验证登陆配置_密码_04

 

authorized_keys"权限(权限的设置非常重要,因为不安全的设置安全设置,会让你不能使用RSA功能),另一件事儿是用root用户设置"/etc/ssh/sshd_config"的内容。使其无密码登录有效。

authorized_keys"

    

chmod 600 ~/.ssh/authorized_keys

 


ssh无密码验证登陆配置_Hadoop_05

   

备注:如果不进行设置,在验证时,扔提示你输入密码,在这里花费了将近半天时间来查找原因。在网上查到了几篇不错的文章,把作为"Hadoop集群_第5期副刊_JDK和SSH无密码配置"来帮助额外学习之用。

 

2)设置SSH配置

root用户登录服务器修改SSH配置文件"/etc/ssh/sshd_config"的下列内容。

 


ssh无密码验证登陆配置_ssh_06

 

RSAAuthentication yes # 启用 RSA 认证

PubkeyAuthentication yes # 启用公钥私钥配对认证方式

AuthorizedKeysFile .ssh/authorized_keys # 公钥文件路径(和上面生成的文件同)

 

重启SSH服务,才能使刚才设置有效。

 

service sshd restart

    

  退出root登录,使用hadoop普通用户验证是否成功。

 

ssh localhost

 


ssh无密码验证登陆配置_Hadoop_07

   

公钥复制所有的Slave机器上。使用下面的命令格式进行复制公钥:

 

scp ~/.ssh/id_rsa.pub 远程用户名@远程服务器IP:~/

 

  例如:

 

scp ~/.ssh/id_rsa.pub hadoop@192.168.1.3:~/

 

复制文件"id_rsa.pub"到服务器IP为"192.168.1.3"的用户为"hadoop"的"/home/hadoop/"下面。

 

  下面就针对IP为"192.168.1.3"的Slave1.Hadoop的节点进行配置。

  1)把Master.Hadoop上的公钥复制到Slave1.Hadoop上

 

 


ssh无密码验证登陆配置_无密码登录_08

 

  从上图中我们得知,已经把文件"id_rsa.pub"传过去了,因为并没有建立起无密码连接,所以在连接时,仍然要提示输入输入Slave1.Hadoop服务器用户hadoop的密码。为了确保确实已经把文件传过去了,用SecureCRT登录Slave1.Hadoop:192.168.1.3服务器,查看"/home/hadoop/"下是否存在这个文件。

 


ssh无密码验证登陆配置_密码_09

 

  从上面得知我们已经成功把公钥复制过去了。

  2)在"/home/hadoop/"下创建".ssh"文件夹

并不是必须的,如果在Slave1.Hadoop的"/home/hadoop"已经存在就不需要创建了,因为我们之前并没有对Slave机器做过无密码登录配置,所以该文件是不存在的。用下面命令进行创建。(备注:用hadoop登录系统,如果不涉及系统文件修改,一般情况下都是用我们之前建立的普通用户hadoop进行执行命令。)

 

mkdir ~/.ssh

 

.ssh"的用户权限,把他的权限修改为"700",用下面命令执行:

 

chmod 700 ~/.ssh

 

  备注:如果不进行,即使你按照前面的操作设置了"authorized_keys"权限,并配置了"/etc/ssh/sshd_config",还重启了sshd服务,在Master能用"ssh localhost"进行无密码登录,但是对Slave1.Hadoop进行登录仍然需要输入密码,就是因为".ssh"文件夹的权限设置不对。这个文件夹".ssh"在配置SSH无密码登录时系统自动生成时,权限自动为"700",如果是自己手动创建,它的组权限和其他权限都有,这样就会导致RSA无密码远程登录失败。

 


ssh无密码验证登陆配置_Hadoop_10


ssh无密码验证登陆配置_密码_11

 

  对比上面两张图,发现文件夹".ssh"权限已经变了。

authorized_keys"

追加到Slave1.Hadoop的授权文件"authorized_keys"中去。使用下面命令进行追加并修改"authorized_keys"文件权限:

 

cat ~/id_rsa.pub >> ~/.ssh/authorized_keys

chmod 600 ~/.ssh/authorized_keys

 


ssh无密码验证登陆配置_ssh_12

  4)用root用户修改"/etc/ssh/sshd_config"

  具体步骤参考前面Master.Hadoop的"设置SSH配置",具体分为两步:第1是修改配置文件;第2是重启SSH服务。

  5)用Master.Hadoop使用SSH无密码登录Slave1.Hadoop

  当前面的步骤设置完毕,就可以使用下面命令格式进行SSH无密码登录了。

 

ssh 远程服务器IP

 


ssh无密码验证登陆配置_无密码登录_13

 

@"后面的机器名变了,由"Master"变为了"Slave1",这就说明我们已经成功实现了SSH无密码登录了。

  最后记得把"/home/hadoop/"目录下的"id_rsa.pub"文件删除掉。

 

rm –r ~/id_rsa.pub

 


ssh无密码验证登陆配置_无密码登录_14

 

Master.Hadoop"到"Slave1.Hadoop"SSH无密码登录,下面就是重复上面的步骤把剩余的两台(Slave2.Hadoop和Slave3.Hadoop)Slave服务器进行配置。这样,我们就完成了"配置Master无密码登录所有的Slave服务器"。

 

2.3 配置所有Slave无密码登录Master

追加到Master的".ssh"文件夹下的"authorized_keys"中,记得是追加(>>)。

巩固一下前面所学知识,剩余的"Slave2.Hadoop"和"Slave3.Hadoop"就按照这个示例进行就可以了。

  首先创建"Slave1.Hadoop"自己的公钥和私钥,并把自己的公钥追加到"authorized_keys"文件中。用到的命令如下:

 

ssh-keygen –t rsa –P ''

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

 


ssh无密码验证登陆配置_Hadoop_15

 

scp"复制"Slave1.Hadoop"的公钥"id_rsa.pub"到"Master.Hadoop"的"/home/hadoop/"目录下,并追加到"Master.Hadoop"的"authorized_keys"中。

  1)在"Slave1.Hadoop"服务器的操作

  用到的命令如下:

 

scp ~/.ssh/id_rsa.pub     hadoop@192.168.1.2:~/

 


ssh无密码验证登陆配置_ssh_16

  

  2)在"Master.Hadoop"服务器的操作

  用到的命令如下:

 

cat ~/id_rsa.pub >> ~/.ssh/authorized_keys

 


ssh无密码验证登陆配置_hadoop_17

 

  然后删除掉刚才复制过来的"id_rsa.pub"文件。

 


ssh无密码验证登陆配置_Hadoop_18

    

  最后是测试从"Slave1.Hadoop"到"Master.Hadoop"无密码登录。

 


ssh无密码验证登陆配置_ssh_19

 

  从上面结果中可以看到已经成功实现了,再试下从"Master.Hadoop"到"Slave1.Hadoop"无密码登录。

 


ssh无密码验证登陆配置_密码_20

 

  至此"Master.Hadoop"与"Slave1.Hadoop"之间可以互相无密码登录了,剩下的就是按照上面的步骤把剩余的"Slave2.Hadoop"和"Slave3.Hadoop"与"Master.Hadoop"之间建立起无密码登录。这样,Master能无密码验证登录每个Slave,每个Slave也能无密码验证登录到Master。