CertNote/ 출퇴근 학습 노트
로드맵
KOEN
리눅스마스터 2급 · 2급리눅스마스터 2급
  • Week 1
    • 1.운영체제와 커널: 리눅스가 하는 일
    • 2.리눅스의 탄생: 유닉스에서 리누스까지
    • 3.자유 소프트웨어와 오픈소스: 라이선스가 정하는 것
    • 4.배포판: 커널과 도구를 하나로 묶어 파는 단위
    • 5.Week 1 종합 복습: 리눅스라는 이름의 정체
  • Week 2
  • Week 3
  • Week 4
    • 1.권한의 구조: rwx와 8진수
    • 2.소유권과 umask
    • 3.특수 권한: SetUID · SetGID · Sticky bit
    • 4.디렉터리 계층과 파일 시스템 관리
    • 5.Week 4 종합 복습: 권한 한 장 정리
  • Week 5
  • Week 6
  • Week 7
  • Week 8
  • Week 9
  • Week 10
  • Week 11
리눅스마스터 1급 · 1급리눅스마스터 1급
합격 후기

© CertNote · 주간랩스

  • 소개
  • 수정 기록
  • 문의
  • 이용약관
  • 개인정보처리방침
← 리눅스마스터 2급/Week 4/Day 3

기준: 리눅스마스터 2급 출제 기준·오류 제보

리눅스마스터 2급· AssociateWeek 4 · Day 3읽기 약 9분
핵심 정리
  • rwx 아홉 칸 앞에 네 번째 자리가 하나 더 있다. 이것이 특수 권한이다.
  • SetUID(4) · SetGID(2) · Sticky bit(1) — 값과 순서를 그대로 외운다.
  • 표시는 s와 t 로 나타난다. SetUID는 소유자의 x 자리, SetGID는 그룹의 x 자리, Sticky는 기타의 x 자리다.
  • 대표 예시가 정해져 있다 — SetUID는 /usr/bin/passwd, Sticky bit는 /tmp.
  • Sticky bit가 걸린 디렉터리에서는 자기 파일만 지울 수 있다.

Day 3 - 특수 권한: SetUID · SetGID · Sticky bit

네 번째 자리

지금까지 본 755는 사실 뒤 세 자리다. 앞에 한 자리가 더 있다.

      4     7     5     5
      │     │     │     │
      │     │     │     └── other
      │     │     └──────── group
      │     └────────────── user
      └──────────────────── 특수 권한
특수 권한값붙는 자리표시
SetUID4user 의 xs
SetGID2group 의 xs
Sticky bit1other 의 xt
  • 평소에는 이 자리가 0이라 생략한다. chmod 755와 chmod 0755는 같다.
  • 값이 4-2-1 순서로 rwx와 똑같다. 헷갈리면 "위에서부터 4, 2, 1"로 기억한다.

SetUID — 실행하는 동안 소유자가 된다

chmod 4755 program       # 8진수 방식
chmod u+s program        # 기호 방식
   -rwsr-xr-x  1 root root  ...  /usr/bin/passwd
      └ owner 의 x 자리가 s = SetUID
  • 그 파일을 실행하는 동안 실행자가 아니라 파일 소유자의 권한으로 동작한다.
  • 대표 예시가 /usr/bin/passwd 다. 비밀번호는 root만 읽을 수 있는 /etc/shadow에 있는데, 일반 사용자도 자기 비밀번호는 바꿀 수 있어야 한다. passwd에 SetUID가 걸려 있어 실행하는 순간 root 권한으로 shadow를 고칠 수 있다.
  • 그만큼 보안상 위험하다. SetUID가 걸린 프로그램에 취약점이 있으면 곧바로 root 권한 탈취로 이어진다.

passwd 가 shadow 를 고칠 수 있는 이유

