CertNote/ 출퇴근 학습 노트
로드맵
KOEN
리눅스마스터 2급 · 2급리눅스마스터 2급
리눅스마스터 1급 · 1급리눅스마스터 1급
  • Week 1
    • 1.운영체제와 리눅스: 커널이 하는 일
    • 2.자유 소프트웨어와 배포판: 라이선스가 만든 생태계
    • 3.설치와 부팅: 전원을 켜는 순간부터
    • 4.파일시스템 구조와 파일의 종류: 모든 것은 파일이다
    • 5.Week 1 종합 복습: 개념을 꿰뚫는 시간
  • Week 2
  • Week 3
  • Week 4
    • 1.계정 파일 4종: /etc/passwd · /etc/shadow · /etc/group · /etc/gshadow 필드 해부
    • 2.계정 관리 명령과 권한 상승: useradd부터 sudo까지
    • 3.권한의 산수: rwx · 8진수 chmod · 소유권 · umask 계산
    • 4.특수 권한과 ACL: SetUID · SetGID · Sticky bit · getfacl/setfacl
    • 5.Week 4 종합 복습: 계정·권한 체계를 한 장으로 꿰기
  • Week 5
  • Week 6
  • Week 7
  • Week 8
  • Week 9
  • Week 10
  • Week 11
  • Week 12
  • Week 13
  • Week 14
합격 후기

© CertNote · 주간랩스

  • 소개
  • 수정 기록
  • 문의
  • 이용약관
  • 개인정보처리방침
← 리눅스마스터 1급/Week 4/Day 1

기준: 리눅스마스터 1급 출제 기준·오류 제보

리눅스마스터 1급· AssociateWeek 4 · Day 1읽기 약 14분
핵심 정리
  • 리눅스의 "사용자"는 네 텍스트 파일에 콜론으로 구분된 한 줄의 레코드다. 계정 관리는 곧 필드 관리다.
  • 필드 수를 통째로 외운다 — passwd 7 · shadow 9 · group 4 · gshadow 4, 권한은 644-400-644-400.
  • UID 0이 곧 root 권한의 정의다. 커널은 이름이 아니라 UID만 본다. root 외에 UID 0이 있으면 보안 위협.
  • shadow의 날짜 필드는 전부 1970-01-01부터의 경과 일수. 순서는 마지막변경→Min→Max→Warn→Inactive→Expire.
  • 파일은 두 쌍이다 — passwd↔shadow, group↔gshadow. 공개 파일엔 신원, 비밀 파일엔 해시·정책.

Day 1 - 계정 파일 4종: /etc/passwd · /etc/shadow · /etc/group · /etc/gshadow 필드 해부

/etc/passwd — 계정의 신원과 로그인 환경

각 필드를 위치(position)와 의미(meaning)로 동시에 외우는 것이 핵심이다. 필드 순서가 곧 시험 문제다.

  • /etc/passwd는 시스템의 모든 계정 목록이다. 이름과 달리 오늘날 실제 암호는 여기 없다.
  • 1980년대까지는 암호 해시가 두 번째 필드에 있었다. 그러나 이 파일은 모든 사용자가 읽어야(644) 한다 — ls -l로 UID를 이름으로 바꾸려면 누구나 읽어야 하기 때문이다.
  • 그래서 해시를 /etc/shadow로 분리(shadow 기법)했고, passwd의 두 번째 필드에는 x만 남았다.
root:x:0:0:root:/root:/bin/bash
#  1 2 3 4  5    6        7
#필드의미함정 포인트
1Username로그인 이름최대 32자, 보통 소문자로 시작
2Passwordx = shadow 참조, */! = 잠김, 빈칸 = 무암호여기에 해시가 있으면 shadow 미사용(구식)
3UID사용자 번호0 = root, 1~999 시스템, 1000~ 일반(배포판별)
4GID기본(primary) 그룹 번호/etc/group의 GID와 매칭
5GECOS코멘트(실명, 전화 등)finger 정보. 콤마로 세분
6Home Directory홈 디렉터리 경로로그인 시 작업 디렉터리
7Login Shell로그인 셸/bin/bash, /sbin/nologin, /bin/false

