我想编写一个监控插件来检查我网络上的各种主机,以确保未启用密码或交互式 SSH 身份验证。也就是说,我需要编写以下代码:
- 连接到 SSH 端口。
- 枚举可用的身份验证方法。
- 验证只有基于密钥的身份验证是可能的。
使用 python 或 bourne sh 代码(使用ssh
)的方法对我来说是最有趣的,但其他语言、库或提示也很受欢迎。
我想编写一个监控插件来检查我网络上的各种主机,以确保未启用密码或交互式 SSH 身份验证。也就是说,我需要编写以下代码:
使用 python 或 bourne sh 代码(使用ssh
)的方法对我来说是最有趣的,但其他语言、库或提示也很受欢迎。
我目前正在自己构建一个,但是,您可以使用 PreferredAuthentications 选项强制 ssh 输出(到 STDERR)支持的方法。这可以很容易地用 grep/python/选择的语言来解析。
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).
在 SSH 中定义身份验证的RFC 4252说明如下:
身份验证方法由其名称标识,如 [SSH-ARCH] 中所定义。"none" 方法是保留的,并且不能被列为支持。但是,它可以由客户端发送。服务器必须总是拒绝这个请求,除非客户端在没有任何身份验证的情况下被授予访问权限,在这种情况下,服务器必须接受这个请求。发送此请求的主要目的是从服务器获取支持的方法列表。
因此,您可以发送无身份验证请求以获取受支持的身份验证列表。但是,身份验证本身发生在发生某些较低级别的操作(密钥交换就是其中之一)之后,因此您可能需要在 sh 脚本中编写 SSH 协议的一部分,这可能是一项不平凡的任务。
您现在可以使用名为ssh-auth-methodsnmap
的内置 NSE 脚本来执行此操作:
# nmap -p 22 --script ssh-auth-methods 192.168.1.2
Starting Nmap 7.60 ( https://nmap.org ) at 2017-12-26 00:56 GMT
Nmap scan report for 192.168.1.2
Host is up (0.027s latency).
PORT STATE SERVICE
22/tcp open ssh
| ssh-auth-methods:
| Supported authentication methods:
| publickey
|_ keyboard-interactive
MAC Address: AA:BB:CC:DD:EE:FF (Apple)
Nmap done: 1 IP address (1 host up) scanned in 2.40 seconds
另外,有人做了一个类似的python3脚本。
如果您需要 *nix 解决方案,您还可以连接到 OpenSSH 源。如果 Windows 适合您 - 您也可以尝试一些 .NET 商业库,它们比 OpenSSH 源代码更方便 :)