서버의 사용자 계정에 대해 비밀번호 변경일시를 주기적으로 변경하고 싶을 때 사용할 수 있는 방법입니다.
대상 계정은 UID가 1000 이상인 것 중에, 잠기지(LK) 않은 계정입니다.
만약 제외할 계정이 있는 경우, EXCLUDE_USERS에 추가하고,
포함할 계정이 있는 경우, INCLUDE_USERS에 추가하면 됩니다.
1. 스크립트 생성
# vi /root/set_pwd_pol.sh
#!/bin/bash
if [ "$(id -u)" -ne 0 ]; then
echo "run as a root user"
exit 1
fi
EXCLUDE_USERS=$(getent passwd | awk -F: '$3 < 1000 {print $1}' | tr '\n' ' ')
EXCLUDE_USERS+="admin backup"
INCLUDE_USERS="root"
LOGIN_DEFS="/etc/login.defs"
PASS_MAX_DAYS=$(awk '/^PASS_MAX_DAYS/ {print $2}' $LOGIN_DEFS | grep -E '^[0-9]+$')
PASS_MIN_DAYS=$(awk '/^PASS_MIN_DAYS/ {print $2}' $LOGIN_DEFS | grep -E '^[0-9]+$')
PASS_WARN_AGE=$(awk '/^PASS_WARN_AGE/ {print $2}' $LOGIN_DEFS | grep -E '^[0-9]+$')
PASS_MAX_DAYS=${PASS_MAX_DAYS:-90}
PASS_MIN_DAYS=${PASS_MIN_DAYS:-1}
PASS_WARN_AGE=${PASS_WARN_AGE:-10}
MODE="echo"
if [ "$1" == "-run" ]; then
MODE="run"
fi
for USER in $(getent passwd | cut -d: -f1); do
if ! [[ " $INCLUDE_USERS " == *" $USER "* ]]; then
USER_UID=$(id -u "$USER")
if [ "$USER_UID" -lt 1000 ]; then
continue
fi
if passwd -S "$USER" | grep -q ' LK '; then
continue
fi
if [[ " $EXCLUDE_USERS " == *" $USER "* ]]; then
continue
fi
fi
CHAGE_CMD="chage -d $(date +%Y-%m-%d) -m $PASS_MIN_DAYS -M $PASS_MAX_DAYS -W $PASS_WARN_AGE -I -1 -E -1 $USER"
if [ "$MODE" == "run" ]; then
eval $CHAGE_CMD
else
echo "$USER: $CHAGE_CMD"
fi
done
# chmod 700 /root/set_pwd_pol.sh
2. 사전 검증 (-run 없이 실행하면 명령이 실행되지 않고 보여주기만 합니다)
# /root/set_pwd_pol.sh
3. 스케줄 등록
# crontab -e
30 9 1 * * /root/set_pwd_pol.sh -run