是否可以在 sshd 守护进程/服务器的登录过程中运行附加脚本?
我想运行一个使用 IP 地址和尝试用户名的附加命令。如果脚本返回退出状态 0,则可以通过,否则应拒绝登录。
我在 SSHD 文档中找不到任何内容。
答案1
看来您可能正在尝试重新发明......
您可以在 sshd_config 中配置 AllowUsers 以仅允许特定用户,并且可以通过指定主机进一步限制他们的访问权限
AllowUsers 此关键字后面可以跟一串用户名模式,以空格分隔。如果指定,则仅允许与其中一个模式匹配的用户名登录。只有用户名才有效;数字用户 ID 不被识别。默认情况下,允许所有用户登录。如果模式采用 USER@HOST 形式,则分别检查 USER 和 HOST,将登录限制为特定主机的特定用户。
有关模式的更多信息,请参阅 ssh_config(5) 中的 PATTERNS
模式可能非常复杂,因此您可以使用
AllowUsers [email protected].? user2 user2
等等。
答案2
我不会争论你尝试的正确性。此 sshd 配置变量将为每次登录运行一个命令,你可以决定是否继续从此程序登录。
ForceCommand
Forces the execution of the command specified by ForceCommand,
ignoring any command supplied by the client and ~/.ssh/rc if
present. The command is invoked by using the user's login shell
with the -c option. This applies to shell, command, or subsystem
execution. It is most useful inside a Match block. The command
originally supplied by the client is available in the
SSH_ORIGINAL_COMMAND environment variable. Specifying a command
of ``internal-sftp'' will force the use of an in-process sftp
server that requires no support files when used with
ChrootDirectory.
您可以在 duo_unix 源代码中找到如何使用此选项限制访问的源代码示例。https://github.com/duosecurity/duo_unix
ForceCommand 在用户上下文中运行,如果您使用此方法限制访问,则必须考虑从用户上下文中退出并进入 shell。我猜除了捕获信号的 C 程序之外,没有任何东西能够足够可靠。
答案3
向 SSH 身份验证添加其他要求的推荐方法是更改 PAM 配置。
现有的pam_exec PAM 模块允许您调用任何外部脚本或命令。PAM 将设置许多环境变量,包括您可以在脚本中使用的 PAM_RHOST 和 PAM_USER。
根据您如何堆叠 pam 模块,该脚本只能为成功验证的用户或所有登录尝试的用户调用。
PAM_RHOST 实际上可能包含远程主机名而不是 IP 地址,具体取决于 PAM 实现
PAM_USER 是尝试登录的用户提供的用户名。