RHCSA 준비/02. 고급 권한 관리

2.1 확장 권한 개념 (setUID, setGID, sticky bit)

Jaden Park 2021. 5. 19. 23:33

리눅스의 기본 권한

  • 읽기(r)
  • 쓰기(w)
  • 실행(x)

확장 권한

  • setuid
  • setgid
  • sticky bit

 

setuid

  • 사용자가 바이너리 파일이나 스크립트와 같은 실행 파일을 실행하면 파일을 실행한 사용자가 주체가 되어 프로세스를 실행
  • 하지만, setuid가 설정되어 있는 파일을 실행하면 파일을 실행한 사용자가 아니라 파일을 소유하고 있는 사용자의 권한으로 프로세스를 실행
  • 설정되어 있는 파일은 사용자 권한 필드에서 실행 권한이 x 대신 "s" 로 표시
  • 만약 파일에 실행권한이 설정되어 있지 않은 상태에서 setuid를 설정하면 S(대문자)로 표시
    • 이는 실행 권한이 설정되어 있지 않다는 것
  • 대표적으로 passwd 명령에 사용
[user@centos7 ~]$ which passwd
/bin/passwd
[user@centos7 ~]$ ls -l /bin/passwd
-rwsr-xr-x. 1 root root 27856 Apr  1  2020 /bin/passwd
  • 시스템의 모든 passwd 명령은 setuid가 설정되어 있음.
  • 이 명령을 사용하면 /etc/shadow 파일의 내용이 변경됌.
  • 사용자가 특정 파일을 편집하기 위해선 해당 파일의 쓰기 권한을 가지고 있어야 함.
  • 다음은 /etc/shadow 파일에 대한 정보
[root@centos7 ~]$ ls -l /etc/shadow
----------. 1 root root 1274 May 19 20:30 /etc/shadow
  • root 사용자는 파일에 대한 권한을 어느 정도 무시할 수 있는 관리자이기 때문에 /etc/shadow 파일을 수정할 수 있음
#1 shell
[user01@centos7 ~]$ ps $$
  PID TTY      STAT   TIME COMMAND
25137 pts/0    S      0:00 -bash
[user01@centos7 ~]$ passwd
Changing password for user user01.
Changing password for user01.
(current) UNIX password: 
#2 shell

[root@centos7 ~]# ps -ef
...
root     25220 25137  0 22:31 pts/0    00:00:00 passwd
...
  • /bin/passwd 파일을 소유하고 있는 사용자는 root 이며 setuid가 설정되어 있으므로 일반 사용자가 passwd 명령을 사용할 때 root 사용자의 권한으로 자신의 해시 패스워드를 변경할 수 있음.

 

 

 

setgid

  • setuid처럼 바이너리 파일 또는 스크립트 파일에 설정되어 있으면 명령을 실행할 때 프로세스의 사용자 그룹이 파일의 사용자 그룹으로 실행.
  • 하지만, setgid는 일반적으로 바이너리 파일보다 디렉토리에 설정하여 사용하는 경우가 많음
  • 디렉토리에 setgid 가 설정되어 있다면 해당 디렉토리에서 파일을 생성 했을 때 파일의 사용자 그룹은 파일을 생성한 사용자의 기본 그룹으로 지정되지 않고 setgid가 설정된 디렉토리의 사용자 그룹으로 상속
  • 실행권한이 표시되는 부분에서 "s"로 표현되며 만약 실행 권한이 설정되어 있지 않으면 S(대문자)로 표현
  • 특정 데몬이 관리하는 디렉토리에 설정하여 사용
  • 대표적인 디렉토리는 /run/log/journal
