모든 권한을 가지고 있는 root의 권한으로 모든 프로그램을 수행하는 것은 위험하기 때문에
모든 시스템에 대한 권한을 최소화 하기 위해 사용자 계정을 만든다.
사용자 이름은 /etc/passwd에 저장된다. (' : '을 이용해 7개 필드를 구분)
- 로그인 이름
- 패스워드를 검증하기 위한 해시 코드(일반적으로 패스워드 /etc/shadow에 저장되어 있음을 나타내는 x로 표기)
- 사용자 ID
- 그룹 ID
- 코멘드 필드(빈칸으로 비워도 무방함)
- 사용자 홈 디렉터리
- 사용자가 사용할 셸(optional)
└─$ cat /etc/passwd | head -n 1
root:x:0:0:root:/root:/usr/bin/zsh
/etc/passwd는 다양한 프로그램에서 읽어야 하기 때문에 모든 사용자가 읽을 수 있는 권한을 준다.
(따라서 passwords는 /etc/shadow에 root 권한의 파일로 별도 저장)
패스워드는 /etc/shadow에 저장된다. (' : '을 이용해 9개의 필드로 구분)
처음 두 필드는 사용자 이름, 패스워드 해시, 나머지 7개의 필드는 패스워드 유효기간과 관계있다.
그룹 이름은 /etc/group에 저장된다. (' : '를 이용해 4개의 필드로 구분)
- 그룹 이름
- 그룹 패스워드(일반적으로 패스워드가 없음을 나타내는 x로 표기)
- 그룹 GID
- 그룹에 속하는 사용자의 목록(' , '로 구분; optional)

---
login Process for Unix System
1. 부팅하고, init 프로세스가 생성(리눅스에서 일반적으로 /sbin/init; 프로세스 ID 1을 갖음)
2. 터미널마다 프로세스가 생성되고 getty가 실행
- init 프로세스는 /etc/ttys 파일을 읽고 파일정보에 있는 터미널, 가상 콘솔마다 프로세스를 만들어 getty를 실행)
3. 환영 메시지 출력, getty는 로그인을 기다림(메시지 /etc/issue에 저장)
4. 계정 입력과 로그인 프로그램 실행(exec("/bin/login"))
- /bin/login은 username을 매개변수로 전달받고, getpass(3)을 호출해서 프롬프트에 비밀번호 입력 요청("Password: ")
5. 비밀번호 입력과 해독
- crypt(3)을 호출해서 패스워드 해독 shadow 파일과 비교(/etc/passwd의 유저계정의 패스워드가 *인 경우 /etc/shadow 확인)
6. 로그인 실패 시(보통 3번) exit(1) 호출
- exit(1)로 종료시 부모 프로세스(init)은 일반적으로 다시 fork해서 getty 다시 수행
7. 로그인 성공 시, 유저에 맞는 기본적인 설정 수행(/etc/passwd를 참조해 기본 정보; 홈 디렉터리 기본 쉘 등 적용)
8. 로그인 배너(/etc/motd) 출력
9. /etc/profile 읽기(system wide default file)
10. 셸 실행(login shell 수행 후, .bashrc, .bash_profile 등에 따라 프로퍼티 변경)