UID 0은 단순히 "첫 번째 사용자"가 아니라 그 자체가 root 권한의 정의다. 커널은 이름이 root인지 보지 않고 UID가 0인지만 본다. 따라서 passwd에서 어떤 일반 계정의 UID를 0으로 바꾸면 그 계정은 즉시 root와 동등한 권한을 갖는다. 이게 침입자가 백도어를 심는 고전적 수법이고, 시험에서 "UID가 0인 계정이 root 외에 또 있다 = 보안 위협"으로 출제된다.

7번째 필드(셸)에 /sbin/nologin이나 /bin/false를 넣으면 그 계정은 로그인이 차단된다. 차이가 있다. /bin/false는 아무 메시지 없이 즉시 종료(exit 1)하고, /sbin/nologin은 "This account is currently not available." 같은 안내 메시지를 출력한 뒤 종료한다. 데몬 전용 계정(daemon, bin, nobody 등)이 이 셸을 갖는 이유는, 그 계정으로는 대화형 로그인이 일어나면 안 되기 때문이다. 메시지는 /etc/nologin.txt로 커스터마이즈할 수 있다.

⚠️ 함정: GECOS 필드(5번째)를 "암호 필드"로 착각하는 보기가 있다. 암호는 2번째(현재는 x), 실제 해시는 shadow에 있다. 또 6번째(홈)와 7번째(셸)의 순서를 바꾼 보기도 오답으로 쓰인다. 순서는 홈이 먼저, 셸이 마지막이다.

# 직접 쳐보기 — passwd 구조 관찰
cat /etc/passwd | head -5          # 시스템 계정들
getent passwd root                 # NSS를 거친 조회(LDAP 포함)
awk -F: '$3==0 {print $1}' /etc/passwd   # UID 0인 계정 전부 출력(root만 나와야 정상)
awk -F: '$3>=1000 && $3<60000 {print $1}' /etc/passwd  # 일반 사용자만

GECOS라는 이름은 1970년대 General Electric Comprehensive Operating System에서 왔다. 초기 유닉스가 GE 메인프레임에 배치 작업을 보낼 때 그 시스템이 요구하는 계정 정보를 이 필드에 적었던 흔적이다. 지금은 그냥 "사용자 코멘트 필드"로 쓰이지만 이름만 화석처럼 남았다. chfn 명령으로 이 필드를 수정한다.

/etc/shadow — 암호 해시와 수명(aging) 정책

  • /etc/shadow는 passwd에서 떼어낸 암호의 비밀 금고다.
  • 권한은 400 또는 640(root 또는 shadow 그룹만 읽기)으로 엄격히 막혀 있다.
  • 한 줄은 9개 필드다. 여기가 실기 단답의 최대 격전지다.
user1:$6$xyz$abc...:19700:0:99999:7:14:19800:
#  1       2          3   4   5   6  7    8   9
#필드의미단위/값
1Usernamepasswd와 매칭되는 이름—
2Password암호화된 해시$6$=SHA-512. */!=잠김, 빈칸=무암호
3Last Change마지막 암호 변경일1970-01-01부터 경과 일수
4Min변경 후 재변경까지 최소 일수0=언제든 변경 가능
5Max암호 유효 최대 일수99999=사실상 무제한
6Warn만료 며칠 전 경고보통 7
7Inactive만료 후 계정 잠금까지 유예 일수빈칸=즉시 적용 안 함
8Expire계정 자체 만료일1970부터 경과 일수(암호 아닌 계정)
9Reserved예약(미사용)—

3번 필드부터 8번 필드까지의 날짜·일수는 모두 1970년 1월 1일(Unix Epoch)을 기준으로 한 값이다. "Last Change = 19700"이면 1970년 1월 1일로부터 19700일이 지난 날 암호를 바꿨다는 뜻이다. 사람이 읽기 어렵기 때문에 chage -l user1로 사람이 읽는 날짜로 변환해 본다.

