Linux系统用户密码规则 - 运维总结
随着linux使用的普遍,对于linux用户以及系统的安全要求越来越高,而用户密码复杂程度是系统安全性高低的首要体现。因此如何对linux下用户的密码进行规则限制,以保证用户必须使用复杂的密码,杜绝用户随意使用简单的密码,从而提高用户的安全性和系统的安全性。下面以Centos7系统为例,出于安全考虑,对用户密码规则复杂度的设置进行梳理:
一、设置密码规则
1)密码长度、有效期
/etc/login.defs文件是当创建用户时的一些规划,比如创建用户时,是否需要家目录,UID和GID的范围;用户的期限等等,这个文件是可以通过root来定义的。
1 2 3 4 5 6 | PASS_MAX_DAYS 90 —-两次改变密码之间相距的最大天数,密码有效最大天数 PASS_MIN_DAYS 6 —-两次改变密码之间相距的最小天数,为零时代表任何时候都可以更改密码 PASS_MIN_LEN 6 —-密码最小长度 PASS_WARN_AGE 30 —-在密码过期之前警告的天数 注意:以上只对之后新增的用户有效,如果要修改已存在的用户密码规则,需要使用chage命令 |
2)查看用户的密码规则
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | Last password change : Sep 11, 2018 Password expires : Sep 30, 2030 Password inactive : never Account expires : never Minimum number of days between password change : 6 Maximum number of days between password change : 90 Number of days of warning before password expires : 7 翻译过来: 最近一次密码修改时间 : 9月 11, 2018 密码过期时间 : 9月 30, 2030 密码失效时间 :从不 帐户过期时间 :从不 两次改变密码之间相距的最小天数 :6 两次改变密码之间相距的最大天数 :90 在密码过期之前警告的天数 :7 ============================================================= chage是用了修改账户有效期限的命令。 注意:不要用该命令给root用户加上有效期,如果密码过期,再加上后文说的 /etc/shadow 文件加锁禁止修改,会导致root提示修改密码, 无法成功修改密码,从而无法登陆。 如果要修改密码过期时间为 "从不" 修改方法: # chage -M 90 -m 6 -W 30 test # chage -M 99999 kevin # chage -l username 查看系统账户的当前设置 # chage -M 600 fzwb_word 修改fzwb_word账户密码的有效天数为600天。过了这个天数,账户密码无效 # chage -E "Jun 16, 2016" fzwb_word 设定fzwb_word账户的具体到期时间。过了这个日期,账户就无效。默认是never (fzwb_word为ftp的账户账户) 注意: chage -M 针对的是账户密码过期时间。 chage -E 这个命令针对的是账户过期时间 设定账户过期时间,除了使用chage -E命令,还可以使用 usermod -e命令 # usermod -e "Jun 16, 2016" fzwb_word 设定fzwb_word账户的具体到期时间。默认是never (fzwb_word为ftp的账户账户) 下面命令查看, fzwb_word 这个账户的时间到 2015 年 6 月 10 号就到期了!! 修改为 2016 月 6 月 16 号到期! [root@kevin ~] # chage -l fzwb_word Minimum: 0 Maximum: 99999 Warning: 7 Inactive: -1 Last Change: Jun 15, 2012 Password Expires: Never Password Inactive: Never Account Expires: Jun 10, 2015 [root@kevin ~] # usermod -e "Jun 16, 2016" fzwb_word [root@kevin ~] # chage -l fzwb_word Minimum: 0 Maximum: 99999 Warning: 7 Inactive: -1 Last Change: Jun 15, 2012 Password Expires: Never Password Inactive: Never Account Expires: Jun 16, 2016 -------------------------------------------------------------------------------- 可以使用chage命令来手动修改账户的相关属性: 格式:chage [选项] 账户名 [选项] -m:密码可更改的最小天数。为零时代表任何时候都可以更改密码。 -M:密码保持有效的最大天数。 -w:账户密码到期前,提前收到警告信息的天数。 -E:帐号到期的日期。过了这天,此帐号将不可用。 -d:上一次更改的日期。 -i:停滞时期。如果一个密码已过期这些天,那么此帐号将不可用。 -l:例出当前的设置。由非特权账户来确定他们的密码或帐号何时过期。 实例如下: [root@kevin ~] # chage -l wangshibo Last password change : Mar 09, 2017 // 账户创建时间 Password expires : Aug 30, 2022 // 账户密码过期时间 Password inactive : never Account expires : never // 账户过期时间 Minimum number of days between password change : 0 Maximum number of days between password change : 2000 Number of days of warning before password expires : 7 [root@kevin ~] # usermod -e "Jun 16, 2018" wangshibo [root@kevin ~] # chage -l wangshibo Last password change : Mar 09, 2017 Password expires : Aug 30, 2022 Password inactive : never Account expires : Jun 16, 2018 Minimum number of days between password change : 0 Maximum number of days between password change : 2000 Number of days of warning before password expires : 7 [root@kevin ~] # chage -M 20 wangshibo [root@kevin ~] # chage -l wangshibo Last password change : Mar 09, 2017 Password expires : Mar 29, 2017 Password inactive : never Account expires : Jun 16, 2018 Minimum number of days between password change : 0 Maximum number of days between password change : 20 Number of days of warning before password expires : 7 [root@kevin ~] # chage -E "Jun 2, 2020" wangshibo [root@kevin ~] # chage -l wangshibo Last password change : Mar 09, 2017 Password expires : Mar 29, 2017 Password inactive : never Account expires : Jun 02, 2020 Minimum number of days between password change : 0 Maximum number of days between password change : 20 Number of days of warning before password expires : 7 |
3) 设置密码过期的天数。 用户必须在几天内更改密码。 此设置仅在创建用户时才会产生影响,而不会影响到现有用户。 如果设置为现有用户,请运行命令"chage -M(days)(user)"
1 2 3 | [root@kevin ~] # vim /etc/login.defs # line 25: set 60 for Password Expiration PASS_MAX_DAYS 60 |
4)设置可用密码的最短天数。 至少在改变它之后,用户必须至少使用他们的密码。 此设置仅在创建用户时才会产生影响,而不会影响到现有用户。 如果设置为现有用户,请运行命令"chage -m(days)(user)"
1 2 3 | [root@kevin ~] # vim /etc/login.defs # line 26: set 2 for Minimum number of days available PASS_MIN_DAYS 2 |
5)在到期前设置警告的天数。 此设置仅在创建用户时才会产生影响,而不会影响到现有用户。 如果设置为存在用户,请运行命令"chage -W(days)(user)"
1 2 3 | [root@kevin ~] # vim /etc/login.defs # line 28: set 7 for number of days for warnings PASS_WARN_AGE 7 |
6)5次更改密码不能有重复(即最近5次使用过的密码就不能再用作新密码了),并且每次修改密码都会将历史密码记录在/etc/security/opasswd文件中
1 2 3 | [root@kevin ~] # vim /etc/pam.d/system-auth # near line 15: prohibit to use the same password for 5 generation in past password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=5 |
7)设置最小密码长度。 用户不能将密码长度设置为小于此参数
1 2 3 | [root@kevin ~] # authconfig --passminlen=8 --update [root@kevin ~] # grep "^minlen" /etc/security/pwquality.conf minlen = 8 |
8)为新密码设置所需的最少字符类数(种类⇒大写字母/小写字母/数字/特殊字符)
1 2 3 | [root@kevin ~] # authconfig --passminclass=2 --update [root@kevin ~] # grep "^minclass" /etc/security/pwquality.conf minclass = 2 |
9)在新密码中设置允许的连续相同字符的最大数量
1 2 3 | [root@kevin ~] # authconfig --passmaxrepeat=3 --update [root@kevin ~] # grep "^maxrepeat" /etc/security/pwquality.conf maxrepeat = 3 |
10)在新密码中设置同一类的最大允许连续字符数
1 2 3 | [root@kevin ~] # authconfig --passmaxclassrepeat=4 --update [root@kevin ~] # grep "^maxclassrepeat" /etc/security/pwquality.conf maxclassrepeat = 4 |
11)新密码中至少需要一个小写字符
1 2 3 | [root@kevin ~] # authconfig --enablereqlower --update [root@kevin ~] # grep "^lcredit" /etc/security/pwquality.conf lcredit = -1 |
12)新密码中至少需要一个大写字符
1 2 3 | [root@kevin ~] # authconfig --enablerequpper --update [root@kevin ~] # grep "^ucredit" /etc/security/pwquality.conf ucredit = -1 |
13)新密码中至少需要一位数字
1 2 3 | [root@kevin ~] # authconfig --enablereqdigit --update [root@kevin ~] # grep "^dcredit" /etc/security/pwquality.conf dcredit = -1 |
14)新密码中至少需要一个其他字符
1 2 3 | [root@kevin ~] # authconfig --enablereqother --update [root@kevin ~] # grep "^ocredit" /etc/security/pwquality.conf ocredit = -1 |
15)在新密码中设置单调字符序列的最大长度(ex⇒’12345’,’fedcb’)
1 2 3 | [root@kevin ~] # vim /etc/security/pwquality.conf # add to the end maxsequence = 3 |
16)设置旧密码中不能出现的新密码中的字符数
1 2 3 | [root@kevin ~] # vim /etc/security/pwquality.conf # add to the end difok = 5 |
17)检查新密码中是否包含用户passwd项的GECOS字段中长度超过3个字符的单词
1 2 3 | [root@kevin ~] # vim /etc/security/pwquality.conf # add to the end gecoscheck = 1 |
18)设置不能包含在密码中的Ssace分隔列表
1 2 3 | [root@kevin ~] # vim /etc/security/pwquality.conf # add to the end badwords = denywords1 denywords2 denywords3 |
19)为新密码设置散列/密码算法。 (默认是sha512)
1 2 3 4 5 6 | [root@kevin ~] # authconfig --test | grep hashing password hashing algorithm is sha512 [root@kevin ~] # authconfig --passalgo=md5 --update [root@kevin ~] # authconfig --test | grep hashing password hashing algorithm is md5 |
二、账户锁定策略实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | 策略要求如下: - 设定锁定的阈值为5次 - 锁定时间为5分钟即300秒 - 必须所有用户都受限,包括root 1)修改配置文件 /etc/pam .d /system-auth-ac ,写入策略 [root@server ~] # vim /etc/pam.d/system-auth-ac auth required pam_env.so auth required pam_tally2.so even_deny_root deny=5 unlock_time=60 auth sufficient pam_unix.so nullok try_first_pass auth requisite pam_succeed_if.so uid >= 1000 quiet_success auth required pam_deny.so account required pam_unix.so account required pam_tally2.so account sufficient pam_localuser.so account sufficient pam_succeed_if.so uid < 1000 quiet account required pam_permit.so 2)修改配置文件 /etc/pam .d /password-auth-ac ) [[root@server ~] # vimm /etc/pam.d/password-auth-ac auth required pam_env.so auth required pam_tally2.so deny=5 unlock_time=60 auth sufficient pam_unix.so nullok try_first_pass auth requisite pam_succeed_if.so uid >= 1000 quiet_success auth required pam_deny.so account required pam_unix.so account required pam_tally2.so account sufficient pam_localuser.so account sufficient pam_succeed_if.so uid < 1000 quiet account required pam_permit.so 3)查看用户锁定状态 [root@ server pam.d] # pam_tally2 -u wangshibo Login Failures Latest failure From wangshibo 7 12 /20/16 14:02:55 192.168.10.86 4)解锁状态 [root@kevin ~] # pam_tally2 -r -u wangshibo Login Failures Latest failure From wangshibo 0 |
Centos6 系统密码策略
上面介绍的是Centos7系统下的用户密码策略,大多数也适用于Centos6系统,这里再补充下:
1)用户密码策略
Linux系统下的用户密码的有效期,是否可以修改密码可以通过login.defs文件控制。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | [root@localhost ~] # cat /etc/login.defs|grep -v "^#"|grep -v "^$" MAIL_DIR /var/spool/mail PASS_MAX_DAYS 99999 PASS_MIN_DAYS 0 PASS_MIN_LEN 5 PASS_WARN_AGE 7 UID_MIN 500 UID_MAX 60000 GID_MIN 500 GID_MAX 60000 CREATE_HOME yes UMASK 077 USERGROUPS_ENAB yes ENCRYPT_METHOD SHA512 上述文件中的重要参数表示: PASS_MAX_DAYS 99999 密码的最大有效期, 99999:永久有期 PASS_MIN_DAYS 0 是否可修改密码,0表示可修改,非0表示多少天后可修改 PASS_MIN_LEN 5 密码最小长度,但是使用pam_cracklib.so模块后,该参数不再有效(这个参考下面密码复杂度规则设定) PASS_WARN_AGE 7 密码失效前多少天在用户登录时通知用户修改密码 |
2)用户密码复杂度规则设定,需要通过/etc/pam.d/system-auth文件实施(针对的是普通用户状态下修改密码会生效,root用户状态下无效),centos6中默认是通过pam_cracklib.so模块控制:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | [root@localhost ~] # cat /etc/redhat-release CentOS release 6.8 (Final) [root@localhost ~] # vim /etc/pam.d/system-auth 将文件中的下面两行: password requisite pam_cracklib.so try_first_pass retry=3 type = password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok 改为: password requisite pam_cracklib.so try_first_pass retry=3 type = minlen=8 ucredit=-2 lcredit=-4 dcredit=-1 ocredit=-1 password sufficient pam_unix.so md5 shadow nullok try_first_pass use_authtok remember=5 上面文件中参数分别说明设置密码的时候要遵循下面的规则: retry=3 定义登录/修改密码失败时,可以重试的次数; type =xxx 当添加/修改密码时,系统给出的缺省提示符是什么,用来修改缺省的密码提示文本。默认是不修改的,如上例。 minlen=8 定义用户密码的最小长度为8位 ucredit=-2 定义用户密码中最少有2个大写字母 (数字为负数,表示至少有多少个大写字母;数字为正数,表示至多有多少个大写字母;下面同理) lcredit=-4 定义用户密码中最少有4个小写字母 dcredit=-1 定义用户密码中最少有1个数字 ocredit=-1 定义用户密码中最少有1个特殊字符(除数字、字母之外) remember=5 修改用户密码时最近5次用过的旧密码就不能重用了 ---------------------------------------------------------------------------- 除了上面的几个参数,还可以设定下面的参数规则 difok=N 此选项用来规定新密码中必需有N个字符与旧密码不同。如果新密码中有1 /2 以上的字符与旧密码不同时,该新密码就会被接受。 difignore=N 此选项用来设定在difok之前收到多少个字符时,difok设置会被忽略,缺省为23。 minclass=N 此选项用来规定新密码中的字符类别的最小数目,字符一般有四种类别:数字、大写字母、小写字母,以及特殊字符。 |
温馨提示:login.defs文件和/etc/pam.d/system-auth文件的规则设置对非root用户起作用,在root用户下则不会生效!如果设置root用户密码过期时间等,需要用change命令进行设置。示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | 如下密码规则设置: 1)密码有效期是3个月。即用户创建180天后强制要求修改密码。 2)密码至少要过了5天后才能修改。 3)密码最小长度是12位 4)密码到期前的7天,用户登录时会提醒修改密码 5)密码输入时最多可允许尝试输入3次密码,3次不成功则退出密码输入界面。 6)新密码中至少包括大写字母2位、小写字母至少2位,数字至少2位,特殊字符至少2位 7)新密码中必须有4个字符与老密码不同 8)修改用户密码时最近3次用过的旧密码就不能重用了 则前4个密码规则的配置: [root@localhost ~] # vim /etc/login.defs ...... PASS_MAX_DAYS 180 PASS_MIN_DAYS 5 PASS_MIN_LEN 12 PASS_WARN_AGE 7 后4个密码规则的配置: [root@localhost ~] # vim /etc/pam.d/system-auth ...... password requisite pam_cracklib.so try_first_pass retry=3 type = minlen=12 ucredit=-2 lcredit=-2 dcredit=-2 ocredit=-2 difok=4 password sufficient pam_unix.so md5 shadow nullok try_first_pass use_authtok remember=3 password required pam_deny.so 在root账号下修改密码,测试以上密码规则设置后是否有效? 如下操作,说明以上设置在root账号下无效 [root@localhost ~] # echo "123456"|passwd --stdin grace Changing password for user grace. passwd : all authentication tokens updated successfully. 那么切换到非root账号下修改密码试试? [grace@localhost ~]$ passwd Changing password for user grace. Changing password for grace. (current) UNIX password: #输入当前密码123456 New password: #设置新密码shibo@2018,不符合密码规则 BAD PASSWORD: is too simple New password: #设置新密码kevin@201b,不符合密码规则 BAD PASSWORD: is too simple New password: #设置新密码KeVI@2#8!w02,不符合密码规则 Retype new password: passwd : all authentication tokens updated successfully. 说明以上的密码规则设置在非root用户下是生效的!! |
3)Linux账户期限设定
Linux系统下可以使用chage命令是用来修改帐号和密码的有效期限。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | 需求场景: 公司给客户开的 ftp 账户用于下载报社新闻稿件。这个是付费的,账户有时间限制。若是合同到期了,客户想续约,就需要给这个 ftp 账户做延期。 注意下面修改账户有效期限的命令: # chage -l username 查看系统账户的当前设置 # chage -M 600 fzwb_word 修改fzwb_word账户密码的有效天数为600天。过了这个天数,账户密码无效 # chage -E "Jun 16, 2016" fzwb_word 设定fzwb_word账户的具体到期时间。过了这个日期,账户就无效。默认是never (fzwb_word为ftp的账户账户) 注意: chage -M 针对的是账户密码过期时间。 chage -E 这个命令针对的是账户过期时间 设定账户过期时间,除了使用chage -E命令,还可以使用 usermod -e命令 # usermod -e "Jun 16, 2016" fzwb_word 设定fzwb_word账户的具体到期时间。默认是never (fzwb_word为ftp的账户账户) 下面命令查看, fzwb_word 这个账户的时间到 2015 年 6 月 10 号就到期了!! 修改为 2016 月 6 月 16 号到期! [root@hlweb80 ~] # chage -l fzwb_word Minimum: 0 Maximum: 99999 Warning: 7 Inactive: -1 Last Change: Jun 15, 2012 Password Expires: Never Password Inactive: Never Account Expires: Jun 10, 2015 [root@hlweb80 ~] # usermod -e "Jun 16, 2016" fzwb_word [root@hlweb80 ~] # chage -l fzwb_word Minimum: 0 Maximum: 99999 Warning: 7 Inactive: -1 Last Change: Jun 15, 2012 Password Expires: Never Password Inactive: Never Account Expires: Jun 16, 2016 -------------------------------------------------------------------------------- 可以使用chage命令来手动修改账户的相关属性: 格式:chage [选项] 账户名 [选项] -m:密码可更改的最小天数。为零时代表任何时候都可以更改密码。 -M:密码保持有效的最大天数。 -w:账户密码到期前,提前收到警告信息的天数。 -E:帐号到期的日期。过了这天,此帐号将不可用。 -d:上一次更改的日期。 -i:停滞时期。如果一个密码已过期这些天,那么此帐号将不可用。 -l:例出当前的设置。由非特权账户来确定他们的密码或帐号何时过期。 实例如下: [root@localhost ~] # chage -l wangshibo Last password change : Mar 09, 2017 // 账户创建时间 Password expires : Aug 30, 2022 // 账户密码过期时间 Password inactive : never Account expires : never // 账户过期时间 Minimum number of days between password change : 0 Maximum number of days between password change : 2000 Number of days of warning before password expires : 7 [root@localhost ~] # usermod -e "Jun 16, 2018" wangshibo [root@localhost ~] # chage -l wangshibo Last password change : Mar 09, 2017 Password expires : Aug 30, 2022 Password inactive : never Account expires : Jun 16, 2018 Minimum number of days between password change : 0 Maximum number of days between password change : 2000 Number of days of warning before password expires : 7 [root@localhost ~] # chage -M 20 wangshibo [root@localhost ~] # chage -l wangshibo Last password change : Mar 09, 2017 Password expires : Mar 29, 2017 Password inactive : never Account expires : Jun 16, 2018 Minimum number of days between password change : 0 Maximum number of days between password change : 20 Number of days of warning before password expires : 7 [root@localhost ~] # chage -E "Jun 2, 2020" wangshibo [root@localhost ~] # chage -l wangshibo Last password change : Mar 09, 2017 Password expires : Mar 29, 2017 Password inactive : never Account expires : Jun 02, 2020 Minimum number of days between password change : 0 Maximum number of days between password change : 20 Number of days of warning before password expires : 7 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2016-09-18 Nginx反向代理+缓存开启+url重写+负载均衡(带健康探测)的部署记录
2016-09-18 gerrit代码简单备份方案分享