• 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
  • 相关阅读:
    [Python]机器学习:Tensorflow实现线性回归
    Python之Numpy:线性代数/矩阵运算
    特殊环境的安装教程[汇总]
    C/C++之编程语言学习资源
    Python之文件操作工具
    NLP之中文自然语言处理工具库:SnowNLP(情感分析/分词/自动摘要)
    网络分析:WireShark
    Linux/Window之定时任务脚本编写
    CSS之Background
    JavaScript之iframe页面间通信
  • 原文地址:https://www.cnblogs.com/kevingrace/p/9670160.html
Copyright © 2020-2023  润新知