在上一篇中,描述了如何编译pam_python.so,本篇的主要就是写后续如何使用pam_python进行pam模块的配置。
1、编写鉴权脚本
在上篇part1 中编译的pam_python.so可以用Python代码进行一些额外的验证操作。动态密码,虚拟账号,都是可行的,只要编写的python鉴权脚本符合相应的PAM规范即可使用。
鉴权脚本可以理解为接收到相应的账号密码,通过校验来决定是否通过认证。在本示例中使用一个固定的pin码来完成demo。在实际工作中可以使用googleauth等二次验证方式来作为密码作为验证条件。
#!/usr/bin/env python
# -*- coding=utf-8 -*-
def pam_sm_authenticate(pamh, flags, argv):
# 获取用户名和密码
try:
user = pamh.get_user()
password = pamh.authtok
except pam.exception as e:
return e.pam_result
# 进行用户认证 这里设定为 用户名 test 密码 51
if user == "test" and password == "51cto":
return pam.PAM_SUCCESS
else:
return pam.PAM_AUTH_ERR
"""
#以下都是默认函数
"""
def pam_sm_setcred(pamh, flags, argv):
return pamh.PAM_SUCCESS
def pam_sm_acct_mgmt(pamh, flags, argv):
return pamh.PAM_SUCCESS
def pam_sm_open_session(pamh, flags, argv):
return pamh.PAM_SUCCESS
def pam_sm_close_session(pamh, flags, argv):
return pamh.PAM_SUCCESS
def pam_sm_chauthtok(pamh, flags, argv):
return pamh.PAM_SUCCESS
将以上脚本保存为 /lib64/security/auth.py
当然,这个auth.py只是一个非常简单的示例。在实际使用中,可以接入ldap,使用ldap进行鉴权。也可以使用基于时间的动态密码来鉴权。具体怎么做就看需求了。前公司曾有这样的做法,就是使用个人密码+六位动态数字作为鉴权密码。甚至使用机器的硬件信息+个人密码。
2 配置PAM模块
运维同学在使用搭建ssh openvpn vsftp等服务过程中都会或多或少的接触过使用PAM进行验证。大部分都是直接通过系统账户,或者虚拟账号来进行鉴权。以vsftp为例,pam的配置如下:
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser_list
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser_list
示例配置就是使用db2 数据库来存储账号名以及密码。
在本文中,我们使用之前vsftp的pam文件进行相应的配置修改。vsftp搭建,通过虚拟用户配置实现权限个性化设置需求
vim /etc/pam.d/vsftpd.vuser
auth requisite pam_python.so auth.py
auth required pam_sepermit.so
auth include password-auth
配置完成后重启vsftp服务
使用账号 test 密码 51cto进行验证