개발/UNIX / / 2021. 10. 1. 15:59

UNIX - multi-user environment, permission, password change

반응형

Users and ownerships

Owner

UNIX 시스템의 모든 파일에는 owner가 존재한다. 일반적으로 파일을 생성한 user가 owner가 된다. owner의 실질적인 식별 요소는 user-id(uid)가 있는데, uid에 대한 정보들은 UNIX에서 "/etc/passwd" 에 저장되어 있다.

저장되는 형태는 아래와 같다.

 

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: 사용자가 로그인할 디렉토리 절대경로 (시스템 별로 default home-dir는 다름)
shell: 사용자의 초기 쉘 프로그램 (sh, ksh, csh, bash)

 

user가 프로세스를 동작시키면 프로세스에 user의 uid가 대응된다. file은 user가 프로세스를 동작시켜 생성하는 것이므로 프로세스에 할당한 uid가 file에 할당되는 것이다. 즉 user가 process를 동작시키면 user의 uid가 process에 할당되고, process가 file을 생성하므로 file에 process에 할당되었던 user의 uid가 할당되는 것이다.

 root user라고 부르는 superuser는 파일의 owner조차 변경가능하다. superuser의 username은 root, uid는 0 이다.

 

user가 로그인하면 shell을 호출하는 것이다. 그렇게 되면 shell에 user의 uid를 할당하게 된다. shell에 ls 명령어를 전달하여 호출시킨다고 해보자. shell은 ls라는 프로세서를 동작시키고 ls 프로세서에는 shell의 uid가 할당된다. 다른 명령어들도 마찬가지이다. 

$ touch a.txt

위 명령어를 shell에서 실행하게되면

shell에서 touch 명령어를 실행하였으므로 프로세서에 user의 uid가 할당되고 touch 명령어가 동작하여 a.txt 파일이 생성되면 uid가 파일로 전달된다. 결과적으로는 user의 uid가 생성한 파일에 할당되는 것이다. 

Group

user는 적어도 하나의 group에는 속해있어야 한다. 

$ usermod -G group1, group2 user1

위 명령어를 통해 user1의 그룹을 group1에서 group2로 변경할 수 있다. 

$ id
uid=509(user1) gid=509(group1) groups=509(group1), 510(group2)

id 명령어를 통해서 로그인된 user의 정보를 위와 같이 확인할 수 있다.

 

group정보인 "/etc/group"에 저장되어있고, group에 대응하는 식별자인 gid(group-id)가 할당된다.

gid도 uid와 마찬가지로 shell에 할당되고 프로세스로 할당되는 과정을 거친다.

Real user-id (ruid), Effective user-id (euid)

uid에도 두 가지가 있다. 프로세스를 실행시킨 user의 id인 Real user-id(ruid), 파일에 접근하거나 생성하거나 하는 동작들을 할 수 있는 직접적인 권한을 가진 Effective user-id(euid)가 있다. 대체적으로는 ruid와 euid가 일치하나, 다른 경우에는 모든 동작에 대해서는 euid가 권한을 가진다.

group id도 마찬가지로 Read / Effective 두 가지로 나뉜다.

대부분의 경우, ruid와 euid가 같고 shell에서 위와 같이 ps 명령을 내리면 해당 프로세스에 할당되는 ruid, euid는 같다.

shadow에는 user의 비밀번호가 저장되어있다. 위와 같은 경우, uid = 0인 root계정에서만 shadow에 접근할 수 있는 권한을 가지고 있는데, ruid와 euid가 100으로 같다면 shadow에 접근할 수 없다. shell에서 passwd프로세스를 실행하였을 때 할당되는 euid와 다르게 euid가 root 계정인 0으로 할당되는 경우가 있고 이 경우에 passwd프로세스가 shadow에 접근할 수 있는 것이다. 

 

Permission

permission의 사용자 종류에는 user, group, others가 있고, 파일 권한은 read, write execute 세 가지가 있다. 권한을 나타내는 9비트는 다음과 같다.

superuser의 경우 permission에 관계없이 모든 동작을 할 수 있다.

 

위 그림은 vi editor의 권한을 확인한 결과이다. owner와 group이 root이고, owner에서는 모든 동작을 할 수 있지만, group이나 other user는 write권한이 없으므로 파일에 대해 쓰거나 지우거나 할 수 없다. 

 

S_IRUSER | S_IRGRP | S_IROTH = 0444 = r--r--r--
S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IXOTH | S_IXOTH
  = 0755 = rwx-r-xr-x

permission에 대해서 미리 정의된 symbol을 사용할 수도 있다.

 

open(2)

open system call로 파일을 열 때 파일이 존재하는지도 확인하지만, 파일에 대한 access permission이 있는지도 확인한다. access permission이 없다면 당연히 error로 -1을 반환할 것이다.

access permissino 기준은 effective user 및 group id이다.

filedesc = open(pathname, O_RDONLY|O_CREAT|O_TRUNC, 0600);
/* the file in question will be truncated if it exists */


