如何在重新启动 ssh 服务之前验证 Debian 是否支持给定的 HostKeyAlgorithms?

如何在重新启动 ssh 服务之前验证 Debian 是否支持给定的 HostKeyAlgorithms?

我有一个 shell 脚本,它添加下面的内容sshd_config然后重新启动 ssh。

cat << EOF >> /etc/ssh/sshd_config
KexAlgorithms [email protected],diffie-hellman-group-exchange-sha256
Ciphers [email protected],[email protected],[email protected]
MACs [email protected],[email protected],[email protected]
HostKeyAlgorithms ssh-ed25519,rsa-sha2-256,rsa-sha2-512,[email protected]
EOF

它运行良好,直到我在 Debian 8 机器上运行它,该机器HostKeyAlgorithms不支持给定的选项,因此 ssh 无法启动。HostKeyAlgorithms使用紧急控制台删除该行解决了该问题,并且 ssh 启动了。

有没有一种巧妙的方法可以让该脚本在重新启动并冒着被锁定的风险之前检查这些HostKeyAlgorithms(以及可能的KexAlgorithmsCiphers和)是否受 SSH 支持?MACs

答案1

您可以直接使用查询选项,如手册页所示:

     -Q query_option
             Queries ssh for the algorithms supported for the specified ver‐
             sion 2.  The available features are: cipher (supported symmetric
             ciphers), cipher-auth (supported symmetric ciphers that support
             authenticated encryption), help (supported query terms for use
             with the -Q flag), mac (supported message integrity codes), kex
             (key exchange algorithms), kex-gss (GSSAPI key exchange algo‐
             rithms), key (key types), key-cert (certificate key types),
             key-plain (non-certificate key types), key-sig (all key types and
             signature algorithms), protocol-version (supported SSH protocol
             versions), and sig (supported signature algorithms).  Alterna‐
             tively, any keyword from ssh_config(5) or sshd_config(5) that
             takes an algorithm list may be used as an alias for the corre‐
             sponding query_option.

例如:

error@vmtest-debian8:~$ ssh -Q key
ssh-ed25519
[email protected]
...

检查您的手册页,因为您在旧发行版上安装了非常旧版本的 OpenSSH,并且无法使用上述所有选项。

答案2

sshd -t在要更新的主机上 测试 sshd_config 。此外,-f选项允许指定建议的配置文件。在可以解析新配置文件之前,无需触碰正在运行的配置文件。

将自己锁定仍然是可能的,但至少不会因为无法解析配置。

不完整的 shell 脚本提纲:

SSHD_CONFIG=$(mktemp sshd.XXXX)
# copy new config to ${SSHD_CONFIG}
sshd -t -f ${SSHD_CONFIG}
# failure if return is not 0
# install sshd_config
# restart sshd service
rm ${SSHD_CONFIG}

或者,如果你使用 Ansible 进行自动化,文件相关模块可以做类似的事情。一个validate参数,一个命令,其中%s替换为建议文件的副本。sshd 是模板模块的示例

- name: Update sshd configuration safely, avoid locking yourself out
  template:
    validate: /usr/sbin/sshd -t -f %s
    backup: yes

相关内容