Study · 운영체제 · 계정 만들기 · 계정과 권한
계정은 커널이 아니라 파일 두 개가 들고 있다
useradd 로 계정을 만들면 그 정보는 어디에 저장될까? 커널 안일까, 아니면 파일일까? 아래 grep 은 파일에서 그 이름이 든 줄만 뽑아 보여 주는 명령이다.
$ sudo useradd -m devuser
# -m 은 홈 폴더(/home/devuser)도 같이 만들라는 뜻이다
$ grep devuser /etc/passwd
devuser:x:1001:1001::/home/devuser:/bin/sh
$ sudo grep devuser /etc/shadow
devuser:!:20352:0:99999:7:::
# 지금은 두 번째 칸의 ! 만 보면 된다 — ! 는 「아직 비밀번호 없음」. 뒤의 숫자들은 비밀번호를 언제 바꿨나 같은 것이라 넘겨도 된다
아래 재생기의 ▶를 누르면 한 스텝씩 진행된다. 금색 테두리가 지금 이야기하는 곳이고, 캡션이 무슨 일이 일어났는지 말해 준다. 굵게 밑줄 친 말은 누르면 뜻이 나온다. 빨간 딱지는 그때 벌어지는 일의 이름이고, 캡션 바로 위 회색 글자는 지금 스텝이 속한 묶음의 이름이다.
카드 아래 회색 줄은 그 일이 실제로 적혀 있는 소스의 파일 이름 : 줄 번호와 함수 이름이다. 글 안에 (:669)처럼 줄 번호만 적힌 것은 바로 앞에 적은 파일의 그 줄이라는 뜻이다. 캡션 한가운데 박힌 긴 영어 이름과 괄호 속 파일 · 줄 번호도 같다 — 건너뛰고 한글만 읽어도 뜻이 통하게 써 두었다.
▶ 를 누르면 계정 하나를 만드는 동안 무엇이 어디에 적히는지 따라간다. 커널 칸은 따로 두지 않았다 — 커널이 하는 일이 「파일에 글자 쓰기」 하나뿐이라 파일 칸 안에서 보여 준다. 계정 만드는 일의 거의 전부를 사용자 공간 프로그램 하나가 한다는 것이 이 장면의 요지다.
키보드 · ← → 한 스텝 · Space 재생/멈춤 · Home 처음
계정은 커널 안이 아니라 평범한 텍스트 파일에 적힌다. 비밀번호만 따로 떼어 아무나 못 읽는 파일에 둔 것이, 파일이 둘로 나뉜 이유다.
어떻게 확인했나
소스 어디를 보고 적었는지와 무엇을 돌려서 쟀는지를 남긴 자리다. 처음 읽을 때는 건너뛰어도 된다.
- 커널에는 계정 이름이 없다 — struct cred(include/linux/cred.h:115)에 이름 칸이 없고, uid 의 타입 kuid_t 는 숫자 하나를 감싼 것뿐이다(include/linux/uidgid_types.h:7).
- 커널은 계정 파일을 특별 취급하지 않는다 — /etc/passwd 에 한 줄을 붙이는 것도 vfs_write(fs/read_write.c:667) 하나를 지난다. 쓰기로 열 자격은 may_open(fs/namei.c:4269)이 rwx 로만 본다.
- 홈 디렉터리 주인도 번호로 적힌다 — chown_common(fs/open.c:788)이 notify_change 로 inode 의 i_uid(include/linux/fs.h:770)를 바꾼다.
- setuid 표시가 붙은 파일을 실행하면 커널이 euid 를 파일 주인 번호로 올린다 — bprm_fill_uid(fs/exec.c:1683)의 if (mode & S_ISUID) 가 그 자리다.
- /etc/passwd 는 644 root:root, /etc/shadow 는 640 root:shadow 였다(stat -c '%a %U:%G'). 계정 목록은 누구나 읽고, 비밀번호 해시는 root 와 shadow 그룹만 읽는다.
- 맞다. 비밀번호를 안 정한 계정은 nopw:!:20717:0:99999:7::: 처럼 그 칸이 ! 하나이고, 비밀번호를 정하면 같은 칸이 $y$j9T$... 로 바뀐다($y$ 는 yescrypt 다). 둘을 나란히 만들어 견줬다.
- useradd -m 은 /etc 안의 여섯 쌍을 건드린다 — passwd · shadow · group · gshadow · subuid · subgid 와 각각의 + (새로 쓰는 임시본) · - (직전 백업). strace 로 쓰기로 연 것만 세니 29번이었다.
항목 지도목차 ›
- 계정과 권한
- 1 로그인 — 로그인하면 무슨 일이 일어나나
- 2 계정 만들기 — 계정을 만들면 어디에 무엇이 쓰이나
- 3 권한 주기 — chmod 가 바꾸는 것은 어디에 있나
- 4 권한 검사 — 파일을 열 때 권한을 언제 보나
- 파일과 디렉터리
- 5 파일 만들기 — 파일을 만들면 무엇이 생기나
- 6 디렉터리 — 디렉터리를 만들면 무엇이 생기나
- 7 파일 읽기 — 파일을 읽으면 어디를 거치나
- 8 파일 지우기 — 파일을 지우면 정말 사라지나
- 프로세스
- 9 명령 실행 — 명령 하나를 치면 무슨 일이 벌어지나
- 10 파일 디스크립터 — 프로세스가 파일을 열면 무엇이 늘어나나
- 11 CPU 나누기 — CPU 하나를 여럿이 어떻게 나눠 쓰나
- 메모리
- 12 메모리 요청 — 메모리를 달라고 하면 바로 주나
- 13 페이지 폴트 — 처음 건드릴 때 무슨 일이 일어나나
- 14 OOM — 메모리가 모자라면 누가 죽나
- 네트워크
- 15 소켓 만들기 — 소켓을 만들면 무엇을 받나
- 16 연결 받기 — 연결이 들어오면 누가 먼저 받나
- 17 주고받기 — 데이터가 오갈 때 무엇이 움직이나