1.说明
1.1 文档参考资料
- https://www.chiark.greenend.org.uk/doc/libpam-doc/html/Linux-PAM_ADG.html
- http://www.fifi.org/doc/libpam-doc/html/pam_appl-3.html
- pdf文档: https://fossies.org/linux/Linux-PAM-docs/doc/adg/Linux-PAM_ADG.pdf
- linux-pam 中文文档
- pam 旧文
- pam教程: https://thelinuxcode.com/linux_pam_tutorial/
- redhat介绍- pam: https://www.redhat.com/sysadmin/pluggable-authentication-modules-pam
- http://uw714doc.sco.com/en/SEC_pam/pam-4.html
- https://docs.freebsd.org/fr/articles/pam/#pam-sample-module
- pam体系架构
1.2 代码实现参考
可以参考一份google的TFA实例代码: https://github.com/google/google-authenticator-libpam
1.3 pam架构


2.在ubuntu上测试2FA
 
实验机器版本:
 
 使用验证App,名称为:authenticator(苹果手机):
 
 
2.1 编译与安装以及验证
下载代码:https://github.com/google/google-authenticator-libpam. 需要提前在linux主机上安装程序:
# sudo apt-get install autoconf automake libtool
# sudo apt install libpam0g-dev
# sudo apt install qrencode
接着安装代码:
# ./bootstrap.sh
# ./configure
# make
# sudo make install
编译安装完成后,打印信息如下:
 
 安装完成之后,执行命令:
# google-authenticator
可以看到QR code:
 
 
 修改文件:/etc/ssh/sshd_config内容:
ChallengeResponseAuthentication yes  //默认为no
修改文件:/etc/pam.d/sshd内容:
auth required pam_google_authenticator.so
重启启动ssh服务:
# sudo /etc/init.d/ssh restart
接着登录ssh,可以看到:
 
2.2 添加nullok参数验证
 
在以上配置的基础上,修改文件/etc/pam.d/sshd内容为:
...
auth required pam_google_authenticator.so nullok
...
重启ssh服务:
# sudo /etc/init.d/ssh restart
此时,登录仍然需要2FA密码.
 
 看一下目录 ~/.google_authenticator文件,存在以下内容:
N6DXZP4C2LHUYQSGMSWSXKCI34
" RATE_LIMIT 3 30 1728267304
" WINDOW_SIZE 17
" DISALLOW_REUSE 57608909
" TOTP_AUTH
24389978
41946909
49420241
17552925
43255031

 删除文件~/.google_authenticator:
# sudo rm ~/.google_authenticator
重启ssh服务。再次登录,可以看到不需要2FA了。
 
 当然,作为对比,可以将nullok去掉,继续本节的测试,发现是没办法登录的。
3.基于SSH实现自己的SPI内容
 
根据pam体系架构,SSH已然将API函数实现了。如果需要增加一个新的验证功能函数,只需要实现SPI部分。
参考测试源码: https://gitee.com/wit_yuan/wityuan_pamtest
编译代码:
# make
拷贝生成的库文件:
sudo cp libpam_wityuan.so /usr/lib/x86_64-linux-gnu/security/
在文件/etc/pam.d/sshd中添加:
...
auth required libpam_wityuan.so
...
重启SSH,然后登录SSH,可以看到如下测试效果:
 
3.BMC自定义使用PAM认证
 
BMC实现自己的PAM认证方法,可以采取如下步骤:
- 1.建立so,定义SPI。
- 2.在目录/etc/pam.d/下创建service文件,例如mytfa
- 3.使用如下结构使用pam认证
pam_start()
pam_set_item()
pam_get_item()
pam_authenticate();
pam_end();