리눅스 시스템에서 사용자 비밀번호 정보는 /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로 현재 사용자의 비밀번호 정책 상태를 확인할 수 있습니다.