반응형

 

프로그램이 실행되면 프로세스라고 하며, 이 실행 중인 프로세스에는 2가지 종류의 user가 있습니다. 바로 real user와 effective user입니다. (실행중인 프로그램 내에서는 getuid()로 uid를 , geteuid()로 euid를 얻을 수 있습니다.)

 

real user는 프로세스를 실행했을 때에 명령어를 실행시킨 user이고, effective user는 프로세스가 실행되면서 access할 파일 등에 대한 권한을 가지는 user입니다. 일반적으로 는 real user와 effective user가 동일합니다.

 

 

예를 들면 myjob 프로그램과 myjob.txt이라는 파일의 권한이 아래와 같다고 하겠습니다. 그리고 myjob이라는 프로그램 내부에서 myjob.txt라는 파일을 쓰는 작업이 있다고 가정하겠습니다. (계정은 owner, other이 있다고 가정)

$ ls -al 
...
-rwxr-xr-x. 1 owner group1 30723   oct 11 13:40  myjob
-rw-r--r--. 1 owner group1 30723   oct 11 13:40  myjob.txt

위의 myjob은 모든 user에게 실행 권한이 있습니다.

만약 계정 owner가 myjob이라는 프로그램을 실행을 한다면 이 myjob 프로세스의 real user와 effective user가 모두 owner가 됩니다. 그리고 계정 other도 실행 권한이 있기 때문에 myjob이라는 프로그램을 실행을 한다면 이 myjob 프로세스의 real user와 effective user가 모두 other이 됩니다.

 

그런데, 계정 owner는 myjob 내부에서 myjob.txt 쓰기를 하면 파일에 쓰기 권한이 있기 때문에 파일에 쓰기를 할 수 있습니다. 그러나 other은 myjob를 실행하면 effective user가 other이기 때문에 읽기 권한만 있기 때문에 myjob.txt에 쓰기를 하다가 myjob 프로그램은 쓰기 권한이 없어서 오류가 발생합니다.

 


프로세스에서 쓰기 권한을 주는 방법

 

이 경우 해결하는 방법은 2가지가 있습니다. 

 

1. 파일에 쓰기 권한 부여

    myjob.txt의 소유자인 owner가 myjob.txt 파일에 대해서 -rw-rw-rw- 권한을 부여하는 방법이 있습니다. 이렇게 하면 파일에 다른 user들도 쓰기 권한이 있어서 아무나 쓸 수가 있게 되어 myjob 프로그램도 정상적으로 파일 쓰기가 됩니다. 이렇게 파일에 쓰기 권한을 주게 되면 다른 user들이 vi 등으로 myjob.txt 파일을 직접 수정하거나 rm으로 삭제할 수 있습니다. 그러면 파일의 format에 맞지 않게 아무렇게 변경하거나 삭제할 수 있게 되어 문제가 발생할 수 있습니다.

 


 

2. 프로그램에 effective user 권한 부여 (SetUID bit)

다른 방법으로는 myjob 실행 파일에 effective user (SetUID bit 설정)권한을 부여하는 것입니다.

$ chmod u+s myjob
    또는
$ chmod 4755 myjob

$ ls -l
...
-rwsr-xr-x. 1 user1 group1 30723   oct 11 13:40  myjob
-rw-r--r--. 1 user1 group1 30723   oct 11 13:40  myjob.txt

 위와 같이 chmod u+s myjob 명령어를 실행하여 myjob 프로그램에 effective user 권한(SetUID)을 부여합니다. 이렇게 권한이 부여 되면 파일에 대한 권한이 -rwxr-xr-x 에서 -rwsr-xr-x로 바뀌게 됩니다. 

권한이 이렇게 변경이 된 후에 other 계정으로 myjob 명령어를 실행하면 real user 는 other이 되고 effective user는 owner가 되어 myjob 프로세스는 myjob.txt 파일에 대해서 쓰기 권한이 생기게 됩니다. 이렇게 실행 파일에 권한을 부여하면 프로그램의 owner를 제외한 다른 user들은 이 프로그램 이외의 다른 방법으로는 myjob.txt 파일을 수정할 수 없게 됩니다.

 

그리고 아래와 같이 other 계정으로 myjob을 실행하고

other ~]$ myjob 

 

다른 terminal에서 프로세스 상태롤 보면

other ~]$ ps -ef | grep myjob

owner 20123 20110 ....    myjob

실행되고 있는 프로세스는 분명히 ohter이 실행했음에도 불구하고 owner가 실행한 것으로 보입니다. 그러나 real user id는 other입니다.

 


Real User와 Effective User가 다르게 실행되는 명령어

 

passwd 명령어는 비밀번호를 변경하는 프로그램이고, sudo 명령어는 root의 권한을 잠시 사용하는 명령어 입니다. 이 들 프로그램은 /etc/shadow 파일을 읽거나 쓰기가 필요한 명령어 입니다. 이 shadow 파일은 계정의 비밀번호가 들어 있어서 root 권한자 이 외에는 파일을 읽기도 할 수 없습니다. passwd는 기존의 비밀번호가 맞는 지 확인하고 변경된 비밀번호를 shadow 파일에 기록을 합니다. 만약 passwd 명령어에 effective user 권한(SetUID bit)이 없다면 비밀번호를 확인하거나 변경할 수가 없을 것입니다. 즉, root 이외에는 비밀번호를 변경할 수 없게 됩니다.

 

$ ls -al /etc/shadow
-r--------.  1 root sys 2645 Aug  9  2019 /etc/shadow

$ which passwd
/usr/bin/passwd

$ ls -al /usr/bin/passwd
-rwsr-xr-x.  1 root root 30768 Nov  3  2015 /usr/bin/passwd

위와 같이 shadow 파일의 권한은 root만 읽을 수 있고, passwd 명령어는 rwsr-xr-x 권한이 부여된 것을 확인할 수 있습니다. 이와 같이 passwd 명령어는 effective user가 root로 실행되면서, 일시적인 root 권한으로 비밀번호를 읽고 변경할 수 있도록 하는 것입니다. 그리고 일반 사용자는 passwd 명령어를 실행할 때에 argument도 없이 실행을 합니다. 그러면 누구의 비밀번호를 변경해야할 지는 어떻게 알까요? 바로 프로세스를 실행 시킨 user 즉, real user id를 읽어서 그 user에 대한 비밀번호를 입력받고 맞는 지 확인하고 비밀번호가 맞으면 새로운 비밀번호를 입력받아서 저장하게 됩니다.

 


 

see also : getuid(2) geteuid(2) getpwuid(3) getpwuid_r(3)  

 

반응형

'LINUX > 기초' 카테고리의 다른 글

open된 파일을 삭제하면 어떻게 되나?  (2) 2019.09.23
블로그 이미지

자연&사람

행복한 개발자 programmer since 1995.

,