Linux 之旅 12:PAM模块和用户通讯
实际上本篇的内容与上篇Linux 之旅 11:Linux 账号管理与 ACL 权限设置是前后关联的,因为篇幅原因拆分成了两篇发布。
使用者的特殊shell与PAM模块
/sbin/nologin
像之前说的,在账户设置中使用/sbin/nologin
作为登录用shell的账号将不能登录。特别的,如果需要给这些用户在不能登录时显式特定的内容,可以将内容写入/etc/nologin.txt
:
[root@xyz ~]# usermod -s '/sbin/nologin' user1
[root@xyz ~]# echo 'you use a shell without login' >> /etc/nologin.txt
[root@xyz ~]# cat /etc/nologin.txt
you use a shell without login
如果使用user1
进行登录,将看到:
❯ ssh user1@192.168.1.105
user1@192.168.1.105's password:
Last login: Sat Aug 21 17:29:44 2021
you use a shell without login
Connection to 192.168.1.105 closed.
当然,如果有必要,记得将
user1
的登录用shell修改回来。
PAM
PAM的全称是Pluggable Authentication Modules(插入式验证模块)。实际上PAM是一组API,可以定制验证流程,并在程序的实际运行中调用以完成身份验证。
PAM设置
通常,我们会为PAM添加一个与程序同名的配置文件作为验证流程的配置项,比如当你执行passwd
时,涉及身份验证的部分的执行流程是这样的:
- 执行
/bin/passwd
,并输入密码。 - 调用PAM进行验证工作。
- PAM从
/etc/pam.d/
目录中寻找与passwd
同名的配置文件,并加载。 - 根据加载的配置内容,调用相应的PAM模块完成验证工作。
- 将验证结果返回给
passwd
程序。
如果查看/etc/pam.d/passwd
,其内容如下:
[root@xyz ~]# cat /etc/pam.d/passwd
#%PAM-1.0
auth include system-auth
account include system-auth
password substack system-auth
-password optional pam_gnome_keyring.so use_authtok
password substack postlogin
内容包含三列信息,分别是:验证类型,控制标识以及模块。
验证类型
验证类型主要分为以下几种:
-
auth
auth(authentication)主要用于验证用户身份,通常需要使用密码。
-
account
主要用于授权,检验用户是否有相应的权限。
-
session
用于管理该次命令执行时PAM设置的环境信息。
-
password
提供验证的修订任务,主要是修改密码。
需要说明的是这四种验证类型通常是有执行顺序的,通常需要先进行身份验证(auth),通过后才会进行授权(account),然后才是管理环境信息(session),最后根据需要可能会修改密码(password)。但这也并不绝对。
验证控制标识
验证控制标识(control flag)的作用有点像编程语言或shell scripts
中的控制流程,即使用不同的控制标识可以控制其后的验证模块的执行过程。
看完主要的控制标识介绍你就会明白我说的是什么意思:
-
required
无论成功失败,都将继续后续的验证流程。通常用于日志功能。
-
requisite(必要)
如果失败,则立即终止验证流程,并返回
failure
,如果成功,继续验证流程。 -
sufficient(充分)
如果成功,则立即终止验证流程,并返回
success
,如果失败,则继续验证流程。与requisite
逻辑相反。 -
optional
大多数情况下只起显式信息的作用,不影响验证流程。
那个include
并非控制标识,而是类似于C++或PHP中的效果,可以使用include
加载额外的PAM配置。
常用模块简介
PAM相关的文件主要有:
/etc/pam.d/*
:PAM配置文件/lib64/security/*
:PAM模块文件/etc/security/
:PAM环境配置文件/usr/share/doc/pam-*/
:PAM说明文件
下面通过login
程序介绍主要的PAM模块。
先查看login
的PAM配置:
[root@xyz ~]# cat /etc/pam.d/login
#%PAM-1.0
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth substack system-auth
auth include postlogin
account required pam_nologin.so
account include system-auth
password include system-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session required pam_loginuid.so
session optional pam_console.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session required pam_selinux.so open
session required pam_namespace.so
session optional pam_keyinit.so force revoke
session include system-auth
session include postlogin
-session optional pam_ck_connector.so
用到的PAM模块主要有:
-
pam_securetty.so
:限制管理员仅能从安全的终端登录。 -
pam_nologin.so
&#