728x90
반응형

개요

LDAP을 사용 중인 사용자들에게 

보안정책에 따라 패스워드 만료일이 다가오거나 만료가 되었을 때

메일로 알려주는 역할을 한다.

메일 문구는 예씨로 작성 하였다. 자유롭게 변경 가능하다.

MY_LDAP_HOSTURI="ldapi:///"
MY_LDAP_DEFAULTPWDPOLICYDN="cn=default,ou=Policies,cn=manager,dc=test,dc=com"
MY_LDAP_EXCLUDEPWDPOLICYDN="cn=e,cn=default,ou=Policies,cn=manager,dc=test,dc=com"
MY_LDAP_SEARCHBASE="ou=People,dc=test,dc=com"
MY_LDAP_SEARCHFILTER="(&(uid=*)(objectClass=inetOrgPerson))"
MY_LDAP_SEARCHSCOPE="one"
MY_LDAP_SEARCHBIN="/usr/bin/ldapsearch"
#MY_MAIL_DELAY=10
MY_LDAP_NAME_ATTR=cn
MY_LDAP_LOGIN_ATTR=uid
MY_LDAP_MAIL_ATTR=mail
export LC_ALL=ko_KR.UTF-8
MY_MAIL_BODY="
        안녕하세요 %name 님,\n\n \

        귀하의 비밀번호 변경이 필요합니다. \n\n \

        해당 비밀번호는 정보보호 정책에 의해 %expireTimeTZ, %expireDays 일 후 만료 됩니다. \n\n \

        아래 해당 정책에 준수하여 변경 부탁드립니다.:\n\n \

        \t\t - 영문 대소문자/숫자/특수문자 중 3가지 이상 조합, 최소 8자리 이상 \n\n \
        \t\t - 비밀번호 변경 페이지  \n \
        \t\t    http://ssp.ldap.test.com/ \n\n \
        \t\t - 비밀번호 변경 후 공용폴더 사용자들은 Windows 자격증명 변경이 필요합니다. \n\n \
        \t\t - 아래 매뉴얼을 확인 하시어 Windows 자격증명을 변경 하세요.
        \t\t    

        추가로 문의사항은 Infra Part에 문의 바랍니다. \n\n \

        감사합니다."
EX_MAIL_BODY="
        안녕하세요 %name 님,\n\n \

        %name 님의 비밀번호가 %expireTimeTZ 부로 만료 되었습니다. \n\n \

        아래 주소로 접속하셔서 '패스워드 초기화' 를 진행하시기 바랍니다. \n\n \

        \t\t - 비밀번호 초기화 페이지 \n \
        \t\t    http://ssp.ldap.test.com/index.php?action=sendtoken \n\n \
        \t\t - 그룹웨어 메일 확인 필수 \n\n \
        \t\t - 비밀번호 초기화 후 공용폴더 사용자들은 Windows 자격증명 변경이 필요합니다. \n\n \
        \t\t - 아래 매뉴얼을 확인 하시어 Windows 자격증명을 변경 하세요.
        \t\t   

        추가 문의사항 있을 시 Infra Part에 문의 바랍니다. \n\n \

        감사합니다."
MY_MAIL_SUBJECT="[회사] 비밀번호 상태 안내 메일 입니다."
MY_MAIL_BIN="mail"
#MY_LOG_HEADER="`date +\"%b %e,%Y %T\"`"
MY_LOG_HEADER="`TZ='Asia/Seoul' date +\"%Y년 %B %d일 %A %T\"`"
MY_GAWK_BIN="/usr/bin/gawk"
getTimeInSeconds() {
        date=0
        os=`uname -s`
        if [ "$1" ]; then
                #date=`${MY_GAWK_BIN} 'BEGIN  { \
                date=`TZ=UTC ${MY_GAWK_BIN} 'BEGIN  { \
                        if (ARGC == 2) { \
                                print mktime(ARGV[1]) \
                        } \
                        exit 0 }' "$1"`
        else
                if [ "${os}" = "SunOS" ]; then
                        date=`/usr/bin/truss /usr/bin/date 2>&1 | nawk -F= \
                                '/^time\(\)/ {gsub(/ /,"",$2);print $2}'`
                else
                        now=`date +"%Y %m %d %H %M %S" -u`
                        #now=`date +"%Y %m %d %H %M %S"`
                        date=`getTimeInSeconds "$now"`
                fi
        fi
        echo ${date}
}
tmp_dir="/tmp/$$.checkldap.tmp"
result_file="${tmp_dir}/res.tmp.1"
buffer_file="${tmp_dir}/buf.tmp.1"
tmp_dir_stats="/tmp/ldap-password-stats"
ldap_param="-Y EXTERNAL -H ${MY_LDAP_HOSTURI} -LLL -Q"
nb_users=0
nb_expired_users=0
nb_warning_users=0
nb_exclude_users=0
if [ -d ${tmp_dir} ]; then
        echo "Error : temporary directory exists (${tmp_dir})"
        exit 1
fi
mkdir ${tmp_dir}
if [ ${MY_LDAP_ROOTDN} ]; then
        ldap_param="${ldap_param} -D ${MY_LDAP_ROOTDN} -w ${MY_LDAP_ROOTPW}"
fi
${MY_LDAP_SEARCHBIN} ${ldap_param} -s ${MY_LDAP_SEARCHSCOPE} \
        -b "${MY_LDAP_SEARCHBASE}" "${MY_LDAP_SEARCHFILTER}" \
        "dn" > ${result_file}
