所以,我有一个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 配置中的重要步骤。希望这可以帮助。