我们知道如果要向远程服务器传输数据和操作必须输入用户名和密码远程登录服务器 ,或用FTP等协议,都需要权限控制。
然而如果是两台服务器间的软件需要通讯和数据传输,如 hadoop 集群中机器互访,是不是每次也要输入用户名和密码?那是不是很麻烦?下面介绍 SSH 来解决这个问题(不是 JAVA 中的 SSH 概念)
SSH 是一种网络协议,用于计算机之间的加密登录。
如果一个用户从本地计算机,使用 SSH 协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。
最早的时候,互联网通信都是明文通信,一旦被截获,内容就暴露无疑。1995 年,芬兰学者 Tatu Ylonen 设计了 SSH 协议,将登录信息全部加密,成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目前已经成为 Linux 系统的标准配置。
需要指出的是,SSH 只是一种协议,存在多种实现,既有商业实现,也有开源实现。本文针对的实现是 OpenSSH,它是自由软件,应用非常广泛。
此外,本文只讨论 SSH 在 Linux Shell 中的用法。如果要在 Windows 系统中使用 SSH,会用到另一种软件 PuTTY
Hadoop 运行过程中需要管理远端 Hadoop 守护进程,在 Hadoop 启动以后,NameNode 是通过 SSH(Secure Shell)来启动和停止各个 DataNode 上的各种守护进程的。这就必须在节点之间执行指令的时候是不需要输入密码的形式,故我们需要配置 SSH 运用无密码公钥认证的形式,这样 NameNode 使用 SSH 无密码登录并启动 DataName 进程,同样原理,DataNode 上也能使用 SSH 无密码登录到 NameNode。
下面就安装总结一下网友和自己的经验。
CentOS7.0
- yum install ssh 安装SSH协议
- yum install rsync (rsync是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件)
- service sshd restart 启动服务
查看安装
- rpm –qa | grep openssh
- rpm –qa | grep rsync
为避免麻烦,每个服务器上都要装。
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" 目录下(每台服务器看各自的生成路径信息 因为 hadoop 为用户名,所以生成在当前用户名下)。
查看 "/home/hadoop/" 下是否有 ".ssh" 文件夹,且 ".ssh" 文件下是否有两个刚生产的无密码密钥对。
接着在 Master 节点上做如下配置,把 id_rsa.pub 追加到授权的 key 里面去。
- cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
在验证前,需要做两件事儿。第一件事儿是修改文件 "authorized_keys" 权限(权限的设置非常重要,因为不安全的设置安全设置,会让你不能使用 RSA 功能),另一件事儿是用 root 用户设置 "/etc/ssh/sshd_config" 的内容。使其无密码登录有效。1)修改文件 "authorized_keys"
- chmod 600 ~/.ssh/authorized_keys
备注:如果不进行设置,在验证时,扔提示你输入密码,在这里花费了将近半天时间来查找原因。 2)设置 SSH 配置用 root 用户登录服务器修改 SSH 配置文件 "/etc/ssh/sshd_config" 的下列内容。
- RSAAuthentication yes# 启用 RSA 认证PubkeyAuthentication yes# 启用公钥私钥配对认证方式AuthorizedKeysFile .ssh/authorized_keys# 公钥文件路径(和上面生成的文件同)
设置完之后记得重启 SSH 服务,才能使刚才设置有效。
- service sshd restart
退出 root 登录,使用 hadoop 普通用户验证是否成功。
- ssh localhost
从上图中得知无密码登录本级已经设置完毕,接下来的事儿是把公钥复制所有的 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 上
从上图中我们得知,已经把文件 "id_rsa.pub" 传过去了,因为并没有建立起无密码连接,所以在连接时,仍然要提示输入输入 Slave1.Hadoop 服务器用户 hadoop 的密码。为了确保确实已经把文件传过去了,用 SecureCRT 登录 Slave1.Hadoop:192.168.1.3 服务器,查看 "/home/hadoop/" 下是否存在这个文件。
从上面得知我们已经成功把公钥复制过去了。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" 权限已经变了。3)追加到授权文件 "authorized_keys" 到目前为止 Master.Hadoop 的公钥也有了,文件夹 ".ssh" 也有了,且权限也修改了。这一步就是把 Master.Hadoop 的公钥追加到 Slave1.Hadoop 的授权文件 "authorized_keys" 中去。使用下面命令进行追加并修改 "authorized_keys" 文件权限:
- cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
- chmod 600 ~/.ssh/authorized_keys
4)用 root 用户修改 "/etc/ssh/sshd_config" 具体步骤参考前面 Master.Hadoop 的 "设置 SSH 配置",具体分为两步:第 1 是修改配置文件;第 2 是重启 SSH 服务。5)用 Master.Hadoop 使用 SSH 无密码登录 Slave1.Hadoop 当前面的步骤设置完毕,就可以使用下面命令格式进行 SSH 无密码登录了。 ssh 远程服务器 IP
从上图我们主要 3 个地方,第 1 个就是 SSH 无密码登录命令,第 2、3 个就是登录前后 "@" 后面的机器名变了,由 "Master" 变为了 "Slave1",这就说明我们已经成功实现了 SSH 无密码登录了。最后记得把 "/home/hadoop/" 目录下的 "id_rsa.pub" 文件删除掉。
- rm –r ~/id_rsa.pub
到此为止,我们经过前 5 步已经实现了从 "Master.Hadoop" 到 "Slave1.Hadoop"SSH 无密码登录,下面就是重复上面的步骤把剩余的 Slave 服务器进行配置。这样,我们就完成了 "配置 Master 无密码登录所有的 Slave 服务器"。
如果实现 Slave 服务器无密码登录 Master?
来源: http://www.cnblogs.com/zhangs1986/p/6707470.html