Shell - OS 이하 Password 만료 예정 계정 확인 및 로깅

System Story/CentOS 5,6 2017.02.22 15:40



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]#



















Trackbacks 0 : Comments 2
  1. 불펭만세 2017.08.23 19:20 Modify/Delete Reply

    불펭님 포스트 잘 활용하고 있습니다.
    만수무강 하십쇼!

Write a comment