2번 필드의 해시 앞 접두사가 알고리즘을 나타낸다. $1$=MD5, $2a$/$2y$=Blowfish, $5$=SHA-256, $6$=SHA-512. 현대 배포판 기본은 $6$다. 형식은 $id$salt$hash로, salt(난수)가 들어가기에 같은 암호라도 사용자마다 해시가 다르다. 만약 이 필드가 !나 !!로 시작하면 "잠긴 상태에서의 원래 해시 보존"을 뜻한다. passwd -l은 해시 앞에 !를 붙여 잠그고, passwd -u는 그 !를 떼어 푼다.

⚠️ 함정: Min(4번)과 Max(5번)의 순서, 그리고 Warn(6번)과 Inactive(7번)의 의미를 뒤바꾼 보기가 오답으로 쓰이기 쉽다. 외우는 순서: "마지막변경 → 최소 → 최대 → 경고 → 비활성 → 만료". 또 7번 Inactive("암호 만료 후 계정 잠금 유예")와 8번 Expire("계정 자체 절대 만료일")를 혼동시키는 문제가 있다. Inactive는 암호 만료에 연동, Expire는 절대 날짜다.

2번 필드가 빈칸이면 무암호 로그인 가능(매우 위험), *나 !이면 로그인 불가(데몬 계정의 정상 상태)다. 빈칸과 *을 같은 것으로 묶은 보기는 틀렸다.

# 직접 쳐보기 — shadow 수명 정책 확인
sudo getent shadow user1           # shadow 한 줄
sudo chage -l user1                # 사람이 읽는 형식으로 만료 정책
sudo cat /etc/shadow | cut -d: -f1,3,4,5   # 이름:마지막변경:Min:Max

shadow 기법은 1987년 SunOS에서 처음 도입됐고, 이후 모든 유닉스 계열로 퍼졌다. 도입 동기는 단순했다 — passwd는 644로 모두가 읽어야 하는데(이름↔UID 변환 때문) 거기 해시가 있으면 누구나 해시를 복사해 오프라인 무차별 대입(brute force) 공격을 걸 수 있었다. 해시만 400 파일로 떼어내자 이 공격 표면이 사라졌다. "왜 암호를 passwd가 아닌 shadow에 두는가?"의 정답이 바로 이것이다.

/etc/group — 그룹 소속과 보조(secondary) 그룹

/etc/group은 그룹의 목록과 그 멤버를 담는다. 권한은 644(모두 읽기)다. 한 줄은 4개 필드다.

developers:x:1500:alice,bob,carol
#    1      2  3        4
#필드의미
1Group Name그룹 이름
2Passwordx = gshadow 참조(대부분 사용 안 함)
3GID그룹 번호
4Member List보조 그룹 멤버(콤마 구분)

여기서 가장 헷갈리는 지점 — passwd의 4번째 필드(GID)가 가리키는 그룹은 그 사용자의 기본(primary) 그룹이고, /etc/group의 4번째 멤버 목록에 이름이 들어 있으면 그건 보조(secondary) 그룹이다. 따라서 어떤 사용자가 자기 기본 그룹의 멤버 목록에는 안 적혀 있을 수 있다. alice의 passwd GID가 1500이면 alice는 developers의 멤버지만 group 파일의 멤버 목록(4번 필드)에는 굳이 안 적힌다. groups alice로 보면 둘 다 합쳐 나온다.

사용자가 새 파일을 만들면 그 파일의 그룹 소유자는 기본 그룹(passwd의 GID)이 된다. 보조 그룹은 "그 그룹에 속한 파일에 대한 접근 권한"을 부여할 뿐, 새로 만든 파일의 기본 소유 그룹이 되지는 않는다. (단, 디렉터리에 SetGID가 걸려 있으면 예외 — Day 4에서 다룬다.)

