Controlling Authentication wiht PAM —— 通过 PAM 控制身份认证

2023-03-20
2023-03-23
5 min read
Hits

  本文是 RHCSS 培训课程第五节课的内容,博主结合红帽官方英文教材《RH415-RHEL7.5 Controlling Authentication wiht PAM》和红帽讲师翻译的中文教材《第五章 通过 PAM 控制身份认证》整理了如下笔记。

几行代码

/usr/lib64/libpam.so.*     # PAM 核心库文件
/etc/pam.d/     # 大多数 PAM 配置文件存放目录
/etc/security/     # 部分 PAM 模块的额外配置文件存放目录
/usr/lib64/security/     # PAM 模块存放目录
/etc/security/limits.conf     # 可以限制用户对系统资源的使用,如 stack、CPU……
ulimit -a     # 读取 limits.conf 和 limits.d
change -l student     # 查看 student 用户账号什么时候过期
tail -f /var/log/secure     # 实时显示 secure 日志
journalctl -ef     # 跳转到日志尾部且保持显示最新日志
date -s "2023-03-18 20:00:00"     # 更改当前系统时间
sudo timedatectl set-time "2023-03-18 20:00:00"     # 更改当前系统时间,但如果本地采用了上游 NTP 时间同步服务器,那么无法使用该命令更改时间,只能通过 date 命令强行修改
grep pam_access.so /etc/pam.d/system-auth-ac /etc/pam.d/password-auth-ac     # 查看两个 auth-ac 文件中的 pam_access.so 模块
authconfig --enablepamaccess --update     # authconfig 启用本地授权控制,将系统配置在 /etc/security/access.conf 中查找系统授权策略
ip -br a s     # 以表格形式打印所有网卡的 IP
grep operators /etc/groups     # 查看 operators 组中有哪些用户
man 5 system-auth     # 可查看 system-auth 和 password-auth 的区别,除此之外还有 fingerprint-auth 和 smartcard-auth
man pwquality     # 可以搜索 enforce 和 enforce_for_root 强制检测主配置文件中的密码复杂度要求与 root 输入的密码复杂度是否一致
cd /etc/security     # 该目录下的 opasswd 记录历史密码
less /var/log/secure     # 在该日志中搜索 password 查询密码更改时间
usermod -L devops     # 锁定用户 devops,即在 /etc/shadow 中该用户的密码前面加上感叹号

几个知识点

systemd-journald: 在系统 boot 早期即启动,日志存储于内存中

rsyslog: 相较于 systemd-journald 日志系统较晚启动,一般在系统启动中系统控制权交由 systemd 交管后才启动

以上两者的关系:systemd-journald 日志系统不区分日志类型,rsyslog 区分日志的类型与等级并且可将日志于 /var/log/ 中落盘归档

所以通过此命令 journalctl -ef 可以追踪出用户账号为什么无法登陆(Access Denied)

/etc/passwd 中只有“x”作为密码占位符,/etc/shadow 中储存密码

改密码复杂度优先改 /etc/security/pwquality.conf,尽量不要动 /etc/pam.d/ 中的“*ac”文件,且前者的优先级高于 /etc/login.defs

/etc/pam.d/system-auth-ac 中“authtok_type =”后不要加双引号和空格,双引号会被当作要输出的字符串,空格及后面的内容会被忽略

/etc/hosts.deny/etc/hosts.allow 属于 tcp-wrapper 四层防火墙,与 PAM 没有直接关系

/etc/pam.d/system-auth

文件规则格式

authrequiredpam_faildelay.sodelay=2000000
type flagcontrol flagPAM 模块名称PAM 模块参数

  每个管理组中的 PAM 规则顺序相当重要,PAM 规则

第一列 type flag

  第一列为 type(类型),将不同的测试阻止在四种 management groups(管理组)中,分别为 auth、account、password、session

  位于 type 前的“-”表示当 PAM 模块不存在时跳过规则测试

PAM 规则类型

  1. auth(认证管理):接受用户名与密码,对该用户的密码进行认证等
  2. account(账户管理):检查账户是否允许登陆系统,密码是否过期,账号登陆是否存在时间限制等
  3. password(密码管理):管理用户的密码更改,该管理组不执行认证与授权
  4. session(会话管理):提供对会话的管理与记账

第二列 control flags

