Users and Ownerships
유닉스는 멀티유저 시스템임
어떤 유저가 파일을 만들면 그 파일의 owner가 됨, 어떤 파일이 있으면 그 파일의 owner가 존재함
모든 유닉스 시스템의 모든 파일에는 그 파일을 소유하는 소유자가 있음, 시스템의 유저 중 한명
보통 user name으로 로그인하면 user id가 있는데, user id를 숫자로 표현한 user id가 있음
이를 보통 uid라고 함
uid는 /etc/passwd 에 등록됨
keith라는 이름의 user id는 35이고, group은 user에 속함 그룹도 gid가 있음
대개가 login id와 home directory id가 같음
시스템마다 directory home id는 default로 설정하는데 시스템마다 좀 다름
로그인하면 로그인하자마자 곧바로 %나 $같은 쉘의 프롬트가 뜸
최초에 실행되는 쉘 프로그램이 여기에 등록됨
초창기 리눅스 버전에는 passwd에 찐 password가 저장됐었는데
보안 문제가 생기면서 password를 다른 파일로 옮김
login-id로 로그인하면 그 사람에 대응하는 id가 있다고 했었음
그 사람이 프로그램을 실행해서 프로세스를 생성하면 프로세스에도 uid가 대응됨
이 프로세스를 누가 실행시켰는지, 파일의 owner처럼 프로세스의 owner역할을 하는 거임
그래서 프로세스에도 uid가 대응됨
우리가 파일을 생성하면 그 파일을 생성한 사람이 그 파일의 owner가 된다고 했는데
실제로 파일을 만들 때 사람이 만드는게 아니라 그 사람이 가동한 프로세스가 만드는 거임
그래서 파일의 owner는 그 파일을 만든 프로세스의 owner임
슈퍼유저(루트유저, uid가 0) 는 파일의 ownership을 바꿀 수 있음
자기 파일을 자기가 ownership을 바꿔서 다른 사람에게 양도하면 owner가 바뀌면서 다시 자기껄로 바꿀 수 없음
쉘에 ls 명령어를 치면, ls 프로세스를 만들어 줌 - child process임
child process는 부모의 uid를 상속받음
유저들이 모여서 그룹이 형성됨
여러 개의 그룹이 있을 수 있음. 한 유저가 한 개의 그룹에만 속하지는 않지만 적어도 한 그룹에는 속해야 함.
usermod라는 명령어로 자기 그룹을 수정할 수 있음
id는 whoami랑 비슷한 명령어임. 로그인한 아이디 유저 정보를 보는 명령어
$ usermod -G group1,group2 user1
$ id
uid=509(user1) gid=509(group1) groups=509(group1),510(group2)
그룹에 대한 정보는 /etc/group 파일에 들어있음
그룹에도 그 그룹에 해당하는 gid가 있음
유저가 프로세스를 만들면 uid나 gid를 상속받음
쉘도 프로세스라서 쉘의 id도 로그인한 사람의 uid와 gid를 가짐
Effective user and group id
프로세스의 uid는 real uid, effective uid 두개가 있음
real user id는 프로세스를 실행시키는 유저의 아이디임
어떤 프로세스를 만들었을 때, 그 파일의 owner는 effective user id가 됨
어떤 프로세스가 파일에 대해 만들거나 엑세스할 때 permission이 있어야 함. 그게 euid와 관련 있음
group id도 마찬가지로 real과 effective로 나뉨
shell에서 passwd 파일을 실행해서 user의 passwd를 바꿀 수 있는데 이건 아무나 못바꿈
/etc/shadow에 찐 패스워드가 저장되어 있는데 shadow 파일 owner가 rooㅅ임
passwd를 바꾸려면 write permission이 있어야 함
ruid와 euid가 모두 100이라고 가정
passwd를 실행하면 euid가 0으로 바뀜
루트 권한으로 바껴서 shadow 파일을 변경할 수 있음
permission
permission 내용은 여기에 있음
파일이 다섯개 있고 각 user랑 group이랑 permission이 주어짐
a.out 프로그램이 있는데 owner가 usr1, grp1임
유저의 쉘에서 a.out으로 프로세스를 만들었을 때,
이 쉘에 ruid, euid가 usr1이라고 하고, rgid, egid는 grp1인 거임
fd1 = open(“file1”, O_RDONLY); : owner가 usr1로 같아서 user permission에 따라 read로 open 가능
fd2 = open(“file2”, O_RDONLY); : user가 달라서 group을 확인함. group permission에 따라 read로 open 가능
fd3 = open(“file3”, O_RDONLY); : user는 같지만 user permission에 read permission이 없어서 open 실패
fd4 = open(“file4”, O_RDONLY); : user가 같아서 read로 open 가능
fd4 = open(“file5”, O_RDONLY); : user id가 다름, group id도 다름. others permission을 보면 read가 없어서 open 실패
extra permission for executable file
read write exec외에 permission 비트가 하나 더 있음
S_ISUID는 파일을 실행할 때, 이 프로그램을 실행한 쉘의 ruid = 로그인 한 사람의 ruid로 세팅해줌
이게 세팅이 되어 있으면 쉘의 uid를 euid로 세팅하지 않고 파일의 오너를 프로세스의 euid로 취함
세팅이 안되어 있으면 ruid와 euid가 같음
이 파일이 자기 파일이 아니라면 쉘이 유저 아이디가 있을 텐데
쉘 ruid로 ruid로 설정해주고 euid는 파일의 오너로 세팅함
$ id
uid=100(user1) gid=500(group1) groups=500(group1)
$ ls –l
-rwxr-xr-x 1 user2 group2 0 2월 10 21:44 a.out
$ ./a.out
로그인 한 사람 user1, group1, uid = 100, gid = 500
a.out 파일을 봤더니 owner가 user2임
user2$ chmod u+s a.out 를 함
$ id
uid=100(user1) gid=500(group1) groups=500(group1)
$ ls –l
-rwsr-xr-x 1 user2 group2 0 2월 10 21:44 a.out
$ ./a.out
s permission을 추가해서 rwsr-xr-x가 됨
s는 x가 없으면 의미가 없어서 반드시 x가 있는 경우 s가 추가되는 것임
s가 있으면, 이 user permission 위에 있는 set user-id on execution에 1이 세팅됐다는 말임
이러고 a.out을 실행하면 ruid랑 euid는 각각 100이고
쉘의 euid는 파일의 owner인 user2의 id를 갖게 됨
내가 ruid가 100이었음
a.out을 실행했는데, 이 파일의 owner가 set user id on execution이 1로 설정되어 있으면
ruid는 내가 되는데 euid는 내가 아니라 a.out의 owner의 id로 설정된다는 말임
그럼 그 사람의 permission으로 파일을 엑세스할 수 있음
passwd의 owner는 root임
set user id on execution이 1로 설정되어 있어서 모든 유저가 실행은 할 수 있음
shadow에 찐 비밀번호가 저장되어 있는데 passwd 명령어를 실행하면 shadow에 접근할 수 있음
'CS > 유닉스프로그래밍' 카테고리의 다른 글
7. 유닉스의 프로세스 - 2 (0) | 2020.12.03 |
---|---|
6. 유닉스의 프로세스 - 1 (0) | 2020.12.02 |
3-1. 유닉스 파일 : redirection, 표준 IO 라이브러리, error handling (0) | 2020.10.06 |
2-2. 유닉스 파일 시스템콜 : open, creat, close, read, write, lseek , dup, fcntl (1) | 2020.10.06 |
2-1. 유닉스 파일, 파일시스템 (0) | 2020.10.06 |