我在几台机器上遇到了 freeipa 的问题。到目前为止调试非常令人沮丧。这是问题的详细信息;
它是如何体现的:
用户可以很好地登录到任何主机,但在某些主机上他们不能运行 sudo 命令。
我知道的:
有一个 IPA sudo 策略是“允许这个用户在任何主机上运行任何命令”,还有一个 HBAC 策略是“允许这个用户在任何主机上使用任何服务”所以我想我可以排除 IPA 策略是一个问题.
根据 tcpdump 的说法,这似乎只会在机器联系一个特定的 ipa 服务器(通过 dns srv 记录)时影响机器,这是我通过刷新 sss_cache 并执行 sudo -k 来确定的。有问题的机器之一实际上是 ipa 服务器本身,所以我已经排除了网络/防火墙是原因。我很确定它仅限于该 ipa 服务器,以及使用该特定 ipa 服务器的客户端。
只关注该 ipa 服务器本身,并将其与我的其他 ipa 服务器之一进行比较,sudo.conf、sudoers、sssd.conf 是相同的(减去调试被添加到损坏的服务器)。两者都在 /etc/hosts 中拥有 LAN ip,并且都使用 ntpd(我认为这排除了 kerberos 计时问题)。除了打开调试之外,全新安装不会更改 sssd.conf 和 sudo.conf 文件。
损坏的 ipa 服务器是第一个安装的,所以它是主 ca 等。
有问题的机器上的 Sudo(为简单起见,我专注于损坏的 ipa 服务器本身)确实适用于 /etc/sudoers 文件、/etc/passwd 等中本地定义的用户。
细节:
所有机器都使用centos 7和ipa 4.2.0
日志:(域名和用户已清理)
=-=-=- from end of sssd logs on server1 =-=-=-
(Tue Jun 28 23:21:33 2016) [sssd[be[domain.com]]] [set_server_common_status] (0x0100): Marking server 'server1.domain.com' as 'working'
(Tue Jun 28 23:21:33 2016) [sssd[be[domain.com]]] [be_pam_handler_callback] (0x0100): Backend returned: (0, 0, <NULL>) [Success (Success)]
(Tue Jun 28 23:21:33 2016) [sssd[be[domain.com]]] [be_pam_handler_callback] (0x0100): Sending result [0][domain.com]
(Tue Jun 28 23:21:33 2016) [sssd[be[domain.com]]] [be_pam_handler_callback] (0x0100): Sent result [0][domain.com]
(Tue Jun 28 23:21:33 2016) [sssd[be[domain.com]]] [be_pam_handler] (0x0100): Got request with the following data
(Tue Jun 28 23:21:33 2016) [sssd[be[domain.com]]] [pam_print_data] (0x0100): command: PAM_ACCT_MGMT
(Tue Jun 28 23:21:33 2016) [sssd[be[domain.com]]] [pam_print_data] (0x0100): domain: domain.com
(Tue Jun 28 23:21:33 2016) [sssd[be[domain.com]]] [pam_print_data] (0x0100): user: sirex
(Tue Jun 28 23:21:33 2016) [sssd[be[domain.com]]] [pam_print_data] (0x0100): service: sudo
(Tue Jun 28 23:21:33 2016) [sssd[be[domain.com]]] [pam_print_data] (0x0100): tty: /dev/pts/2
(Tue Jun 28 23:21:33 2016) [sssd[be[domain.com]]] [pam_print_data] (0x0100): ruser: sirex
(Tue Jun 28 23:21:33 2016) [sssd[be[domain.com]]] [pam_print_data] (0x0100): rhost:
(Tue Jun 28 23:21:33 2016) [sssd[be[domain.com]]] [pam_print_data] (0x0100): authtok type: 0
(Tue Jun 28 23:21:33 2016) [sssd[be[domain.com]]] [pam_print_data] (0x0100): newauthtok type: 0
(Tue Jun 28 23:21:33 2016) [sssd[be[domain.com]]] [pam_print_data] (0x0100): priv: 0
(Tue Jun 28 23:21:33 2016) [sssd[be[domain.com]]] [pam_print_data] (0x0100): cli_pid: 13960
(Tue Jun 28 23:21:33 2016) [sssd[be[domain.com]]] [pam_print_data] (0x0100): logon name: not set
(Tue Jun 28 23:21:33 2016) [sssd[be[domain.com]]] [ipa_hostgroup_info_done] (0x0200): Dereferenced host group: ipa-servers
(Tue Jun 28 23:21:33 2016) [sssd[be[domain.com]]] [hbac_get_category] (0x0200): Category is set to 'all'.
(Tue Jun 28 23:21:33 2016) [sssd[be[domain.com]]] [hbac_get_category] (0x0200): Category is set to 'all'.
(Tue Jun 28 23:21:33 2016) [sssd[be[domain.com]]] [hbac_get_category] (0x0200): Category is set to 'all'.
(Tue Jun 28 23:21:33 2016) [sssd[be[domain.com]]] [ipa_hbac_evaluate_rules] (0x0080): Access granted by HBAC rule [allow ops to anything]
(Tue Jun 28 23:21:33 2016) [sssd[be[domain.com]]] [be_pam_handler_callback] (0x0100): Backend returned: (0, 0, <NULL>) [Success (Success)]
(Tue Jun 28 23:21:33 2016) [sssd[be[domain.com]]] [child_sig_handler] (0x0100): child [13965] finished successfully.
(Tue Jun 28 23:21:33 2016) [sssd[be[domain.com]]] [be_pam_handler_callback] (0x0100): Backend returned: (0, 0, Success) [Success (Success)]
(Tue Jun 28 23:21:33 2016) [sssd[be[domain.com]]] [be_pam_handler_callback] (0x0100): Sending result [0][domain.com]
(Tue Jun 28 23:21:33 2016) [sssd[be[domain.com]]] [be_pam_handler_callback] (0x0100): Sent result [0][domain.com]
=-=-=- sudo debugging output on server1 from password prompt to failure =-=-=-
Jun 28 21:59:07 sudo[9738] <- expand_prompt @ ./check.c:398 := [sudo] password for sirex:
Jun 28 21:59:07 sudo[9738] -> verify_user @ ./auth/sudo_auth.c:193
Jun 28 21:59:07 sudo[9738] -> sudo_pam_verify @ ./auth/pam.c:131
Jun 28 21:59:07 sudo[9738] -> converse @ ./auth/pam.c:305
Jun 28 21:59:07 sudo[9738] -> auth_getpass @ ./auth/sudo_auth.c:347
Jun 28 21:59:07 sudo[9738] -> tgetpass @ ./tgetpass.c:76
Jun 28 21:59:07 sudo[9738] -> tty_present @ ./tgetpass.c:329
Jun 28 21:59:07 sudo[9738] <- tty_present @ ./tgetpass.c:333 := true
Jun 28 21:59:07 sudo[9738] -> term_noecho @ ./term.c:88
Jun 28 21:59:07 sudo[9738] <- term_noecho @ ./term.c:99 := 1
Jun 28 21:59:07 sudo[9738] -> getln @ ./tgetpass.c:272
Jun 28 21:59:09 sudo[9738] <- getln @ ./tgetpass.c:315 := **********
Jun 28 21:59:09 sudo[9738] -> term_restore @ ./term.c:73
Jun 28 21:59:09 sudo[9738] <- term_restore @ ./term.c:82 := 1
Jun 28 21:59:09 sudo[9738] <- tgetpass @ ./tgetpass.c:202 := **********
Jun 28 21:59:09 sudo[9738] <- auth_getpass @ ./auth/sudo_auth.c:365 := **********
Jun 28 21:59:09 sudo[9738] <- converse @ ./auth/pam.c:387 := 0
Jun 28 21:59:09 sudo[9738] <- sudo_pam_verify @ ./auth/pam.c:142 := 0
Jun 28 21:59:09 sudo[9738] <- verify_user @ ./auth/sudo_auth.c:282 := 1
Jun 28 21:59:09 sudo[9738] -> sudo_auth_cleanup @ ./auth/sudo_auth.c:160
Jun 28 21:59:09 sudo[9738] -> sudo_pam_cleanup @ ./auth/pam.c:189
Jun 28 21:59:09 sudo[9738] <- sudo_pam_cleanup @ ./auth/pam.c:193 := 0
Jun 28 21:59:09 sudo[9738] <- sudo_auth_cleanup @ ./auth/sudo_auth.c:177 := 0
Jun 28 21:59:09 sudo[9738] -> sudo_pw_delref @ ./pwutil.c:249
Jun 28 21:59:09 sudo[9738] -> sudo_pw_delref_item @ ./pwutil.c:238
Jun 28 21:59:09 sudo[9738] <- sudo_pw_delref_item @ ./pwutil.c:243
Jun 28 21:59:09 sudo[9738] <- sudo_pw_delref @ ./pwutil.c:251
Jun 28 21:59:09 sudo[9738] <- check_user @ ./check.c:189 := true
Jun 28 21:59:09 sudo[9738] -> log_failure @ ./logging.c:318
Jun 28 21:59:09 sudo[9738] -> log_denial @ ./logging.c:256
Jun 28 21:59:09 sudo[9738] -> audit_failure @ ./audit.c:68
Jun 28 21:59:09 sudo[9738] -> linux_audit_command @ ./linux_audit.c:70
Jun 28 21:59:09 sudo[9738] -> linux_audit_open @ ./linux_audit.c:49
Jun 28 21:59:09 sudo[9738] <- linux_audit_open @ ./linux_audit.c:61 := 13
Jun 28 21:59:09 sudo[9738] <- linux_audit_command @ ./linux_audit.c:97 := 3
Jun 28 21:59:09 sudo[9738] <- audit_failure @ ./audit.c:81
Jun 28 21:59:09 sudo[9738] -> new_logline @ ./logging.c:746
Jun 28 21:59:09 sudo[9738] <- new_logline @ ./logging.c:867 := user NOT authorized on host ; TTY=pts/2 ; PWD=/home/sirex ; USER=root ; COMMAND=/bin/bash -l
除非我读错了,否则在我看来 sudo 正在与 sssd 对话,后者通过 kerberos(在同一台机器上)与 IPA 对话。那说好的,然后 sudo... 出于某种原因,拒绝并说不?
配置:(损坏的 ipa 服务器)
=-=-=- sudo.conf (comment lines removed) =-=-=-=-
Debug sudo /var/log/sudo_debug all@debug
Debug sudoers.so /var/log/sudo_debug all@debug
Plugin sudoers_policy sudoers.so
Plugin sudoers_io sudoers.so
Set disable_coredump false
=-=-=- sssd.conf (whitespace removed) =-=-=-=-
[domain/domain.com]
debug_level = 5
cache_credentials = True
krb5_store_password_if_offline = True
ipa_domain = domain.com
id_provider = ipa
auth_provider = ipa
access_provider = ipa
ipa_hostname = server1.domain.com
chpass_provider = ipa
ipa_server = server1.domain.com
ipa_server_mode = True
ldap_tls_cacert = /etc/ipa/ca.crt
[sssd]
services = nss, sudo, pam, ssh
config_file_version = 2
domains = domain.com
[nss]
memcache_timeout = 600
homedir_substring = /home
[pam]
[sudo]
[autofs]
[ssh]
[pac]
[ifp]
=-=-==- /etc/sudoers (comments removed) =-=-=-=-=-
Defaults !visiblepw
Defaults always_set_home
Defaults env_reset
Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS"
Defaults env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
root ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
Edit1:好的,根据 jhrozek 的建议,我还在 [sudo] 部分启用了调试,这在日志中给出:
(Wed Jun 29 21:08:27 2016) [sssd[sudo]] [sudosrv_get_rules] (0x0400): Retrieving default options for [sirex] from [domain.com]
(Wed Jun 29 21:08:27 2016) [sssd[sudo]] [sudosrv_get_sudorules_query_cache] (0x0200): Searching sysdb with [(&(objectClass=sudoRule)(|(sudoUser=ALL)(name=defaults)(sudoUser=sirex)(sudoUser=#123607)(sudoUser=%confluence-administrators)(sudoUser=%jira-administrators)(sudoUser=%build_system_shell)(sudoUser=%jira-developers)(sudoUser=%publictracker)(sudoUser=%staff)(sudoUser=%wikiprivate)(sudoUser=%jira-users)(sudoUser=%vpn_users)(sudoUser=%ipausers)(sudoUser=%admins)(sudoUser=%gerrit)(sudoUser=%sirex)(sudoUser=%wiki)(sudoUser=%ops)(sudoUser=%gerrit-submit)(sudoUser=%sirex)(sudoUser=+*))(&(dataExpireTimestamp<=1467234507)))]
(Wed Jun 29 21:08:27 2016) [sssd[sudo]] [sudosrv_get_rules] (0x2000): About to get sudo rules from cache
(Wed Jun 29 21:08:27 2016) [sssd[sudo]] [sudosrv_get_sudorules_query_cache] (0x0200): Searching sysdb with [(&(objectClass=sudoRule)(|(name=defaults)))]
(Wed Jun 29 21:08:27 2016) [sssd[sudo]] [sudosrv_get_sudorules_from_cache] (0x0400): Returning 0 rules for [<default options>@domain.com]
ldbsearch 给出 0 个结果,但也显示 'asq: Unable to register control with rootdse!' (虽然它在其他服务器上也这么说)
在损坏的服务器上
ldbsearch -H /var/lib/sss/db/cache_domain.com.ldb -b cn=sysdb '(objectClass=sudoRule)'
给出 0,而在其他身份验证服务器上给出 3,所以我猜它与复制有关,但现在的问题是如何解决这个问题。
Edit2:奇怪的是,在损坏的服务器上
ipa sudorule-find All
返回 3 条规则!?我尝试删除损坏服务器上的 sssd 缓存文件并重新启动 sssd,但 ldbsearch 仍然给出 0 个规则。
如果我在没有过滤器的情况下进行 ldbsearch,我会在损坏的服务器上获得 48 条记录,在其他服务器上获得 51 条记录。仅缺少 3 个 sudo 规则条目。
我在其中一台工作的 ipa 服务器上制定了这些 sudo 规则,因此我相信复制不适用于 sysdb 表,或者它不适用于它的 sudo 规则。它们之间有防火墙,但是在工作的 ipa 服务器上创建的用户被复制到损坏的 ipa 服务器上,所以我不知道我是否可以排除防火墙。然而值得注意的是,虽然我认为它们之间允许所有端口,但损坏的服务器位于 DMZ 子网中,因此我不允许端口 22 (ssh) 从该 ipa 服务器返回到其他端口。我不知道这是否重要?然而,我已经完成了 conncheck 脚本,它说一切正常或警告 ipa 本身正在使用的两个端口
Edit3:好的,所以在影响所有服务器的损坏服务器上创建一个 sudo 规则(因此它应该缓存在 sssd 中)使新规则显示在 UI 中(以及其他 3 个),但它没有显示在固态硬盘。所以看起来 sssd 没有正确缓存规则。
我刚刚找到了一个文件 ~/.ipa/log/cli.log,它在损坏的服务器上(仅)有
2016-05-29T22:59:23Z 6583 MainThread ipa ERROR Certificate operation cannot be completed: Unable to communicate with CMS (Internal Server Error)
我不知道这是红鲱鱼还是确凿证据?
Edit4:从 Danila Ladner 的评论和随后的测试来看,这似乎发生在 4.2.0-15.0.1.el7.centos.17 但不是在 4.2.0-15.0.1.el7.centos.6.1 我相信是由于libsss对应升级到1.13.0.40.el7_2.9
我相信它与: https ://fedorahosted.org/sssd/ticket/1108
和
https://bugzilla.redhat.com/show_bug.cgi?id=1256849
但现在我只需要解决它。ipa-compat 树没有在“损坏”的 ipa 服务器上启用,现在它是但仍然没有乐趣。
这似乎与以下错误有关:https ://fedorahosted.org/sssd/ticket/1108
和
https://bugzilla.redhat.com/show_bug.cgi?id=1256849
在允许 sssd 缓存在网络上过期大约 30 分钟之后,启用兼容树的建议似乎已经成功了。
简而言之,您需要确保在 ipa 中启用了兼容树,以便 sssd 正确缓存 sudo 规则。我在一个“损坏”的 ipa 服务器上关闭了兼容树,当客户端与该特定 ipa 服务器(通过 DNS SRV 记录)通信时,他们没有缓存任何 sudo 规则。这表现为机器有时能够让用户 sudo,有时不能。因为 ipa 服务器本身不使用 SRV 记录而是使用它自己,所以 ipa 服务器上的 sudo 总是被破坏。
在 ipa 服务器上运行“ipa-compat-manage enable”并等待 sssd 缓存过期似乎已经解决了这个问题。