Study · 운영체제 · 로그인 · 계정과 권한
로그인은 비밀번호를 맞히는 일이 아니라 자격증명을 갈아 끼우는 일이다
ssh 로 접속해 whoami 를 치면 내 계정 이름이 나온다. 커널은 내가 누구인지를 어디에 적어 두고 있고, 그것은 언제 정해졌을까?
$ ssh tghan@ubuntu
tghan@ubuntu:~$ id
uid=1000(tghan) gid=1000(tghan) groups=1000(tghan),27(sudo)
# uid=1000 이 커널이 나를 부르는 번호다. 이름 tghan 은 그 번호에 붙인 이름일 뿐이다
아래 재생기의 ▶를 누르면 한 스텝씩 진행된다. 금색 테두리가 지금 이야기하는 곳이고, 캡션이 무슨 일이 일어났는지 말해 준다. 굵게 밑줄 친 말은 누르면 뜻이 나온다. 빨간 딱지는 그때 벌어지는 일의 이름이고, 캡션 바로 위 회색 글자는 지금 스텝이 속한 묶음의 이름이다.
카드 아래 회색 줄은 그 일이 실제로 적혀 있는 소스의 파일 이름 : 줄 번호와 함수 이름이다. 글 안에 (:669)처럼 줄 번호만 적힌 것은 바로 앞에 적은 파일의 그 줄이라는 뜻이다. 캡션 한가운데 박힌 긴 영어 이름과 괄호 속 파일 · 줄 번호도 같다 — 건너뛰고 한글만 읽어도 뜻이 통하게 써 두었다.
▶ 를 누르면 ssh 로 접속한 순간부터 셸이 내 계정으로 뜨기까지를 따라간다. 비밀번호를 보는 자리와 「내가 누구인지」가 정해지는 자리가 서로 다른 칸이라는 것이 이 장면의 요지다.
키보드 · ← → 한 스텝 · Space 재생/멈춤 · Home 처음
비밀번호를 보는 것은 커널이 아니다. 커널이 하는 일은 내 자격증명을 root 에서 나로 갈아 끼우는 것 하나뿐이고, 그 바뀜은 딱 한 줄에서 일어난다.
어떻게 확인했나
소스 어디를 보고 적었는지와 무엇을 돌려서 쟀는지를 남긴 자리다. 처음 읽을 때는 건너뛰어도 된다.
- cred 는 include/linux/cred.h:115 의 구조체이고, task 마다 real_cred 와 cred 두 포인터로 매달려 있다(include/linux/sched.h:1173, 1176). commit_creds 가 그 둘을 한꺼번에 갈아 끼운다(kernel/cred.c:416-417).
- ksys_setsid(kernel/sys.c:1268) 가 세션을 새로 여는 자리다. 우두머리로 세운 뒤 proc_clear_tty 로 물려받은 터미널을 끊는다.
- 도커 우분투에서 id 와 ps -o pid,ppid,uid,sess,comm 을 찍었다. root 로 들어가면 uid=0(root), 만든 계정으로 su 하면 uid=1002(devuser2) 로 나온다 — 커널이 드는 것은 번호이고 이름은 /etc/passwd 가 붙인다.
항목 지도목차 ›
- 계정과 권한
- 1 로그인 — 로그인하면 무슨 일이 일어나나
- 2 계정 만들기 — 계정을 만들면 어디에 무엇이 쓰이나
- 3 권한 주기 — chmod 가 바꾸는 것은 어디에 있나
- 4 권한 검사 — 파일을 열 때 권한을 언제 보나
- 파일과 디렉터리
- 5 파일 만들기 — 파일을 만들면 무엇이 생기나
- 6 디렉터리 — 디렉터리를 만들면 무엇이 생기나
- 7 파일 읽기 — 파일을 읽으면 어디를 거치나
- 8 파일 지우기 — 파일을 지우면 정말 사라지나
- 프로세스
- 9 명령 실행 — 명령 하나를 치면 무슨 일이 벌어지나
- 10 파일 디스크립터 — 프로세스가 파일을 열면 무엇이 늘어나나
- 11 CPU 나누기 — CPU 하나를 여럿이 어떻게 나눠 쓰나
- 메모리
- 12 메모리 요청 — 메모리를 달라고 하면 바로 주나
- 13 페이지 폴트 — 처음 건드릴 때 무슨 일이 일어나나
- 14 OOM — 메모리가 모자라면 누가 죽나
- 네트워크
- 15 소켓 만들기 — 소켓을 만들면 무엇을 받나
- 16 연결 받기 — 연결이 들어오면 누가 먼저 받나
- 17 주고받기 — 데이터가 오갈 때 무엇이 움직이나