PAM
PAM
PAM即可插拔认证模块(Pluggable Authentication Module--PAM)。它采用模块化设计和插件功能,使用户可以轻易地在应用程序中插入新的认证模块或替换原先的组件,同时不需要对应用程序做任何修改,从而使软件的定制、维持和升级更加轻松。因为认证和鉴别机制与应用程序之间相对独立,所以应用程序可以通过PAM API,来方便地使用PAM提供的各种鉴别功能,而不需要了解太多的底层细节。
配置文件
PAM配置文件放到“/etc/pam.d/”目录下。如下图所示,第一列代表模块类型、第二列代表控制标记、第三列代表模块路径、第四列代表模块参数。

模块类型
Linux-PAM有四种模块类型,分别代表四种不同的任务,它们是:认证管理(auth)、帐号管理(account)、会话管理(session)和密码(password)管理。一个类型可能有多行,它们按顺序依次由PAM模块调用,管理方式如下:
■auth:用来对用户的身份进行识别。如:提示用户输入密码,或判断用户是否为root等。
■account:对帐号的各项属性进行检查。如:是否允许登录、是否达到最大用户数,或是root用户是否允许在这个终端登录等。
■session:用来定义用户登录前的,及用户退出后所要进行的操作。如:登录连接信息、用户数据的打开与关闭、挂载文件系统等。
■password:使用用户信息来更新。如:修改用户密码。
控制标记
PAM使用控制标记来处理和判断各个模块的返回值。
■required:表示即使某个模块对用户的验证失败,也要等所有的模块都执行完毕后,PAM才返回错误信息。这样做是为了不让用户知道被哪个模块拒绝。如果对用户验证成功,所有的模块都会返回成功信息。
■requisite:与required相似,但是如果这个模块返回失败,则立刻向应用程序返回失败,表示此类型失败,而不再进行同类型后面的操作。
■sufficient:表示如果一个用户通过这个模块的验证,PAM结构就立刻返回验证成功信息(即使前面有模块fail了,也会把fail结果忽略掉),把控制权交回应用程序。后面的层叠模块即使使用requisite或者required控制标志,也不再执行。如果验证失败,sufficient的作用和optional相同。
■optional:表示即使本行指定的模块验证失败,也允许用户接受应用程序提供的服务,一般返回PAM_IGNORE(忽略)。
模块路径
模块路径即要调用模块的位置。统信服务器操作系统保存在“/etc/security”,可以出现在不同的类型中。它在不同的类型中所执行的操作都不相同。这是由于每个模块针对不同的模块类型,编制了不同的执行函数。
常用模块介绍
pam_limits.so
■概述:统信服务器操作系统提供了pam_limits.so用户资源限制模块。该模块的主要功能是限制用户会话过程中对各种系统资源的使用情况。系统支持通过配置limits.conf实现对用户、用户组可使用的系统资源进行分配和限制,从而确保用户和主体不会独占某种受控的资源。系统中的资源分配按最大额的要求进行分配。
■配置文件:统信服务器操作系统中用户资源限制的配置文件是“/etc/security/limits.conf”。
■功能测试
执行如下命令,创建测试用户。
[root@localhost pam.d]# useradd test1
[root@localhost pam.d]# useradd test2
[root@localhost pam.d]# passwd test1
Changing password for user test1.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[root@localhost pam.d]# passwd test2
Changing password for user test2.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
执行如下命令,在配置文件“/etc/security/limits.conf”中添加如下所示的内容,限制用户test1登录到SSH服务器时的最大连接数。
[root@localhost pam.d]# vim /etc/security/limits.conf
test1 hard maxlogins 2
在另外一台测试机上,使用SSH连接本机服务器。如下图所示,可以正常开启两个终端连接到服务器。当登录第三个时,提示“Too many logins for‘test1’”信息,无法登录ssh服务器。
```bash
[root@localhost worketst]# who
testl
pts/0
2020-05-2301:57(::1)
pts/2
2020-05-2222:12(192.168.0.163)
root
root
pts/5
2020-05-2223:19(192.168.0.127)
root
pts/6
2020-05-2223:43(92.168.0.127)
test1
pts/8
2020-05-2301:57(::1)
[root Localhost worketst]# ssh test1gLocalhost
test1@Localhost's password:
web console:https://localhost:9090/ or https://92.168.0.17:9090
Too many logins for 'test1'.
Last Login:Sat May 23 02:06:062020 from::1
Connection to Localhost closed.
[root@Localhost worketst]#
#### pam_cracklib.so
■概述:统信服务器操作系统提供了pam_cracklib.so模块对用户登录系统的密码进行了安全加固。该模块主要的作用是对用户密码的强健性进行检测,即检查和限制用户自定义密码的长度、复杂度和历史等。用户第一次登录系统后被要求强制修改登录密码,并且对用户密码进行强度校验,即采用强化密码管理,并在每次用户登录系统时进行鉴别。通过对pam模块相关配置文件的修改,就可以实现一定的用户密码复杂度。
■常用选项
|选项|说明|
|---|---|
|retry=N|定义登录/修改密码失败时,可以重试的次数。|
|difok=N|定义新密码中必须至少有几个字符要与旧密码不同。但是如果新密码中有1/2以上的字符与旧密码不同时,该新密码将被接受。|
|minlen=N|定义用户密码的最小长度。|
|dcredit=N|定义用户密码中必须至少包含多少个数字。|
|ucredit=N|定义用户密码中必须至少包含多少个大写字母。|
|lcredit=N|定义用户密码中必须至少包含多少个小些字母。|
|ocredit=N|定义用户密码中必须至少包含多少个特殊字符(除数字、字母外)。|

:::note
参数credit=-1,表示至少有一个的意思。
:::
■功能测试
执行如下命令,在配置文件的最后增加pam_cracklib.so的配置。
```bash
[root@localhost pam.d]# cat passwd
#%PAM-1.0
This tool only uses the password stack.
password substack system-auth
-password optional pam_gnome_keyring.so use_authtok
password substack postlogin
password requisite pam_cracklib.so retry=3 minlen=8 difok=3
[root@localhost pam.d]#
248修改用户密码,使用12345678与123456进行密码测试。
```bash
[root@localhost Desktop]#passwd
更改用户root的密码
新的密码:
重新输入新的密码
密码最少8位,至少同时包含小写字母、大写字母、数字、符号中的3种,且密码不能与用户名一致
新的密码:
无效的密码:
过于简单化/系统化
无
效的密码:过于简单
重
新输入新的密码:
passwd:鉴定令牌操作错误
#### pam_access.so
■概述:统信服务器操作系统中提供了pam_access.so模块实现用户登录IP限制。该模块主要的功能和作用是根据主机名(包括普通主机名或者FQDN)、IP地址和用户实现全面的访问控制。此模块的具体工作行为根据该模块的相应配置文件来决定。
■配置文件:统信服务器操作系统中用户登录时间限制的配置文件为“/etc/security/access.conf”。该配置文件包含了三个字段,即权限、用户和访问发起方,用“:”隔开。
◆第一个字段:权限(permission)。“+”表示授予权限,“-”表示禁止权限。
◆第二个字段:用户(user)。定义了用户、组,以及使用“@”表示的在不同主机上的相同用户和同一主机上的不同用户。
◆第三个字段:访问发起方(origins)。定义了发起访问的主机名称、域名称、终端名称。
■功能测试
执行如下命令,创建测试用户testuser1。
```bash
[root@localhost pam.d]# useradd testuser1
执行sudo vi /etc/pam.d/sshd命令,在配置文件中添加如下行。
account required pam_access.so
执行vi /etc/security/access.conf命令,在文件中添加内容如下:
#允许用户testuser1从IP地址为192.168.100.6的主机远程登录本机
+:testuser1:192.168.100.6
#拒绝用户testuser1从IP地址为192.168.100.20的主机远程登录本机
-:testuser1:192.168.100.20
在192.168.100.6的终端,使用用户testuser1、以SSH方式登录远程主机,显示结果为用户testuser1远程登录成功。
在192.168.100.20的终端,使用用户testuser1、以SSH方式登录远程主机,显示结果为登录失败。
pam_time.so
■概述:统信服务器操作系统中提供了pam_time.so模块实现用户登录时间的限制,该模块主要的功能和作用是能控制用户在指定的时间段登录系统。
■配置文件:登录统信服务器操作系统的方式有三种,包括tty方式、ssh登录方式和图形登录方式。根据登录方式的不同,对应的配置文件如下。
◆/etc/pam.d/login:tty登录方式的配置文件。
◆/etc/pam.d/sshd:ssh登录方式的配置文件。
◆/etc/pam.d/lightdm:图形登录方式的配置文件。
其中,限制用户登录时间的配置文件为:/etc/security/time.conf。
■功能测试
执行如下命令,创建测试用户testuser1。
useradd -m -s /bin/bash testuser1
在终端界面,切换到/etc/pam.d目录下。
在配置文件login和sshd中在找到“account requisite pam_time.so”,确定该行前没有注释符号“#”。如果没有此行内容,则增加该内容。
执行sudo vi /etc/security/time.conf命令,在文件中添加如下内容。
#限制testuser1在18点~22点不能以login方式登录系统。
login;*;testuser1;!Al1800-2200
#限制testuser1在18点~22点不能以SSH方式登录系统。
sshd;*;testuser1;!Al1800-2200

