[TOC]
好,我现在需要为一个集群配置所有用户之间的免密登录,包括每个用户和各个节点之间的免密。首先,我得理清楚整个流程,可能涉及到的步骤,以及需要注意的地方。
首先,用户的家目录在/export/home/下,并且所有节点都能访问这个目录。这意味着用户的home目录是共享的,对吗?所以,每个节点上用户的.ssh目录应该是同一个,这样生成的密钥对只需要在共享目录中保存一次,所有节点都能访问到。这样可以避免在每个节点单独生成密钥,节省时间和避免不一致的问题。
接下来,免密登录需要配置SSH密钥对。通常的做法是生成公钥和私钥,然后将公钥添加到目标节点的authorized_keys文件中。不过这里的情况比较特殊,因为用户的家目录是共享的,所以每个用户的.ssh目录应该已经对所有节点可见。因此,可能只需要为每个用户生成一次密钥对,并将公钥添加到authorized_keys文件中,这样所有节点都能识别这个密钥,因为它们的.ssh目录是共享的。
但是还有一点需要考虑,就是节点之间的免密登录。可能是指每个节点之间以root用户或其他用户实现免密登录?或者是指所有用户都可以免密登录到其他节点?可能需要明确用户的范围。假设这里的“节点之间”是指每个节点上的root用户或其他管理用户能够互相免密登录,或者可能是指所有用户都可以在节点之间免密访问。但根据问题描述,可能是指所有用户(包括普通用户)可以在集群中的任何节点之间免密登录。
不过,更可能的情况是,用户的家目录共享,所以每个用户的.ssh目录是共享的,因此如果用户生成自己的密钥对并配置authorized_keys,那么他们只需要在一个节点上操作,其他节点自动生效。因此,可能只需要为每个用户生成密钥对,并将公钥添加到共享的authorized_keys文件中。
不过,如果用户的家目录是共享的,那么每个用户的.ssh目录在集群的所有节点上都是同一个位置,所以生成密钥对只需要在一个节点上进行,其他节点自然就有了。然后,用户需要将自己的公钥添加到自己的authorized_keys文件中,或者是否需要将各个节点的host公钥加入known_hosts?
另外,节点之间的免密登录可能需要每个节点上的某个系统用户(比如root)能够互相SSH免密登录。这时候可能需要为每个节点生成密钥对,然后将这些公钥分发到其他节点的相应用户的authorized_keys文件中。但如果是共享家目录的话,可能只需要生成一次,因为所有节点的该用户的.ssh目录是共享的。
不过这里可能存在两种情况:用户之间的免密登录,以及节点之间的系统用户(如root)的免密登录。需要明确问题中的“每个节点之间实现免密登录”具体指什么。可能指的是节点之间使用root用户或其他管理账户可以互相免密登录。假设问题中的用户是通过ipa user-find获取的,可能这些用户是普通用户,而节点之间的免密可能需要配置root或其他系统账户的SSH密钥。
但根据问题描述,“所有节点均可访问此目录”,即/export/home/是共享的,可能通过NFS或者其他网络文件系统挂载。因此每个用户的.ssh目录位于共享存储中,所有节点看到的都是同一个.ssh目录。因此,用户生成密钥对只需要在一个节点生成,所有节点都能使用同一个密钥。
那么步骤可能如下:
对于每个用户(通过ipa user-find获取的用户列表):
- 以用户身份登录到某个节点(因为家目录共享,所以任何一个节点都可以)。
- 生成SSH密钥对(如果没有的话),比如使用ssh-keygen -t rsa,默认保存在~/.ssh/id_rsa和.pub。
- 将公钥(id_rsa.pub)内容追加到~/.ssh/authorized_keys文件中。注意权限问题,authorized_keys文件权限应为600,.ssh目录权限应为700。
- 这样,当用户从任何一个节点SSH到其他节点时,因为他们的私钥在共享目录中,且目标节点的authorized_keys文件也包含公钥,所以应该能免密登录。
但这里可能存在问题:当用户从一个节点SSH到另一个节点时,目标节点是否需要将源节点的host key添加到known_hosts文件中?否则第一次连接时会提示确认,导致自动化脚本失败。因此可能需要预先将所有节点的host key添加到用户的known_hosts文件中。
此外,对于节点之间的免密登录,假设是指每个节点上的root用户能够免密登录到其他节点。这时候可能需要为每个节点生成root用户的密钥对,并将这些公钥添加到所有其他节点的root用户的authorized_keys文件中。但如果root用户的家目录不是共享的,那么每个节点的root用户可能有不同的.ssh目录,此时需要分别在每个节点上配置。
但问题中的描述是用户的家目录是共享的,而root用户的家目录通常是/root,可能不是共享的。所以问题中的节点之间免密登录可能不是指root用户,而是指所有用户(包括普通用户)能够免密登录到其他节点,这已经通过共享的.ssh目录解决了。但可能需要进一步确认。
或者,可能用户需要能够从任何一个节点SSH到其他节点而无需密码,包括以同一用户身份登录。例如,用户alice在节点1上,想要SSH到节点2,不需要密码。由于她的.ssh目录是共享的,所以如果节点2上的alice用户的authorized_keys包含自己的公钥,那么就可以免密登录。但这里可能存在是否允许同一个密钥在不同主机上使用的问题。不过一般来说,SSH允许这样做。
那么具体步骤可能为:
- 获取所有用户的列表,例如通过ipa user-find命令。
- 对于每个用户,执行以下操作:
a. 切换到该用户(可能需要sudo或su)。
b. 检查是否已有~/.ssh/id_rsa.pub,如果没有,生成SSH密钥对,无需密码。
c. 将公钥添加到~/.ssh/authorized_keys文件中,确保该文件存在且权限正确。
- 处理所有节点之间的免密登录,这可能涉及为每个节点生成主机密钥,并将所有节点的公钥添加到每个节点的known_hosts文件中,或者为每个用户添加所有节点的host key到他们的known_hosts文件中,以避免首次连接时的提示。
另外,对于节点之间的免密登录,如果是要求每个节点能够以某个系统用户(如root)免密登录其他节点,而该用户的家目录不共享,那么需要单独配置。例如,为root用户生成密钥对,并将公钥分发到其他节点的/root/.ssh/authorized_keys文件中。但如果是普通用户,并且其家目录共享,则可能不需要。
但根据问题描述,用户的家目录是共享的,所有节点都能访问。所以可能用户层面的免密登录已经通过共享的.ssh目录解决了。而节点之间的免密可能指的是其他用户,比如root,或者需要每个节点上的用户能够SSH到其他节点的同一用户无需密码。例如,用户A在节点1上执行ssh node2,无需密码,因为node2上的用户A的authorized_keys包含自己的公钥,而由于家目录共享,authorized_keys已经存在该公钥。这样,用户A在任何节点都可以免密登录到其他节点的用户A账户。
但如果是这样,那么每个用户只需要在自己的家目录中生成密钥对,并将公钥添加到自己的authorized_keys文件中,这样他们就可以从任何节点访问任何其他节点,因为他们的私钥和authorized_keys都是共享的。
可能的步骤:
对于每个用户:
- 生成SSH密钥对(如果尚未生成)。
ssh-keygen -t rsa -N “” -f ~/.ssh/id_rsa
- 将公钥添加到authorized_keys:
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
(注意:如果authorized_keys不存在,需要创建,并设置正确的权限)
- 设置权限:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
同时,为了处理known_hosts的问题,可能需要将集群中所有节点的SSH主机公钥添加到每个用户的known_hosts文件中,以避免首次连接时的确认提示。可以通过以下步骤实现:
收集所有节点的主机公钥(通常位于/etc/ssh/ssh_host_rsa_key.pub等位置),然后将这些公钥追加到用户的~/.ssh/known_hosts文件中。或者使用ssh-keyscan命令扫描所有节点,并将结果追加到known_hosts。
例如,假设节点列表保存在一个文件nodes.txt中,每行一个节点的主机名或IP:
ssh-keyscan -f nodes.txt >> ~/.ssh/known_hosts
但需要确保以每个用户身份执行这个命令,或者在共享的家目录中,所有用户的known_hosts文件已经包含所有节点的主机密钥。
此外,节点之间的免密登录如果是针对root用户或其他非共享家目录的用户,则需要单独配置。例如,如果希望root用户可以在节点之间免密登录,那么需要在每个节点上生成root的密钥对,并将公钥添加到其他节点的/root/.ssh/authorized_keys文件中。但由于问题中提到的是用户的家目录是/export/home,可能不涉及root用户,所以可能不需要处理这部分。
总结步骤:
- 获取所有用户名(通过ipa user-find)。
- 对于每个用户:
a. 切换到该用户环境(可能需要使用sudo -u username)。
b. 生成SSH密钥对(如果不存在)。
c. 将公钥添加到authorized_keys。
d. 配置known_hosts以包含所有节点的主机密钥。
- 对于节点之间的免密登录(如需要root或其他系统用户):
a. 生成密钥对。
b. 将公钥分发到所有其他节点的相应用户的authorized_keys中。
但根据问题描述,可能只需要处理普通用户的情况,因为家目录共享已经处理了他们的免密登录。节点之间的免密可能指的是这些用户可以在任何节点之间SSH免密,这已经通过共享的.ssh目录实现,只要他们的公钥在authorized_keys中。例如,用户A在节点1上执行ssh node2,使用自己的私钥(位于共享目录),而node2上的authorized_keys包含该公钥,所以可以免密登录。
另外,需要注意权限问题,确保.ssh目录和文件的权限正确,否则SSH会拒绝使用。
可能的脚本步骤:
编写一个脚本,遍历所有用户,执行以下操作:
for user in $(ipa user-find | grep ‘User login:’ | awk ‘{print $3}’); do
home_dir=”/export/home/$user”
# 确保用户的家目录存在
if [ -d “$home_dir” ]; then
# 切换到用户环境生成密钥
sudo -u $user ssh-keygen -t rsa -N “” -f “$home_dir/.ssh/id_rsa”
# 将公钥添加到authorized_keys
cat “$home_dir/.ssh/id_rsa.pub” >> “$home_dir/.ssh/authorized_keys”
# 设置权限
chmod 700 “$home_dir/.ssh”
chmod 600 “$home_dir/.ssh/authorized_keys”
chmod 600 “$home_dir/.ssh/id_rsa”
chmod 644 “$home_dir/.ssh/id_rsa.pub”
else
echo “Home directory for $user does not exist.”
fi
done
然后,处理known_hosts:
nodes=$(cat node_list.txt) # 假设节点列表已获取
for user in $(ipa user-find | grep ‘User login:’ | awk ‘{print $3}’); do
home_dir=”/export/home/$user”
if [ -d “$home_dir” ]; then
# 使用ssh-keyscan获取所有节点的公钥
ssh-keyscan -H $nodes >> “$home_dir/.ssh/known_hosts”
# 可能需要去重
sort -u “$home_dir/.ssh/known_hosts” -o “$home_dir/.ssh/known_hosts”
chown $user “$home_dir/.ssh/known_hosts”
chmod 644 “$home_dir/.ssh/known_hosts”
fi
done
对于节点之间的root用户免密登录,可能需要额外步骤,但如果问题不涉及root,可能不需要处理。
另外,需要注意,如果用户的.ssh目录或文件已经存在,需要避免覆盖,例如在生成密钥对之前检查是否存在,如果存在则跳过生成步骤。
可能还需要处理多个节点上的并发操作,但由于家目录是共享的,可能只需要在一个节点上执行这些操作即可。
最后,测试验证:选择一个用户,尝试从一个节点SSH到另一个节点,确认无需输入密码。
为了为集群中的每个用户配置免密登录并实现节点之间的免密登录,按以下步骤操作:
步骤 1:获取用户列表和节点列表
获取所有用户:
ipa user-find | grep 'User login:' | awk '{print $3}' > users.txt获取节点列表:
# 假设通过记事本获取的节点列表保存为 nodes.txt # 每行一个节点的主机名或IP pbsnodes -aS | grep ^node | awk '{print $1}'
步骤 2:为每个用户配置SSH免密登录
由于用户家目录 /export/home/ 共享,所有节点共用同一份密钥。
while read user; do
home_dir="/export/home/${user}"
# 确保.ssh目录存在
sudo -u $user mkdir -p "${home_dir}/.ssh"
sudo -u $user chmod 700 "${home_dir}/.ssh"
# 生成SSH密钥(如果不存在)
if [ ! -f "${home_dir}/.ssh/id_rsa" ]; then
sudo -u $user ssh-keygen -t rsa -N "" -f "${home_dir}/.ssh/id_rsa"
fi
# 将公钥添加到authorized_keys(如果不存在)
if [ ! -f "${home_dir}/.ssh/authorized_keys ]; then
sudo -u $user touch "${home_dir}/.ssh/authorized_keys"
sudo -u $user chmod 600 "${home_dir}/.ssh/authorized_keys"
fi
# 避免重复添加
grep -q -f "${home_dir}/.ssh/id_rsa.pub" "${home_dir}/.ssh/authorized_keys" || \
cat "${home_dir}/.ssh/id_rsa.pub" | sudo -u $user tee -a "${home_dir}/.ssh/authorized_keys" > /dev/null
done < users.txt
步骤 3:处理SSH Known Hosts
避免首次连接时的手动确认。
nodes=$(cat nodes.txt)
for user in $(cat users.txt); do
home_dir="/export/home/${user}"
# 收集所有节点的公钥到known_hosts
ssh-keyscan -H $nodes | sudo -u $user tee "${home_dir}/.ssh/known_hosts" > /dev/null
sudo -u $user chmod 644 "${home_dir}/.ssh/known_hosts"
done
步骤 4:配置节点之间的免密登录(如root用户)
若需节点间root用户免密登录(假设需要):
在每个节点生成root的SSH密钥:
# 在每个节点执行: ssh root@node1 "mkdir -p /root/.ssh; ssh-keygen -t rsa -N '' -f /root/.ssh/id_rsa"(需自动化到所有节点,可使用并行ssh工具如pssh)
收集所有节点的root公钥:
# 在主节点收集 for node in $(cat nodes.txt); do ssh root@$node 'cat /root/.ssh/id_rsa.pub' >> all_root_pubkeys done分发公钥到所有节点的authorized_keys:
# 将all_root_pubkeys分发到每个节点的/root/.ssh/authorized_keys for node in $(cat nodes.txt); do scp all_root_pubkeys root@$node:/root/.ssh/ ssh root@$node "cat /root/.ssh/all_root_pubkeys >> /root/.ssh/authorized_keys && chmod 600 /root/.ssh/authorized_keys" done
验证配置
用户免密登录验证:
sudo -u user1 ssh node2 hostname应直接返回节点名称,无需密码。
节点间root免密登录验证:
ssh root@node2 hostname应无密码提示。
注意事项
- 权限问题:确保
.ssh目录权限为700,私钥为600,authorized_keys为600。 - 共享目录一致性:确保所有节点正确挂载
/export/home,避免权限或网络问题。 - 安全性:若生产环境需更高安全,可考虑使用SSH证书认证替代密钥对。
以上步骤实现了用户级和节点级的SSH免密登录,适用于共享家目录的集群环境。