假设我想为简单的网络服务设置穷人的身份验证方案。
我不想打扰用户名/密码身份验证,为简单起见,我只想在我的应用程序中有一个公钥列表,任何能证明他们是该密钥的所有者的人都可以使用我的服务。
出于我的应用程序的目的,它将极大地简化身份验证过程,因为我的所有用户都在本地网络上并且他们都使用Unix。无论何时我登上新用户,我都可以向他们询问他们的ssh公钥。
是否有一种简单的方法可以在非ssh应用程序中重用ssh公钥认证中涉及的机制?这个问题旨在与语言无关。
答案 0 :(得分:2)
如果您只有一个可以使用您的应用程序的用户列表,而您无需查看谁做了什么。
您可以设置服务器,使其仅侦听localhost(127.1)而不是0.0.0.0,并提供受限制的sshd,转发连接到应用程序所需的端口
~/.ssh/authorized_keys
将提供可以使用的授权密钥列表。
ssh -I private_key_file <hostname> -L 3000:localhost:3000
有关配置sshd的基本设置和帮助,请查看以下答案: https://askubuntu.com/questions/48129/how-to-create-a-restricted-ssh-user-for-port-forwarding
注意:请注意,如果您没有将其锁定,任何用户都可以在托管计算机的机器上拥有完全的shell访问权限。
答案 1 :(得分:2)
我头脑中的一个肮脏的黑客:你可以包装应用程序,以便它可以创建一个从localhost到你的服务器的实际SSH隧道,并将其用于?
答案 2 :(得分:1)
假设您正在谈论基于Web的应用程序。您真正需要的是X.509客户端证书(1.3.6.1.5.5.7.3.2)。这样您就可以单独为您的应用程序识别用户。
这些问题面临着在查看密钥分发时通常会遇到的相同问题。这通常被认为是一个难题。
如果您想沿着这条路走下去,那就是您需要做的事情。
在服务器端,您需要将证书作为Web服务器的一部分进行处理(nginx或apache应该有模块来执行此操作),然后将该名称作为标题字段传递给您的应用程序,然后您可以处理该字段内部。
这是一个比用户名和密码更好的安全解决方案,但由于密钥分发问题,这种解决方案很复杂。大多数人都不会打扰,因为在大多数应用程序中,将登录与LDAP或半径集成起来很容易。