Sticky bit 란 무엇인가? (Unix 와 Linux 운영체제)

Posted by taeho Tae-Ho
2014.05.01 11:39 운영체제

유닉스와 리눅스에서 파일 퍼미션에 대한 공부를 하다보면 나오는 특수한 파일 퍼미션이 두개가 있다. 하나는 앞의 find 명령어에 대한 고찰(http://blogger.pe.kr/338)에서 조금 살펴본 setuid/setgid 이고 다른 하나는 이번 포스트에서 설명할 sticky bit다.


1. sticky bit 란?


유닉스 운영체제는 기본적으로 파일의 소유자가 아니면 해당 디렉토리 내의 파일을 지우거나 수정하지 못하도록 기본적인 umask를 설정한다. 하지만 딱~두군데 모든 사용자 계정이 파일을 만들고 수정, 삭제할 수 있는 디렉토리가 있다. 바로 /tmp와 /var/tmp다. 이 두개의 디렉토리는 퍼미션이 기본적으로 777로 설정되어 있어 누구나 임의의 파일을 생성하고 수정하고 삭제할 수 있다. 말 그대로 모든 사용자 계정이 사용하는 공용 디렉토리다.


그러다 보니... 이 두개의 디렉토리에 퍼미션이 777 퍼미션을 갖는 파일들과 디렉토리들이 생겨나게 되는데...문제는 이 파일들이 꼭 필요한 파일인지 알 수 없고 현재 사용중인지 아닌지를 판단하기 어렵다 보니 파일 퍼미션이 777인 파일들을 아무나 다른 소유자의 파일들을 지워버리는 문제가 생겨난다. 하지만 그 파일들이 현재 사용중인 파일이라면 서비스에 장애가 발생하게 되는 것이다.


그래서 등장한 것이 sticky bit 다.


sticky bit가 설정된 디렉토리 내에서는 


1. 퍼미션이 777인 파일에 대해서 파일의 소유자만이 삭제를 할 수 있다. (수정이나 실행, 읽기는 모두 허용된다.)

2. sticky bit가 설정된 디렉토리 자체도 소유자만이 삭제할 수 있다.

3. root는 다할 수 있다.


즉... 파일을 만든 계정과 root에서만 삭제할 수 있다는 뜻이다. 비록 파일의 퍼미션이 777이더라도 말이다.


2. 실제 테스트


[taeho@ncsd /]$ ls -l 

drwxrwxrwt   3 ncsd ncsd  4096 May  1 11:20 stickytest

[taeho@ncsd /]$ 

[taeho@ncsd /]$ 

[taeho@ncsd /]$ id              

uid=500(taeho) gid=500(taeho) groups=500(taeho)

[taeho@ncsd /]$ 

[taeho@ncsd /]$ rm -f stickytest

rm: cannot remove `stickytest': Permission denied        <--- 퍼미션이 777이고 sticky bit가 설정된 디렉토리 삭제안됨.

[taeho@ncsd /]$ 

[taeho@ncsd /]$ cd stickytest        <--- sticky bit가 설정된 디렉토리로 들어감.

[taeho@ncsd stickytest]$ 

[taeho@ncsd stickytest]$ ls -l

total 4

-rwxrwxrwx 1 ncsd ncsd    0 May  1 11:20 1.txt

drwxrwxrwx 2 ncsd ncsd 4096 May  1 11:11 test

[taeho@ncsd stickytest]$ 

[taeho@ncsd stickytest]$ rm -rf 1.txt

rm: cannot remove `1.txt': Operation not permitted      <--- 퍼미션이 777인데 소유자가 다르기 때문에 삭제 안됨.

[taeho@ncsd stickytest]$ 

[taeho@ncsd stickytest]$ rm -rf test

rm: cannot remove directory `test': Operation not permitted     <--- 퍼미션이 777인 디렉터리가 소유자가 다르기 대문에 삭제 안됨.

[taeho@ncsd stickytest]$ 

[taeho@ncsd stickytest]$ 


sticky bit를 특정 디렉토리에 지정해주기 위해서는...


$ ls -l 

drwxr-xr-x   3 ncsd ncsd  4096 May  1 11:20 stickytest      <--- 755 퍼미션의 테스트 디렉토리

$ chmod 1777 stickytest        <---- sticky bit 는 맨 앞의 1 임.

$ ls -l 

drwxrwxrwt   3 ncsd ncsd  4096 May  1 11:20 stickytest      <--- sticky bit 설정된 화면



이쯤에서 chmod 1777 에서 1은 sticky bit 인것은 알겠는데 왜 나머지 퍼미션을 777로 주는가?? 에 대한 의문이 생긴다면... 맨 앞의 내용을 다시 잘 읽어보기 바란다.


신고
Tags
이 댓글을 비밀 댓글로