/etc/shadow 파일 분석과 리눅스 사용자 비밀번호 관리 가이드

리눅스 시스템에서 사용자 비밀번호 정보는 /etc/shadow 파일에 안전하게 저장됩니다. 이 파일은 일반 사용자에게 읽기 권한이 없으며, 루트 사용자만 접근할 수 있습니다.

1. /etc/shadow 파일 구조

파일 내용은 콜론(:)으로 구분된 9개의 필드로 구성됩니다. man 5 shadow 명령어로 자세한 도움말을 볼 수 있습니다.

[root@linux ~]# head -3 /etc/shadow
root:$6$kcgcu794R0VP3fDL$aYN8XUbtWvZ4QQtT2xVW.N2CgE3YLPdtnprAAtKZUgNdq8itUJEN6NoYQDarLUevcDCWrxMVId8b18ujwST1b0::0:99999:7:::
bin:*:17632:0:99999:7:::
daemon:*:17632:0:99999:7:::
필드설명
name로그인 이름. 유효한 사용자명이어야 합니다.
password암호화된 비밀번호. 세 부분으로 나뉘며 $로 구분합니다. 첫 번째는 해시 알고리즘(1=MD5, 5=SHA-256, 6=SHA-512), 두 번째는 솔트(salt), 세 번째는 암호화된 해시 값입니다. 비밀번호 앞에 !가 하나면 계정이 잠긴 상태(로컬 전환 가능, 원격 로그인 불가), !! 두 개면 비밀번호가 설정되지 않았음을 의미합니다.
lastchange마지막 비밀번호 변경일. 1970년 1월 1일부터 경과한 일수입니다.
min-age비밀번호 변경 후 다시 변경할 수 없을 때까지의 최소 일수. 0이면 언제든 변경 가능합니다.
max-age비밀번호 만료일. 이 기간 내에 비밀번호를 변경해야 합니다.
warning경고 기간. 만료 며칠 전부터 사용자에게 경고 메시지를 보여줄지 지정합니다. 0이면 경고 없음.
inactive유예 기간. 비밀번호가 만료된 후에도 로그인이 허용되는 추가 일수입니다.
expire계정 만료일. 1970년 1월 1일부터 경과한 일수입니다. 0이거나 비어 있으면 만료되지 않습니다.
blank예약된 필드. 현재는 사용되지 않습니다.

참고: 두 사용자가 동일한 비밀번호를 사용하더라도 솔트가 다르기 때문에 암호화된 결과가 다릅니다.

실습 예시:

[root@linux ~]# useradd u1
[root@linux ~]# useradd u2
[root@linux ~]# passwd u1   # 대화식 변경
[root@linux ~]# echo "myP@ssw0rd" | passwd --stdin u2   # 비대화식 변경
[root@linux ~]# tail -2 /etc/shadow
u1:$6$abc123$hash_value_1:18000:0:99999:7:::
u2:$6$def456$hash_value_2:18000:0:99999:7:::

2. /etc/login.defs 설정 파일

/etc/login.defs 파일은 사용자 계정 생성 시 기본값을 정의합니다. 빈 줄과 주석을 제외한 설정은 다음과 같습니다.

[root@linux ~]# grep -v "^$\|^#" /etc/login.defs
MAIL_DIR        /var/spool/mail
PASS_MAX_DAYS   99999
PASS_MIN_DAYS   0
PASS_MIN_LEN    5
PASS_WARN_AGE   7
UID_MIN                  1000
UID_MAX                 60000
SYS_UID_MIN               201
SYS_UID_MAX               999
GID_MIN                  1000
GID_MAX                 60000
SYS_GID_MIN               201
SYS_GID_MAX               999
CREATE_HOME     yes
UMASK           077
USERGROUPS_ENAB yes
ENCRYPT_METHOD SHA512

주요 설정 설명:

  • CREATE_HOME: 새 사용자 생성 시 홈 디렉터리를 자동으로 만들지 여부 (yes/no)
  • UID_MIN / UID_MAX: 일반 사용자의 UID 범위 (CentOS 7부터 기본 1000~60000)
  • SYS_UID_MIN / SYS_UID_MAX: 시스템 사용자의 UID 범위 (기본 201~999)
  • PASS_MAX_DAYS: 비밀번호 최대 사용 가능 일수 (99999는 무제한)
  • PASS_MIN_DAYS: 비밀번호 변경 후 재변경까지 최소 대기 일수
  • PASS_WARN_AGE: 만료 전 경고 메시지를 표시하는 일수
  • ENCRYPT_METHOD: 비밀번호 암호화 알고리즘 (SHA512 권장)
  • UMASK: 새 홈 디렉터리 생성 시 기본 권한 마스크 값
  • USERGROUPS_ENAB: 사용자와 동일한 이름의 그룹을 자동 생성하고, uid와 gid를 일치시킬지 여부

3. chage 명령어로 비밀번호 정책 관리

chage 명령어는 /etc/shadow 파일에 저장된 비밀번호 에이징 정보를 조회하거나 변경할 때 사용합니다.

주요 옵션:

  • -m : 최소 변경 간격 (일)
  • -M : 최대 사용 기간 (일)
  • -W : 경고 기간 (일)
  • -E : 계정 만료일 (YYYY-MM-DD 형식 또는 1970-01-01 이후 일수)
  • -d : 마지막 변경일 설정 (0으로 설정하면 다음 로그인 시 강제 변경)
  • -I : 유예 기간 (일)
  • -l : 현재 설정 정보 출력

사용 예시: 다음 로그인 시 비밀번호를 강제로 변경하게 하려면:

[root@linux ~]# chage -d 0 u1

이제 u1 사용자가 SSH로 로그인하면 다음과 같이 비밀번호 변경을 요구받습니다:

[root@linux ~]# ssh u1@192.168.1.10
u1@192.168.1.10's password:
You are required to change your password immediately (root enforced)
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for u1.
Current password:
New password:

chage -l로 현재 사용자의 비밀번호 정책 상태를 확인할 수 있습니다.

태그: shadow login.defs passwd chage useradd

7월 14일 22:59에 게시됨