filedesc = open(pathname, O_RDONLY|O_CREAT|O_EXCL, 0600);
/* if the file exists, return -1 (errno = EEXIST)*/

위 코드에서 O_EXCL로 open하였는데 파일이 이미 존재하는 경우 open하지 못하고 errno 값으로 EEXIST 에러가 들어간다.

 

example

예를 들어 다음과 같이 user들의 파일에 대한 권한이 있다고 하자.

-r--r--rw- usr1 grp1 file1
-r--rw---- usr2 grp1 file2
-------r-- usr1 grp1 file3
-rw-rw-rw- usr1 grp2 file4
--w-rw---- usr2 grp2 file5

-rwxrwxrwx usr1 grp1 a.out

위와 같이 권한이 있는 상황에서 아래와 같이 a.out를 실행한다.

a.out의 uid는 모두 usr1이고, gid는 모두 grp1이다.

a.out의 코드는 다음과 같다.

// a.out
fd1 = open(“file1”, O_RDONLY);

fd2 = open(“file2”, O_RDONLY);

fd3 = open(“file3”, O_RDONLY);

fd4 = open(“file4”, O_RDONLY);

fd4 = open(“file5”, O_RDONLY);

file1의 user 권한이 usr1로 일치하고, user 권한에 r 권한이 있으므로 file1 open은 성공적으로 실행된다.

file2의 user 권한이 usr2로 다르지만, group 권한이 grp1로 일치하고, group권한에 r권한이 있으므로 file2 open은 성공적으로 실행된다.

file3의 user 권한이 usr1로 일치하지만, user권한에 r권한이 없으므로 file3 open은 errno EACESS(접근 권한 에러)로 실패한다.

file4의 user 권한이 usr1로 일치하고, user권한에 r권한이 있으므로 file4 open은 성공적으로 실행된다.

fil5의 user 권한이 usr2로 다르면서, group 권한도 grp2로 일치하지 않므으로 file4 open은 errno EACESS(접근 권한 에러)로 실패한다.

 

The file access tests

permission 확인 절차는 다음과 같다.

  1. effective user id가 superuser일 경우 권한이 허용된다.
  2. 프로세스의 effective user id가 file의 owner id와 같고 access permission bit가 세팅되어있는 경우 권한이 허용된다.
  3. 프로세스의 effective group id가 file의 group id와 같고 access permission bit가 세팅되어있는 경우 권한이 허용된다.
  4. file의 other access permission bit가 세팅되어있는 경우 권한이 허용된다.

Extra permission for executable files

실제로는 permission에는 r/w/x 이외에도 다음과 같은 것들이 있다.

예를들어 S_ISUID(setuid)에 대해서 알아보면,

만약  S_ISUID permission이 설정되어 있는 경우, process를 실행하였을 때 process의 ruid는 shell의 id (user id)로 설정되지만, euid는 file owner의 id로 설정된다.

$ 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

위와 같이 설정하였을 때 shell과 a.out file에 대한 id들은 다음과 같다.

하지만 다음과 같이 permission을 S_ISUID(user bit에 설정했으므로)으로 설정하게되면,

$ chmod u+s a.out
// file의 owner인 user2에서 chmod 가능
$ 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

위와 같이 a.out의 euid는 file의 owner였던 user2의 euid인 200이 a.out의 euid에 할당된다.

 

permission 's'를 설정하는 것은 shell에 할당된 user 권한이 아니라 file의 owner의 권한으로 file에 접근하는 것이다.

sticky bit에 대해서는 디렉토리와 관련된 permission이나 최근에는 잘 다루지 않아 설명하지 않는다.

 

example (password 변경)

password에 대한 정보가 있는 /etc/shadow의 권한은 다음과 같다. 

$ ls –l /etc/shoadow
-r-------- 1 root root 2618  8월 6 21:43 /etc/shadow
$ id
uid=100(user1) gid=500(group1)   groups=500(group1)

따라서 root이외의 사용자는 password를 바꿀 수 없도록 설정이 되어있다. 

 

root이외의 유저가 password를 바꿀 수 있는 방법은 usr/bin/passwd 파일을 통해 /etc/shadow를 변경하는 방법인데, 다음을 보자.

$ ls –l /bin/passwd
-rwsr-xr-x 1 root root 22984 8월 6 21:43 /usr/bin/passwd
$
$ passwd
(current) UNIX password:

/usr/bin/passwd는 other에 대해 execute권한이 있고, setuid 권한 (permission 's') 즉 user에 대해 file의 owner의 권한으로 실행할 수 있도록 설정되어있다. 따라서 file owner의 euid가 passwd process에 세팅되므로 root의 권한으로 root 이외의 사용자가 passwd를 다음과 같이 실행할 수 있다.

passwd 프로세스를 실행하여 변경된 password는 /etc/shadow로 전달되어 password 변경을 할 수 있다. 

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유