[user@centos7 ~]$ ls -ld /run/log/journal
drwxr-sr-x. 3 root systemd-journal 60 May 19 16:01 /run/log/journal
[root@centos7 ~]# mkdir /run/log/journal/dirA
[root@centos7 ~]# touch /run/log/journal/fileA
[root@centos7 ~]# ls -l /run/log/journal/
total 0
drwxr-s---+ 2 root systemd-journal 60 May 19 16:01 d13bc643231c9b4695acf1069826bca6
drwxr-sr-x. 2 root systemd-journal 40 May 19 22:28 dirA
-rw-r--r--. 1 root systemd-journal  0 May 19 22:29 fileA
  • 디렉토리와 파일 모두 systemd-journal이 기본 그룹으로 지정
  • 생성한 디렉토리는 setgid 설정이 상속되었음

 

 

sticky bit

  • sticky bit를 설정하면 파일을 rwx 권한과는 별개로 소유한 사용자만 파일을 삭제할 수 있음.
    • 커뮤니티 게시판을 작성자만 지울 수 있는 것처럼
  • 디렉토리에만 설정이 가능
  • 실행권한 대신 t로 표시되며 실행권한이 설정되어 있지 않고 sticky bit만 설정되어 있는 경우 T(대문자)로 표시
  • 대표적인 디렉토리는 /tmp, /var/tmp
[user01@centos7 ~]$ ls -ld /tmp/ /var/tmp/
drwxrwxrwt. 24 root root 4096 May 19 22:32 /tmp/
drwxrwxrwt. 13 root root 4096 May 19 22:32 /var/tmp/
[user02@centos7 ~]$ touch /tmp/fileA
[user02@centos7 ~]# su user01
Password:

[user01@centos7 ~]$ cd /tmp/
[user01@centos7 tmp]$ ls -ld /tmp/
drwxrwxrwt. 24 root root 4096 May 19 22:32 /tmp/
[user01@centos7 tmp]$ ls -l fileA
-rw-rw-r--. 1 user02 user02 0 May 19 22:46 fileA
[user01@centos7 tmp]$ rm -f fileA
rm: cannot remove ‘fileA’: Operation not permitted
  • user02 사용자로 fileA 를 만들고 user01 사용자로 fileA를 지우려 시도
  • 하지만, "파일 소유자가 user02" + "stick bit가 설정된 /tmp 디렉토리" 라서 삭제 불가능

 

확장 권한 설정

  • 확장 권한 설정을 할 때는 chmod 명령을 사용
  • 표준 권한을 부여할 때와 마찬가지로 심볼릭(Symbolic) 방식과 8진수(Octal)방식으로 설정

 

심볼릭 방식

권한 설정 심볼릭
setuid 설정 (해제) u+s (u-s)
setgid 설정 (해제) g+s (g-s)
sticky bit 설정 (해제) o+t (o-t)
[root@centos7 ~]# ls -l /bin/passwd
-rwsr-xr-x. 1 root root 27856 Apr  1  2020 /bin/passwd
[root@centos7 ~]# chmod u-s /bin/passwd
[root@centos7 ~]# ls -l /bin/passwd
-rwxr-xr-x. 1 root root 27856 Apr  1  2020 /bin/passwd
[root@centos7 ~]# chmod u+s /bin/passwd
[root@centos7 ~]# ls -l /bin/passwd 
-rwsr-xr-x. 1 root root 27856 Apr  1  2020 /bin/passwd

 

 

8진수 방식

  • 8진수 방식으로 표준 권한을 설정할 때에는 chmod ### FILE 형식
  • 확장권한을 설정하려면 8진수를 하나 더 추가해서 chmod #### FILE 형식으로 사용
  • 첫 번째 #이 확장 권한을 나타내며 sst를 2진수 비트로 계산
[root@centos7 dir1]# ls -ld /run/log/journal/
drwxr-sr-x. 3 root systemd-journal 60  5월 17 14:30 /run/log/journal/
[root@centos7 dir1]# chmod -2000 /run/log/journal/
[root@centos7 dir1]# ls -ld /run/log/journal/
drwxr-xr-x. 3 root systemd-journal 60  5월 17 14:30 /run/log/journal/
[root@centos7 dir1]# chmod 2755 /run/log/journal/
[root@centos7 dir1]# ls -ld /run/log/journal/
drwxr-sr-x. 3 root systemd-journal 60  5월 17 14:30 /run/log/journal/