:::note 执行date命令,确认系统时间在18:00-22:00时间段。若不在该时间段,可以执行date命令,修改为该时间段。 :::
在另外一台设备上,在18:00-22:00时间段内,通过ssh连接。提示远程服务连接关闭。
pam_pwquality.so
■概述:该模块由libpwquality提供,用于检测密码是否符合设定的密码策略。
■配置文件:如需在验证密码时使用该模块,需在“/etc/pam.d/system-auth”和“/etc/pam.d/password-auth”的配置文件中,配置如下内容。
password requisite pam_pwquality.so try_first_pass local_users_only retry=1 enforce_for_root

:::note retry表示设置密码时,第二次重复输入密码错误,可以重复尝试的次数。enforce_for_root表示root用户设置密码也需符合密码策略的配置。 :::
该模块使用的密码策略的配置文件为“/etc/security/pwquality.conf”,该模块的常用配置如表5.2所示。
| 参数 | 描述 |
|---|---|
| minlen = 8 | 密码长度不小于8位。 |
| minclass = 3 | 至少需要数字、大写字母、小写字母和其他字符这四类字符中的三类。 |
| dictcheck = 1 | 开启字典检查。 |
| usercheck = 1 | 检查到密码中包含用户名,则不能设置。 |
| dictpath = | 字典检查所使用字典的配置,默认使用“/usr/share/cracklib/pw_dict”。 |
| enforcing = 1 | 密码必须通过所有检测才能设置成功。 |