$ ls -l /etc/shadow /usr/bin/passwd
----------. 1 root root  1284 Sep  3 09:00 /etc/shadow
-rwsr-xr-x. 1 root root 27856 Sep  3 09:00 /usr/bin/passwd
단계일어나는 일
①일반 사용자 alice가 passwd를 실행한다 (other 칸에 x가 있어 실행 가능)
②소유자 자리가 s이므로, 이 프로세스는 alice가 아니라 파일 소유자 root의 권한으로 돈다
③root 권한이므로 alice는 읽지도 못하는 /etc/shadow를 고칠 수 있다
④passwd가 끝나면 그 권한도 함께 끝난다. alice의 셸은 여전히 alice다
  • 권한이 올라가는 것은 그 프로그램이 실행되는 동안, 그 프로그램 안에서만이다. alice가 root가 되는 것이 아니다.
  • 누구의 권한이 되는지는 파일의 소유자가 정한다. SetUID가 걸려 있어도 소유자가 bob이면 bob의 권한으로 돌 뿐이다. "SetUID = root 권한"이 아니라 "SetUID = 소유자 권한"이고, 소유자가 root일 때 위험해지는 것이다.
  • SetUID 프로그램은 passwd 외에 su, sudo처럼 일반 사용자가 실행하지만 관리자 권한이 있어야 일할 수 있는 명령들이다.
  • SetUID는 실행 파일에 거는 권한이다. 디렉터리에 걸어도 리눅스에서는 효과가 없고, 셸 스크립트에 걸어도 보안상 무시된다.

SetGID — 그룹 권한으로, 그리고 그룹을 물려준다

chmod 2755 program       # 파일에
chmod g+s /project       # 디렉터리에

SetGID는 파일에 걸 때와 디렉터리에 걸 때 하는 일이 다르다.

대상효과
파일실행하는 동안 파일의 소유 그룹 권한으로 동작
디렉터리그 안에 만들어지는 파일이 디렉터리의 그룹을 물려받는다
   -rwxr-sr-x  1 root tty  ...  /usr/bin/wall
         └ group 의 x 자리가 s = SetGID
  • 디렉터리에 거는 쪽이 실무에서 훨씬 자주 쓰인다. 어제 남겨둔 협업 문제 — 각자 만든 파일의 그룹이 제각각인 문제 — 를 이것으로 해결한다.
sudo chgrp dev /project
sudo chmod 2770 /project     # SetGID + rwxrwx---
# 이제 누가 /project 안에 파일을 만들어도 그룹은 항상 dev

걸기 전과 건 뒤를 나란히 놓으면 차이가 분명하다.

$ ls -ld /project
drwxrws---. 2 root dev 6 Sep  3 09:00 /project      ← 그룹 자리가 s
$ id -gn
alice
$ touch /project/plan.txt
$ mkdir /project/docs
$ ls -l /project
drwxr-sr-x. 2 alice dev 6 Sep  3 09:06 docs
-rw-r--r--. 1 alice dev 0 Sep  3 09:05 plan.txt
  • alice의 기본 그룹은 alice인데도 새 파일의 그룹이 dev 다. 어제는 여기가 alice였다.
  • 소유자는 여전히 만든 사람(alice) 이다. SetGID가 물려주는 것은 그룹뿐이다.
  • 안에 만든 하위 디렉터리 docs에도 SetGID가 함께 물려진다(drwxr-sr-x). 그래서 더 깊은 곳에서도 그룹이 유지된다.
  • 걸기 전에 이미 있던 파일의 그룹은 바뀌지 않는다. 그것들은 chgrp -R dev /project로 따로 맞춘다.
  • 그룹은 맞춰지지만 권한까지 열어 주지는 않는다. 위 plan.txt는 그룹에 w가 없다. 구성원이 서로 고치게 하려면 umask를 002로 하거나 chmod g+w를 더한다.

Sticky bit — 남의 파일은 못 지운다

chmod 1777 /shared
chmod o+t /shared
   drwxrwxrwt  10 root root  ...  /tmp
            └ other 의 x 자리가 t = Sticky bit
  • 디렉터리에 w 권한이 있으면 원래는 남의 파일도 지울 수 있다. 파일 자체의 권한과 무관하게, 디렉터리에 쓰기 권한이 있으면 그 안의 항목을 삭제할 수 있기 때문이다.
  • Sticky bit를 걸면 파일의 소유자와 root만 그 파일을 지울 수 있다.
  • 대표 예시가 /tmp 다. 누구나 임시 파일을 만들 수 있어야 하지만 남의 임시 파일을 지우면 안 되므로 1777로 설정되어 있다.
