我与 OpenSSH 服务器在同一台机器上,也就是说,我不需要进行身份验证。但是,我希望能够从我的客户端应用程序(使用 Python 或其他语言)与 OpenSSH 服务器进行通信。也就是说,当有新客户端连接时,我希望在我的 Python 脚本中收到通知并检索他们的公钥、IP 地址等...并拒绝该客户端登录。或者可能允许 - 取决于某些条件。
OpenSSH 服务器是否提供这样的 API 或回调?
答案1
它不提供 API。
请记住,既然您正在谈论身份验证,OpenSSH 可以使用 PAM。因此,您可能可以收集一些有关身份验证的信息,并在 PAM 模块中做出允许/拒绝的决定,但我认为这不能用 python 来完成。
答案2
如果您的客户端从不使用密码,而始终使用密钥,则可以使用AuthorizedKeysCommand
sshd_config 中的参数来执行 Python 脚本,以验证 SSH 密钥。您可能还可以通过检测 Python 进程父进程并检查其文件描述符来使用一些技巧来查找 IP 等。
我希望这有帮助。
答案3
我认为有两种方式可以解释你的问题。
日志监控
也许你正在寻找一个日志监控脚本Fail2ban(这是一个免费软件 Python 项目,因此您可以看到他们的代码是如何工作的)。
SSH 服务器日志的位置根据其安装方式而有所不同。它们通常位于/var/log/auth.log
、/var/log/secure
、/var/log/sshd.log
或类似名称的备用日志区域中,例如/usr/local/var/log/
(另请参阅如何检查 sshd 日志?)。以下是示例日志:
Aug 14 12:34:56 jodari-desktop sshd[12345]: Accepted pubkey for jodari from 127.0.0.1 port 54321 ssh2: RSA SHA256:3xyQ+PG0Z3CIiShclJ2iNya5TOdKDgE/HrOXr11IdOo
如果您“想要收到通知并检索他们的公钥、IP 地址等”,则只需监视该行即可。(您可能需要增加/etc/ssh/sshd_config
该文件所在的位置或位置的 LogLevel。)
如果您希望检索用户的实际公钥(而不仅仅是他们的指纹),您的脚本只需遍历他们的$HOME/.ssh/authorized_keys
文件(这是默认位置;可以AuthorizedKeysFile
使用 中的指令进行更改sshd_config
)。您需要将指纹与公钥匹配。如果文件中只有一行有效,则这是免费的,否则您需要生成每个公钥的指纹并将其与您从日志中提取的指纹进行匹配。只需在以下命令的输出中搜索指纹:
ssh-keygen -lf "$HOME/.ssh/authorized_keys"
通过 SSH 运行命令
如果您实际上希望像在 SSH 会话中一样运行某些内容,则可以使用无密码 ssh 密钥来运行命令。
生成仅供内部使用的 ssh 密钥,您将通过 localhost 上的 ssh 自动实现无密码访问。这将使一切都由 OpenSSH 控制,因此要监视连接,只需在标准 SSH 日志中查找由专用内部密钥验证的 localhost 即可。
我无法说出使用 Python 来实现这一点的方法,但是你可以在 Python 中将所有这些操作作为系统调用来执行。
要创建密钥:
mkdir -p "$HOME/.ssh"
chmod 700 "$HOME/.ssh"
ssh keygen -t rsa -b 4096 -P "" -C "python script PASSWORDLESS access" \
-f "$HOME/.ssh/python-localhost.id_rsa"
要在本地安装:
cat "$HOME/.ssh/python-localhost.id_rsa.pub" >> "$HOME/.ssh/authorized_keys"
然后使用它:
ssh -i "$HOME/.ssh/python-localhost.id_rsa" localhost your_command_goes_here