:::note 虽然没有参数控制回文的检测,但是pam_pwquality.so会进行密码是否为回文的检测。可以执行man pam_pwquality命令,查询所有可用的配置参数。 :::
■功能测试
执行如下命令,创建测试用户test。
sudo useradd test
在终端界面,切换到目录/etc/pam.d下。
在配置文件system-auth和password-auth中在找到“password requisite pam_pwquality.so”,确认该行前没有注释符号“#”。如果没有此行内容,则加入该内容。
◆需执行的命令如下:
sudo vi /etc/pam.d/system-auth
sudo vi /etc/pam.d/password-auth
◆需增加或修改的内容如下:
password requisite pam_pwquality.so try_first_pass local_users_only retry=1 enforce_for_root
执行sudo vi /etc/security/pwquality.conf命令,添加如下内容:
#修改密码最小长度为9
minlen = 9
执行sudo passwd test命令,验证passwd命令结果。
更改用户 test 的密码 。
新的 密码:
无效的密码: 密码少于 9 个字符
passwd: 鉴定令牌操作错误

:::note “union12#”不符合minlen=9的密码策略的要求,不能成功设置密码。 :::
更改用户 test 的密码 。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。

:::note “union12#$”符合minlen=9的密码策略的要求,可以成功设置密码。 :::
pam_deepin_pw_check.so
■概述:该模块由deepin-pw-check提供,用于检测密码是否符合设定的密码策略。
■配置文件:如需在验证密码时使用该模块,需在“/etc/pam.d/system-auth”和“/etc/pam.d/password-auth”的配置文件中,配置如下内容。
password requisite pam_deepin_pw_check.so try_first_pass local_users_only retry=1 enforce_for_root

