0 / 4
스티키 비트(Sticky Bit)
리눅스에서 파일을 지울 수 있는지는 그 파일의 권한이 아니라 파일이 들어 있는 디렉터리의 쓰기 권한으로 정해진다. 파일을 지우면 실제로는 디렉터리의 파일 목록에서 그 이름이 빠지기 때문이다. 그래서 모든 사용자에게 쓰기 권한이 있는 공유 디렉터리에서는 남의 파일도 지울 수 있다. 스티키 비트는 이를 막는 특수 권한이다.
예: Alice가 공유 디렉터리 /shared에 만든 파일을 Bob이 지우려 한다.
1 / 4
Alice: 파일 만들기
Alice가 /shared에 alice.txt를 만든다. 디렉터리 쓰기 권한이 모든 사용자에게 있어서 가능한 일이다. 파일 소유자는 Alice, 권한은 rw-r--r--다. Alice만 내용을 고칠 수 있고, 다른 사용자에게는 읽기 권한만 있다.
2 / 4
Bob: alice.txt 지우기
Bob이 alice.txt를 지우는 명령을 실행한다. 이 파일의 소유자가 아니라서 파일 권한으로 보면 읽기만 허락된다. 하지만 지울 수 있는지 따질 때 운영체제는 파일 권한을 보지 않는다. 명령에 붙인 -f는 묻지 않고 지우라는 옵션이다.
3 / 4
운영체제: 디렉터리 권한 확인
운영체제가 /shared의 권한을 본다. Bob은 디렉터리 소유자(root)도 아니고 root 그룹에 속하지도 않아서 기타 사용자 칸을 따른다. 그 칸에 쓰기(w)가 있으니 Bob도 이 디렉터리에서 파일을 만들고 지울 수 있다. 실행 칸은 t가 아니라 x여서 스티키 비트도 없다. 파일 소유자가 누구인지는 확인하지 않고 넘어간다.
4 / 4
결과: Alice의 파일이 지워짐
alice.txt가 디렉터리 목록에서 빠져 지워진다. 소유자인 Alice는 허락한 적이 없다. 스티키 비트가 없는 공유 디렉터리에서는 파일 권한을 아무리 좁혀도 남이 지우는 것을 막지 못한다.
1 / 5
Alice: 파일 만들기
Alice가 /tmp에 alice.txt를 만든다. 스티키 비트가 있어도 파일은 누구나 만들 수 있다. 막히는 것은 남의 파일을 지우거나 이름을 바꾸는 일뿐이다.
2 / 5
Bob: alice.txt 지우기
Bob이 앞 탭과 똑같은 명령으로 alice.txt를 지우려 한다.
3 / 5
운영체제: 소유자인지 확인
Bob에게 디렉터리 쓰기 권한은 있다. 하지만 기타 사용자 실행 칸이 t이니 스티키 비트가 걸려 있다. 운영체제는 Bob이 파일 소유자나 디렉터리 소유자, root인지 한 번 더 확인한다. 셋 다 아니다.
4 / 5
결과: 지우기 거부
운영체제가 지우기를 거부하고 “Operation not permitted”(허용되지 않는 작업) 오류를 낸다. 파일 alice.txt는 그대로 남는다. 이름을 mv로 바꾸려 해도 똑같이 거부된다.
5 / 5
Bob: 자기 파일 지우기
bob.txt는 Bob 자신의 파일이라 그대로 지워진다. Alice가 alice.txt를, root가 어느 파일을 지울 때도 마찬가지다. 스티키 비트는 자기 파일을 지우는 일까지 막지는 않는다.
1 / 4
열 글자 나눠 읽기
맨 앞 d는 디렉터리를 나타낸다. 나머지 아홉 글자는 세 글자씩 차례로 소유자, 그룹, 기타 사용자의 권한이다. 기타 사용자는 소유자도 아니고 그 그룹에 속하지도 않은 사용자 전부다. 권한이 없는 칸에는 -가 들어간다.
2 / 4
스티키 비트를 걸면 t
root가 chmod +t로 스티키 비트를 건다. 기타 사용자 실행 칸의 x가 소문자 t로 바뀐다. 소문자 t는 실행 권한과 스티키 비트가 둘 다 있을 때 나온다.
3 / 4
숫자로는 1777
숫자로는 chmod 1777처럼 권한 777 앞에 1을 붙인다. 맨 앞자리가 특수 권한을 나타내며 1이 스티키 비트다. 이 자리에 4를 쓰면 SetUID, 2를 쓰면 SetGID라는 다른 특수 권한이 걸린다.
4 / 4
실행 권한이 없으면 T
기타 사용자 실행 권한 없이 스티키 비트를 걸면(chmod 1776) 그 칸이 대문자 T로 보인다. 실행 권한이 있으면 소문자 t, 없으면 대문자 T다.