$ ls -l /tmp/a.txt
-rw-r--r--. 1 alice alice 6 Sep  3 09:00 /tmp/a.txt
$ whoami
bob
$ cat /tmp/a.txt                 ← 파일의 other 칸에 r 이 있으니 읽기는 된다
hello
$ rm -f /tmp/a.txt
rm: cannot remove '/tmp/a.txt': Operation not permitted
$ mv /tmp/a.txt /tmp/b.txt
mv: cannot move '/tmp/a.txt' to '/tmp/b.txt': Operation not permitted
  • Sticky bit가 막는 것은 삭제와 이름 변경이다. 파일 내용을 읽을 수 있는지는 여전히 파일 자신의 권한이 정한다. 위에서 bob은 읽기는 했지만 지우거나 이름을 바꾸지는 못했다.
  • 지울 수 있는 사람은 그 파일의 소유자, 그 디렉터리의 소유자, 그리고 root 다.
  • Sticky bit는 디렉터리에 거는 권한이다. /tmp 외에 /var/tmp도 같은 1777이다.
디렉터리 권한누구나 파일 생성남의 파일 삭제
777 (rwxrwxrwx)OO — 위험
1777 (rwxrwxrwt)OX
755 (rwxr-xr-x)X (소유자만)X

세 가지 한눈에

구분값표시위치대표 예하는 일
SetUID4suser x/usr/bin/passwd소유자 권한으로 실행
SetGID2sgroup x/usr/bin/wall그룹 권한으로 실행 / 그룹 상속
Sticky1tother x/tmp자기 파일만 삭제 가능

대문자로 보일 때

원래 그 자리에 x가 없으면 대문자 S나 T 로 표시된다.

표시뜻
s / t특수 권한 있음 + 실행 권한 있음
S / T특수 권한 있음 + 실행 권한 없음
  • -rwSr--r-- 는 SetUID는 걸렸는데 소유자에게 실행 권한이 없는 상태다. 대개 설정 실수다.

s·t는 x 자리를 빌려 쓰는 표시다. 한 칸에 두 정보(실행 권한 + 특수 권한)를 겹쳐 적어야 해서 대소문자로 구분한다.

그 자리의 글자실행 권한특수 권한
x있음없음
-없음없음
s / t있음있음
S / T없음있음
$ chmod 4644 a.sh ; ls -l a.sh
-rwSr--r--. 1 user user 0 Sep  3 09:00 a.sh       ← 644 에는 x 가 없어 대문자 S
$ chmod u+x a.sh ; ls -l a.sh
-rwsr--r--. 1 user user 0 Sep  3 09:00 a.sh       ← x 가 생기자 소문자 s

표기를 숫자로, 숫자를 표기로

네 자리 값은 맨 앞 한 자리(특수) + 뒤 세 자리(일반) 로 나눠 읽는다. 표기를 숫자로 바꿀 때는 s·t를 일단 x로 보고 세 자리를 구한 뒤 앞자리를 붙인다.

표기특수일반값
rwsr-xr-xSetUID 4rwxr-xr-x 7554755
rwxr-sr-xSetGID 2rwxr-xr-x 7552755
rwxrwxrwtSticky 1rwxrwxrwx 7771777
rwxrws---SetGID 2rwxrwx--- 7702770
rwsr-sr-xSetUID 4 + SetGID 2rwxr-xr-x 7556755
rwxrwsrwtSetGID 2 + Sticky 1rwxrwxrwx 7773777
rwSr--r--SetUID 4rw-r--r-- 6444644
  • 특수 권한도 더해서 쓴다. SetUID와 SetGID를 함께 걸면 4+2=6, 셋 다 걸면 7이다.
  • s가 어느 칸에 있는지로 SetUID와 SetGID를 가른다 — 첫 번째 세 칸이면 SetUID, 두 번째 세 칸이면 SetGID. t는 언제나 마지막 칸이다.

걸고 푸는 명령 모음

하려는 일기호 방식8진수 방식 (755 기준)
SetUID 설정chmod u+s 파일chmod 4755 파일
SetGID 설정chmod g+s 대상chmod 2755 대상
Sticky bit 설정chmod o+t 디렉터리 (+t도 같다)chmod 1755 디렉터리
SetUID 해제chmod u-s 파일chmod 0755 파일
SetGID 해제chmod g-s 대상—
Sticky bit 해제chmod o-t 디렉터리—
  • 기호 방식에서 s는 u나 g에, t는 o에 붙인다. chmod u+t나 chmod o+s는 뜻이 통하지 않는 조합이다.
  • 기호 방식은 다른 권한을 건드리지 않고 특수 권한 하나만 걸고 풀 수 있어, 해제할 때는 이쪽이 확실하다.

