본문 바로가기
일반IT/리눅스

🏗️ 리눅스 권한의 마스터키: SetUID, SetGID, Sticky Bit 완벽 해부

by gasbugs 2025. 12. 20.

안녕하세요! 리눅스를 다루다 보면 rwx (읽기/쓰기/실행)만으로는 설명되지 않는 기묘한 권한들을 마주하게 됩니다.

 

"왜 내 비밀번호는 내가 바꾸는데, /etc/shadow 파일은 root만 볼 수 있을까?"

"공용 폴더에서 내가 만든 파일을 왜 다른 사람이 지울 수 있을까?"

 

이 모든 궁금증의 해답은 바로 특수 권한(Special Permissions)에 있습니다. 오늘은 시스템 엔지니어와 보안 담당자라면 반드시 정복해야 할 SetUID, SetGID, Sticky Bit에 대해 아주 상세하게 파헤쳐 보겠습니다. ☕ 커피 한 잔과 함께 천천히 따라오세요!

 


1. 🎭 SetUID: "가면 무도회의 시작"

SetUID(Set User ID)는 리눅스 권한 체계에서 가장 강력하면서도 가장 위험할 수 있는 기능입니다.

💡 핵심 개념

일반적으로 프로그램을 실행하면, 그 프로세스는 '실행한 사람'의 권한으로 돌아갑니다. 하지만 SetUID가 설정된 파일은 '파일의 소유자(Owner)' 권한으로 실행됩니다. 마치 왕의 가면을 쓰면 잠시동안 왕의 권력을 행사할 수 있는 것과 같습니다.

🔍 대표적인 사례: passwd

우리가 비밀번호를 바꿀 때 사용하는 passwd 명령어를 살펴볼까요?

$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 68208  ...  /usr/bin/passwd
  • 소유자: root
  • 권한: rws (여기서 s가 바로 SetUID입니다!)

비밀번호 정보는 /etc/shadow 파일에 저장되는데, 이 파일은 오직 root만 수정할 수 있습니다.

  1. 일반 사용자(user1)가 passwd를 실행합니다.
  2. SetUID 설정 덕분에 프로세스는 실행되는 동안 잠시 root 권한을 얻습니다.
  3. 그 권한으로 /etc/shadow를 안전하게 수정하고 종료합니다.
  4. 프로세스가 끝나면 권한은 다시 원래대로 돌아옵니다.

⚙️ 설정 방법

  • 문자 모드: chmod u+s 파일명
  • 숫자 모드: chmod 4755 파일명 (맨 앞의 4가 SetUID를 의미)

2. 🤝 SetGID: "협업을 위한 스마트한 규칙"

SetGID(Set Group ID)는 파일에 걸릴 때와 디렉터리에 걸릴 때가 완전히 다릅니다. 실무에서는 주로 디렉터리에 설정하여 협업 환경을 구축할 때 사용합니다.

📂 디렉터리에 설정된 SetGID (협업의 핵심)

여러 개발자가 하나의 프로젝트 폴더를 공유한다고 가정해 봅시다.

  • 문제점: A 개발자가 파일을 만들면 소유 그룹이 dev-a가 되고, B 개발자는 이 파일을 수정하지 못할 수 있습니다. 매번 권한을 수정해야 하는 번거로움이 생기죠.
  • 해결책: 프로젝트 디렉터리에 SetGID를 겁니다.
    • 이 디렉터리 안에 생성되는 모든 파일/폴더는 부모 디렉터리의 그룹 소유권(Group Ownership)을 자동으로 상속받습니다.
    • 누가 파일을 만들든 그룹이 통일되므로 공유가 원활해집니다.

📄 파일에 설정된 SetGID

SetUID와 비슷합니다. 실행 시 파일의 소유 그룹 권한으로 실행됩니다. (SetUID에 비해 자주 사용되지는 않습니다.)

⚙️ 설정 방법

  • 문자 모드: chmod g+s 디렉터리명
  • 숫자 모드: chmod 2775 디렉터리명 (맨 앞의 2가 SetGID를 의미)
  • 확인: drwxr-sr-x 와 같이 그룹 실행 권한 자리에 s가 표시됩니다.

3. 🛡️ Sticky Bit: "내 물건은 나만 버릴 수 있어"

