【问题标题】:Find when password expires with ldapsearch使用 ldapsearch 查找密码何时过期
【发布时间】:2017-12-01 01:59:07
【问题描述】:

有没有办法通过 ldapsearch 确定 LDAP 密码何时到期?我无法在手册页中看到任何可以让我获取此信息的内容。

我在 /var/log/secure 中看到警告消息,警告密码何时到期,所以我知道此信息以某种方式可用,只是不确定如何。

【问题讨论】:

    标签: ldap openldap passwd


    【解决方案1】:

    你必须:

    • 发现适用的密码策略
    • 获取其pwdMaxAge 值并
    • 如果非零,则将其添加到条目的 pwdChangedTime 值中,从而产生到期日期和时间。

    您无法通过一次搜索完成所有这些操作。如果您使用的是按条目策略,您将需要两个或三个,并且您还需要一种查找默认策略条目的方法,该条目位于配置中,根本不必在 DIT 中。如果pwdMaxAge 为零或不存在,则密码不会过期。

    密码策略覆盖可以提供响应控件,其中包含绑定时当前用户密码即将到期的警告。那是你真正想要的吗?

    【讨论】:

      【解决方案2】:

      也可以在serverfault 上查看此主题。不过,我发现了一个很棒的资源:@​​987654322@,它可能对你很有帮助。

      下面是这样一个很棒的脚本的缩短版本,适用于我的配置

      #!/bin/sh
      
      MY_LDAP_HOSTURI="ldap://localhost:389"
      MY_LDAP_ROOTDN="cn=Manager,dc=example,dc=com"
      MY_LDAP_ROOTPW="qwerty"
      MY_LDAP_DEFAULTPWDPOLICYDN="ou=Policies,dc=example,dc=com"
      MY_LDAP_SEARCHBASE="ou=users,dc=example,dc=com"
      MY_LDAP_SEARCHFILTER="(&(uid=*)(objectClass=inetOrgPerson))"
      MY_LDAP_SEARCHSCOPE="one"
      MY_LDAP_SEARCHBIN="/usr/bin/ldapsearch"
      MY_LDAP_NAME_ATTR=cn
      MY_LDAP_LOGIN_ATTR=uid
      MY_GAWK_BIN="/usr/bin/gawk"
      
      # Retrieves date in seconds.
      # This function could take one parameter, a time returned by the command
      # `date +"%Y %m %d %H %M %S"`. Without parameter, it returns GMT time.
      
      getTimeInSeconds() {
          date=0
          if [ "$1" ]; then
              date=`TZ=UTC ${MY_GAWK_BIN} 'BEGIN  { \
                  if (ARGC == 2) { \
                          print mktime(ARGV[1]) \
                  } \
                  exit 0 }' "$1"`
          else
              now=`date +"%Y %m %d %H %M %S" -u`
              date=`getTimeInSeconds "$now"`
          fi
          echo ${date}
      }
      
      ## Variables initialization
      tmp_dir="/tmp/$$.checkldap.tmp" ; result_file="${tmp_dir}/res.tmp.1" ; buffer_file="${tmp_dir}/buf.tmp.1"
      ldap_param="-x -LLL -H ${MY_LDAP_HOSTURI}" ; mkdir ${tmp_dir}
      
      [ ${MY_LDAP_ROOTDN} ] && ldap_param="${ldap_param} -D ${MY_LDAP_ROOTDN} -w ${MY_LDAP_ROOTPW}"
      
      ## Performs global search
      ${MY_LDAP_SEARCHBIN} ${ldap_param} -s ${MY_LDAP_SEARCHSCOPE} \
          -b "${MY_LDAP_SEARCHBASE}" "${MY_LDAP_SEARCHFILTER}" \
          "dn" | grep -iE '^dn:' > ${result_file}
      
      while read dnStr # Loops on results
      do
          [ ! "${dnStr}" ] && continue # Do not use blank lines
      
          dn=`echo ${dnStr} | cut -d : -f 2` # Process ldap search
      
          ${MY_LDAP_SEARCHBIN} ${ldap_param} -s base -b "${dn}" \
              ${MY_LDAP_NAME_ATTR} ${MY_LDAP_LOGIN_ATTR} pwdChangedTime pwdPolicySubentry \
              > ${buffer_file}
      
          login=`grep -w "${MY_LDAP_LOGIN_ATTR}:" ${buffer_file} | cut -d : -f 2 \
              | sed "s/^ *//;s/ *$//"`
          name=`grep -w "${MY_LDAP_NAME_ATTR}:" ${buffer_file} | cut -d : -f 2\
              | sed "s/^ *//;s/ *$//"`
          pwdChangedTime=`grep -w "pwdChangedTime:" ${buffer_file} \
              | cut -d : -f 2 | cut -c 1-15 | sed "s/^ *//;s/ *$//"`
          pwdPolicySubentry=`grep -w "pwdPolicySubentry:" ${buffer_file} \
              | cut -d : -f 2 | sed "s/^ *//;s/ *$//"`
      
          [ ! "${pwdChangedTime}" ] && continue
          [ ! "${pwdPolicySubentry}" -a ! "${MY_LDAP_DEFAULTPWDPOLICYDN}" ] && continue
      
          # Retrieves user policy pwdMaxAge and pwdExpireWarning attributes
          ldap_search="${MY_LDAP_SEARCHBIN} ${ldap_param} -s base"
          if [ "${pwdPolicySubentry}" ]; then
              ldap_search="${ldap_search} -b ${pwdPolicySubentry}"
          else
              ldap_search="${ldap_search} -b ${MY_LDAP_DEFAULTPWDPOLICYDN}"
          fi
          
          ldap_search="$ldap_search pwdMaxAge pwdExpireWarning pwdMinLength pwdInHistory"
          pwdMaxAge=`${ldap_search} | grep -w "pwdMaxAge:" | cut -d : -f 2 \
              | sed "s/^ *//;s/ *$//"`
          pwdExpireWarning=`${ldap_search} | grep -w "pwdExpireWarning:" | cut -d : -f 2 \
              | sed "s/^ *//;s/ *$//"`
          pwdMinLength=`${ldap_search} | grep -w "pwdMinLength:" | cut -d : -f 2 \
              | sed "s/^ *//;s/ *$//"`
          pwdInHistory=`${ldap_search} | grep -w "pwdInHistory:" | cut -d : -f 2 \
              | sed "s/^ *//;s/ *$//"`
      
              [ ! "${pwdMaxAge}" ] && continue
      
          # Retrieves time difference between today and last change.
          if [ "${pwdChangedTime}" ]; then
              s=`echo ${pwdChangedTime} | cut -c 13-14`
              m=`echo ${pwdChangedTime} | cut -c 11-12`
              h=`echo ${pwdChangedTime} | cut -c 9-10`
              d=`echo ${pwdChangedTime} | cut -c 7-8`
              M=`echo ${pwdChangedTime} | cut -c 5-6`
              y=`echo ${pwdChangedTime} | cut -c 1-4`
              currentTime=`getTimeInSeconds`
              pwdChangedTime=`getTimeInSeconds "$y $M $d $h $m $s"`
              diffTime=`expr ${currentTime} - ${pwdChangedTime}`
          fi
      
          expireTime=`expr ${pwdChangedTime} + ${pwdMaxAge}`
          expireTimeMail=`date -d @$expireTime "+%s"` ; now=`date +%s`
          expireDays=`echo $(( (${expireTimeMail} - ${now} )/(60*60*24) ))`
      
          if [ ${currentTime} -gt ${expireTime} ]; then
              echo "Password expired for: ${login}" ; continue
          else
              echo "Password will expire for: ${login} in ${expireDays} days" ; continue
          fi
          
      done < ${result_file} ; rm -rf ${tmp_dir} ; exit 0
      

      注意:新密码政策可能不会立即执行,您可能需要等待密码更改才能生效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-08
        • 2023-04-09
        • 2013-01-17
        • 1970-01-01
        • 2015-12-23
        • 2011-04-21
        • 1970-01-01
        • 2013-04-24
        相关资源
        最近更新 更多