基于Linux PAM的SSH认证企业级实践

在上一篇文章《基于Pam-Python模块Linux SSH双因子认证的实际应用》中我讲到了使用Linux PAM模块实现了对ssh登录进行的扩展认证模块。其中对PAM模块的认证机制做了详细的介绍并做了个简单的Demo实现,但考虑到工程化(项目规范程度以及对接企业内部统一认证平台等)以及安全性(如审计、python源码保护等)考虑,之前的Demo还不能满足到企业级使用需求。结合笔者最近在学习Go语言方面,于是想看看使用Golang能不能也造个轮子,在Github上搜了一些关于Golang在PAM上面,大多是通过CGO基于PAM的标准库(C语言)开发的。在简单学习了CGO基本使用后,就大体实现了这个Go语言版的PAM认证模块的雏形了。

基本代码框架如下所示:

在conv.go中,主要是封装实现了Conversation函数,以实现用户与ssh会话等交互消息:

在pam.go中,主要是通过CGO导出了pam相关的标准库接口(关于pam的标准库相关文档说明,可以参考:openpam文档)。所以在mypam.go中,只需要根据企业具体的认证平台对接并实现mypamAuthenticate逻辑即可。

在pam_c.go中,通过CGO封装实现了很多glibc中的通用函数,这里不一一说明,详细定义如下:

值得注意的是,在业务上层实现mypamAuthenticate函数时,笔者在使用Go标准库的net/http进行socket发送数据包时发现无法无法使用net/http库。调试了会貌似还是没解决问题,于是就用C语言版socket TCP发包函数并使用CGO封装了下使用,具体实现如下:

至此,就基本使用Golang语言实现的PAM的相关认证的底层设计了。在笔者的工程化实践中,通过mypamAuthenticate函数在业务上层实现了2fa认证,本地认证(基于session cache,类似Kerberos实现,在离线状态下的认证)和远端认证(对接企业内部的统一认证平台),以及多种认证的组合形式,达到了较为灵活且定制化的ssh授权认证管理中心。通过授权认证管理中心可以让谁在什么指定的时间,指定的客户端ip源,指定的账户进行授权访问。以及对登录登出的log进行记录并审计,通过实现pam_sm_open_session和pam_sm_close_session函数,可以将用户关联到实现shell的session以记录所有执行的shell命令。

 

参考文档:

openpam接口文档:https://fossies.org/dox/openpam-20190224/

PAM 模块开发入门:http://www.rkeene.org/projects/info/wiki/222

PAM开发实现2fa:https://ben.akrin.com/?p=1068

PAM相关开源项目参考:https://developers.yubico.com/yubico-pam/

Uber开源的ssh-pam模块:https://github.com/uber/pam-ussh

 



这篇博文由 s0nnet 于2020年01月31日发表在 GNU/Linux, Go语言, Linux系统, 代码艺术, 安全工具, 网络安全 分类下, 通告目前不可用,你可以至底部留下评论。
如无特别说明,独木の白帆发表的文章均为原创,欢迎大家转载,转载请注明: 基于Linux PAM的SSH认证企业级实践 | 独木の白帆
关键字: , ,

基于Linux PAM的SSH认证企业级实践:等您坐沙发呢!

发表评论

快捷键:Ctrl+Enter