![由于错误的 PAM 配置导致 PAM 堆栈跳转错误,导致无法使用 sudo](https://linux22.com/image/1560655/%E7%94%B1%E4%BA%8E%E9%94%99%E8%AF%AF%E7%9A%84%20PAM%20%E9%85%8D%E7%BD%AE%E5%AF%BC%E8%87%B4%20PAM%20%E5%A0%86%E6%A0%88%E8%B7%B3%E8%BD%AC%E9%94%99%E8%AF%AF%EF%BC%8C%E5%AF%BC%E8%87%B4%E6%97%A0%E6%B3%95%E4%BD%BF%E7%94%A8%20sudo.png)
在尝试缓解一些垃圾 PAM 消息时/var/log/auth.log
,遵循这帖子中,我尝试了各种组合/etc/pam.d/sudo
。不幸的是,我尝试的最后一行完全锁定了我,无法使用任何须藤/苏运营。
session [success=1 default=ignore] pam_succeed_if.so quiet_success user = root uid = 0 ruser = pi
我在 CLI 上收到的错误是:
$ sudo nano sudo
sudo: pam_open_session: Permission denied
sudo: policy plugin failed session initialization
并显示相应的/var/log/auth.log
消息:
May 11 14:56:29 sudo: pi : TTY=pts/0 ; PWD=/etc/pam.d ; USER=root ; COMMAND=/bin/nano sudo
May 11 14:56:29 sudo: pam_unix(sudo:session): session opened for user root by pi(uid=0)
May 11 14:56:29 sudo: PAM bad jump in stack
May 11 14:56:29 sudo: pi : pam_open_session: Permission denied ; TTY=pts/0 ; PWD=/etc/pam.d ; USER=root ; COMMAND=/bin/nano sudo
显然,我无法通过使用 sudo 编辑文件来重新编辑该文件。
我怎样才能重新编辑该文件并摆脱这种糟糕的局面?
(这是 Raspberry Pi 3B 上最新的 Debian Stretch。)
答案1
感谢 Linux 系统,这变得异常简单。
只要启动任何 Linux 发行版,在我的情况下卡利VM。将 SD 卡插入 USB 读卡器并插入。2拉比SD 分区:boot
和rootfs
会被自动识别。然后 cd 进入/media/<blahblah>/rootfs/etc/pam.d/
并用 sudo 编辑文件。卸载并放回 Pi 中。
如果这没有教会您在使用 PAM 时要小心,至少它告诉您要备份您的 SD 卡或分区,因为在加密的 FS 上,这可能行不通!
答案2
如果您可以以具有编辑权限的用户身份登录/etc/pam.d/sudo
(可能是管理员或根帐户),那么只需执行此操作即可。
否则,您可能必须使用其他操作系统/系统编辑该文件。Raspberry Pi 的系统分区仍然在 SD 卡上,对吗?因此,您可以关闭 Raspberry,然后使用另一台计算机读取 SD 卡并编辑该文件。或者,如果您的 Raspberry 将从实时 USB 启动另一个操作系统。
可能有一个恢复启动选项(如single
)可以让您获得 root 登录...
答案3
我在不同情况下遇到过这种情况,但我希望这可能有所帮助。我认为这可能解释了为什么你的 PAM 配置首先会损坏。
那个设定成功=1(或等号右边的任何数字)表示要跳过如果该模块的身份验证成功。如果它跳过 X 行,并在其处理的第一个未跳过的行上遇到无效内容,或者没有其他行要处理,它将抛出堆栈错误消息中的错误跳转。
我遇到了一个不寻常的/无法解释的情况,其中一行被错误地添加了在......的最后我的 Ubuntu 20.04 LTS 中的 PAM 通用密码配置文件内容如下:
password [success=1 default=ignore] pam_unix.so obscure sha512 shadow remember=5
在我的例子中,它实际上是多余的,因为上面还有一行 pam_unix.so。该行本身并没有格式错误(并且身份验证成功通过),但它放错了地方(并且是多余的)。
鉴于它发生了紧接在文件结尾之前并显示“成功=1”,当使用一个好的密码成功后,它会尝试(进一步)跳过不存在的行因为它已经处于 EOF。因此它抛出了“堆栈中的错误跳转“消息。如果您位于文件末尾,则无法向前跳(跳过)一行。
在你的情况下,你(不幸)将错误引入了/etc/pam.d/sudo文件当然会创建一个无法解决的情况当你调用 sudo 来编辑 /etc/pam.d/sudo 文件时(使用须藤纳米须藤),因为 sudo 命令本身由于该文件中的问题而无法进行验证。
就我自己的情况而言,删除有问题的行可以解决问题。
底线: 查看 PAM 配置文件中条目的顺序,确保您没有将任何“成功”语句放在最后一行,或者(如果足够接近底部,但不是最后一行)使成功=X跳过遇到 EOF 之前的 X 行。