pam_faillock 和 AD/CentOS 7.2

pam_faillock 和 AD/CentOS 7.2

所以,我有一个CentOS 7.2系统,我使用realmd加入AD域。我可以执行 # id {username}@{domain} ,它完美地列出了该用户的所有 AD 信息。惊人的!

使用库存 pam.d/system-auth 和 pam.d/password-auth 文件,我可以通过 ssh 并以 AD 用户身份登录。

但是,当我尝试使用强化的系统身份验证和密码身份验证时,事情变得很棘手。我已经缩小了密码验证文件的范围,特别是 pam_faillock auth 部分。

这是我的 /etc/pam.d/password-auth

auth        required      pam_env.so
auth        [default=1 success=ok] pam_localuser.so debug
auth required pam_faillock.so preauth audit deny=5 unlock_time=900 
auth        sufficient pam_unix.so nullok try_first_pass audit
auth [default=die] pam_faillock.so authfail audit deny=5 unlock_time=900 
auth sufficient pam_faillock.so authsucc audit deny=5 unlock_time=900
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        sufficient    pam_sss.so forward_pass
auth        required      pam_deny.so

account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     [default=bad success=ok user_unknown=ignore] pam_sss.so
account     required      pam_permit.so

password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    sufficient    pam_sss.so use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
-session     optional      pam_systemd.so
session     optional      pam_oddjob_mkhomedir.so umask=0077
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so
session     optional      pam_sss.so

当尝试在控制台或 ssh 上进行身份验证时,我得到以下信息:

Oct 07 12:07:48 vmcentos72 sshd[8406]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=localhost  user=user@domain

如果我删除 auth 部分中的 pam_faillock 行,它就可以正常工作。

这是系统身份验证:

auth        required      pam_env.so
auth        [default=1 success=ok] pam_localuser.so
auth required pam_faillock.so preauth audit silent deny=5 unlock_time=900
auth        [success=done ignore=ignore default=die] pam_unix.so nullok try_first_pass
auth [default=die] pam_faillock.so authfail audit deny=5 unlock_time=900
auth sufficient pam_faillock.so authsucc audit deny=5 unlock_time=900
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        sufficient    pam_sss.so forward_pass
auth        required      pam_deny.so

account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     [default=bad success=ok user_unknown=ignore] pam_sss.so
account     required      pam_permit.so

password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    sufficient    pam_sss.so use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
-session     optional      pam_systemd.so
session     optional      pam_oddjob_mkhomedir.so umask=0077
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so
session     optional      pam_sss.so

对于让它发挥作用有什么建议吗?如果 pam_faillock 有调试选项就好了:(

答案1

您的问题是您没有相应地调整 PAM 堆栈,特别是使用括号表示法的行上的“跳过”计数。如果您不熟悉该表示法,RTFMpam.conf(5),其中还列出了“必需”、“足够”等的等效括号符号。

配置了 sssd 的 RHEL 7 的默认身份验证部分如下所示:

auth        required      pam_env.so
auth        [default=1 success=ok] pam_localuser.so
auth        [success=done ignore=ignore default=die] pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        sufficient    pam_sss.so forward_pass
auth        required      pam_deny.so

pam_localuser行表示默认操作是跳过一个模块(pam_unix在本例中),但如果成功(即用户是本地用户),则正常继续。这样做是为了使域(非本地)用户不会生成失败的登录尝试,pam_unix而是直接跳至 ​​sssd(pam_sss预先进行 uid >= 1000 检查)。

另请注意默认=死亡设置为 on pam_unix,这意味着失败的本地登录将立即中止身份验证堆栈(甚至不会尝试pam_sss)。相似地,成功=完成成功登录时执行相同的操作。

正如已经提到的,pam_faillock不适用于域用户,但如果您将其用于本地帐户并在周围插入三个调用pam_unix,则需要将pam_localuser行更改为默认=4,以便域登录将继续有效。 (如果default=1,它将跳过pam_faillock但继续执行pam_unix,这对于域帐户来说显然会失败,并且由于default=die,立即中止。设置default=4将跳到pam_succeed_if,就像以前一样。)

我不熟悉pam_faillock,所以我不能说之后再次调用它pam_unix是否正确,但如果这是正确的,您还需要对 success=done 和 default=die 做一些事情pam_unix,否则它会切勿pam_faillock锁定/解锁帐户。

这是一个复杂的 PAM 堆栈;您可以参考示例配置pam_faillock(8)。确保你不会不小心让每个人都进来(希望最后pam_deny能解决这个问题),并确保调整任何默认=N添加或删除后续行时进行计数。

长话短说: [default=1]意味着之后跳过一行(pam_unix在本例中)。添加行需要调整计数。

答案2

这是我的密码验证文件,它似乎工作正常:

# Setup PAM Env
auth        required      pam_env.so
auth        required      pam_faildelay.so delay=4000000
# Check if Local User, if fail skip to SSSD part
auth        [success=ok default=4]  pam_localuser.so

# Local User - Load pre-auth, if fail end
auth        [success=ok default=2]  pam_faillock.so preauth deny=3 unlock_time=604800 fail_interval=900

# Local User - Attempt Auth, if fail end
auth        [success=ok default=1]  pam_unix.so

# Lcaol User - Sucess, clear lock tally, end
auth        [default=done]          pam_faillock.so authsucc

# Local User - Fail, update lock tally, end
auth        [default=die]           pam_faillock.so authfail deny=3 unlock_time=604800 fail_interval=900

# SSSD User  - Ensure uid is not system uid
auth        requisite     pam_succeed_if.so debug uid >= 1000

# SSSD User  - Attempt Auth
auth        sufficient    pam_sss.so

# Catchall   - Default result if nothin passes
auth        required      pam_deny.so

account     required      pam_faillock.so
account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     [default=bad success=ok user_unknown=ignore] pam_sss.so
account     required      pam_permit.so

password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    sufficient    pam_sss.so use_authtok


password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
-session     optional      pam_systemd.so
session     optional      pam_oddjob_mkhomedir.so umask=0077
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so
session     optional      pam_sss.so

登录失败后,AD 用户不会出现在故障锁定输出中,而本地用户则会出现。

更新:我添加了一些注释来解释 PAM 配置中的重要步骤。希望这可以帮助。

相关内容