:::note retry表示设置密码时,第二次重复输入密码错误,可以重复尝试的次数。enforce_for_root表示root用户设置密码也需符合密码策略的配置。 :::
该模块所使用的密码策略的配置文件为“/etc/deepin/dde.conf”,该配置可使用的所有配置如表5.3所示。
| 参数 | 描述 |
|---|---|
| STRONG_PASSWORD = true | 启用密码检测。 |
| PASSWORD_MIN_LENGTH = 8 | 密码长度不小于8位。 |
| PASSWORD_MAX_LENGTH = 511 | 密码长度不大于511位。 |
| VALIDATE_POLICY = 1234567890;abcdefghijklmnopqrstuvwxyz;ABCDEFGHIJKLMNOPQRSTUVWXYZ;!"#$%&'()*+,-./:;<=>?@[]^_`{|}~ | 以“;”区分类型,依次为数字、小写字母、大写字母、符号四种类型。 |
| VALIDATE_REQUIRED = 3 | 包含VALIDATE_POLICY中的3种类型。 |
| PALINDROME_NUM = 4 | 密码中不得包含大于等于4位的回文,如包含abcddcba,则不能设置成功。 |
| WORD_CHECK = 1 | 启用字典检查,密码不得包含字典词汇。 |
| MONOTONE_CHARACTER_NUM = 0 | 不检查连续字符的个数。 |
| CONSECUTIVE_SAME_CHARACTER_NUM = 0 | 不检查相同字符的个数。 |
| DICT_PATH = | 字典检查所使用字典的配置,默认使用“/usr/share/cracklib/pw_dict”。 |
| FIRST_LETTER_UPPERCASE = false | 不检测首字母大写。 |
■功能测试
执行如下命令,创建测试用户test。
sudo useradd test
在终端界面,切换到目录/etc/pam.d下。
在配置文件system-auth和password-auth中在找到“password requisite pam_deepin_pw_check.so”,确认该行前没有注释符号“#”。如果没有此行内容,则加入该内容。
◆需要执行的命令如下:
sudo vi /etc/pam.d/system-auth
sudo vi /etc/pam.d/password-auth
◆需要增加或修改的内容如下:
password requisite pam_deepin_pw_check.so try_first_pass local_users_only retry=1 enforce_for_root
执行sudo vi /etc/deepin/dde.conf命令,在文件中修改或添加如下内容:
#修改密码最小长度为9
PASSWORD_MIN_LENGTH = 9
执行sudo passwd test命令,验证passwd命令结果。
更改用户 test 的密码 。
新的 密码:
重新输入新的 密码:
无效的密码: 密码长度不能少于9个字符
passwd: 鉴定令牌操作错误

:::note “union12#”不符合PASSWORD_MIN_LENGTH = 9的密码策略的要求,不能成功设置密码。 :::
更改用户 test 的密码 。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。

:::note “union12#$”符合PASSWORD_MIN_LENGTH = 9的密码策略的要求,可以成功设置密码。 :::
No comments to display
No comments to display