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
'IT > OpenLDAP' 카테고리의 다른 글
PostgreSQL에서 사용자 데이터 긁어오기 (0) | 2022.07.13 |
---|---|
OpenLDAP 패스워드 정책 구성하기(with 예외처리도 포함) (0) | 2022.02.21 |
실사용에 유용한 ldap command 사용방법 (ldapadd, ldapmodify, ldappassword 등등) (0) | 2022.02.17 |
LDAP 사용자 자동 등록 처리 (0) | 2022.02.15 |
OpenLDAP Logging 설정 방법 (0) | 2022.02.03 |