首页 > 程序开发 > 综合编程 > 安全编程 > 正文
ssh免密码登录的最佳实践(Ubuntu 16.4 + CentOs 6 中验证通过)
2016-08-18 09:42:25       个评论      
收藏    我要投稿

背景介绍

在进行Hadoop分布式的配置时,需要设置ssh免密码登录,网上有很多资料(度娘一搜一大堆),基本流程的介绍都是如下:

ssh-keygen 生成密钥对将 本机的 ~/.ssh/id_rsa.pub 文件通过scp拷贝到目标机,然后重定向追加(>>)到其 ~/.ssh/authorized_keys 中; 通过 ssh 连接即可(初次连接时需要输入 yes将目标机的fingerprint 加入 known_hosts) 类似方法操作需要连接的所有其他机器

虽然方式是对的,但如果按照这种做法,在需要配置的机器比较多时,工作量比较大(尤其是第4步),而且容易出错。

最佳实践

通过调查和总结,整理出批量设置多台机器ssh免密码登录的最佳实践方式。通过该方式,只需几乎纯自动化的脚本操作,即可短时间内配置好任意多台机器,大大节约时间和减少出现问题的可能性。而且掌握了相关的方法和原理后,可以非常方便的进行集群中的各种批量配置。


步骤如下

先在一台机器上(如准备用于 hadoop 的 master上),以root账号编辑一个包含需要配置的所有机器的 IP/机器名/别名的 对应文本(如 hadoop-hosts.txt ),其格式遵循 /etc/hosts 的语法:

IP地址1   主机名    [别名1    [别名2]]

典型示例为:

  192.168.100.4    master     hadoop-1
  192.168.100.5    slave01    hadoop-2
  192.168.100.6    slave02    hadoop-3

采用这种语法,一方面是为了各个节点上的hadoop程序能够通过主机名互相访问(master, slavexx), 一方面又方便脚本的自动化处理(hadoop-xx), 如果需要布置的机器比较多,则序号位数可以增加,但保证连续即可。

注意:此时不直接编辑 /etc/hosts , 是为了方便后期脚本自动化处理


2.通过 shell 脚本中的 for 语法,将 hadoop-hosts.txt 的信息配置到集群中的所有主机上,保证各主机之间能通过主机名/别名的方式访问。依次执行以下几个命令即可。

  #将映射列表加入本机的 hosts 中,这样本机即可通过别名访问其他主机(为第二步的for做准备),这一步非常简单,不再详解
  cat hadoop-hosts.txt >> /etc/hosts

  #将 hadoop-hosts.txt 中的映射列表加入集群中的其他所有主机,使得所有主机之间都可通过别名/机器名访问 -- 这步比较复杂,后面详细解释
  for I in `seq 2 3`; do cat hadoop-hosts.txt | ssh root@hadoop-$I "cat >> /etc/hosts" ; done

要理解第二步的工作,需要了解以下背景知识:

