03/11 — 사용자·파일·권한
리눅스는 여러 사용자가 함께 쓰는 운영체제다. 이번 단원의 질문은 **“누가, 어떤 신분으로, 어느 파일에, 무엇을 할 수 있는가?”**다. 사용자의 숫자 신분과 파일의 소유권·접근 권한을 연결하면 권한 판정을 한 흐름으로 이해할 수 있다.
1. 사용자와 그룹: 이름 뒤에는 숫자가 있다
사용자를 식별하는 숫자가 UID, 그룹을 식별하는 숫자가 GID다. root라는 이름보다 중요한 것은 UID 0이라는 관리자 신분이다. 일반 사용자와 서비스용 시스템 계정의 UID 범위는 배포판 정책과 /etc/login.defs 설정으로 정한다.
사용자는 기본 그룹 하나와 여러 보조 그룹에 속할 수 있다. 기본 그룹은 /etc/passwd의 GID로 연결된다. 기본 그룹 소속은 /etc/passwd의 GID로, 보조 그룹 소속은 /etc/group 등의 구성원 정보로 확인한다. id는 UID·GID·보조 그룹을, groups는 그룹 소속을 확인한다.
| 파일 | 역할 |
|---|---|
| /etc/passwd | 사용자 이름·UID·GID·홈·로그인 셸 |
| /etc/shadow | 암호 해시와 암호·계정 유효기간 |
| /etc/group | 그룹 이름·GID·구성원 목록 |
| /etc/gshadow | 그룹 암호·관리자·구성원 관련 보호 정보 |
| /etc/skel/ | 새 홈 디렉터리에 복사할 초기 파일 |
| /etc/default/useradd | useradd 기본값 |
| /etc/login.defs | UID 범위·암호 수명 등 shadow 도구의 기본 정책 |
/etc/passwd의 한 행을 읽어보자.
student:x:1001:1001:Study User:/home/student:/bin/bash이름 : 암호 자리 : UID : GID : 설명 : 홈 : 로그인 셸의 일곱 필드다. x는 보통 /etc/shadow에서 암호 정보를 관리한다는 표시다. 암호 해시는 입력한 암호를 검증하는 데 사용하는 단방향 계산 결과다. /etc/passwd는 일반 사용자의 계정 정보 조회를 지원하고, /etc/shadow는 보호된 접근 권한으로 암호 정보를 관리한다.
shadow는 이름·해시 뒤에 마지막 변경일, 최소 사용일, 최대 사용일, 만료 경고일, 암호 만료 후 비활성 기간, 계정 만료일, 예약 필드가 이어진다. 날짜 숫자는 보통 1970-01-01 이후의 일수다. 암호 만료는 암호의 사용 기한, 계정 만료는 계정의 사용 기한을 관리한다.
2. 계정 관리 명령을 관계로 읽기
다음은 옵션과 결과를 연결해 읽는 학습용 명령 예제다.
useradd -m -s /bin/bash -g students -G lab studentstudent를 만들고 홈도 생성(-m), 셸은 Bash(-s), 기본 그룹은 students(-g), 보조 그룹은 lab(-G)으로 설정한다. 지정 그룹은 먼저 존재해야 한다.
| 명령 | 핵심 |
|---|---|
| useradd | 생성. -u UID, -d 홈 경로, -m 홈 생성, -s 셸, -g 기본 그룹, -G 보조 그룹 |
| usermod | 기존 계정 속성 변경 |
| usermod -aG lab student | 기존 보조 그룹을 유지하면서 lab 추가 |
| userdel | 계정 삭제. -r은 홈·메일 스풀도 삭제하므로 별도 주의 |
| passwd | 암호 설정. -l 잠금, -u 잠금 해제 |
| chage -l student | 암호 수명 정보 조회 |
| groupadd / groupmod / groupdel | 그룹 생성 / 변경 / 삭제 |
| gpasswd -a student lab | 그룹 구성원 추가. -d는 제거 |
| newgrp lab | 현재 세션에서 그룹 신분 변경에 사용 |
usermod -G는 보조 그룹 목록을 지정한 목록으로 설정하고, -aG는 기존 목록에 그룹을 추가한다. usermod -d는 계정에 등록된 홈 경로를 변경하며, -d와 -m을 함께 사용하면 홈 내용도 새 경로로 옮긴다.
passwd -l은 계정의 암호 인증을 잠근다. 공개키 인증 등 다른 인증 경로의 허용 여부는 해당 서비스 정책으로 관리한다. nologin은 서비스 계정을 유지하면서 대화형 로그인 셸 사용을 제한하는 데 쓴다. useradd 매뉴얼
3. 디렉터리는 이름을, inode는 파일 메타데이터를 관리한다
디렉터리는 이름과 inode 번호의 연결을 관리한다. inode에는 파일 종류·소유 UID/GID·권한·크기·시각·링크 수 등 메타데이터가 들어가거나 연관된다. 디렉터리의 항목이 파일 이름을 inode 번호에 연결한다. inode 번호는 해당 파일시스템 안에서 파일을 식별한다.
ls -i는 inode 번호, stat은 상세 메타데이터를 보여준다.
- atime: 마지막 접근 시각. 마운트 정책에 따라 갱신이 줄어들 수 있다.
- mtime: 파일 내용 수정 시각.
- ctime: inode 상태 변경 시각. chmod·chown·내용 변경 등으로 바뀜.
- birth time: 파일 생성 시각. 파일시스템과 도구가 지원할 때 조회한다.
하드 링크와 심볼릭 링크
| 비교 | 하드 링크 | 심볼릭 링크 |
|---|---|---|
| 생성 | ln target name | ln -s target name |
| 무엇을 연결? | 같은 inode에 이름 하나 추가 | 대상 경로를 가리키는 별도 파일 |
| inode | 동일 파일시스템에서 같음 | 링크 자체 inode가 따로 있음 |
| 연결 범위 | 같은 파일시스템 안 | 다른 파일시스템의 경로까지 |
| 디렉터리 | 일반 사용자 생성은 제한 | 가리킬 수 있음 |
| 원래 이름 삭제 | 다른 이름으로 계속 접근 | 대상 경로가 사라지면 끊어진 링크 |
하드 링크로 연결된 여러 이름은 같은 파일에 접근하는 동등한 이름이다. 파일을 rm한다는 것은 우선 이름 연결을 제거하는 일이다. 링크 수가 0이 되어도 프로세스가 파일을 열고 있으면 마지막 참조가 사라질 때까지 공간이 남을 수 있다. 이는 나중에 df와 du가 다른 이유 중 하나로 연결된다.
4. rwx는 파일과 디렉터리에서 다르게 읽는다
-rwxr-x---첫 글자는 종류, 다음 세 글자씩 소유자·그룹·기타 사용자 권한이다. 종류에는 - 일반 파일, d 디렉터리, l 심볼릭 링크, b 블록 장치, c 문자 장치, p FIFO, s 소켓이 있다.
| 권한 | 일반 파일 | 디렉터리 |
|---|---|---|
| r | 내용 읽기 | 내부 이름 목록 읽기 |
| w | 내용 수정 | 항목 생성·삭제·이름 변경 |
| x | 실행 | 경로 탐색·통과·cd |
디렉터리 안의 파일을 실제로 열려면 경로를 통과할 x 권한이 필요하다. 파일 이름을 안다면 디렉터리 r 없이도 x와 대상 파일 권한을 통해 접근할 수 있는 경우가 있다.
파일 삭제는 보통 그 파일의 w보다 부모 디렉터리의 w+x가 핵심이다. 읽기 전용 파일도 부모 디렉터리에 삭제 권한이 있으면 지울 수 있다. 단, sticky bit·ACL·SELinux·읽기 전용 마운트·불변 속성 같은 추가 제약은 따로 적용된다.
기본 u/g/o 권한 판정은 소유자 일치 → 그룹 일치 → 기타 사용자 순서로 적용 대상을 정하고, 선택한 권한 묶음으로 허용 여부를 판단한다. 확장 ACL이 설정된 파일은 ACL의 항목·mask 규칙을 함께 적용하며, 관리자 capability도 접근 판정에 관여한다.
5. chmod·chown·umask
r=4, w=2, x=1을 더한다. 7=rwx, 6=rw-, 5=r-x, 4=r—이다.
chmod 640 report.txt
chmod u+x script.sh
chmod g-w report.txt
chown student:lab report.txt
chgrp lab report.txt640은 소유자 읽기·쓰기, 그룹 읽기, 기타 권한 없음이다. chmod는 권한, chown은 소유자·그룹, chgrp는 그룹이다. -R은 지정한 디렉터리 아래까지 재귀 적용하므로 실행 전에 대상 범위를 확인한다.
umask는 새로 만들 때 제거할 권한 비트다. 기본 ACL이 없고 프로그램이 파일 666, 디렉터리 777을 요청한다는 일반적인 조건에서:
| umask | 새 일반 파일 | 새 디렉터리 |
|---|---|---|
| 022 | 644 | 755 |
| 002 | 664 | 775 |
| 027 | 640 | 750 |
| 077 | 600 | 700 |
계산식은 requested_mode AND NOT umask다. 프로그램이 요청한 권한 비트 중 umask가 지정한 비트를 제거한다. 일반 파일 666에 umask 003을 적용하면 664가 된다. umask는 새 파일 생성 시 적용하며, 기존 파일 권한은 chmod로 변경한다. 기본 ACL이 있으면 생성 시 ACL 상속 규칙을 함께 적용한다. umask 매뉴얼
6. 특수권한과 ACL
| 특수권한 | 숫자 | 적용 의미 |
|---|---|---|
| SUID | 4000 | 실행 파일 실행 시 유효 UID가 파일 소유자 기준으로 바뀔 수 있음 |
| SGID | 2000 | 실행 파일의 유효 GID / 디렉터리의 그룹 상속 |
| Sticky bit | 1000 | 공유 디렉터리에서 항목 삭제·이름 변경 주체 제한 |
SUID의 대표 연결은 passwd 같은 프로그램이다. 사용자는 프로그램이 제공하는 암호 변경 절차를 통해 보호된 암호 정보를 갱신한다. Linux에서 SUID의 대표 적용 대상은 실행 바이너리이며, 적용 여부에는 nosuid 같은 마운트 정책도 관여한다.
공유 디렉터리에 SGID를 주면 새 항목이 그 디렉터리의 그룹을 상속하는 데 사용한다. chmod 2770 teamdir를 “SGID + 770”으로 읽는다.
Sticky 디렉터리에서는 보통 파일 소유자·디렉터리 소유자·적절한 특권을 가진 주체만 해당 항목을 삭제·이름 변경할 수 있다. /tmp의 1777을 “모두 접근 가능 + 남의 파일 함부로 삭제 제한”으로 연결한다.
ls에서 s/t는 해당 실행 비트도 켜짐, S/T는 특수 비트는 켜졌지만 해당 x는 꺼짐이다.
ACL은 u/g/o만으로 부족할 때 특정 사용자·그룹에 권한을 더 세밀하게 정한다.
getfacl report.txt
setfacl -m u:guest:r-- report.txtACL mask는 named user·소유 그룹·named group 권한의 상한이다. 소유자와 other 권한은 각각의 ACL 항목으로 정한다. guest에 rw를 줘도 mask가 r이면 유효 권한은 r이다. 기본 ACL은 디렉터리 아래 새 항목에 적용할 상속 규칙이고, 현재 항목의 access ACL과 다르다. ACL 매뉴얼
7. su·sudo·PAM·NSS
su는 사용자 신분을 전환하고 su -는 로그인 환경에 가깝게 전환한다. sudo는 정책이 허용한 명령을 다른 사용자 신분으로 실행한다. 일반적인 sudo 정책에서는 실행자 자신의 암호를 확인하지만 정책으로 달라질 수 있다. sudo -l은 허용 명령 조회, /etc/sudoers와 /etc/sudoers.d는 정책이며 visudo로 문법을 검사하며 편집한다.
PAM은 프로그램별 인증 정책을 모듈로 묶는 구조다. 보통 /etc/pam.d/서비스명에 스택을 정의한다.
| PAM 유형 | 질문 |
|---|---|
| auth | 누구인가, 인증이 맞는가 |
| account | 이 계정이 지금 이 서비스를 써도 되는가 |
| password | 인증 토큰·암호를 어떻게 바꾸는가 |
| session | 로그인 전후 세션에 무엇을 준비·정리하는가 |
required는 실패를 기억하고 나머지를 진행한 뒤 실패, requisite는 실패 시 즉시 실패, sufficient는 앞선 required 실패가 없는 등 조건에서 성공을 빠르게 확정, optional은 보통 결과 영향이 제한적이다. 전체 인증 결과는 스택의 모듈 순서와 각 제어 규칙을 함께 적용해 판단한다.
Linux-PAM 공식 설정 문법에서 제어 규칙을 확인할 수 있다.
NSS는 이름·UID·그룹·호스트 정보를 어디서 조회할지 정한다. /etc/nsswitch.conf의 passwd: files sss 같은 예는 로컬 파일·SSSD 조회 순서다. PAM은 인증 처리, NSS는 정보 조회, LDAP는 원격 디렉터리라는 역할 차이를 기억하자. getent passwd는 NSS를 통한 조회라 단순 cat /etc/passwd와 범위가 다를 수 있다. NSS 설정
필기용 압축
- UID는 사용자, GID는 그룹의 숫자 식별자다. /etc/passwd는 계정 속성, /etc/shadow는 암호 해시와 수명을 관리한다.
- -g는 기본 그룹, -G는 보조 그룹 목록을 지정한다. usermod -aG는 기존 보조 그룹에 추가한다.
- 디렉터리는 이름과 inode 번호를 연결하고, inode는 파일 메타데이터를 관리한다. 하드 링크는 같은 inode를 공유하며 심볼릭 링크는 대상 경로를 저장한다.
- 디렉터리의 r은 이름 목록 읽기, w는 항목 변경, x는 경로 통과다. 항목 삭제에는 부모 디렉터리의 w+x와 추가 접근 정책이 적용된다.
- 권한 숫자는 r=4, w=2, x=1이다. umask는 생성 요청 권한에서 지정 비트를 제거한다. mtime은 내용 수정, ctime은 inode 상태 변경 시각이다.
- SUID(4000)는 실행 시 유효 UID, SGID(2000)는 실행 시 유효 GID 또는 디렉터리 그룹 상속에 관여한다. Sticky(1000)는 공유 디렉터리 항목의 삭제·이름 변경 주체를 제한한다.
- ACL mask는 지정 사용자·소유 그룹·지정 그룹의 유효 권한 상한이다. access ACL은 현재 항목, default ACL은 새 하위 항목의 상속 규칙을 정한다.
- su는 사용자 신분을 전환하고 sudo는 정책상 허용된 명령을 다른 신분으로 실행한다. PAM은 인증·계정·암호·세션을 처리하고 NSS는 계정·호스트 정보의 조회 원천을 정한다.
회상점검 — 단원 끝 한 번
- passwd와 shadow의 역할 차이, passwd의 UID·GID·홈·셸 필드를 설명해봐.
- usermod -G와 -aG가 어떻게 다른가?
- 하드 링크와 심볼릭 링크는 inode·대상 삭제·파일시스템 경계에서 어떻게 다른가?
- 디렉터리의 r/w/x는 각각 어떤 동작을 허용하며, 파일 이름 삭제에는 어느 디렉터리의 어떤 권한이 필요한가?
- chmod 750을 풀어 쓰고, umask 027의 일반 파일·디렉터리 결과를 말해봐.
- SUID·SGID·sticky의 용도는? ctime은 무엇인가?
- ACL의 지정 사용자 권한과 mask가 유효 권한을 정하는 관계를 설명해봐.
- su·sudo, PAM·NSS는 각각 무엇이 다른가?
출처·검증 범위
2026-09-09 작성. 위 inode·ACL·useradd 원천의 관련 본문을 대조했다. PAM 사이트 조회 실패 뒤 프로젝트의 공식 XML 원문으로 기본 제어 규칙을 대조했고 umask·NSS 매뉴얼도 추가 확인했다. 복합 PAM 스택·sudo·shadow·chmod의 모든 옵션을 전수 검증한 것은 아니다. 실행 검증은 하지 않았다. 예제는 자체 작성이며 실제 기출은 읽지 않았다. 이 문서는 사전 작성 자료로, 읽음·회상 응답·숙달을 의미하지 않는다.