资讯详情

资讯详情

Hadoop集群SSH免密登录配置详解与避坑指南

搞过Hadoop集群的人都清楚第一次启动分布式节点时最烦的就是每台机器都要输密码。不管你是用sbin/start-dfs.sh启动HDFS还是跑一条MapReduce任务只要脚本涉及跨节点远程执行命令就会卡在“Password”的提示上。尤其是三层结构跑起来之后NameNode要跟每台DataNode通信一次启动输十几次密码手都酸而且脚本后台执行根本没法交互输入。这时候给Hadoop用户配好SSH免密登录就是正儿八经的刚需。这篇文章主要围绕“为hadoop用户配置SSH免密登录”这件事把原理、实操步骤、权限细节、常见坑全部拆开讲。适合刚刚搭好Hadoop集群的小白也适合在运维过程中想重新梳理SSH配置的人。看完你不仅能照着敲命令配好还能明白为什么目录权限差一点都不行以及遇到“免密失效”“连接被拒绝”时该从哪里下手排查。1. 理解需求为什么Hadoop一定要配免密登录1.1 从NameNode到DataNode的巡检式通信先说一个最核心的场景。Hadoop集群启动之后主节点NameNode、ResourceManager需要主动连接到从节点DataNode、NodeManager去执行一些远端命令比如启动DataNode进程、刷新节点状态、做元数据检查。这个连接不是用户手动敲的而是脚本里通过ssh hostname去触发的。如果每台机器都需要密码那脚本在执行到远程部分时就僵住了。尤其是start-dfs.sh它会遍历slaves文件里列出的每一个节点逐个尝试SSH连接。以前我见过有人在非交互环境下配错了密钥结果启动脚本卡在某个节点上半个小时最后超时失败日志里全是“Permission denied, please try again.”。所以免密登录是Hadoop伪分布式和全分布式集群能够正常启动、管理的前提不是可选项。1.2 公钥认证原理简单回顾SSH免密登录本质上是基于公钥加密的身份认证。客户端生成一对密钥公钥放到服务端的~/.ssh/authorized_keys文件里私钥留在客户端。当客户端发起SSH连接时服务端会拿着公钥去验证客户端的身份如果匹配通过就不再要求输密码了。这个过程中权限是个极其敏感的校验条件。OpenSSH对密钥文件和.ssh目录的权限有严格检查如果权限过宽比如authorized_keys被设为644以外的“其他人可写”状态服务端会直接忽略这个文件哪怕你的公钥内容完全正确也会退回密码登录。这个问题我在后面详细讲。提示这里说的都是Hadoop用户自己的配置不要动系统里root的SSH配置。Hadoop的守护进程如果以hadoop用户运行那么免密登录就是hadoop用户的事配错账号会引发权限混乱。2. 准备工作与约定2.1 集群角色与网络规划在动手前先把角色理清。你需要确认谁是客户端谁是服务端。在Hadoop集群里通常有三类节点NameNode / ResourceManager作为主节点需要免密SSH到所有从节点执行远程命令。DataNode / NodeManager作为从节点一般不需要反向免密。客户端节点提交作业的机器如果你经常手动ssh到集群其他节点也可以一并配置。但为了省事我建议在一个集群里把所有机器的hadoop用户都互相配好免密至少从各主节点到各从节点要通。假设集群有三台机器master01、worker01、worker02操作系统为Linux使用同一个hadoop用户名并且已用相同的hadoop用户登录所有机器。网络层先确认机器之间可以互ping/etc/hosts里也写好了主机名映射。2.2 确认基础环境确认以下两点再开始所有机器都装了openssh-server并且SSH服务已启动。用systemctl status sshd查看如果没有安装就先用yum install -y openssh-serverDebian系是apt install openssh-server装好。每台机器上hadoop用户的home目录/home/hadoop存在且hadoop用户可以正常登录。如果还没有创建用户先执行useradd hadoop passwd hadoop。另外建议先手动用密码登录一遍所有机器把known_hosts文件生成出来这样后续配置过程中能少遇到host key确认的干扰。我这套流程是在常见的Linux发行版上跑的Mac系统略有差异但核心逻辑一样。3. 核心实操一步步配置免密登录3.1 生成密钥对登录到master01机器并切换到hadoop用户或者直接用hadoop用户登录审计。然后执行su - hadoop ssh-keygen -t rsa -b 4096 -P -f ~/.ssh/id_rsa参数里-P 表示私钥文件不设置密码这样后续脚本自动连接时不需要再手动输入私钥口令。如果这里你设置了密码那免密就会变成“免输账号密码但要输私钥密码”等于没免。-f指定生成路径放在hadoop用户的.ssh目录下。执行完成后确认ls -l ~/.ssh/你会看到id_rsa私钥和id_rsa.pub公钥两个文件。注意集群规模大或者安全意识强的环境里有人会倾向给私钥加口令并配合ssh-agent。但在Hadoop自动化场景里脚本执行是非交互式的加密私钥会导致agent被发布后无法自动解锁非常麻烦。生产环境如果一定要加需要配上ssh-agent和ssh-add并把密码预置到keychain里这个复杂度不建议新手碰。3.2 分发公钥并配置authorized_keys现在你的master01上有公钥需要把公钥内容追加到所有目标机器hadoop用户的~/.ssh/authorized_keys中。包括它自己也要配一份因为有些脚本也会往本机做SSH循环。最简单的办法是使用ssh-copy-id它在Linux下默认自带很好用ssh-copy-id hadoopmaster01 ssh-copy-id hadoopworker01 ssh-copy-id hadoopworker02执行这个过程时会要求输入一次hadoop用户在目标机器上的密码输入后工具会自动把公钥追加到对方~/.ssh/authorized_keys并做权限收敛。一切正常后验证一下ssh hadoopworker01 echo ok: $(hostname)如果直接输出ok: worker01说明master01到worker01的免密已经通了。如果ssh-copy-id不可用也可以手工方式。一条命令完成cat ~/.ssh/id_rsa.pub | ssh hadoopworker01 mkdir -p ~/.ssh cat ~/.ssh/authorized_keys需要注意如果是第一次连接会弹出Are you sure you want to continue connecting (yes/no)输入yes。这种方式不会自动收敛权限你之后需要到每一台机器上手动执行chmod。所以ssh-copy-id优先。3.3 批量分发脚本可选集群节点多的时候一个个ssh-copy-id也挺烦。可以写一个简单的for循环脚本放在比如/home/hadoop/bin/目录下#!/bin/bash # 需要在每台机器hadoop用户下执行将本机公钥分发到所有节点 NODESmaster01 worker01 worker02 for node in $NODES; do echo Copy public key to $node... ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop$node done分发时依然需要逐台输入一次密码。这是不可避免的除非你用配置管理工具Ansible之类去集中分发但那要另起一套带认证的通道不在本文范围内。这里把脚本内容给你结合hosts文件的写法以后加新节点时执行一遍就够。3.4 验证免密登录在所有节点上都完成上述配置后从master01依次执行for node in master01 worker01 worker02; do echo $node ; ssh hadoop$node hostname whoami; done理想输出是三行主机名加hadoop。如果一切正常你还可以继续做一个更贴近Hadoop场景的验证切换到Hadoop安装目录比如/usr/local/hadoop执行sbin/start-dfs.sh观察是否不再卡在密码提示。这一步才是真正的验收。4. 权限与配置文件细节避坑重点4.1 权限为何必须严格前面提到OpenSSH会检查文件权限这里要展开说。很多新手配了半天authorized_keys里有公钥但就是免密失败90%的原因是权限问题。下面是一张标准权限表照着设置基本不会错路径/文件属主权限说明~/.sshhadoop700目录不能组/其他用户有写权限~/.ssh/authorized_keyshadoop600公钥文件不能组/其他用户可写~/.ssh/id_rsahadoop600私钥必须只有属主可读写~home目录hadoop755不能被组/其他用户写否则SSH会拒绝我见过最典型的一个错误是有人将整个home目录递归做了chmod -R 777然后所有权限校验全挂。OpenSSH有一个StrictModes设置默认是yes它会拒绝任何它认为权限过松的密钥认证。你可以临时把StrictModes改成no来验证但这不是“修复”是绕过治标不治本而且会引入风险。正确做法就是把权限掰正。如果遇到权限导致的失败可以检查服务端的日志通常是/var/log/secure或/var/log/auth.log里面会明确写Authentication refused: bad ownership or modes for file /home/hadoop/.ssh/authorized_keys看到这句话直接chmod 600 ~/.ssh/authorized_keys再确认.ssh目录是700基本就能解决。4.2 SSH配置项影响除了权限/etc/ssh/sshd_config里的几项直接影响免密是否生效PubkeyAuthentication yes必须启用公钥认证。有些默认配置为了安全会关闭需要手动打开。AuthorizedKeysFile .ssh/authorized_keys指定服务端认可的公钥文件路径。如果你的配置被修改过比如写成了绝对路径或别的文件名就要调整。PasswordAuthentication no如果服务端直接把密码登录禁掉了而且公钥又没配好那你会连登录都登不进去。建议先把免密打通再考虑是否关掉密码登录。StrictModes yes前面提到的权限严格检查。修改配置后记得重启sshd服务sudo systemctl restart sshd如果你愿意也可以先做sshd -t检查配置语法避免重启失败。4.3 known_hosts和StrictHostKeyChecking免密登录成功后另一个经常出现的坑是主机密钥确认。当SSH客户端第一次连接一台新机器时会询问是否接受该主机的主机公钥。批量和脚本场景下这个询问会卡住。处理方案有两类。第一类是正规做法提前把所有目标主机密钥插入到~/.ssh/known_hosts让客户端不再询问。你可以这样ssh-keyscan master01 worker01 worker02 ~/.ssh/known_hosts第二类是降低客户端检查级别。在~/.ssh/config里为特定主机设置Host *.example.com StrictHostKeyChecking no UserKnownHostsFile /dev/null或者临时在命令行加-o StrictHostKeyCheckingno。但是要清楚关闭主机密钥检查会降低安全性所以建议只在受信任的内网测试环境使用生产环境还是用ssh-keyscan预置为好。5. 常见问题与排查实录5.1 问题速查表下面这些是我在多个模拟项目环境里实际踩过的状况你也可以直接对照排查现象直接原因排查/解决提示“Permission denied (publickey,password)”没配好公钥或权限不对在目标机上重新ssh-copy-id检查.ssh权限卡在“yes/no”主机确认提示known_hosts没有目标主机记录执行ssh-keyscan填充或临时关闭StrictHostKeyChecking免密登录本机可以远程不行只需把本机公钥分发到远程机器检查authorized_keys是否包含对应公钥配置没问题但隔几天又失效home目录权限被动过或账号被锁重新执行chmod检查密码策略Hadoop启动脚本部分节点卡住某个节点网络/password/公钥未同步先从该节点手动ssh看具体报错执行脚本时私钥提示输入Passphrase生成密钥时加了密码重新生成带-P 的密钥对或者删除私钥密码5.2 一个完整的排查案例说一个当时的真实情况。有次我帮朋友调一套三节点的集群hadoop用户配了免密master01能ssh到worker01但ssh到worker02每次还要密码。我先在master01上确认~/.ssh/id_rsa.pub内容再去worker02比对~/.ssh/authorized_keys最后一行发现公钥是有的。继续查权限代码如下ls -ld /home/hadoop /home/hadoop/.ssh ls -l /home/hadoop/.ssh/authorized_keys结果发现/home/hadoop/.ssh目录权限是775不是700。问题就出在这里。因为SSH的权限校验会检查hadoop用户所在组是否拥有写权限即使你当前不是组内用户它仍然会拒绝。我执行chmod 700 /home/hadoop/.ssh chmod 600 /home/hadoop/.ssh/authorized_keys再试免密立即通过了。所以很多免密失败真的不是“公钥没配好”而是“就差一个数字权限”。另外还有一个容易忽略的如果你曾经以root身份对hadoop用户的文件做过chown -R导致.ssh目录的属主变成root那公钥认证一样会失败。正确属主必须始终是hadoop用户自己。你可以在客户端用ssh -v查看debug信息服务端看auth.log两边对一下问题很快定位。6. 收尾扩展维护层面的几点体会免密配好不是终点后续维护中还要注意几件事。随着集群扩容新节点的免密配置要纳入初始化流程别等启动失败才想起来。我一般会写一个setup_ssh.sh把ssh-keygen、ssh-copy-id、权限修正全部串在一起每次加节点后跑一遍能省很多事。另外尽量别把hadoop用户的私钥复制到不稳定或不受控的第三方机器上。私钥一旦泄露等于所有节点都能被登录。对于重要集群可以在防火墙层面限制SSH的访问来源并把sshd_config里的AllowUsers hadoop网段加上把风险收敛到一个相对小的范围。我个人在实际操作中最深的体会是配置SSH免密难的不是敲命令而是理解“权限到底在保护什么”。很多教程只给命令不给原因导致出了问题只能瞎撞。把公钥认证的校验流程和文件的ownership、permission对应起来想清楚之后这套配置基本就是一次搞定。希望这篇文章能帮你少走弯路。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →