Unix PAM 模块在登录/锁定屏幕上失败 - 权限被拒绝 - 退出代码 13

Unix PAM 模块在登录/锁定屏幕上失败 - 权限被拒绝 - 退出代码 13

怎么运行的?

我带着另一个我自己无法解决的问题回来了。基本上我拥有的是基于 Python PAM 和 NFC 读卡器的 2 因素身份验证 (2FA) 模块。一旦提示用户输入密码 2FA禅尼蒂弹出对话框,要求输入 PIN 码,用户输入该密码,身份验证成功。

什么时候破?

当用户登录、保存文件并被要求输入密码或sudo在终端中使用时,此解决方案非常有效。一旦用户被锁定(显示锁屏)或重新启动后必须登录,此解决方案无法显示禅尼蒂对话框。

代码示例:

  • 这是我的 PAM 配置文件,/usr/share/pam-config/pprfid_pam.config其中包含:
    Name: 2FA PAMpy RFID Authorization
    Default: yes
    Priority: 192
    Auth-Type: Primary
    Auth:
        [success=end default=ignore]    pam_exec.so seteuid debug log=/var/log/pprfid.log /usr/local/bin/pprfid_pam.py
    Auth-Initial:
        [success=end default=ignore]    pam_exec.so seteuid debug log=/var/log/pprfid.log /usr/local/bin/pprfid_pam.py
  • 这是我的 Python PAM 模块文件/usr/local/bin/pprfid_pam.py,它具有 2 因素身份验证的魔力..这是禅尼蒂命令,这不起作用:
    # ...
    Popen("/usr/bin/zenity --forms --width=199 --height=100 --title '2FA' --text='Authorization' --add-password='PIN' --ok-label='Authorize' --cancel-label='Cancel' --separator=',' --display=:0.0", shell=True, stdout=PIPE )
    # ...

错误!

如上所述,一旦我被锁定或重新启动计算机并尝试通过锁定/登录屏幕登录,我会收到以下错误/var/log/auth.log

    Jul 24 18:13:14 ubuntu unix_chkpwd[46760]: password check failed for user (testuser)
    Jul 24 18:13:14 ubuntu kcheckpass[46747]: pam_unix(kde:auth): authentication failure; logname= uid=1000 euid=1000 tty=:0 ruser= rhost=  user=testuser
    Jul 24 18:13:14 ubuntu kcheckpass[46761]: pam_exec(kde:auth): open of /var/log/pprfid.log failed: Permission denied
    Jul 24 18:13:14 ubuntu kcheckpass[46747]: pam_exec(kde:auth): /usr/local/bin/pprfid_pam.py failed: exit code 13

我尝试解决这个问题:

  1. 显然我做的第一件事是检查权限并将其设置如下:
    root@ubuntu:~# chown -R root:root /usr/local/bin/pprfid_pam.py
    root@ubuntu:~# chown -R root:root /var/log/pprfid.log
    root@ubuntu:~# chmod 0755 /usr/local/bin/pprfid_pam.py
    root@ubuntu:~# chmod 0755 /var/log/pprfid.log
  1. 我仔细检查了DISPLAY设置是否正确,它确实设置为:0.0

问题!?

我究竟做错了什么?我对 PAM 模块开发真的很陌生,但我感觉由于我以 root 身份运行 GUI,权限被拒绝,但我不愿意盲目拍摄..所以我正在联系 Unix 专家- 请帮忙!

提前致谢, @理查德夫

更新#1

阅读相关文章和评论,并在其他一些论坛上讨论,似乎这里的问题很可能是由于禅尼蒂或者 PAM 模块本身无法作为 GUI 运行。为此,我应该通过显示管理器集成它 - 就我而言,我有SDDM。我将尝试测试/etc/pam.d/*配置文件中的一些场景,看看是否可以强制它运行。

更新#2

/usr/share/pam-config/pprfid_pam.config涵盖所有授权点..但是禅尼蒂不会显示外部会话(在登录/锁定屏幕上),所以我想我真的需要将此模块集成到SDDM直接GUI:思考:。

死胡同/解决方案(某种)

经过一番挖掘后,我决定拆掉/usr/share/pam-config/pprfid_pam.config盖子common-auth并简单地允许聚丙烯酰胺登录后在用户会话中运行的模块。我将不得不找出另一种方法来触发我的Python脚本SDDM显示管理器。

我不是 100% 确定是否聚丙烯酰胺支持与显示管理器的交叉连接(SDDM就我而言)并且我读过很多帖子,都说这是不可能的 - 这就是为什么我要减少我的聚丙烯酰胺模块覆盖率。

相关内容