group 파일의 4번 필드는 보조 그룹 멤버만 나열한다. "이 목록에 없으면 그룹 소속이 아니다"는 틀렸다 — 기본 그룹은 passwd에서 결정되므로 목록에 없어도 소속일 수 있다. id user1로 primary/secondary를 한눈에 확인할 수 있다.

# 직접 쳐보기 — 그룹 소속 추적
id alice                           # uid, gid(primary), groups(전체)
groups alice                       # 소속 그룹 이름들
getent group developers            # 특정 그룹의 멤버 목록
awk -F: '$3>=1000{print $1,$3}' /etc/group  # 일반 그룹들

/etc/gshadow — 그룹 암호와 그룹 관리자

  • /etc/gshadow는 group 파일에서 떼어낸 그룹의 비밀 정보다. shadow가 passwd의 짝이듯, gshadow는 group의 짝이다.
  • 권한은 400. 한 줄은 4개 필드다.
developers:!:admin1,admin2:alice,bob,carol
#    1     2      3              4
#필드의미
1Group Name그룹 이름
2Password그룹 암호 해시. !=암호 없음(정상)
3Administrators그룹 관리자(멤버 추가/삭제 권한)
4Members그룹 멤버(group 파일과 동기화)

그룹 암호(2번 필드)는 newgrp 명령으로 자신의 기본 그룹을 일시적으로 바꿀 때 쓰인다. 그 그룹 멤버가 아닌 사용자가 그룹 암호를 알면 newgrp로 그 그룹에 임시 합류할 수 있다. 그러나 보안상 위험해 현대 시스템에서는 거의 비활성(!)이다. 3번 필드의 관리자는 gpasswd로 멤버를 추가/삭제할 수 있는 사용자다.

group과 gshadow의 4번째 멤버 목록은 gpasswd나 usermod로 바꾸면 두 파일이 동기화된다. 손으로 group만 고치고 gshadow를 안 고치면 불일치가 생기고, grpck 명령으로 이런 불일치를 검사할 수 있다. (passwd↔shadow의 짝은 pwck로 검사한다.)

"그룹 암호는 group 파일의 2번 필드에 저장된다"는 틀렸다. group의 2번 필드는 x(gshadow 참조 표시)일 뿐, 실제 그룹 암호 해시는 gshadow의 2번 필드에 있다. passwd↔shadow 관계와 똑같은 구조다.

# 직접 쳐보기 — 네 파일의 짝 관계 점검
sudo pwck -r                       # passwd ↔ shadow 정합성 검사(읽기전용)
sudo grpck -r                      # group ↔ gshadow 정합성 검사
sudo getent gshadow developers

한 대학 전산실에서 조교가 /etc/group만 vi로 직접 편집해 학생을 그룹에서 뺐는데, gpasswd를 통하지 않아 /etc/gshadow의 멤버 목록이 그대로 남았다. 일부 도구는 gshadow를 우선 참조했기에 "뺐는데도 권한이 남는" 유령 멤버 현상이 생겼다. 교훈: 계정·그룹 파일은 직접 편집보다 전용 명령(usermod, gpasswd, vipw, vigr)을 거쳐 짝 파일을 동시에 갱신하는 것이 원칙이다. vipw/vigr은 잠금을 걸고 안전하게 편집하며, -s 옵션으로 shadow/gshadow를 편집한다.

네 파일을 한 장으로 — 정합성 지도

  • 네 파일은 두 쌍으로 묶인다. passwd↔shadow(사용자), group↔gshadow(그룹).
  • 공개 파일(passwd, group, 644)에는 신원과 소속만, 비밀 파일(shadow, gshadow, 400)에는 해시와 정책만 둔다.
  • 이 분리가 바로 shadow 보안 모델의 핵심이다.
