小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
在修改密码时,如果太简单,可能会收到如下密码太简单的提示,必须指定符合的密码才行。
BAD PASSWORD: The password fails the dictionary check - it is too simplistic/systematic
这个时候,可能就需要考虑,如何在CentOS中设置用户密码的复杂度?
pam_cracklib模块介绍
PAM简要介绍
PAM(Pluggable Authentication Modules )是由Sun提出的一种认证机制。它通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于向系统中添加新的认证手段。
PAM模块是一种嵌入式模块,修改后即时生效。
centos6中,pam的相关文件如下:
-
/usr/lib/libpam.so.*## PAM核心库 -
/etc/pam.conf## PAM配置文件 -
/etc/pam.d/*## PAM各个模块的配置文件 -
/lib/security/pam_*.so## 可动态加载的PAM模块
从Centos7开始,默认不存在 /etc/pam.conf 配置文件。在PAM系统中,PAM-API的启用激活首先是读取 /etc/pam.conf 配置文件,或者 /etc/pam.d/ 目录中的内容。而如果存在 /etc/pam.d/ 目录,将会导致Linux-PAM忽略 /etc/pam.conf。
此部分参考自Chapter 4. The Linux-PAM configuration file,有需要可以细了解下。
PAM配置文件
PAM配置文件的每一行的格式:
| Module-type | Control-flag | Module-path | Arguments |
|---|---|---|---|
| 模块类型 | 控制字符 | 模块路径 | 模块参数 |
关于 PAM 模块更具体的使用以及如何配置,推荐参考linux极简小知识:28、在linux中如何配置和使用PAM[译]【在本系列中可直接查找该篇文章,里面对PAM配置项和含义均有介绍,并有详细示例】中的解释和示例。
另,Linux下PAM模块学习总结对PAM的介绍似乎也很全面,可以作为参考。
pam_cracklib 命令参数
/lib/security/pam_cracklib.so 文件用于控制密码的复杂度。
/lib64/security也有对应的 pam_cracklib.so 模块,对应不同的架构。
查看使用 pam_cracklib 使用帮助。
# man pam_cracklib
...
几个属性介绍:
| 配置项 | 含义 |
|---|---|
| authtok_type=XXX | 该模块默认会在请求密码时使用以下提示:“New UNIX password:”和“Retype UNIX password:”。示例词 UNIX 可以用这个选项替换,默认为空。 |
| retry=N | 输入密码的重试次数,超过后返回错误。默认值为1。 |
| difok=N | 新密码中与旧密码字符不同的个数,默认值 5。 |
| minlen=N | 新密码的最小长度 |
| dcredit=N | 新密码中允许的数字的最大个数。N<0 表示密码全为数字。 |
| ucredit=N | 新密码中允许的大写字母的最大个数。N<0 表示密码全为大写。 |
| lcredit=N | 新密码中允许的小写字母的最大个数。N<0 表示密码全为小写。 |
| ocredit=N | 新密码中允许的特殊字符的最大个数。N<0 表示密码全为特殊字符。 |
| minclass=N | 新密码所需的最少字符类别数。默认值为0。一共4个分类:数字、大写、小写字母、特殊字符(other characters)。 |
| maxrepeat=N | 密码中重复字符的最大数量,如果重复字符超过该值,设置密码将会失败。默认值0,表示不进行检查 |
| maxsequence=N | 拒绝包含长于 N 的单调字符序列(顺序字符)的密码。默认值为 0,表示禁用。这种序列的例子是“12345”或“fedcb”。 |
| maxclassrepeat=N | 拒绝包含超过 N 个连续同类别字符的密码。默认值为 0,表示禁用此检查。 |
| reject_username | 检查新密码中是否包含正反形式的用户名(用户名或用户名的反向顺序)。如果存在,则拒绝密码。 |
| gecoscheck | 检查新密码中是否包含 GECOS 字段(通常是用户的全名)中长度超过 3 个字符的正反形式的单词。如果发现任何这样的词,则拒绝新密码。 |
| enforce_for_root | 如果更改密码的用户是 root,模块也会在检查失败时返回错误。默认情况下此选项是关闭的,即只打印有关检查失败的消息,但 root 仍可以更改密码。注意,不会要求 root 输入旧密码,因此不会执行比较旧密码和新密码的检查。 |
| use_authtok | 此参数用于强制模块不提示用户输入新密码,而是使用先前堆叠的密码模块提供的密码。 |
| dictpath=/path/to/dict | cracklib字典的路径。 |
ucredit、lcredit、dcredit的取值:大于0,表示允许的最大字符数;小于0,表示允许的最少字符数,至少多少个字符。
使用 pam_cracklib.so 模块设置密码复杂度的规则
我们在 /etc/pam.d/system-auth 文件中,添加对 pam_cracklib.so 模块的配置。
如下,打开 /etc/pam.d/system-auth 并添加如下一行(如果存在对pam_cracklib.so的配置行,可直接替换):
vim /etc/pam.d/system-auth
添加如下密码复杂度配置行:
password requisite pam_cracklib.so retry=5 difok=3 minlen=10 ucredit=-1 lcredit=-1 dcredit=-1 dictpath=/usr/share/cracklib/pw_dict
该行配置规则含义为:
- 新密码尝试次数:5
- 新旧密码最少不同字符:3
- 最小密码长度:10
- 最少大写字母:1
- 最少小写字母:1
- 最少数字:1
- 密码字典:/usr/share/cracklib/pw_dict
密码字典,通常限制不能为连续的字母或数字。
ucredit=-1 表示至少1个大写字母,ucredit=-3 表示至少3个大写字母
即:ucredit、lcredit、dcredit大于0,表示允许的最大字符数;小于0,表示允许的最少字符数,至少多少个字符。
如下,设置密码的测试:
$ passwd
Changing password for user root_test2.
Changing password for root_test2.
(current) UNIX password:
New password:
BAD PASSWORD: it is based on your username
New password:
BAD PASSWORD: it is too simplistic/systematic
New password:
BAD PASSWORD: is too simple
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
不符合规则时,返回 is too simple 或 it is too simplistic/systematic。
即使设置 minlen=3,密码长度最少也要6位(应该有其他默认要求的设置)。
关于密码复杂度的修改密码测试
默认情况下,未进行任何密码规则配置时
passwd修改密码
只有root权限用户才能在 passwd 后指定用户,即只有root权限才能修改其他用户的密码。
$ passwd root_test2
passwd: Only root can specify a user name.
$ sudo passwd root_test2
Changing password for user root_test2.
New password:
root用户(root权限)修改密码不符合规则仍会成功
如下,只会显示提示,仍修改成功。
# passwd root_test2
Changing password for user root_test2.
New password:
BAD PASSWORD: The password contains the user name in some form
Retype new password:
passwd: all authentication tokens updated successfully.
新密码不符合规则默认只能重试3次
$ passwd
Changing password for user root_test2.
Changing password for root_test2.
(current) UNIX password:
New password:
BAD PASSWORD: The password is the same as the old one
New password:
BAD PASSWORD: The password is too similar to the old one
New password:
BAD PASSWORD: The password is shorter than 8 characters
passwd: Have exhausted maximum number of retries for service
参考和推荐
另,pam_cracklib.so模块中,也有简单的讲解和示例,可作为参考