如何以编程方式检测可用的ssh身份验证类型?

Ste*_*tef 8 security ssh monitoring openssh

我想写一个监视插件,检查我的网络上的各种主机,以确保没有启用密码或交互式SSH身份验证.也就是说,我需要编写以下代码:

  1. 连接SSH端口.
  2. 枚举可用的身份验证方法.
  3. 验证只能进行基于密钥的身份验证.

使用python或bourne sh代码(使用ssh)的方法对我来说最有趣,但其他语言,库或提示也很受欢迎.

Ead*_*cer 13

我现在正在构建一个,但是,您可以通过使用PreferredAuthentications选项强制ssh输出(到STDERR)支持的方法.这可以使用grep/python/language选择轻松解析.

HostA$ ssh -o PreferredAuthentications=none HostB
Permission denied (publickey,gssapi-with-mic).
HostA$ ssh -o PreferredAuthentications=none HostC
Permission denied (publickey,gssapi-with-mic,password,keyboard-interactive,hostbased).
Run Code Online (Sandbox Code Playgroud)


Eug*_*its 7

在SSH中定义身份验证的RFC 4252说明如下:

身份验证方法由其名称标识,如[SSH-ARCH]中所定义."none"方法是保留的,不得列为支持.但是,它可以由客户端发送.除非客户端在没有任何身份验证的情况下被授予访问权限,否则服务器必须始终拒绝此请求,在这种情况下,服务器必须接受此请求.发送此请求的主要目的是从服务器获取支持的方法列表.

因此,您可以发送身份验证请求以获取受支持的身份列表.但是,身份验证本身发生在某些较低级别的操作发生后(密钥交换就是其中之一),因此您可能需要在sh脚本中编写SSH协议的一部分,这可能是一项非常重要的任务.