OS/CentOS&Rocky

비밀번호 변경일시 및 정책 일괄 설정

Lawmin 2025. 5. 12. 16:54

서버의 사용자 계정에 대해 비밀번호 변경일시를 주기적으로 변경하고 싶을 때 사용할 수 있는 방법입니다.

대상 계정은 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