问题经过
最近在使用Knox 服务集成 LDAP 后,在 Knox Web UI 界面中,使用Ldap 用户名、密码能够成功登录,但是在使用REST API 请求服务数据时,就会报401 Authentication failed
的错。
报错内容在下面。
请求接口
使用knox 服务请求 yarn 接口的restapi ,报错
curl -k -u "admin:admin" -XGET "https://x.x.x.x:8443/gateway/cdp-proxy-api/resourcemanager/v1/cluster/apps"
报错内容
解决方案
这里很奇怪,我这里web ui 使用ldap的用户名、密码能够成功登录,但是用rest 接口访问就会报错。经过排查,发现web ui 界面的认证方式和rest api 的认证方式是两套。
- web ui 是直接ldap 认证通过即可。
- rest api 需要 /etc/pam.d/system-auth 这个文件里面的支持。
我这里服务器是ldap 集成了sssd 服务来登录服务器。
问题原因
/etc/pam.d/system-auth
文件没有正确的集成 sssd
服务导致,rest-api 无法正常访问,具体什么原理目前还不是特别清楚,希望有知道的大佬,可以解释下。
最终方案
修改 /etc/pam.d/system-auth
, 然后重启Knox 服务。
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
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 sufficient pam_ldap.so forward_pass
auth required pam_deny.so
account required pam_unix.so broken_shadow
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 [default=bad success=ok user_unknown=ignore] pam_ldap.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 sufficient pam_ldap.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_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
问题解决!