控制类型

  1. required:该模块必须返回成功才通过认证,若该模块返回失败,失败结果不立即通知用户,而是等到同一管理组中的所有模块全部执行完成后再将失败结果返回至应用程序(必要条件)
  2. requisite:与 required 类似,该模块必须返回成功才通过认证,区别在于,一旦模块返回失败,将不再执行同一管理组中的任何模块,而是直接将控制权返回至应用程序(必要条件)
  3. sufficient:该模块返回成功已足以通过认证,不比再执行该管理组内的其他模块,若该模块返回失败可忽略结果(充分条件)
  4. optional:该模块可选,其返回成功与否一般对身份认证不起关键作用,其执行结果不影响其他模块的执行,返回至一般被忽略

控制类型执行结果汇总

Control FlagsResultKeep testAffect
RequiredPassYDefine by system
RequiredFailYFail
RequisitePassYDefine by system
RequisiteFailNFail
SufficientPassNOk
SufficientFailYignore
OptionalPassYignore
OptionalFailYignore

控制类型执行结果示例

///user1user2user3
AuthRequiredModule1PassFailPass
AuthRequiredModule2PassPassFail
AuthRequiredModule3PassPassFail
Result--PassFailFail
AuthRequiredModule1PassFailPass
AuthSufficientModule2PassPassFail
AuthRequiredModule3N/AN/APass
Result--TFT

required 与 requisite 对应的 PAM 模块只要返回失败,其所在的管理组最终返回失败,区别只是在于是否继续执行其同一管理组中的后续测试

/etc/shadow

grep student /etc/shadow     # 查看 /etc/shadow 中 student 相关条目得到如下结果
student:$6$8oIjLCsc$/n1iQXYh1E6.uOEuJKgioqAtmqm2TQmkJGF2RwyteIr1tIfrPdiRYgWe6Sjen5/eMij2uHM/a1tue/QRlo3X80:17689:0:99999:7:::
  • $6:对应 /etc/login.defs 最后一行的 SHA256
  • 17689:上次修改密码时间(不一定)
  • 0:相隔多少天可以修改密码,仅对非 root 用户生效,对 root 不生效
  • 99999:密码多久到期,99999 意为永不过期
  • 7:密码到期前七天提醒
  • 倒数第三个空(倒数第三个冒号和倒数第二个冒号之间):密码过期几天锁定
  • 倒数第二个空(倒数最后两个冒号之间):账户过期日期,即账户过期几天锁定
  • 最后一个空(最后一个冒号后):保留位

修改 PAM 配置

PAM 控制出问题需要在系统引导时进入 Emergency(紧急模式)或挂载 iso 镜像进入拯救模式(所以修改 PAM 策略必须慎之又慎!在确认修改无误前务必保持救援终端打开!)

sudo authconfig --savebackup=<backup_dir>     # 备份 PAM 配置文件
sudo authconfig --restorebackup=<backup_dir>     # 恢复 PAM 配置文件
cp system-auth-ac system-auth-local     # 创建 system-auth-local 用来配置 system-auth-ac 避免 authconfig 命令覆盖配置
cp password-auth-ac password-auth-local     # 创建 password-auth-local 用来配置 password-auth-ac 避免 authconfig 命令覆盖配置
rm system-auth password-auth     # 删除原有的两个软链接
ln -s system-auth-local system-auth     # 将 system-auth-local 链接至 system-auth
ln -s password-auth-local password-auth     # 将 password-auth-local 链接至 password-auth
vim system-auth-local     # 添加以下命令使其包含 system-auth-ac 配置
auth     include   system-auth-ac
account  include   system-auth-ac
password include   system-auth-ac
session  include   system-auth-ac
vim password-auth-local     # 添加以下命令使其包含 password-auth-ac 配置
auth     include   password-auth-ac
account  include   password-auth-ac
password include   password-auth-ac
session  include   password-auth-ac

PAM 关键模块

  • pam_time.so(配置文件:/etc/security/time.conf):限制一个或多个用户以及用户组在指定时间内的登录(登录可以是本地 login 也可以是远程 ssh,telnet 不做考虑)
  • pam_access.so(配置文件:/etc/security/access.conf):限制用户或用户组从指定的 IPv4、IPv6、主机名或域名到节点登录
  • pam_pwquality.so(配置文件:/etc/security/pwquailty.conf):更改密码复杂度、限制用户的密码更改以及密码更改的交互信息
  • pam_pwhistory.so:记录 passwd 命令对指定用户的密码更改历史于 /etc/security/opasswd
  • pam_faillock.so:锁定失败登录的用户(只针对明文口令,与密钥无关)
Avatar

Hui.Ke

❤ Cyber Security | Safety is a priority.