Active Directory 管理员组成员使用错误密码 SUDO 成功

Active Directory 管理员组成员使用错误密码 SUDO 成功

环境:

  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模块从更改requiredsufficient”。

花时间阅读是非常值得的第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 模块的行。

相关内容