| | 1 | ===Configure OpenLDAP Password Expiry Email Notification=== |
| | 2 | |
| | 3 | This tutorial will provide some basics steps to take to configure OpenLDAP to send out notifications via email to users mailbox informing them about the password expiration also system admins. |
| | 4 | |
| | 5 | The Script can be found at [https://github.com/ltb-project/ldap-scripts here] |
| | 6 | |
| | 7 | {{{ |
| | 8 | grep -Ev "^\s[#\;]|^\s$|^#" checkLdapPwdExpiration.sh |
| | 9 | }}} |
| | 10 | |
| | 11 | {{{ |
| | 12 | MY_LDAP_HOSTURI="ldapi:///" |
| | 13 | MY_LDAP_DEFAULTPWDPOLICYDN="cn=default,ou=pwpolicy,dc=ldapmaster,dc=kifarunix-demo,dc=com" |
| | 14 | MY_LDAP_SEARCHBASE="ou=people,dc=ldapmaster,dc=kifarunix-demo,dc=com" |
| | 15 | MY_LDAP_SEARCHFILTER="(&(uid=*)(objectClass=inetOrgPerson))" |
| | 16 | MY_LDAP_SEARCHSCOPE="one" |
| | 17 | MY_LDAP_SEARCHBIN="/usr/bin/ldapsearch" |
| | 18 | MY_LDAP_NAME_ATTR=cn |
| | 19 | MY_LDAP_LOGIN_ATTR=uid |
| | 20 | MY_LDAP_MAIL_ATTR=mail |
| | 21 | export LC_ALL=en_US.UTF-8 |
| | 22 | MY_MAIL_BODY="Hi %name,\n\n \ |
| | 23 | Your password will expire in %expireDays days on %expireTimeTZ.\n\n \ |
| | 24 | Visit Kifarunix-demo Self Service Password site, https://ldap-ssp.kifarunix-demo.com to reset your password.\n\n \ |
| | 25 | As a reminder, ensure that your password conforms to the company outlined password policies.\n\n \ |
| | 26 | Kifarunix-demo IT team,\n |
| | 27 | Regards." |
| | 28 | EX_MAIL_BODY="Hi %name,\n\n \ |
| | 29 | Your password expired on %expireTimeTZ.\n\n \ |
| | 30 | Kindly contact Kifarunix-demo IT team to help reset the password.\n\n \ |
| | 31 | Kifarunix-demo IT team,\n |
| | 32 | Regards." |
| | 33 | MY_MAIL_SUBJECT="LDAP Account Password Expiry Status" |
| | 34 | MY_MAIL_BIN="mail" |
| | 35 | MY_LOG_HEADER="`date +\"%b %e,%Y %T\"`" |
| | 36 | MY_GAWK_BIN="/usr/bin/gawk" |
| | 37 | getTimeInSeconds() { |
| | 38 | date=0 |
| | 39 | os=`uname -s` |
| | 40 | if [ "$1" ]; then |
| | 41 | date=`${MY_GAWK_BIN} 'BEGIN { \ |
| | 42 | if (ARGC == 2) { \ |
| | 43 | print mktime(ARGV[1]) \ |
| | 44 | } \ |
| | 45 | exit 0 }' "$1"` |
| | 46 | else |
| | 47 | if [ "${os}" = "SunOS" ]; then |
| | 48 | date=`/usr/bin/truss /usr/bin/date 2>&1 | nawk -F= \ |
| | 49 | '/^time\(\)/ {gsub(/ /,"",$2);print $2}'` |
| | 50 | else |
| | 51 | now=`date +"%Y %m %d %H %M %S" -u` |
| | 52 | date=`getTimeInSeconds "$now"` |
| | 53 | fi |
| | 54 | fi |
| | 55 | echo ${date} |
| | 56 | } |
| | 57 | tmp_dir="/tmp/$$.checkldap.tmp" |
| | 58 | result_file="${tmp_dir}/res.tmp.1" |
| | 59 | buffer_file="${tmp_dir}/buf.tmp.1" |
| | 60 | tmp_dir_stats="/tmp/ldap-password-stats" |
| | 61 | ldap_param="-Y EXTERNAL -H ${MY_LDAP_HOSTURI} -LLL -Q" |
| | 62 | nb_users=0 |
| | 63 | nb_expired_users=0 |
| | 64 | nb_warning_users=0 |
| | 65 | if [ -d ${tmp_dir} ]; then |
| | 66 | echo "Error : temporary directory exists (${tmp_dir})" |
| | 67 | exit 1 |
| | 68 | fi |
| | 69 | mkdir ${tmp_dir} |
| | 70 | if [ ${MY_LDAP_ROOTDN} ]; then |
| | 71 | ldap_param="${ldap_param} -D ${MY_LDAP_ROOTDN} -w ${MY_LDAP_ROOTPW}" |
| | 72 | fi |
| | 73 | ${MY_LDAP_SEARCHBIN} ${ldap_param} -s ${MY_LDAP_SEARCHSCOPE} \ |
| | 74 | -b "${MY_LDAP_SEARCHBASE}" "${MY_LDAP_SEARCHFILTER}" \ |
| | 75 | "dn" > ${result_file} |
| | 76 | while read dnStr |
| | 77 | do |
| | 78 | if [ ! "${dnStr}" ]; then |
| | 79 | continue |
| | 80 | fi |
| | 81 | dn=`echo ${dnStr} | cut -d : -f 2` |
| | 82 | nb_users=`expr ${nb_users} + 1` |
| | 83 | ${MY_LDAP_SEARCHBIN} ${ldap_param} -s base -b "${dn}" \ |
| | 84 | ${MY_LDAP_NAME_ATTR} ${MY_LDAP_LOGIN_ATTR} ${MY_LDAP_MAIL_ATTR} pwdChangedTime pwdPolicySubentry \ |
| | 85 | > ${buffer_file} |
| | 86 | login=`grep -w "${MY_LDAP_LOGIN_ATTR}:" ${buffer_file} | cut -d : -f 2 \ |
| | 87 | | sed "s/^ *//;s/ *$//"` |
| | 88 | name=`grep -w "${MY_LDAP_NAME_ATTR}:" ${buffer_file} | cut -d : -f 2\ |
| | 89 | | sed "s/^ *//;s/ *$//"` |
| | 90 | mail=`grep -w "${MY_LDAP_MAIL_ATTR}:" ${buffer_file} | cut -d : -f 2 \ |
| | 91 | | sed "s/^ *//;s/ *$//"` |
| | 92 | pwdChangedTime=`grep -w "pwdChangedTime:" ${buffer_file} \ |
| | 93 | | cut -d : -f 2 | cut -c 1-15 | sed "s/^ *//;s/ *$//"` |
| | 94 | pwdPolicySubentry=`grep -w "pwdPolicySubentry:" ${buffer_file} \ |
| | 95 | | cut -d : -f 2 | sed "s/^ *//;s/ *$//"` |
| | 96 | if [ ! "${pwdChangedTime}" ]; then |
| | 97 | echo "No password change date for ${login} (${mail})" >> ${tmp_dir_stats} |
| | 98 | continue |
| | 99 | fi |
| | 100 | if [ ! "${pwdPolicySubentry}" -a ! "${MY_LDAP_DEFAULTPWDPOLICYDN}" ]; then |
| | 101 | echo "No password policy for ${login} (${mail})" >> ${tmp_dir_stats} |
| | 102 | continue |
| | 103 | fi |
| | 104 | ldap_search="${MY_LDAP_SEARCHBIN} ${ldap_param} -s base" |
| | 105 | if [ "${pwdPolicySubentry}" ]; then |
| | 106 | ldap_search="${ldap_search} -b ${pwdPolicySubentry}" |
| | 107 | else |
| | 108 | ldap_search="${ldap_search} -b ${MY_LDAP_DEFAULTPWDPOLICYDN}" |
| | 109 | fi |
| | 110 | ldap_search="$ldap_search pwdMaxAge pwdExpireWarning pwdMinLength pwdInHistory" |
| | 111 | pwdMaxAge=`${ldap_search} | grep -w "pwdMaxAge:" | cut -d : -f 2 \ |
| | 112 | | sed "s/^ *//;s/ *$//"` |
| | 113 | pwdExpireWarning=`${ldap_search} | grep -w "pwdExpireWarning:" | cut -d : -f 2 \ |
| | 114 | | sed "s/^ *//;s/ *$//"` |
| | 115 | pwdMinLength=`${ldap_search} | grep -w "pwdMinLength:" | cut -d : -f 2 \ |
| | 116 | | sed "s/^ *//;s/ *$//"` |
| | 117 | pwdInHistory=`${ldap_search} | grep -w "pwdInHistory:" | cut -d : -f 2 \ |
| | 118 | | sed "s/^ *//;s/ *$//"` |
| | 119 | if [ ! "${pwdMaxAge}" ]; then |
| | 120 | echo "No password expiration configured for ${login} (${mail})" >> ${tmp_dir_stats} |
| | 121 | continue |
| | 122 | fi |
| | 123 | MY_MAIL_DELAY=${MY_MAIL_DELAY:=$pwdExpireWarning} |
| | 124 | if [ "${pwdChangedTime}" ]; then |
| | 125 | s=`echo ${pwdChangedTime} | cut -c 13-14` |
| | 126 | m=`echo ${pwdChangedTime} | cut -c 11-12` |
| | 127 | h=`echo ${pwdChangedTime} | cut -c 9-10` |
| | 128 | d=`echo ${pwdChangedTime} | cut -c 7-8` |
| | 129 | M=`echo ${pwdChangedTime} | cut -c 5-6` |
| | 130 | y=`echo ${pwdChangedTime} | cut -c 1-4` |
| | 131 | currentTime=`getTimeInSeconds` |
| | 132 | pwdChangedTime=`getTimeInSeconds "$y $M $d $h $m $s"` |
| | 133 | diffTime=`expr ${currentTime} - ${pwdChangedTime}` |
| | 134 | fi |
| | 135 | expireTime=`expr ${pwdChangedTime} + ${pwdMaxAge}` |
| | 136 | if [ ${currentTime} -gt ${expireTime} ]; then |
| | 137 | nb_expired_users=`expr ${nb_expired_users} + 1` |
| | 138 | expireTime=`date -d @$expireTime "+%A %d, %B %Y at %T"` |
| | 139 | logmsg="${EX_MAIL_BODY}" |
| | 140 | logmsg=`echo -e ${logmsg} | sed "s/%name/${name}/; \ |
| | 141 | s/%login/${login}/; s/%expireTimeTZ/${expireTime}/; s/%pwdMinLength/${pwdMinLength}/; s/%pwdInHistory/${pwdInHistory}/; \ |
| | 142 | s/%expireDays/${expireDays}/"` |
| | 143 | echo "${logmsg}" | ${MY_MAIL_BIN} -s "${MY_MAIL_SUBJECT}" ${mail} >&2 |
| | 144 | echo "Password expired for ${login} on ${expireTime}. Mail sent to ${mail}" >> ${tmp_dir_stats} |
| | 145 | continue |
| | 146 | fi |
| | 147 | expireTimeTZ=`date -d @$expireTime "+%A %d, %B %Y at %T"` |
| | 148 | expireTimeMail=`date -d @$expireTime "+%s"` |
| | 149 | now=`date +%s` |
| | 150 | expireDays=`echo $(( (${expireTimeMail} - ${now} )/(60*60*24) ))` |
| | 151 | if [ "${mail}" -a "${name}" \ |
| | 152 | -a "${login}" -a "${diffTime}" -a "${pwdMaxAge}" ] |
| | 153 | then |
| | 154 | diffTime=`expr ${diffTime} + ${MY_MAIL_DELAY}` |
| | 155 | if [ ${diffTime} -gt ${pwdMaxAge} ]; then |
| | 156 | logmsg="${MY_MAIL_BODY}" |
| | 157 | logmsg=`echo -e ${logmsg} | sed "s/%name/${name}/; \ |
| | 158 | s/%login/${login}/; s/%expireTimeTZ/${expireTimeTZ}/; s/%pwdMinLength/${pwdMinLength}/; s/%pwdInHistory/${pwdInHistory}/; \ |
| | 159 | s/%expireDays/${expireDays}/"` |
| | 160 | echo "${logmsg}" | ${MY_MAIL_BIN} -s "${MY_MAIL_SUBJECT}" ${mail} >&2 |
| | 161 | echo "Password warning for ${login} (expiry date, ${expireTimeTZ}). Mail sent to ${mail}" >> ${tmp_dir_stats} |
| | 162 | nb_warning_users=`expr ${nb_warning_users} + 1` |
| | 163 | fi |
| | 164 | fi |
| | 165 | done < ${result_file} |
| | 166 | sed -i "1iHello Admin,\nFind the LDAP users account password expiry status as at ${MY_LOG_HEADER}.\n" ${tmp_dir_stats} |
| | 167 | echo "Total User Accounts checked: ${nb_users}" >> ${tmp_dir_stats} |
| | 168 | echo "Accounts with Expired Passwords: ${nb_expired_users}" >> ${tmp_dir_stats} |
| | 169 | echo "Accounts with Passwords in Warning state: ${nb_warning_users}" >> ${tmp_dir_stats} |
| | 170 | sed -i -e '/^Total.*/i\\ ' -e '/^Total.*/i ===== Statistics =====' ${tmp_dir_stats} |
| | 171 | mail -s "LDAP Password Expiration Status" kifaunix@gmail.com < ${tmp_dir_stats} |
| | 172 | rm -rf ${tmp_dir} |
| | 173 | rm -rf ${tmp_dir_stats} |
| | 174 | exit 0}}} |