안녕하세요! 리눅스를 다루다 보면 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만 수정할 수 있습니다.
- 일반 사용자(user1)가 passwd를 실행합니다.
- SetUID 설정 덕분에 프로세스는 실행되는 동안 잠시 root 권한을 얻습니다.
- 그 권한으로 /etc/shadow를 안전하게 수정하고 종료합니다.
- 프로세스가 끝나면 권한은 다시 원래대로 돌아옵니다.
⚙️ 설정 방법
- 문자 모드: 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)에 대해 다뤄보겠습니다. 읽어주셔서 감사합니다. 🙇♂️
'일반IT > 리눅스' 카테고리의 다른 글
| [LFCS 합격 보장] 시험장 들어가기 전 10분! 마지막 요점 정리 리스트 🐧🚀 (0) | 2026.01.25 |
|---|---|
| 📂 리눅스 부팅의 절대 지도: /etc/fstab 완벽 해부와 트러블슈팅 (0) | 2025.12.20 |
| 🐧 리눅스 find 명령어, 이 글 하나로 완벽하게 마스터하기 (권한, 보안, 백업까지) (1) | 2025.12.20 |
| 🐳 도커(Docker)의 내부를 파헤치다: Overlay2 파일 시스템 구조 완벽 분석 (0) | 2025.12.04 |
| 내 서버 보안 강화하기: SSH X11 Forwarding 똑똑하게 설정하는 법 🔐 (0) | 2025.10.12 |