Linux下使用ssh-agent实现集群节点间无免密安装部署
目的:
利用ssh-agent服务实现节点间非免密访问,集群利用ssh-agent进行ssh访问管理代替ssh免密配置的模式,提升集群的安全性。
ssh-agent介绍
ssh-agent扮演的是一个代理的角色。当其他程序需要身份验证的时候可以将验证申请交给它来完成整个认证过程,涉及的场景如下:
1)使用不同的密钥连接到不同的主机时,需要手动指定对应的密钥,而ssh-agent可以自动选择对应的密钥进行认证。
2)避免重复输入密码:如果私钥使用密码短语进行了加密,每一次使用SSH密钥对进行登录的时候,都必须输入正确的密码短语。而ssh-agent程序能够将已解密的私钥缓存起来,在需要的时候提供给的SSH客户端。这样就只需要在使用ssh-add时将私钥加入ssh-agent缓存的时候,输入一次密码短语就可以了。
ssh-agent原理
用户Bob 使用ssh-agent来管理私钥之后。ssh-agent会启动一个进程在内存里保存这些私钥。之后每次登录时,ssh客户端都会跟ssh-agent请求是否有目标主机的私钥;如果有,ssh客户端便能直接登录目标主机。
操作步骤如下:
1、通过ssh-agent bash或者eval `ssh-agent`来启动。
2、通过ssh-add为ssh-agent添加私钥。
ssh-agent代理转发
在X机器上运行 ssh-agent代理来管理私钥;通过X机器ssh登录到Y机器;能让Y机器上的ssh客户端也能使用到所有X机器上的ssh-agent所管理的所有私钥。
Y机器上的ssh客户端会跟Y机器上sshd服务器请求私钥。因为已经从X登录到Y上,X的ssh客户端和Y上的sshd服务器连理了一条连接。通过这条连接,请求被转发给了X上的ssh客户端,最终传递给X上的ssh-agent。请求的结果反向传递回去。
使用ssh-agent代理转发功能需要:
1、本节点的ssh客户端配置文件(/etc/ssh/ssh_config)添加:
ForwardAgent yes
默认是没有开启的。
2、下一节点的 sshd 服务器配置文件(/etc/ssh/sshd_config)添加:
AllowAgentForwarding yes
默认是开启的。
集群无免密配置方法
配置ssh-agent过程
第一步:删除集群所有节点上/root/.ssh/目录下的文件
mkdir -p /root/.ssh
rm -rf /root/.ssh/*
第二步:在所有master节点,生成各自的密钥并修改密钥文件名称,密钥文件默认保存路径(/root/.ssh/)不要修改,并添加密钥的口令passphrase,所有管理节点的秘钥口令保持一致。
#生成密钥
ssh-keygen -m PEM -b 1024 -t rsa
#修改密钥文件名称
在所有master上执行如下命令:
mv /root/.ssh/id_rsa /root/.ssh/id_rsa_master
mv /root/.ssh/id_rsa.pub /root/.ssh/id_rsa_master.pub
第三步:将每个master节点生成的密钥,分别拷贝到其他所有节点上(包括自己)
#假设三个管理节点分别为100.7.66.108/110/112 ,计算节点为100.7.66.114,以master1节点的IP地址为100.7.66.108为例,将生成的密钥拷贝到所有节点包括自己,首次需要输入各个节点的root密码,在master1上执行命令如下:
ssh-copy-id -i /root/.ssh/id_rsa_master root@100.7.66.108需要集群root用户密码
ssh-copy-id -i /root/.ssh/id_rsa_master root@100.7.66.110需要集群root用户密码
ssh-copy-id -i /root/.ssh/id_rsa_master root@100.7.66.112需要集群root用户密码
ssh-copy-id -i /root/.ssh/id_rsa_master root@100.7.66.114需要集群root用户密码
同理,在master2和master3上执行相同的命令。
第四步:集群管理节点配置私钥口令
在所有管理节点上配置一个文件,文件内容保存passphrase(私钥口令),私钥口令使用密文进行加密,采用现有的V3.8代码中加解密方式获取明文。
节点间底层脚本调用方式:
第一步:默认操作系统是不开启ssh-agent服务的,需要手动开启
#执行任务时,在当前管理节点启动ssh-agent
ssh-agent bash
第二步:在当前管理节点上将密钥交给ssh-agent托管
#把密钥添加到 ssh-agent 缓存中,需要传入集群密钥口令passphrase
ssh-add /root/.ssh/id_rsa_master
第三步:执行扩缩容任务脚本或者调用底层脚本
ansible脚本任务:
管理节点访问管理节点或者管理节点访问计算节点,都不需要增加配置参数,只需要将密钥交给ssh-agent托管即可实现临时免密。
shell脚本任务:
管理节点访问管理节点或者管理节点访问计算节点,不需要增加配置参数,只需要将密钥交给ssh-agent托管即可实现临时免密。
注:ssh-agent服务启动后,只是在当前ssh进程中的当前管理节点上到其他所有节点是免密登录的
第四步:任务结束后,移除ssh-agent管理密钥的权限,终止ssh-agent服务进程
#从ssh-agent缓存中删除密钥并kill掉ssh-agent进程
ssh-add -d /root/.ssh/id_rsa_master
ssh-agent -k