Linux 는 계정 별로 Password에 대한 만료 정책을 지정 할 수 있으며,
아래와 같이 chage 명령을 통해 Password 에 대한 정책을 지정하고 현황을 확인 할 수 있다.
[root@centos5 ~]# [root@centos5 ~]# chage -l helperchoi Last password change : Feb 04, 2017 Password expires : Feb 05, 2017 Password inactive : never Account expires : never Minimum number of days between password change : 0 Maximum number of days between password change : 1 Number of days of warning before password expires : 7 [root@centos5 ~]# [root@centos5 ~]#
|
만약 특정 계정의 패스워드 사용기간이 만료되면 정책에 따라 계정 사용이 만료되거나,
패스워드 변경 전 까지 일시적으로 로그인이 제한 될 수 있다.
또한 아래와 같이 패스워드가 만료된 계정 이하 crontab 에 특정 Service 제공을 위해 batch Job등이 등록되어 있다면,
PAM 인증 모듈에 의해 인증 토큰이 유효하지 않다는 메시지와 함께 해당 Cron Job 마저 동작 할 수 없게 된다.
[root@centos5 ~]# [root@centos5 ~]# cat /var/spool/cron/helperchoi * * * * * sudo sh -c echo TEST [root@centos5 ~]#
[root@centos5 ~]# [root@centos5 ~]# tail -f /var/log/cron
Feb 22 15:05:01 centos5 crond[32662]: 더이상 인증 토큰이 유효하지 않음: 새로운 인증 토큰 필요 Feb 22 15:05:01 centos5 crond[32662]: CRON (helperchoi) ERROR: failed to open PAM security session: 성공 Feb 22 15:05:01 centos5 crond[32662]: CRON (helperchoi) ERROR: cannot set security context Feb 22 15:06:01 centos5 crond[32672]: 더이상 인증 토큰이 유효하지 않음: 새로운 인증 토큰 필요 Feb 22 15:06:01 centos5 crond[32672]: CRON (helperchoi) ERROR: failed to open PAM security session: 성공 Feb 22 15:06:01 centos5 crond[32672]: CRON (helperchoi) ERROR: cannot set security context Feb 22 15:07:01 centos5 crond[32676]: 더이상 인증 토큰이 유효하지 않음: 새로운 인증 토큰 필요 Feb 22 15:07:01 centos5 crond[32676]: CRON (helperchoi) ERROR: failed to open PAM security session: 성공 Feb 22 15:07:01 centos5 crond[32676]: CRON (helperchoi) ERROR: cannot set security context Feb 22 15:08:01 centos5 crond[32680]: 더이상 인증 토큰이 유효하지 않음: 새로운 인증 토큰 필요 Feb 22 15:08:01 centos5 crond[32680]: CRON (helperchoi) ERROR: failed to open PAM security session: 성공
[root@centos5 ~]#
|
이러한 배경으로 아래와 같이 얘기치 않은 계정 만료를 사전에 모니터링 하고 로깅 할 수 있는 Script를 작성하고 등록해 보고자 한다.
가. Script 기능
1. Linux OS 이하 영구 패스워드를 사용하지 않는 모든 계정(root 포함)에 대한 Password 만료일 체크 및 만료 도래 경고 Message Loging
2. 각 계정별 패스워드 정책을 체크하고 만료일을 기준으로 10일 전부터 경고 Message Loging (/var/log/messages)
나. Script 수행시 로그 예시
[root@centos5 shell]# [root@centos5 shell]# ./check_pwd_expires.sh [root@centos5 shell]# [root@centos5 shell]# [root@centos5 shell]# tail -f /var/log/messages Feb 4 04:02:12 centos5 syslogd 1.4.1: restart.
###### WARNING helperchoi Password Expires 1 days left ###### ###### WARNING test2 Password Expires 9 days left ###### ###### WARNING test3 Password Expires 10 days left ######
|
다. Script 적용
1. 아래와 같이 Shell Script 작성
[root@centos5 shell]# vi /root/shell/check_pwd_expires.sh #!/bin/bash
export LANG=C export LC_ALL=C
WARNING_DAYS=10 SYS_LOG=/var/log/messages
declare -a ARRAY_LIMIT_USER USER_LIST=`cat /etc/passwd | grep -v "operator" | cut -d ":" -f 1`
for LIST in ${USER_LIST}; do CHECK_LIMIT_USER=`chage -l ${LIST} | grep "Password expires" | grep never | wc -l` if [ ${CHECK_LIMIT_USER} -eq 0 ]; then ARRAY_LIMIT_USER=("${ARRAY_LIMIT_USER[@]}" "${LIST}") fi done
DIFF_DATE() { TDAY=$(date -d "$1" +%s) CDAY=$(date -d "$2" +%s) DIFF_RESULT=`echo "(${TDAY} - ${CDAY}) / 86400" | bc` }
LOOP_COUNT=0 LOOP_LIMIT=${#ARRAY_LIMIT_USER[@]}
while [ "${LOOP_COUNT}" -lt "${LOOP_LIMIT}" ] do LIMIT_USER=${ARRAY_LIMIT_USER[${LOOP_COUNT}]} LAST_CHANGE_DAY=`chage -l ${LIMIT_USER} | grep "Last password change" | awk -F: '{print $2}' | sed 's#,##g' | awk '{print $2}'` LAST_CHANGE_MOON=`chage -l ${LIMIT_USER} | grep "Last password change" | awk -F: '{print $2}' | sed 's#,##g' | awk '{print $1}'` LAST_CHANGE_YEAR=`chage -l ${LIMIT_USER} | grep "Last password change" | awk -F: '{print $2}' | sed 's#,##g' | awk '{print $3}'` CHANGE_LIMIT_DAY=`chage -l ${LIMIT_USER} | grep "Maximum number" | cut -d ":" -f 2 | sed 's# ##g'` INFO_DAYS=`echo "${CHANGE_LIMIT_DAY} - ${WARNING_DAYS}" | bc` TO_DAYS=`date | awk '{print $2, $3, $6}'`
DIFF_DATE "${TO_DAYS}" "${LAST_CHANGE_MOON} ${LAST_CHANGE_DAY} ${LAST_CHANGE_YEAR}"
if [ ${DIFF_RESULT} -ge ${INFO_DAYS} ] then WDAY=`echo "${CHANGE_LIMIT_DAY} - ${DIFF_RESULT}" | bc` echo "###### WARNING ${LIMIT_USER} Password Expires ${WDAY} days left ######" >> ${SYS_LOG} fi
LOOP_COUNT=`echo "${LOOP_COUNT} + 1" | bc` done |
2. 일일 1회 Check Script가 실행 되도록 Crontab 등록 (예시 09:30분)
[root@centos5 shell]# [root@centos5 shell]# crontab -e 30 09 * * * sudo sh -c "/root/shell/check_pwd_expires.sh" [root@centos5 shell]# [root@centos5 shell]#
|