如何使用 PAM 验证用户,即不是启动应用程序的用户

Zim*_*lim 3 authentication pam

我目前正在为应用程序开发身份验证模块。决定通过使用 PAM 来做到这一点。我已经完成了这项工作,但它只能验证启动应用程序的用户。

这意味着,如果我以用户“appname”的身份启动应用程序,则身份验证只会告诉我,如果用户是“appname”而不是“some_user”则成功

如果我 su 到那个“some_user”并在那个终端中启动应用程序,那么我可以验证“some_user”而不是“appname”

我在 common-auth 中打开了 pam_unix 的调试标志。拒绝时产生以下输出:

unix_chkpwd[4107]: check pass; user unknown
unix_chkpwd[4107]: password check failed for user (pamtest)
[app]: pam_unix(other:auth): authentication failure; logname=[appname] uid=1000 euid=1000 tty= ruser=[appname] rhost=  user=pamtest
Run Code Online (Sandbox Code Playgroud)

jof*_*fel 8

PAM 不是守护进程,而只是一个库。由于普通用户无法访问身份验证数据(如/etc/shadow),因此在普通用户下运行的程序无法进行身份验证。有一个小例外:用户可以对自己进行身份验证,因为在这种情况下会自动调用SETGID /sbin/unix_chkpwd帮助程序,该程序可以访问身份验证数据(但不允许对其他用户进行身份验证)。

因此,您需要通过 SUID 标志为程序本身授予 root 权限(我不建议这样做,因为很难不打开后门),以便它在 root 下运行或需要通过网络服务或运行 SUID 程序进行身份验证,例如su.

这个问题中讨论了可能的解决方案。