环境:
OS: FreeBSD 12.1-Release-p10
Sudo: 1.9.5p2
Samba: 4.13.1_1
我们最近迁移到 Active Directory 后端以提供 DNS、DHCP 和内部 SSO 支持。我的 SSH 登录运行良好,使用 PAM 通过 Samba/Winbindd 设置进行身份验证。我想通过 AD 组成员身份控制谁可以使用 sudo(现在就像 root 一样)。
为此,我在 AD 中创建了一个名为“Unix Admins”的新组,我希望 sudo 检查其成员资格,就像对本地用户和 Wheel 组所做的那样。为此,我简单地复制了现有的轮子条目并设置了两组检查线,如下所示:
%wheel ALL=(ALL) ALL
%Unix\ Admins ALL=(ALL) ALL
当既不在 Wheel 中也不在新组中的 AD 用户登录并尝试使用 sudo 时,他们会收到有关不在 sudoers 文件中的正常错误,正如预期的那样。当他们是在 AD 组中而不是在 Wheel 中,系统会提示他们输入密码,如果他们正确输入密码,则命令将按预期执行。
然而,当他们进入错误的密码时,他们会看到一条错误消息,考虑到这种情况,该消息有点神秘,然后命令无论如何都会执行,就像他们输入了正确的密码一样。
错误发生如下:
% sudo ls
Password:
When trying to update a password, this return status indicates that the value provided as the current password is not correct.
<<ls output here>>
编辑:为了清晰起见进行了编辑。
Edit2:/etc/pam.d & /usr/local/etc/pam.d 相关内容
/usr/local/etc/pam.d/sudo
#
# $FreeBSD: branches/2021Q1/security/sudo/files/pam.conf 340872 2014-01-24 00:14:07Z mat $
#
# PAM configuration for the "sudo" service
#
# auth
auth include system
# account
account include system
# session
# XXX: pam_lastlog (used in system) causes users to appear as though
# they are no longer logged in in system logs.
session required pam_permit.so
# password
password include system
/etc/pam.d/系统
#
# $FreeBSD: releng/12.1/lib/libpam/pam.d/system 197769 2009-10-05 09:28:54Z des $
#
# System-wide defaults
#
# auth
auth sufficient pam_opie.so no_warn no_fake_prompts
auth requisite pam_opieaccess.so no_warn allow_local
#auth sufficient pam_krb5.so no_warn try_first_pass
#auth sufficient pam_ssh.so no_warn try_first_pass
auth sufficient pam_unix.so no_warn try_first_pass nullok
auth sufficient pam_winbind.so try_first_pass
# account
#account required pam_krb5.so
account required pam_login_access.so
account required pam_unix.so
# session
#session optional pam_ssh.so want_agent
session required pam_lastlog.so no_fail
# password
#password sufficient pam_krb5.so no_warn try_first_pass
password required pam_unix.so no_warn try_first_pass
答案1
这是你的问题,“系统文件已修改为包含pam_winbind
,并将pam_unix
模块从更改required
为sufficient
”。
花时间阅读是非常值得的第4.1章的Linux PAM 管理员指南(是的,我知道您使用的是 FreeBSD),以便您能够理解我在这里解释的细节。
当你pam_unix
设置为时required
,它立即返回成功或者失败取决于密码的有效性。当你改变它时,sufficient
它只返回成功但除此之外继续。现在没有故障模式。
您的auth
堆栈现在可以返回成功或默认值,恰好是成功。要解决此问题,请添加 adeny
作为最后一个堆栈条目auth
# auth
auth sufficient pam_opie.so no_warn no_fake_prompts
auth requisite pam_opieaccess.so no_warn allow_local
auth sufficient pam_unix.so no_warn try_first_pass nullok
auth sufficient pam_winbind.so try_first_pass
auth required pam_warn.so
auth required pam_deny.so
pam_warn
如果您不希望 PAM 记录身份验证失败,请注释该条目。
PAM 堆栈的有用关键字
required
- 失败最终会导致堆栈返回失败,但只有在执行完剩余模块之后requisite
-失败将立即退回sufficient
-成功将立即退回,除非失败来自required
已待处理
答案2
FreeBSD 中的 PAM 模块并不像我们想象的那样像 Linux 中的模块那样工作,而且实际上按照文档说明的那样工作。
问题出在 auth 部分的前述模块中,涉及 OPIE 系统。这些模块默认处于活动状态,并且对于未在其帐户中初始化 OPIE 的用户来说总是成功的 - 老实说,这基本上是每个人。即使所有“正常”身份验证模块都返回失败(如果这些模块设置为“足够”或“可选”),这也会导致通过身份验证小节。
解决方案是删除引用两个 OPIE 模块的行。