찾아보기

find / -perm -4000 -type f      # SetUID 가 걸린 파일 전부
find / -perm -2000 -type f      # SetGID
find / -perm -1000 -type d      # Sticky bit
ls -ld /tmp                     # drwxrwxrwt
ls -l /usr/bin/passwd           # -rwsr-xr-x
  • SetUID 파일 목록을 뽑아 점검하는 것은 기본적인 보안 감사 절차다. 있어야 할 것 외에 낯선 파일이 있으면 침해를 의심한다.

-perm 뒤 숫자 앞의 기호에 따라 찾는 범위가 달라진다.

쓰는 법찾는 것
-perm 4755권한이 정확히 4755인 것
-perm -4000다른 권한이 무엇이든 SetUID 비트가 켜진 것
-perm -6000SetUID와 SetGID가 둘 다 켜진 것
-perm /6000SetUID와 SetGID 중 하나라도 켜진 것
  • 그냥 -perm 4000이라고 쓰면 "권한이 정확히 4000(---S------)인 파일"을 찾으므로 아무것도 나오지 않는다. -를 붙여야 "그 비트를 포함한 것"이 된다.
$ stat -c '%a %A %n' /tmp /usr/bin/passwd
1777 drwxrwxrwt /tmp
4755 -rwsr-xr-x /usr/bin/passwd

내일은 파일이 실제로 저장되는 공간 — 파일 시스템을 붙이고 떼고 점검하는 명령을 다룬다.

📖 용어

  • 특수 권한 : rwx 세 부류 앞의 네 번째 자리에 놓이는 권한. SetUID·SetGID·Sticky bit.
  • SetUID : 값 4. 실행하는 동안 파일 소유자의 권한으로 동작하게 하는 권한.
  • SetGID : 값 2. 파일에서는 소유 그룹 권한으로 실행하게 하고, 디렉터리에서는 새 파일에 그룹을 물려준다.
  • Sticky bit : 값 1. 디렉터리 안에서 자기 파일만 삭제할 수 있게 제한하는 권한.
  • /tmp : Sticky bit가 걸린 대표적인 공유 임시 디렉터리. 권한은 1777이다.
  • /usr/bin/passwd : SetUID가 걸린 대표적인 명령. 일반 사용자가 /etc/shadow를 고칠 수 있게 해 준다.
  • 그룹 상속 : SetGID가 걸린 디렉터리에서 새 파일이 디렉터리의 그룹을 따르는 동작.

📝 연습 문제

선택지를 클릭하면 정답·해설이 펼쳐집니다.

문제 1

다음 중 SetUID, SetGID, Sticky bit에 해당하는 8진수 값을 순서대로 바르게 나열한 것은?

문제 2

다음 중 /tmp 디렉터리에 설정되어 자신이 만든 파일만 삭제할 수 있게 하는 권한으로 알맞은 것은?

문제 3

다음 중 -rwsr-xr-x 권한을 가진 파일에 대한 설명으로 알맞은 것은?

문제 4

다음 중 디렉터리에 SetGID를 설정했을 때 나타나는 효과로 알맞은 것은?

문제 5

다음 중 파일에 SetUID 권한을 부여하는 명령으로 알맞은 것은?

이전소유권과 umaskWeek 4 · Day 2다음 디렉터리 계층과 파일 시스템 관리Week 4 · Day 4

참고 공식 자료

  • 리눅스마스터 2급 공식 출제 기준(새 탭에서 열림)

이 페이지

  • 네 번째 자리
  • SetUID — 실행하는 동안 소유자가 된다
  • passwd 가 shadow 를 고칠 수 있는 이유
  • SetGID — 그룹 권한으로, 그리고 그룹을 물려준다
  • Sticky bit — 남의 파일은 못 지운다
  • 세 가지 한눈에
  • 대문자로 보일 때
  • 표기를 숫자로, 숫자를 표기로
  • 걸고 푸는 명령 모음
  • 찾아보기
  • 용어
  • 연습 문제