Process ↔ File 간의 관계

• Unix/Linux File System

- Physical disk partition

> df	; 파티션 정보와 사용량 및 마운트 정보 (C: D: E; in Windows)

- 논리적 File System

/

D1

f1

D3

D4

f2

bin

home

user1

user2

user3

▪ pathname

- absolute pathname : the path begins at the "root" dir.

ex) /home/prof/tykim/doc/book/chap1.txt

- relative pathname : the path begins at the current working dir.

ex) doc/book/chap1.txt

e.g., > pwd

• 어떤 process가 어떤 file들을 access할 수 있는가?

⇒ Multi-user 환경에서 보안 기능을 제공하여야 함.

∘Every process has 4 IDs. - real user ID - real group ID - effective user ID - effective group ID	∘Every file has the following attributes. - owner's user ID - owner's group ID - access permission user r.w.x. group r.w.x. other r.w.x.

ex) # chmod 6766 test.txt

rwxrwrw	tykim prof	test.txt

* 혹은, creat()나 open()시에도 set 가능.

- file access mode word (p.29 stat 구조체 ushort st_mode)

1   1 1 1   0 0 0   0 0 0   0 0 0   0 0 0

file type           user    group   other

Save text image after execution("sticky bit")

Set group ID on execution

Set user ID on execution

* sticky bit가 set되면 공유가능 program의 text 부분이 kernel이 살아 있을 때까지 swapping area에 남아 있게 되어서 program이 다음에 호출될 때, kernel이 그 program을  해당 directory에서 찾지 않고 swapping area에서 불러 오므로 빠르게 수행시킬 수 있다.

⇒ 자주 사용되는 program.  ex) cc, vi

ex) display access permission bit for a file

# ls -al

rwxrr	tykim prof	test.txt

# stat test.txt

• File access permissions

- If any of the following are true, access is allowed.

① The effective user ID of a process = 0	; superusr의 경우.

② ( The effective "user" ID of a process

= the "user" ID of the owner of the file) AND

( The appropriate "user" access permission bit is set)  ; 자신의 file.

③ ( The effective user ID of a process

≠ the user ID of the owner of the file) AND

( The effective "group" ID of a process

= the "group" ID of the owner of the file) AND

( The appropriate "group" access permission bit is set)  ; 그룹 공유 file.

④  The effective user ID of a process

≠ the user ID of the owner of the file) AND

( The effective group ID of a process

≠ the group ID of the owner of the file) AND

( The appropriate "other" access permission bit is set)  ; 모두 공유 file.

• Real ID and Effective ID

- ① real user/group ID: process 실행자의 ID.

⇒ login할 때 set되는 user/group ID - in the /etc/passwd file

⇒ Shell process의 user/group ID

② effective user/group ID: image 생성자의 ID로 변경 가능함.

⇒ Shell로부터 program이 exec()될 때 set.

- image를 exec()시킬 때,

case 1: real user/group ID = effective user/group ID 경우?

(자신/다른 user가 만든 image를 실행) AND

(set user_id/group_id bit is NOT set)

case 2: real user/group ID ≠ effective user/group ID 경우?

(다른 user가 만든 image를 실행) AND

(set user_id/group_id bit is set)

ex) user1's real user ID: 1001  &  user2's real user ID: 1002

user1# vi test.c

#include <stdio.h>

main(){

printf("uid = %d, e_uid = %d\n", getuid(), geteuid());

exit(0);

}

user1# cc test.c -o test

user1# chmod 0777 test	; case 1

user2# ~user1/test

e_uid = 1002

user1# chmod 6777 test	; case 2

user2# ~user1/test

e_uid = 1001

- Why real user/group ID ≠ effective user/group ID?

ex)  real user ID, group ID는 login시의 user ID, group ID이다. 그러나, 이것을 사용하면 password 변경과 같은 작업을 할 수 없다. 왜냐하면 password는 /etc/passwd file에 기록되어 있고 이 file의 permission은 -rw-r--r--로 되어 있어서 root(real user ID=0, real group ID=1)만이 변경 가능하다. 실제 시스템에서 사용자가 자신의 password를 변경할 때에 이 파일을 갱신할 수 있기 위해서 /bin/passwd program file이 process로 실행될 때 root의 eff. user ID, group ID를 사용한다.

⇒

/bin/passwd program file은 set user ID on execution 비트가 1로 set되어 있어 이런 작업이 가능하다.

⇒

따라서, passwd process는 program file을 “실행”시키는 사용자의 file access 권한이 아니라, program file “소유자”의 file access 권한을 가진다.

