为什么RHEL8系统没有自动生成SSH主机密钥?

为什么RHEL8系统没有自动生成SSH主机密钥?

在 RHEL 8 及之前的版本中,SSH 主机密钥缺失时,服务/etc/ssh通常会自动生成sshd。通常应该有:

/etc/ssh/ssh_host_ecdsa_key
/etc/ssh/ssh_host_ecdsa_key.pub
/etc/ssh/ssh_host_ed25519_key
/etc/ssh/ssh_host_ed25519_key.pub
/etc/ssh/ssh_host_rsa_key
/etc/ssh/ssh_host_rsa_key.pub

重新启动节点甚至systemctl restart sshd就足够了。

但是从次要版本 RHEL 8.7 开始,这可能不再起作用,sshd崩溃会抱怨日志中缺少主机密钥。为什么?我该如何解决这个问题?

答案1

sshd服务默认调用sshd-keygen.target,检查/etc/ssh目录中主机密钥的可用性,并在缺失时生成它。

然而,新版本的 可以阻止这一众所周知的功能cloud-init。截至目前,cloud-init-22.1-5.el8.noarch有新文件:

/etc/systemd/system/[email protected]/disable-sshd-keygen-if-cloud-init-active.conf

内容:

# In some cloud-init enabled images the sshd-keygen template service may race
# with cloud-init during boot causing issues with host key generation.  This
# drop-in config adds a condition to [email protected] if it exists and
# prevents the sshd-keygen units from running *if* cloud-init is going to run.
#
[Unit]
ConditionPathExists=!/run/systemd/generator.early/multi-user.target.wants/cloud-init.target

因此当您使用时cloud-init您现在有 2 个选项:

  1. 使用以下方式手动生成主机密钥ssh-keygen -A(请参阅如何更改 SSH 主机密钥?了解更多详细信息和选项。
  2. 评论条件

只需#在前面加上符号ConditionPathExists...

[Unit]
#ConditionPathExists=!/run/systemd/generator.early/multi-user.target.wants/cloud-init.target

然后使用 重新加载 systemd 配置systemctl daemon-reload。 正常行为应该会再次起作用。

答案2

如果您正在使用 cloud-init,则可以通过在 cloud-init 配置文件中的“cloud_init_modules”部分添加“ssh”模块来修复此问题。请参阅cloud-init 文档

这将在首次启动时生成 ssh 主机密钥。

您可以在遇到问题的情况下测试这一点:

cloud-init config file: /etc/cloud/cloud.cfg
Check if you have 'ssh' module in "cloud_init_modules" section
Run this command to verify cloud-init action. NOTE: This will REBOOT your instance and run the cloud-init action from the scratch.
# cloud-init clean --reboot

验证 /etc/ssh/ 目录中的 ssh 主机密钥和 sshd 服务状态。

答案3

尝试在 cloud.cfg 中明确设置 ssh 密钥类型

resize_rootfs_tmp: /dev
ssh_deletekeys:   1
ssh_genkeytypes: ['rsa', 'ecdsa', 'ed25519']

相关内容