KingbaseES 高可用组件sys_securecmdd之二---sys_securecmdd连接之UsePAM
背景:
sys_securecmdd是KingbaseES集群中自带的工具,集群监控、管理集群时通过sys_securecmdd安全执行命令。在一些禁止使用ssh的通用机或者是专用机环境中,可以通过sys_securecmdd工具实现节点之间远程连接后执行相应的命令。
关于PAM:
PAM(插入式验证模块(Pluggable Authentication Module,PAM)),简单来说,就是在操作系统提供了一组身份验证、密码验证的统一抽象接口,应用程序员可以使用这些API接口来实现与安全性相关的功能。
案例说明:
默认在部署securecmdd工具后,配置文件securecmdd_config中配置参数UsePAM=yes,在一些生产环境中,通过脚本部署集群或启动集群时,会出现sys_securecmdd连接失败的问题。通过本案例,用户将了解sys_securecmdd中UsePAM的具体配置和故障解决方案。
一、问题现象
如下所示,通过sys_securecmdd客户端连接服务端测试,连接失败(包括kingbase和root用户)。
[kingbase@node202 bin]$ ./sys_securecmd root@192.168.1.201
Last login: Tue Feb 6 10:24:05 2024 from 192.168.1.1
Connection to 192.168.1.201 closed.
注: 192.168.1.201 为服务端ip。
二、问题分析
sys_securecmdd连接通过公钥和私钥建立互信,首先要确认公钥和私钥文件文件在sys_securecmdd部署完成后,文件属性正常。如下所示,以下为正常的文件属性:
1、查看securecmdd相关文件属性
1)查看kingbase和root宿主目录属性
[root@node201 ~]# ls -lhd /root
dr-xr-x--- 17 root root 4.0K 2月 6 10:20 /root
[root@node201 ~]# ls -lhd /home/kingbase
drwx------ 12 kingbase kingbase 336 2月 5 15:47 /home/kingbase
2)查看kingbase 和 root下认证文件属性
[root@node201 ~]# ls -lh /root/.es
总用量 8.0K
-rw------- 1 root root 381 2月 5 15:47 accept_hosts
-rw------- 1 root root 1.7K 2月 5 15:47 key_file
[root@node201 ~]# ls -lh /home/kingbase/.es
总用量 8.0K
-rw------- 1 kingbase kingbase 381 2月 5 15:47 accept_hosts
-rw------- 1 kingbase kingbase 1.7K 2月 5 15:47 key_file
2、通过debug模式诊断sys_securecmdd连接
1)启动sys_securecmdd到debug模式
如下所示,可以将集群任一节点作为服务端,启动sys_securecmdd到debug模式,启动后,服务停留在诊断模式,等待客户端的连接:
[root@node201 bin]# /home/kingbase/cluster/securecmdd/bin/sys_securecmdd -D -ddd
......
注:root用户启动,服务启动必须以绝对路径方式。
2)客户端建立连接测试
[kingbase@node202 bin]$ ./sys_securecmd root@192.168.1.201 -vvv
......
注: 192.168.1.201 为服务端ip。
3)服务端诊断信息(客户端执行连接后出现debug日志)
[root@node201 bin]# /home/kingbase/cluster/securecmdd/bin/sys_securecmdd -D -ddd
.....
debug1: PAM: initializing for "root"
debug1: PAM: setting PAM_RHOST to "192.168.1.202"
debug1: PAM: setting PAM_TTY to "ssh"
debug2: monitor_read: 100 used once, disabling now
debug3: mm_request_receive: entering
debug3: monitor_read: checking request 4
debug3: mm_answer_authserv: service=ssh-connection, style=
debug2: monitor_read: 4 used once, disabling now
debug3: userauth_finish: failure partial=0 next methods="publickey,password" [preauth]
......
debug1: do_pam_account: called
debug2: do_pam_account: auth information in SSH_AUTH_INFO_0
debug3: PAM: do_pam_account pam_acct_mgmt = 7 (Authentication failure)
debug3: PAM: do_pam_account ES set pam_acct_mgmt = 0
......
debug1: PAM: establishing credentials
debug1: PAM: pam_setcred(): Failure setting user credentials
debug3: PAM: opening session
debug2: do_pam_session: auth information in SSH_AUTH_INFO_0
debug1: auth_restrict_session: restricting session
debug1: auth_activate_options: setting new authentication options
PAM: pam_open_session(): Cannot make/remove an entry for the specified session
.......
debug3: receive packet: type 1
Received disconnect from 192.168.1.202 port 54753:11: disconnected by user
Disconnected from user root 192.168.1.202 port 54753
debug1: do_cleanup
debug1: PAM: cleanup
debug3: PAM: sshpam_thread_cleanup entering
4)客户端诊断信息
[kingbase@node202 bin]$ ./sys_securecmd root@192.168.1.201 -vvv
......
debug2: channel 0: is dead
debug2: channel 0: garbage collecting
debug1: channel 0: free: client-session, nchannels 1
debug3: channel 0: status: The following connections are open:
#0 client-session (t4 r0 i3/0 o3/0 e[write]/0 fd -1/-1/7 sock -1 cc -1 io 0x00/0x00)
debug3: send packet: type 1
Connection to 192.168.1.201 closed.
Transferred: sent 2816, received 2716 bytes, in 0.0 seconds
Bytes per second: sent 65443.4, received 63119.5
如上所示,在执行debug诊断后,服务端出现大量PAM认证失败的日志信息,可以判断客户端连接sys_securecmdd服务失败和PAM认证有关。
4、检查sys_securecmdd下PAM认证配置
如下所示,默认在sys_securecmdd部署后,启用了PAM认证。
[root@node201 pam.d]# cd /etc/.kes
[root@node201 .kes]# cat securecmdd_config |grep -i pam
UsePAM yes
三、问题解决
PAM实现应用程序认证功能,主要是调用PAM API接口来实现;应用程序调用PAM API接口,从而通过PAM服务(PAM Service Modules)实现配置的功能模块(PAM Modules)功能调用,完成认证服务。在后端还可与系统认证凭证、LDAP专用服务器实现认证信息交互。
方案1、禁用PAM认证(对于认证安全性要求较低,无需PAM认证的环境,可以禁用PAM认证)
如下所示,在所有节点配置文件中禁用PAM认证,并重启sys_securecmdd服务:
[root@node201 .kes]# cat securecmdd_config |grep -i pam
UsePAM no
方案2、配置PAM认证配置文件(需要启用PAM认证的环境)
PAM化的应用程序配置文件,主要由两部分构成。第一部分是PAM软件中,针对每一个应用程序构建独立的配置文件(路径:/etc/pam.d);第二部分是应用程序自身的配置文件,主要决定是否调用PAM功能模块。
1)sys_securecmdd的PAM认证配置文件创建
如下所示,默认sys_securecmdd的部署脚本sys_HAscmdd.sh,当执行脚本时会通过复制ssh的/etc/pam.d/sshd配置文件生成sys_securecmdd的PAM认证文件。
但是当/etc/pam.d/sshd缺失时,将无法创建sys_securecmdd的PAM认证文件。
[root@node201 bin]# cat sys_HAscmdd.sh
.......
## copy the /etc/pam/sys_securecmdd, do nothing if failed
if [ ! -f /etc/pam.d/sys_securecmdd ] && [ -f /etc/pam.d/sshd ]
then
cp -f /etc/pam.d/sshd /etc/pam.d/sys_securecmdd 2>/dev/null
fi
if [ -f /etc/pam.d/sys_securecmdd ]
then
sed "s/\(.*pam_tally2.so[ ]*\)$/#\1/g" /etc/pam.d/sys_securecmdd > ${share_dir}/pam_sys_securecmdd_temp && cat ${share_dir}/pam_sys_securecmdd_temp > /etc/pam.d/sys_securecmdd
[ -f ${share_dir}/pam_sys_securecmdd_temp ] && /bin/rm -f ${share_dir}/pam_sys_securecmdd_temp
fi
........
2)查看sys_securecmdd的PAM认证配置文件
# ssh的PAM认证配置文件
[root@node201 bin]# ls -lh /etc/pam.d/sshd
-rw-r--r-- 1 root root 904 Feb 5 15:20 /etc/pam.d/sshd
# sys_securecmdd的PAM认证配置文件
[root@node201 pam.d]# ls -lh /etc/pam.d/sys_securecmdd
-rw-r--r--. 1 root root 904 Aug 25 16:49 /etc/pam.d/sys_securecmdd
3)查看配置文件内容
[root@node201 bin]# cat /etc/pam.d/sys_securecmdd
#%PAM-1.0
auth required pam_sepermit.so
auth substack password-auth
auth include postlogin
# Used with polkit to reauthorize users in remote sessions
-auth optional pam_reauthorize.so prepare
account required pam_nologin.so
account include password-auth
password include password-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session required pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session required pam_selinux.so open env_params
session required pam_namespace.so
session optional pam_keyinit.so force revoke
session include password-auth
session include postlogin
# Used with polkit to reauthorize users in remote sessions
-session optional pam_reauthorize.so prepare
PAM 模块是按模块类型归类的。任何给定的模块至少要实现四种模块类型功能之一:
1. 验证模块(auth): 用于验证用户或设置/销毁凭证
2. 帐户管理模块(account): 将执行与访问、帐户及凭证有效期、密码限制/规则等有关的操作
3. 会话管理模块(session): 用于初始化和终止会话。
4. 密码管理模块(password)将执行与密码更改/更新有关的操作
如上所示,通过创建sys_securecmdd的PAM认证配置文件,sys_securecmdd连接问题解决。以上方案在CentOS、Kylin等系统下验证成功。
UOS系统版本较多,不同的版本/etc/pam.d/下PAM认证配置不同,方案2需要根据PAM的认证配置具体解决。
四、总结
对于sys_securecmdd配置UsePAM=yes,生产环境可能会影响到sys_securecmdd服务的连接,可以参考本文描述的解决方案进行处理。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」