我目前正在为应用程序开发身份验证模块。我们决定使用 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
答案1
PAM 不是守护进程,而只是一个库。由于普通用户无法访问身份验证数据(例如/etc/shadow
),因此在普通用户下运行的程序无法进行身份验证。有一个小例外:用户可以验证自己的身份,因为在这种情况下设置组标识 /sbin/unix_chkpwd自动调用帮助程序,该程序可以访问身份验证数据(但不允许对其他用户进行身份验证)。
因此,您需要通过 SUID 标志赋予程序本身 root 权限(我不推荐它,因为很难不打开后门),以便它在 root 下运行,或者需要通过网络服务或运行 SUID 程序进行身份验证su
。
在这个问题讨论了可能的解决方案。