setuid 와 setgid 란?

유닉스나 리눅스 에는 setgid(Set User Id), setuid(Set Group Id) bit 라는 특별한 속성이 있습니다.

이 비트가 붙은 파일이나 디렉터리를 볼 경우 s 로 표시됩니다.

아래는 ls -l /usr/bin/passwd 를 실행한 예제입니다.

파일의 사용자 퍼미션 부분의 's' 표시는 setuid 비트이며 그룹 퍼미션 부분의 's' 표시는 setgid 비트로 /usr/bin/passwd 는 setuid 비트가 설정되어 있고 소유자가 root 인 것을 알수 있습니다.


setuid 가 붙은 프로그램은 실행시 소유자의 권한으로 전환되며 setgid 가 붙은 프로그램은 실행시 소유 그룹의 권한으로 전환됩니다.


setuid setgid 가 필요한 이유는 일반 사용자가 변경할 수 없는 파일이지만 변경이 필요한 경우가 있어서 입니다.


예로 사용자의 암호를 담고있는 /etc/shadow 파일은 root 만 읽을수 있고 수정은 불가하지만  사용자가 암호를 변경할 경우 /etc/shadow 파일이 변경되어야 합니다.


그래서 암호를 변경하는 /usr/bin/passwd 는 setuid 비트가 붙어 있으며 이 비트가 있으면 실행시 파일의 소유자 권한으로 전환되므로 root 권한을 갖게 되어 /etc/shadow 파일에 변경된 암호를 기록할 수 있게 됩니다.


파일에 setuid 비트를 붙이려면 root 권한으로 다음과 같이 맨 앞에 4 를 붙여서 지정하면 됩니다. 

chmod 4755 setuid-prog
BASH


마찬가지로 파일에 setgid 비트는 root 권한으로 다음과 같이 맨 앞에 2 를 붙여서 지정합니다.

chmod 2755 setgid-prog
BASH

setuid, setgid 비트는 보안에 큰 위협이 되며 이때문에 SELinux 같은 강제 접근 통제(MAC; Mandatory Access Control) 가 필요합니다.

setuid, setgid 가 붙은 프로그램은 다음 find 명령어로 찾을 수 있습니다.

find /bin /usr/bin /sbin -perm -4000 -o -perm -2000 |xargs ls -l
CODE


sticky bit

스티키 비트(1000)가 설정된 디렉터리는 누구나 파일을 만들수 있지만 자신의 소유가 아닌 파일은 삭제할 수 없습니다. 즉 일종의 공유 디렉터리라고 볼수 있는데 sticky bit 가 붙은 가장 유명한 사례는 유닉스의 임시 파일을 쓰는 디렉터리인 /tmp 입니다.

디렉터리에 스티키 비트를 붙일 때 누구나 읽고, 쓰고, 실행할 수 있도록 777 권한을 줘야 하며 다음은 /opt/mytmp 에 스티키 비트를 부여하는 예제입니다.

chmod -R 1777 /opt/mytmp
CODE


파일이나 디렉터리의 자세한 정보를 보는 명령어인 stat 를 사용해서 stat /tmp 를 실행하면 Access 부분이 1777 이 지정된 것을 확인할 수 있습니다. 

$ stat /tmp/

  File: /tmp/
  Size: 129             Blocks: 0          IO Block: 4096   directory
Device: ca02h/51714d    Inode: 8409696     Links: 5
Access: (1777/drwxrwxrwt)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:tmp_t:s0
Access: 2019-10-29 16:34:47.112000000 +0000
Modify: 2020-08-09 13:57:39.442115154 +0000
Change: 2020-08-09 13:57:39.442115154 +0000
 Birth: -

BASH

같이 보기