LINUX /etc/passwd, /etc/shadow - 이해하기



LINUX /etc/passwd, /etc/shadow 한방 정리 (필드 전체 + 예제)

1) 왜 passwd와 shadow로 나뉘어 있을까?

  • /etc/passwd: 사용자 계정의 “기본 정보”가 들어있는 파일 (대부분 읽기 가능)

  • /etc/shadow: 비밀번호 해시와 비밀번호 정책 정보가 들어있는 파일 (반드시 root만 읽도록 보호)

➡️ 예전엔 /etc/passwd에 비밀번호 해시가 있었는데, 누구나 읽을 수 있어 크래킹 위험이 커서 shadow 분리가 생겼어요.


2) /etc/passwd 필드(옵션) 전체

/etc/passwd는 한 줄이 사용자 1명이고, :로 7개 필드로 구분됩니다.

계정명:패스워드필드:UID:GID:설명(GECOS):홈디렉터리:로그인쉘
필드 의미 자주 나오는 값/포인트
1) 계정명 로그인 ID 예: root, user1
2) 패스워드필드 보통 x x면 실제 해시는 /etc/shadow에 있음
3) UID 사용자 ID 보통 root=0, 일반사용자=1000~
4) GID 기본 그룹 ID /etc/group와 매칭
5) GECOS 설명/이름/연락처 비어있거나 “홍길동,,,” 형태
6) HOME 홈 디렉터리 /home/user1
7) SHELL 로그인 쉘 /bin/bash, /usr/sbin/nologin

✅ passwd 예제

user1:x:1001:1001:홍길동,,,:/home/user1:/bin/bash
  • user1 계정, UID/GID 1001, 홈은 /home/user1, bash 쉘 사용


3) /etc/shadow 필드(옵션) 전체

/etc/shadow도 한 줄이 사용자 1명이고, :로 보통 9개 필드입니다.

계정명:비밀번호해시:최종변경일:최소:최대:경고:비활성:만료일:예약
필드 의미 값/예시
1) 계정명 사용자 ID user1
2) 비밀번호 해시 해시 문자열 또는 잠금표시 $6$...(SHA-512 계열인 경우가 흔함), !/*는 잠금
3) 최종변경일 마지막 비번 변경(일 단위) 1970-01-01 기준 “일 수”
4) 최소(min) 최소 변경 주기 0이면 언제든 변경 가능
5) 최대(max) 최대 사용 기간 예: 90이면 90일마다 변경
6) 경고(warn) 만료 전 경고일 예: 7이면 7일 전 경고
7) 비활성(inactive) 만료 후 유예기간 기간 지나면 로그인 불가
8) 만료(expire) 계정 만료일(일 단위) 날짜 지나면 계정 종료
9) 예약(flag) 보통 미사용 빈 칸이 흔함

✅ shadow 예제(형식 예)

user1:$6$SALT$HASH:20000:0:90:7:14:21000:

해석(쉽게)

  • 마지막 변경일 20000일째에 변경

  • 최소 0일, 최대 90일 사용

  • 만료 7일 전 경고

  • 만료 후 14일 유예

  • 21000일째에 계정 만료


4) “옵션 값”에서 자주 나오는 특수 케이스 (시험 단골)

계정 잠금/비활성 표시

  • /etc/shadow의 2번째 필드가

    • ! 또는 * 로 시작하면 비밀번호 로그인 잠금인 경우가 많음

  • /etc/passwd의 쉘이

    • /usr/sbin/nologin 또는 /bin/false로그인 차단용 계정으로 자주 사용

NIS/LDAP 같은 외부 인증

  • 일부 시스템은 passwd의 2번째 필드가 x가 아니라 특수 표기이거나, 외부 인증으로 위임될 수 있음(환경 의존)


5) 확인/점검 예제(명령어)

특정 사용자 passwd/shadow 한 줄 보기

grep '^user1:' /etc/passwd
sudo grep '^user1:' /etc/shadow

로그인 가능한 계정만 빠르게 보기(쉘 필터)

awk -F: '$7 !~ /(nologin|false)$/ {print $1, $7}' /etc/passwd

UID 0(root 권한) 계정 점검(매우 중요)

awk -F: '$3==0 {print $1}' /etc/passwd

➡️ root 말고 다른 UID 0 계정이 나오면 위험 신호!


6) 정보보안기사 관점 핵심 요약

  • /etc/passwd = 계정 기본 정보(7필드), “x”면 해시는 shadow

  • /etc/shadow = 비번 해시 + 만료 정책(9필드), 읽기 권한은 root 중심

  • 점검 포인트 TOP3

    1. UID=0 계정 존재 여부

    2. 불필요 계정 로그인 차단(nologin/잠금)

    3. shadow 권한(일반 사용자 읽기 금지)

/etc/shadow의 2번째 필드 구성은 매우중요

/etc/shadow2번째 필드(비밀번호 해시) 안에 있는 salt는 “같은 비밀번호라도 해시 결과가 같아지지 않게 섞는 랜덤 값”이에요. 리눅스에서 흔히 쓰는 표현은 crypt(3) 모듈 형식(modular crypt format)입니다.

1) 기본 구조(가장 흔한 형태)

보통 이렇게 생겼어요.

$ID$SALT$HASH
  • ID: 어떤 해시 알고리즘을 썼는지 표시(해시 알고리즘 ID)

    • $1$ = MD5

    • $5$ = SHA-256

    • $6$ = SHA-512
      (배포판/설정에 따라 다른 ID도 있을 수 있어요. 예: yescrypt 등)

  • SALT: 랜덤(or 의사랜덤) 문자열

    • 같은 비밀번호라도 SALT가 다르면 HASH가 달라짐

    • 레인보우 테이블 공격(미리 계산된 해시 역추적)을 크게 어렵게 함

  • HASH: 비밀번호를 ID 알고리즘으로 SALT와 함께 계산한 결과

예)

$6$Qv4a2pE0uVnKZp8S$3zJ...생략...

여기서

  • 6 = SHA-512

  • Qv4a2pE0uVnKZp8S = salt

  • 그 뒤가 hash

2) “옵션(라운드 수)”가 끼는 경우

SHA 계열에서는 반복 횟수(연산 비용)를 넣어 느리게 만들기도 해요.

$6$rounds=5000$SALT$HASH
  • rounds=... : 해시를 여러 번 반복해 계산 → 무차별 대입(브루트포스) 더 느리게

  • 그 다음 필드가 SALT, 마지막이 HASH

3) salt는 어디까지가 salt인가?

$ 기준으로 보면 딱 정리됩니다.

  • $ID$SALT$HASH이면 두 번째 $와 세 번째 $ 사이가 salt

  • $ID$rounds=...$SALT$HASH이면 rounds= 다음 $와 그 다음 $ 사이가 salt

4) 시험/실무에서 기억할 포인트

  • salt 목적: 동일 비밀번호라도 해시값이 동일해지는 문제 방지 + 레인보우 테이블 방어

  • salt는 비밀이 아니어도 됨: shadow에 같이 저장되는 게 정상(대신 shadow 파일 권한이 중요)

  • 알고리즘/rounds는 “어떻게 섞고 얼마나 비싸게 계산할지”, salt는 “섞을 랜덤 재료”


댓글 쓰기

새 댓글을 작성할 수 없습니다.*

다음 이전