shell 中的for语法(详情可通过 man sh 后搜索 “for command” 获得), 可以通过范围变量(此处为 I, 范围为 2~3,在实际环境配置中,结束值3可根据集群的大小自行进行设置) 重复执行指定的命令N次。注意 seq 2 3 两边的符号是 数字”1” 左边的 “`” 符,而不是单引号,表示使用其结果作为for 的变量范围。在实际运行中,”hadoop-I"中的I 会依次被替换成 2, 3, 4…., 相当于表示了 hadoop-1, hadoop-2, … 等机器主机。 cat hadoop-hosts.txt | root@hadoop-$I “cat >> /etc/hosts” – 本步骤将 hadoop-hosts.txt 的内容列出并通过管道传给 ssh,在别名为 hadoop-xx 的机器上以root用户执行 cat 命令,将其追加到 /etc/hosts 文件中,这样就完成了远程机器的hosts文件配置。注意:在命令执行时,可能出现类似如下的提示信息:
  The authenticity of host 'hadoop-2 (192.168.100.5)' can't be established.
ECDSA key fingerprint is SHA256:w+6Ou6AjZvjAWg8QuQJvvmt1Q2qtXZiUvhj1pbf4JTg.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'hadoop-2,192.168.100.5' (ECDSA) to the list of known hosts.
root@hadoop-2's password: 

这是提示要求将目标机的指纹信息(fingerprint)加入本机上的 knownhosts, 这样以后不再提示,通常输入 yes 或直接回车即可。

在 Ubuntu 上,可能输入 root 密码后任然不能登录,其原因和解决方案参见 ubuntu下允许root用户ssh远程登录. 而CentOs中没有这个问题。

3.ssh-keygen 生成私钥对,这一步没有什么特别的,通常在master所在机器上进行


4.将本机的公钥分发到集群中的其他机器,并加入 authorized_keys。

#也是很简单的一句命令即可完成本机到集群中所有机器的免密码登录配置
for I in `seq 3` ; do ssh-copy-id -i ~/.ssh/id_rsa.pub root@hadoop-$I ;done

此处有两点需要注意:

seq 命令时只有一个参数,表示本次处理的机器是 hadoop-1 ~ hadoop-3(这样 hadoop-1 能够 ssh 到自生) ssh-copy-id 是 openssh-client 中提供的辅助脚本,可以完成 ” 拷贝id_rsa.pub 文件到远程主机 => 检查并加入 authorized_keys 文件 => 设置文件权限 ” 等全部内容。如果执行时提示无此命令,执行 sudo apt install openssh-client 安装即可。

5.在网上很多介绍中,需要依次在各个节点上都生成独立的 id_rsa + id_rsa.pub 文件,重复加入 authorized_keys 文件中,不过最简单的配置方式就是将本机的 id_rsa 文件复制到集群中每台机器上,这样大家互联时使用相同的秘钥,公钥,就不用再独立配置了(注意:由于这样存在安全隐患,最好只在测试环境下使用,正式环境时还是使用独立的密钥对)。

#一个语句即可将私钥复制到集群所有机器,这样集群中的所有机器都可免密码互相访问
for I in `seq 3` ; do scp ~/.ssh/id_rsa root@hadoop-$I:~/.ssh/id_rsa ;done

#由于本机已经ssh过集群中所有的机器,其 known_hosts 文件,将其复制到集群中所有机器后,从其上再互联时不用再确认 "fingerprint"
for I in `seq 3` ; do scp ~/.ssh/known_hosts root@hadoop-$I:~/.ssh/known_hosts ;done

总结

1.前面的示例只是建立了各个主机之间 root 账号之间的免密码登录,为了安全起见,一般需要使用特殊的用户名(如 hadoop)来运行指定服务,甚至可以配置成不同名字的账号间自动登录(超过本篇文章的范畴,此处不讲,有机会时再分享吧)。

2.从前面的介绍可以知道,通过 for + ssh 远程命令 的方式,可以在集群中一次操作大量机器,大大提升效率和减少可能的问题,希望大家都能多研究。注意在测试脚本时,一定先本地测试好后,再通过 for 命令应用到大量机器上,以免出错后难以挽救

补充脚本(创建并设置 hadoop 自动登录的脚本)

#在远程主机上创建 hadoop 用户
for I in `seq 3`; do ssh root@hadoop-$I 'useradd hadoop' ; done

#设置初始密码为 123456
for I in `seq 3`; do ssh root@hadoop-$I "echo 'password' | passwd --stdin hadoop" ;done

#将指定 id_rsa.pub+id_rsa 分发到集群中各主机上hadoop账号下,此处为了简单,直接使用了root的,但为了安全,不同账号最好用不同的密钥对
for I in `seq 3` ; do ssh-copy-id -i /root/.ssh/id_rsa.pub hadoop@hadoop-$I ;done
#
for I in `seq 3` ; do scp /root/.ssh/id_rsa hadoop@hadoop-$I:~/.ssh/id_rsa ;done
for I in `seq 3` ; do scp /root/known_hosts hadoop@hadoop-$I:~/.ssh/known_hosts ;done

#这样配置之后,理论上hadoop用户即可免密码互相访问,可通过如下命令验证(当即不提示输入密码也不报错即表示验证通过):
for I in `seq 3` ; do ssh hadoop@hadoop-$I "exit" ;done
点击复制链接 与好友分享!回本站首页
相关TAG标签 密码
上一篇:Git-SSH的配置使用【详细】
下一篇:内网穿透
相关文章
图文推荐
文章
推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做实用的IT技术学习网站