本文共 3272 字,大约阅读时间需要 10 分钟。
1、理论知识
1.1、PAM模块
1.1.1、PAM的介绍
Pluggable Authentication Modules简称PAM,是一个微缩的可插入认证模块(PAM is an acronym for Pluggable Authentication Modules)
1.1.2、PAM的结构
1)模块层(PAM服务模块) - PAM结构最底层
作用:为接口层提供用户鉴别等服务
1 2 | -- 验证用户名、密码、账号是否过期等 -- 完成账户管理、会话管理和口令管理等 |
2)应用程序接口层(PAM API) - PAM结构中间层
作用:
1 2 | -- 向上屏蔽用户鉴别等过程的细节 -- 向下调用模块层的具体模块提供特定的服务 |
接口分类:
接口与模块相对应类型(调用下层特定接口):
1 2 3 4 5 6 7 8 9 10 | -- 鉴别类接口 -- pam_authenticate() 鉴别用户 -- pam_setcred() 修改用户密码信息 -- 账号类接口 -- pam_acct_mgmt() 鉴别用户账号是否有权限登录以及账号是否过期 -- 会话类接口 -- pam_open_session() -- pam_close_session() -- 口令类接口 -- pam_chauthok() |
接口与模块不相对应(对底层模块提供支持以及实现应用程序与模块的通讯):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | -- 管理性接口 -- pam_start() 标记PAM事务开始 -- pam_end() 标记PAM事务结束 -- pam_get_item() 获取PAM事务状态信息 -- pam_set_item() 设置PAM事务状态信息 -- pam_str() 输出PAM事务错误信息 -- 应用程序与模块间通讯接口 -- pam_start() 应用程序初始化可调用此函数存放用户名之类的信息到PAM接口层 -- pam_putenv() 向应用程序传递特定的环境变量 -- pam_getenv() 获取应用程序环境变量 -- pam_getenvlist() 获取应用程序环境变量 -- 用户与模块间的通讯接口 -- pam_start()函数可通过会话式回调函数,让底层模块通过他读写模块相关的鉴别信息 -- 模块间通讯接口 -- 相互独立的模块可通过调用 pam_get_item()与pam_set_item()共享某些与鉴别会话有关的公共信息。 -- 读写模块状态信息接口 -- 接口pam_get_data()和pam_set_data()用于按照PAM句柄要求获取和设置特定的模块信息。 |
1 2 | 3)应用程序层 - PAM结构最上层 灵活调用中间层的各种鉴别功能接口 |
1.1.3、PAM验证文件配置目录
1 | ls /etc/pam .d/ |
显示如下:
1 2 3 4 5 6 7 | chfn newrole runuser ssh -keycat chsh other runuser-l su config-util passwd smartcard-auth sudo crond password-auth smartcard-auth-ac sudo -i fingerprint-auth password-auth-ac smtp su -l fingerprint-auth-ac remote smtp.postfix system-auth login run_init sshd system-auth-ac |
如上所示,其中sshd是sshd服务的验证文件(定义验证规则,服务找不到相应的验证文件则会与other匹配)
1.1.4、验证文件的语法
1)PAM的格式
vim编辑/etc/pam.d/sshd
配置文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 | #%PAM-1.0 auth required pam_sepermit.so auth include password-auth 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 optional pam_keyinit.so force revoke session include password-auth |
由以上可知PAM验证文件格式分为四列:
1 | module_type control_flag module_path module_optional |
2)module-type(模块类型)
1 2 3 4 | -- auth(验证模块) - 用于验证用户或设置/销毁凭证 -- account(账户管理模块) - 执行访问、账户及凭证有效期、密码限制/规则等操作 -- session(会话管理模块) - 初始化或终止会话 -- passwd (密码模块) - 执行密码更改或更新操作 |
3)control-flag(控制标记)
1 2 3 4 5 | -- required - 模块须有返值才通过验证,成功继续下一模块;失败需待同一stack中所有模块执行完才返值到应用程序 -- requisite - 模块须有返值才通过验证,成功继续下一模块;失败将不再执行同一stack内任何模块而返值给应用程序 -- sufficient - 模块返成功值则通过验证,成功则停止执行;失败值可忽略,继续执行下一模块 -- optional - 模块可选,模块返值对认证不起关键作用,无论成败都继续执行下一模块,返值一般被忽略 -- include - |
4)module-path(模块路径)
模块的位置查找
1 | find / -name pam_sepermit.so |
显示如下:
1 | /lib64/security/pam_sepermit .so |
如上所示:
模块位于“/lib64/security/”目录下(可只写模块名称,32位系统位置不同)
5)module-optional(模块选项,可选)
常见公用选项如下:
1 2 3 4 5 6 | -- debug - 该模块调用syslog()将调试信息写入系统日志 -- no_warn - 该模块不向应用程序发送警告信息 -- use_first_pass - 使用同一stack首次获取的密码(不向用户提示) -- try_first_pass - 尝试使用同一stack首次获取的密码(不通过则向用户提示) -- use_mapped_pass - 使用映射过的密码(不向用户提示) -- expose_account - 允许该模块显示用户账号等信息 |
1.2、PAM-MySQL的介绍
----------------------------------------------------------------------