파일권한필드 수핵심 내용짝
/etc/passwd6447UID·GID·홈·셸shadow
/etc/shadow400/6409해시·암호 수명passwd
/etc/group6444GID·보조멤버gshadow
/etc/gshadow4004그룹암호·관리자group
  • 이 표의 필드 수(7-9-4-4)와 권한(644-400-644-400)은 그 자체로 단답 문제가 된다. passwd=7, shadow=9, group/gshadow=4다.

📖 용어

  • UID : 사용자를 구분하는 번호. 0이면 root 권한이다. 커널은 이름이 아니라 이 숫자만 본다.
  • GID : 그룹 번호. passwd 4번 필드의 GID가 그 사용자의 기본 그룹을 정한다.
  • shadow 기법 : 암호 해시를 모두가 읽는 passwd에서 떼어내 400 파일에 숨기는 보안 설계.
  • GECOS : passwd 5번 필드의 코멘트(실명·연락처). GE 메인프레임 시절 이름이 화석처럼 남았다.
  • /sbin/nologin vs /bin/false : 로그인을 막는 두 셸. 전자는 안내 메시지를 내고, 후자는 조용히 끝낸다.
  • Unix Epoch : 1970-01-01. shadow의 날짜 필드는 전부 이 날부터의 경과 일수다.
  • Min / Max / Warn / Inactive / Expire : 암호 재변경 최소일 / 유효 최대일 / 만료 예고일 / 만료 후 잠금 유예 / 계정 절대 만료일.
  • $6$ : shadow 해시의 알고리즘 표시. 1=MD5, 5=SHA-256, 6=SHA-512.
  • salt : 해시에 섞는 난수. 같은 암호라도 사용자마다 해시가 달라지게 만든다.
  • 기본(primary) 그룹 / 보조(secondary) 그룹 : passwd의 GID가 정하는 그룹과, group 파일 멤버 목록으로 붙는 그룹.
  • newgrp : 그룹 암호를 알면 그 그룹으로 기본 그룹을 임시 전환하는 명령.
  • pwck / grpck : passwd↔shadow, group↔gshadow의 정합성을 검사하는 명령.
  • vipw / vigr : 잠금을 걸고 계정·그룹 파일을 안전하게 편집하는 명령. -s로 짝 파일을 연다.

📝 연습 문제

선택지를 클릭하면 정답·해설이 펼쳐집니다.

문제 1

다음 /etc/passwd 한 줄에서 사용자의 로그인 셸에 해당하는 필드는? alice:x:1001:1001:Alice Kim:/home/alice:/bin/bash

문제 2

/etc/shadow 파일에서 "암호를 마지막으로 변경한 날"을 나타내는 3번째 필드의 값 19700이 의미하는 것은?

문제 3

시스템 보안 점검 중 /etc/passwd에서 root가 아닌 일반 계정 backup의 UID가 0으로 설정된 것을 발견했다. 이것이 의미하는 가장 정확한 설명은?

문제 4

/etc/shadow의 필드 순서로 올바른 것은?

문제 5

/etc/group의 4번째 필드에 대한 설명으로 옳은 것은?

문제 6

/etc/passwd와 /etc/shadow로 암호 정보를 분리한 가장 큰 이유는?

문제 7

passwd -l user1 명령을 실행한 후 /etc/shadow에서 user1의 암호 필드(2번째)에 일어나는 변화는?

이전Week 3 종합 복습: 셸과 스크립트의 큰 그림Week 3 · Day 5다음 계정 관리 명령과 권한 상승: useradd부터 sudo까지Week 4 · Day 2

참고 공식 자료

  • 리눅스마스터 1급 공식 출제 기준(새 탭에서 열림)

이 페이지

  • etc/passwd — 계정의 신원과 로그인 환경
  • etc/shadow — 암호 해시와 수명(aging) 정책
  • etc/group — 그룹 소속과 보조(secondary) 그룹
  • etc/gshadow — 그룹 암호와 그룹 관리자
  • 네 파일을 한 장으로 — 정합성 지도
  • 용어
  • 연습 문제