![为任何/每个连接用户名配置 OpenSSH shell](https://linux22.com/image/93631/%E4%B8%BA%E4%BB%BB%E4%BD%95%2F%E6%AF%8F%E4%B8%AA%E8%BF%9E%E6%8E%A5%E7%94%A8%E6%88%B7%E5%90%8D%E9%85%8D%E7%BD%AE%20OpenSSH%20shell.png)
使用 Debian 的默认 OpenSSH sshd 软件包,有没有办法将其配置为将每个用户名视为相同?
例如,如果有人使用随机用户名(即:8LaRiQRd8Qjh)连接,但该用户名不作为 Linux 用户存在,我可以配置 sshd 将其视为一些一致的用户名,例如“testuser”吗?
我知道如何从 SSH 客户端角度完成此操作,但我希望 SSH 服务器本身接受任何连接凭据(允许我的 shell 处理该级别的身份验证)。
理想情况下,我想要的是一条类似“如果没有现有用户名,则使用此用户名”的规则。即使“始终使用此用户名”也可以,只是不太理想。
如果能找到一个使用默认 OpenSSH sshd 服务的简单解决方案,而不是运行我自己的 sshd 服务,那就太好了。
答案1
我不知道你为什么要这样做,这似乎是一个糟糕的主意。
也就是说,出于某种原因,这个问题让我着迷,我需要找到答案。
简而言之,这不能通过简单地在 debian 中配置可用的软件包来完成。
如果你想这样做,你必须编写两个模块:一个用于 NSS,一个用于 PAM。
为了网络服务模块您至少需要提供_getpwbynam_r
.为了PAM模块还有更多的样板文件。
这似乎需要大量工作,而不是您正在寻找的内容,但既然您提到您想自己处理身份验证,那么这就是执行此操作的方法。
一个更简单的选择(并且可能不太安全)是使用帕拉米科设置 Python SSH 服务器并自定义/挂钩身份验证功能。
幸运的是,paramiko 的工作人员已经完成了这方面的大部分繁重工作演示服务器他们在他们的仓库里有。
通过替换check_auth_password
或check_auth_publickey
您可以接受任何有效的用户。密码验证示例(*):
# pip install pam
import pam
MYUSER = 'testuser'
class Server(paramiko.ServerInterface):
def check_auth_password(self, username, password):
if password and pam.authenticate(username=MYUSER, password=password):
return paramiko.AUTH_SUCCESSFUL
return paramiko.AUTH_FAILED
因为这不是 StackOverflow,所以我就到此为止:)
这将创建一个 ssh 服务器,该服务器将忽略密码身份验证的用户名,并检查给定的密码testuser
。
默认情况下,该服务器将提示输入名称并退出。您可能想用 shell 或您的自定义应用程序替换它。
我对用户名进行了硬编码,但您可以轻松地从配置文件或数据库查找或其他方式获取它。
您可能还想替换host_key
变量以及端口号。
有很多方法可以搬起石头砸自己的脚。你应该非常非常非常小心。此代码尚未准备好用于生产,请查看整个内容。如果您没有发现其中有任何问题,那么您就没有做出好的评论;-)。
*:这只是替换Server
类中的函数demo_server.py
并在顶部添加一些内容