由于错误的 PAM 配置导致 PAM 堆栈跳转错误,导致无法使用 sudo

由于错误的 PAM 配置导致 PAM 堆栈跳转错误,导致无法使用 sudo

在尝试缓解一些垃圾 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 分区:bootrootfs会被自动识别。然后 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 行。

相关内容