我正在尝试设置 sshd 以在专用服务器上执行一些有趣的操作。(也就是说,不要担心我为什么要问这么奇怪的问题;我只是在试验如何滥用 OpenSSH。)
我想允许用户使用虚构的名字登录系统。例如:
$ ssh [email protected]
名为 的系统上没有 (UNIX) 用户joeschmoe
。
当他们连接时,我希望他们以确实存在的用户身份登录,名为guest
,并在环境中设置某些内容,joeschmoe
以便我知道他们以谁的身份登录。
是否有可能将 UNIX 用户和 ssh 用户的概念分离?
答案1
我一直在研究非常类似的案例。就我而言,我决定将其实现为基于主机的身份验证。您只需了解必须在哪里创建用户,最好的地方是在名称服务交换机中实现 getpwnam 调用。在我看来,在 PAM 中实现用户创建是不可能的,我认为 SSH 在实际调用 PAM 模块之前需要用户详细信息,但是,这可能取决于身份验证类型。
我的博客文章描述了如何使用基于主机的身份验证并使用相同的用户名登录:https://funinit.wordpress.com/2018/01/29/host-based-ssh-as-sso/
Github 项目使用 NSS 服务库以适当的方式实现了 getpwnam:https://github.com/cinek810/libnss-pool
如果您想将每个人都登录为访客,您可以检查其他 NSS 库(ato 代表 all to one):https://github.com/donapieppo/libnss-ato
答案2
如果您想允许所有用户登录,您可以跳过密码检查,而是在他们第一次尝试登录时为他们创建一个帐户:
安装
libpam-script
。例如:sudo apt-get install libpam-script
在 的 auth 部分中
/etc/pam.d/sshd
,将其替换pam_unix.so
为pam_script.so
。某些 Linux 发行版会自动为您进行此更改。例如,在 Ubuntu 14.04 中,pam_script.so
将被添加到/etc/pam.d/common-auth
中/etc/pam.d/sshd
。/usr/share/libpam-script/pam_script_auth
使用下列内容创建:#!/bin/bash adduser $PAM_USER --disabled-password --quiet --gecos "" exit 0
通过以下方式使脚本可执行:
chmod +x /usr/share/libpam-script/pam_script_auth
要开心。
答案3
不幸的是,无法实现 OP 想要的效果。我最近一直在研究同样的问题,我发现 OpenSSH 始终会使用用户输入的用户名,而忽略 PAM 可能尝试引入的对用户名的任何更改。如果该用户不存在于 /etc/passwd 中,OpenSSH 将不允许他们登录,因为它无法查找一些重要的信息(包括 UID、GID 和登录 shell)。
参考: https://www.redhat.com/archives/pam-list/2009-January/msg00004.html
一种替代方法是在 PAM 身份验证阶段动态创建用户,正如 David 在他的回答中所描述的那样。我已经测试了这个解决方案,发现它是可行的。由于 UID 通常为 32 位,因此您不会用完它们。但是,我认为随着 /etc/passwd 和 /etc/shadow 文件越来越长,系统性能可能会变得越来越慢。
答案4
显然是可能,根据存在证明,例如“ssh clidle.duckdns.org -p 3000”(通过 ssh 玩 wordle - 不要求密码并且接受任何用户名)
但是看起来你需要实现自己的 ssh 服务器(而不是按照问题使用 OpenSSH),在上面的例子中,这是使用 Wish 完成的(https://github.com/charmbracelet/wish)。
不幸的是,Wish 代码全部用“Go”编写,这可能会妨碍您将其添加到自己的应用程序中。