이름처럼 끈적하게 붙어있는 권한입니다. 주로 공용 디렉터리의 무질서를 막기 위해 존재합니다.

💡 핵심 개념

리눅스에서 디렉터리에 '쓰기(w)' 권한이 있으면, 그 안의 파일을 삭제할 수도 있습니다. 문제는 남이 만든 파일도 지울 수 있다는 점입니다.

Sticky Bit가 설정된 디렉터리에서는 "오직 파일의 소유자(와 root)만이 그 파일을 삭제하거나 이름을 변경할 수 있습니다."

🔍 대표적인 사례: /tmp

리눅스의 임시 저장소인 /tmp는 누구나 접근해서 파일을 만들 수 있어야 합니다.

$ ls -ld /tmp
drwxrwxrwt 19 root root 4096 ... /tmp
  • 권한: rwxrwxrwt (맨 끝의 t가 Sticky Bit입니다.)
  • 모든 사용자가 파일을 쓸 수 있지만(w), t가 설정되어 있어 내가 만든 임시 파일을 다른 사용자가 실수로(혹은 고의로) 지우는 것을 방지합니다.

⚙️ 설정 방법

  • 문자 모드: chmod o+t 디렉터리명
  • 숫자 모드: chmod 1777 디렉터리명 (맨 앞의 1이 Sticky Bit를 의미)

4. 🧮 심화: 숫자 모드와 대문자 표기의 비밀

특수 권한을 완벽히 이해하려면 이 두 가지 디테일을 놓쳐선 안 됩니다.

1) 4자리 숫자 모드 계산법

chmod를 사용할 때 3자리가 아닌 4자리 숫자를 보신 적이 있나요?

  • 4000: SetUID
  • 2000: SetGID
  • 1000: Sticky Bit

예를 들어 chmod 4755는 4000(SetUID) + 755(rwxr-xr-x)가 합쳐진 것입니다.

2) 대문자 'S'와 'T'의 의미

가끔 ls -l 결과에서 소문자 s, t가 아닌 대문자 S, T를 볼 수 있습니다. 오타가 아닙니다!

  • 소문자 (s, t): 실행 권한(x)이 있는 상태에서 특수 권한이 부여됨. (정상 동작)
  • 대문자 (S, T): 실행 권한(x)이 없는 상태에서 특수 권한이 부여됨.
    • 예: rw-rw-r-- 파일에 SetUID를 걸면 rwSrw-r--가 됩니다.
    • 의미: "특수 권한이 설정되어 있긴 한데, 실행 권한 자체가 없어서 실제로 동작하지는 않을 거야"라는 경고 표시와 같습니다.

5. 🚨 보안 관리자를 위한 조언

SetUID는 시스템 보안의 가장 큰 구멍이 될 수 있습니다.

  • 위험성: 만약 bash 쉘이나 vim 에디터 같은 프로그램에 누군가 몰래 SetUID(root 소유)를 걸어두었다면?
    • 일반 사용자가 vim을 켜는 순간 root 권한을 갖게 되어, 시스템의 모든 파일을 수정할 수 있게 됩니다. 이를 권한 상승(Privilege Escalation) 공격이라 합니다.
  • 보안 점검 팁: 주기적으로 시스템 내의 모든 SetUID 파일을 검색하여, 의도하지 않은 파일이 있는지 확인해야 합니다.
# 시스템 전체에서 SetUID가 설정된 파일 찾기
find / -user root -perm -4000 -print 2>/dev/null

📝 요약 정리표

구분 역할 표기 위치 문자 숫자 값
SetUID 실행 시 소유자 권한 획득 User s 4000
SetGID 실행 시 그룹 권한 획득 / 디렉터리 그룹 상속 Group s 2000
Sticky Bit 공용 폴더에서 타인 파일 삭제 방지 Other t 1000

 

오늘 다룬 내용이 리눅스 권한 체계를 이해하는 데 큰 도움이 되었기를 바랍니다. 이 세 가지 특수 권한만 잘 활용해도 시스템의 보안성과 협업 효율성을 동시에 잡을 수 있습니다!

 

다음 포스팅에서는 리눅스 ACL(Access Control List)에 대해 다뤄보겠습니다. 읽어주셔서 감사합니다. 🙇‍♂️