▪ Real user ID

- user 등록시 부여되는 a positive integer user ID.

- unsigned short getuid()	; 16 bit

- used in the file system to record the owner of a file.

- in /etc/passwd

▪ Real group ID

- used to aggregate the users of the Unix system into project groups.

⇒ team을 구성하여 file을 공유.

- in /etc/group

ex) dcgroup::98:tykim, kimys, twlee

- unsigned short getgid()

▪ password file

- /etc/passwd

- format

login-name:encrypted-password:user-ID:group-ID:miscellany:login-directory:shell

ex)	#include <pwd.h>

struct passwd *getwuid(int uid) ; /etc/passwd에서 주어진 user ID의 해당 row를 return.

struct passwd *getwnam(char* name) ; /etc/passwd에서 주어진 login name의 해당 row를 return.

p. 25 program

▪ shadow password

- in system V (e.g. Solaris)

- /etc/shadow	; 암호화된 password를 따로 보관.

▪ effective user ID

- Normally, this is the same as the real user ID.

- But, when a pgm is executed, it is "possible" to change the eff. user ID of the process to be the user ID of the owner of the file, according to the "set-user-id" bit.

- unsigned short geteuid()

▪ effective group ID

- Normally, this is the same as the real group ID.

- But, when a pgm. is executed, it is "possible" to change the eff. group ID of the process to be the group ID of the owner of the file, according to the "set-group-id" bit.

- unsigned short getegid()

▪ Superuser

- user ID : 0,	group ID : 1

- login name : root

- unrestricted access to files and termination of any other processes.

▪ group file

- /etc/group

- format

group-name:encrypted-password:group-ID:user-list

ex)	#include <grp.h>

struct group *getgrgid(int gid) ; /etc/group에서 주어진 group ID의 해당 row를 return.

struct group *getgrnam(char* name) ; /etc/group에서 주어진 group name의 해당 row를 return.

▪ 참고: 새 user 추가 방법

① 사용자 login name, user ID, group ID, home directory, shell을 등록한다.

ex) root> vi /etc/passwd

jangdol::179:40::/user/grad/jd:/bin/csh

② 추가된 사용자의 home directory를 만들어 준다.

ex) root> cd /usr/grad

root> mkdir jd

③ home directory의 user와 group의 소유권을 바꿈. (현재는 root로 되어 있음.)

ex) root>chown jangdol jd

root>chgrp grad jd

④ 사용자가 처음 login하면 password가 없으므로 바로 login 됨.

자신의 directory에 대한 permission을 확인해 볼 것.

▪ File access mode word

- p.33 fig.2-3

- can be isolated using a mask of	0700 ; user access bits only.

0070 ; group access bits only.

0007 ; other access bits only.

ex) p.30 program

switch (statbuff.st_mode & 0700)	; bit 곱 연산자.

▪ File mode creation mask (f.m.c.m)

- 모든 “process”는 f.m.c.m를 가짐.

- When a new file or directory is created, f.m.c.m specifies which bits in the new file are to be ‘cleared’.

⇒ file이 생성될 때, 또는 creat()/open() 호출로 file mode가 주어지는 경우, f.m.c.m.에서 1로 set된 file access permission은 자동적으로 모두 0로 set 되어짐.

- int umask (int cmask)	; set a new f.m.c.m. for a process.

old f.m.c.m	new f.m.c.m.

ex) oldu=umask(07)	; new f.m.c.m 000 000 111

ex)	char * pathname;

int oldu, newu;

newu = 022;

oldu = umask(newu);

fd = creat(pathname, 0664);

umask에 사용된 값	022	0 0 0 0 1 0 0 1 0
creat시 permission	664	1 1 0 1 1 0 1 0 0
만들어진 파일의 permission	644	1 1 0 1 0 0 1 0 0

- Why f.m.c.m.?

open()/creat()시 file access를 clear.

ex) f.m.c.m = 000 111 111로 set하면 이후로 만들어지는 모든 file은 group과 other는 무조건 access할 수 없음.

ex) 주의: p.80 daemon process program

umask(0);

⇒ fork()시 parent process의 image가 그대로 child process의 image로copy됨.

⇒ child process는 부모로부터 물려 받은 f.m.c.m.를 clear하여야 open() 또는 creat() 호출시의 file access mode와 일치하는 file을 생성할 수 있음.

⇒ 특정한 file access 허가가 우연히 지정되는 것을 방지하기 때문에 생성된 file의 안전을 위해서 유용.