zoukankan      html  css  js  c++  java
  • Linux系统用户密码规则

    随着linux使用的普遍,对于linux用户以及系统的安全要求越来越高,而用户密码复杂程度是系统安全性高低的首要体现。因此如何对linux下用户的密码进行规则限制,以保证用户必须使用复杂的密码,杜绝用户随意使用简单的密码,从而提高用户的安全性和系统的安全性。下面以Centos7系统为例,出于安全考虑,对用户密码规则复杂度的设置进行梳理:

    一、设置密码规则

    1)密码长度、有效期
    /etc/login.defs文件是当创建用户时的一些规划,比如创建用户时,是否需要家目录,UID和GID的范围;用户的期限等等,这个文件是可以通过root来定义的。

    PASS_MAX_DAYS 90 —-两次改变密码之间相距的最大天数,密码有效最大天数 
    PASS_MIN_DAYS 6 —-两次改变密码之间相距的最小天数,为零时代表任何时候都可以更改密码 
    PASS_MIN_LEN 6 —-密码最小长度 
    PASS_WARN_AGE 30 —-在密码过期之前警告的天数 
    
    注意:以上只对之后新增的用户有效,如果要修改已存在的用户密码规则,需要使用chage命令
    

    2)查看用户的密码规则

    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)"

    [root@kevin ~]# vim /etc/login.defs
    # line 25: set 60 for Password Expiration
    PASS_MAX_DAYS 60
    

    4)设置可用密码的最短天数 至少在改变它之后,用户必须至少使用他们的密码。 此设置仅在创建用户时才会产生影响,而不会影响到现有用户。 如果设置为现有用户,请运行命令"chage -m(days)(user)"

    [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)"

    [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文件中

    [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)设置最小密码长度。 用户不能将密码长度设置为小于此参数

    [root@kevin ~]# authconfig --passminlen=8 --update
    [root@kevin ~]# grep "^minlen" /etc/security/pwquality.conf 
    minlen = 8
    

    8)为新密码设置所需的最少字符类数(种类⇒大写字母/小写字母/数字/特殊字符)

    [root@kevin ~]# authconfig --passminclass=2 --update
    [root@kevin ~]# grep "^minclass" /etc/security/pwquality.conf 
    minclass = 2

    9)在新密码中设置允许的连续相同字符的最大数量

    [root@kevin ~]# authconfig --passmaxrepeat=3 --update
    [root@kevin ~]# grep "^maxrepeat" /etc/security/pwquality.conf 
    maxrepeat = 3

    10)在新密码中设置同一类的最大允许连续字符数

    [root@kevin ~]# authconfig --passmaxclassrepeat=4 --update
    [root@kevin ~]# grep "^maxclassrepeat" /etc/security/pwquality.conf 
    maxclassrepeat = 4

    11)新密码中至少需要一个小写字符

    [root@kevin ~]# authconfig --enablereqlower --update
    [root@kevin ~]# grep "^lcredit" /etc/security/pwquality.conf 
    lcredit = -1

    12)新密码中至少需要一个大写字符

    [root@kevin ~]# authconfig --enablerequpper --update
    [root@kevin ~]# grep "^ucredit" /etc/security/pwquality.conf 
    ucredit = -1

    13)新密码中至少需要一位数字

    [root@kevin ~]# authconfig --enablereqdigit --update
    [root@kevin ~]# grep "^dcredit" /etc/security/pwquality.conf 
    dcredit = -1
    

    14)新密码中至少需要一个其他字符

    [root@kevin ~]# authconfig --enablereqother --update
    [root@kevin ~]# grep "^ocredit" /etc/security/pwquality.conf 
    ocredit = -1
    

    15)在新密码中设置单调字符序列的最大长度(ex⇒’12345’,’fedcb’)

    [root@kevin ~]# vim /etc/security/pwquality.conf
    # add to the end
    maxsequence = 3
    

    16)设置旧密码中不能出现的新密码中的字符数

    [root@kevin ~]# vim /etc/security/pwquality.conf
    # add to the end
    difok = 5

    17)检查新密码中是否包含用户passwd项的GECOS字段中长度超过3个字符的单词

    [root@kevin ~]# vim /etc/security/pwquality.conf
    # add to the end
    gecoscheck = 1

    18)设置不能包含在密码中的Ssace分隔列表

    [root@kevin ~]# vim /etc/security/pwquality.conf
    # add to the end
    badwords = denywords1 denywords2 denywords3

    19)为新密码设置散列/密码算法。 (默认是sha512)

    [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

    二、账户锁定策略实现 

    策略要求如下: 
    - 设定锁定的阈值为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文件控制。

    [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模块控制:

    [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)密码有效期是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命令是用来修改帐号和密码的有效期限。

    需求场景:
    公司给客户开的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
  • 相关阅读:
    二分图最大匹配的K&#246;nig定理及其证明
    HDOJ 2389 Rain on your Parade
    HDOJ 1083 Courses
    HDOJ 2063 过山车
    POJ 1469 COURSES
    UESTC 1817 Complete Building the Houses
    POJ 3464 ACM Computer Factory
    POJ 1459 Power Network
    HDOJ 1532 Drainage Ditches
    HDU 1017 A Mathematical Curiosity
  • 原文地址:https://www.cnblogs.com/kevingrace/p/9670160.html
Copyright © 2011-2022 走看看