/etc/passwd vs /etc/shadow vs /etc/group,
뭐가 어디 있는지 헷갈릴 때
"/etc/passwd, /etc/shadow, /etc/group… 이름은 비슷한데 뭐가 다른 건지 매번 헷갈려요."
리눅스마스터 시험을 준비하다 보면 /etc 밑의 파일 이름이 우르르 쏟아진다. 이름이 비슷비슷하다 보니 "계정 관련 파일이구나" 정도로 뭉뚱그려 외우게 되고, 시험에서 "다음 중 비밀번호 해시가 저장된 파일은?" 같은 질문에 손이 멈춘다.
진짜 걸림돌은 세 파일이 "누구를 기준으로, 무엇을 저장하는가" 가 다른데 이름의 유사성 때문에 그 차이가 안 보인다는 점이다. 이 글을 다 읽으면 계정 관련 파일 이름만 봐도 "이건 공개 정보, 이건 비밀 정보, 이건 그룹 정보"라고 즉시 구분할 수 있게 된다.
왜 파일이 세 개나 필요한가 — 정보의 성격이 다르기 때문
세 파일을 한 문장으로 구분하면 이렇다. /etc/passwd는 "이 시스템에 어떤 계정이 있는지"를 담고, /etc/shadow는 "그 계정의 비밀번호가 얼마나 안전하게 지켜지는지"를 담고, /etc/group은 "계정들이 어떤 그룹으로 묶이는지"를 담는다.
비유하자면 회사의 인사 시스템과 비슷하다. 사원 명부(/etc/passwd)에는 이름, 사번, 소속 부서 번호, 자리 위치처럼 회사 안에서 누구나 조회해도 되는 정보가 적혀 있다. 반면 인사팀 금고에는 각 사원의 개인 인증 정보(비밀번호, 카드 재발급 이력 등)가 따로 보관되어 있고, 아무나 열람하지 못한다(/etc/shadow). 그리고 별도의 부서 조직도(/etc/group)에는 "어느 부서에 누가 속해 있는지"만 간단히 정리돼 있다.
왜 이렇게 나눴을까? 처음부터 이렇게 설계된 건 아니다. 예전에는 계정 정보와 비밀번호 해시가 /etc/passwd 한 파일에 같이 저장돼 있었다. 그런데 /etc/passwd는 id, whoami 같은 명령이 계정 정보를 조회할 수 있도록 누구나 읽을 수 있는 권한(644) 으로 열려 있어야 한다. 비밀번호 해시까지 이 파일에 있으면, 누구나 그 파일을 읽어서 해시값을 가져가 오프라인으로 크랙을 시도할 수 있게 된다. 이 문제를 해결하기 위해 비밀번호 관련 정보만 /etc/shadow라는 별도 파일로 떼어내고, 이 파일은 root와 인증 절차만 읽을 수 있도록 잠갔다.
시험에 자주 나오는 함정
/etc/passwd에는 비밀번호 해시가 그대로 저장되어 있어 root만 읽을 수 있다.
틀렸다. 현재 리눅스 시스템에서 /etc/passwd의 비밀번호 필드는 실제 해시가 아니라 자리표시자 x가 들어 있고, 실제 해시는 /etc/shadow에 있다. /etc/passwd는 오히려 모든 사용자가 읽을 수 있는 파일이다. "비밀번호"라는 단어와 "root만"이라는 단어를 붙여 놓아 그럴듯하게 만든 함정이다.
/etc/passwd, 계정 한 줄에 담긴 7개 정보
/etc/passwd의 한 줄을 뜯어보면 콜론(:)으로 구분된 7개 필드가 있다.
왼쪽부터 순서대로 계정명, 비밀번호 자리표시자, UID, GID, GECOS(설명 필드), 홈 디렉토리, 로그인 셸이다. 각 필드가 무엇을 뜻하는지 하나씩 짚어보자.
첫 번째는 계정명이다. 로그인할 때 입력하는 그 이름이다. 두 번째는 비밀번호 자리인데, 앞서 설명했듯 실제 해시는 없고 x만 들어 있어 "이 계정의 진짜 비밀번호는 /etc/shadow를 보라"는 표시 역할만 한다. 세 번째와 네 번째는 UID(User ID)와 GID(Group ID)로, 계정과 기본 그룹을 숫자로 식별하는 값이다. root는 관례상 UID·GID가 모두 0이다.
다섯 번째 GECOS 필드는 사용자의 실제 이름이나 설명을 적어두는 자리로, 시스템 동작에는 영향을 주지 않는 메모성 필드다. 여섯 번째는 홈 디렉토리로, 로그인 직후 위치하게 되는 기본 경로다. 일곱 번째 로그인 셸은 이 계정이 로그인했을 때 실행할 프로그램으로, /bin/bash 같은 일반 셸일 수도 있고, 로그인을 막고 싶은 서비스 계정이라면 /usr/sbin/nologin처럼 로그인 자체를 차단하는 값을 넣기도 한다.
/etc/group은 훨씬 단순하다. 그룹명, 비밀번호 자리(현재는 거의 쓰이지 않음), GID, 소속 사용자 목록까지 4개 필드뿐이다.
이 한 줄은 "GID 1005번인 dev라는 그룹에 alice와 bob이 부가적으로 속해 있다"는 뜻이다. 여기서 주의할 점은, 이 목록에 이름이 있다고 해서 그 사람의 기본 그룹이 dev가 되는 건 아니라는 것이다. 각 사용자의 기본 그룹은 /etc/passwd의 네 번째 필드(GID)로 이미 결정돼 있고, /etc/group의 사용자 목록은 그 계정이 추가로 속한 보조 그룹을 나타낸다.
시험에 자주 나오는 함정
/etc/group의 소속 사용자 목록에 이름이 없다면 그 사용자는 어떤 그룹에도 속하지 않은 것이다.
틀렸다. 모든 사용자는 /etc/passwd에 적힌 GID를 통해 최소 하나의 기본 그룹에 속한다. /etc/group의 목록은 기본 그룹 외에 추가로 속하는 보조 그룹만 나열하는 자리이므로, 여기에 이름이 없다고 그룹이 아예 없는 건 아니다.
일곱 번째 필드인 로그인 셸도 시험에서 은근히 자주 다뤄진다. 웹 서버나 데이터베이스처럼 사람이 직접 로그인할 필요가 없는 서비스용 계정은 로그인 셸을 /usr/sbin/nologin이나 /bin/false로 지정하는 것이 일반적이다. 이렇게 하면 그 계정으로 SSH 접속이나 su 전환을 시도했을 때 셸이 실행되지 않고 즉시 연결이 끊긴다. 계정 자체는 존재해야 하지만(서비스 프로세스가 그 계정 권한으로 동작해야 하므로) 실제 로그인은 막아야 하는 상황에서 쓰는 방법이며, "왜 어떤 계정은 셸이 /bin/bash가 아니라 /usr/sbin/nologin인가"라는 질문의 답이 된다.
/etc/shadow, 비밀번호 하나에 딸린 정책들
/etc/shadow는 필드 개수가 9개로 더 많고, 단순히 해시값만 있는 게 아니라 비밀번호 정책 전체가 압축돼 있다.
이 중 시험에서 자주 다뤄지는 항목만 추리면 다음과 같다. 두 번째 필드는 비밀번호 해시 문자열이다. 세 번째는 마지막으로 비밀번호를 변경한 날짜(1970년 1월 1일부터 경과한 일수 기준). 그다음으로 최소 사용 기간, 최대 사용 기간, 만료 경고 일수, 비활성화 유예 기간, 계정 만료일이 순서대로 이어진다.
이 필드들은 chage 명령으로 조회·수정할 수 있고, 전역 기본값은 /etc/login.defs에서 관리한다. 이 둘의 관계와 세부 옵션은 다른 편에서 더 깊이 다룰 만큼 분량이 있는 주제이므로, 여기서는 "비밀번호의 사용 기한 정책이 /etc/shadow의 숫자 필드들로 계정마다 개별 저장된다"는 것만 기억해도 충분하다.
시험에 자주 나오는 함정
/etc/shadow의 비밀번호 필드가 비어 있으면 해당 계정은 로그인할 수 없다.
틀렸다. 오히려 정반대에 가깝다. 이 필드가 완전히 비어 있으면 "비밀번호 없이" 로그인이 허용되는 위험한 상태가 될 수 있다(시스템 설정에 따라 다르지만, 빈 문자열은 "검사를 통과시키는" 방향으로 해석되는 경우가 있다). 계정을 잠그고 싶을 때는 필드를 비우는 게 아니라 앞에 !나 *를 붙여 해시 자체를 무효화하는 방식을 쓴다. "비어 있다 = 잠김"이라는 직관과 반대라서 자주 틀리는 문제다.
명령어로 세 파일을 직접 조회하기
세 파일의 구조를 외웠다면, 실제로 이 정보를 매번 파일을 직접 열어서 확인할 필요는 없다는 것도 함께 알아두면 좋다. 리눅스는 이 파일들의 내용을 조회하는 전용 명령을 제공한다.
id 명령은 현재 로그인한 사용자(또는 지정한 사용자)의 UID, GID, 소속 그룹을 한 번에 보여준다.
getent passwd 계정명은 /etc/passwd를 직접 grep하지 않고도 특정 계정의 한 줄을 조회하는 표준적인 방법이다. 로컬 파일뿐 아니라 시스템이 NIS나 LDAP 같은 외부 인증 체계를 함께 쓰는 환경에서도 동일하게 동작한다는 점에서 cat /etc/passwd | grep보다 권장되는 방식이다.
groups 계정명은 그 계정이 속한 모든 그룹(기본 그룹 + 보조 그룹)을 한 줄로 보여준다. /etc/passwd의 GID 하나만 봐서는 보조 그룹까지 알 수 없기 때문에, 어떤 계정이 실제로 접근 가능한 그룹 전체를 확인하고 싶을 때는 /etc/group을 직접 뒤지기보다 groups 명령이 더 빠르다.
시험에 자주 나오는 함정
getent passwd는 오직 /etc/passwd 파일만 읽을 수 있고 다른 인증 체계는 조회할 수 없다.
틀렸다. getent는 /etc/nsswitch.conf에 설정된 순서에 따라 로컬 파일뿐 아니라 LDAP, NIS 등 다른 이름 해석 체계까지 조회할 수 있는 범용 조회 명령이다. 그래서 실무에서는 cat /etc/passwd보다 안정적인 조회 수단으로 취급된다.
시험 직전에 이것만
- 비밀번호 해시는 shadow에, passwd엔 x만.
- 기본 그룹은 passwd의 GID로 정해진다.
- group 목록은 보조 그룹일 뿐이다.
『빠르게 따는 리눅스마스터 2급』에서 더 보기
계정 파일 3형제의 구조는 리눅스마스터 2급 1차(필기)의 사용자·그룹 관리 영역에서 꾸준히 출제되는 기본기다. 『빠르게 따는 리눅스마스터 2급』에서도 이 내용을 다루고 있다.
1권에서는 이번 글처럼 왜 파일이 분리됐는지, 각 필드가 무엇을 뜻하는지를 차근차근 짚고, 2권에서는 필드 순서와 개수만 빠르게 다시 훑는 용도로 구성돼 있다. 특히 /etc/passwd 7개 필드, /etc/shadow 9개 필드처럼 순서를 묻는 문제는 오답 노트 방식 해설로 확인하면, 왜 그 선지가 매력적으로 보이지만 틀렸는지까지 짚을 수 있어 실수를 줄일 수 있다.
🖥️ 골든래빗 CBT에서 리눅스마스터 2급 문제 풀어보기
궁금한 게 생기면 『빠따 리눅스마스터』 공식 카카오톡 질문방에서 물어보세요. 저자들이 직접 답합니다.
