The File in Context - file들이 시스템에서 어떤의미를 가지는지
3.1 Files in a Multi-user Environment
Owner
- 리눅스에선 각 파일에 소유자가 존재
- 일반적으로 파일을 생성한 사람이 Owner
Owner의 실제 identity
- user-id(uid = username 과 관련있다.) -> (in /etc/passwd) 에 user에대한 정보가 들어감
ex) keith:x:35:10::/user/keith:/bin/ksh
= login-id:password:uid:gid:user info:home-dir:shell
login-id: 2~8개의 영문소문자 또는 숫자로 구성된 아이디
password: 13자리의 암호화된 패스워드
uid: 숫자로 된 user id (0-60000)
gid: 숫자로 된 group id (0-60000)
user info: 사용자의 실제 이름 등 사용자 정보
home-dir: 사용자가 로그인할 디렉토리 경로
shell: 사용자의 초기 쉘 프로그램
프로세스 역시도 user id를 가짐 일반적으로 프로세스를 시작한 유저의 id
만약 파일이 생성될때 시스템은 ownership을 만드는데, 이때는 해당 프로세스를 생성한 user의 id를 넣음
user - process uid = process를 실행시킨 유저
└ file을 생성 = process uid를 따라 파일을 만듬

소유자를 바꾸는 것도 가능(superuser와 file 소우자만)
superuser(username = root, uid = 0)
Group
- 각 유저는 적어도 하나 이상의 group을 가짐
- in /etc/group → 각 유저가 어떤 그룹에 있는지를 제공
Group의 실제 identity
- group-id (associated with group name)
gid, uid는 모두 유저가 시작한 프로세스로 부터 부여됨
Effective User and Group IDs
- Real user-id(ruid): 프로세스를 실행시킨 사람의 id
- Effective user-id(euid): 기본적으로 ruid와 비슷하지만, 특수한 경우에 바뀜 (program의 uid로)
ex) a가 만든 프로그램을 b가 실행 -> euid는 대부분 b의 id를 가지지만 특수한 경우에 a의 id를 가짐
- euid, efid(effective group-id)는 파일 접근 권한을 결정시킨다.

Permissions and File Modes
- Permission

- permission and File Modes
| Octal value | Symbol | Permission |
|---|
| 00400 | S_IRUSR | read by owner |
| 00200 | S_IWUSR | write by owner |
| 00100 | S_IXUSR | execute by owner |
| 00040 | S_IRGRP | read by group |
| 00020 | S_IWGRP | write by group |
| 00010 | S_IXGRP | execute by group |
| 00004 | S_IROTH | read by others |
| 00002 | S_IWOTH | write by others |
| 00001 | S_IXOTH | execute by others |
File permission: open(2)
- 만약 존재하는 파일을 열경우
- 시스템은 mode of access를 보고 권한이 있는지 없는지 check한다.
- 만약 프로세스가 접근권한이 없으면 open은 -1을 return
- 커널이 file access test를 진행 (euid와 egid를 근거해서)
The File Access Tests
- 테스트는 커널에 의해 다음과 같이 진행됨
- 만약 프로세스의 euid가 0이면 access는 허가됨
- 만약 프로세스의 euid가 file의 owner id와 같으면 user access permission 비트가 set되 있을경우 접근이 허가됨
- 만약 프로세스의 egid가 file의 gid와 같으면 group access permsiion 비트가 set되 있을경우 접근이 허가됨
- 만약 other access permission 비트가 set되 있을경우 접근이 허가됨
| Octal value | Symbol | Permission |
|---|
| 04000 | S_ISUID | set user-id 비트를 on |
| 02000 | S_ISGID | set group-id 비트를 on |
| 01000 | S_IXVTX | sticky 비트 on |
- 만약 S_ISUID 권한이 set되면, 파일이 시작될 때 시스템은 euid를 프로그램의 실 소유자(프로그램 만든 사람)의 id로 설정해줌(앞서말한 내용).
if(S_ISUID == 0) → euid = ruid
if(S_ISUID == 1) → euid = 프로그램 owner id

사용자들은 그들의 비밀번호를 /etc/shadow로 접근함으로써 바꿀 수 있음. 이때 /etc/shadow는 passwd 프로그램을 통해 접근할 수 있음
- 사용자들은 직접적으로 /etc/shadow를 접근할 수 없음
- 하지만 S_ISUID bit이 on인 /usr/bin/passwd파일을 실행함으로써 /etc/shadow를 실행할 수 있음
