我正在尝试在我的 OpenBSD 6.9 服务器上实现以下功能:
- 禁止使用除
ssh-ed25519
两个按键之外的所有按键服务器和客户側面。 - 仅限
ssh-keygen -A
于通过授权ssh-ed25519
算法生成密钥,没有其他方法。
为了实现这些目标,我在我的中添加了以下几行sshd_config
:
HostKey /etc/ssh/ssh_host_ed25519_key
CASignatureAlgorithms ssh-ed25519
HostbasedAcceptedKeyTypes ssh-ed25519
HostKeyAlgorithms ssh-ed25519
PubkeyAcceptedKeyTypes ssh-ed25519
我还在我的中添加了以下几行ssh_config
:
CASignatureAlgorithms ssh-ed25519
HostbasedAcceptedKeyTypes ssh-ed25519
HostKeyAlgorithms ssh-ed25519
PubkeyAcceptedKeyTypes ssh-ed25519
我已删除除授权密钥之外的所有密钥。
重新启动sshd:
# rcctl restart sshd
sshd(ok)
sshd(ok)
通过运行以下命令验证我的设置是否被利用:
# ssh -Q HostbasedAcceptedAlgorithms
# ssh -Q HostKeyAlgorithms
# ssh -Q PubkeyAcceptedAlgorithms
令我惊讶的是,他们都得到了以下信息:
ssh-ed25519
[email protected]
[email protected]
[email protected]
ssh-rsa
rsa-sha2-256
rsa-sha2-512
ssh-dss
ecdsa-sha2-nistp256
ecdsa-sha2-nistp384
ecdsa-sha2-nistp521
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
换句话说,关键的限制被忽略了。
为了安全起见,我甚至重新启动了服务器,但没有任何区别。
一种可能的解决方法是删除所有密钥文件,只保留授权的密钥文件。但是,init 脚本中/etc/rc
有一行,ssh-keygen -A
它会在每次系统重启后,在 sshd 守护进程启动之前重新生成所有丢失的 ssh 密钥,包括禁用算法!
因此,移除钥匙并不能解决问题。
作为额外的解决方法,我可以ssh-keygen -A
从 init 脚本中删除该行或将其替换为我的自定义密钥生成算法,但这将导致一切回到原点:不得不一遍又一遍地处理这个问题,例如每次系统更新后,每当 OpenBSD 团队发布新版本时/etc/rc
。自动删除该行并在大量服务器上测试这种草率的解决方法很困难,如果出现问题,可能会导致大规模网络故障。
因此,我继续调查,并深入研究了 的源代码ssh-keygen
。我发现无法-A
从外部(例如通过配置文件)限制交换机的行为。它甚至不执行初步测试以确定密钥是否被授权,它只是根据硬编码数组中的算法列表生成密钥。避免这种情况的唯一方法是编辑、重新编译并使用 的自定义分支ssh-keygen
,但每次更新 OpenSSH 后我都必须处理它……
我已经找到了针对其他操作系统的部分解决方案,但没有找到针对 OpenBSD 的解决方案。
有人能给我指出一个合适的解决方案吗?为什么我的sshd_config
和ssh_config
密钥限制被忽略以及如何停止ssh-keygen -A
使用禁用算法生成密钥?
在有人问之前:OpenSSH 在两个配置文件中都使用了所有其他设置,因此这些配置文件确实是实际加载的文件。
非常感谢所有有用的答案。