유닉스와 리눅스에서 파일 퍼미션에 대한 공부를 하다보면 나오는 특수한 파일 퍼미션이 두개가 있다. 하나는 앞의 find 명령어에 대한 고찰(http://blogger.pe.kr/338)에서 조금 살펴본 setuid/setgid 이고 다른 하나는 이번 포스트에서 설명할 sticky bit다.
sticky bit 란?
유닉스 운영체제는 기본적으로 파일의 소유자가 아니면 해당 디렉토리 내의 파일을 지우거나 수정하지 못하도록 기본적인 umask를 설정한다. 하지만 딱~두군데 모든 사용자 계정이 파일을 만들고 수정, 삭제할 수 있는 디렉토리가 있다. 바로 /tmp와 /var/tmp다. 이 두개의 디렉토리는 퍼미션이 기본적으로 777로 설정되어 있어 누구나 임의의 파일을 생성하고 수정하고 삭제할 수 있다. 말 그대로 모든 사용자 계정이 사용하는 공용 디렉토리다.
그러다 보니… 이 두개의 디렉토리에 퍼미션이 777 퍼미션을 갖는 파일들과 디렉토리들이 생겨나게 되는데…문제는 이 파일들이 꼭 필요한 파일인지 알 수 없고 현재 사용중인지 아닌지를 판단하기 어렵다 보니 파일 퍼미션이 777인 파일들을 아무나 다른 소유자의 파일들을 지워버리는 문제가 생겨난다. 하지만 그 파일들이 현재 사용중인 파일이라면 서비스에 장애가 발생하게 되는 것이다.
그래서 등장한 것이 sticky bit 다.
sticky bit가 설정된 디렉토리 내에서는
1. 퍼미션이 777인 파일에 대해서 파일의 소유자만이 삭제를 할 수 있다. (수정이나 실행, 읽기는 모두 허용된다.)
2. sticky bit가 설정된 디렉토리 자체도 소유자만이 삭제할 수 있다.
3. root는 다할 수 있다.
즉… 파일을 만든 계정과 root에서만 삭제할 수 있다는 뜻이다. 비록 파일의 퍼미션이 777이더라도 말이다.
sticky bit 실제 테스트
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로 주는가?? 에 대한 의문이 생긴다면… 맨 앞의 내용을 다시 잘 읽어보기 바란다.