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();