while read dnStr
do
        if [ ! "${dnStr}" ]; then
                continue
        fi
        dn=`echo ${dnStr} | cut -d : -f 2`
        nb_users=`expr ${nb_users} + 1`
        ${MY_LDAP_SEARCHBIN} ${ldap_param} -s base -b "${dn}" \
                ${MY_LDAP_NAME_ATTR} ${MY_LDAP_LOGIN_ATTR} ${MY_LDAP_MAIL_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/ *$//"`
        name2=`echo ${name}`
        mail=`grep -w "${MY_LDAP_MAIL_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/ *$//"`
        if [ ! "${pwdChangedTime}" ]; then
                echo "${login} (${mail}) 해당 계정은 패스워드 변경 날짜가 존재하지 않습니다." >> ${tmp_dir_stats}
                continue
        fi
        if [ ! "${pwdPolicySubentry}" -a ! "${MY_LDAP_DEFAULTPWDPOLICYDN}" ]; then
                echo "${login} (${mail}) 해당 계정은 패스워드 정책이 걸려있지 않습니다." >> ${tmp_dir_stats}
                continue
        fi
        if [ "${pwdPolicySubentry}" ]; then
                echo "${login} (${mail}) 해당 계정은 패스워드 정책 제외 대상 입니다." >> ${tmp_dir_stats}
                continue
        fi
        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/ *$//"`
        if [ ! "${pwdMaxAge}" ]; then
                echo "${login} (${mail}) 해당 계정은 만료 설정이 되어 있지 않습니다." >> ${tmp_dir_stats}
                continue
        fi
        MY_MAIL_DELAY=${MY_MAIL_DELAY:=$pwdExpireWarning}
        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}`
        expireWarningTime=`expr ${pwdChangedTime} + ${MY_MAIL_DELAY}`
        if [ ${currentTime} -gt ${expireTime} ]; then
                nb_expired_users=`expr ${nb_expired_users} + 1`
                expireTime=`date -d @$expireTime "+%Y년 %B %d일 %A %T"`
                logmsg="${EX_MAIL_BODY}"
                logmsg=`echo -e ${logmsg} | sed "s/%name/${name}/; \
                        s/%login/${login}/; s/%expireTimeTZ/${expireTime}/; s/%pwdMinLength/${pwdMinLength}/; s/%pwdInHistory/${pwdInHistory}/; \
                        s/%expireDays/${expireDays}/"`
                #echo "${logmsg}" | ${MY_MAIL_BIN} -S "from=Infra Part <ldap>" -s "${MY_MAIL_SUBJECT}" ${mail} >&2
                echo "${logmsg}" | ${MY_MAIL_BIN} -S "from=Infra Part <ldap>" -s "${MY_MAIL_SUBJECT}" test@test.co.kr >&2
                echo "${login} 해당 계정이 ${expireTime} 부로 패스워드 정책에 의해 만료 되었습니다. ${mail} 해당 메일로 안내 메일이 발송 되었습니다." >> ${tmp_dir_stats}
                continue
        fi
        expireTimeTZ=`date -d @$expireTime "+%Y년 %B %d일 %A %T"`
        expireTimeMail=`date -d @$expireTime "+%s"`
        now=`date +%s`
        expireDays=`echo $(( (${expireTimeMail} - ${now} )/(60*60*24) ))`
        if [ "${mail}" -a "${name}" \
                -a "${login}" -a "${diffTime}" -a "${pwdMaxAge}" ]
        then
                diffTime=`expr ${diffTime} + ${MY_MAIL_DELAY}`
                #if [ ${diffTime} -gt ${pwdMaxAge} ]; then
                if [ ${currentTime} -gt ${expireWarningTime} -a ${currentTime} -lt ${expireTime} ]; then
                        logmsg="${MY_MAIL_BODY}"
                        logmsg=`echo -e ${logmsg} | sed "s/%name/${name}/; \
                                s/%login/${login}/; s/%expireTimeTZ/${expireTimeTZ}/; s/%pwdMinLength/${pwdMinLength}/; s/%pwdInHistory/${pwdInHistory}/; \
                                s/%expireDays/${expireDays}/"`
                        #echo "${logmsg}" | ${MY_MAIL_BIN} -S "from=Infra Part <ldap>" -s "${MY_MAIL_SUBJECT}" ${mail} >&2
                        echo "${logmsg}" | ${MY_MAIL_BIN} -S "from=Infra Part <ldap>" -s "${MY_MAIL_SUBJECT}" test@test.co.kr >&2
                        echo "${login} 해당 계정의 만료 날짜가 다가옵니다. ${mail} 해당 메일로 안내 발송 되었습니다. (만료 날짜, ${expireTimeTZ})." >> ${tmp_dir_stats}
                        nb_warning_users=`expr ${nb_warning_users} + 1`
                fi
        fi
done < ${result_file}
sed -i "1i관리자님,\n${MY_LOG_HEADER} 기준, 임직원 패스워드 상태 리스트 입니다.\n" ${tmp_dir_stats}
echo "Total 체크된 사용자: ${nb_users}" >> ${tmp_dir_stats}
echo "비밀번호 만료된 사용자: ${nb_expired_users}" >> ${tmp_dir_stats}
echo "비밀번호 만료 사전 안내된 사용자: ${nb_warning_users}" >> ${tmp_dir_stats}
sed -i -e '/^Total.*/i\\ ' -e '/^Total.*/i ===== 통계 =====' ${tmp_dir_stats}
#mail -S "from=Infra Part <ldap>" -s "[LDAP] 임직원 패스워드 만료 상태 리스트" infra_p@test.co.kr < ${tmp_dir_stats}
mail -S "from=Infra Part <ldap>" -s "[LDAP] 임직원 패스워드 만료 상태 리스트" t@test.co.kr < ${tmp_dir_stats}
rm -rf ${tmp_dir}
rm -rf ${tmp_dir_stats}
exit 0
728x90
300x250

+ Recent posts