0. 简介
PAM: Pluggable Authentication Modules
插件式鉴别模块,由Sun提出的一种认证机制。它通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于向系统中添加新的认证手段。
1. PAM体系结构
app1 app2 app3 应用层
|
PAM-API <=> /etc/pam.d 接口层
|
mod1 mod2 mod3 模块层
2.相关文件
/usr/lib/libpam.so.* ## 核心库
/etc/pam.d/* ## PAM各个模块的配置文件
/lib/security/pam_*.so ## 可动态加载的PAM模块
/lib64/security/pam_*.so
3. PAM配置文件格式
Module-type Control-flag Module-path Module-arguments
3.1 Module-type 验证类型
- auth 用户身份验证,提示输入用户名和密码
- account 对用户进一步验证。用户是否过期、权限多大,限制当前可用资源等
- password 对密码精确控制。密码使用期限,重复输入的次数,密码锁定后的解禁期限等
- session 对每个会话进行跟踪和记录。登录用户名,登录时间,次数等
3.2 Control-flag 控制验证过程中动作和返回结果方式
- required 当验证失败时仍继续进行下面的验证,它会返回一个错误信息,但是由于不停止后面的验证过程,因此用户不知道哪项规则验证失败
- requisite 与required大体相似,但只要某项规则验证失败则结束整个验证过程,并返回一个错误。它能够防止一些暴力猜接密码工具,但由于返回信息给用户,因此可能将系统用户信息透露给攻击者
- sufficient 只要有一项规则验证通过,将会立即终止后面的所有验证。不论前的required是否成功,它依然被忽略,然后通过验证
- optional 验证成功与否不重要,所有结果都忽略。session常用
3.3 Module-path 验证模块
3.4 Module-arguments 模块参数
验证模块库
- pam_access 一般与account验证类型一起使用。提供基于用户名、主机名、域名,公网IP地址或网络号,已经非网络登录时的tty名称访问控制。
vi /etc/security/access.conf
permission : users/groups : origins
permission:"+“允许,”-"禁止
users/(groups):ALL任何人
origins: 非网络登录的tty名称、主机名、域名(以“.”开始)、主机地址、网络号(以“.”结束)、带有子网掩码的公网IP地址,以及ALL(表示任何主机)和LOCAL只要不包含“.”的所有字符)。还可以使用EXCEPT操作符来表示除…之外
# Disallow non-root logins on tty1
-:ALL EXCEPT root:tty1
# Disallow console logins to all but a few accounts.
-:ALL EXCEPT wheel shutdown sync:LOCAL
# root should get access from network 192.168.201.
+ : root : 192.168.201.
- pam_limit 通常与session验证类别一同使用。用来限制用户在会话过程中对系统资源的使用,即使UID=0的用户也受它的限制。此模块使用一个独立的配置文件来设置对系统资源的限制情况
vi /etc/security/limits.conf
<domain> <type> <item> <value>
domain: username、@group、“*”任何用户、“%”通配符来只限制maxlogins,并可以采用%group的语法格式。
type: soft:允许用户所使用的系统资源在设定值上下浮动
hard:对系统资源的使用率不能超过设定值
item:
nproc: max number of processes
nofile: max number of open files
oracle - nproc 16384
oracle - nofile 65535
* soft nofile 15000
* hard nofile 65536
-
pam_time 通常与account验证类型一起使用,不提供验证服务,只用来限制用户在指定的日期、时间及终端线路上对系统或特定运用程序进行访问
vi /etc/security/time.conf -
pam_unix 适用所有的验证类型
auth: 验证用户密码的有效性。参数有debug、audit、use_first_pass、try_first_pass、nullok和nodelay
account: 执行建立用户帐号和密码状态的任务,然后提示用户修改密码,用户采用新密码后才提供服务之类的任务。参数有debug、audit
password: 完成让用户更改密码的任务。参数有debug、 audit、 nullok;、not_set_pass、use_authtok、try_first_pass、use_first_pass、md5、bigcrypt、shadow、nis
session: 仅仅完成记录用户名和服务名到日志文件的工作。无参数
参数说明:
audit 比debug更多诊断调试
nullok 允许空密码
nodelay 取消用户验证失败后,系统错误提示延时(2s)
try_first_pass 防止用户新设定的密码与旧密码相同
use_authok 强制用户使用前面堆叠验证模块提供的密码
-
pam_deny 禁止所有的访问
-
pam_permit 允许所有的访问
-
pam_security 只对root用户有影响。当root用户登录时,会参考/etc/securetty目录中的控制终端列表,来保证root用户不会从不安全的终端登录。它一般与auth验证类型一现使用。
-
pam_nologin 如果/etc/nologin文件存在,禁止所有的登录,一般与auth和account验证类型一同使用。
-
pam_wheel 只有加入到了一个wheel group中的用户,并且密码有效,才能访问指定的服务或系统。
-
pam_cracklib 用来检查密码是否违反密码字典,只与password验证类型一起用
通过插入password堆 栈,为特殊的应用提供可插入式密码强度性检测。 它的工作方式就是先提示用户输入密码,然后使用一个系统字典和一套规则来检测输入的密码是否不能满足强壮性要求。密码的强度检测分二次进行,第一次只是检测密码是否是提供的对比字典中的一部分,如果检测结果是否定的,那么就会提供一些附加的检测来进一步检测其强度,例如检测新密码中的字符占旧密码字符的比例,密码的长度,所用字符大小写状况,以及是否使用了特殊字符等
debug
retry=N 重试次数
difok=N 新旧密码不同的字符数
minlen=N 密码最小长度
dcredit=N 最大数字个数。N=2,最多2个数字;N=-2,至少2个数字
lcredit=N 最大小写字母个数
ucredit=N 最大大写字母个数
ocredit=N 最大特殊字符个数
minclass=N 密码最少包含的字符种类(d, l, u, o)
dictpath=/path/to/dict 密码字典路径 -
pam_passwdqc: Password quality-control
mix=N 口令最小长度,默认mix=disabled
max=N 口令最大长度,默认max=40
passphrase=N 口令中单词最少个数,默认passphrase=3, 若为0则禁用该功能
match=N
similar=permit|deny 新旧口令是否能相似
random=N 随机口令默认长度,默认random=42,若为0禁用该功能
enforce=none|users|everyone 约束范围
retry=N 口令输入允许重试次数,默认retry=3